banking-addons-team team mailing list archive
-
banking-addons-team team
-
Mailing list archive
-
Message #00679
[Merge] lp:~therp-nl/banking-addons/6.1-aggregate_payments into lp:banking-addons
Stefan Rijnhart (Therp) has proposed merging lp:~therp-nl/banking-addons/6.1-aggregate_payments into lp:banking-addons.
Requested reviews:
Banking Addons Core Editors (banking-addons-team)
For more details, see:
https://code.launchpad.net/~therp-nl/banking-addons/6.1-aggregate_payments/+merge/169288
>From the module description that this branch adds:
This module allows for aggregating payments for various creditors and making them payable to a single partner. This is practiced in certain purchasing consortia.
After collection of the payable invoices on a payment order of type 'Aggregate payment', the move lines in the payment order are reconciled by a move on a transit account, the total amount of which is then transferred onto the designated partner's account payable (upon confirmation of the aggregate payment order).
The payment order wizard then proceeds to create a new payment order of a user chosen payment mode with only the aggregate move line in it.
Notes:
- The dependency on account_direct_debit is completely artificial. It only needs the two fields that it adds to the payment mode. This calls for a refactoring which actually has already been carried out for 7.0. I would prefer to leave 6.1 as it is to be honest.
- I am not sure about the English terminology 'Aggregate payment' and 'Transit move & account'. Any suggestions are welcome.
--
https://code.launchpad.net/~therp-nl/banking-addons/6.1-aggregate_payments/+merge/169288
Your team Banking Addons Core Editors is requested to review the proposed merge of lp:~therp-nl/banking-addons/6.1-aggregate_payments into lp:banking-addons.
=== added directory 'account_banking_aggregate_payment'
=== added file 'account_banking_aggregate_payment/__init__.py'
--- account_banking_aggregate_payment/__init__.py 1970-01-01 00:00:00 +0000
+++ account_banking_aggregate_payment/__init__.py 2013-06-13 20:01:27 +0000
@@ -0,0 +1,1 @@
+import model
=== added file 'account_banking_aggregate_payment/__openerp__.py'
--- account_banking_aggregate_payment/__openerp__.py 1970-01-01 00:00:00 +0000
+++ account_banking_aggregate_payment/__openerp__.py 2013-06-13 20:01:27 +0000
@@ -0,0 +1,49 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# This module copyright (C) 2013 Therp BV (<http://therp.nl>).
+#
+# 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/>.
+#
+##############################################################################
+{
+ 'name': 'Account Banking Aggregate Payment',
+ 'version': '0.1.136',
+ 'license': 'GPL-3',
+ 'author': 'Therp BV',
+ 'website': 'https://launchpad.net/banking-addons',
+ 'category': 'Banking addons',
+ 'depends': ['account_direct_debit'],
+ 'data': [
+ 'data/payment_mode_type.xml',
+ 'view/payment_mode.xml',
+ 'view/export_aggregate.xml',
+ ],
+ 'description': '''
+ This module allows for aggregating payments for various creditors
+ and making them payable to a single partner. This is practiced in
+ certain purchasing consortia.
+
+ After collection of the payable invoices on a payment order of type
+ 'Aggregate payment', the move lines in the payment order are
+ reconciled by a move on a transit account, the total amount of which
+ is then transferred onto the designated partner's account payable
+ (upon confirmation of the aggregate payment order).
+
+ The payment order wizard then proceeds to create a new payment order
+ of a user chosen payment mode with only the aggregate move line in it.
+ ''',
+ 'active': False,
+}
=== added directory 'account_banking_aggregate_payment/data'
=== added file 'account_banking_aggregate_payment/data/payment_mode_type.xml'
--- account_banking_aggregate_payment/data/payment_mode_type.xml 1970-01-01 00:00:00 +0000
+++ account_banking_aggregate_payment/data/payment_mode_type.xml 2013-06-13 20:01:27 +0000
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+ <data>
+
+ <record model="payment.mode.type"
+ id="type_aggregate">
+ <field name="name">Aggregate payment</field>
+ <field name="code">AGGR</field>
+ <field name="suitable_bank_types"
+ eval="[(6, 0, (ref('base_iban.bank_iban'),
+ ref('base.bank_normal')))]" />
+ <field name="ir_model_id"
+ ref="model_banking_export_aggregate"/>
+ </record>
+ </data>
+</openerp>
=== added directory 'account_banking_aggregate_payment/i18n'
=== added file 'account_banking_aggregate_payment/i18n/account_banking_aggregate_payment.pot'
--- account_banking_aggregate_payment/i18n/account_banking_aggregate_payment.pot 1970-01-01 00:00:00 +0000
+++ account_banking_aggregate_payment/i18n/account_banking_aggregate_payment.pot 2013-06-13 20:01:27 +0000
@@ -0,0 +1,175 @@
+# Translation of OpenERP Server.
+# This file contains the translation of the following modules:
+# * account_banking_aggregate_payment
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OpenERP Server 6.1\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-06-13 19:35+0000\n"
+"PO-Revision-Date: 2013-06-13 19:35+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_aggregate_payment
+#: view:payment.mode:0
+msgid "Aggregate payment"
+msgstr "Aggregate payment"
+
+#. module: account_banking_aggregate_payment
+#: view:banking.export.aggregate:0
+msgid "Create"
+msgstr "Create"
+
+#. module: account_banking_aggregate_payment
+#: help:payment.mode,aggregate_partner_id:0
+msgid "The single partner on the chained payment order"
+msgstr "The single partner on the chained payment order"
+
+#. module: account_banking_aggregate_payment
+#: code:addons/account_banking_aggregate_payment/model/export_aggregate.py:134
+#, python-format
+msgid "Aggregate Payment Order %s"
+msgstr "Aggregate Payment Order %s"
+
+#. module: account_banking_aggregate_payment
+#: code:addons/account_banking_aggregate_payment/model/export_aggregate.py:230
+#, python-format
+msgid "Payment order workflow does not go into state \"done\""
+msgstr "Payment order workflow does not go into state \"done\""
+
+#. module: account_banking_aggregate_payment
+#: code:addons/account_banking_aggregate_payment/model/export_aggregate.py:143
+#, python-format
+msgid "No move line provided for line %s"
+msgstr "No move line provided for line %s"
+
+#. module: account_banking_aggregate_payment
+#: model:ir.model,name:account_banking_aggregate_payment.model_payment_mode
+msgid "Payment Mode"
+msgstr "Payment Mode"
+
+#. module: account_banking_aggregate_payment
+#: code:addons/account_banking_aggregate_payment/model/export_aggregate.py:48
+#, python-format
+msgid "Please only select a single payment order"
+msgstr "Please only select a single payment order"
+
+#. module: account_banking_aggregate_payment
+#: code:addons/account_banking_aggregate_payment/model/export_aggregate.py:147
+#, python-format
+msgid "Move line %s has already been paid/reconciled"
+msgstr "Move line %s has already been paid/reconciled"
+
+#. module: account_banking_aggregate_payment
+#: code:addons/account_banking_aggregate_payment/model/export_aggregate.py:44
+#: code:addons/account_banking_aggregate_payment/model/export_aggregate.py:121
+#, python-format
+msgid "Please select a payment order"
+msgstr "Please select a payment order"
+
+#. module: account_banking_aggregate_payment
+#: code:addons/account_banking_aggregate_payment/model/export_aggregate.py:125
+#, python-format
+msgid "This operation can only be performed on a single payment order"
+msgstr "This operation can only be performed on a single payment order"
+
+#. module: account_banking_aggregate_payment
+#: code:addons/account_banking_aggregate_payment/model/export_aggregate.py:155
+#, python-format
+msgid "Transit %s"
+msgstr "Transit %s"
+
+#. module: account_banking_aggregate_payment
+#: code:addons/account_banking_aggregate_payment/model/export_aggregate.py:191
+#, python-format
+msgid "Transit reconciliation"
+msgstr "Transit reconciliation"
+
+#. module: account_banking_aggregate_payment
+#: view:banking.export.aggregate:0
+msgid "Export aggregate payment order"
+msgstr "Export aggregate payment order"
+
+#. module: account_banking_aggregate_payment
+#: code:addons/account_banking_aggregate_payment/model/export_aggregate.py:208
+#, python-format
+msgid "Amount payable"
+msgstr "Amount payable"
+
+#. module: account_banking_aggregate_payment
+#: field:payment.mode,aggregate_partner_id:0
+msgid "Aggregate payment beneficiary"
+msgstr "Aggregate payment beneficiary"
+
+#. module: account_banking_aggregate_payment
+#: help:payment.mode,chained_mode_id:0
+msgid "The payment type of the chained payment order"
+msgstr "The payment type of the chained payment order"
+
+#. module: account_banking_aggregate_payment
+#: code:addons/account_banking_aggregate_payment/model/export_aggregate.py:43
+#: code:addons/account_banking_aggregate_payment/model/export_aggregate.py:47
+#: code:addons/account_banking_aggregate_payment/model/export_aggregate.py:65
+#: code:addons/account_banking_aggregate_payment/model/export_aggregate.py:71
+#: code:addons/account_banking_aggregate_payment/model/export_aggregate.py:120
+#: code:addons/account_banking_aggregate_payment/model/export_aggregate.py:124
+#: code:addons/account_banking_aggregate_payment/model/export_aggregate.py:142
+#: code:addons/account_banking_aggregate_payment/model/export_aggregate.py:146
+#: code:addons/account_banking_aggregate_payment/model/export_aggregate.py:229
+#, python-format
+msgid "Error"
+msgstr "Error"
+
+#. module: account_banking_aggregate_payment
+#: model:ir.model,name:account_banking_aggregate_payment.model_banking_export_aggregate
+msgid "Execute aggregate payment"
+msgstr "Execute aggregate payment"
+
+#. module: account_banking_aggregate_payment
+#: view:banking.export.aggregate:0
+msgid "When you confirm this order, the total amount will be made payable to the partner that has been set on the payment mode. A new payment order will open in your screen with this one payment."
+msgstr "When you confirm this order, the total amount will be made payable to the partner that has been set on the payment mode. A new payment order will open in your screen with this one payment."
+
+#. module: account_banking_aggregate_payment
+#: code:addons/account_banking_aggregate_payment/model/export_aggregate.py:172
+#, python-format
+msgid "Reconciliation %s"
+msgstr "Reconciliation %s"
+
+#. module: account_banking_aggregate_payment
+#: field:banking.export.aggregate,reference:0
+msgid "Reference"
+msgstr "Reference"
+
+#. module: account_banking_aggregate_payment
+#: field:banking.export.aggregate,payment_order_id:0
+msgid "Payment order"
+msgstr "Payment order"
+
+#. module: account_banking_aggregate_payment
+#: field:payment.mode,chained_mode_id:0
+msgid "Chained payment mode"
+msgstr "Chained payment mode"
+
+#. module: account_banking_aggregate_payment
+#: code:addons/account_banking_aggregate_payment/model/export_aggregate.py:66
+#, python-format
+msgid "Cannot reconcile between different accounts"
+msgstr "Cannot reconcile between different accounts"
+
+#. module: account_banking_aggregate_payment
+#: code:addons/account_banking_aggregate_payment/model/export_aggregate.py:72
+#, python-format
+msgid "Line is already fully reconciled"
+msgstr "Line is already fully reconciled"
+
+#. module: account_banking_aggregate_payment
+#: view:banking.export.aggregate:0
+msgid "Cancel"
+msgstr "Cancel"
+
=== added file 'account_banking_aggregate_payment/i18n/nl.po'
--- account_banking_aggregate_payment/i18n/nl.po 1970-01-01 00:00:00 +0000
+++ account_banking_aggregate_payment/i18n/nl.po 2013-06-13 20:01:27 +0000
@@ -0,0 +1,170 @@
+# Translation of OpenERP Server.
+# This file contains the translation of the following modules:
+# * account_banking_aggregate_payment
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OpenERP Server 6.1\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-06-13 19:35+0000\n"
+"PO-Revision-Date: 2013-06-13 19:35+0000\n"
+"Last-Translator: <stefan@xxxxxxxx>\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_aggregate_payment
+#: view:payment.mode:0
+msgid "Aggregate payment"
+msgstr "Verzamelbetaalopdracht"
+
+#. module: account_banking_aggregate_payment
+#: view:banking.export.aggregate:0
+msgid "Create"
+msgstr "Aanmaken"
+
+#. module: account_banking_aggregate_payment
+#: help:payment.mode,aggregate_partner_id:0
+msgid "The single partner on the chained payment order"
+msgstr "De relatie die geldt als crediteur van het verzameld bedrag"
+
+#. module: account_banking_aggregate_payment
+#: code:addons/account_banking_aggregate_payment/model/export_aggregate.py:134
+#, python-format
+msgid "Aggregate Payment Order %s"
+msgstr "Verzamelbetaling %s"
+
+#. module: account_banking_aggregate_payment
+#: code:addons/account_banking_aggregate_payment/model/export_aggregate.py:230
+#, python-format
+msgid "Payment order workflow does not go into state \"done\""
+msgstr "De workflow van de betaalopdracht komt niet in de status \"verwerkt\""
+
+#. module: account_banking_aggregate_payment
+#: code:addons/account_banking_aggregate_payment/model/export_aggregate.py:143
+#, python-format
+msgid "No move line provided for line %s"
+msgstr "Er is geen boeking voor regel %s"
+
+#. module: account_banking_aggregate_payment
+#: model:ir.model,name:account_banking_aggregate_payment.model_payment_mode
+msgid "Payment Mode"
+msgstr "Betaalwijze"
+
+#. module: account_banking_aggregate_payment
+#: code:addons/account_banking_aggregate_payment/model/export_aggregate.py:48
+#, python-format
+msgid "Please only select a single payment order"
+msgstr "Er kan maar één betaalopdracht worden geselecteerd"
+
+#. module: account_banking_aggregate_payment
+#: code:addons/account_banking_aggregate_payment/model/export_aggregate.py:147
+#, python-format
+msgid "Move line %s has already been paid/reconciled"
+msgstr "Boekingsregel %s is al afgeletterd"
+
+#. module: account_banking_aggregate_payment
+#: code:addons/account_banking_aggregate_payment/model/export_aggregate.py:44
+#: code:addons/account_banking_aggregate_payment/model/export_aggregate.py:121
+#, python-format
+msgid "Please select a payment order"
+msgstr "Selecteer alstublieft een betaalopdracht"
+
+#. module: account_banking_aggregate_payment
+#: code:addons/account_banking_aggregate_payment/model/export_aggregate.py:125
+#, python-format
+msgid "This operation can only be performed on a single payment order"
+msgstr "Deze bewerking kan alleen worden uitgevoerd op een enkele betaalopdracht"
+
+#. module: account_banking_aggregate_payment
+#: code:addons/account_banking_aggregate_payment/model/export_aggregate.py:155
+#, python-format
+msgid "Transit %s"
+msgstr "Tussenboeking %s"
+
+#. module: account_banking_aggregate_payment
+#: code:addons/account_banking_aggregate_payment/model/export_aggregate.py:191
+#, python-format
+msgid "Transit reconciliation"
+msgstr "Aflettering tussenboeking"
+
+#. module: account_banking_aggregate_payment
+#: view:banking.export.aggregate:0
+msgid "Export aggregate payment order"
+msgstr "Verwerken een verzamelbetalingsopdracht"
+
+#. module: account_banking_aggregate_payment
+#: code:addons/account_banking_aggregate_payment/model/export_aggregate.py:208
+#, python-format
+msgid "Amount payable"
+msgstr "Verschuldigd bedrag"
+
+#. module: account_banking_aggregate_payment
+#: field:payment.mode,aggregate_partner_id:0
+msgid "Aggregate payment beneficiary"
+msgstr "Begunstigde van de verzamelbetaling"
+
+#. module: account_banking_aggregate_payment
+#: help:payment.mode,chained_mode_id:0
+msgid "The payment type of the chained payment order"
+msgstr "De betaalwijze van de gekoppelde betaalopdracht"
+
+#. module: account_banking_aggregate_payment
+#: code:addons/account_banking_aggregate_payment/model/export_aggregate.py:43
+#: code:addons/account_banking_aggregate_payment/model/export_aggregate.py:47
+#: code:addons/account_banking_aggregate_payment/model/export_aggregate.py:65
+#: code:addons/account_banking_aggregate_payment/model/export_aggregate.py:71
+#: code:addons/account_banking_aggregate_payment/model/export_aggregate.py:120
+#: code:addons/account_banking_aggregate_payment/model/export_aggregate.py:124
+#: code:addons/account_banking_aggregate_payment/model/export_aggregate.py:142
+#: code:addons/account_banking_aggregate_payment/model/export_aggregate.py:146
+#: code:addons/account_banking_aggregate_payment/model/export_aggregate.py:229
+#, python-format
+msgid "Error"
+msgstr "Fout"
+
+#. module: account_banking_aggregate_payment
+#: model:ir.model,name:account_banking_aggregate_payment.model_banking_export_aggregate
+msgid "Execute aggregate payment"
+msgstr "Verzamelbetaling boeken"
+
+#. module: account_banking_aggregate_payment
+#: view:banking.export.aggregate:0
+msgid "When you confirm this order, the total amount will be made payable to the partner that has been set on the payment mode. A new payment order will open in your screen with this one payment."
+msgstr "Als u deze betaalopdracht bevestigd, dan wordt het totaalbedrag betaalbaar gemaakt aan de relatie die op de betaalwijze aangegeven staat. In het scherm wordt een nieuwe betaalopdracht geopend met alleen dit totaalbedrag."
+
+#. module: account_banking_aggregate_payment
+#: code:addons/account_banking_aggregate_payment/model/export_aggregate.py:172
+#, python-format
+msgid "Reconciliation %s"
+msgstr "Aflettering %s"
+
+#. module: account_banking_aggregate_payment
+#: field:banking.export.aggregate,payment_order_id:0
+msgid "Payment order"
+msgstr "Betaalopdracht"
+
+#. module: account_banking_aggregate_payment
+#: field:payment.mode,chained_mode_id:0
+msgid "Chained payment mode"
+msgstr "Gekoppelde betaalwijze"
+
+#. module: account_banking_aggregate_payment
+#: code:addons/account_banking_aggregate_payment/model/export_aggregate.py:66
+#, python-format
+msgid "Cannot reconcile between different accounts"
+msgstr "Kan niet afletteren tussen verschillende grootboekrekeningen"
+
+#. module: account_banking_aggregate_payment
+#: code:addons/account_banking_aggregate_payment/model/export_aggregate.py:72
+#, python-format
+msgid "Line is already fully reconciled"
+msgstr "De regel is al afgeletterd"
+
+#. module: account_banking_aggregate_payment
+#: view:banking.export.aggregate:0
+msgid "Cancel"
+msgstr "Annuleer"
+
=== added directory 'account_banking_aggregate_payment/model'
=== added file 'account_banking_aggregate_payment/model/__init__.py'
--- account_banking_aggregate_payment/model/__init__.py 1970-01-01 00:00:00 +0000
+++ account_banking_aggregate_payment/model/__init__.py 2013-06-13 20:01:27 +0000
@@ -0,0 +1,2 @@
+import payment_mode
+import export_aggregate
=== added file 'account_banking_aggregate_payment/model/export_aggregate.py'
--- account_banking_aggregate_payment/model/export_aggregate.py 1970-01-01 00:00:00 +0000
+++ account_banking_aggregate_payment/model/export_aggregate.py 2013-06-13 20:01:27 +0000
@@ -0,0 +1,268 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# This module copyright (C) 2013 Therp BV (<http://therp.nl>).
+#
+# 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/>.
+#
+##############################################################################
+
+from openerp.osv import orm, fields
+from openerp.tools.translate import _
+from openerp import netsvc
+
+
+class banking_export_aggregate(orm.TransientModel):
+ _name = 'banking.export.aggregate'
+ _description = 'Execute aggregate payment order'
+ _rec_name = 'payment_order_id'
+
+ _columns = {
+ 'payment_order_id': fields.many2one(
+ 'payment.order', 'Payment order',
+ required=True),
+ }
+
+ def create(self, cr, uid, vals, context=None):
+ if context is None:
+ context = {}
+ if not vals.get('payment_order_id'):
+ if not context.get('active_ids'):
+ raise orm.except_orm(
+ _('Error'),
+ _('Please select a payment order'))
+ if len(context['active_ids']) > 1:
+ raise orm.except_orm(
+ _('Error'),
+ _('Please only select a single payment order'))
+ vals['payment_order_id'] = context['active_ids'][0]
+ return super(banking_export_aggregate, self).create(
+ cr, uid, vals, context=context)
+
+ def reconcile_lines(self, cr, uid, move_line_ids, context=None):
+ """
+ Reconcile move lines lines, really. ERP core functionality.
+ """
+ reconcile_obj = self.pool.get('account.move.reconcile')
+ account_move_line_obj = self.pool.get('account.move.line')
+ currency_obj = self.pool.get('res.currency')
+ lines = account_move_line_obj.browse(cr, uid, move_line_ids, context=context)
+
+ for line in lines[1:]:
+ if line.account_id != lines[0].account_id:
+ raise orm.except_orm(
+ _('Error'),
+ _('Cannot reconcile between different accounts'))
+
+ if any([line.reconcile_id and line.reconcile_id.line_id
+ for line in lines]):
+ raise orm.except_orm(
+ _('Error'),
+ _('Line is already fully reconciled'))
+
+ currency = lines[0].company_id.currency_id
+
+ partials = []
+ line_ids = []
+ for line in lines:
+ if line.id not in line_ids:
+ line_ids.append(line.id)
+ if line.reconcile_partial_id:
+ line_ids += line.reconcile_partial_id.line_partial_ids
+ if line.reconcile_partial_id.id not in partials:
+ partials.append(line.reconcile_partial_id.id)
+
+ total = account_move_line_obj.get_balance(cr, uid, line_ids)
+ is_zero = currency_obj.is_zero(cr, uid, currency, total)
+
+ vals = {
+ 'type': 'auto',
+ 'line_id': is_zero and [(6, 0, line_ids)] or [(6, 0, [])],
+ 'line_partial_ids': is_zero and [(6, 0, [])] or [(6, 0, line_ids)],
+ }
+
+ if partials:
+ if len(partials) > 1:
+ reconcile_obj.unlink(
+ cr, uid, partials[1:], context=context)
+ reconcile_obj.write(
+ cr, uid, partials[0],
+ vals, context=context)
+ else:
+ reconcile_obj.create(
+ cr, uid, vals, context=context)
+
+ for line_id in line_ids:
+ netsvc.LocalService("workflow").trg_trigger(
+ uid, 'account.move.line', line_id, cr)
+ return True
+
+ def create_aggregate_order(self, cr, uid, ids, context=None):
+ wiz = self.browse(cr, uid, ids[0], context=context)
+ account_move_line_obj = self.pool.get('account.move.line')
+ account_move_obj = self.pool.get('account.move')
+ payment_order_obj = self.pool.get('payment.order')
+ payment_order_line_obj = self.pool.get('payment.line')
+ payment_order_ids = context.get('active_ids', [])
+ if not payment_order_ids:
+ raise orm.except_orm(
+ _('Error'),
+ _('Please select a payment order'))
+ if len(payment_order_ids) > 1:
+ raise orm.except_orm(
+ _('Error'),
+ _('This operation can only be performed on a single '
+ 'payment order'))
+
+ today = fields.date.context_today(self, cr, uid, context=context)
+ order = payment_order_obj.browse(
+ cr, uid, payment_order_ids[0], context=context)
+
+ move_id = account_move_obj.create(cr, uid, {
+ 'journal_id': order.mode.transfer_journal_id.id,
+ 'ref': _('Aggregate Payment Order %s') % order.reference,
+ }, context=context)
+
+ counter_move_line_ids = []
+ for line in order.line_ids:
+ # basic checks
+ if not line.move_line_id:
+ raise orm.except_orm(
+ _('Error'),
+ _('No move line provided for line %s') % line.name)
+ if line.move_line_id.reconcile_id:
+ raise orm.except_orm(
+ _('Error'),
+ _('Move line %s has already been paid/reconciled') %
+ line.move_line_id.name
+ )
+
+ # TODO: take multicurrency into account?
+
+ # create the move line on the transfer account
+ vals = {
+ 'name': _('Transit %s') % (
+ line.move_line_id.invoice and
+ line.move_line_id.invoice.number or
+ line.move_line_id.ref),
+ 'move_id': move_id,
+ 'partner_id': line.partner_id and line.partner_id.id or False,
+ 'account_id': order.mode.transfer_account_id.id,
+ 'credit': line.amount,
+ 'debit': 0.0,
+ 'date': today,
+ }
+ counter_move_line_id = account_move_line_obj.create(
+ cr, uid, vals, context=context)
+ counter_move_line_ids.append(counter_move_line_id)
+
+ # create the debit move line on the receivable account
+ vals.update({
+ 'name': _('Reconciliation %s') % (
+ line.move_line_id.invoice and
+ line.move_line_id.invoice.number or
+ line.move_line_id.name),
+ 'account_id': line.move_line_id.account_id.id,
+ 'credit': 0.0,
+ 'debit': line.amount,
+ })
+ reconcile_move_line_id = account_move_line_obj.create(
+ cr, uid, vals, context=context)
+
+ self.reconcile_lines(
+ cr, uid, [reconcile_move_line_id, line.move_line_id.id],
+ context=context)
+
+ total = account_move_line_obj.get_balance(
+ cr, uid, counter_move_line_ids)
+
+ vals = {
+ 'name': _('Transit reconciliation'),
+ 'move_id': move_id,
+ 'partner_id': order.mode.aggregate_partner_id.id,
+ 'account_id': order.mode.transfer_account_id.id,
+ 'debit': total < 0 and -total or 0.0,
+ 'credit': total >= 0 and total or 0.0,
+ 'date': today,
+ }
+ aggregate_move_line_id = account_move_line_obj.create(
+ cr, uid, vals, context=context)
+
+ self.reconcile_lines(
+ cr, uid, counter_move_line_ids + [aggregate_move_line_id],
+ context=context)
+
+ # create the credit move line on the aggregate partner
+ vals.update({
+ 'name': _('Amount payable'),
+ 'account_id': order.mode.aggregate_partner_id.property_account_payable.id,
+ 'partner_id': order.mode.aggregate_partner_id.id,
+ 'debit': total >= 0 and total or 0.0,
+ 'credit': total < 0 and -total or 0.0,
+ })
+
+ payable_move_line = account_move_line_obj.browse(
+ cr, uid,
+ account_move_line_obj.create(
+ cr, uid, vals, context=context),
+ context=context)
+
+ account_move_obj.post(cr, uid, [move_id], context=context)
+
+ wf_service = netsvc.LocalService('workflow')
+ wf_service.trg_validate(uid, 'payment.order', order.id, 'sent', cr)
+ wf_service.trg_validate(uid, 'payment.order', order.id, 'done', cr)
+ order.refresh()
+ if order.state != 'done':
+ raise orm.except_orm(
+ _('Error'),
+ _('Payment order workflow does not go into state "done"'))
+
+ payment_order_id = payment_order_obj.create(
+ cr, uid, {
+ 'company_id': order.company_id.id,
+ 'mode': order.mode.chained_mode_id.id,
+ }, context=context)
+
+ lines2bank = account_move_line_obj.line2bank(
+ cr, uid, [payable_move_line.id], order.mode.id, context)
+
+ payment_order_line_obj.create(cr, uid,{
+ 'move_line_id': payable_move_line.id,
+ 'amount_currency': payable_move_line.amount_to_pay,
+ 'bank_id': lines2bank.get(payable_move_line.id),
+ 'order_id': payment_order_id,
+ 'partner_id': order.mode.aggregate_partner_id.id,
+ 'communication': order.reference.replace('/', ''),
+ 'communication2': False,
+ 'state': 'structured',
+ 'date': today,
+ 'currency': (
+ line.move_line_id.journal_id.currency.id or
+ line.move_line_id.journal_id.company_id.currency_id.id),
+ }, context=context)
+
+ return {
+ 'name': payment_order_obj._description,
+ 'view_type': 'form',
+ 'view_mode': 'form',
+ 'res_model': payment_order_obj._name,
+ 'domain': [],
+ 'context': context,
+ 'type': 'ir.actions.act_window',
+ 'target': 'current',
+ 'res_id': payment_order_id,
+ 'nodestroy': True,
+ }
=== added file 'account_banking_aggregate_payment/model/payment_mode.py'
--- account_banking_aggregate_payment/model/payment_mode.py 1970-01-01 00:00:00 +0000
+++ account_banking_aggregate_payment/model/payment_mode.py 2013-06-13 20:01:27 +0000
@@ -0,0 +1,35 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# This module copyright (C) 2013 Therp BV (<http://therp.nl>).
+#
+# 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/>.
+#
+##############################################################################
+
+from openerp.osv import orm, fields
+
+
+class payment_mode(orm.Model):
+ _inherit = "payment.mode"
+ _columns = {
+ 'aggregate_partner_id': fields.many2one(
+ 'res.partner', 'Aggregate payment beneficiary',
+ help="The single partner on the chained payment order",
+ ),
+ 'chained_mode_id': fields.many2one(
+ 'payment.mode', 'Chained payment mode',
+ help="The payment type of the chained payment order"),
+ }
=== added directory 'account_banking_aggregate_payment/view'
=== added file 'account_banking_aggregate_payment/view/export_aggregate.xml'
--- account_banking_aggregate_payment/view/export_aggregate.xml 1970-01-01 00:00:00 +0000
+++ account_banking_aggregate_payment/view/export_aggregate.xml 2013-06-13 20:01:27 +0000
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+ <data>
+ <record id="banking_export_aggregate_view" model="ir.ui.view">
+ <field name="name">Export aggregate payment order</field>
+ <field name="model">banking.export.aggregate</field>
+ <field name="type">form</field>
+ <field name="arch" type="xml">
+ <form string="Export aggregate payment order">
+ <label string="When you confirm this order, the total
+ amount will be made payable to the partner
+ that has been set on the payment mode. A
+ new payment order will open in your screen
+ with this one payment."/>
+ <group col="2" colspan="1">
+ <button icon="gtk-close"
+ special="cancel"
+ string="Cancel"
+ />
+ <button icon="gtk-ok"
+ string="Create"
+ name="create_aggregate_order"
+ type="object"
+ />
+ </group>
+ </form>
+ </field>
+ </record>
+ </data>
+</openerp>
=== added file 'account_banking_aggregate_payment/view/payment_mode.xml'
--- account_banking_aggregate_payment/view/payment_mode.xml 1970-01-01 00:00:00 +0000
+++ account_banking_aggregate_payment/view/payment_mode.xml 2013-06-13 20:01:27 +0000
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+ <data>
+ <record id="view_payment_mode_form" model="ir.ui.view">
+ <field name="name">Adaptations for aggregate payment modes</field>
+ <field name="model">payment.mode</field>
+ <field name="inherit_id"
+ ref="account_direct_debit.view_payment_mode_form"/>
+ <field name="type">form</field>
+ <field name="arch" type="xml">
+ <field name="payment_term_ids" position="after">
+ <group colspan="2" col="2" string="Aggregate payment"
+ attrs="{
+ 'invisible': [
+ ('type', '!=',
+ %(account_banking_aggregate_payment.type_aggregate)d
+ )]}">
+ <field name="aggregate_partner_id"
+ attrs="{'required': [
+ ('type', '=',
+ %(account_banking_aggregate_payment.type_aggregate)d
+ )]}"
+ />
+ <field name="chained_mode_id"
+ attrs="{'required': [
+ ('type', '=',
+ %(account_banking_aggregate_payment.type_aggregate)d
+ )]}"
+ />
+ </group>
+ </field>
+
+ <field name="transfer_account_id" position="attributes">
+ <attribute name="attrs">{
+ 'required': [
+ ('type', '=',
+ %(account_banking_aggregate_payment.type_aggregate)d
+ )]}</attribute>
+ </field>
+
+ <field name="transfer_journal_id" position="attributes">
+ <attribute name="attrs">{
+ 'required': [
+ ('type', '=',
+ %(account_banking_aggregate_payment.type_aggregate)d
+ )]}</attribute>
+ </field>
+
+ </field>
+ </record>
+ </data>
+</openerp>
Follow ups