From 4eb5fa1671a11b230213c5ee3f7d0c7e0ba42d0e Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Sat, 22 Mar 2014 01:53:03 +0100 Subject: [PATCH 1/9] Introduce _prepare method in the wizard "Select Invoices to Pay", for easier inheritence Don't disable the field 'communication' when using free communication - Structured => 'communication' - Free => 'communication' + 'communication2' --- account_banking_payment/model/payment_line.py | 8 - .../view/account_payment.xml | 7 - .../model/payment_order_create.py | 165 +++++++++--------- 3 files changed, 83 insertions(+), 97 deletions(-) diff --git a/account_banking_payment/model/payment_line.py b/account_banking_payment/model/payment_line.py index 7b5345ecf..a4ddc1c0d 100644 --- a/account_banking_payment/model/payment_line.py +++ b/account_banking_payment/model/payment_line.py @@ -40,14 +40,6 @@ class payment_line(orm.Model): 'msg': fields.char('Message', size=255, required=False, readonly=True), 'date_done': fields.date( 'Date Confirmed', select=True, readonly=True), - # Communication: required is dependend on the mode - 'communication': fields.char( - 'Communication', size=64, required=False, - help=("Used as the message between ordering customer and current " - "company. Depicts 'What do you want to say to the recipient" - " about this order ?'" - ), - ), # Communication2: enlarge to 128 'communication2': fields.char( 'Communication 2', size=128, diff --git a/account_banking_payment/view/account_payment.xml b/account_banking_payment/view/account_payment.xml index c26847abf..fb29c8716 100644 --- a/account_banking_payment/view/account_payment.xml +++ b/account_banking_payment/view/account_payment.xml @@ -17,13 +17,6 @@ 'invisible':[('state','!=','draft')] } - - - { - 'readonly': [('state', '=', 'normal')] - } - diff --git a/account_banking_payment_export/model/payment_order_create.py b/account_banking_payment_export/model/payment_order_create.py index 5dffe24e1..20d8c3ac1 100644 --- a/account_banking_payment_export/model/payment_order_create.py +++ b/account_banking_payment_export/model/payment_order_create.py @@ -88,6 +88,82 @@ class payment_order_create(orm.TransientModel): 'target': 'new', } + def _prepare_payment_line(self, cr, uid, payment, line, context=None): + '''This function is designed to be inherited + The resulting dict is passed to the create method of payment.line''' + _today = fields.date.context_today(self, cr, uid, context=context) + if payment.date_prefered == "now": + #no payment date => immediate payment + date_to_pay = False + elif payment.date_prefered == 'due': + ### account_banking + # date_to_pay = line.date_maturity + date_to_pay = ( + line.date_maturity + if line.date_maturity and line.date_maturity > _today + else False) + ### end account banking + elif payment.date_prefered == 'fixed': + ### account_banking + # date_to_pay = payment.date_scheduled + date_to_pay = ( + payment.date_scheduled + if payment.date_scheduled and payment.date_scheduled > _today + else False) + ### end account banking + + ### account_banking + state = 'normal' + communication = line.ref or '-' + if line.invoice: + if line.invoice.type in ('in_invoice', 'in_refund'): + if line.invoice.reference_type == 'structured': + state = 'structured' + communication = line.invoice.reference + else: + if line.invoice.reference: + communication = line.invoice.reference + elif line.invoice.supplier_invoice_number: + communication = line.invoice.supplier_invoice_number + else: + # Make sure that the communication includes the + # customer invoice number (in the case of debit order) + communication = line.invoice.number.replace('/', '') + state = 'structured' + + # support debit orders when enabled + if (payment.payment_order_type == 'debit' and + 'amount_to_receive' in line): + amount_currency = line.amount_to_receive + else: + amount_currency = line.amount_to_pay + ### end account_banking + + ### account banking + # t = None + # line2bank = line_obj.line2bank(cr, uid, line_ids, t, context) + line2bank = self.pool['account.move.line'].line2bank( + cr, uid, [line.id], payment.mode.id, context) + ### end account banking + + res = { + 'move_line_id': line.id, + 'amount_currency': amount_currency, + 'bank_id': line2bank.get(line.id), + 'order_id': payment.id, + 'partner_id': line.partner_id and line.partner_id.id or False, + ### account banking + # 'communication': line.ref or '/' + 'communication': communication, + 'state': state, + ### end account banking + 'date': date_to_pay, + 'currency': (line.invoice and line.invoice.currency_id.id + or line.journal_id.currency.id + or line.journal_id.company_id.currency_id.id), + } + return res + def create_payment(self, cr, uid, ids, context=None): ''' This method is a slightly modified version of the existing method on this @@ -97,10 +173,6 @@ class payment_order_create(orm.TransientModel): references are allowed, but others as well - check date_to_pay is not in the past. ''' - - order_obj = self.pool.get('payment.order') - line_obj = self.pool.get('account.move.line') - payment_obj = self.pool.get('payment.line') if context is None: context = {} data = self.read(cr, uid, ids, [], context=context)[0] @@ -108,85 +180,14 @@ class payment_order_create(orm.TransientModel): if not line_ids: return {'type': 'ir.actions.act_window_close'} - payment = order_obj.browse( + payment = self.pool['payment.order'].browse( cr, uid, context['active_id'], context=context) - ### account banking - # t = None - # line2bank = line_obj.line2bank(cr, uid, line_ids, t, context) - line2bank = line_obj.line2bank( - cr, uid, line_ids, payment.mode.id, context) - _today = fields.date.context_today(self, cr, uid, context=context) - ### end account banking - - ## Finally populate the current payment with new lines: - for line in line_obj.browse(cr, uid, line_ids, context=context): - if payment.date_prefered == "now": - #no payment date => immediate payment - date_to_pay = False - elif payment.date_prefered == 'due': - ### account_banking - # date_to_pay = line.date_maturity - date_to_pay = ( - line.date_maturity - if line.date_maturity and line.date_maturity > _today - else False) - ### end account banking - elif payment.date_prefered == 'fixed': - ### account_banking - # date_to_pay = payment.date_scheduled - date_to_pay = ( - payment.date_scheduled - if payment.date_scheduled and payment.date_scheduled > _today - else False) - ### end account banking - - ### account_banking - state = communication2 = False - communication = line.ref or '/' - if line.invoice: - if line.invoice.type in ('in_invoice', 'in_refund'): - if line.invoice.reference_type == 'structured': - state = 'structured' - communication = line.invoice.reference - else: - state = 'normal' - communication2 = line.invoice.reference - else: - # Make sure that the communication includes the - # customer invoice number (in the case of debit order) - communication = line.invoice.number.replace('/', '') - state = 'structured' - if line.invoice.number != line.ref: - communication2 = line.ref - else: - state = 'normal' - communication2 = line.ref - - # support debit orders when enabled - if (payment.payment_order_type == 'debit' and - 'amount_to_receive' in line): - amount_currency = line.amount_to_receive - else: - amount_currency = line.amount_to_pay - ### end account_banking - - payment_obj.create(cr, uid, { - 'move_line_id': line.id, - 'amount_currency': amount_currency, - 'bank_id': line2bank.get(line.id), - 'order_id': payment.id, - 'partner_id': line.partner_id and line.partner_id.id or False, - ### account banking - # 'communication': line.ref or '/' - 'communication': communication, - 'communication2': communication2, - 'state': state, - ### end account banking - 'date': date_to_pay, - 'currency': (line.invoice and line.invoice.currency_id.id - or line.journal_id.currency.id - or line.journal_id.company_id.currency_id.id), - }, context=context) + ## Populate the current payment with new lines: + for line in self.pool['account.move.line'].browse( + cr, uid, line_ids, context=context): + vals = self._prepare_payment_line( + cr, uid, payment, line, context=context) + self.pool['payment.line'].create(cr, uid, vals, context=context) # Force reload of payment order view as a workaround for lp:1155525 return {'name': _('Payment Orders'), 'context': context, From 69ced736f408d1efdee13dd0229dbd497b1446eb Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Sat, 22 Mar 2014 22:18:17 +0100 Subject: [PATCH 2/9] Add migration script for the communication* fields of payment.line. --- account_banking_payment_export/__openerp__.py | 2 +- .../migrations/7.0.0.1.165/pre-migration.py | 34 +++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 account_banking_payment_export/migrations/7.0.0.1.165/pre-migration.py diff --git a/account_banking_payment_export/__openerp__.py b/account_banking_payment_export/__openerp__.py index 11835c973..424be1620 100644 --- a/account_banking_payment_export/__openerp__.py +++ b/account_banking_payment_export/__openerp__.py @@ -26,7 +26,7 @@ { 'name': 'Account Banking - Payments Export Infrastructure', - 'version': '0.1.164', + 'version': '0.1.165', 'license': 'AGPL-3', 'author': 'Banking addons community', 'website': 'https://launchpad.net/banking-addons', diff --git a/account_banking_payment_export/migrations/7.0.0.1.165/pre-migration.py b/account_banking_payment_export/migrations/7.0.0.1.165/pre-migration.py new file mode 100644 index 000000000..c44d58205 --- /dev/null +++ b/account_banking_payment_export/migrations/7.0.0.1.165/pre-migration.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Copyright (C) 2014 Akretion (http://www.akretion.com/) +# @author: Alexis de Lattre +# +# 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 . +# +############################################################################## + + +def migrate(cr, version): + if not version: + return + + cr.execute( + "UPDATE payment_line SET communication = communication2, " + "communication2 = null " + "FROM payment_order " + "WHERE payment_line.order_id = payment_order.id " + "AND payment_order.state in ('draft', 'open') " + "AND payment_line.state = 'normal' " + "AND communication2 is not null") From b7345de4d53ae310772029224985372ee43abd14 Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Sun, 23 Mar 2014 22:48:12 +0100 Subject: [PATCH 3/9] Execute even if no version is passed to the migration function (for those who upgrade from versions where the module account_banking_payment_export didn't exist) --- .../migrations/7.0.0.1.165/pre-migration.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/account_banking_payment_export/migrations/7.0.0.1.165/pre-migration.py b/account_banking_payment_export/migrations/7.0.0.1.165/pre-migration.py index c44d58205..19fdd6b18 100644 --- a/account_banking_payment_export/migrations/7.0.0.1.165/pre-migration.py +++ b/account_banking_payment_export/migrations/7.0.0.1.165/pre-migration.py @@ -21,9 +21,6 @@ def migrate(cr, version): - if not version: - return - cr.execute( "UPDATE payment_line SET communication = communication2, " "communication2 = null " From 50dd73443a2bcb0e973162afab6849078e68ac51 Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Tue, 25 Mar 2014 07:46:32 +0100 Subject: [PATCH 4/9] Update SQL query with "and communication is null" --- .../migrations/7.0.0.1.165/pre-migration.py | 1 + 1 file changed, 1 insertion(+) diff --git a/account_banking_payment_export/migrations/7.0.0.1.165/pre-migration.py b/account_banking_payment_export/migrations/7.0.0.1.165/pre-migration.py index 19fdd6b18..91839f15e 100644 --- a/account_banking_payment_export/migrations/7.0.0.1.165/pre-migration.py +++ b/account_banking_payment_export/migrations/7.0.0.1.165/pre-migration.py @@ -28,4 +28,5 @@ def migrate(cr, version): "WHERE payment_line.order_id = payment_order.id " "AND payment_order.state in ('draft', 'open') " "AND payment_line.state = 'normal' " + "AND communication is null" "AND communication2 is not null") From f0e85e2c1a3998067c5221bb02ca77481932a704 Mon Sep 17 00:00:00 2001 From: Stefan Rijnhart Date: Tue, 25 Mar 2014 11:46:23 +0100 Subject: [PATCH 5/9] [IMP] Ensure proper migration from older versions --- account_banking/__openerp__.py | 2 +- .../migrations/7.0.0.3/pre-migration.py | 44 +++++++++++++++++++ .../migrations/7.0.0.1.165/pre-migration.py | 3 +- 3 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 account_banking/migrations/7.0.0.3/pre-migration.py diff --git a/account_banking/__openerp__.py b/account_banking/__openerp__.py index ae6f66bc1..bff6beabc 100644 --- a/account_banking/__openerp__.py +++ b/account_banking/__openerp__.py @@ -26,7 +26,7 @@ { 'name': 'Account Banking', - 'version': '0.2', + 'version': '0.3', 'license': 'AGPL-3', 'author': 'Banking addons community', 'website': 'https://launchpad.net/banking-addons', diff --git a/account_banking/migrations/7.0.0.3/pre-migration.py b/account_banking/migrations/7.0.0.3/pre-migration.py new file mode 100644 index 000000000..dfec20809 --- /dev/null +++ b/account_banking/migrations/7.0.0.3/pre-migration.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Copyright (C) 2014 Akretion (http://www.akretion.com/) +# @author: Alexis de Lattre +# +# 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 . +# +############################################################################## + +def table_exists(cr, table): + """ Check whether a certain table or view exists """ + cr.execute( + 'SELECT count(relname) FROM pg_class WHERE relname = %s', + (table,)) + return cr.fetchone()[0] == 1 + +def migrate(cr, version): + """ + Migration script for semantic changes in account_banking_payment_export. + Putting the same script in this module for users migrating from 6.1, + before the export module was refactored out. + """ + if not version or not table_exists(cr, 'payment_line'): + return + cr.execute( + "UPDATE payment_line SET communication = communication2, " + "communication2 = null " + "FROM payment_order " + "WHERE payment_line.order_id = payment_order.id " + "AND payment_order.state in ('draft', 'open') " + "AND payment_line.state = 'normal' " + "AND communication2 is not null") diff --git a/account_banking_payment_export/migrations/7.0.0.1.165/pre-migration.py b/account_banking_payment_export/migrations/7.0.0.1.165/pre-migration.py index 91839f15e..a420f05fd 100644 --- a/account_banking_payment_export/migrations/7.0.0.1.165/pre-migration.py +++ b/account_banking_payment_export/migrations/7.0.0.1.165/pre-migration.py @@ -21,6 +21,8 @@ def migrate(cr, version): + if not version: + return cr.execute( "UPDATE payment_line SET communication = communication2, " "communication2 = null " @@ -28,5 +30,4 @@ def migrate(cr, version): "WHERE payment_line.order_id = payment_order.id " "AND payment_order.state in ('draft', 'open') " "AND payment_line.state = 'normal' " - "AND communication is null" "AND communication2 is not null") From 7128b6481bb2b7d8a6bffc1de71e187c448676f7 Mon Sep 17 00:00:00 2001 From: Stefan Rijnhart Date: Tue, 25 Mar 2014 14:21:08 +0100 Subject: [PATCH 6/9] [UPD] Added tests for gathering payment line communication --- .../tests/test_payment_roundtrip.py | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/account_banking_tests/tests/test_payment_roundtrip.py b/account_banking_tests/tests/test_payment_roundtrip.py index 8962df1c4..08004db2a 100644 --- a/account_banking_tests/tests/test_payment_roundtrip.py +++ b/account_banking_tests/tests/test_payment_roundtrip.py @@ -163,6 +163,8 @@ class TestPaymentRoundtrip(SingleTransactionCase): 'price_unit': 100.0, 'quantity': 1, 'account_id': expense_id,})], + 'reference_type': 'none', + 'supplier_invoice_number': 'INV1', } self.invoice_ids = [ invoice_model.create( @@ -171,7 +173,11 @@ class TestPaymentRoundtrip(SingleTransactionCase): })] values.update({ 'partner_id': supplier2, - 'name': 'Purchase 2'}) + 'name': 'Purchase 2', + 'reference_type': 'structured', + 'supplier_invoice_number': 'INV2', + 'reference': 'STR2', + }) self.invoice_ids.append( invoice_model.create( cr, uid, values, context={ @@ -247,6 +253,25 @@ class TestPaymentRoundtrip(SingleTransactionCase): }, context=context) reg('payment.order.create').create_payment( cr, uid, [self.payment_order_create_id], context=context) + + # Check if payment lines are created with the correct reference + self.assertTrue( + reg('payment.line').search( + cr, uid, [ + ('move_line_id.invoice', '=', self.invoice_ids[0]), + ('communication', '=', 'INV1'), ('state', '=', 'normal'), + ], context=context), + 'No payment line created from invoice 1 or with the wrong ' + 'communication') + self.assertTrue( + reg('payment.line').search( + cr, uid, [ + ('move_line_id.invoice', '=', self.invoice_ids[1]), + ('communication', '=', 'STR2'), ('state', '=', 'structured'), + ], context=context), + 'No payment line created from invoice 2 or with the wrong ' + 'communication') + wf_service = netsvc.LocalService('workflow') wf_service.trg_validate( uid, 'payment.order', self.payment_order_id, 'open', cr) From f7a7a30f5cc7d868e56dffcf85910d4a933f983c Mon Sep 17 00:00:00 2001 From: Stefan Rijnhart Date: Tue, 25 Mar 2014 14:23:51 +0100 Subject: [PATCH 7/9] [FIX] PEP8 --- account_banking_tests/tests/test_payment_roundtrip.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/account_banking_tests/tests/test_payment_roundtrip.py b/account_banking_tests/tests/test_payment_roundtrip.py index 08004db2a..a3c8223f4 100644 --- a/account_banking_tests/tests/test_payment_roundtrip.py +++ b/account_banking_tests/tests/test_payment_roundtrip.py @@ -259,7 +259,8 @@ class TestPaymentRoundtrip(SingleTransactionCase): reg('payment.line').search( cr, uid, [ ('move_line_id.invoice', '=', self.invoice_ids[0]), - ('communication', '=', 'INV1'), ('state', '=', 'normal'), + ('communication', '=', 'INV1'), + ('state', '=', 'normal'), ], context=context), 'No payment line created from invoice 1 or with the wrong ' 'communication') @@ -267,11 +268,12 @@ class TestPaymentRoundtrip(SingleTransactionCase): reg('payment.line').search( cr, uid, [ ('move_line_id.invoice', '=', self.invoice_ids[1]), - ('communication', '=', 'STR2'), ('state', '=', 'structured'), + ('communication', '=', 'STR2'), + ('state', '=', 'structured'), ], context=context), 'No payment line created from invoice 2 or with the wrong ' 'communication') - + wf_service = netsvc.LocalService('workflow') wf_service.trg_validate( uid, 'payment.order', self.payment_order_id, 'open', cr) From a5e5203bd0501cc55ec401703d679069cfdd6a1b Mon Sep 17 00:00:00 2001 From: Stefan Rijnhart Date: Tue, 25 Mar 2014 14:44:35 +0100 Subject: [PATCH 8/9] [RFR] Don't enlarge largely unused additional communication2 field --- account_banking_payment/model/payment_line.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/account_banking_payment/model/payment_line.py b/account_banking_payment/model/payment_line.py index a4ddc1c0d..1cf14c614 100644 --- a/account_banking_payment/model/payment_line.py +++ b/account_banking_payment/model/payment_line.py @@ -36,15 +36,9 @@ class payment_line(orm.Model): ''' _inherit = 'payment.line' _columns = { - # New fields 'msg': fields.char('Message', size=255, required=False, readonly=True), 'date_done': fields.date( 'Date Confirmed', select=True, readonly=True), - # Communication2: enlarge to 128 - 'communication2': fields.char( - 'Communication 2', size=128, - help='The successor message of Communication.', - ), 'transit_move_line_id': fields.many2one( # this line is part of the credit side of move 2a # from the documentation From 4b3b06dd4fb9b67027e31ba61af22d35eef6d131 Mon Sep 17 00:00:00 2001 From: Stefan Rijnhart Date: Tue, 25 Mar 2014 14:49:23 +0100 Subject: [PATCH 9/9] [FIX] Adapt module dependencies to refactoring of payment functionality. This module actually depends on account_banking integration with payments. --- account_banking_tests/__openerp__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/account_banking_tests/__openerp__.py b/account_banking_tests/__openerp__.py index 04e3fdd70..47194935a 100644 --- a/account_banking_tests/__openerp__.py +++ b/account_banking_tests/__openerp__.py @@ -27,7 +27,7 @@ 'category': 'Banking addons', 'depends': [ 'account_accountant', - 'account_banking', + 'account_banking_payment', 'account_banking_sepa_credit_transfer', ], 'description': '''