[ADD] Introduce _prepare method in the wizard "Select Invoices to Pay", for easier inheritence

[IMP] Don't disable the field 'communication' when using free communication
      - Structured => 'communication'
      - Free => 'communication' + 'communication2
This commit is contained in:
unknown
2014-05-23 13:59:39 +02:00
committed by Stefan Rijnhart
9 changed files with 192 additions and 108 deletions

View File

@@ -4,7 +4,7 @@
# Copyright (C) 2009 EduSense BV (<http://www.edusense.nl>).
# (C) 2011 Therp BV (<http://therp.nl>).
# (C) 2011 Smile (<http://smile.fr>).
#
#
# 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',

View File

@@ -0,0 +1,44 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright (C) 2014 Akretion (http://www.akretion.com/)
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
#
# 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 <http://www.gnu.org/licenses/>.
#
##############################################################################
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")

View File

@@ -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

View File

@@ -17,13 +17,6 @@
'invisible':[('state','!=','draft')]
}</attribute>
</xpath>
<!-- Communication only used for 'structured' communication -->
<xpath expr="//field[@name='line_ids']/form//field[@name='communication']"
position="attributes">
<attribute name="attrs">{
'readonly': [('state', '=', 'normal')]
}</attribute>
</xpath>
</data>
</field>
</record>

View File

@@ -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',

View File

@@ -0,0 +1,33 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright (C) 2014 Akretion (http://www.akretion.com/)
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
#
# 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 <http://www.gnu.org/licenses/>.
#
##############################################################################
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")

View File

@@ -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,

View File

@@ -27,7 +27,7 @@
'category': 'Banking addons',
'depends': [
'account_accountant',
'account_banking',
'account_banking_payment',
'account_banking_sepa_credit_transfer',
],
'description': '''

View File

@@ -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)