diff --git a/account_banking/__openerp__.py b/account_banking/__openerp__.py index bff6beabc..bb2385407 100644 --- a/account_banking/__openerp__.py +++ b/account_banking/__openerp__.py @@ -4,7 +4,7 @@ # Copyright (C) 2009 EduSense BV (). # (C) 2011 Therp BV (). # (C) 2011 Smile (). -# +# # All other contributions are (C) by their respective contributors # # All Rights Reserved @@ -26,7 +26,7 @@ { 'name': 'Account Banking', - 'version': '0.3', + 'version': '0.4', 'license': 'AGPL-3', 'author': 'Banking addons community', 'website': 'https://launchpad.net/banking-addons', diff --git a/account_banking/migrations/7.0.0.4/pre-migration.py b/account_banking/migrations/7.0.0.4/pre-migration.py new file mode 100644 index 000000000..dfec20809 --- /dev/null +++ b/account_banking/migrations/7.0.0.4/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/model/payment_line.py b/account_banking_payment/model/payment_line.py index 7b5345ecf..1cf14c614 100644 --- a/account_banking_payment/model/payment_line.py +++ b/account_banking_payment/model/payment_line.py @@ -36,23 +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), - # 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, - 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 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/__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..a420f05fd --- /dev/null +++ b/account_banking_payment_export/migrations/7.0.0.1.165/pre-migration.py @@ -0,0 +1,33 @@ +# -*- 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") 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, 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': ''' diff --git a/account_banking_tests/tests/test_payment_roundtrip.py b/account_banking_tests/tests/test_payment_roundtrip.py index 8962df1c4..a3c8223f4 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,27 @@ 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)