From fcf5ceb1e37f9e3e57f772570d6f03f8365243f7 Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Sat, 3 Aug 2013 01:12:36 +0200 Subject: [PATCH 001/118] Add module account_banking_sepa_direct_debit that implements pain.008.001.02, pain.008.001.03 and pain.008.001.04. This module is not ready yet : the management of mandates is still missing. I am currently trying to get more information about these mandates to decide what is the best implemtation of the data model of the mandates (O2M on res.partner ? O2M os res.partner.bank ?). --- account_banking_sepa_direct_debit/__init__.py | 26 + .../__openerp__.py | 50 + .../account_banking_sdd.py | 77 ++ .../account_banking_sdd_view.xml | 83 ++ account_banking_sepa_direct_debit/company.py | 75 ++ .../company_view.xml | 22 + .../data/pain.008.001.02.xsd | 879 +++++++++++++++++ .../data/pain.008.001.03.xsd | 925 ++++++++++++++++++ .../data/pain.008.001.04.xsd | 892 +++++++++++++++++ .../data/payment_type_sdd.xml | 37 + .../security/ir.model.access.csv | 2 + .../wizard/__init__.py | 23 + .../wizard/export_sdd.py | 391 ++++++++ .../wizard/export_sdd_view.xml | 41 + 14 files changed, 3523 insertions(+) create mode 100644 account_banking_sepa_direct_debit/__init__.py create mode 100644 account_banking_sepa_direct_debit/__openerp__.py create mode 100644 account_banking_sepa_direct_debit/account_banking_sdd.py create mode 100644 account_banking_sepa_direct_debit/account_banking_sdd_view.xml create mode 100644 account_banking_sepa_direct_debit/company.py create mode 100644 account_banking_sepa_direct_debit/company_view.xml create mode 100644 account_banking_sepa_direct_debit/data/pain.008.001.02.xsd create mode 100644 account_banking_sepa_direct_debit/data/pain.008.001.03.xsd create mode 100644 account_banking_sepa_direct_debit/data/pain.008.001.04.xsd create mode 100644 account_banking_sepa_direct_debit/data/payment_type_sdd.xml create mode 100644 account_banking_sepa_direct_debit/security/ir.model.access.csv create mode 100644 account_banking_sepa_direct_debit/wizard/__init__.py create mode 100644 account_banking_sepa_direct_debit/wizard/export_sdd.py create mode 100644 account_banking_sepa_direct_debit/wizard/export_sdd_view.xml diff --git a/account_banking_sepa_direct_debit/__init__.py b/account_banking_sepa_direct_debit/__init__.py new file mode 100644 index 000000000..bda7501b7 --- /dev/null +++ b/account_banking_sepa_direct_debit/__init__.py @@ -0,0 +1,26 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# SEPA Direct Debit module for OpenERP +# Copyright (C) 2013 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 . +# +############################################################################## + +import company +import wizard +import account_banking_sdd + diff --git a/account_banking_sepa_direct_debit/__openerp__.py b/account_banking_sepa_direct_debit/__openerp__.py new file mode 100644 index 000000000..fc329a073 --- /dev/null +++ b/account_banking_sepa_direct_debit/__openerp__.py @@ -0,0 +1,50 @@ +############################################################################## +# +# SEPA Direct Debit module for OpenERP +# Copyright (C) 2013 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 . +# +############################################################################## +{ + 'name': 'Account Banking SEPA Direct Debit', + 'summary': 'Create SEPA XML files for Direct Debit', + 'version': '0.1', + 'license': 'AGPL-3', + 'author': 'Akretion', + 'website': 'http://www.akretion.com', + 'category': 'Banking addons', + 'depends': ['account_direct_debit'], + 'data': [ + 'account_banking_sdd_view.xml', + 'company_view.xml', + 'wizard/export_sdd_view.xml', + 'data/payment_type_sdd.xml', + 'security/ir.model.access.csv', + ], + 'description': ''' +Module to export direct debit payment orders in SEPA XML file format. + +SEPA PAIN (PAyment INitiation) is the new european standard for Customer-to-Bank payment instructions. This module implements SEPA Direct Debit (SDD), more specifically PAIN versions 008.001.02, 008.001.03 and 008.001.04. It is part of the ISO 20022 standard, available on http://www.iso20022.org. + +The Implementation Guidelines for SEPA Direct Debit published by the European Payments Council (http://http://www.europeanpaymentscouncil.eu) use PAIN version 008.001.02. So if you don't know which version your bank supports, you should try version 008.001.02 first. + +This module uses the framework provided by the banking addons, cf https://launchpad.net/banking-addons + +Please contact Alexis de Lattre from Akretion for any help or question about this module. + ''', + 'active': False, + 'installable': True, +} diff --git a/account_banking_sepa_direct_debit/account_banking_sdd.py b/account_banking_sepa_direct_debit/account_banking_sdd.py new file mode 100644 index 000000000..aa08918a2 --- /dev/null +++ b/account_banking_sepa_direct_debit/account_banking_sdd.py @@ -0,0 +1,77 @@ +############################################################################## +# +# SEPA Direct Debit module for OpenERP +# Copyright (C) 2013 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 . +# +############################################################################## + +from openerp.osv import orm, fields +import time +from openerp.tools.translate import _ +from openerp.addons.decimal_precision import decimal_precision as dp + + +class banking_export_sdd(orm.Model): + '''SEPA Direct Debit export''' + _name = 'banking.export.sdd' + _description = __doc__ + _rec_name = 'msg_identification' + + def _generate_filename(self, cr, uid, ids, name, arg, context=None): + res = {} + for sepa_file in self.browse(cr, uid, ids, context=context): + res[sepa_file.id] = 'sdd_' + (sepa_file.msg_identification or '') + '.xml' + return res + + _columns = { + 'payment_order_ids': fields.many2many( + 'payment.order', + 'account_payment_order_sdd_rel', + 'banking_export_sepa_id', 'account_order_id', + 'Payment orders', + readonly=True), + 'requested_collec_date': fields.date('Requested collection date', readonly=True), + 'nb_transactions': fields.integer('Number of transactions', readonly=True), + 'total_amount': fields.float('Total amount', + digits_compute=dp.get_precision('Account'), readonly=True), + 'msg_identification': fields.char('Message identification', size=35, + readonly=True), + 'batch_booking': fields.boolean('Batch booking', readonly=True, + help="If true, the bank statement will display only one credit line for all the direct debits of the SEPA XML file ; if false, the bank statement will display one credit line per direct debit of the SEPA XML file."), + 'charge_bearer': fields.selection([ + ('SHAR', 'Shared'), + ('CRED', 'Borne by creditor'), + ('DEBT', 'Borne by debtor'), + ('SLEV', 'Following service level'), + ], 'Charge bearer', readonly=True, + help='Shared : transaction charges on the sender side are to be borne by the debtor, transaction charges on the receiver side are to be borne by the creditor (most transfers use this). Borne by creditor : all transaction charges are to be borne by the creditor. Borne by debtor : all transaction charges are to be borne by the debtor. Following service level : transaction charges are to be applied following the rules agreed in the service level and/or scheme.'), + 'generation_date': fields.datetime('Generation date', + readonly=True), + 'file': fields.binary('SEPA XML file', readonly=True), + 'filename': fields.function(_generate_filename, type='char', size=256, + method=True, string='Filename', readonly=True), + 'state': fields.selection([ + ('draft', 'Draft'), + ('sent', 'Sent'), + ('done', 'Reconciled'), + ], 'State', readonly=True), + } + + _defaults = { + 'generation_date': fields.date.context_today, + 'state': 'draft', + } diff --git a/account_banking_sepa_direct_debit/account_banking_sdd_view.xml b/account_banking_sepa_direct_debit/account_banking_sdd_view.xml new file mode 100644 index 000000000..6dcfb903f --- /dev/null +++ b/account_banking_sepa_direct_debit/account_banking_sdd_view.xml @@ -0,0 +1,83 @@ + + + + + + + account.banking.export.sdd.form + banking.export.sdd + +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + account.banking.export.sdd.tree + banking.export.sdd + + + + + + + + + + + + + Generated SEPA Direct Debit XML files + banking.export.sdd + form + tree,form + + + + + + + +
+
diff --git a/account_banking_sepa_direct_debit/company.py b/account_banking_sepa_direct_debit/company.py new file mode 100644 index 000000000..d85fc6fd7 --- /dev/null +++ b/account_banking_sepa_direct_debit/company.py @@ -0,0 +1,75 @@ +############################################################################## +# +# SEPA Direct Debit module for OpenERP +# Copyright (C) 2013 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 . +# +############################################################################## + +from openerp.osv import orm, fields +import logging + +logger = logging.getLogger(__name__) + +class res_company(orm.Model): + _inherit = 'res.company' + + _columns = { + 'sepa_creditor_identifier': fields.char('SEPA Creditor Identifier', size=35, + help="Enter the Creditor Identifier that has been attributed to your company to make SEPA Direct Debits. This identifier is composed of :\n- your country ISO code (2 letters)\n- a 2-digits checkum\n- a 3-letters business code\n- a country-specific identifier"), + } + + + def is_sepa_creditor_identifier_valid(self, cr, uid, sepa_creditor_identifier, context=None): + """Check if SEPA Creditor Identifier is valid + @param sepa_creditor_identifier: SEPA Creditor Identifier as str or unicode + @return: True if valid, False otherwise + """ + if not isinstance(sepa_creditor_identifier, (str, unicode)): + return False + try: + sci_str = str(sepa_creditor_identifier) + except: + logger.warning("SEPA Creditor ID should contain only ASCII caracters.") + return False + sci = sci_str.lower() + if len(sci) < 9: + return False + before_replacement = sci[7:] + sci[0:2] + '00' + logger.debug("SEPA ID check before_replacement = %s" % before_replacement) + after_replacement = '' + for char in before_replacement: + if char.isalpha(): + after_replacement += str(ord(char)-87) + else: + after_replacement += char + logger.debug("SEPA ID check after_replacement = %s" % after_replacement) + if int(sci[2:4]) == (98 - (int(after_replacement) % 97)): + return True + else: + return False + + + def _check_sepa_creditor_identifier(self, cr, uid, ids): + for company in self.browse(cr, uid, ids): + if company.sepa_creditor_identifier: + if not self.is_sepa_creditor_identifier_valid(cr, uid, company.sepa_creditor_identifier): + return False + return True + + _constraints = [ + (_check_sepa_creditor_identifier, "Invalid SEPA Creditor Identifier.", ['sepa_creditor_identifier']), + ] diff --git a/account_banking_sepa_direct_debit/company_view.xml b/account_banking_sepa_direct_debit/company_view.xml new file mode 100644 index 000000000..7691844c1 --- /dev/null +++ b/account_banking_sepa_direct_debit/company_view.xml @@ -0,0 +1,22 @@ + + + + + + + sepa_direct_debit.res.company.form + res.company + + + + + + + + + + diff --git a/account_banking_sepa_direct_debit/data/pain.008.001.02.xsd b/account_banking_sepa_direct_debit/data/pain.008.001.02.xsd new file mode 100644 index 000000000..633597256 --- /dev/null +++ b/account_banking_sepa_direct_debit/data/pain.008.001.02.xsd @@ -0,0 +1,879 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/account_banking_sepa_direct_debit/data/pain.008.001.03.xsd b/account_banking_sepa_direct_debit/data/pain.008.001.03.xsd new file mode 100644 index 000000000..73d894379 --- /dev/null +++ b/account_banking_sepa_direct_debit/data/pain.008.001.03.xsd @@ -0,0 +1,925 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/account_banking_sepa_direct_debit/data/pain.008.001.04.xsd b/account_banking_sepa_direct_debit/data/pain.008.001.04.xsd new file mode 100644 index 000000000..93806815a --- /dev/null +++ b/account_banking_sepa_direct_debit/data/pain.008.001.04.xsd @@ -0,0 +1,892 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/account_banking_sepa_direct_debit/data/payment_type_sdd.xml b/account_banking_sepa_direct_debit/data/payment_type_sdd.xml new file mode 100644 index 000000000..5ce4b5b1b --- /dev/null +++ b/account_banking_sepa_direct_debit/data/payment_type_sdd.xml @@ -0,0 +1,37 @@ + + + + + + + + SEPA Direct Debit v02 + pain.008.001.02 + + + payment + + + + SEPA Direct Debit v03 + pain.008.001.03 + + + payment + + + + SEPA Direct Debit v04 + pain.008.001.04 + + + payment + + + + + + diff --git a/account_banking_sepa_direct_debit/security/ir.model.access.csv b/account_banking_sepa_direct_debit/security/ir.model.access.csv new file mode 100644 index 000000000..0cd579511 --- /dev/null +++ b/account_banking_sepa_direct_debit/security/ir.model.access.csv @@ -0,0 +1,2 @@ +"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" +"access_banking_export_sdd","Full access on banking.export.sdd","model_banking_export_sdd","account_payment.group_account_payment",1,1,1,1 diff --git a/account_banking_sepa_direct_debit/wizard/__init__.py b/account_banking_sepa_direct_debit/wizard/__init__.py new file mode 100644 index 000000000..169d0b13d --- /dev/null +++ b/account_banking_sepa_direct_debit/wizard/__init__.py @@ -0,0 +1,23 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# SEPA Direct Debit module for OpenERP +# Copyright (C) 2013 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 . +# +############################################################################## + +import export_sdd diff --git a/account_banking_sepa_direct_debit/wizard/export_sdd.py b/account_banking_sepa_direct_debit/wizard/export_sdd.py new file mode 100644 index 000000000..60456ab1a --- /dev/null +++ b/account_banking_sepa_direct_debit/wizard/export_sdd.py @@ -0,0 +1,391 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# SEPA Direct Debit module for OpenERP +# Copyright (C) 2013 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 . +# +############################################################################## + + +from openerp.osv import orm, fields +import base64 +from datetime import datetime, timedelta +from openerp.tools.translate import _ +from openerp import tools, netsvc +from lxml import etree +import logging + +_logger = logging.getLogger(__name__) + + +class banking_export_sdd_wizard(orm.TransientModel): + _name = 'banking.export.sdd.wizard' + _description = 'Export SEPA Direct Debit XML file' + _columns = { + 'state': fields.selection([('create', 'Create'), ('finish', 'Finish')], + 'State', readonly=True), + 'msg_identification': fields.char('Message identification', size=35, + # Can't set required=True on the field because it blocks + # the launch of the wizard -> I set it as required in the view + help='This is the message identification of the entire SEPA XML file. 35 characters max.'), + 'batch_booking': fields.boolean('Batch booking', + help="If true, the bank statement will display only one debit line for all the wire transfers of the SEPA XML file ; if false, the bank statement will display one debit line per wire transfer of the SEPA XML file."), + 'requested_collec_date': fields.date('Requested collection date', + help='This is the date on which the collection should be made by the bank. Please keep in mind that banks only execute on working days.'), + 'charge_bearer': fields.selection([ + ('SHAR', 'Shared'), + ('CRED', 'Borne by creditor'), + ('DEBT', 'Borne by debtor'), + ('SLEV', 'Following service level'), + ], 'Charge bearer', required=True, + help='Shared : transaction charges on the sender side are to be borne by the debtor, transaction charges on the receiver side are to be borne by the creditor (most transfers use this). Borne by creditor : all transaction charges are to be borne by the creditor. Borne by debtor : all transaction charges are to be borne by the debtor. Following service level : transaction charges are to be applied following the rules agreed in the service level and/or scheme.'), + 'nb_transactions': fields.related('file_id', 'nb_transactions', + type='integer', string='Number of transactions', readonly=True), + 'total_amount': fields.related('file_id', 'total_amount', type='float', + string='Total amount', readonly=True), + 'file_id': fields.many2one('banking.export.sdd', 'SDD XML file', readonly=True), + 'file': fields.related('file_id', 'file', string="File", type='binary', + readonly=True), + 'filename': fields.related('file_id', 'filename', string="Filename", + type='char', size=256, readonly=True), + 'payment_order_ids': fields.many2many('payment.order', + 'wiz_sdd_payorders_rel', 'wizard_id', 'payment_order_id', + 'Payment orders', readonly=True), + } + + _defaults = { + 'charge_bearer': 'SLEV', + 'state': 'create', + } + + + def _check_msg_identification(self, cr, uid, ids): + '''Check that the msg_identification is unique''' + for export_sdd in self.browse(cr, uid, ids): + res = self.pool.get('banking.export.sdd').search(cr, uid, + [('msg_identification', '=', export_sdd.msg_identification)]) + if len(res) > 1: + return False + return True + + + _constraints = [ + (_check_msg_identification, "The field 'Message Identification' should be uniue. Another SEPA Direct Debit file already exists with the same 'Message Identification'.", ['msg_identification']) + ] + + + def _validate_iban(self, cr, uid, iban, context=None): + '''if IBAN is valid, returns IBAN + if IBAN is NOT valid, raises an error message''' + partner_bank_obj = self.pool.get('res.partner.bank') + if partner_bank_obj.is_iban_valid(cr, uid, iban, context=context): + return iban.replace(' ', '') + else: + raise orm.except_orm(_('Error :'), _("This IBAN is not valid : %s") % iban) + + def create(self, cr, uid, vals, context=None): + payment_order_ids = context.get('active_ids', []) + vals.update({ + 'payment_order_ids': [[6, 0, payment_order_ids]], + }) + return super(banking_export_sdd_wizard, self).create(cr, uid, + vals, context=context) + + + def _prepare_field(self, cr, uid, field_name, field_value, max_size=0, sepa_export=False, line=False, context=None): + try: + value = eval(field_value) + except: + if line: + raise orm.except_orm(_('Error :'), _("Cannot compute the '%s' of the Payment Line with Invoice Reference '%s'.") % (field_name, self.pool['account.invoice'].name_get(cr, uid, [line.ml_inv_ref.id], context=context)[0][1])) + else: + raise orm.except_orm(_('Error :'), _("Cannot compute the '%s'.") % field_name) + if not isinstance(value, (str, unicode)): + raise orm.except_orm(_('Field type error :'), _("The '%s' is a(n) %s. It should be a string or unicode.") % (field_name, type(value))) + if not value: + raise orm.except_orm(_('Error :'), _("The '%s' is empty or 0. It should have a non-null value.") % field_name) + if max_size and len(value) > max_size: + value = value[0:max_size] + return value + + + def create_sepa(self, cr, uid, ids, context=None): + ''' + Creates the SEPA Direct Debit file. That's the important code ! + ''' + payment_order_obj = self.pool.get('payment.order') + + sepa_export = self.browse(cr, uid, ids[0], context=context) + + pain_flavor = sepa_export.payment_order_ids[0].mode.type.code + if pain_flavor == 'pain.008.001.02': + bic_xml_tag = 'BIC' + name_maxsize = 70 + root_xml_tag = 'CstmrDrctDbtInitn' + elif pain_flavor == 'pain.008.001.03': + bic_xml_tag = 'BICFI' + name_maxsize = 140 + root_xml_tag = 'CstmrDrctDbtInitn' + elif pain_flavor == 'pain.008.001.04': + bic_xml_tag = 'BICFI' + name_maxsize = 140 + root_xml_tag = 'CstmrDrctDbtInitn' + else: + raise orm.except_orm(_('Error :'), _("Payment Type Code '%s' is not supported. The only Payment Type Code supported for SEPA Direct Debit are 'pain.008.001.02', 'pain.008.001.03' and 'pain.008.001.04'.") % pain_flavor) + if sepa_export.requested_collec_date: + my_requested_collec_date = sepa_export.requested_collec_date + else: + my_requested_collec_date = datetime.strftime(datetime.today() + timedelta(days=1), '%Y-%m-%d') + + pain_ns = { + 'xsi': 'http://www.w3.org/2001/XMLSchema-instance', + None: 'urn:iso:std:iso:20022:tech:xsd:%s' % pain_flavor, + } + + root = etree.Element('Document', nsmap=pain_ns) + pain_root = etree.SubElement(root, root_xml_tag) + + my_company_name = self._prepare_field(cr, uid, 'Company Name', + 'sepa_export.payment_order_ids[0].company_id.name', + name_maxsize, sepa_export, context=context) + + # A. Group header + group_header_1_0 = etree.SubElement(pain_root, 'GrpHdr') + message_identification_1_1 = etree.SubElement(group_header_1_0, 'MsgId') + message_identification_1_1.text = sepa_export.msg_identification + creation_date_time_1_2 = etree.SubElement(group_header_1_0, 'CreDtTm') + creation_date_time_1_2.text = datetime.strftime(datetime.today(), '%Y-%m-%dT%H:%M:%S') + nb_of_transactions_1_6 = etree.SubElement(group_header_1_0, 'NbOfTxs') + control_sum_1_7 = etree.SubElement(group_header_1_0, 'CtrlSum') + initiating_party_1_8 = etree.SubElement(group_header_1_0, 'InitgPty') + initiating_party_name = etree.SubElement(initiating_party_1_8, 'Nm') + initiating_party_name.text = my_company_name + + # B. Payment info + payment_info_2_0 = etree.SubElement(pain_root, 'PmtInf') + payment_info_identification_2_1 = etree.SubElement(payment_info_2_0, 'PmtInfId') + payment_info_identification_2_1.text = sepa_export.msg_identification + payment_method_2_2 = etree.SubElement(payment_info_2_0, 'PmtMtd') + payment_method_2_2.text = 'DD' + if pain_flavor in ['pain.008.001.02', 'pain.008.001.03', 'pain.008.001.04']: + # batch_booking is in "Payment Info" with pain.008.001.02/03 + batch_booking_2_3 = etree.SubElement(payment_info_2_0, 'BtchBookg') + batch_booking_2_3.text = str(sepa_export.batch_booking).lower() + # It may seem surprising, but the + # "SEPA Core Direct Debit Scheme Customer-to-bank Implementation guidelines" + # v6.0 says that control sum and nb_of_transactions should be present + # at both "group header" level and "payment info" level + if pain_flavor in ['pain.008.001.02', 'pain.008.001.03', 'pain.008.001.04']: + nb_of_transactions_2_4 = etree.SubElement(payment_info_2_0, 'NbOfTxs') + control_sum_2_5 = etree.SubElement(payment_info_2_0, 'CtrlSum') + payment_type_info_2_6 = etree.SubElement(payment_info_2_0, 'PmtTpInf') + service_level_2_8 = etree.SubElement(payment_type_info_2_6, 'SvcLvl') + service_level_code_2_9 = etree.SubElement(service_level_2_8, 'Cd') + service_level_code_2_9.text = 'SEPA' + local_instrument_2_11 = etree.SubElement(payment_type_info_2_6, 'LclInstrm') + local_instr_code_2_12 = etree.SubElement(local_instrument_2_11, 'Cd') + local_instr_code_2_12.text = 'CORE' + # TODO : 2.14 Sequence Type MANDATORY => I set it in section C (2.40) + # not B (2.14) so that we can have several different Sequence Types + # in the same XML file + # the Sample XML files show Seq type at C level + # BUT it may not be possible, + # 1. extract from CIC documentation : + # "Attention, les remises présentées devront être scindées par le créancier + # par type de séquence" + # In the guidelines, they only talk about B level + # If ‘Amendment Indicator’ is ‘true’, + # and ‘Original Debtor Agent’ is set to ‘SMNDA’, + # this message element must indicate ‘FRST + # 'FRST' = First ; 'OOFF' = One Off ; 'RCUR' : Recurring + # 'FNAL' = Final + requested_collec_date_2_18 = etree.SubElement(payment_info_2_0, 'ReqdColltnDt') + requested_collec_date_2_18.text = my_requested_collec_date + creditor_2_19 = etree.SubElement(payment_info_2_0, 'Cdtr') + creditor_name = etree.SubElement(creditor_2_19, 'Nm') + creditor_name.text = my_company_name + creditor_account_2_20 = etree.SubElement(payment_info_2_0, 'CdtrAcct') + creditor_account_id = etree.SubElement(creditor_account_2_20, 'Id') + creditor_account_iban = etree.SubElement(creditor_account_id, 'IBAN') + creditor_account_iban.text = self._validate_iban(cr, uid, + self._prepare_field(cr, uid, 'Company IBAN', + 'sepa_export.payment_order_ids[0].mode.bank_id.acc_number', + sepa_export=sepa_export, context=context), + context=context) + + creditor_agent_2_21 = etree.SubElement(payment_info_2_0, 'CdtrAgt') + creditor_agent_institution = etree.SubElement(creditor_agent_2_21, 'FinInstnId') + creditor_agent_bic = etree.SubElement(creditor_agent_institution, bic_xml_tag) + creditor_agent_bic.text = self._prepare_field(cr, uid, 'Company BIC', + 'sepa_export.payment_order_ids[0].mode.bank_id.bank.bic', + sepa_export=sepa_export, context=context) + + charge_bearer_2_24 = etree.SubElement(payment_info_2_0, 'ChrgBr') + charge_bearer_2_24.text = sepa_export.charge_bearer + + creditor_scheme_identification_2_27 = etree.SubElement(payment_info_2_0, 'CdtrSchmeId') + csi_id = etree.SubElement(creditor_scheme_identification_2_27, 'Id') + csi_orgid = csi_id = etree.SubElement(csi_id, 'OrgId') + csi_other = etree.SubElement(csi_orgid, 'Othr') + csi_other_id = etree.SubElement(csi_other, 'Id') + csi_other_id.text = self._prepare_field(cr, uid, + 'SEPA Creditor Identifier', + 'sepa_export.payment_order_ids[0].company_id.sepa_creditor_identifier', + sepa_export=sepa_export, context=context) + csi_scheme_name = etree.SubElement(csi_other, 'SchmeNm') + csi_scheme_name_proprietary = etree.SubElement(csi_scheme_name, 'Prtry') + csi_scheme_name_proprietary.text = 'SEPA' + + transactions_count = 0 + total_amount = 0.0 + amount_control_sum = 0.0 + # Iterate on payment orders + for payment_order in sepa_export.payment_order_ids: + total_amount = total_amount + payment_order.total + # Iterate each payment lines + for line in payment_order.line_ids: + transactions_count += 1 + # C. Direct Debit Transaction Info + dd_transaction_info_2_28 = etree.SubElement(payment_info_2_0, 'DrctDbtTxInf') + payment_identification_2_29 = etree.SubElement(dd_transaction_info_2_28, 'PmtId') + # Instruction identification (2.30) is not mandatory, so we don't use it + end2end_identification_2_31 = etree.SubElement(payment_identification_2_29, 'EndToEndId') + end2end_identification_2_31.text = self._prepare_field(cr, uid, + 'End to End Identification', 'line.communication', 35, + line=line, context=context) + payment_type_2_32 = etree.SubElement(dd_transaction_info_2_28, 'PmtTpInf') + # Sequence Type : do we have to set it at Payment Info level ? + #sequence_type_2_40 = etree.SubElement(payment_type_2_32, 'SeqTp') + #sequence_type_2_40.text = 'FRST' # TODO + currency_name = self._prepare_field(cr, uid, 'Currency Code', + 'line.currency.name', 3, line=line, context=context) + instructed_amount_2_44 = etree.SubElement(dd_transaction_info_2_28, 'InstdAmt', Ccy=currency_name) + instructed_amount_2_44.text = '%.2f' % line.amount_currency + amount_control_sum += line.amount_currency + dd_transaction_2_46 = etree.SubElement(dd_transaction_info_2_28, 'DrctDbtTx') + mandate_related_info_2_47 = etree.SubElement(dd_transaction_2_46, 'MndtRltdInf') + mandate_identification_2_48 = etree.SubElement(mandate_related_info_2_47, 'MndtId') + mandate_identification_2_48.text = 'RUM1242' # TODO + mandate_signature_date_2_49 = etree.SubElement(mandate_related_info_2_47, 'DtOfSgntr') + mandate_signature_date_2_49.text = '2013-02-20' # TODO + # TODO look at 2.50 "Amendment Indicator + debtor_agent_2_70 = etree.SubElement(dd_transaction_info_2_28, 'DbtrAgt') + debtor_agent_institution = etree.SubElement(debtor_agent_2_70, 'FinInstnId') + debtor_agent_bic = etree.SubElement(debtor_agent_institution, bic_xml_tag) + debtor_agent_bic.text = self._prepare_field(cr, uid, + 'Customer BIC', 'line.bank_id.bank.bic', + line=line, context=context) + debtor_2_72 = etree.SubElement(dd_transaction_info_2_28, 'Dbtr') + debtor_name = etree.SubElement(debtor_2_72, 'Nm') + debtor_name.text = self._prepare_field(cr, uid, + 'Customer Name', 'line.partner_id.name', + name_maxsize, line=line, context=context) + debtor_account_2_73 = etree.SubElement(dd_transaction_info_2_28, 'DbtrAcct') + debtor_account_id = etree.SubElement(debtor_account_2_73, 'Id') + debtor_account_iban = etree.SubElement(debtor_account_id, 'IBAN') + debtor_account_iban.text = self._validate_iban(cr, uid, + self._prepare_field(cr, uid, 'Customer IBAN', + 'line.bank_id.acc_number', line=line, + context=context), + context=context) + remittance_info_2_88 = etree.SubElement(dd_transaction_info_2_28, 'RmtInf') + # switch to Structured (Strdr) ? If we do it, beware that the format is not the same between pain 02 and pain 03 + remittance_info_unstructured_2_89 = etree.SubElement(remittance_info_2_88, 'Ustrd') + remittance_info_unstructured_2_89.text = self._prepare_field(cr, uid, + 'Remittance Information', 'line.communication', + 140, line=line, context=context) + + if pain_flavor in ['pain.008.001.02', 'pain.008.001.03', 'pain.008.001.04']: + nb_of_transactions_1_6.text = nb_of_transactions_2_4.text = str(transactions_count) + control_sum_1_7.text = control_sum_2_5.text = '%.2f' % amount_control_sum + + + xml_string = etree.tostring(root, pretty_print=True, encoding='UTF-8', xml_declaration=True) + _logger.debug("Generated SDD XML file in format %s below" % pain_flavor) + _logger.debug(xml_string) + xsd_etree_obj = etree.parse(tools.file_open('account_banking_sepa_direct_debit/data/%s.xsd' % pain_flavor)) + official_pain_schema = etree.XMLSchema(xsd_etree_obj) + _logger.debug("Printing %s XML Schema definition:" % pain_flavor) + _logger.debug(etree.tostring(xsd_etree_obj, pretty_print=True, encoding='UTF-8', xml_declaration=True)) + + try: + # If I do official_pain_schema.assertValid(root), then I get this + # error msg in the exception : + # The generated XML file is not valid against the official XML Schema Definition. The generated XML file and the full error have been written in the server logs. Here is the error, which may give you an idea on the cause of the problem : Element 'Document': No matching global declaration available for the validation root. + # So I re-import the SEPA XML from the string, and give this + # so validation + # If you know how I can avoid that, please tell me -- Alexis + root_to_validate = etree.fromstring(xml_string) + official_pain_schema.assertValid(root_to_validate) + except Exception, e: + _logger.warning("The XML file is invalid against the XML Schema Definition") + _logger.warning(xml_string) + _logger.warning(e) + raise orm.except_orm(_('Error :'), _('The generated XML file is not valid against the official XML Schema Definition. The generated XML file and the full error have been written in the server logs. Here is the error, which may give you an idea on the cause of the problem : %s') % str(e)) + + # CREATE the banking.export.sepa record + file_id = self.pool.get('banking.export.sdd').create(cr, uid, + { + 'msg_identification': sepa_export.msg_identification, + 'batch_booking': sepa_export.batch_booking, + 'charge_bearer': sepa_export.charge_bearer, + 'requested_collec_date': sepa_export.requested_collec_date, + 'total_amount': total_amount, + 'nb_transactions': transactions_count, + 'file': base64.encodestring(xml_string), + 'payment_order_ids': [ + (6, 0, [x.id for x in sepa_export.payment_order_ids]) + ], + }, context=context) + + self.write(cr, uid, ids, { + 'file_id': file_id, + 'state': 'finish', + }, context=context) + + action = { + 'name': 'SEPA Direct Debit XML', + 'type': 'ir.actions.act_window', + 'view_type': 'form', + 'view_mode': 'form,tree', + 'res_model': self._name, + 'res_id': ids[0], + 'target': 'new', + } + return action + + + def cancel_sepa(self, cr, uid, ids, context=None): + ''' + Cancel the SEPA Direct Debit file: just drop the file + ''' + sepa_export = self.browse(cr, uid, ids[0], context=context) + self.pool.get('banking.export.sdd').unlink(cr, uid, sepa_export.file_id.id, context=context) + return {'type': 'ir.actions.act_window_close'} + + + def save_sepa(self, cr, uid, ids, context=None): + ''' + Save the SEPA Direct Debit file: mark all payments in the file as 'sent'. + ''' + sepa_export = self.browse(cr, uid, ids[0], context=context) + sepa_file = self.pool.get('banking.export.sdd').write(cr, uid, + sepa_export.file_id.id, {'state': 'sent'}, context=context) + wf_service = netsvc.LocalService('workflow') + for order in sepa_export.payment_order_ids: + wf_service.trg_validate(uid, 'payment.order', order.id, 'sent', cr) + return {'type': 'ir.actions.act_window_close'} diff --git a/account_banking_sepa_direct_debit/wizard/export_sdd_view.xml b/account_banking_sepa_direct_debit/wizard/export_sdd_view.xml new file mode 100644 index 000000000..8357e3f5d --- /dev/null +++ b/account_banking_sepa_direct_debit/wizard/export_sdd_view.xml @@ -0,0 +1,41 @@ + + + + + + + banking.export.sdd.wizard.view + banking.export.sdd.wizard + +
+ + + + + + + + + + + + + + + +
+
+ +
+
+ +
+
From 2eb4892f3f005d1919a6314c8ccb625ab426ab04 Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Tue, 15 Oct 2013 23:29:28 +0200 Subject: [PATCH 002/118] First implementation of mandates, but I still have a lot of hesitation about the data model so it may change. Manage different sequence types in the same file ; we just have to separate them in different payment info blocks. --- account_banking_sepa_direct_debit/__init__.py | 6 +- .../__openerp__.py | 2 + .../account_banking_sdd.py | 85 ++++++ .../account_banking_sdd_view.xml | 102 +++++++ .../account_payment_view.xml | 26 ++ account_banking_sepa_direct_debit/company.py | 6 +- .../data/mandate_reference_sequence.xml | 21 ++ .../security/ir.model.access.csv | 2 + .../wizard/__init__.py | 2 +- .../wizard/export_sdd.py | 256 +++++++++++------- 10 files changed, 407 insertions(+), 101 deletions(-) create mode 100644 account_banking_sepa_direct_debit/account_payment_view.xml create mode 100644 account_banking_sepa_direct_debit/data/mandate_reference_sequence.xml diff --git a/account_banking_sepa_direct_debit/__init__.py b/account_banking_sepa_direct_debit/__init__.py index bda7501b7..ce46fda33 100644 --- a/account_banking_sepa_direct_debit/__init__.py +++ b/account_banking_sepa_direct_debit/__init__.py @@ -20,7 +20,7 @@ # ############################################################################## -import company -import wizard -import account_banking_sdd +from . import company +from . import wizard +from . import account_banking_sdd diff --git a/account_banking_sepa_direct_debit/__openerp__.py b/account_banking_sepa_direct_debit/__openerp__.py index fc329a073..2a44e1c06 100644 --- a/account_banking_sepa_direct_debit/__openerp__.py +++ b/account_banking_sepa_direct_debit/__openerp__.py @@ -29,9 +29,11 @@ 'depends': ['account_direct_debit'], 'data': [ 'account_banking_sdd_view.xml', + 'account_payment_view.xml', 'company_view.xml', 'wizard/export_sdd_view.xml', 'data/payment_type_sdd.xml', + 'data/mandate_reference_sequence.xml', 'security/ir.model.access.csv', ], 'description': ''' diff --git a/account_banking_sepa_direct_debit/account_banking_sdd.py b/account_banking_sepa_direct_debit/account_banking_sdd.py index aa08918a2..7e5a5d0f3 100644 --- a/account_banking_sepa_direct_debit/account_banking_sdd.py +++ b/account_banking_sepa_direct_debit/account_banking_sdd.py @@ -75,3 +75,88 @@ class banking_export_sdd(orm.Model): 'generation_date': fields.date.context_today, 'state': 'draft', } + + +class sdd_mandate(orm.Model): + '''SEPA Direct Debit Mandate''' + _name = 'sdd.mandate' + _description = __doc__ + _rec_name = 'unique_mandate_reference' + _order = 'signature_date desc' + + _columns = { + 'partner_bank_id': fields.many2one('res.partner.bank', 'Bank Account'), + 'partner_id': fields.related( + 'partner_bank_id', 'partner_id', type='many2one', + relation='res.partner', string='Partner', readonly=True), + 'company_id': fields.many2one('res.company', 'Company', required=True), + 'unique_mandate_reference': fields.char( + 'Unique Mandate Reference', size=35, readonly=True), + 'type': fields.selection([ + ('recurrent', 'Recurrent'), + ('oneoff', 'One-Off'), + ], 'Type of Mandate', required=True), + 'signature_date': fields.date('Date of Signature of the Mandate'), + 'scan': fields.binary('Scan of the mandate'), + 'last_debit_date': fields.date('Date of the Last Debit', + help="For recurrent mandates, this field is used to know if the SDD will be of type 'First' or 'Recurring'. For one-off mandates, this field is used to know if the SDD has already been used or not."), + 'state': fields.selection([ + ('valid', 'Valid'), + ('expired', 'Expired'), + ], 'Mandate Status', + help="For a recurrent mandate, this field indicate if the mandate is still valid or if it has expired (a recurrent mandate expires if it's not used during 36 months). For a one-off mandate, it expires after its first use."), + } + + _sql_constraints = [( + 'mandate_ref_company_uniq', + 'unique(unique_mandate_reference, company_id)', + 'A Mandate with the same reference already exists for this company !' + )] + + _defaults = { + 'company_id': lambda self, cr, uid, context: \ + self.pool['res.users'].browse(cr, uid, uid, context=context).\ + company_id.id, + 'unique_mandate_reference': lambda self, cr, uid, context: \ + self.pool['ir.sequence'].get(cr, uid, 'sdd.mandate.reference'), + 'state': 'valid', + } + + +class res_partner_bank(orm.Model): + _inherit = 'res.partner.bank' + + _columns = { + 'sdd_mandate_ids': fields.one2many( + 'sdd.mandate', 'partner_bank_id', 'SEPA Direct Debit Mandates'), + } + + +class payment_line(orm.Model): + _inherit = 'payment.line' + + _columns = { + 'sdd_mandate_id': fields.many2one( + 'sdd.mandate', 'SEPA Direct Debit Mandate'), + } + + def _check_sdd_mandate(self, cr, uid, ids): + for payline in self.browse(cr, uid, ids): + if payline.sdd_mandate_id and not payline.bank_id: + raise orm.except_orm( + _('Error :'), + _("Missing bank account on the payment line with SEPA\ + Direct Debit Mandate '%s'." + % payline.sdd_mandate_id.unique_mandate_reference)) + elif payline.sdd_mandate_id and payline.bank_id and payline.sdd_mandate_id.partner_bank_id != payline.bank_id.id: + raise orm.except_orm( + _('Error :'), + _("The SEPA Direct Debit Mandate '%s' is not related??")) + + return True + +# _constraints = [ +# (_check_sdd_mandate, "Mandate must be attached to bank account", ['bank_id', 'sdd_mandate_id']), +# ] + + # TODO inherit create to select the first mandate ?? diff --git a/account_banking_sepa_direct_debit/account_banking_sdd_view.xml b/account_banking_sepa_direct_debit/account_banking_sdd_view.xml index 6dcfb903f..32a289081 100644 --- a/account_banking_sepa_direct_debit/account_banking_sdd_view.xml +++ b/account_banking_sepa_direct_debit/account_banking_sdd_view.xml @@ -79,5 +79,107 @@ view_mode="tree,form" /> + + sdd.mandate.form + sdd.mandate + +
+
+ +
+ +
+

+

+
+ + + + + + + + + +
+
+
+
+ + + sdd.mandate.tree + sdd.mandate + + + + + + + + + + + + + + + SEPA Direct Debit Mandate + sdd.mandate + form + tree,form + {'sdd_mandate_main_view': True} + +

+ Click to create a new SEPA Direct Debit Mandate. +

+ The SEPA Direct Debit Mandate is a document signed by your customer that gives you the autorization to do one or several direct debits on his bank account. +

+
+
+ + + + + sdd.mandate.res.partner.bank.form + res.partner.bank + + + + + + + + + + + + sdd.mandate.res.partner.bank.tree + res.partner.bank + + + + + + + + + + + sdd.mandate.partner.form + res.partner + + + + + + + + diff --git a/account_banking_sepa_direct_debit/account_payment_view.xml b/account_banking_sepa_direct_debit/account_payment_view.xml new file mode 100644 index 000000000..795f30222 --- /dev/null +++ b/account_banking_sepa_direct_debit/account_payment_view.xml @@ -0,0 +1,26 @@ + + + + + + + sdd.payment.order.form + payment.order + + + + + + + + + + + + + + diff --git a/account_banking_sepa_direct_debit/company.py b/account_banking_sepa_direct_debit/company.py index d85fc6fd7..aed40f64b 100644 --- a/account_banking_sepa_direct_debit/company.py +++ b/account_banking_sepa_direct_debit/company.py @@ -24,15 +24,16 @@ import logging logger = logging.getLogger(__name__) + class res_company(orm.Model): _inherit = 'res.company' _columns = { - 'sepa_creditor_identifier': fields.char('SEPA Creditor Identifier', size=35, + 'sepa_creditor_identifier': fields.char( + 'SEPA Creditor Identifier', size=35, help="Enter the Creditor Identifier that has been attributed to your company to make SEPA Direct Debits. This identifier is composed of :\n- your country ISO code (2 letters)\n- a 2-digits checkum\n- a 3-letters business code\n- a country-specific identifier"), } - def is_sepa_creditor_identifier_valid(self, cr, uid, sepa_creditor_identifier, context=None): """Check if SEPA Creditor Identifier is valid @param sepa_creditor_identifier: SEPA Creditor Identifier as str or unicode @@ -62,7 +63,6 @@ class res_company(orm.Model): else: return False - def _check_sepa_creditor_identifier(self, cr, uid, ids): for company in self.browse(cr, uid, ids): if company.sepa_creditor_identifier: diff --git a/account_banking_sepa_direct_debit/data/mandate_reference_sequence.xml b/account_banking_sepa_direct_debit/data/mandate_reference_sequence.xml new file mode 100644 index 000000000..6a3143cca --- /dev/null +++ b/account_banking_sepa_direct_debit/data/mandate_reference_sequence.xml @@ -0,0 +1,21 @@ + + + + + + + SDD Mandate Reference + sdd.mandate.reference + + + + SDD Mandate Reference + sdd.mandate.reference + RUM + + + + + + + diff --git a/account_banking_sepa_direct_debit/security/ir.model.access.csv b/account_banking_sepa_direct_debit/security/ir.model.access.csv index 0cd579511..cf78ffb59 100644 --- a/account_banking_sepa_direct_debit/security/ir.model.access.csv +++ b/account_banking_sepa_direct_debit/security/ir.model.access.csv @@ -1,2 +1,4 @@ "id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" "access_banking_export_sdd","Full access on banking.export.sdd","model_banking_export_sdd","account_payment.group_account_payment",1,1,1,1 +"access_sdd_mandate","Full access on sdd.mandate","model_sdd_mandate","account_payment.group_account_payment",1,1,1,1 +"access_sdd_mandate_read","Read access on sdd.mandate","model_sdd_mandate","base.group_user",1,0,0,0 diff --git a/account_banking_sepa_direct_debit/wizard/__init__.py b/account_banking_sepa_direct_debit/wizard/__init__.py index 169d0b13d..3830e36d9 100644 --- a/account_banking_sepa_direct_debit/wizard/__init__.py +++ b/account_banking_sepa_direct_debit/wizard/__init__.py @@ -20,4 +20,4 @@ # ############################################################################## -import export_sdd +from . import export_sdd diff --git a/account_banking_sepa_direct_debit/wizard/export_sdd.py b/account_banking_sepa_direct_debit/wizard/export_sdd.py index 60456ab1a..3cc06e845 100644 --- a/account_banking_sepa_direct_debit/wizard/export_sdd.py +++ b/account_banking_sepa_direct_debit/wizard/export_sdd.py @@ -22,10 +22,10 @@ from openerp.osv import orm, fields -import base64 -from datetime import datetime, timedelta from openerp.tools.translate import _ from openerp import tools, netsvc +import base64 +from datetime import datetime, timedelta from lxml import etree import logging @@ -115,7 +115,7 @@ class banking_export_sdd_wizard(orm.TransientModel): else: raise orm.except_orm(_('Error :'), _("Cannot compute the '%s'.") % field_name) if not isinstance(value, (str, unicode)): - raise orm.except_orm(_('Field type error :'), _("The '%s' is a(n) %s. It should be a string or unicode.") % (field_name, type(value))) + raise orm.except_orm(_('Field type error :'), _("The type of the field '%s' is %s. It should be a string or unicode.") % (field_name, type(value))) if not value: raise orm.except_orm(_('Error :'), _("The '%s' is empty or 0. It should have a non-null value.") % field_name) if max_size and len(value) > max_size: @@ -175,90 +175,140 @@ class banking_export_sdd_wizard(orm.TransientModel): initiating_party_name = etree.SubElement(initiating_party_1_8, 'Nm') initiating_party_name.text = my_company_name - # B. Payment info - payment_info_2_0 = etree.SubElement(pain_root, 'PmtInf') - payment_info_identification_2_1 = etree.SubElement(payment_info_2_0, 'PmtInfId') - payment_info_identification_2_1.text = sepa_export.msg_identification - payment_method_2_2 = etree.SubElement(payment_info_2_0, 'PmtMtd') - payment_method_2_2.text = 'DD' - if pain_flavor in ['pain.008.001.02', 'pain.008.001.03', 'pain.008.001.04']: - # batch_booking is in "Payment Info" with pain.008.001.02/03 - batch_booking_2_3 = etree.SubElement(payment_info_2_0, 'BtchBookg') - batch_booking_2_3.text = str(sepa_export.batch_booking).lower() - # It may seem surprising, but the - # "SEPA Core Direct Debit Scheme Customer-to-bank Implementation guidelines" - # v6.0 says that control sum and nb_of_transactions should be present - # at both "group header" level and "payment info" level - if pain_flavor in ['pain.008.001.02', 'pain.008.001.03', 'pain.008.001.04']: - nb_of_transactions_2_4 = etree.SubElement(payment_info_2_0, 'NbOfTxs') - control_sum_2_5 = etree.SubElement(payment_info_2_0, 'CtrlSum') - payment_type_info_2_6 = etree.SubElement(payment_info_2_0, 'PmtTpInf') - service_level_2_8 = etree.SubElement(payment_type_info_2_6, 'SvcLvl') - service_level_code_2_9 = etree.SubElement(service_level_2_8, 'Cd') - service_level_code_2_9.text = 'SEPA' - local_instrument_2_11 = etree.SubElement(payment_type_info_2_6, 'LclInstrm') - local_instr_code_2_12 = etree.SubElement(local_instrument_2_11, 'Cd') - local_instr_code_2_12.text = 'CORE' - # TODO : 2.14 Sequence Type MANDATORY => I set it in section C (2.40) - # not B (2.14) so that we can have several different Sequence Types - # in the same XML file - # the Sample XML files show Seq type at C level - # BUT it may not be possible, - # 1. extract from CIC documentation : - # "Attention, les remises présentées devront être scindées par le créancier - # par type de séquence" - # In the guidelines, they only talk about B level - # If ‘Amendment Indicator’ is ‘true’, - # and ‘Original Debtor Agent’ is set to ‘SMNDA’, - # this message element must indicate ‘FRST - # 'FRST' = First ; 'OOFF' = One Off ; 'RCUR' : Recurring - # 'FNAL' = Final - requested_collec_date_2_18 = etree.SubElement(payment_info_2_0, 'ReqdColltnDt') - requested_collec_date_2_18.text = my_requested_collec_date - creditor_2_19 = etree.SubElement(payment_info_2_0, 'Cdtr') - creditor_name = etree.SubElement(creditor_2_19, 'Nm') - creditor_name.text = my_company_name - creditor_account_2_20 = etree.SubElement(payment_info_2_0, 'CdtrAcct') - creditor_account_id = etree.SubElement(creditor_account_2_20, 'Id') - creditor_account_iban = etree.SubElement(creditor_account_id, 'IBAN') - creditor_account_iban.text = self._validate_iban(cr, uid, - self._prepare_field(cr, uid, 'Company IBAN', - 'sepa_export.payment_order_ids[0].mode.bank_id.acc_number', - sepa_export=sepa_export, context=context), - context=context) - - creditor_agent_2_21 = etree.SubElement(payment_info_2_0, 'CdtrAgt') - creditor_agent_institution = etree.SubElement(creditor_agent_2_21, 'FinInstnId') - creditor_agent_bic = etree.SubElement(creditor_agent_institution, bic_xml_tag) - creditor_agent_bic.text = self._prepare_field(cr, uid, 'Company BIC', - 'sepa_export.payment_order_ids[0].mode.bank_id.bank.bic', - sepa_export=sepa_export, context=context) - - charge_bearer_2_24 = etree.SubElement(payment_info_2_0, 'ChrgBr') - charge_bearer_2_24.text = sepa_export.charge_bearer - - creditor_scheme_identification_2_27 = etree.SubElement(payment_info_2_0, 'CdtrSchmeId') - csi_id = etree.SubElement(creditor_scheme_identification_2_27, 'Id') - csi_orgid = csi_id = etree.SubElement(csi_id, 'OrgId') - csi_other = etree.SubElement(csi_orgid, 'Othr') - csi_other_id = etree.SubElement(csi_other, 'Id') - csi_other_id.text = self._prepare_field(cr, uid, - 'SEPA Creditor Identifier', - 'sepa_export.payment_order_ids[0].company_id.sepa_creditor_identifier', - sepa_export=sepa_export, context=context) - csi_scheme_name = etree.SubElement(csi_other, 'SchmeNm') - csi_scheme_name_proprietary = etree.SubElement(csi_scheme_name, 'Prtry') - csi_scheme_name_proprietary.text = 'SEPA' - - transactions_count = 0 + transactions_count_1_6 = 0 total_amount = 0.0 - amount_control_sum = 0.0 + amount_control_sum_1_7 = 0.0 + first_recur_lines = {} + # key = sequence type ; value = list of lines as objects # Iterate on payment orders for payment_order in sepa_export.payment_order_ids: total_amount = total_amount + payment_order.total # Iterate each payment lines for line in payment_order.line_ids: - transactions_count += 1 + transactions_count_1_6 += 1 + if not line.sdd_mandate_id: + raise orm.except_orm( + _('Error:'), + _("Missing SEPA Direct Debit mandate on the payment line with partner '%s' and Invoice ref '%s'.") + % (line.partner_id.name, + line.ml_inv_ref.number)) + if line.sdd_mandate_id.state != 'valid': + raise orm.except_orm( + _('Error:'), + _("The SEPA Direct Debit mandate with reference '%s' for partner '%s' has expired.") + % (line.sdd_mandate_id.unique_mandate_reference, + line.sdd_mandate_id.partner_id.name)) + + if not line.sdd_mandate_id.signature_date: + raise orm.except_orm( + _('Error:'), + _("Missing signature date on SEPA Direct Debit mandate with reference '%s' for partner '%s'.") + % (line.sdd_mandate_id.unique_mandate_reference, + line.sdd_mandate_id.partner_id.name)) + elif line.sdd_mandate_id.signature_date > datetime.today().strftime('%Y-%m-%d'): + raise orm.except_orm( + _('Error:'), + _("The signature date on SEPA Direct Debit mandate with reference '%s' for partner '%s' is '%s', which is in the future !") + % (line.sdd_mandate_id.unique_mandate_reference, + line.sdd_mandate_id.partner_id.name, + line.sdd_mandate_id.signature_date)) + + if line.sdd_mandate_id.type == 'oneoff': + if not line.sdd_mandate_id.last_debit_date: + if first_recur_lines.get('OOFF'): + first_recur_lines['OOFF'].append(line) + else: + first_recur_lines['OOFF'] = [line] + else: + raise orm.except_orm( + _('Error :'), + _("The mandate with reference '%s' for partner '%s' has type set to 'One-Off' and it has a last debit date set to '%s', so we can't use it.") + % (line.sdd_mandate_id.unique_mandate_reference, + line.sdd_mandate_id.partner_id.name, + line.sdd_mandate_id.last_debit_date)) + elif line.sdd_mandate_id.type == 'recurrent': + if line.sdd_mandate_id.last_debit_date: + if first_recur_lines.get('RCUR'): + first_recur_lines['RCUR'].append(line) + else: + first_recur_lines['RCUR'] = [line] + else: + if first_recur_lines.get('FRST'): + first_recur_lines['FRST'].append(line) + else: + first_recur_lines['FRST'] = [line] + + for sequence_type, lines in first_recur_lines.items(): + # B. Payment info + payment_info_2_0 = etree.SubElement(pain_root, 'PmtInf') + payment_info_identification_2_1 = etree.SubElement(payment_info_2_0, 'PmtInfId') + payment_info_identification_2_1.text = sepa_export.msg_identification + payment_method_2_2 = etree.SubElement(payment_info_2_0, 'PmtMtd') + payment_method_2_2.text = 'DD' + # batch_booking is in "Payment Info" with pain.008.001.02/03 + batch_booking_2_3 = etree.SubElement(payment_info_2_0, 'BtchBookg') + batch_booking_2_3.text = str(sepa_export.batch_booking).lower() + # The "SEPA Core Direct Debit Scheme Customer-to-bank + # Implementation guidelines" v6.0 says that control sum + # and nb_of_transactions should be present + # at both "group header" level and "payment info" level + nb_of_transactions_2_4 = etree.SubElement(payment_info_2_0, 'NbOfTxs') + control_sum_2_5 = etree.SubElement(payment_info_2_0, 'CtrlSum') + payment_type_info_2_6 = etree.SubElement(payment_info_2_0, 'PmtTpInf') + service_level_2_8 = etree.SubElement(payment_type_info_2_6, 'SvcLvl') + service_level_code_2_9 = etree.SubElement(service_level_2_8, 'Cd') + service_level_code_2_9.text = 'SEPA' + local_instrument_2_11 = etree.SubElement(payment_type_info_2_6, 'LclInstrm') + local_instr_code_2_12 = etree.SubElement(local_instrument_2_11, 'Cd') + local_instr_code_2_12.text = 'CORE' + # 2.14 Sequence Type MANDATORY + # this message element must indicate ‘FRST + # 'FRST' = First ; 'OOFF' = One Off ; 'RCUR' : Recurring + # 'FNAL' = Final + sequence_type_2_14 = etree.SubElement(payment_type_info_2_6, 'SeqTp') + sequence_type_2_14.text = sequence_type + + requested_collec_date_2_18 = etree.SubElement(payment_info_2_0, 'ReqdColltnDt') + requested_collec_date_2_18.text = my_requested_collec_date + creditor_2_19 = etree.SubElement(payment_info_2_0, 'Cdtr') + creditor_name = etree.SubElement(creditor_2_19, 'Nm') + creditor_name.text = my_company_name + creditor_account_2_20 = etree.SubElement(payment_info_2_0, 'CdtrAcct') + creditor_account_id = etree.SubElement(creditor_account_2_20, 'Id') + creditor_account_iban = etree.SubElement(creditor_account_id, 'IBAN') + creditor_account_iban.text = self._validate_iban(cr, uid, + self._prepare_field(cr, uid, 'Company IBAN', + 'sepa_export.payment_order_ids[0].mode.bank_id.acc_number', + sepa_export=sepa_export, context=context), + context=context) + + creditor_agent_2_21 = etree.SubElement(payment_info_2_0, 'CdtrAgt') + creditor_agent_institution = etree.SubElement(creditor_agent_2_21, 'FinInstnId') + creditor_agent_bic = etree.SubElement(creditor_agent_institution, bic_xml_tag) + creditor_agent_bic.text = self._prepare_field(cr, uid, 'Company BIC', + 'sepa_export.payment_order_ids[0].mode.bank_id.bank.bic', + sepa_export=sepa_export, context=context) + + charge_bearer_2_24 = etree.SubElement(payment_info_2_0, 'ChrgBr') + charge_bearer_2_24.text = sepa_export.charge_bearer + + creditor_scheme_identification_2_27 = etree.SubElement(payment_info_2_0, 'CdtrSchmeId') + csi_id = etree.SubElement(creditor_scheme_identification_2_27, 'Id') + csi_orgid = csi_id = etree.SubElement(csi_id, 'OrgId') + csi_other = etree.SubElement(csi_orgid, 'Othr') + csi_other_id = etree.SubElement(csi_other, 'Id') + csi_other_id.text = self._prepare_field(cr, uid, + 'SEPA Creditor Identifier', + 'sepa_export.payment_order_ids[0].company_id.sepa_creditor_identifier', + sepa_export=sepa_export, context=context) + csi_scheme_name = etree.SubElement(csi_other, 'SchmeNm') + csi_scheme_name_proprietary = etree.SubElement(csi_scheme_name, 'Prtry') + csi_scheme_name_proprietary.text = 'SEPA' + + transactions_count_2_4 = 0 + amount_control_sum_2_5 = 0.0 + for line in lines: + transactions_count_2_4 += 1 # C. Direct Debit Transaction Info dd_transaction_info_2_28 = etree.SubElement(payment_info_2_0, 'DrctDbtTxInf') payment_identification_2_29 = etree.SubElement(dd_transaction_info_2_28, 'PmtId') @@ -268,20 +318,26 @@ class banking_export_sdd_wizard(orm.TransientModel): 'End to End Identification', 'line.communication', 35, line=line, context=context) payment_type_2_32 = etree.SubElement(dd_transaction_info_2_28, 'PmtTpInf') - # Sequence Type : do we have to set it at Payment Info level ? - #sequence_type_2_40 = etree.SubElement(payment_type_2_32, 'SeqTp') - #sequence_type_2_40.text = 'FRST' # TODO currency_name = self._prepare_field(cr, uid, 'Currency Code', 'line.currency.name', 3, line=line, context=context) instructed_amount_2_44 = etree.SubElement(dd_transaction_info_2_28, 'InstdAmt', Ccy=currency_name) instructed_amount_2_44.text = '%.2f' % line.amount_currency - amount_control_sum += line.amount_currency + amount_control_sum_1_7 += line.amount_currency + amount_control_sum_2_5 += line.amount_currency dd_transaction_2_46 = etree.SubElement(dd_transaction_info_2_28, 'DrctDbtTx') mandate_related_info_2_47 = etree.SubElement(dd_transaction_2_46, 'MndtRltdInf') mandate_identification_2_48 = etree.SubElement(mandate_related_info_2_47, 'MndtId') - mandate_identification_2_48.text = 'RUM1242' # TODO - mandate_signature_date_2_49 = etree.SubElement(mandate_related_info_2_47, 'DtOfSgntr') - mandate_signature_date_2_49.text = '2013-02-20' # TODO + mandate_identification_2_48.text = self._prepare_field( + cr, uid, 'Unique Mandate Reference', + 'line.sdd_mandate_id.unique_mandate_reference', + 35, line=line, context=context) + mandate_signature_date_2_49 = etree.SubElement( + mandate_related_info_2_47, 'DtOfSgntr') + mandate_signature_date_2_49.text = self._prepare_field( + cr, uid, 'Mandate Signature Date', + 'line.sdd_mandate_id.signature_date', 10, + line=line, context=context) + # TODO look at 2.50 "Amendment Indicator debtor_agent_2_70 = etree.SubElement(dd_transaction_info_2_28, 'DbtrAgt') debtor_agent_institution = etree.SubElement(debtor_agent_2_70, 'FinInstnId') @@ -308,10 +364,10 @@ class banking_export_sdd_wizard(orm.TransientModel): remittance_info_unstructured_2_89.text = self._prepare_field(cr, uid, 'Remittance Information', 'line.communication', 140, line=line, context=context) - - if pain_flavor in ['pain.008.001.02', 'pain.008.001.03', 'pain.008.001.04']: - nb_of_transactions_1_6.text = nb_of_transactions_2_4.text = str(transactions_count) - control_sum_1_7.text = control_sum_2_5.text = '%.2f' % amount_control_sum + nb_of_transactions_2_4.text = str(transactions_count_2_4) + control_sum_2_5.text = '%.2f' % amount_control_sum_2_5 + nb_of_transactions_1_6.text = str(transactions_count_1_6) + control_sum_1_7.text = '%.2f' % amount_control_sum_1_7 xml_string = etree.tostring(root, pretty_print=True, encoding='UTF-8', xml_declaration=True) @@ -345,7 +401,7 @@ class banking_export_sdd_wizard(orm.TransientModel): 'charge_bearer': sepa_export.charge_bearer, 'requested_collec_date': sepa_export.requested_collec_date, 'total_amount': total_amount, - 'nb_transactions': transactions_count, + 'nb_transactions': transactions_count_1_6, 'file': base64.encodestring(xml_string), 'payment_order_ids': [ (6, 0, [x.id for x in sepa_export.payment_order_ids]) @@ -374,13 +430,15 @@ class banking_export_sdd_wizard(orm.TransientModel): Cancel the SEPA Direct Debit file: just drop the file ''' sepa_export = self.browse(cr, uid, ids[0], context=context) - self.pool.get('banking.export.sdd').unlink(cr, uid, sepa_export.file_id.id, context=context) + self.pool.get('banking.export.sdd').unlink( + cr, uid, sepa_export.file_id.id, context=context) return {'type': 'ir.actions.act_window_close'} def save_sepa(self, cr, uid, ids, context=None): ''' Save the SEPA Direct Debit file: mark all payments in the file as 'sent'. + Write 'last debit date' on mandate and set oneoff mandate to expired ''' sepa_export = self.browse(cr, uid, ids[0], context=context) sepa_file = self.pool.get('banking.export.sdd').write(cr, uid, @@ -388,4 +446,14 @@ class banking_export_sdd_wizard(orm.TransientModel): wf_service = netsvc.LocalService('workflow') for order in sepa_export.payment_order_ids: wf_service.trg_validate(uid, 'payment.order', order.id, 'sent', cr) + mandate_ids = [line.sdd_mandate_id.id for line in order.line_ids] + self.pool['sdd.mandate'].write( + cr, uid, mandate_ids, { + 'last_debit_date': datetime.today().strftime('%Y-%m-%d') + }, + context=context) + oneoff_mandate_ids = [line.sdd_mandate_id.id for line in order.line_ids if line.sdd_mandate_id.type == 'oneoff'] + self.pool['sdd.mandate'].write( + cr, uid, oneoff_mandate_ids, {'state': 'expired'}, + context=context) return {'type': 'ir.actions.act_window_close'} From 67ef15a5ce2f02e71c9682e97baa8a9c02ec9764 Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Sat, 19 Oct 2013 17:29:17 +0200 Subject: [PATCH 003/118] correct parent menu entry Remove unused variables --- account_banking_sepa_direct_debit/account_banking_sdd.py | 1 - .../account_banking_sdd_view.xml | 2 +- account_banking_sepa_direct_debit/wizard/export_sdd.py | 6 ++---- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/account_banking_sepa_direct_debit/account_banking_sdd.py b/account_banking_sepa_direct_debit/account_banking_sdd.py index 7e5a5d0f3..55c5921fd 100644 --- a/account_banking_sepa_direct_debit/account_banking_sdd.py +++ b/account_banking_sepa_direct_debit/account_banking_sdd.py @@ -20,7 +20,6 @@ ############################################################################## from openerp.osv import orm, fields -import time from openerp.tools.translate import _ from openerp.addons.decimal_precision import decimal_precision as dp diff --git a/account_banking_sepa_direct_debit/account_banking_sdd_view.xml b/account_banking_sepa_direct_debit/account_banking_sdd_view.xml index 32a289081..2f0d64c9d 100644 --- a/account_banking_sepa_direct_debit/account_banking_sdd_view.xml +++ b/account_banking_sepa_direct_debit/account_banking_sdd_view.xml @@ -65,7 +65,7 @@ diff --git a/account_banking_sepa_direct_debit/wizard/export_sdd.py b/account_banking_sepa_direct_debit/wizard/export_sdd.py index 3cc06e845..66e478188 100644 --- a/account_banking_sepa_direct_debit/wizard/export_sdd.py +++ b/account_banking_sepa_direct_debit/wizard/export_sdd.py @@ -127,8 +127,6 @@ class banking_export_sdd_wizard(orm.TransientModel): ''' Creates the SEPA Direct Debit file. That's the important code ! ''' - payment_order_obj = self.pool.get('payment.order') - sepa_export = self.browse(cr, uid, ids[0], context=context) pain_flavor = sepa_export.payment_order_ids[0].mode.type.code @@ -441,11 +439,11 @@ class banking_export_sdd_wizard(orm.TransientModel): Write 'last debit date' on mandate and set oneoff mandate to expired ''' sepa_export = self.browse(cr, uid, ids[0], context=context) - sepa_file = self.pool.get('banking.export.sdd').write(cr, uid, + self.pool.get('banking.export.sdd').write(cr, uid, sepa_export.file_id.id, {'state': 'sent'}, context=context) wf_service = netsvc.LocalService('workflow') for order in sepa_export.payment_order_ids: - wf_service.trg_validate(uid, 'payment.order', order.id, 'sent', cr) + wf_service.trg_validate(uid, 'payment.order', order.id, 'done', cr) mandate_ids = [line.sdd_mandate_id.id for line in order.line_ids] self.pool['sdd.mandate'].write( cr, uid, mandate_ids, { From 2d5c618c0a0789453297465c91f84bac2f227d23 Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Wed, 23 Oct 2013 00:25:06 +0200 Subject: [PATCH 004/118] 2 modifications following a real-life SDD with a French bank: - convert accented chars to ascii chars (via the unidecode lib) - use "PrvtId" instead of "OrgId" in the XML Use the sequence of payment.order as the "Message identification" of the XML file (advantages : it is unique, users can easily customize the sequence and users can easily find the payment corresponding to the "Message Identification" in OpenERP). It is also used as the Payment Identification, combined with the sequence type. Use the sequence of payment.line in the "EndtoEnd Identification" field. Reduce flake8 warnings. --- account_banking_sepa_direct_debit/__init__.py | 1 - .../account_banking_sdd.py | 50 +- .../account_banking_sdd_view.xml | 3 +- account_banking_sepa_direct_debit/company.py | 22 +- .../data/mandate_reference_sequence.xml | 2 +- .../account_banking_sepa_direct_debit.pot | 494 ++++++++++++++++++ .../wizard/export_sdd.py | 73 ++- .../wizard/export_sdd_view.xml | 2 - 8 files changed, 567 insertions(+), 80 deletions(-) create mode 100644 account_banking_sepa_direct_debit/i18n/account_banking_sepa_direct_debit.pot diff --git a/account_banking_sepa_direct_debit/__init__.py b/account_banking_sepa_direct_debit/__init__.py index ce46fda33..f852fb7bd 100644 --- a/account_banking_sepa_direct_debit/__init__.py +++ b/account_banking_sepa_direct_debit/__init__.py @@ -23,4 +23,3 @@ from . import company from . import wizard from . import account_banking_sdd - diff --git a/account_banking_sepa_direct_debit/account_banking_sdd.py b/account_banking_sepa_direct_debit/account_banking_sdd.py index 55c5921fd..0a57ee839 100644 --- a/account_banking_sepa_direct_debit/account_banking_sdd.py +++ b/account_banking_sepa_direct_debit/account_banking_sdd.py @@ -22,18 +22,19 @@ from openerp.osv import orm, fields from openerp.tools.translate import _ from openerp.addons.decimal_precision import decimal_precision as dp +from unidecode import unidecode class banking_export_sdd(orm.Model): '''SEPA Direct Debit export''' _name = 'banking.export.sdd' _description = __doc__ - _rec_name = 'msg_identification' + _rec_name = 'filename' def _generate_filename(self, cr, uid, ids, name, arg, context=None): res = {} for sepa_file in self.browse(cr, uid, ids, context=context): - res[sepa_file.id] = 'sdd_' + (sepa_file.msg_identification or '') + '.xml' + res[sepa_file.id] = 'sdd_%s.xml' % (sepa_file.payment_order_ids[0].reference and unidecode(sepa_file.payment_order_ids[0].reference.replace('/', '-')) or 'error') return res _columns = { @@ -43,13 +44,15 @@ class banking_export_sdd(orm.Model): 'banking_export_sepa_id', 'account_order_id', 'Payment orders', readonly=True), - 'requested_collec_date': fields.date('Requested collection date', readonly=True), - 'nb_transactions': fields.integer('Number of transactions', readonly=True), - 'total_amount': fields.float('Total amount', - digits_compute=dp.get_precision('Account'), readonly=True), - 'msg_identification': fields.char('Message identification', size=35, + 'requested_collec_date': fields.date( + 'Requested collection date', readonly=True), + 'nb_transactions': fields.integer( + 'Number of transactions', readonly=True), + 'total_amount': fields.float( + 'Total amount', digits_compute=dp.get_precision('Account'), readonly=True), - 'batch_booking': fields.boolean('Batch booking', readonly=True, + 'batch_booking': fields.boolean( + 'Batch booking', readonly=True, help="If true, the bank statement will display only one credit line for all the direct debits of the SEPA XML file ; if false, the bank statement will display one credit line per direct debit of the SEPA XML file."), 'charge_bearer': fields.selection([ ('SHAR', 'Shared'), @@ -58,15 +61,15 @@ class banking_export_sdd(orm.Model): ('SLEV', 'Following service level'), ], 'Charge bearer', readonly=True, help='Shared : transaction charges on the sender side are to be borne by the debtor, transaction charges on the receiver side are to be borne by the creditor (most transfers use this). Borne by creditor : all transaction charges are to be borne by the creditor. Borne by debtor : all transaction charges are to be borne by the debtor. Following service level : transaction charges are to be applied following the rules agreed in the service level and/or scheme.'), - 'generation_date': fields.datetime('Generation date', - readonly=True), + 'generation_date': fields.datetime('Generation date', readonly=True), 'file': fields.binary('SEPA XML file', readonly=True), - 'filename': fields.function(_generate_filename, type='char', size=256, - method=True, string='Filename', readonly=True), + 'filename': fields.function( + _generate_filename, type='char', size=256, + string='Filename', readonly=True, store=True), 'state': fields.selection([ - ('draft', 'Draft'), - ('sent', 'Sent'), - ('done', 'Reconciled'), + ('draft', 'Draft'), + ('sent', 'Sent'), + ('done', 'Reconciled'), ], 'State', readonly=True), } @@ -97,7 +100,8 @@ class sdd_mandate(orm.Model): ], 'Type of Mandate', required=True), 'signature_date': fields.date('Date of Signature of the Mandate'), 'scan': fields.binary('Scan of the mandate'), - 'last_debit_date': fields.date('Date of the Last Debit', + 'last_debit_date': fields.date( + 'Date of the Last Debit', help="For recurrent mandates, this field is used to know if the SDD will be of type 'First' or 'Recurring'. For one-off mandates, this field is used to know if the SDD has already been used or not."), 'state': fields.selection([ ('valid', 'Valid'), @@ -113,10 +117,10 @@ class sdd_mandate(orm.Model): )] _defaults = { - 'company_id': lambda self, cr, uid, context: \ + 'company_id': lambda self, cr, uid, context: self.pool['res.users'].browse(cr, uid, uid, context=context).\ company_id.id, - 'unique_mandate_reference': lambda self, cr, uid, context: \ + 'unique_mandate_reference': lambda self, cr, uid, context: self.pool['ir.sequence'].get(cr, uid, 'sdd.mandate.reference'), 'state': 'valid', } @@ -143,15 +147,13 @@ class payment_line(orm.Model): for payline in self.browse(cr, uid, ids): if payline.sdd_mandate_id and not payline.bank_id: raise orm.except_orm( - _('Error :'), - _("Missing bank account on the payment line with SEPA\ - Direct Debit Mandate '%s'." - % payline.sdd_mandate_id.unique_mandate_reference)) + _('Error:'), + _("Missing bank account on the payment line with SEPA Direct Debit Mandate '%s'.") + % payline.sdd_mandate_id.unique_mandate_reference) elif payline.sdd_mandate_id and payline.bank_id and payline.sdd_mandate_id.partner_bank_id != payline.bank_id.id: raise orm.except_orm( - _('Error :'), + _('Error:'), _("The SEPA Direct Debit Mandate '%s' is not related??")) - return True # _constraints = [ diff --git a/account_banking_sepa_direct_debit/account_banking_sdd_view.xml b/account_banking_sepa_direct_debit/account_banking_sdd_view.xml index 2f0d64c9d..8249da13e 100644 --- a/account_banking_sepa_direct_debit/account_banking_sdd_view.xml +++ b/account_banking_sepa_direct_debit/account_banking_sdd_view.xml @@ -14,7 +14,6 @@
- @@ -47,7 +46,7 @@ banking.export.sdd - + diff --git a/account_banking_sepa_direct_debit/company.py b/account_banking_sepa_direct_debit/company.py index aed40f64b..eb3730d57 100644 --- a/account_banking_sepa_direct_debit/company.py +++ b/account_banking_sepa_direct_debit/company.py @@ -34,9 +34,11 @@ class res_company(orm.Model): help="Enter the Creditor Identifier that has been attributed to your company to make SEPA Direct Debits. This identifier is composed of :\n- your country ISO code (2 letters)\n- a 2-digits checkum\n- a 3-letters business code\n- a country-specific identifier"), } - def is_sepa_creditor_identifier_valid(self, cr, uid, sepa_creditor_identifier, context=None): + def is_sepa_creditor_identifier_valid( + self, cr, uid, sepa_creditor_identifier, context=None): """Check if SEPA Creditor Identifier is valid - @param sepa_creditor_identifier: SEPA Creditor Identifier as str or unicode + @param sepa_creditor_identifier: SEPA Creditor Identifier as str + or unicode @return: True if valid, False otherwise """ if not isinstance(sepa_creditor_identifier, (str, unicode)): @@ -44,20 +46,23 @@ class res_company(orm.Model): try: sci_str = str(sepa_creditor_identifier) except: - logger.warning("SEPA Creditor ID should contain only ASCII caracters.") + logger.warning( + "SEPA Creditor ID should contain only ASCII caracters.") return False sci = sci_str.lower() if len(sci) < 9: return False before_replacement = sci[7:] + sci[0:2] + '00' - logger.debug("SEPA ID check before_replacement = %s" % before_replacement) + logger.debug( + "SEPA ID check before_replacement = %s" % before_replacement) after_replacement = '' for char in before_replacement: if char.isalpha(): after_replacement += str(ord(char)-87) else: after_replacement += char - logger.debug("SEPA ID check after_replacement = %s" % after_replacement) + logger.debug( + "SEPA ID check after_replacement = %s" % after_replacement) if int(sci[2:4]) == (98 - (int(after_replacement) % 97)): return True else: @@ -66,10 +71,13 @@ class res_company(orm.Model): def _check_sepa_creditor_identifier(self, cr, uid, ids): for company in self.browse(cr, uid, ids): if company.sepa_creditor_identifier: - if not self.is_sepa_creditor_identifier_valid(cr, uid, company.sepa_creditor_identifier): + if not self.is_sepa_creditor_identifier_valid( + cr, uid, company.sepa_creditor_identifier): return False return True _constraints = [ - (_check_sepa_creditor_identifier, "Invalid SEPA Creditor Identifier.", ['sepa_creditor_identifier']), + (_check_sepa_creditor_identifier, + "Invalid SEPA Creditor Identifier.", + ['sepa_creditor_identifier']), ] diff --git a/account_banking_sepa_direct_debit/data/mandate_reference_sequence.xml b/account_banking_sepa_direct_debit/data/mandate_reference_sequence.xml index 6a3143cca..68075d526 100644 --- a/account_banking_sepa_direct_debit/data/mandate_reference_sequence.xml +++ b/account_banking_sepa_direct_debit/data/mandate_reference_sequence.xml @@ -1,6 +1,6 @@ - + diff --git a/account_banking_sepa_direct_debit/i18n/account_banking_sepa_direct_debit.pot b/account_banking_sepa_direct_debit/i18n/account_banking_sepa_direct_debit.pot new file mode 100644 index 000000000..6c772f970 --- /dev/null +++ b/account_banking_sepa_direct_debit/i18n/account_banking_sepa_direct_debit.pot @@ -0,0 +1,494 @@ +# Translation of OpenERP Server. +# This file contains the translation of the following modules: +# * account_banking_sepa_direct_debit +# +msgid "" +msgstr "" +"Project-Id-Version: OpenERP Server 7.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2013-10-21 21:21+0000\n" +"PO-Revision-Date: 2013-10-21 21:21+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_sepa_direct_debit +#: field:banking.export.sdd,file:0 +msgid "SEPA XML file" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,nb_transactions:0 +#: field:banking.export.sdd.wizard,nb_transactions:0 +msgid "Number of transactions" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:79 +#, python-format +msgid "This IBAN is not valid : %s" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:132 +#, python-format +msgid "Payment Type Code '%s' is not supported. The only Payment Type Code supported for SEPA Direct Debit are 'pain.008.001.02', 'pain.008.001.03' and 'pain.008.001.04'." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd.wizard,state:0 +msgid "Create" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:sdd.mandate,type:0 +msgid "Recurrent" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,type:0 +msgid "Type of Mandate" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:192 +#, python-format +msgid "Missing signature date on SEPA Direct Debit mandate with reference '%s' for partner '%s'." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,filename:0 +#: field:banking.export.sdd.wizard,filename:0 +msgid "Filename" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.act_banking_export_sdd_payment_order +msgid "Generated SEPA Direct Debit files" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,state:0 +#: field:banking.export.sdd.wizard,state:0 +msgid "State" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:sdd.mandate,state:0 +msgid "Valid" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,state:0 +msgid "Draft" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:185 +#, python-format +msgid "The SEPA Direct Debit mandate with reference '%s' for partner '%s' has expired." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:100 +#, python-format +msgid "Cannot compute the '%s' of the Payment Line with Invoice Reference '%s'." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:res.partner.bank:0 +#: field:res.partner.bank,sdd_mandate_ids:0 +msgid "SEPA Direct Debit Mandates" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,total_amount:0 +#: field:banking.export.sdd.wizard,total_amount:0 +msgid "Total amount" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd:0 +msgid "SEPA Direct Debit" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +msgid "Type" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,generation_date:0 +msgid "Generation date" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,state:0 +msgid "Sent" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,scan:0 +msgid "Scan of the mandate" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: help:banking.export.sdd.wizard,requested_collec_date:0 +msgid "This is the date on which the collection should be made by the bank. Please keep in mind that banks only execute on working days." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.action_account_banking_sdd +#: model:ir.ui.menu,name:account_banking_sepa_direct_debit.menu_account_banking_sdd +msgid "Generated SEPA Direct Debit XML files" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd.wizard,state:0 +msgid "Finish" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:res.partner:0 +#: view:res.partner.bank:0 +msgid "SDD Mandates" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:198 +#, python-format +msgid "The signature date on SEPA Direct Debit mandate with reference '%s' for partner '%s' is '%s', which is in the future !" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:res.company,sepa_creditor_identifier:0 +msgid "SEPA Creditor Identifier" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,company_id:0 +msgid "Company" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,charge_bearer:0 +#: selection:banking.export.sdd.wizard,charge_bearer:0 +msgid "Shared" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,unique_mandate_reference:0 +msgid "Unique Mandate Reference" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:102 +#, python-format +msgid "Cannot compute the '%s'." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:104 +#, python-format +msgid "The type of the field '%s' is %s. It should be a string or unicode." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_banking_export_sdd +msgid "SEPA Direct Debit export" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_payment_line +msgid "Payment Line" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:payment.order:0 +msgid "SDD Mandate" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:156 +#, python-format +msgid "The SEPA Direct Debit Mandate '%s' is not related??" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:sdd.mandate,state:0 +msgid "Expired" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd.wizard:0 +msgid "Generate" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.sdd_mandate_action +#: model:ir.model,name:account_banking_sepa_direct_debit.model_sdd_mandate +#: model:ir.ui.menu,name:account_banking_sepa_direct_debit.sdd_mandate_menu +#: field:payment.line,sdd_mandate_id:0 +#: view:sdd.mandate:0 +msgid "SEPA Direct Debit Mandate" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: help:res.company,sepa_creditor_identifier:0 +msgid "Enter the Creditor Identifier that has been attributed to your company to make SEPA Direct Debits. This identifier is composed of :\n" +"- your country ISO code (2 letters)\n" +"- a 2-digits checkum\n" +"- a 3-letters business code\n" +"- a country-specific identifier" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:151 +#, python-format +msgid "Missing bank account on the payment line with SEPA Direct Debit Mandate '%s'." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +msgid "Status" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:385 +#, python-format +msgid "The generated XML file is not valid against the official XML Schema Definition. The generated XML file and the full error have been written in the server logs. Here is the error, which may give you an idea on the cause of the problem : %s" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: sql_constraint:sdd.mandate:0 +msgid "A Mandate with the same reference already exists for this company !" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:106 +#, python-format +msgid "The '%s' is empty or 0. It should have a non-null value." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:150 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:155 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:79 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:100 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:102 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:106 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:132 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:178 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:184 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:191 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:197 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:211 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:385 +#, python-format +msgid "Error:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,partner_bank_id:0 +msgid "Bank Account" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_res_company +msgid "Companies" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: help:banking.export.sdd,charge_bearer:0 +#: help:banking.export.sdd.wizard,charge_bearer:0 +msgid "Shared : transaction charges on the sender side are to be borne by the debtor, transaction charges on the receiver side are to be borne by the creditor (most transfers use this). Borne by creditor : all transaction charges are to be borne by the creditor. Borne by debtor : all transaction charges are to be borne by the debtor. Following service level : transaction charges are to be applied following the rules agreed in the service level and/or scheme." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,charge_bearer:0 +#: selection:banking.export.sdd.wizard,charge_bearer:0 +msgid "Borne by creditor" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,payment_order_ids:0 +#: field:banking.export.sdd.wizard,payment_order_ids:0 +msgid "Payment orders" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +msgid "Signature Date" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: help:banking.export.sdd,batch_booking:0 +msgid "If true, the bank statement will display only one credit line for all the direct debits of the SEPA XML file ; if false, the bank statement will display one credit line per direct debit of the SEPA XML file." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd.wizard:0 +msgid "Processing details" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,file_id:0 +msgid "SDD XML file" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_banking_export_sdd_wizard +msgid "Export SEPA Direct Debit XML file" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:104 +#, python-format +msgid "Field type error:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.actions.act_window,help:account_banking_sepa_direct_debit.sdd_mandate_action +msgid "

\n" +" Click to create a new SEPA Direct Debit Mandate.\n" +"

\n" +" The SEPA Direct Debit Mandate is a document signed by your customer that gives you the autorization to do one or several direct debits on his bank account.\n" +"

\n" +" " +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:sdd.mandate,type:0 +msgid "One-Off" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:179 +#, python-format +msgid "Missing SEPA Direct Debit mandate on the payment line with partner '%s' and Invoice ref '%s'." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd.wizard:0 +msgid "Validate" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:212 +#, python-format +msgid "The mandate with reference '%s' for partner '%s' has type set to 'One-Off' and it has a last debit date set to '%s', so we can't use it." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: help:sdd.mandate,last_debit_date:0 +msgid "For recurrent mandates, this field is used to know if the SDD will be of type 'First' or 'Recurring'. For one-off mandates, this field is used to know if the SDD has already been used or not." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,signature_date:0 +msgid "Date of Signature of the Mandate" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,last_debit_date:0 +msgid "Date of the Last Debit" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +msgid "Reference" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: constraint:res.company:0 +msgid "Invalid SEPA Creditor Identifier." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,requested_collec_date:0 +#: field:banking.export.sdd.wizard,requested_collec_date:0 +msgid "Requested collection date" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,charge_bearer:0 +#: selection:banking.export.sdd.wizard,charge_bearer:0 +msgid "Borne by debtor" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_res_partner_bank +msgid "Bank Accounts" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,charge_bearer:0 +#: selection:banking.export.sdd.wizard,charge_bearer:0 +msgid "Following service level" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd:0 +msgid "Payment Orders" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd.wizard:0 +msgid "SEPA Direct Debit XML file generation" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd:0 +msgid "General Information" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,charge_bearer:0 +#: field:banking.export.sdd.wizard,charge_bearer:0 +msgid "Charge bearer" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,state:0 +msgid "Mandate Status" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: help:banking.export.sdd.wizard,batch_booking:0 +msgid "If true, the bank statement will display only one debit line for all the wire transfers of the SEPA XML file ; if false, the bank statement will display one debit line per wire transfer of the SEPA XML file." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,file:0 +msgid "File" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd.wizard:0 +msgid "Cancel" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,partner_id:0 +msgid "Partner" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: help:sdd.mandate,state:0 +msgid "For a recurrent mandate, this field indicate if the mandate is still valid or if it has expired (a recurrent mandate expires if it's not used during 36 months). For a one-off mandate, it expires after its first use." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,batch_booking:0 +#: field:banking.export.sdd.wizard,batch_booking:0 +msgid "Batch booking" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,state:0 +msgid "Reconciled" +msgstr "" + diff --git a/account_banking_sepa_direct_debit/wizard/export_sdd.py b/account_banking_sepa_direct_debit/wizard/export_sdd.py index 66e478188..0e935aa7f 100644 --- a/account_banking_sepa_direct_debit/wizard/export_sdd.py +++ b/account_banking_sepa_direct_debit/wizard/export_sdd.py @@ -28,6 +28,7 @@ import base64 from datetime import datetime, timedelta from lxml import etree import logging +from unidecode import unidecode _logger = logging.getLogger(__name__) @@ -38,10 +39,6 @@ class banking_export_sdd_wizard(orm.TransientModel): _columns = { 'state': fields.selection([('create', 'Create'), ('finish', 'Finish')], 'State', readonly=True), - 'msg_identification': fields.char('Message identification', size=35, - # Can't set required=True on the field because it blocks - # the launch of the wizard -> I set it as required in the view - help='This is the message identification of the entire SEPA XML file. 35 characters max.'), 'batch_booking': fields.boolean('Batch booking', help="If true, the bank statement will display only one debit line for all the wire transfers of the SEPA XML file ; if false, the bank statement will display one debit line per wire transfer of the SEPA XML file."), 'requested_collec_date': fields.date('Requested collection date', @@ -72,22 +69,6 @@ class banking_export_sdd_wizard(orm.TransientModel): 'state': 'create', } - - def _check_msg_identification(self, cr, uid, ids): - '''Check that the msg_identification is unique''' - for export_sdd in self.browse(cr, uid, ids): - res = self.pool.get('banking.export.sdd').search(cr, uid, - [('msg_identification', '=', export_sdd.msg_identification)]) - if len(res) > 1: - return False - return True - - - _constraints = [ - (_check_msg_identification, "The field 'Message Identification' should be uniue. Another SEPA Direct Debit file already exists with the same 'Message Identification'.", ['msg_identification']) - ] - - def _validate_iban(self, cr, uid, iban, context=None): '''if IBAN is valid, returns IBAN if IBAN is NOT valid, raises an error message''' @@ -95,7 +76,7 @@ class banking_export_sdd_wizard(orm.TransientModel): if partner_bank_obj.is_iban_valid(cr, uid, iban, context=context): return iban.replace(' ', '') else: - raise orm.except_orm(_('Error :'), _("This IBAN is not valid : %s") % iban) + raise orm.except_orm(_('Error:'), _("This IBAN is not valid : %s") % iban) def create(self, cr, uid, vals, context=None): payment_order_ids = context.get('active_ids', []) @@ -105,24 +86,27 @@ class banking_export_sdd_wizard(orm.TransientModel): return super(banking_export_sdd_wizard, self).create(cr, uid, vals, context=context) - - def _prepare_field(self, cr, uid, field_name, field_value, max_size=0, sepa_export=False, line=False, context=None): + def _prepare_field(self, cr, uid, field_name, field_value, max_size=0, sepa_export=False, line=False, sequence_type=False, context=None): try: - value = eval(field_value) + # SEPA uses XML, and XML = UTF-8 with support for all characters... + # But we are dealing with banks + # and many banks don't want non-ASCCI characters ! + # cf section 1.4 "Character set" of the SEPA Core Direct Debit + # Customer-to-bank implementation guidelines version 6.0 + value = unidecode(eval(field_value)) except: if line: - raise orm.except_orm(_('Error :'), _("Cannot compute the '%s' of the Payment Line with Invoice Reference '%s'.") % (field_name, self.pool['account.invoice'].name_get(cr, uid, [line.ml_inv_ref.id], context=context)[0][1])) + raise orm.except_orm(_('Error:'), _("Cannot compute the '%s' of the Payment Line with Invoice Reference '%s'.") % (field_name, self.pool['account.invoice'].name_get(cr, uid, [line.ml_inv_ref.id], context=context)[0][1])) else: - raise orm.except_orm(_('Error :'), _("Cannot compute the '%s'.") % field_name) + raise orm.except_orm(_('Error:'), _("Cannot compute the '%s'.") % field_name) if not isinstance(value, (str, unicode)): - raise orm.except_orm(_('Field type error :'), _("The type of the field '%s' is %s. It should be a string or unicode.") % (field_name, type(value))) + raise orm.except_orm(_('Field type error:'), _("The type of the field '%s' is %s. It should be a string or unicode.") % (field_name, type(value))) if not value: - raise orm.except_orm(_('Error :'), _("The '%s' is empty or 0. It should have a non-null value.") % field_name) + raise orm.except_orm(_('Error:'), _("The '%s' is empty or 0. It should have a non-null value.") % field_name) if max_size and len(value) > max_size: value = value[0:max_size] return value - def create_sepa(self, cr, uid, ids, context=None): ''' Creates the SEPA Direct Debit file. That's the important code ! @@ -143,7 +127,7 @@ class banking_export_sdd_wizard(orm.TransientModel): name_maxsize = 140 root_xml_tag = 'CstmrDrctDbtInitn' else: - raise orm.except_orm(_('Error :'), _("Payment Type Code '%s' is not supported. The only Payment Type Code supported for SEPA Direct Debit are 'pain.008.001.02', 'pain.008.001.03' and 'pain.008.001.04'.") % pain_flavor) + raise orm.except_orm(_('Error:'), _("Payment Type Code '%s' is not supported. The only Payment Type Code supported for SEPA Direct Debit are 'pain.008.001.02', 'pain.008.001.03' and 'pain.008.001.04'.") % pain_flavor) if sepa_export.requested_collec_date: my_requested_collec_date = sepa_export.requested_collec_date else: @@ -158,13 +142,16 @@ class banking_export_sdd_wizard(orm.TransientModel): pain_root = etree.SubElement(root, root_xml_tag) my_company_name = self._prepare_field(cr, uid, 'Company Name', - 'sepa_export.payment_order_ids[0].company_id.name', - name_maxsize, sepa_export, context=context) + 'sepa_export.payment_order_ids[0].company_id.partner_id.name', + name_maxsize, sepa_export=sepa_export, context=context) # A. Group header group_header_1_0 = etree.SubElement(pain_root, 'GrpHdr') message_identification_1_1 = etree.SubElement(group_header_1_0, 'MsgId') - message_identification_1_1.text = sepa_export.msg_identification + message_identification_1_1.text = self._prepare_field(cr, uid, + 'Message Identification', + 'sepa_export.payment_order_ids[0].reference', 35, + sepa_export=sepa_export, context=context) creation_date_time_1_2 = etree.SubElement(group_header_1_0, 'CreDtTm') creation_date_time_1_2.text = datetime.strftime(datetime.today(), '%Y-%m-%dT%H:%M:%S') nb_of_transactions_1_6 = etree.SubElement(group_header_1_0, 'NbOfTxs') @@ -219,7 +206,7 @@ class banking_export_sdd_wizard(orm.TransientModel): first_recur_lines['OOFF'] = [line] else: raise orm.except_orm( - _('Error :'), + _('Error:'), _("The mandate with reference '%s' for partner '%s' has type set to 'One-Off' and it has a last debit date set to '%s', so we can't use it.") % (line.sdd_mandate_id.unique_mandate_reference, line.sdd_mandate_id.partner_id.name, @@ -240,7 +227,11 @@ class banking_export_sdd_wizard(orm.TransientModel): # B. Payment info payment_info_2_0 = etree.SubElement(pain_root, 'PmtInf') payment_info_identification_2_1 = etree.SubElement(payment_info_2_0, 'PmtInfId') - payment_info_identification_2_1.text = sepa_export.msg_identification + payment_info_identification_2_1.text = self._prepare_field( + cr, uid, 'Payment Information Identification', + "sequence_type + '-' + sepa_export.payment_order_ids[0].reference", + 35, sepa_export=sepa_export, sequence_type=sequence_type, + context=context) payment_method_2_2 = etree.SubElement(payment_info_2_0, 'PmtMtd') payment_method_2_2.text = 'DD' # batch_booking is in "Payment Info" with pain.008.001.02/03 @@ -292,8 +283,8 @@ class banking_export_sdd_wizard(orm.TransientModel): creditor_scheme_identification_2_27 = etree.SubElement(payment_info_2_0, 'CdtrSchmeId') csi_id = etree.SubElement(creditor_scheme_identification_2_27, 'Id') - csi_orgid = csi_id = etree.SubElement(csi_id, 'OrgId') - csi_other = etree.SubElement(csi_orgid, 'Othr') + csi_privateid = csi_id = etree.SubElement(csi_id, 'PrvtId') + csi_other = etree.SubElement(csi_privateid, 'Othr') csi_other_id = etree.SubElement(csi_other, 'Id') csi_other_id.text = self._prepare_field(cr, uid, 'SEPA Creditor Identifier', @@ -313,9 +304,8 @@ class banking_export_sdd_wizard(orm.TransientModel): # Instruction identification (2.30) is not mandatory, so we don't use it end2end_identification_2_31 = etree.SubElement(payment_identification_2_29, 'EndToEndId') end2end_identification_2_31.text = self._prepare_field(cr, uid, - 'End to End Identification', 'line.communication', 35, + 'End to End Identification', 'line.name', 35, line=line, context=context) - payment_type_2_32 = etree.SubElement(dd_transaction_info_2_28, 'PmtTpInf') currency_name = self._prepare_field(cr, uid, 'Currency Code', 'line.currency.name', 3, line=line, context=context) instructed_amount_2_44 = etree.SubElement(dd_transaction_info_2_28, 'InstdAmt', Ccy=currency_name) @@ -389,12 +379,11 @@ class banking_export_sdd_wizard(orm.TransientModel): _logger.warning("The XML file is invalid against the XML Schema Definition") _logger.warning(xml_string) _logger.warning(e) - raise orm.except_orm(_('Error :'), _('The generated XML file is not valid against the official XML Schema Definition. The generated XML file and the full error have been written in the server logs. Here is the error, which may give you an idea on the cause of the problem : %s') % str(e)) + raise orm.except_orm(_('Error:'), _('The generated XML file is not valid against the official XML Schema Definition. The generated XML file and the full error have been written in the server logs. Here is the error, which may give you an idea on the cause of the problem : %s') % str(e)) # CREATE the banking.export.sepa record file_id = self.pool.get('banking.export.sdd').create(cr, uid, { - 'msg_identification': sepa_export.msg_identification, 'batch_booking': sepa_export.batch_booking, 'charge_bearer': sepa_export.charge_bearer, 'requested_collec_date': sepa_export.requested_collec_date, @@ -422,7 +411,6 @@ class banking_export_sdd_wizard(orm.TransientModel): } return action - def cancel_sepa(self, cr, uid, ids, context=None): ''' Cancel the SEPA Direct Debit file: just drop the file @@ -432,7 +420,6 @@ class banking_export_sdd_wizard(orm.TransientModel): cr, uid, sepa_export.file_id.id, context=context) return {'type': 'ir.actions.act_window_close'} - def save_sepa(self, cr, uid, ids, context=None): ''' Save the SEPA Direct Debit file: mark all payments in the file as 'sent'. diff --git a/account_banking_sepa_direct_debit/wizard/export_sdd_view.xml b/account_banking_sepa_direct_debit/wizard/export_sdd_view.xml index 8357e3f5d..4afa6bb01 100644 --- a/account_banking_sepa_direct_debit/wizard/export_sdd_view.xml +++ b/account_banking_sepa_direct_debit/wizard/export_sdd_view.xml @@ -18,8 +18,6 @@ - - From 137377a4455c940e250ac56d276cea0ef95aadaa Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Wed, 6 Nov 2013 10:02:09 +0100 Subject: [PATCH 005/118] Add python lib dependencies. --- account_banking_sepa_direct_debit/__openerp__.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/account_banking_sepa_direct_debit/__openerp__.py b/account_banking_sepa_direct_debit/__openerp__.py index 2a44e1c06..8c6a69ef5 100644 --- a/account_banking_sepa_direct_debit/__openerp__.py +++ b/account_banking_sepa_direct_debit/__openerp__.py @@ -27,6 +27,9 @@ 'website': 'http://www.akretion.com', 'category': 'Banking addons', 'depends': ['account_direct_debit'], + 'external_dependencies': { + 'python': ['unidecode', 'lxml'], + }, 'data': [ 'account_banking_sdd_view.xml', 'account_payment_view.xml', From e08ee1676ed236e2cb5f9c11467e2f661c58144f Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Thu, 7 Nov 2013 12:52:08 +0100 Subject: [PATCH 006/118] Reduce pep8 warnings Use create_date instead of a dedicated datetime field The creation of the SEPA file now has a _prepare function Other improvements in the code. --- .../account_banking_sdd.py | 43 ++- .../account_banking_sdd_view.xml | 4 +- .../data/payment_type_sdd.xml | 2 +- .../wizard/export_sdd.py | 365 +++++++++++------- .../wizard/export_sdd_view.xml | 1 - 5 files changed, 252 insertions(+), 163 deletions(-) diff --git a/account_banking_sepa_direct_debit/account_banking_sdd.py b/account_banking_sepa_direct_debit/account_banking_sdd.py index 0a57ee839..ffbe8ee89 100644 --- a/account_banking_sepa_direct_debit/account_banking_sdd.py +++ b/account_banking_sepa_direct_debit/account_banking_sdd.py @@ -34,7 +34,12 @@ class banking_export_sdd(orm.Model): def _generate_filename(self, cr, uid, ids, name, arg, context=None): res = {} for sepa_file in self.browse(cr, uid, ids, context=context): - res[sepa_file.id] = 'sdd_%s.xml' % (sepa_file.payment_order_ids[0].reference and unidecode(sepa_file.payment_order_ids[0].reference.replace('/', '-')) or 'error') + ref = sepa_file.payment_order_ids[0].reference + if ref: + label = unidecode(ref.replace('/', '-')) + else: + label = 'error' + res[sepa_file.id] = 'sdd_%s.xml' % label return res _columns = { @@ -42,27 +47,27 @@ class banking_export_sdd(orm.Model): 'payment.order', 'account_payment_order_sdd_rel', 'banking_export_sepa_id', 'account_order_id', - 'Payment orders', + 'Payment Orders', readonly=True), 'requested_collec_date': fields.date( - 'Requested collection date', readonly=True), + 'Requested Collection Date', readonly=True), 'nb_transactions': fields.integer( - 'Number of transactions', readonly=True), + 'Number of Transactions', readonly=True), 'total_amount': fields.float( - 'Total amount', digits_compute=dp.get_precision('Account'), + 'Total Amount', digits_compute=dp.get_precision('Account'), readonly=True), 'batch_booking': fields.boolean( - 'Batch booking', readonly=True, + 'Batch Booking', readonly=True, help="If true, the bank statement will display only one credit line for all the direct debits of the SEPA XML file ; if false, the bank statement will display one credit line per direct debit of the SEPA XML file."), 'charge_bearer': fields.selection([ ('SHAR', 'Shared'), - ('CRED', 'Borne by creditor'), - ('DEBT', 'Borne by debtor'), - ('SLEV', 'Following service level'), - ], 'Charge bearer', readonly=True, + ('CRED', 'Borne by Creditor'), + ('DEBT', 'Borne by Debtor'), + ('SLEV', 'Following Service Level'), + ], 'Charge Bearer', readonly=True, help='Shared : transaction charges on the sender side are to be borne by the debtor, transaction charges on the receiver side are to be borne by the creditor (most transfers use this). Borne by creditor : all transaction charges are to be borne by the creditor. Borne by debtor : all transaction charges are to be borne by the debtor. Following service level : transaction charges are to be applied following the rules agreed in the service level and/or scheme.'), - 'generation_date': fields.datetime('Generation date', readonly=True), - 'file': fields.binary('SEPA XML file', readonly=True), + 'create_date': fields.datetime('Generation Date', readonly=True), + 'file': fields.binary('SEPA XML File', readonly=True), 'filename': fields.function( _generate_filename, type='char', size=256, string='Filename', readonly=True, store=True), @@ -74,7 +79,6 @@ class banking_export_sdd(orm.Model): } _defaults = { - 'generation_date': fields.date.context_today, 'state': 'draft', } @@ -117,10 +121,9 @@ class sdd_mandate(orm.Model): )] _defaults = { - 'company_id': lambda self, cr, uid, context: - self.pool['res.users'].browse(cr, uid, uid, context=context).\ - company_id.id, - 'unique_mandate_reference': lambda self, cr, uid, context: + 'company_id': lambda self, cr, uid, ctx: + self.pool['res.users'].browse(cr, uid, uid, ctx=ctx).company_id.id, + 'unique_mandate_reference': lambda self, cr, uid, ctx: self.pool['ir.sequence'].get(cr, uid, 'sdd.mandate.reference'), 'state': 'valid', } @@ -150,10 +153,12 @@ class payment_line(orm.Model): _('Error:'), _("Missing bank account on the payment line with SEPA Direct Debit Mandate '%s'.") % payline.sdd_mandate_id.unique_mandate_reference) - elif payline.sdd_mandate_id and payline.bank_id and payline.sdd_mandate_id.partner_bank_id != payline.bank_id.id: + elif (payline.sdd_mandate_id and payline.bank_id and + payline.sdd_mandate_id.partner_bank_id != + payline.bank_id.id): raise orm.except_orm( _('Error:'), - _("The SEPA Direct Debit Mandate '%s' is not related??")) + _("The SEPA Direct Debit Mandate '%s' is not related???")) return True # _constraints = [ diff --git a/account_banking_sepa_direct_debit/account_banking_sdd_view.xml b/account_banking_sepa_direct_debit/account_banking_sdd_view.xml index 8249da13e..db0b255a2 100644 --- a/account_banking_sepa_direct_debit/account_banking_sdd_view.xml +++ b/account_banking_sepa_direct_debit/account_banking_sdd_view.xml @@ -19,7 +19,7 @@ - + @@ -48,7 +48,7 @@ - + diff --git a/account_banking_sepa_direct_debit/data/payment_type_sdd.xml b/account_banking_sepa_direct_debit/data/payment_type_sdd.xml index 5ce4b5b1b..97e63d25e 100644 --- a/account_banking_sepa_direct_debit/data/payment_type_sdd.xml +++ b/account_banking_sepa_direct_debit/data/payment_type_sdd.xml @@ -5,7 +5,7 @@ - SEPA Direct Debit v02 + SEPA Direct Debit v02 (recommended) pain.008.001.02 diff --git a/account_banking_sepa_direct_debit/wizard/export_sdd.py b/account_banking_sepa_direct_debit/wizard/export_sdd.py index 0e935aa7f..df08915bd 100644 --- a/account_banking_sepa_direct_debit/wizard/export_sdd.py +++ b/account_banking_sepa_direct_debit/wizard/export_sdd.py @@ -23,6 +23,7 @@ from openerp.osv import orm, fields from openerp.tools.translate import _ +from openerp.tools.safe_eval import safe_eval from openerp import tools, netsvc import base64 from datetime import datetime, timedelta @@ -35,33 +36,41 @@ _logger = logging.getLogger(__name__) class banking_export_sdd_wizard(orm.TransientModel): _name = 'banking.export.sdd.wizard' - _description = 'Export SEPA Direct Debit XML file' + _description = 'Export SEPA Direct Debit File' _columns = { - 'state': fields.selection([('create', 'Create'), ('finish', 'Finish')], - 'State', readonly=True), - 'batch_booking': fields.boolean('Batch booking', + 'state': fields.selection([ + ('create', 'Create'), + ('finish', 'Finish'), + ], 'State', readonly=True), + 'batch_booking': fields.boolean( + 'Batch Booking', help="If true, the bank statement will display only one debit line for all the wire transfers of the SEPA XML file ; if false, the bank statement will display one debit line per wire transfer of the SEPA XML file."), - 'requested_collec_date': fields.date('Requested collection date', + 'requested_collec_date': fields.date( + 'Requested Collection Date', help='This is the date on which the collection should be made by the bank. Please keep in mind that banks only execute on working days.'), 'charge_bearer': fields.selection([ ('SHAR', 'Shared'), - ('CRED', 'Borne by creditor'), - ('DEBT', 'Borne by debtor'), - ('SLEV', 'Following service level'), - ], 'Charge bearer', required=True, + ('CRED', 'Borne by Creditor'), + ('DEBT', 'Borne by Debtor'), + ('SLEV', 'Following Service Level'), + ], 'Charge Bearer', required=True, help='Shared : transaction charges on the sender side are to be borne by the debtor, transaction charges on the receiver side are to be borne by the creditor (most transfers use this). Borne by creditor : all transaction charges are to be borne by the creditor. Borne by debtor : all transaction charges are to be borne by the debtor. Following service level : transaction charges are to be applied following the rules agreed in the service level and/or scheme.'), - 'nb_transactions': fields.related('file_id', 'nb_transactions', - type='integer', string='Number of transactions', readonly=True), - 'total_amount': fields.related('file_id', 'total_amount', type='float', - string='Total amount', readonly=True), - 'file_id': fields.many2one('banking.export.sdd', 'SDD XML file', readonly=True), - 'file': fields.related('file_id', 'file', string="File", type='binary', + 'nb_transactions': fields.related( + 'file_id', 'nb_transactions', type='integer', + string='Number of Transactions', readonly=True), + 'total_amount': fields.related( + 'file_id', 'total_amount', type='float', string='Total Amount', readonly=True), - 'filename': fields.related('file_id', 'filename', string="Filename", - type='char', size=256, readonly=True), - 'payment_order_ids': fields.many2many('payment.order', - 'wiz_sdd_payorders_rel', 'wizard_id', 'payment_order_id', - 'Payment orders', readonly=True), + 'file_id': fields.many2one( + 'banking.export.sdd', 'SDD XML File', readonly=True), + 'file': fields.related( + 'file_id', 'file', string="File", type='binary', readonly=True), + 'filename': fields.related( + 'file_id', 'filename', string="Filename", type='char', size=256, + readonly=True), + 'payment_order_ids': fields.many2many( + 'payment.order', 'wiz_sdd_payorders_rel', 'wizard_id', + 'payment_order_id', 'Payment Orders', readonly=True), } _defaults = { @@ -76,37 +85,94 @@ class banking_export_sdd_wizard(orm.TransientModel): if partner_bank_obj.is_iban_valid(cr, uid, iban, context=context): return iban.replace(' ', '') else: - raise orm.except_orm(_('Error:'), _("This IBAN is not valid : %s") % iban) + raise orm.except_orm( + _('Error:'), _("This IBAN is not valid : %s") % iban) def create(self, cr, uid, vals, context=None): payment_order_ids = context.get('active_ids', []) vals.update({ 'payment_order_ids': [[6, 0, payment_order_ids]], }) - return super(banking_export_sdd_wizard, self).create(cr, uid, - vals, context=context) + return super(banking_export_sdd_wizard, self).create( + cr, uid, vals, context=context) - def _prepare_field(self, cr, uid, field_name, field_value, max_size=0, sepa_export=False, line=False, sequence_type=False, context=None): + def _prepare_field( + self, cr, uid, field_name, field_value, max_size=0, + sepa_export=False, line=False, sequence_type=False, context=None): + '''This function is designed to be inherited !''' + eval_ctx = { + 'sepa_export': sepa_export, + 'line': line, + 'sequence_type': sequence_type, + } try: - # SEPA uses XML, and XML = UTF-8 with support for all characters... - # But we are dealing with banks + # SEPA uses XML ; XML = UTF-8 ; UTF-8 = support for all characters + # But we are dealing with banks... # and many banks don't want non-ASCCI characters ! # cf section 1.4 "Character set" of the SEPA Core Direct Debit - # Customer-to-bank implementation guidelines version 6.0 - value = unidecode(eval(field_value)) + # Customer-to-bank implementation guidelines + value = unidecode(safe_eval(field_value, eval_ctx)) except: if line: - raise orm.except_orm(_('Error:'), _("Cannot compute the '%s' of the Payment Line with Invoice Reference '%s'.") % (field_name, self.pool['account.invoice'].name_get(cr, uid, [line.ml_inv_ref.id], context=context)[0][1])) + raise orm.except_orm( + _('Error:'), + _("Cannot compute the '%s' of the Payment Line with Invoice Reference '%s'.") + % (field_name, self.pool['account.invoice'].name_get( + cr, uid, [line.ml_inv_ref.id], context=context)[0][1])) else: - raise orm.except_orm(_('Error:'), _("Cannot compute the '%s'.") % field_name) + raise orm.except_orm( + _('Error:'), + _("Cannot compute the '%s'.") % field_name) if not isinstance(value, (str, unicode)): - raise orm.except_orm(_('Field type error:'), _("The type of the field '%s' is %s. It should be a string or unicode.") % (field_name, type(value))) + raise orm.except_orm( + _('Field type error:'), + _("The type of the field '%s' is %s. It should be a string or unicode.") + % (field_name, type(value))) if not value: - raise orm.except_orm(_('Error:'), _("The '%s' is empty or 0. It should have a non-null value.") % field_name) + raise orm.except_orm( + _('Error:'), + _("The '%s' is empty or 0. It should have a non-null value.") + % field_name) if max_size and len(value) > max_size: value = value[0:max_size] return value + def _prepare_export_sepa( + self, cr, uid, sepa_export, total_amount, transactions_count, + xml_string, context=None): + return { + 'batch_booking': sepa_export.batch_booking, + 'charge_bearer': sepa_export.charge_bearer, + 'requested_collec_date': sepa_export.requested_collec_date, + 'total_amount': total_amount, + 'nb_transactions': transactions_count, + 'file': base64.encodestring(xml_string), + 'payment_order_ids': [ + (6, 0, [x.id for x in sepa_export.payment_order_ids]) + ], + } + + def _validate_xml(self, cr, uid, xml_string, pain_flavor): + xsd_etree_obj = etree.parse( + tools.file_open( + 'account_banking_sepa_direct_debit/data/%s.xsd' + % pain_flavor)) + official_pain_schema = etree.XMLSchema(xsd_etree_obj) + + try: + root_to_validate = etree.fromstring(xml_string) + official_pain_schema.assertValid(root_to_validate) + except Exception, e: + _logger.warning( + "The XML file is invalid against the XML Schema Definition") + _logger.warning(xml_string) + _logger.warning(e) + raise orm.except_orm( + _('Error:'), + _('The generated XML file is not valid against the official XML Schema Definition. The generated XML file and the full error have been written in the server logs. Here is the error, which may give you an idea on the cause of the problem : %s') + % str(e)) + return True + def create_sepa(self, cr, uid, ids, context=None): ''' Creates the SEPA Direct Debit file. That's the important code ! @@ -131,7 +197,8 @@ class banking_export_sdd_wizard(orm.TransientModel): if sepa_export.requested_collec_date: my_requested_collec_date = sepa_export.requested_collec_date else: - my_requested_collec_date = datetime.strftime(datetime.today() + timedelta(days=1), '%Y-%m-%d') + my_requested_collec_date = datetime.strftime( + datetime.today() + timedelta(days=1), '%Y-%m-%d') pain_ns = { 'xsi': 'http://www.w3.org/2001/XMLSchema-instance', @@ -141,19 +208,22 @@ class banking_export_sdd_wizard(orm.TransientModel): root = etree.Element('Document', nsmap=pain_ns) pain_root = etree.SubElement(root, root_xml_tag) - my_company_name = self._prepare_field(cr, uid, 'Company Name', - 'sepa_export.payment_order_ids[0].company_id.partner_id.name', - name_maxsize, sepa_export=sepa_export, context=context) + my_company_name = self._prepare_field( + cr, uid, 'Company Name', + 'sepa_export.payment_order_ids[0].company_id.partner_id.name', + name_maxsize, sepa_export=sepa_export, context=context) # A. Group header group_header_1_0 = etree.SubElement(pain_root, 'GrpHdr') - message_identification_1_1 = etree.SubElement(group_header_1_0, 'MsgId') - message_identification_1_1.text = self._prepare_field(cr, uid, - 'Message Identification', + message_identification_1_1 = etree.SubElement( + group_header_1_0, 'MsgId') + message_identification_1_1.text = self._prepare_field( + cr, uid, 'Message Identification', 'sepa_export.payment_order_ids[0].reference', 35, sepa_export=sepa_export, context=context) creation_date_time_1_2 = etree.SubElement(group_header_1_0, 'CreDtTm') - creation_date_time_1_2.text = datetime.strftime(datetime.today(), '%Y-%m-%dT%H:%M:%S') + creation_date_time_1_2.text = datetime.strftime( + datetime.today(), '%Y-%m-%dT%H:%M:%S') nb_of_transactions_1_6 = etree.SubElement(group_header_1_0, 'NbOfTxs') control_sum_1_7 = etree.SubElement(group_header_1_0, 'CtrlSum') initiating_party_1_8 = etree.SubElement(group_header_1_0, 'InitgPty') @@ -176,7 +246,7 @@ class banking_export_sdd_wizard(orm.TransientModel): _('Error:'), _("Missing SEPA Direct Debit mandate on the payment line with partner '%s' and Invoice ref '%s'.") % (line.partner_id.name, - line.ml_inv_ref.number)) + line.ml_inv_ref.number)) if line.sdd_mandate_id.state != 'valid': raise orm.except_orm( _('Error:'), @@ -190,7 +260,8 @@ class banking_export_sdd_wizard(orm.TransientModel): _("Missing signature date on SEPA Direct Debit mandate with reference '%s' for partner '%s'.") % (line.sdd_mandate_id.unique_mandate_reference, line.sdd_mandate_id.partner_id.name)) - elif line.sdd_mandate_id.signature_date > datetime.today().strftime('%Y-%m-%d'): + elif (line.sdd_mandate_id.signature_date > + datetime.today().strftime('%Y-%m-%d')): raise orm.except_orm( _('Error:'), _("The signature date on SEPA Direct Debit mandate with reference '%s' for partner '%s' is '%s', which is in the future !") @@ -206,11 +277,11 @@ class banking_export_sdd_wizard(orm.TransientModel): first_recur_lines['OOFF'] = [line] else: raise orm.except_orm( - _('Error:'), - _("The mandate with reference '%s' for partner '%s' has type set to 'One-Off' and it has a last debit date set to '%s', so we can't use it.") - % (line.sdd_mandate_id.unique_mandate_reference, - line.sdd_mandate_id.partner_id.name, - line.sdd_mandate_id.last_debit_date)) + _('Error:'), + _("The mandate with reference '%s' for partner '%s' has type set to 'One-Off' and it has a last debit date set to '%s', so we can't use it.") + % (line.sdd_mandate_id.unique_mandate_reference, + line.sdd_mandate_id.partner_id.name, + line.sdd_mandate_id.last_debit_date)) elif line.sdd_mandate_id.type == 'recurrent': if line.sdd_mandate_id.last_debit_date: if first_recur_lines.get('RCUR'): @@ -226,7 +297,8 @@ class banking_export_sdd_wizard(orm.TransientModel): for sequence_type, lines in first_recur_lines.items(): # B. Payment info payment_info_2_0 = etree.SubElement(pain_root, 'PmtInf') - payment_info_identification_2_1 = etree.SubElement(payment_info_2_0, 'PmtInfId') + payment_info_identification_2_1 = etree.SubElement( + payment_info_2_0, 'PmtInfId') payment_info_identification_2_1.text = self._prepare_field( cr, uid, 'Payment Information Identification', "sequence_type + '-' + sepa_export.payment_order_ids[0].reference", @@ -241,57 +313,73 @@ class banking_export_sdd_wizard(orm.TransientModel): # Implementation guidelines" v6.0 says that control sum # and nb_of_transactions should be present # at both "group header" level and "payment info" level - nb_of_transactions_2_4 = etree.SubElement(payment_info_2_0, 'NbOfTxs') + nb_of_transactions_2_4 = etree.SubElement( + payment_info_2_0, 'NbOfTxs') control_sum_2_5 = etree.SubElement(payment_info_2_0, 'CtrlSum') - payment_type_info_2_6 = etree.SubElement(payment_info_2_0, 'PmtTpInf') - service_level_2_8 = etree.SubElement(payment_type_info_2_6, 'SvcLvl') + payment_type_info_2_6 = etree.SubElement( + payment_info_2_0, 'PmtTpInf') + service_level_2_8 = etree.SubElement( + payment_type_info_2_6, 'SvcLvl') service_level_code_2_9 = etree.SubElement(service_level_2_8, 'Cd') service_level_code_2_9.text = 'SEPA' - local_instrument_2_11 = etree.SubElement(payment_type_info_2_6, 'LclInstrm') - local_instr_code_2_12 = etree.SubElement(local_instrument_2_11, 'Cd') + local_instrument_2_11 = etree.SubElement( + payment_type_info_2_6, 'LclInstrm') + local_instr_code_2_12 = etree.SubElement( + local_instrument_2_11, 'Cd') local_instr_code_2_12.text = 'CORE' # 2.14 Sequence Type MANDATORY # this message element must indicate ‘FRST # 'FRST' = First ; 'OOFF' = One Off ; 'RCUR' : Recurring # 'FNAL' = Final - sequence_type_2_14 = etree.SubElement(payment_type_info_2_6, 'SeqTp') + sequence_type_2_14 = etree.SubElement( + payment_type_info_2_6, 'SeqTp') sequence_type_2_14.text = sequence_type - requested_collec_date_2_18 = etree.SubElement(payment_info_2_0, 'ReqdColltnDt') + requested_collec_date_2_18 = etree.SubElement( + payment_info_2_0, 'ReqdColltnDt') requested_collec_date_2_18.text = my_requested_collec_date creditor_2_19 = etree.SubElement(payment_info_2_0, 'Cdtr') creditor_name = etree.SubElement(creditor_2_19, 'Nm') creditor_name.text = my_company_name - creditor_account_2_20 = etree.SubElement(payment_info_2_0, 'CdtrAcct') + creditor_account_2_20 = etree.SubElement( + payment_info_2_0, 'CdtrAcct') creditor_account_id = etree.SubElement(creditor_account_2_20, 'Id') - creditor_account_iban = etree.SubElement(creditor_account_id, 'IBAN') - creditor_account_iban.text = self._validate_iban(cr, uid, - self._prepare_field(cr, uid, 'Company IBAN', + creditor_account_iban = etree.SubElement( + creditor_account_id, 'IBAN') + creditor_account_iban.text = self._validate_iban( + cr, uid, self._prepare_field( + cr, uid, 'Company IBAN', 'sepa_export.payment_order_ids[0].mode.bank_id.acc_number', sepa_export=sepa_export, context=context), context=context) creditor_agent_2_21 = etree.SubElement(payment_info_2_0, 'CdtrAgt') - creditor_agent_institution = etree.SubElement(creditor_agent_2_21, 'FinInstnId') - creditor_agent_bic = etree.SubElement(creditor_agent_institution, bic_xml_tag) - creditor_agent_bic.text = self._prepare_field(cr, uid, 'Company BIC', + creditor_agent_institution = etree.SubElement( + creditor_agent_2_21, 'FinInstnId') + creditor_agent_bic = etree.SubElement( + creditor_agent_institution, bic_xml_tag) + creditor_agent_bic.text = self._prepare_field( + cr, uid, 'Company BIC', 'sepa_export.payment_order_ids[0].mode.bank_id.bank.bic', sepa_export=sepa_export, context=context) charge_bearer_2_24 = etree.SubElement(payment_info_2_0, 'ChrgBr') charge_bearer_2_24.text = sepa_export.charge_bearer - creditor_scheme_identification_2_27 = etree.SubElement(payment_info_2_0, 'CdtrSchmeId') - csi_id = etree.SubElement(creditor_scheme_identification_2_27, 'Id') + creditor_scheme_identification_2_27 = etree.SubElement( + payment_info_2_0, 'CdtrSchmeId') + csi_id = etree.SubElement( + creditor_scheme_identification_2_27, 'Id') csi_privateid = csi_id = etree.SubElement(csi_id, 'PrvtId') csi_other = etree.SubElement(csi_privateid, 'Othr') csi_other_id = etree.SubElement(csi_other, 'Id') - csi_other_id.text = self._prepare_field(cr, uid, - 'SEPA Creditor Identifier', + csi_other_id.text = self._prepare_field( + cr, uid, 'SEPA Creditor Identifier', 'sepa_export.payment_order_ids[0].company_id.sepa_creditor_identifier', sepa_export=sepa_export, context=context) csi_scheme_name = etree.SubElement(csi_other, 'SchmeNm') - csi_scheme_name_proprietary = etree.SubElement(csi_scheme_name, 'Prtry') + csi_scheme_name_proprietary = etree.SubElement( + csi_scheme_name, 'Prtry') csi_scheme_name_proprietary.text = 'SEPA' transactions_count_2_4 = 0 @@ -299,22 +387,29 @@ class banking_export_sdd_wizard(orm.TransientModel): for line in lines: transactions_count_2_4 += 1 # C. Direct Debit Transaction Info - dd_transaction_info_2_28 = etree.SubElement(payment_info_2_0, 'DrctDbtTxInf') - payment_identification_2_29 = etree.SubElement(dd_transaction_info_2_28, 'PmtId') - # Instruction identification (2.30) is not mandatory, so we don't use it - end2end_identification_2_31 = etree.SubElement(payment_identification_2_29, 'EndToEndId') - end2end_identification_2_31.text = self._prepare_field(cr, uid, - 'End to End Identification', 'line.name', 35, + dd_transaction_info_2_28 = etree.SubElement( + payment_info_2_0, 'DrctDbtTxInf') + payment_identification_2_29 = etree.SubElement( + dd_transaction_info_2_28, 'PmtId') + end2end_identification_2_31 = etree.SubElement( + payment_identification_2_29, 'EndToEndId') + end2end_identification_2_31.text = self._prepare_field( + cr, uid, 'End to End Identification', 'line.name', 35, line=line, context=context) - currency_name = self._prepare_field(cr, uid, 'Currency Code', - 'line.currency.name', 3, line=line, context=context) - instructed_amount_2_44 = etree.SubElement(dd_transaction_info_2_28, 'InstdAmt', Ccy=currency_name) + currency_name = self._prepare_field( + cr, uid, 'Currency Code', 'line.currency.name', 3, + line=line, context=context) + instructed_amount_2_44 = etree.SubElement( + dd_transaction_info_2_28, 'InstdAmt', Ccy=currency_name) instructed_amount_2_44.text = '%.2f' % line.amount_currency amount_control_sum_1_7 += line.amount_currency amount_control_sum_2_5 += line.amount_currency - dd_transaction_2_46 = etree.SubElement(dd_transaction_info_2_28, 'DrctDbtTx') - mandate_related_info_2_47 = etree.SubElement(dd_transaction_2_46, 'MndtRltdInf') - mandate_identification_2_48 = etree.SubElement(mandate_related_info_2_47, 'MndtId') + dd_transaction_2_46 = etree.SubElement( + dd_transaction_info_2_28, 'DrctDbtTx') + mandate_related_info_2_47 = etree.SubElement( + dd_transaction_2_46, 'MndtRltdInf') + mandate_identification_2_48 = etree.SubElement( + mandate_related_info_2_47, 'MndtId') mandate_identification_2_48.text = self._prepare_field( cr, uid, 'Unique Mandate Reference', 'line.sdd_mandate_id.unique_mandate_reference', @@ -327,81 +422,67 @@ class banking_export_sdd_wizard(orm.TransientModel): line=line, context=context) # TODO look at 2.50 "Amendment Indicator - debtor_agent_2_70 = etree.SubElement(dd_transaction_info_2_28, 'DbtrAgt') - debtor_agent_institution = etree.SubElement(debtor_agent_2_70, 'FinInstnId') - debtor_agent_bic = etree.SubElement(debtor_agent_institution, bic_xml_tag) - debtor_agent_bic.text = self._prepare_field(cr, uid, - 'Customer BIC', 'line.bank_id.bank.bic', + debtor_agent_2_70 = etree.SubElement( + dd_transaction_info_2_28, 'DbtrAgt') + debtor_agent_institution = etree.SubElement( + debtor_agent_2_70, 'FinInstnId') + debtor_agent_bic = etree.SubElement( + debtor_agent_institution, bic_xml_tag) + debtor_agent_bic.text = self._prepare_field( + cr, uid, 'Customer BIC', 'line.bank_id.bank.bic', line=line, context=context) - debtor_2_72 = etree.SubElement(dd_transaction_info_2_28, 'Dbtr') + debtor_2_72 = etree.SubElement( + dd_transaction_info_2_28, 'Dbtr') debtor_name = etree.SubElement(debtor_2_72, 'Nm') - debtor_name.text = self._prepare_field(cr, uid, - 'Customer Name', 'line.partner_id.name', + debtor_name.text = self._prepare_field( + cr, uid, 'Customer Name', 'line.partner_id.name', name_maxsize, line=line, context=context) - debtor_account_2_73 = etree.SubElement(dd_transaction_info_2_28, 'DbtrAcct') + debtor_account_2_73 = etree.SubElement( + dd_transaction_info_2_28, 'DbtrAcct') debtor_account_id = etree.SubElement(debtor_account_2_73, 'Id') - debtor_account_iban = etree.SubElement(debtor_account_id, 'IBAN') - debtor_account_iban.text = self._validate_iban(cr, uid, - self._prepare_field(cr, uid, 'Customer IBAN', + debtor_account_iban = etree.SubElement( + debtor_account_id, 'IBAN') + debtor_account_iban.text = self._validate_iban( + cr, uid, self._prepare_field( + cr, uid, 'Customer IBAN', 'line.bank_id.acc_number', line=line, - context=context), - context=context) - remittance_info_2_88 = etree.SubElement(dd_transaction_info_2_28, 'RmtInf') + context=context), + context=context) + remittance_info_2_88 = etree.SubElement( + dd_transaction_info_2_28, 'RmtInf') # switch to Structured (Strdr) ? If we do it, beware that the format is not the same between pain 02 and pain 03 - remittance_info_unstructured_2_89 = etree.SubElement(remittance_info_2_88, 'Ustrd') - remittance_info_unstructured_2_89.text = self._prepare_field(cr, uid, - 'Remittance Information', 'line.communication', + remittance_info_unstructured_2_89 = etree.SubElement( + remittance_info_2_88, 'Ustrd') + remittance_info_unstructured_2_89.text = self._prepare_field( + cr, uid, 'Remittance Information', 'line.communication', 140, line=line, context=context) nb_of_transactions_2_4.text = str(transactions_count_2_4) control_sum_2_5.text = '%.2f' % amount_control_sum_2_5 nb_of_transactions_1_6.text = str(transactions_count_1_6) control_sum_1_7.text = '%.2f' % amount_control_sum_1_7 - - xml_string = etree.tostring(root, pretty_print=True, encoding='UTF-8', xml_declaration=True) - _logger.debug("Generated SDD XML file in format %s below" % pain_flavor) + xml_string = etree.tostring( + root, pretty_print=True, encoding='UTF-8', xml_declaration=True) + _logger.debug( + "Generated SDD XML file in format %s below" % pain_flavor) _logger.debug(xml_string) - xsd_etree_obj = etree.parse(tools.file_open('account_banking_sepa_direct_debit/data/%s.xsd' % pain_flavor)) - official_pain_schema = etree.XMLSchema(xsd_etree_obj) - _logger.debug("Printing %s XML Schema definition:" % pain_flavor) - _logger.debug(etree.tostring(xsd_etree_obj, pretty_print=True, encoding='UTF-8', xml_declaration=True)) - - try: - # If I do official_pain_schema.assertValid(root), then I get this - # error msg in the exception : - # The generated XML file is not valid against the official XML Schema Definition. The generated XML file and the full error have been written in the server logs. Here is the error, which may give you an idea on the cause of the problem : Element 'Document': No matching global declaration available for the validation root. - # So I re-import the SEPA XML from the string, and give this - # so validation - # If you know how I can avoid that, please tell me -- Alexis - root_to_validate = etree.fromstring(xml_string) - official_pain_schema.assertValid(root_to_validate) - except Exception, e: - _logger.warning("The XML file is invalid against the XML Schema Definition") - _logger.warning(xml_string) - _logger.warning(e) - raise orm.except_orm(_('Error:'), _('The generated XML file is not valid against the official XML Schema Definition. The generated XML file and the full error have been written in the server logs. Here is the error, which may give you an idea on the cause of the problem : %s') % str(e)) + self._validate_xml(cr, uid, xml_string, pain_flavor) # CREATE the banking.export.sepa record - file_id = self.pool.get('banking.export.sdd').create(cr, uid, - { - 'batch_booking': sepa_export.batch_booking, - 'charge_bearer': sepa_export.charge_bearer, - 'requested_collec_date': sepa_export.requested_collec_date, - 'total_amount': total_amount, - 'nb_transactions': transactions_count_1_6, - 'file': base64.encodestring(xml_string), - 'payment_order_ids': [ - (6, 0, [x.id for x in sepa_export.payment_order_ids]) - ], - }, context=context) + file_id = self.pool.get('banking.export.sdd').create( + cr, uid, self._prepare_export_sepa( + cr, uid, sepa_export, total_amount, transactions_count_1_6, + xml_string, context=context), + context=context) - self.write(cr, uid, ids, { - 'file_id': file_id, - 'state': 'finish', + self.write( + cr, uid, ids, { + 'file_id': file_id, + 'state': 'finish', }, context=context) action = { - 'name': 'SEPA Direct Debit XML', + 'name': 'SEPA Direct Debit File', 'type': 'ir.actions.act_window', 'view_type': 'form', 'view_mode': 'form,tree', @@ -422,12 +503,14 @@ class banking_export_sdd_wizard(orm.TransientModel): def save_sepa(self, cr, uid, ids, context=None): ''' - Save the SEPA Direct Debit file: mark all payments in the file as 'sent'. - Write 'last debit date' on mandate and set oneoff mandate to expired + Save the SEPA Direct Debit file: mark all payments in the file + as 'sent'. Write 'last debit date' on mandate and set oneoff + mandate to expired ''' sepa_export = self.browse(cr, uid, ids[0], context=context) - self.pool.get('banking.export.sdd').write(cr, uid, - sepa_export.file_id.id, {'state': 'sent'}, context=context) + self.pool.get('banking.export.sdd').write( + cr, uid, sepa_export.file_id.id, {'state': 'sent'}, + context=context) wf_service = netsvc.LocalService('workflow') for order in sepa_export.payment_order_ids: wf_service.trg_validate(uid, 'payment.order', order.id, 'done', cr) @@ -437,7 +520,9 @@ class banking_export_sdd_wizard(orm.TransientModel): 'last_debit_date': datetime.today().strftime('%Y-%m-%d') }, context=context) - oneoff_mandate_ids = [line.sdd_mandate_id.id for line in order.line_ids if line.sdd_mandate_id.type == 'oneoff'] + oneoff_mandate_ids = \ + [line.sdd_mandate_id.id for line in order.line_ids + if line.sdd_mandate_id.type == 'oneoff'] self.pool['sdd.mandate'].write( cr, uid, oneoff_mandate_ids, {'state': 'expired'}, context=context) diff --git a/account_banking_sepa_direct_debit/wizard/export_sdd_view.xml b/account_banking_sepa_direct_debit/wizard/export_sdd_view.xml index 4afa6bb01..c1b8a77c2 100644 --- a/account_banking_sepa_direct_debit/wizard/export_sdd_view.xml +++ b/account_banking_sepa_direct_debit/wizard/export_sdd_view.xml @@ -14,7 +14,6 @@ - From 2144be640848b765ce7c1bf491571d3ce242f867 Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Thu, 7 Nov 2013 12:57:26 +0100 Subject: [PATCH 007/118] FIX payment_order_type : payment -> debit --- account_banking_sepa_direct_debit/data/payment_type_sdd.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/account_banking_sepa_direct_debit/data/payment_type_sdd.xml b/account_banking_sepa_direct_debit/data/payment_type_sdd.xml index 97e63d25e..fcc742531 100644 --- a/account_banking_sepa_direct_debit/data/payment_type_sdd.xml +++ b/account_banking_sepa_direct_debit/data/payment_type_sdd.xml @@ -10,7 +10,7 @@ - payment + debit @@ -19,7 +19,7 @@ - payment + debit @@ -28,7 +28,7 @@ - payment + debit From d8245177e203c98616e027ce8f506fe5e9a440bb Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Thu, 7 Nov 2013 23:22:19 +0100 Subject: [PATCH 008/118] More work on mandates : - constraints - display related payment lines - set mandates to expired after 36 months of inactivity (via a cron) - add tracking/chatter - add default draft state + validate button [FIX] In Debit mode, don't use the partner_bank_id of the customer invoice ! In the wizard 'Select invoices to pay', add maturity date in the view of the account move lines --- .../__openerp__.py | 1 + .../account_banking_sdd.py | 140 ++++++++++++++---- .../account_banking_sdd_view.xml | 59 ++++++-- .../mandate_expire_cron.xml | 26 ++++ 4 files changed, 189 insertions(+), 37 deletions(-) create mode 100644 account_banking_sepa_direct_debit/mandate_expire_cron.xml diff --git a/account_banking_sepa_direct_debit/__openerp__.py b/account_banking_sepa_direct_debit/__openerp__.py index 8c6a69ef5..e02e72914 100644 --- a/account_banking_sepa_direct_debit/__openerp__.py +++ b/account_banking_sepa_direct_debit/__openerp__.py @@ -34,6 +34,7 @@ 'account_banking_sdd_view.xml', 'account_payment_view.xml', 'company_view.xml', + 'mandate_expire_cron.xml', 'wizard/export_sdd_view.xml', 'data/payment_type_sdd.xml', 'data/mandate_reference_sequence.xml', diff --git a/account_banking_sepa_direct_debit/account_banking_sdd.py b/account_banking_sepa_direct_debit/account_banking_sdd.py index ffbe8ee89..33b7d1bd1 100644 --- a/account_banking_sepa_direct_debit/account_banking_sdd.py +++ b/account_banking_sepa_direct_debit/account_banking_sdd.py @@ -23,6 +23,13 @@ from openerp.osv import orm, fields from openerp.tools.translate import _ from openerp.addons.decimal_precision import decimal_precision as dp from unidecode import unidecode +from datetime import datetime +from dateutil.relativedelta import relativedelta +import logging + +NUMBER_OF_UNUSED_MONTHS_BEFORE_EXPIRY = 36 + +logger = logging.getLogger(__name__) class banking_export_sdd(orm.Model): @@ -88,7 +95,16 @@ class sdd_mandate(orm.Model): _name = 'sdd.mandate' _description = __doc__ _rec_name = 'unique_mandate_reference' + _inherit = ['mail.thread'] _order = 'signature_date desc' + _track = { + 'state': { + 'account_banking_sepa_direct_debit.mandate_valid': + lambda self, cr, uid, obj, ctx=None: obj['state'] == 'valid', + 'account_banking_sepa_direct_debit.mandate_expired': + lambda self, cr, uid, obj, ctx=None: obj['state'] == 'expired', + } + } _columns = { 'partner_bank_id': fields.many2one('res.partner.bank', 'Bank Account'), @@ -108,25 +124,98 @@ class sdd_mandate(orm.Model): 'Date of the Last Debit', help="For recurrent mandates, this field is used to know if the SDD will be of type 'First' or 'Recurring'. For one-off mandates, this field is used to know if the SDD has already been used or not."), 'state': fields.selection([ + ('draft', 'Draft'), ('valid', 'Valid'), ('expired', 'Expired'), + # Do we have to handle cancellation of mandate by customer ? ], 'Mandate Status', help="For a recurrent mandate, this field indicate if the mandate is still valid or if it has expired (a recurrent mandate expires if it's not used during 36 months). For a one-off mandate, it expires after its first use."), + 'payment_line_ids': fields.one2many( + 'payment.line', 'sdd_mandate_id', "Related Payment Lines"), } + _defaults = { + 'company_id': lambda self, cr, uid, context: + self.pool['res.company'].\ + _company_default_get(cr, uid, 'sdd.mandate', context=context), + 'unique_mandate_reference': lambda self, cr, uid, ctx: + self.pool['ir.sequence'].get(cr, uid, 'sdd.mandate.reference'), + 'state': 'draft', + } + _sql_constraints = [( 'mandate_ref_company_uniq', 'unique(unique_mandate_reference, company_id)', 'A Mandate with the same reference already exists for this company !' )] - _defaults = { - 'company_id': lambda self, cr, uid, ctx: - self.pool['res.users'].browse(cr, uid, uid, ctx=ctx).company_id.id, - 'unique_mandate_reference': lambda self, cr, uid, ctx: - self.pool['ir.sequence'].get(cr, uid, 'sdd.mandate.reference'), - 'state': 'valid', - } + def _check_sdd_mandate(self, cr, uid, ids, context=None): + for mandate in self.read(cr, uid, ids, [ + 'last_debit_date', 'signature_date', + 'unique_mandate_reference', 'state', 'partner_bank_id' + ], context=context): + if (mandate['signature_date'] and + mandate['signature_date'] > + datetime.today().strftime('%Y-%m-%d')): + raise orm.except_orm( + _('Error:'), + _("The date of signature of mandate '%s' is in the future!") + % mandate['unique_mandate_reference']) + if mandate['state'] == 'valid' and not mandate['signature_date']: + raise orm.except_orm( + _('Error:'), + _("Cannot validate the mandate '%s' without a date of signature.") + % mandate['unique_mandate_reference']) + if mandate['state'] == 'valid' and not mandate['partner_bank_id']: + raise orm.except_orm( + _('Error:'), + _("Cannot validate the mandate '%s' because it is not linked to a bank account.") + % mandate['unique_mandate_reference']) + + if (mandate['signature_date'] and mandate['last_debit_date'] and + mandate['signature_date'] > mandate['last_debit_date']): + raise orm.except_orm( + _('Error:'), + _("The mandate '%s' can't have a date of last debit before the date of signature.") + % mandate['unique_mandate_reference']) + return True + + _constraints = [ + (_check_sdd_mandate, "Error msg in raise", + ['last_debit_date', 'signature_date', 'state', 'partner_bank_id']), + ] + + def validate(self, cr, uid, ids, context=None): + to_validate_ids = [] + for mandate in self.browse(cr, uid, ids, context=context): + assert mandate.state == 'draft', 'Mandate should be in draft state' + to_validate_ids.append(mandate.id) + self.write( + cr, uid, to_validate_ids, {'state': 'valid'}, context=context) + return True + + def _sdd_mandate_set_state_to_expired(self, cr, uid, context=None): + logger.info('Searching for SDD Mandates that must be set to Expired') + expire_limit_date = datetime.today() + \ + relativedelta(months=-NUMBER_OF_UNUSED_MONTHS_BEFORE_EXPIRY) + expire_limit_date_str = expire_limit_date.strftime('%Y-%m-%d') + expired_mandate_ids = self.search(cr, uid, [ + '|', + ('last_debit_date', '=', False), + ('last_debit_date', '<=', expire_limit_date_str), + ('state', '=', 'valid'), + ('signature_date', '<=', expire_limit_date_str), + ], context=context) + if expired_mandate_ids: + self.write( + cr, uid, expired_mandate_ids, {'state': 'expired'}, + context=context) + logger.info( + 'The following SDD Mandate IDs has been set to expired: %s' + % expired_mandate_ids) + else: + logger.info('0 SDD Mandates must be set to Expired') + return True class res_partner_bank(orm.Model): @@ -146,23 +235,20 @@ class payment_line(orm.Model): 'sdd.mandate', 'SEPA Direct Debit Mandate'), } - def _check_sdd_mandate(self, cr, uid, ids): - for payline in self.browse(cr, uid, ids): - if payline.sdd_mandate_id and not payline.bank_id: - raise orm.except_orm( - _('Error:'), - _("Missing bank account on the payment line with SEPA Direct Debit Mandate '%s'.") - % payline.sdd_mandate_id.unique_mandate_reference) - elif (payline.sdd_mandate_id and payline.bank_id and - payline.sdd_mandate_id.partner_bank_id != - payline.bank_id.id): - raise orm.except_orm( - _('Error:'), - _("The SEPA Direct Debit Mandate '%s' is not related???")) - return True - -# _constraints = [ -# (_check_sdd_mandate, "Mandate must be attached to bank account", ['bank_id', 'sdd_mandate_id']), -# ] - - # TODO inherit create to select the first mandate ?? + def create(self, cr, uid, vals, context=None): + '''Take the first valid mandate of the bank account by default''' + if context is None: + context = {} + if not vals: + vals = {} + partner_bank_id = vals.get('bank_id') + if (context.get('default_payment_order_type') == 'debit' + and partner_bank_id + and 'sdd_mandate_id' not in vals): + mandate_ids = self.pool['sdd.mandate'].search(cr, uid, [ + ('partner_bank_id', '=', partner_bank_id), + ('state', '=', 'valid'), + ], context=context) + if mandate_ids: + vals['sdd_mandate_id'] = mandate_ids[0] + return super(payment_line, self).create(cr, uid, vals, context=context) diff --git a/account_banking_sepa_direct_debit/account_banking_sdd_view.xml b/account_banking_sepa_direct_debit/account_banking_sdd_view.xml index db0b255a2..5f191e693 100644 --- a/account_banking_sepa_direct_debit/account_banking_sdd_view.xml +++ b/account_banking_sepa_direct_debit/account_banking_sdd_view.xml @@ -56,7 +56,7 @@ - Generated SEPA Direct Debit XML files + Generated SEPA Direct Debit Files banking.export.sdd form tree,form @@ -66,11 +66,11 @@
+

-

- + - + - + + + +
+
+ + +
@@ -111,9 +118,9 @@ sdd.mandate.tree sdd.mandate - + - + @@ -123,8 +130,23 @@ + + sdd.mandate.search + sdd.mandate + + + + + + + + + + + + - SEPA Direct Debit Mandate + SEPA Direct Debit Mandates sdd.mandate form tree,form @@ -144,6 +166,23 @@ sequence="20" /> + + + Mandate Validated + sdd.mandate + + SEPA Direct Debit Mandate Validated + + + + Mandate Expired + sdd.mandate + + SEPA Direct Debit Mandate has Expired + + + + sdd.mandate.res.partner.bank.form res.partner.bank diff --git a/account_banking_sepa_direct_debit/mandate_expire_cron.xml b/account_banking_sepa_direct_debit/mandate_expire_cron.xml new file mode 100644 index 000000000..4cb0693d2 --- /dev/null +++ b/account_banking_sepa_direct_debit/mandate_expire_cron.xml @@ -0,0 +1,26 @@ + + + + + + + + + Set SEPA Direct Debit Mandates to Expired + + + 1 + days + -1 + + + + + + + + From 1c7c1069d2e8b7e0d031404046c1ae2b3a0ffdff Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Sat, 9 Nov 2013 15:05:07 +0100 Subject: [PATCH 009/118] Add the ability to cancel a mandate. Add a field "SDD Mandate" on the customer invoice, to handle the scenario where one customer has multiple mandates with the company. --- .../__openerp__.py | 1 + .../account_banking_sdd.py | 58 +++++++++++++++---- .../account_banking_sdd_view.xml | 9 ++- .../account_invoice_view.xml | 22 +++++++ 4 files changed, 78 insertions(+), 12 deletions(-) create mode 100644 account_banking_sepa_direct_debit/account_invoice_view.xml diff --git a/account_banking_sepa_direct_debit/__openerp__.py b/account_banking_sepa_direct_debit/__openerp__.py index e02e72914..30aef6211 100644 --- a/account_banking_sepa_direct_debit/__openerp__.py +++ b/account_banking_sepa_direct_debit/__openerp__.py @@ -35,6 +35,7 @@ 'account_payment_view.xml', 'company_view.xml', 'mandate_expire_cron.xml', + 'account_invoice_view.xml', 'wizard/export_sdd_view.xml', 'data/payment_type_sdd.xml', 'data/mandate_reference_sequence.xml', diff --git a/account_banking_sepa_direct_debit/account_banking_sdd.py b/account_banking_sepa_direct_debit/account_banking_sdd.py index 33b7d1bd1..dc42188d0 100644 --- a/account_banking_sepa_direct_debit/account_banking_sdd.py +++ b/account_banking_sepa_direct_debit/account_banking_sdd.py @@ -103,6 +103,8 @@ class sdd_mandate(orm.Model): lambda self, cr, uid, obj, ctx=None: obj['state'] == 'valid', 'account_banking_sepa_direct_debit.mandate_expired': lambda self, cr, uid, obj, ctx=None: obj['state'] == 'expired', + 'account_banking_sepa_direct_debit.mandate_cancel': + lambda self, cr, uid, obj, ctx=None: obj['state'] == 'cancel', } } @@ -127,9 +129,9 @@ class sdd_mandate(orm.Model): ('draft', 'Draft'), ('valid', 'Valid'), ('expired', 'Expired'), - # Do we have to handle cancellation of mandate by customer ? + ('cancel', 'Cancelled'), ], 'Mandate Status', - help="For a recurrent mandate, this field indicate if the mandate is still valid or if it has expired (a recurrent mandate expires if it's not used during 36 months). For a one-off mandate, it expires after its first use."), + help="For a recurrent mandate, this field indicate if the mandate is still valid or if it has expired (a recurrent mandate expires if it's not used during 36 months). For a one-off mandate, it expires after its first use."), # TODO : update help 'payment_line_ids': fields.one2many( 'payment.line', 'sdd_mandate_id', "Related Payment Lines"), } @@ -194,6 +196,16 @@ class sdd_mandate(orm.Model): cr, uid, to_validate_ids, {'state': 'valid'}, context=context) return True + def cancel(self, cr, uid, ids, context=None): + to_cancel_ids = [] + for mandate in self.browse(cr, uid, ids, context=context): + assert mandate.state in ('draft', 'valid'),\ + 'Mandate should be in draft or valid state' + to_cancel_ids.append(mandate.id) + self.write( + cr, uid, to_cancel_ids, {'state': 'cancel'}, context=context) + return True + def _sdd_mandate_set_state_to_expired(self, cr, uid, context=None): logger.info('Searching for SDD Mandates that must be set to Expired') expire_limit_date = datetime.today() + \ @@ -232,23 +244,47 @@ class payment_line(orm.Model): _columns = { 'sdd_mandate_id': fields.many2one( - 'sdd.mandate', 'SEPA Direct Debit Mandate'), + 'sdd.mandate', 'SEPA Direct Debit Mandate', + domain=[('state', '=', 'valid')]), } def create(self, cr, uid, vals, context=None): - '''Take the first valid mandate of the bank account by default''' + '''If the customer invoice has a mandate, take it + otherwise, take the first valid mandate of the bank account''' if context is None: context = {} if not vals: vals = {} partner_bank_id = vals.get('bank_id') + move_line_id = vals.get('move_line_id') if (context.get('default_payment_order_type') == 'debit' - and partner_bank_id and 'sdd_mandate_id' not in vals): - mandate_ids = self.pool['sdd.mandate'].search(cr, uid, [ - ('partner_bank_id', '=', partner_bank_id), - ('state', '=', 'valid'), - ], context=context) - if mandate_ids: - vals['sdd_mandate_id'] = mandate_ids[0] + if move_line_id: + line = self.pool['account.move.line'].browse( + cr, uid, move_line_id, context=context) + if (line.invoice and line.invoice.type == 'out_invoice' + and line.invoice.sdd_mandate_id): + vals.update({ + 'sdd_mandate_id': line.invoice.sdd_mandate_id.id, + 'bank_id': + line.invoice.sdd_mandate_id.partner_bank_id.id, + }) + if partner_bank_id and 'sdd_mandate_id' not in vals: + mandate_ids = self.pool['sdd.mandate'].search(cr, uid, [ + ('partner_bank_id', '=', partner_bank_id), + ('state', '=', 'valid'), + ], context=context) + if mandate_ids: + vals['sdd_mandate_id'] = mandate_ids[0] return super(payment_line, self).create(cr, uid, vals, context=context) + + +class account_invoice(orm.Model): + _inherit = 'account.invoice' + + _columns = { + 'sdd_mandate_id': fields.many2one( + 'sdd.mandate', 'SEPA Direct Debit Mandate', + domain=[('state', '=', 'valid')], readonly=True, + states={'draft': [('readonly', False)]}) + } diff --git a/account_banking_sepa_direct_debit/account_banking_sdd_view.xml b/account_banking_sepa_direct_debit/account_banking_sdd_view.xml index 5f191e693..5bb77ecf0 100644 --- a/account_banking_sepa_direct_debit/account_banking_sdd_view.xml +++ b/account_banking_sepa_direct_debit/account_banking_sdd_view.xml @@ -85,6 +85,7 @@
@@ -166,7 +167,7 @@ sequence="20" /> - + Mandate Validated sdd.mandate @@ -181,6 +182,12 @@ SEPA Direct Debit Mandate has Expired + + Mandate Cancelled + sdd.mandate + + SEPA Direct Debit Mandate Cancelled + diff --git a/account_banking_sepa_direct_debit/account_invoice_view.xml b/account_banking_sepa_direct_debit/account_invoice_view.xml new file mode 100644 index 000000000..2ca480e54 --- /dev/null +++ b/account_banking_sepa_direct_debit/account_invoice_view.xml @@ -0,0 +1,22 @@ + + + + + + + add.sdd.mandate.on.customer.invoice.form + account.invoice + + + + + + + + + + From 90c3dc1ab93a94060af377e25e65cc35679253a9 Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Mon, 11 Nov 2013 02:10:35 +0100 Subject: [PATCH 010/118] New field "recurrent_sequence_type" on mandate with tracking. The field "last_debit_date" is not used to compute the sequence type any more. When the bank account changes, the sequence type is set back to first FIX xml_id of expired mandate mail.message.subtype --- .../account_banking_sdd.py | 63 ++++++++++++++++--- .../account_banking_sdd_view.xml | 33 ++++++++-- .../wizard/export_sdd.py | 57 ++++++++++------- 3 files changed, 117 insertions(+), 36 deletions(-) diff --git a/account_banking_sepa_direct_debit/account_banking_sdd.py b/account_banking_sepa_direct_debit/account_banking_sdd.py index dc42188d0..bfe49d544 100644 --- a/account_banking_sepa_direct_debit/account_banking_sdd.py +++ b/account_banking_sepa_direct_debit/account_banking_sdd.py @@ -105,6 +105,17 @@ class sdd_mandate(orm.Model): lambda self, cr, uid, obj, ctx=None: obj['state'] == 'expired', 'account_banking_sepa_direct_debit.mandate_cancel': lambda self, cr, uid, obj, ctx=None: obj['state'] == 'cancel', + }, + 'recurrent_sequence_type': { + 'account_banking_sepa_direct_debit.recurrent_sequence_type_first': + lambda self, cr, uid, obj, ctx=None: + obj['recurrent_sequence_type'] == 'first', + 'account_banking_sepa_direct_debit.recurrent_sequence_type_recurring': + lambda self, cr, uid, obj, ctx=None: + obj['recurrent_sequence_type'] == 'recurring', + 'account_banking_sepa_direct_debit.recurrent_sequence_type_final': + lambda self, cr, uid, obj, ctx=None: + obj['recurrent_sequence_type'] == 'final', } } @@ -120,17 +131,22 @@ class sdd_mandate(orm.Model): ('recurrent', 'Recurrent'), ('oneoff', 'One-Off'), ], 'Type of Mandate', required=True), + 'recurrent_sequence_type': fields.selection([ + ('first', 'First'), + ('recurring', 'Recurring'), + ('final', 'Final'), + ], 'Sequence Type for Next Debit', + help="This field is only used for Recurrent mandates, not for One-Off mandates."), 'signature_date': fields.date('Date of Signature of the Mandate'), 'scan': fields.binary('Scan of the mandate'), 'last_debit_date': fields.date( - 'Date of the Last Debit', - help="For recurrent mandates, this field is used to know if the SDD will be of type 'First' or 'Recurring'. For one-off mandates, this field is used to know if the SDD has already been used or not."), + 'Date of the Last Debit', readonly=True), 'state': fields.selection([ ('draft', 'Draft'), ('valid', 'Valid'), ('expired', 'Expired'), ('cancel', 'Cancelled'), - ], 'Mandate Status', + ], 'Status', help="For a recurrent mandate, this field indicate if the mandate is still valid or if it has expired (a recurrent mandate expires if it's not used during 36 months). For a one-off mandate, it expires after its first use."), # TODO : update help 'payment_line_ids': fields.one2many( 'payment.line', 'sdd_mandate_id', "Related Payment Lines"), @@ -154,7 +170,8 @@ class sdd_mandate(orm.Model): def _check_sdd_mandate(self, cr, uid, ids, context=None): for mandate in self.read(cr, uid, ids, [ 'last_debit_date', 'signature_date', - 'unique_mandate_reference', 'state', 'partner_bank_id' + 'unique_mandate_reference', 'state', 'partner_bank_id', + 'type', 'recurrent_sequence_type', ], context=context): if (mandate['signature_date'] and mandate['signature_date'] > @@ -171,7 +188,7 @@ class sdd_mandate(orm.Model): if mandate['state'] == 'valid' and not mandate['partner_bank_id']: raise orm.except_orm( _('Error:'), - _("Cannot validate the mandate '%s' because it is not linked to a bank account.") + _("Cannot validate the mandate '%s' because it is not attached to a bank account.") % mandate['unique_mandate_reference']) if (mandate['signature_date'] and mandate['last_debit_date'] and @@ -180,13 +197,45 @@ class sdd_mandate(orm.Model): _('Error:'), _("The mandate '%s' can't have a date of last debit before the date of signature.") % mandate['unique_mandate_reference']) + if (mandate['type'] == 'recurrent' + and not mandate['recurrent_sequence_type']): + raise orm.except_orm( + _('Error:'), + _("The recurrent mandate '%s' must have a sequence type.") + % mandate['unique_mandate_reference']) return True _constraints = [ - (_check_sdd_mandate, "Error msg in raise", - ['last_debit_date', 'signature_date', 'state', 'partner_bank_id']), + (_check_sdd_mandate, "Error msg in raise", [ + 'last_debit_date', 'signature_date', 'state', 'partner_bank_id', + 'type', 'recurrent_sequence_type', + ]), ] + def mandate_type_change(self, cr, uid, ids, type): + if type == 'recurrent': + recurrent_sequence_type = 'first' + else: + recurrent_sequence_type = False + res = {'value': {'recurrent_sequence_type': recurrent_sequence_type}} + return res + + def mandate_partner_bank_change( + self, cr, uid, ids, partner_bank_id, type, recurrent_sequence_type, + last_debit_date, state): + if (state == 'valid' and partner_bank_id + and type == 'recurrent' + and recurrent_sequence_type != 'first'): + return { + 'value': {'recurrent_sequence_type': first}, + 'warning': { + 'title': _('Mandate update'), + 'message': _("As you changed the bank account attached to this mandate, the 'Sequence Type' has been set back to 'First'."), + } + } + else: + return True + def validate(self, cr, uid, ids, context=None): to_validate_ids = [] for mandate in self.browse(cr, uid, ids, context=context): diff --git a/account_banking_sepa_direct_debit/account_banking_sdd_view.xml b/account_banking_sepa_direct_debit/account_banking_sdd_view.xml index 5bb77ecf0..54a5a6669 100644 --- a/account_banking_sepa_direct_debit/account_banking_sdd_view.xml +++ b/account_banking_sepa_direct_debit/account_banking_sdd_view.xml @@ -97,11 +97,12 @@ - + + - + @@ -119,14 +120,14 @@ sdd.mandate.tree sdd.mandate - + - + @@ -139,6 +140,7 @@ + @@ -175,7 +177,7 @@ SEPA Direct Debit Mandate Validated - + Mandate Expired sdd.mandate @@ -189,6 +191,27 @@ SEPA Direct Debit Mandate Cancelled + + Sequence Type set to First + sdd.mandate + + Sequence Type set to First + + + + Sequence Type set to Recurring + sdd.mandate + + Sequence Type set to Recurring + + + + Sequence Type set to Final + sdd.mandate + + Sequence Type set to Final + + sdd.mandate.res.partner.bank.form diff --git a/account_banking_sepa_direct_debit/wizard/export_sdd.py b/account_banking_sepa_direct_debit/wizard/export_sdd.py index df08915bd..60dda58fe 100644 --- a/account_banking_sepa_direct_debit/wizard/export_sdd.py +++ b/account_banking_sepa_direct_debit/wizard/export_sdd.py @@ -233,7 +233,7 @@ class banking_export_sdd_wizard(orm.TransientModel): transactions_count_1_6 = 0 total_amount = 0.0 amount_control_sum_1_7 = 0.0 - first_recur_lines = {} + lines_per_seq_type = {} # key = sequence type ; value = list of lines as objects # Iterate on payment orders for payment_order in sepa_export.payment_order_ids: @@ -253,7 +253,6 @@ class banking_export_sdd_wizard(orm.TransientModel): _("The SEPA Direct Debit mandate with reference '%s' for partner '%s' has expired.") % (line.sdd_mandate_id.unique_mandate_reference, line.sdd_mandate_id.partner_id.name)) - if not line.sdd_mandate_id.signature_date: raise orm.except_orm( _('Error:'), @@ -268,13 +267,12 @@ class banking_export_sdd_wizard(orm.TransientModel): % (line.sdd_mandate_id.unique_mandate_reference, line.sdd_mandate_id.partner_id.name, line.sdd_mandate_id.signature_date)) - if line.sdd_mandate_id.type == 'oneoff': if not line.sdd_mandate_id.last_debit_date: - if first_recur_lines.get('OOFF'): - first_recur_lines['OOFF'].append(line) + if lines_per_seq_type.get('OOFF'): + lines_per_seq_type['OOFF'].append(line) else: - first_recur_lines['OOFF'] = [line] + lines_per_seq_type['OOFF'] = [line] else: raise orm.except_orm( _('Error:'), @@ -283,18 +281,20 @@ class banking_export_sdd_wizard(orm.TransientModel): line.sdd_mandate_id.partner_id.name, line.sdd_mandate_id.last_debit_date)) elif line.sdd_mandate_id.type == 'recurrent': - if line.sdd_mandate_id.last_debit_date: - if first_recur_lines.get('RCUR'): - first_recur_lines['RCUR'].append(line) - else: - first_recur_lines['RCUR'] = [line] + seq_type_map = { + 'recurring': 'RCUR', + 'first': 'FRST', + 'final': 'FNAL', + } + seq_type_label = line.sdd_mandate_id.recurrent_sequence_type + assert seq_type_label is not False + seq_type = seq_type_map[seq_type_label] + if lines_per_seq_type.get(seq_type): + lines_per_seq_type[seq_type].append(line) else: - if first_recur_lines.get('FRST'): - first_recur_lines['FRST'].append(line) - else: - first_recur_lines['FRST'] = [line] + lines_per_seq_type[seq_type] = [line] - for sequence_type, lines in first_recur_lines.items(): + for sequence_type, lines in lines_per_seq_type.items(): # B. Payment info payment_info_2_0 = etree.SubElement(pain_root, 'PmtInf') payment_info_identification_2_1 = etree.SubElement( @@ -516,14 +516,23 @@ class banking_export_sdd_wizard(orm.TransientModel): wf_service.trg_validate(uid, 'payment.order', order.id, 'done', cr) mandate_ids = [line.sdd_mandate_id.id for line in order.line_ids] self.pool['sdd.mandate'].write( - cr, uid, mandate_ids, { - 'last_debit_date': datetime.today().strftime('%Y-%m-%d') - }, + cr, uid, mandate_ids, + {'last_debit_date': datetime.today().strftime('%Y-%m-%d')}, context=context) - oneoff_mandate_ids = \ - [line.sdd_mandate_id.id for line in order.line_ids - if line.sdd_mandate_id.type == 'oneoff'] + to_expire_ids = [] + first_mandate_ids = [] + for line in order.line_ids: + if line.sdd_mandate_id.type == 'oneoff': + to_expire_ids.append(line.sdd_mandate_id.id) + elif line.sdd_mandate_id.type == 'recurrent': + seq_type = line.sdd_mandate_id.recurrent_sequence_type + if seq_type == 'final': + to_expire_ids.append(line.sdd_mandate_id.id) + elif seq_type == 'first': + first_mandate_ids.append(line.sdd_mandate_id.id) self.pool['sdd.mandate'].write( - cr, uid, oneoff_mandate_ids, {'state': 'expired'}, - context=context) + cr, uid, to_expire_ids, {'state': 'expired'}, context=context) + self.pool['sdd.mandate'].write( + cr, uid, first_mandate_ids, + {'recurrent_sequence_type': 'recurring'}, context=context) return {'type': 'ir.actions.act_window_close'} From b96cfffd4e058db2ea14c18acb5f7d0da1727e4e Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Mon, 11 Nov 2013 06:11:26 +0100 Subject: [PATCH 011/118] Now fully manage the scenario where the customer has a new bank account (in the same bank or in another bank) Warning : the signature of the function _prepare_field() has been changed --- .../account_banking_sdd.py | 8 +- .../account_banking_sdd_view.xml | 5 +- .../wizard/export_sdd.py | 118 ++++++++++++++---- 3 files changed, 99 insertions(+), 32 deletions(-) diff --git a/account_banking_sepa_direct_debit/account_banking_sdd.py b/account_banking_sepa_direct_debit/account_banking_sdd.py index bfe49d544..56eb7097a 100644 --- a/account_banking_sepa_direct_debit/account_banking_sdd.py +++ b/account_banking_sepa_direct_debit/account_banking_sdd.py @@ -147,7 +147,7 @@ class sdd_mandate(orm.Model): ('expired', 'Expired'), ('cancel', 'Cancelled'), ], 'Status', - help="For a recurrent mandate, this field indicate if the mandate is still valid or if it has expired (a recurrent mandate expires if it's not used during 36 months). For a one-off mandate, it expires after its first use."), # TODO : update help + help="Only valid mandates can be used in a payment line. A cancelled mandate is a mandate that has been cancelled by the customer. A one-off mandate expires after its first use. A recurrent mandate expires after it's final use or if it hasn't been used for 36 months."), 'payment_line_ids': fields.one2many( 'payment.line', 'sdd_mandate_id', "Related Payment Lines"), } @@ -198,7 +198,7 @@ class sdd_mandate(orm.Model): _("The mandate '%s' can't have a date of last debit before the date of signature.") % mandate['unique_mandate_reference']) if (mandate['type'] == 'recurrent' - and not mandate['recurrent_sequence_type']): + and not mandate['recurrent_sequence_type']): raise orm.except_orm( _('Error:'), _("The recurrent mandate '%s' must have a sequence type.") @@ -227,7 +227,7 @@ class sdd_mandate(orm.Model): and type == 'recurrent' and recurrent_sequence_type != 'first'): return { - 'value': {'recurrent_sequence_type': first}, + 'value': {'recurrent_sequence_type': 'first'}, 'warning': { 'title': _('Mandate update'), 'message': _("As you changed the bank account attached to this mandate, the 'Sequence Type' has been set back to 'First'."), @@ -324,7 +324,7 @@ class payment_line(orm.Model): ('state', '=', 'valid'), ], context=context) if mandate_ids: - vals['sdd_mandate_id'] = mandate_ids[0] + vals['sdd_mandate_id'] = mandate_ids[0] return super(payment_line, self).create(cr, uid, vals, context=context) diff --git a/account_banking_sepa_direct_debit/account_banking_sdd_view.xml b/account_banking_sepa_direct_debit/account_banking_sdd_view.xml index 54a5a6669..cf6c98fb5 100644 --- a/account_banking_sepa_direct_debit/account_banking_sdd_view.xml +++ b/account_banking_sepa_direct_debit/account_banking_sdd_view.xml @@ -102,7 +102,10 @@ - + diff --git a/account_banking_sepa_direct_debit/wizard/export_sdd.py b/account_banking_sepa_direct_debit/wizard/export_sdd.py index 60dda58fe..c217770c1 100644 --- a/account_banking_sepa_direct_debit/wizard/export_sdd.py +++ b/account_banking_sepa_direct_debit/wizard/export_sdd.py @@ -97,14 +97,10 @@ class banking_export_sdd_wizard(orm.TransientModel): cr, uid, vals, context=context) def _prepare_field( - self, cr, uid, field_name, field_value, max_size=0, - sepa_export=False, line=False, sequence_type=False, context=None): + self, cr, uid, field_name, field_value, eval_ctx, max_size=0, + context=None): '''This function is designed to be inherited !''' - eval_ctx = { - 'sepa_export': sepa_export, - 'line': line, - 'sequence_type': sequence_type, - } + assert isinstance(eval_ctx, dict), 'eval_ctx must contain a dict' try: # SEPA uses XML ; XML = UTF-8 ; UTF-8 = support for all characters # But we are dealing with banks... @@ -113,6 +109,7 @@ class banking_export_sdd_wizard(orm.TransientModel): # Customer-to-bank implementation guidelines value = unidecode(safe_eval(field_value, eval_ctx)) except: + line = eval_ctx.get('line') if line: raise orm.except_orm( _('Error:'), @@ -173,6 +170,32 @@ class banking_export_sdd_wizard(orm.TransientModel): % str(e)) return True + def _get_previous_bank(self, cr, uid, payline, context=None): + payline_obj = self.pool['payment.line'] + previous_bank = False + payline_ids = payline_obj.search( + cr, uid, [ + ('sdd_mandate_id', '=', payline.sdd_mandate_id.id), + ('bank_id', '!=', payline.bank_id.id), + ], + context=context) + if payline_ids: + older_lines = payline_obj.browse( + cr, uid, payline_ids, context=context) + previous_date = False + previous_payline_id = False + for older_line in older_lines: + older_line_date_sent = older_line.order_id.date_sent + if (older_line_date_sent + and older_line_date_sent > previous_date): + previous_date = older_line_date_sent + previous_payline_id = older_line.id + if previous_payline_id: + previous_payline = payline_obj.browse( + cr, uid, previous_payline_id, context=context) + previous_bank = previous_payline.bank_id + return previous_bank + def create_sepa(self, cr, uid, ids, context=None): ''' Creates the SEPA Direct Debit file. That's the important code ! @@ -211,7 +234,7 @@ class banking_export_sdd_wizard(orm.TransientModel): my_company_name = self._prepare_field( cr, uid, 'Company Name', 'sepa_export.payment_order_ids[0].company_id.partner_id.name', - name_maxsize, sepa_export=sepa_export, context=context) + {'sepa_export': sepa_export}, name_maxsize, context=context) # A. Group header group_header_1_0 = etree.SubElement(pain_root, 'GrpHdr') @@ -219,8 +242,8 @@ class banking_export_sdd_wizard(orm.TransientModel): group_header_1_0, 'MsgId') message_identification_1_1.text = self._prepare_field( cr, uid, 'Message Identification', - 'sepa_export.payment_order_ids[0].reference', 35, - sepa_export=sepa_export, context=context) + 'sepa_export.payment_order_ids[0].reference', + {'sepa_export': sepa_export}, 35, context=context) creation_date_time_1_2 = etree.SubElement(group_header_1_0, 'CreDtTm') creation_date_time_1_2.text = datetime.strftime( datetime.today(), '%Y-%m-%dT%H:%M:%S') @@ -302,8 +325,8 @@ class banking_export_sdd_wizard(orm.TransientModel): payment_info_identification_2_1.text = self._prepare_field( cr, uid, 'Payment Information Identification', "sequence_type + '-' + sepa_export.payment_order_ids[0].reference", - 35, sepa_export=sepa_export, sequence_type=sequence_type, - context=context) + {'sepa_export': sepa_export, 'sequence_type': sequence_type}, + 35, context=context) payment_method_2_2 = etree.SubElement(payment_info_2_0, 'PmtMtd') payment_method_2_2.text = 'DD' # batch_booking is in "Payment Info" with pain.008.001.02/03 @@ -350,7 +373,7 @@ class banking_export_sdd_wizard(orm.TransientModel): cr, uid, self._prepare_field( cr, uid, 'Company IBAN', 'sepa_export.payment_order_ids[0].mode.bank_id.acc_number', - sepa_export=sepa_export, context=context), + {'sepa_export': sepa_export}, context=context), context=context) creditor_agent_2_21 = etree.SubElement(payment_info_2_0, 'CdtrAgt') @@ -361,7 +384,7 @@ class banking_export_sdd_wizard(orm.TransientModel): creditor_agent_bic.text = self._prepare_field( cr, uid, 'Company BIC', 'sepa_export.payment_order_ids[0].mode.bank_id.bank.bic', - sepa_export=sepa_export, context=context) + {'sepa_export': sepa_export}, context=context) charge_bearer_2_24 = etree.SubElement(payment_info_2_0, 'ChrgBr') charge_bearer_2_24.text = sepa_export.charge_bearer @@ -376,7 +399,7 @@ class banking_export_sdd_wizard(orm.TransientModel): csi_other_id.text = self._prepare_field( cr, uid, 'SEPA Creditor Identifier', 'sepa_export.payment_order_ids[0].company_id.sepa_creditor_identifier', - sepa_export=sepa_export, context=context) + {'sepa_export': sepa_export}, context=context) csi_scheme_name = etree.SubElement(csi_other, 'SchmeNm') csi_scheme_name_proprietary = etree.SubElement( csi_scheme_name, 'Prtry') @@ -394,11 +417,11 @@ class banking_export_sdd_wizard(orm.TransientModel): end2end_identification_2_31 = etree.SubElement( payment_identification_2_29, 'EndToEndId') end2end_identification_2_31.text = self._prepare_field( - cr, uid, 'End to End Identification', 'line.name', 35, - line=line, context=context) + cr, uid, 'End to End Identification', 'line.name', + {'line': line}, 35, context=context) currency_name = self._prepare_field( - cr, uid, 'Currency Code', 'line.currency.name', 3, - line=line, context=context) + cr, uid, 'Currency Code', 'line.currency.name', + {'line': line}, 3, context=context) instructed_amount_2_44 = etree.SubElement( dd_transaction_info_2_28, 'InstdAmt', Ccy=currency_name) instructed_amount_2_44.text = '%.2f' % line.amount_currency @@ -413,15 +436,56 @@ class banking_export_sdd_wizard(orm.TransientModel): mandate_identification_2_48.text = self._prepare_field( cr, uid, 'Unique Mandate Reference', 'line.sdd_mandate_id.unique_mandate_reference', - 35, line=line, context=context) + {'line': line}, 35, context=context) mandate_signature_date_2_49 = etree.SubElement( mandate_related_info_2_47, 'DtOfSgntr') mandate_signature_date_2_49.text = self._prepare_field( cr, uid, 'Mandate Signature Date', - 'line.sdd_mandate_id.signature_date', 10, - line=line, context=context) + 'line.sdd_mandate_id.signature_date', + {'line': line}, 10, context=context) + if (sequence_type == 'FRST' + and line.sdd_mandate_id.last_debit_date): + previous_bank = self._get_previous_bank( + cr, uid, line, context=context) + if previous_bank: + amendment_indicator_2_50 = etree.SubElement( + mandate_related_info_2_47, 'AmdmntInd') + amendment_indicator_2_50.text = 'true' + amendment_info_details_2_51 = etree.SubElement( + mandate_related_info_2_47, 'AmdmntInfDtls') + if previous_bank.bank.bic == line.bank_id.bank.bic: + ori_debtor_account_2_57 = etree.SubElement( + amendment_info_details_2_51, 'OrgnlDbtrAcct') + ori_debtor_account_id = etree.SubElement( + ori_debtor_account_2_57, 'Id') + ori_debtor_account_iban = etree.SubElement( + ori_debtor_account_id, 'IBAN') + ori_debtor_account_iban.text = self._validate_iban( + cr, uid, self._prepare_field( + cr, uid, 'Original Debtor Account', + 'previous_bank.acc_number', + {'previous_bank': previous_bank}, + context=context), + context=context) + else: + ori_debtor_agent_2_58 = etree.SubElement( + amendment_info_details_2_51, 'OrgnlDbtrAgt') + ori_debtor_agent_institution = etree.SubElement( + ori_debtor_agent_2_58, 'FinInstnId') + ori_debtor_agent_bic = etree.SubElement( + ori_debtor_agent_institution, bic_xml_tag) + ori_debtor_agent_bic.text = self._prepare_field( + cr, uid, 'Original Debtor Agent', + 'previous_bank.bank.bic', + {'previous_bank': previous_bank}, + context=context) + ori_debtor_agent_other = etree.SubElement( + ori_debtor_agent_institution, 'Othr') + ori_debtor_agent_other_id = etree.SubElement( + ori_debtor_agent_other, 'Id') + ori_debtor_agent_other_id.text = 'SMNDA' + # SMNDA = Same Mandate New Debtor Agent - # TODO look at 2.50 "Amendment Indicator debtor_agent_2_70 = etree.SubElement( dd_transaction_info_2_28, 'DbtrAgt') debtor_agent_institution = etree.SubElement( @@ -430,13 +494,13 @@ class banking_export_sdd_wizard(orm.TransientModel): debtor_agent_institution, bic_xml_tag) debtor_agent_bic.text = self._prepare_field( cr, uid, 'Customer BIC', 'line.bank_id.bank.bic', - line=line, context=context) + {'line': line}, context=context) debtor_2_72 = etree.SubElement( dd_transaction_info_2_28, 'Dbtr') debtor_name = etree.SubElement(debtor_2_72, 'Nm') debtor_name.text = self._prepare_field( cr, uid, 'Customer Name', 'line.partner_id.name', - name_maxsize, line=line, context=context) + {'line': line}, name_maxsize, context=context) debtor_account_2_73 = etree.SubElement( dd_transaction_info_2_28, 'DbtrAcct') debtor_account_id = etree.SubElement(debtor_account_2_73, 'Id') @@ -445,7 +509,7 @@ class banking_export_sdd_wizard(orm.TransientModel): debtor_account_iban.text = self._validate_iban( cr, uid, self._prepare_field( cr, uid, 'Customer IBAN', - 'line.bank_id.acc_number', line=line, + 'line.bank_id.acc_number', {'line': line}, context=context), context=context) remittance_info_2_88 = etree.SubElement( @@ -455,7 +519,7 @@ class banking_export_sdd_wizard(orm.TransientModel): remittance_info_2_88, 'Ustrd') remittance_info_unstructured_2_89.text = self._prepare_field( cr, uid, 'Remittance Information', 'line.communication', - 140, line=line, context=context) + {'line': line}, 140, context=context) nb_of_transactions_2_4.text = str(transactions_count_2_4) control_sum_2_5.text = '%.2f' % amount_control_sum_2_5 nb_of_transactions_1_6.text = str(transactions_count_1_6) From a4160b73688a6b2be4cbfd6f3c7c1641923f5e28 Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Mon, 11 Nov 2013 11:56:49 +0100 Subject: [PATCH 012/118] Add constraint in payment line to check that the mandate is linked to the bank account Fix in mandate views Move mandate and partner views in dedicated files --- .../__openerp__.py | 2 + .../account_banking_sdd.py | 23 +++ .../account_banking_sdd_view.xml | 174 ------------------ .../account_payment_view.xml | 2 +- .../res_partner_bank_view.xml | 48 +++++ .../sdd_mandate_view.xml | 147 +++++++++++++++ 6 files changed, 221 insertions(+), 175 deletions(-) create mode 100644 account_banking_sepa_direct_debit/res_partner_bank_view.xml create mode 100644 account_banking_sepa_direct_debit/sdd_mandate_view.xml diff --git a/account_banking_sepa_direct_debit/__openerp__.py b/account_banking_sepa_direct_debit/__openerp__.py index 30aef6211..1a05f730f 100644 --- a/account_banking_sepa_direct_debit/__openerp__.py +++ b/account_banking_sepa_direct_debit/__openerp__.py @@ -32,6 +32,8 @@ }, 'data': [ 'account_banking_sdd_view.xml', + 'sdd_mandate_view.xml', + 'res_partner_bank_view.xml', 'account_payment_view.xml', 'company_view.xml', 'mandate_expire_cron.xml', diff --git a/account_banking_sepa_direct_debit/account_banking_sdd.py b/account_banking_sepa_direct_debit/account_banking_sdd.py index 56eb7097a..14c01a6c4 100644 --- a/account_banking_sepa_direct_debit/account_banking_sdd.py +++ b/account_banking_sepa_direct_debit/account_banking_sdd.py @@ -327,6 +327,29 @@ class payment_line(orm.Model): vals['sdd_mandate_id'] = mandate_ids[0] return super(payment_line, self).create(cr, uid, vals, context=context) + def _check_mandate_bank_link(self, cr, uid, ids): + for payline in self.browse(cr, uid, ids): + if (payline.sdd_mandate_id and payline.bank_id + and payline.sdd_mandate_id.partner_bank_id.id != + payline.bank_id.id): + raise orm.except_orm( + _('Error:'), + _("The payment line with reference '%s' has a bank account '%s' which is not attached to the mandate '%s' (this mandate is attached to the bank account '%s').") + % (payline.name, + self.pool['res.partner.bank'].name_get( + cr, uid, [payline.bank_id.id])[0][1], + payline.sdd_mandate_id.unique_mandate_reference, + self.pool['res.partner.bank'].name_get( + cr, uid, + [payline.sdd_mandate_id.partner_bank_id.id])[0][1], + )) + return True + + _constraints = [ + (_check_mandate_bank_link, 'Error msg in raise', + ['sdd_mandate_id', 'bank_id']), + ] + class account_invoice(orm.Model): _inherit = 'account.invoice' diff --git a/account_banking_sepa_direct_debit/account_banking_sdd_view.xml b/account_banking_sepa_direct_debit/account_banking_sdd_view.xml index cf6c98fb5..079e2023b 100644 --- a/account_banking_sepa_direct_debit/account_banking_sdd_view.xml +++ b/account_banking_sepa_direct_debit/account_banking_sdd_view.xml @@ -78,179 +78,5 @@ view_mode="tree,form" /> - - sdd.mandate.form - sdd.mandate - - -
-
- -
-

- -

-
- - - - - - - - - - - - - -
-
- - -
- -
-
- - - sdd.mandate.tree - sdd.mandate - - - - - - - - - - - - - - - sdd.mandate.search - sdd.mandate - - - - - - - - - - - - - - - SEPA Direct Debit Mandates - sdd.mandate - form - tree,form - {'sdd_mandate_main_view': True} - -

- Click to create a new SEPA Direct Debit Mandate. -

- The SEPA Direct Debit Mandate is a document signed by your customer that gives you the autorization to do one or several direct debits on his bank account. -

-
-
- - - - - - Mandate Validated - sdd.mandate - - SEPA Direct Debit Mandate Validated - - - - Mandate Expired - sdd.mandate - - SEPA Direct Debit Mandate has Expired - - - - Mandate Cancelled - sdd.mandate - - SEPA Direct Debit Mandate Cancelled - - - - Sequence Type set to First - sdd.mandate - - Sequence Type set to First - - - - Sequence Type set to Recurring - sdd.mandate - - Sequence Type set to Recurring - - - - Sequence Type set to Final - sdd.mandate - - Sequence Type set to Final - - - - - sdd.mandate.res.partner.bank.form - res.partner.bank - - - - - - - - - - - - sdd.mandate.res.partner.bank.tree - res.partner.bank - - - - - - - - - - - sdd.mandate.partner.form - res.partner - - - - - - - -
diff --git a/account_banking_sepa_direct_debit/account_payment_view.xml b/account_banking_sepa_direct_debit/account_payment_view.xml index 795f30222..74098c44e 100644 --- a/account_banking_sepa_direct_debit/account_payment_view.xml +++ b/account_banking_sepa_direct_debit/account_payment_view.xml @@ -13,7 +13,7 @@ - + diff --git a/account_banking_sepa_direct_debit/res_partner_bank_view.xml b/account_banking_sepa_direct_debit/res_partner_bank_view.xml new file mode 100644 index 000000000..0b32e9f1c --- /dev/null +++ b/account_banking_sepa_direct_debit/res_partner_bank_view.xml @@ -0,0 +1,48 @@ + + + + + + + sdd.mandate.res.partner.bank.form + res.partner.bank + + + + + + + + + + + + sdd.mandate.res.partner.bank.tree + res.partner.bank + + + + + + + + + + + sdd.mandate.partner.form + res.partner + + + + + + + + + + diff --git a/account_banking_sepa_direct_debit/sdd_mandate_view.xml b/account_banking_sepa_direct_debit/sdd_mandate_view.xml new file mode 100644 index 000000000..0d73d00f3 --- /dev/null +++ b/account_banking_sepa_direct_debit/sdd_mandate_view.xml @@ -0,0 +1,147 @@ + + + + + + + sdd.mandate.form + sdd.mandate + +
+
+
+ +
+

+ +

+
+ + + + + + + + + + + + + +
+
+ + +
+
+
+
+ + + sdd.mandate.tree + sdd.mandate + + + + + + + + + + + + + + + sdd.mandate.search + sdd.mandate + + + + + + + + + + + + + + + SEPA Direct Debit Mandates + sdd.mandate + form + tree,form + +

+ Click to create a new SEPA Direct Debit Mandate. +

+ The SEPA Direct Debit Mandate is a document signed by your customer that gives you the autorization to do one or several direct debits on his bank account. +

+
+
+ + + + + + Mandate Validated + sdd.mandate + + SEPA Direct Debit Mandate Validated + + + + Mandate Expired + sdd.mandate + + SEPA Direct Debit Mandate has Expired + + + + Mandate Cancelled + sdd.mandate + + SEPA Direct Debit Mandate Cancelled + + + + Sequence Type set to First + sdd.mandate + + Sequence Type set to First + + + + Sequence Type set to Recurring + sdd.mandate + + Sequence Type set to Recurring + + + + Sequence Type set to Final + sdd.mandate + + Sequence Type set to Final + + +
+
From 3a30a402c9dd9e44f62dfe1291e7c9b9559bde32 Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Mon, 11 Nov 2013 15:51:20 +0100 Subject: [PATCH 013/118] Remove code that is not relevant any more because we now have constraints on the mandates. Update strings. Add French translation. --- .../__openerp__.py | 2 +- .../account_banking_sdd.py | 12 +- .../account_banking_sepa_direct_debit.pot | 883 ++++++++++-------- account_banking_sepa_direct_debit/i18n/fr.po | 652 +++++++++++++ .../sdd_mandate_view.xml | 2 +- .../wizard/export_sdd.py | 24 +- 6 files changed, 1181 insertions(+), 394 deletions(-) create mode 100644 account_banking_sepa_direct_debit/i18n/fr.po diff --git a/account_banking_sepa_direct_debit/__openerp__.py b/account_banking_sepa_direct_debit/__openerp__.py index 1a05f730f..44c744a4a 100644 --- a/account_banking_sepa_direct_debit/__openerp__.py +++ b/account_banking_sepa_direct_debit/__openerp__.py @@ -20,7 +20,7 @@ ############################################################################## { 'name': 'Account Banking SEPA Direct Debit', - 'summary': 'Create SEPA XML files for Direct Debit', + 'summary': 'Create SEPA files for Direct Debit', 'version': '0.1', 'license': 'AGPL-3', 'author': 'Akretion', diff --git a/account_banking_sepa_direct_debit/account_banking_sdd.py b/account_banking_sepa_direct_debit/account_banking_sdd.py index 14c01a6c4..52c3b6f11 100644 --- a/account_banking_sepa_direct_debit/account_banking_sdd.py +++ b/account_banking_sepa_direct_debit/account_banking_sdd.py @@ -65,16 +65,16 @@ class banking_export_sdd(orm.Model): readonly=True), 'batch_booking': fields.boolean( 'Batch Booking', readonly=True, - help="If true, the bank statement will display only one credit line for all the direct debits of the SEPA XML file ; if false, the bank statement will display one credit line per direct debit of the SEPA XML file."), + help="If true, the bank statement will display only one credit line for all the direct debits of the SEPA file ; if false, the bank statement will display one credit line per direct debit of the SEPA file."), 'charge_bearer': fields.selection([ + ('SLEV', 'Following Service Level'), ('SHAR', 'Shared'), ('CRED', 'Borne by Creditor'), ('DEBT', 'Borne by Debtor'), - ('SLEV', 'Following Service Level'), ], 'Charge Bearer', readonly=True, - help='Shared : transaction charges on the sender side are to be borne by the debtor, transaction charges on the receiver side are to be borne by the creditor (most transfers use this). Borne by creditor : all transaction charges are to be borne by the creditor. Borne by debtor : all transaction charges are to be borne by the debtor. Following service level : transaction charges are to be applied following the rules agreed in the service level and/or scheme.'), + help='Following service level : transaction charges are to be applied following the rules agreed in the service level and/or scheme (SEPA Core messages must use this). Shared : transaction charges on the creditor side are to be borne by the creditor, transaction charges on the debtor side are to be borne by the debtor. Borne by creditor : all transaction charges are to be borne by the creditor. Borne by debtor : all transaction charges are to be borne by the debtor.'), 'create_date': fields.datetime('Generation Date', readonly=True), - 'file': fields.binary('SEPA XML File', readonly=True), + 'file': fields.binary('SEPA File', readonly=True), 'filename': fields.function( _generate_filename, type='char', size=256, string='Filename', readonly=True, store=True), @@ -138,7 +138,7 @@ class sdd_mandate(orm.Model): ], 'Sequence Type for Next Debit', help="This field is only used for Recurrent mandates, not for One-Off mandates."), 'signature_date': fields.date('Date of Signature of the Mandate'), - 'scan': fields.binary('Scan of the mandate'), + 'scan': fields.binary('Scan of the Mandate'), 'last_debit_date': fields.date( 'Date of the Last Debit', readonly=True), 'state': fields.selection([ @@ -334,7 +334,7 @@ class payment_line(orm.Model): payline.bank_id.id): raise orm.except_orm( _('Error:'), - _("The payment line with reference '%s' has a bank account '%s' which is not attached to the mandate '%s' (this mandate is attached to the bank account '%s').") + _("The payment line with reference '%s' has the bank account '%s' which is not attached to the mandate '%s' (this mandate is attached to the bank account '%s').") % (payline.name, self.pool['res.partner.bank'].name_get( cr, uid, [payline.bank_id.id])[0][1], diff --git a/account_banking_sepa_direct_debit/i18n/account_banking_sepa_direct_debit.pot b/account_banking_sepa_direct_debit/i18n/account_banking_sepa_direct_debit.pot index 6c772f970..c33a775b4 100644 --- a/account_banking_sepa_direct_debit/i18n/account_banking_sepa_direct_debit.pot +++ b/account_banking_sepa_direct_debit/i18n/account_banking_sepa_direct_debit.pot @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: OpenERP Server 7.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-10-21 21:21+0000\n" -"PO-Revision-Date: 2013-10-21 21:21+0000\n" +"POT-Creation-Date: 2013-11-11 14:28+0000\n" +"PO-Revision-Date: 2013-11-11 14:28+0000\n" "Last-Translator: <>\n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -16,47 +16,8 @@ msgstr "" "Plural-Forms: \n" #. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,file:0 -msgid "SEPA XML file" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,nb_transactions:0 -#: field:banking.export.sdd.wizard,nb_transactions:0 -msgid "Number of transactions" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:79 -#, python-format -msgid "This IBAN is not valid : %s" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:132 -#, python-format -msgid "Payment Type Code '%s' is not supported. The only Payment Type Code supported for SEPA Direct Debit are 'pain.008.001.02', 'pain.008.001.03' and 'pain.008.001.04'." -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd.wizard,state:0 -msgid "Create" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: selection:sdd.mandate,type:0 -msgid "Recurrent" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,type:0 -msgid "Type of Mandate" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:192 -#, python-format -msgid "Missing signature date on SEPA Direct Debit mandate with reference '%s' for partner '%s'." +#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.mandate_valid +msgid "SEPA Direct Debit Mandate Validated" msgstr "" #. module: account_banking_sepa_direct_debit @@ -66,84 +27,26 @@ msgid "Filename" msgstr "" #. module: account_banking_sepa_direct_debit -#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.act_banking_export_sdd_payment_order -msgid "Generated SEPA Direct Debit files" +#: field:banking.export.sdd,requested_collec_date:0 +#: field:banking.export.sdd.wizard,requested_collec_date:0 +msgid "Requested Collection Date" msgstr "" #. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,state:0 -#: field:banking.export.sdd.wizard,state:0 -msgid "State" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: selection:sdd.mandate,state:0 -msgid "Valid" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd,state:0 -msgid "Draft" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:185 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:276 #, python-format msgid "The SEPA Direct Debit mandate with reference '%s' for partner '%s' has expired." msgstr "" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:100 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:186 #, python-format -msgid "Cannot compute the '%s' of the Payment Line with Invoice Reference '%s'." +msgid "Cannot validate the mandate '%s' without a date of signature." msgstr "" #. module: account_banking_sepa_direct_debit -#: view:res.partner.bank:0 -#: field:res.partner.bank,sdd_mandate_ids:0 -msgid "SEPA Direct Debit Mandates" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,total_amount:0 -#: field:banking.export.sdd.wizard,total_amount:0 -msgid "Total amount" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: view:banking.export.sdd:0 -msgid "SEPA Direct Debit" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -msgid "Type" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,generation_date:0 -msgid "Generation date" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd,state:0 -msgid "Sent" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,scan:0 -msgid "Scan of the mandate" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: help:banking.export.sdd.wizard,requested_collec_date:0 -msgid "This is the date on which the collection should be made by the bank. Please keep in mind that banks only execute on working days." -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.action_account_banking_sdd -#: model:ir.ui.menu,name:account_banking_sepa_direct_debit.menu_account_banking_sdd -msgid "Generated SEPA Direct Debit XML files" +#: selection:sdd.mandate,recurrent_sequence_type:0 +msgid "Final" msgstr "" #. module: account_banking_sepa_direct_debit @@ -158,14 +61,9 @@ msgid "SDD Mandates" msgstr "" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:198 -#, python-format -msgid "The signature date on SEPA Direct Debit mandate with reference '%s' for partner '%s' is '%s', which is in the future !" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:res.company,sepa_creditor_identifier:0 -msgid "SEPA Creditor Identifier" +#: constraint:payment.line:0 +#: constraint:sdd.mandate:0 +msgid "Error msg in raise" msgstr "" #. module: account_banking_sepa_direct_debit @@ -173,53 +71,35 @@ msgstr "" msgid "Company" msgstr "" +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,recurrent_sequence_type:0 +msgid "Sequence Type for Next Debit" +msgstr "" + #. module: account_banking_sepa_direct_debit #: selection:banking.export.sdd,charge_bearer:0 #: selection:banking.export.sdd.wizard,charge_bearer:0 -msgid "Shared" +msgid "Borne by Creditor" msgstr "" #. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,unique_mandate_reference:0 -msgid "Unique Mandate Reference" +#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.sdd_mandate_action +#: model:ir.ui.menu,name:account_banking_sepa_direct_debit.sdd_mandate_menu +#: view:res.partner.bank:0 +#: field:res.partner.bank,sdd_mandate_ids:0 +msgid "SEPA Direct Debit Mandates" msgstr "" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:102 -#, python-format -msgid "Cannot compute the '%s'." +#: view:banking.export.sdd.wizard:0 +#: view:sdd.mandate:0 +msgid "Validate" msgstr "" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:104 -#, python-format -msgid "The type of the field '%s' is %s. It should be a string or unicode." -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: model:ir.model,name:account_banking_sepa_direct_debit.model_banking_export_sdd -msgid "SEPA Direct Debit export" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: model:ir.model,name:account_banking_sepa_direct_debit.model_payment_line -msgid "Payment Line" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: view:payment.order:0 -msgid "SDD Mandate" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:156 -#, python-format -msgid "The SEPA Direct Debit Mandate '%s' is not related??" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: selection:sdd.mandate,state:0 -msgid "Expired" +#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_recurring +#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.recurrent_sequence_type_recurring +msgid "Sequence Type set to Recurring" msgstr "" #. module: account_banking_sepa_direct_debit @@ -228,12 +108,197 @@ msgid "Generate" msgstr "" #. module: account_banking_sepa_direct_debit -#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.sdd_mandate_action -#: model:ir.model,name:account_banking_sepa_direct_debit.model_sdd_mandate -#: model:ir.ui.menu,name:account_banking_sepa_direct_debit.sdd_mandate_menu -#: field:payment.line,sdd_mandate_id:0 +#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.mandate_cancel +msgid "SEPA Direct Debit Mandate Cancelled" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,charge_bearer:0 +#: selection:banking.export.sdd.wizard,charge_bearer:0 +msgid "Borne by Debtor" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:180 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:185 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:190 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:197 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:203 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:336 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:89 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:115 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:121 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:130 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:168 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:219 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:269 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:275 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:287 +#, python-format +msgid "Error:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,message_ids:0 +msgid "Messages" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:131 +#, python-format +msgid "The '%s' is empty or 0. It should have a non-null value." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:89 +#, python-format +msgid "This IBAN is not valid : %s" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_banking_export_sdd_wizard +msgid "Export SEPA Direct Debit XML file" +msgstr "" + +#. module: account_banking_sepa_direct_debit #: view:sdd.mandate:0 -msgid "SEPA Direct Debit Mandate" +#: selection:sdd.mandate,state:0 +msgid "Cancelled" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:219 +#, python-format +msgid "Payment Type Code '%s' is not supported. The only Payment Type Code supported for SEPA Direct Debit are 'pain.008.001.02', 'pain.008.001.03' and 'pain.008.001.04'." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: help:sdd.mandate,message_unread:0 +msgid "If checked new messages require your attention." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,file_id:0 +msgid "SDD File" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.mandate_expired +msgid "SEPA Direct Debit Mandate has Expired" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: help:banking.export.sdd,charge_bearer:0 +#: help:banking.export.sdd.wizard,charge_bearer:0 +msgid "Following service level : transaction charges are to be applied following the rules agreed in the service level and/or scheme (SEPA Core messages must use this). Shared : transaction charges on the creditor side are to be borne by the creditor, transaction charges on the debtor side are to be borne by the debtor. Borne by creditor : all transaction charges are to be borne by the creditor. Borne by debtor : all transaction charges are to be borne by the debtor." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +msgid "Reference" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd:0 +msgid "SEPA Direct Debit" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd.wizard:0 +msgid "SEPA Direct Debit XML file generation" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: help:sdd.mandate,message_summary:0 +msgid "Holds the Chatter summary (number of messages, ...). This summary is directly in html format in order to be inserted in kanban views." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: help:banking.export.sdd.wizard,requested_collec_date:0 +msgid "This is the date on which you would like the collection to be made by the bank. Please keep in mind that there are minimum delays for SEPA direct debits that depend on the type of mandate and the type of sequence." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_payment_line +msgid "Payment Line" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,create_date:0 +msgid "Generation Date" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:337 +#, python-format +msgid "The payment line with reference '%s' has the bank account '%s' which is not attached to the mandate '%s' (this mandate is attached to the bank account '%s')." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd.wizard,state:0 +msgid "Create" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,nb_transactions:0 +#: field:banking.export.sdd.wizard,nb_transactions:0 +msgid "Number of Transactions" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +#: selection:sdd.mandate,type:0 +msgid "One-Off" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,state:0 +#: field:banking.export.sdd.wizard,state:0 +msgid "State" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:204 +#, python-format +msgid "The recurrent mandate '%s' must have a sequence type." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,message_follower_ids:0 +msgid "Followers" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,message_unread:0 +msgid "Unread Messages" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd:0 +#: field:banking.export.sdd,payment_order_ids:0 +#: field:banking.export.sdd.wizard,payment_order_ids:0 +msgid "Payment Orders" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +msgid "Type" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,state:0 +msgid "Sent" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:sdd.mandate,recurrent_sequence_type:0 +msgid "Recurring" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:181 +#, python-format +msgid "The date of signature of mandate '%s' is in the future!" msgstr "" #. module: account_banking_sepa_direct_debit @@ -245,78 +310,19 @@ msgid "Enter the Creditor Identifier that has been attributed to your company to "- a country-specific identifier" msgstr "" -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:151 -#, python-format -msgid "Missing bank account on the payment line with SEPA Direct Debit Mandate '%s'." -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -msgid "Status" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:385 -#, python-format -msgid "The generated XML file is not valid against the official XML Schema Definition. The generated XML file and the full error have been written in the server logs. Here is the error, which may give you an idea on the cause of the problem : %s" -msgstr "" - #. module: account_banking_sepa_direct_debit #: sql_constraint:sdd.mandate:0 msgid "A Mandate with the same reference already exists for this company !" msgstr "" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:106 -#, python-format -msgid "The '%s' is empty or 0. It should have a non-null value." +#: help:sdd.mandate,state:0 +msgid "Only valid mandates can be used in a payment line. A cancelled mandate is a mandate that has been cancelled by the customer. A one-off mandate expires after its first use. A recurrent mandate expires after it's final use or if it hasn't been used for 36 months." msgstr "" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:150 -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:155 -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:79 -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:100 -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:102 -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:106 -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:132 -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:178 -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:184 -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:191 -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:197 -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:211 -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:385 -#, python-format -msgid "Error:" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,partner_bank_id:0 -msgid "Bank Account" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: model:ir.model,name:account_banking_sepa_direct_debit.model_res_company -msgid "Companies" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: help:banking.export.sdd,charge_bearer:0 -#: help:banking.export.sdd.wizard,charge_bearer:0 -msgid "Shared : transaction charges on the sender side are to be borne by the debtor, transaction charges on the receiver side are to be borne by the creditor (most transfers use this). Borne by creditor : all transaction charges are to be borne by the creditor. Borne by debtor : all transaction charges are to be borne by the debtor. Following service level : transaction charges are to be applied following the rules agreed in the service level and/or scheme." -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd,charge_bearer:0 -#: selection:banking.export.sdd.wizard,charge_bearer:0 -msgid "Borne by creditor" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,payment_order_ids:0 -#: field:banking.export.sdd.wizard,payment_order_ids:0 -msgid "Payment orders" +#: help:sdd.mandate,recurrent_sequence_type:0 +msgid "This field is only used for Recurrent mandates, not for One-Off mandates." msgstr "" #. module: account_banking_sepa_direct_debit @@ -324,151 +330,10 @@ msgstr "" msgid "Signature Date" msgstr "" -#. module: account_banking_sepa_direct_debit -#: help:banking.export.sdd,batch_booking:0 -msgid "If true, the bank statement will display only one credit line for all the direct debits of the SEPA XML file ; if false, the bank statement will display one credit line per direct debit of the SEPA XML file." -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: view:banking.export.sdd.wizard:0 -msgid "Processing details" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd.wizard,file_id:0 -msgid "SDD XML file" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: model:ir.model,name:account_banking_sepa_direct_debit.model_banking_export_sdd_wizard -msgid "Export SEPA Direct Debit XML file" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:104 -#, python-format -msgid "Field type error:" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: model:ir.actions.act_window,help:account_banking_sepa_direct_debit.sdd_mandate_action -msgid "

\n" -" Click to create a new SEPA Direct Debit Mandate.\n" -"

\n" -" The SEPA Direct Debit Mandate is a document signed by your customer that gives you the autorization to do one or several direct debits on his bank account.\n" -"

\n" -" " -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: selection:sdd.mandate,type:0 -msgid "One-Off" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:179 -#, python-format -msgid "Missing SEPA Direct Debit mandate on the payment line with partner '%s' and Invoice ref '%s'." -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: view:banking.export.sdd.wizard:0 -msgid "Validate" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:212 -#, python-format -msgid "The mandate with reference '%s' for partner '%s' has type set to 'One-Off' and it has a last debit date set to '%s', so we can't use it." -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: help:sdd.mandate,last_debit_date:0 -msgid "For recurrent mandates, this field is used to know if the SDD will be of type 'First' or 'Recurring'. For one-off mandates, this field is used to know if the SDD has already been used or not." -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,signature_date:0 -msgid "Date of Signature of the Mandate" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,last_debit_date:0 -msgid "Date of the Last Debit" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -msgid "Reference" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: constraint:res.company:0 -msgid "Invalid SEPA Creditor Identifier." -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,requested_collec_date:0 -#: field:banking.export.sdd.wizard,requested_collec_date:0 -msgid "Requested collection date" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd,charge_bearer:0 -#: selection:banking.export.sdd.wizard,charge_bearer:0 -msgid "Borne by debtor" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: model:ir.model,name:account_banking_sepa_direct_debit.model_res_partner_bank -msgid "Bank Accounts" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd,charge_bearer:0 -#: selection:banking.export.sdd.wizard,charge_bearer:0 -msgid "Following service level" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: view:banking.export.sdd:0 -msgid "Payment Orders" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: view:banking.export.sdd.wizard:0 -msgid "SEPA Direct Debit XML file generation" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: view:banking.export.sdd:0 -msgid "General Information" -msgstr "" - #. module: account_banking_sepa_direct_debit #: field:banking.export.sdd,charge_bearer:0 #: field:banking.export.sdd.wizard,charge_bearer:0 -msgid "Charge bearer" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,state:0 -msgid "Mandate Status" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: help:banking.export.sdd.wizard,batch_booking:0 -msgid "If true, the bank statement will display only one debit line for all the wire transfers of the SEPA XML file ; if false, the bank statement will display one debit line per wire transfer of the SEPA XML file." -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd.wizard,file:0 -msgid "File" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: view:banking.export.sdd.wizard:0 -msgid "Cancel" +msgid "Charge Bearer" msgstr "" #. module: account_banking_sepa_direct_debit @@ -477,14 +342,31 @@ msgid "Partner" msgstr "" #. module: account_banking_sepa_direct_debit -#: help:sdd.mandate,state:0 -msgid "For a recurrent mandate, this field indicate if the mandate is still valid or if it has expired (a recurrent mandate expires if it's not used during 36 months). For a one-off mandate, it expires after its first use." +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:125 +#, python-format +msgid "Field type error:" msgstr "" #. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,batch_booking:0 -#: field:banking.export.sdd.wizard,batch_booking:0 -msgid "Batch booking" +#: selection:sdd.mandate,recurrent_sequence_type:0 +msgid "First" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,signature_date:0 +msgid "Date of Signature of the Mandate" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.mandate_cancel +msgid "Mandate Cancelled" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.act_banking_export_sdd_payment_order +#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.action_account_banking_sdd +#: model:ir.ui.menu,name:account_banking_sepa_direct_debit.menu_account_banking_sdd +msgid "Generated SEPA Direct Debit Files" msgstr "" #. module: account_banking_sepa_direct_debit @@ -492,3 +374,270 @@ msgstr "" msgid "Reconciled" msgstr "" +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:191 +#, python-format +msgid "Cannot validate the mandate '%s' because it is not attached to a bank account." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,state:0 +#: view:sdd.mandate:0 +#: selection:sdd.mandate,state:0 +msgid "Draft" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:232 +#, python-format +msgid "Mandate update" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:116 +#, python-format +msgid "Cannot compute the '%s' of the Payment Line with Invoice Reference '%s'." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,charge_bearer:0 +#: selection:banking.export.sdd.wizard,charge_bearer:0 +msgid "Shared" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,batch_booking:0 +#: field:banking.export.sdd.wizard,batch_booking:0 +msgid "Batch Booking" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,state:0 +msgid "Status" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,total_amount:0 +#: field:banking.export.sdd.wizard,total_amount:0 +msgid "Total Amount" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: help:banking.export.sdd,batch_booking:0 +#: help:banking.export.sdd.wizard,batch_booking:0 +msgid "If true, the bank statement will display only one credit line for all the direct debits of the SEPA file ; if false, the bank statement will display one credit line per direct debit of the SEPA file." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,charge_bearer:0 +#: selection:banking.export.sdd.wizard,charge_bearer:0 +msgid "Following Service Level" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:198 +#, python-format +msgid "The mandate '%s' can't have a date of last debit before the date of signature." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_final +#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.recurrent_sequence_type_final +msgid "Sequence Type set to Final" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,message_is_follower:0 +msgid "Is a Follower" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:payment.order:0 +msgid "SDD Mandate" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_res_company +msgid "Companies" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,message_summary:0 +msgid "Summary" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:account.invoice,sdd_mandate_id:0 +#: model:ir.model,name:account_banking_sepa_direct_debit.model_sdd_mandate +#: field:payment.line,sdd_mandate_id:0 +#: view:sdd.mandate:0 +msgid "SEPA Direct Debit Mandate" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:270 +#, python-format +msgid "Missing SEPA Direct Debit mandate on the payment line with partner '%s' and Invoice ref '%s'." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:288 +#, python-format +msgid "The mandate with reference '%s' for partner '%s' has type set to 'One-Off' and it has a last debit date set to '%s', so we can't use it." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,scan:0 +msgid "Scan of the Mandate" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,last_debit_date:0 +msgid "Date of the Last Debit" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.mandate_expired +msgid "Mandate Expired" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: constraint:res.company:0 +msgid "Invalid SEPA Creditor Identifier." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_res_partner_bank +msgid "Bank Accounts" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.actions.act_window,help:account_banking_sepa_direct_debit.sdd_mandate_action +msgid "

\n" +" Click to create a new SEPA Direct Debit Mandate.\n" +"

\n" +" A SEPA Direct Debit Mandate is a document signed by your customer that gives you the autorization to do one or several direct debits on his bank account.\n" +"

\n" +" " +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd:0 +msgid "General Information" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +#: selection:sdd.mandate,state:0 +msgid "Valid" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_account_invoice +msgid "Invoice" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd.wizard:0 +#: view:sdd.mandate:0 +msgid "Cancel" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +#: field:sdd.mandate,payment_line_ids:0 +msgid "Related Payment Lines" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:169 +#, python-format +msgid "The generated XML file is not valid against the official XML Schema Definition. The generated XML file and the full error have been written in the server logs. Here is the error, which may give you an idea on the cause of the problem : %s" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +#: selection:sdd.mandate,type:0 +msgid "Recurrent" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,type:0 +msgid "Type of Mandate" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.mandate_valid +msgid "Mandate Validated" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,file:0 +msgid "SEPA File" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:res.company,sepa_creditor_identifier:0 +msgid "SEPA Creditor Identifier" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:122 +#, python-format +msgid "Cannot compute the '%s'." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:126 +#, python-format +msgid "The type of the field '%s' is %s. It should be a string or unicode." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_banking_export_sdd +msgid "SEPA Direct Debit export" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +#: selection:sdd.mandate,state:0 +msgid "Expired" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,partner_bank_id:0 +msgid "Bank Account" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_first +#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.recurrent_sequence_type_first +msgid "Sequence Type set to First" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:233 +#, python-format +msgid "As you changed the bank account attached to this mandate, the 'Sequence Type' has been set back to 'First'." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: help:sdd.mandate,message_ids:0 +msgid "Messages and communication history" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +msgid "Search SEPA Direct Debit Mandates" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,unique_mandate_reference:0 +msgid "Unique Mandate Reference" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,file:0 +msgid "File" +msgstr "" + diff --git a/account_banking_sepa_direct_debit/i18n/fr.po b/account_banking_sepa_direct_debit/i18n/fr.po new file mode 100644 index 000000000..c823791c8 --- /dev/null +++ b/account_banking_sepa_direct_debit/i18n/fr.po @@ -0,0 +1,652 @@ +# Translation of OpenERP Server. +# This file contains the translation of the following modules: +# * account_banking_sepa_direct_debit +# +msgid "" +msgstr "" +"Project-Id-Version: OpenERP Server 7.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2013-11-11 14:04+0000\n" +"PO-Revision-Date: 2013-11-11 14:04+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_sepa_direct_debit +#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.mandate_valid +msgid "SEPA Direct Debit Mandate Validated" +msgstr "Mandat de prélèvement SEPA validé" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,filename:0 +#: field:banking.export.sdd.wizard,filename:0 +msgid "Filename" +msgstr "Nom du fichier" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,requested_collec_date:0 +#: field:banking.export.sdd.wizard,requested_collec_date:0 +msgid "Requested Collection Date" +msgstr "Date de collecte demandée" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:276 +#, python-format +msgid "The SEPA Direct Debit mandate with reference '%s' for partner '%s' has expired." +msgstr "Le mandat de prélèvement SEPA portant la référence '%s' pour le partenaire '%s' a expiré." + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:186 +#, python-format +msgid "Cannot validate the mandate '%s' without a date of signature." +msgstr "Impossible de valider le mandat '%s' sans date de signature." + +#. module: account_banking_sepa_direct_debit +#: selection:sdd.mandate,recurrent_sequence_type:0 +msgid "Final" +msgstr "Final" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd.wizard,state:0 +msgid "Finish" +msgstr "Finir" + +#. module: account_banking_sepa_direct_debit +#: view:res.partner:0 +#: view:res.partner.bank:0 +msgid "SDD Mandates" +msgstr "Mandats SEPA" + +#. module: account_banking_sepa_direct_debit +#: constraint:payment.line:0 +#: constraint:sdd.mandate:0 +msgid "Error msg in raise" +msgstr "Error msg in raise" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,state:0 +msgid "Reconciled" +msgstr "Réconcilié" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,recurrent_sequence_type:0 +msgid "Sequence Type for Next Debit" +msgstr "Type de séquence pour le prochain prélèvement" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,charge_bearer:0 +#: selection:banking.export.sdd.wizard,charge_bearer:0 +msgid "Borne by Creditor" +msgstr "Supportés par le créancier" + +#. module: account_banking_sepa_direct_debit +#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.sdd_mandate_action +#: model:ir.ui.menu,name:account_banking_sepa_direct_debit.sdd_mandate_menu +#: view:res.partner.bank:0 +#: field:res.partner.bank,sdd_mandate_ids:0 +msgid "SEPA Direct Debit Mandates" +msgstr "Mandats de prélèvement SEPA" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd.wizard:0 +#: view:sdd.mandate:0 +msgid "Validate" +msgstr "Valider" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_recurring +#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.recurrent_sequence_type_recurring +msgid "Sequence Type set to Recurring" +msgstr "Type de séquence mis à Recurring" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd.wizard:0 +msgid "Generate" +msgstr "Générer" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.mandate_cancel +msgid "SEPA Direct Debit Mandate Cancelled" +msgstr "Mandat de prélèvement SEPA annulé" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,charge_bearer:0 +#: selection:banking.export.sdd.wizard,charge_bearer:0 +msgid "Borne by Debtor" +msgstr "Supportés par le débiteur" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:180 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:185 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:190 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:197 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:203 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:336 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:89 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:115 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:121 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:130 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:168 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:219 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:269 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:275 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:287 +#, python-format +msgid "Error:" +msgstr "Erreur :" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,message_ids:0 +msgid "Messages" +msgstr "Messages" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:131 +#, python-format +msgid "The '%s' is empty or 0. It should have a non-null value." +msgstr "Le champ '%s' est vide ou nul. Il doit avoir une valeur non nulle." + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:89 +#, python-format +msgid "This IBAN is not valid : %s" +msgstr "Cet IBAN n'est pas valide : %s" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_banking_export_sdd_wizard +msgid "Export SEPA Direct Debit XML file" +msgstr "Export des fichiers de prélèvement SEPA" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +#: selection:sdd.mandate,state:0 +msgid "Cancelled" +msgstr "Annulé" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:219 +#, python-format +msgid "Payment Type Code '%s' is not supported. The only Payment Type Code supported for SEPA Direct Debit are 'pain.008.001.02', 'pain.008.001.03' and 'pain.008.001.04'." +msgstr "Le code du Type de paiement '%s' n'est pas supporté. Les seuls codes de Type de paiement supportés pour les prélèvements SEPA sont 'pain.008.001.02', 'pain.008.001.03' et 'pain.008.001.04'." + +#. module: account_banking_sepa_direct_debit +#: help:sdd.mandate,message_unread:0 +msgid "If checked new messages require your attention." +msgstr "If checked new messages require your attention." + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,file_id:0 +msgid "SDD File" +msgstr "Fichier de prélèvement SEPA" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.mandate_expired +msgid "SEPA Direct Debit Mandate has Expired" +msgstr "Le mandat de prélèvement SEPA a expiré" + +#. module: account_banking_sepa_direct_debit +#: help:banking.export.sdd,charge_bearer:0 +#: help:banking.export.sdd.wizard,charge_bearer:0 +msgid "Following service level : transaction charges are to be applied following the rules agreed in the service level and/or scheme (SEPA Core messages must use this). Shared : transaction charges on the creditor side are to be borne by the creditor, transaction charges on the debtor side are to be borne by the debtor. Borne by creditor : all transaction charges are to be borne by the creditor. Borne by debtor : all transaction charges are to be borne by the debtor." +msgstr "Suivant le niveau de service : la répartition des frais bancaires suit les règles pré-établies dans le schema ou dans le contrat avec la banque (les messages SEPA Core doivent utiliser ce paramètre). Partagés : les frais bancaires côté débiteur sont à la charge du débiteur, les frais bancaires côté créditeur sont à la charge du créditeur. Supportés par le créancier : tous les frais bancaires sont à la charge du créancier. Supportés par le débiteur : tous les frais bancaires sont à la charge du débiteur." + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +msgid "Reference" +msgstr "Référence" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd:0 +msgid "SEPA Direct Debit" +msgstr "Prélèvement SEPA" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd.wizard:0 +msgid "SEPA Direct Debit XML file generation" +msgstr "Génération de fichiers de prélèvement SEPA XML" + +#. module: account_banking_sepa_direct_debit +#: help:sdd.mandate,message_summary:0 +msgid "Holds the Chatter summary (number of messages, ...). This summary is directly in html format in order to be inserted in kanban views." +msgstr "Holds the Chatter summary (number of messages, ...). This summary is directly in html format in order to be inserted in kanban views." + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_payment_line +msgid "Payment Line" +msgstr "Ligne de paiement" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,create_date:0 +msgid "Generation Date" +msgstr "Date de génération" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:337 +#, python-format +msgid "The payment line with reference '%s' has the bank account '%s' which is not attached to the mandate '%s' (this mandate is attached to the bank account '%s')." +msgstr "La ligne de paiement portant la référence '%s' est configurée avec le compte bancaire '%s' qui n'est pas rattaché au mandat '%s' (ce mandat est rattaché au compte bancaire '%s')." + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd.wizard,state:0 +msgid "Create" +msgstr "Créer" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,nb_transactions:0 +#: field:banking.export.sdd.wizard,nb_transactions:0 +msgid "Number of Transactions" +msgstr "Nombre de transactions" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +#: selection:sdd.mandate,type:0 +msgid "One-Off" +msgstr "One-Off" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,state:0 +#: field:banking.export.sdd.wizard,state:0 +msgid "State" +msgstr "État" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:204 +#, python-format +msgid "The recurrent mandate '%s' must have a sequence type." +msgstr "Le mandat récurrent '%s' doit avoir un type de séquence." + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,message_follower_ids:0 +msgid "Followers" +msgstr "Followers" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,message_unread:0 +msgid "Unread Messages" +msgstr "Unread Messages" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd:0 +#: field:banking.export.sdd,payment_order_ids:0 +#: field:banking.export.sdd.wizard,payment_order_ids:0 +msgid "Payment Orders" +msgstr "Ordres de paiement" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +msgid "Type" +msgstr "Type" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,state:0 +msgid "Sent" +msgstr "Envoyé" + +#. module: account_banking_sepa_direct_debit +#: selection:sdd.mandate,recurrent_sequence_type:0 +msgid "Recurring" +msgstr "Recurring" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:181 +#, python-format +msgid "The date of signature of mandate '%s' is in the future!" +msgstr "La date de signature du mandat '%s' est dans le futur !" + +#. module: account_banking_sepa_direct_debit +#: help:res.company,sepa_creditor_identifier:0 +msgid "Enter the Creditor Identifier that has been attributed to your company to make SEPA Direct Debits. This identifier is composed of :\n" +"- your country ISO code (2 letters)\n" +"- a 2-digits checkum\n" +"- a 3-letters business code\n" +"- a country-specific identifier" +msgstr "Entrez l'Identifiant créancier qui a été attribué à votre société pour réaliser des prélèvements SEPA. Cet identifiant est composé de :\n" +"- du code ISO de votre pays (2 lettres)\n" +"- un code de contrôle à 2 chiffres\n" +"- un code d'activité à 3 lettres\n" +"- un identifiant national" + +#. module: account_banking_sepa_direct_debit +#: sql_constraint:sdd.mandate:0 +msgid "A Mandate with the same reference already exists for this company !" +msgstr "Un mandat avec la même référence existe déjà pour cette société !" + +#. module: account_banking_sepa_direct_debit +#: help:sdd.mandate,state:0 +msgid "Only valid mandates can be used in a payment line. A cancelled mandate is a mandate that has been cancelled by the customer. A one-off mandate expires after its first use. A recurrent mandate expires after it's final use or if it hasn't been used for 36 months." +msgstr "Seuls des mandats valides peuvent être utilisés dans une ligne de paiement. Un mandate annulé est un mandat qui a été annulé par le client. Un mandat One-Off expire à l'issue de sa première utilisation. Un mandate récurrent expire après sa dernière utilisation ou si il n'a pas été utilisé pendant 36 mois." + +#. module: account_banking_sepa_direct_debit +#: help:sdd.mandate,recurrent_sequence_type:0 +msgid "This field is only used for Recurrent mandates, not for One-Off mandates." +msgstr "Ce champ n'est utilisé que pour les mandats récurrents, pas pour les mandats One-Off." + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +msgid "Signature Date" +msgstr "Date de signature" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,charge_bearer:0 +#: field:banking.export.sdd.wizard,charge_bearer:0 +msgid "Charge Bearer" +msgstr "Répartition des frais" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,partner_id:0 +msgid "Partner" +msgstr "Partenaire" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:125 +#, python-format +msgid "Field type error:" +msgstr "Erreur de type de champ :" + +#. module: account_banking_sepa_direct_debit +#: selection:sdd.mandate,recurrent_sequence_type:0 +msgid "First" +msgstr "First" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,signature_date:0 +msgid "Date of Signature of the Mandate" +msgstr "Date de signature du mandat" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.mandate_cancel +msgid "Mandate Cancelled" +msgstr "Mandat annulé" + +#. module: account_banking_sepa_direct_debit +#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.act_banking_export_sdd_payment_order +#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.action_account_banking_sdd +#: model:ir.ui.menu,name:account_banking_sepa_direct_debit.menu_account_banking_sdd +msgid "Generated SEPA Direct Debit Files" +msgstr "Fichiers de prélèvement SEPA générés" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,company_id:0 +msgid "Company" +msgstr "Société" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:191 +#, python-format +msgid "Cannot validate the mandate '%s' because it is not attached to a bank account." +msgstr "Impossible de valider le mandat '%s' car il n'est pas rattaché à un compte bancaire." + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,state:0 +#: view:sdd.mandate:0 +#: selection:sdd.mandate,state:0 +msgid "Draft" +msgstr "Brouillon" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:232 +#, python-format +msgid "Mandate update" +msgstr "Mise-à-jour du mandat" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:116 +#, python-format +msgid "Cannot compute the '%s' of the Payment Line with Invoice Reference '%s'." +msgstr "Impossible de générer le '%s' de la ligne de paiement ayant la référence de facture '%s'." + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,charge_bearer:0 +#: selection:banking.export.sdd.wizard,charge_bearer:0 +msgid "Shared" +msgstr "Partagée" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,batch_booking:0 +#: field:banking.export.sdd.wizard,batch_booking:0 +msgid "Batch Booking" +msgstr "Crédit groupé" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,state:0 +msgid "Status" +msgstr "Statut" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,total_amount:0 +#: field:banking.export.sdd.wizard,total_amount:0 +msgid "Total Amount" +msgstr "Montant total" + +#. module: account_banking_sepa_direct_debit +#: help:banking.export.sdd,batch_booking:0 +#: help:banking.export.sdd.wizard,batch_booking:0 +msgid "If true, the bank statement will display only one credit line for all the direct debits of the SEPA file ; if false, the bank statement will display one credit line per direct debit of the SEPA file." +msgstr "Si activé, le relevé de compte ne fera apparaître qu'une ligne de crédit pour tous les prélèvements du fichier SEPA ; si désactivé, le relevé de banque fera apparaître une ligne de crédit pour chaque prélèvement du fichier SEPA." + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,charge_bearer:0 +#: selection:banking.export.sdd.wizard,charge_bearer:0 +msgid "Following Service Level" +msgstr "Suivant le niveau de service" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:198 +#, python-format +msgid "The mandate '%s' can't have a date of last debit before the date of signature." +msgstr "Le mandat '%s' ne peut pas avoir une date de dernier débit antérieure à la date de signature." + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_final +#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.recurrent_sequence_type_final +msgid "Sequence Type set to Final" +msgstr "Type de Séquence mis à Final" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,message_is_follower:0 +msgid "Is a Follower" +msgstr "Is a Follower" + +#. module: account_banking_sepa_direct_debit +#: view:payment.order:0 +msgid "SDD Mandate" +msgstr "Mandat de prélèvement" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_res_company +msgid "Companies" +msgstr "Sociétés" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,message_summary:0 +msgid "Summary" +msgstr "Résumé" + +#. module: account_banking_sepa_direct_debit +#: field:account.invoice,sdd_mandate_id:0 +#: model:ir.model,name:account_banking_sepa_direct_debit.model_sdd_mandate +#: field:payment.line,sdd_mandate_id:0 +#: view:sdd.mandate:0 +msgid "SEPA Direct Debit Mandate" +msgstr "Mandat de prélèvement SEPA" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:270 +#, python-format +msgid "Missing SEPA Direct Debit mandate on the payment line with partner '%s' and Invoice ref '%s'." +msgstr "Mandat de prélèvement SEPA manquant sur la ligne de paiement ayant pour partenaire '%s' et pour référence de facture '%s'." + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:288 +#, python-format +msgid "The mandate with reference '%s' for partner '%s' has type set to 'One-Off' and it has a last debit date set to '%s', so we can't use it." +msgstr "Le mandat portant la référence '%s' pour le partenaire '%s' est de type 'One-Off' et il a une date de dernier débit au '%s', donc il n'est pas utilisable." + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,scan:0 +msgid "Scan of the Mandate" +msgstr "Scan du mandat" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,last_debit_date:0 +msgid "Date of the Last Debit" +msgstr "Date du dernier prélèvement" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.mandate_expired +msgid "Mandate Expired" +msgstr "Mandat expiré" + +#. module: account_banking_sepa_direct_debit +#: constraint:res.company:0 +msgid "Invalid SEPA Creditor Identifier." +msgstr "Identifiant créancier SEPA invalide." + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_res_partner_bank +msgid "Bank Accounts" +msgstr "Comptes bancaires" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd:0 +msgid "General Information" +msgstr "Informations générales" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +#: selection:sdd.mandate,state:0 +msgid "Valid" +msgstr "Valide" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_account_invoice +msgid "Invoice" +msgstr "Facture" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd.wizard:0 +#: view:sdd.mandate:0 +msgid "Cancel" +msgstr "Annuler" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +#: field:sdd.mandate,payment_line_ids:0 +msgid "Related Payment Lines" +msgstr "Lignes de paiement associées" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:169 +#, python-format +msgid "The generated XML file is not valid against the official XML Schema Definition. The generated XML file and the full error have been written in the server logs. Here is the error, which may give you an idea on the cause of the problem : %s" +msgstr "Le fichier XML généré n'est pas valide par rapport à la Définition du Schéma XML officiel. Le fichier XML généré et le message d'erreur complet ont été écrits dans les logs du serveur. Voici l'erreur, qui vous donnera peut-être une idée sur la cause du problème : %s" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +#: selection:sdd.mandate,type:0 +msgid "Recurrent" +msgstr "Récurrent" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,type:0 +msgid "Type of Mandate" +msgstr "Type de mandat" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.mandate_valid +msgid "Mandate Validated" +msgstr "Mandat validé" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,file:0 +msgid "SEPA File" +msgstr "SEPA File" + +#. module: account_banking_sepa_direct_debit +#: field:res.company,sepa_creditor_identifier:0 +msgid "SEPA Creditor Identifier" +msgstr "Identifiant créancier SEPA" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:122 +#, python-format +msgid "Cannot compute the '%s'." +msgstr "Impossible de calculer le '%s'." + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:126 +#, python-format +msgid "The type of the field '%s' is %s. It should be a string or unicode." +msgstr "Le champ '%s' est de type %s. Il devrait être de type string ou unicode." + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_banking_export_sdd +msgid "SEPA Direct Debit export" +msgstr "Export de prélèvement SEPA" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +#: selection:sdd.mandate,state:0 +msgid "Expired" +msgstr "Expiré" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,partner_bank_id:0 +msgid "Bank Account" +msgstr "Compte bancaire" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_first +#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.recurrent_sequence_type_first +msgid "Sequence Type set to First" +msgstr "Type de Séquence mis à First" + +#. module: account_banking_sepa_direct_debit +#: model:ir.actions.act_window,help:account_banking_sepa_direct_debit.sdd_mandate_action +msgid "

\n" +" Click to create a new SEPA Direct Debit Mandate.\n" +"

\n" +" A SEPA Direct Debit Mandate is a document signed by your customer that gives you the autorization to do one or several direct debits on his bank account.\n" +"

\n" +" " +msgstr "

\n" +" Cliquez pour créer un mandat de prélèvement SEPA.\n" +"

\n" +" Un mandat de prélèvement SEPA est un document signé par votre client qui vous donne l'autorisation de réaliser un ou plusieurs prélèvements sur son compte bancaire.\n" +"

\n" +" " + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:233 +#, python-format +msgid "As you changed the bank account attached to this mandate, the 'Sequence Type' has been set back to 'First'." +msgstr "Etant donné que vous avez changé le compte bancaire associé à ce mandat, le 'Type de séquence' a été remis à 'First'." + +#. module: account_banking_sepa_direct_debit +#: help:sdd.mandate,message_ids:0 +msgid "Messages and communication history" +msgstr "Messages and communication history" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +msgid "Search SEPA Direct Debit Mandates" +msgstr "Recherche dans les mandats de prélèvement SEPA" + +#. module: account_banking_sepa_direct_debit +#: help:banking.export.sdd.wizard,requested_collec_date:0 +msgid "This is the date on which you would like the collection to be made by the bank. Please keep in mind that there are minimum delays for SEPA direct debits that depend on the type of mandate and the type of sequence." +msgstr "Entrez la date à laquelle vous voudriez que le prélèvement soit effectué par la banque. Gardez en mémoire qu'il y a un délai minimum pour les prélèvements SEPA qui dépend du type de mandat et du type de séquence." + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,unique_mandate_reference:0 +msgid "Unique Mandate Reference" +msgstr "Référence unique de mandat" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,file:0 +msgid "File" +msgstr "Fichier" + diff --git a/account_banking_sepa_direct_debit/sdd_mandate_view.xml b/account_banking_sepa_direct_debit/sdd_mandate_view.xml index 0d73d00f3..9e6e17991 100644 --- a/account_banking_sepa_direct_debit/sdd_mandate_view.xml +++ b/account_banking_sepa_direct_debit/sdd_mandate_view.xml @@ -89,7 +89,7 @@

Click to create a new SEPA Direct Debit Mandate.

- The SEPA Direct Debit Mandate is a document signed by your customer that gives you the autorization to do one or several direct debits on his bank account. + A SEPA Direct Debit Mandate is a document signed by your customer that gives you the autorization to do one or several direct debits on his bank account.

diff --git a/account_banking_sepa_direct_debit/wizard/export_sdd.py b/account_banking_sepa_direct_debit/wizard/export_sdd.py index c217770c1..1f68674a7 100644 --- a/account_banking_sepa_direct_debit/wizard/export_sdd.py +++ b/account_banking_sepa_direct_debit/wizard/export_sdd.py @@ -44,17 +44,17 @@ class banking_export_sdd_wizard(orm.TransientModel): ], 'State', readonly=True), 'batch_booking': fields.boolean( 'Batch Booking', - help="If true, the bank statement will display only one debit line for all the wire transfers of the SEPA XML file ; if false, the bank statement will display one debit line per wire transfer of the SEPA XML file."), + help="If true, the bank statement will display only one credit line for all the direct debits of the SEPA file ; if false, the bank statement will display one credit line per direct debit of the SEPA file."), 'requested_collec_date': fields.date( 'Requested Collection Date', - help='This is the date on which the collection should be made by the bank. Please keep in mind that banks only execute on working days.'), + help='This is the date on which you would like the collection to be made by the bank. Please keep in mind that there are minimum delays for SEPA direct debits that depend on the type of mandate and the type of sequence.'), 'charge_bearer': fields.selection([ + ('SLEV', 'Following Service Level'), ('SHAR', 'Shared'), ('CRED', 'Borne by Creditor'), ('DEBT', 'Borne by Debtor'), - ('SLEV', 'Following Service Level'), ], 'Charge Bearer', required=True, - help='Shared : transaction charges on the sender side are to be borne by the debtor, transaction charges on the receiver side are to be borne by the creditor (most transfers use this). Borne by creditor : all transaction charges are to be borne by the creditor. Borne by debtor : all transaction charges are to be borne by the debtor. Following service level : transaction charges are to be applied following the rules agreed in the service level and/or scheme.'), + help='Following service level : transaction charges are to be applied following the rules agreed in the service level and/or scheme (SEPA Core messages must use this). Shared : transaction charges on the creditor side are to be borne by the creditor, transaction charges on the debtor side are to be borne by the debtor. Borne by creditor : all transaction charges are to be borne by the creditor. Borne by debtor : all transaction charges are to be borne by the debtor.'), 'nb_transactions': fields.related( 'file_id', 'nb_transactions', type='integer', string='Number of Transactions', readonly=True), @@ -62,7 +62,7 @@ class banking_export_sdd_wizard(orm.TransientModel): 'file_id', 'total_amount', type='float', string='Total Amount', readonly=True), 'file_id': fields.many2one( - 'banking.export.sdd', 'SDD XML File', readonly=True), + 'banking.export.sdd', 'SDD File', readonly=True), 'file': fields.related( 'file_id', 'file', string="File", type='binary', readonly=True), 'filename': fields.related( @@ -276,20 +276,6 @@ class banking_export_sdd_wizard(orm.TransientModel): _("The SEPA Direct Debit mandate with reference '%s' for partner '%s' has expired.") % (line.sdd_mandate_id.unique_mandate_reference, line.sdd_mandate_id.partner_id.name)) - if not line.sdd_mandate_id.signature_date: - raise orm.except_orm( - _('Error:'), - _("Missing signature date on SEPA Direct Debit mandate with reference '%s' for partner '%s'.") - % (line.sdd_mandate_id.unique_mandate_reference, - line.sdd_mandate_id.partner_id.name)) - elif (line.sdd_mandate_id.signature_date > - datetime.today().strftime('%Y-%m-%d')): - raise orm.except_orm( - _('Error:'), - _("The signature date on SEPA Direct Debit mandate with reference '%s' for partner '%s' is '%s', which is in the future !") - % (line.sdd_mandate_id.unique_mandate_reference, - line.sdd_mandate_id.partner_id.name, - line.sdd_mandate_id.signature_date)) if line.sdd_mandate_id.type == 'oneoff': if not line.sdd_mandate_id.last_debit_date: if lines_per_seq_type.get('OOFF'): From c7d69a820506f2792a395cdd3baeaffe8548a226 Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Mon, 11 Nov 2013 23:49:39 +0100 Subject: [PATCH 014/118] Add logo. --- .../static/src/img/icon.png | Bin 0 -> 6892 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 account_banking_sepa_direct_debit/static/src/img/icon.png diff --git a/account_banking_sepa_direct_debit/static/src/img/icon.png b/account_banking_sepa_direct_debit/static/src/img/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..6d1d923b6506b33ca0825af17ed0ae36c9bd0dc6 GIT binary patch literal 6892 zcmVPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i*$` z7B3e|!Eq@702*vbL_t(|+RdAHcwFVR?tgpFo<5^8Ga8M0v1A#^k}b=Yja)D`;hH!h zp@cw^OL9)Yq+CcN<6E5%AqMj|;G$)Txm zv~I!^I(n+U|IaV%J#*-PEC8EIvy(P$%HNgdO88Wo)4Jx^$zJiqnE@oNL}_sbt5#-` zn{6jC!MNykqR|+A0~0j24O4rvo6#{JPP>^cm3fMya-x68^T%U{J0Cw#*ERV+0)Xw? z^PE*Hm)%;JXZu1R7){^3zgZMD8a}eEn2qa~A&T!EDNduL$l2G| z?|I^Ib>}0m9&R7`rvY&Lm$vLGD@wn^;}2!--hWoi&vSCawd=523?E3mswy0=Zs#vA zoun|&&brdfuKK2dAOG~%haUe>0oZjz#fp-mjE6JR61P43w|dd#O5!uut;cB4@?ovo zQ$0NQ{Bb_Au|UyC!v5;ou3Mk^+v&3(H~?R}sp@l8Yx3{!=oxn%sq5p*|9S~&uEY<; z=<3=oDl2klUdLhz&puy6PtO=1-C8(wx_RhpKY8?x=ibRRHSgrhKe+w!`!|&5-t)J8 zO$jE8iLc(g^#gPF`Bo?##g=Sl+#MhkiefhDDJ#h!H^;$m|5#(WxIF8s%JMAJKMuF= zdtU*ls6e{y3s*c@R+N6rZ(lg6`Q*peu(_)6JsINC$> zNhT&HgP;mn%z8%0{G_=O*>rIsFYKuov(u8Qwr?!RaR*!X3=X2a=MdPs73ou#eexMs ziuLN>zgRDR`R1)SY?gOqY+y`e0MUY=F=MeNqS0tTRZ&$1k7p7^_M^o7sPY7A z%#FnmMHJ)L@cF~+ef=z18A+^NoilUoqcxpuSerNV`oEt!g59jeYSI7cg#$0%aNq#) zdjjCc-`(+KNs;TuXZ}_%e&yy%m+bP9D8z(xM13|%wroUEL`4NuR7IKon;8I9Rh@pR z#NPw_zA?gqZgj#3MtzKl$sk&-hSv5GBGDL?YjO!rg)y7-^z^yO&a?sWm)&((w4f^L z2#y}Y&K93A-N&ee=ehSBM@H+}zGm)-xa za=>@Ly7l^XtFrFfeV|2i-L;k2lFS#}@Kn@}*>NdJjv^$jVLGPO_yIn>dVBi_27_2E z=U-1<;P1GHXfzTAlbyCsFDWSw%=$1Ula8J~H^=L`iOMp|3sNx|bcDk)k%-Ki)j7O= zq+KXpmQq=iXKy-G)7`ja57>1>#fplOjGxvu4oaJ<3Q0{#Sk!PiCJ>d%NX^}e+2WXo zz^L^0_HpRYVVav;@cDf2$|EF6OHxWX<5Rf=L-7bU8?@Mx%=Gk45Q`}cjd+>#1OfQp z*KgopZMRf*QTl^7UbSlZk^v~aDC=QaQJoQ0q~xNE#f?`abV=JtNn0}~iw6P$nwy(B z@cJ8^ZEhhH3Zbeh$;rv@=>*BiDZ&?7hR%@4%Hj-s{s?uadpTCyg(Qh6(@rFc0-wIR zlDej$^tG#V9$r!ieCNxT?pj-xdFz`ed&TRnUdLi5Q&iSrw0#6?Vg{ht1qR|*5V_pC@ZYZRobyQqkoPNjFisiFnR675~=CXpXI_;Lsu0fxepPRCv z@rnZarnWu>U9ir4EU5{b~()`rL9o%7qI`kM zNfN56@Vlq~fXCxy-)n#2uP^Qa;MLdu!6jR&`0Qt{QhlQIW@n4;oLanAmJf|bXA^(0MA&0KTMm3;Xt-=wiIUei=U3aaCS0QF(oH@4m@s#B4U9 zo|hB;_=l%BR$as1egELb&wq(MFFnVmEjxJW#b-%OOh8o>+S)qs`vW}rn}=|vrlP6} zimLGYXJ6okPhZ8vq=(*qHxZ=(gE)#t6zCtEM3!TetVl_Vs0p-u~@s;UrEVmRzJ1Odjz-8k%abUF?F{R6}TC(%kWvaFDn znutz!E+NXY!ttXmihDBfz#aF!@@)|y$zrH-dx9)4T=?#)8Ykui*OG|JeD0r=lz=2j z7m&PE#>Xe-yl*rZiALpFNmo%6L{WpmU?4Lijo!X~Iy!qm5Qzzn>0?ryVTI?|q=-4e zAX=^ZDgbePSw^PQVJQnm6mhX)M`tNmGE;NA-E-rA3G8opWCWkji`P4wDx1wF91a`V zS(!wmQ2-JX6H%1dIoGzB(CM@Yf`A}7h{fVQ6pBRW<{h05m)*L$;-VavSW%X}Ex~Hg znHDi#RRt`G1xq$QcHYL`y0bQ$eZk)}Hl1b16;~6Q3Zo)$@utgXeV&+@fJP(Y_4+Ux zjWeM#JTe+5N$p*PLlNYtJZ+$fsA8PqERo3U{n%|*bUKY;?Hbo*qSIwv24FE87CHJ7 z(dtY~0$_aHJ*OtnXf)XE^Ls!z9A?j+S1B)F6|WFgm1BqZ&Kp+2;1r38Rzl%0$;nCN z=48bUmNZCO39artQC6@{eZg~GT}Q+ZU+pnWAtON)Q^JnnBYnJ}4*^LjvW@kP|0sAJ3KDxz|XhBJ*6m#m<^p^>XTu@j@w z$jQ3XJo?B3yuAB4{_^}&05qIwV$;UT8RG$JYU;?%%{rF?G$IjMo#`LUsb>TMK@v@( zMkAW^+6#1agr&6)CfxJI|NP-|*=1Y#Kev99y1IHcZ>~Zk3Y=+dV&@f?Q(Iey#bV** zSN5@b)k?m4+qb!5=XLBqaEMd&4eYpl8@GM^4t8GoS@yiLm!6(JoT(|?e9P?&3=E%_ z2Q-X~`Z#r_pA+@H3=VtFM*xi=ScJ##xn?js%jR@tITs}OCg-)7ttlvqf*>$26AXt# z?B9QYxHqY&N?gb&E?z;JEA=g2x1cIKF)>LX5I`e|bai$!G(1Yhnle;HrLplW7Zn%L z($b2-U?3|q9Tk-mC+b;KUdqVG810>1tgkGmq2VkA%W}{g^mLwmjc{m+43Ac~dv;9M2ET#m{S8V1d0`d~#e{@cfq^b%|r*lc(qtok%#bQLGG8&Br zqap6zo!vc@l*ARJNJK``NV8a7ykiu?F#Y|g97B>M!r=&G6Fzct?C5k7MuV1&v_u95 zJu{+4OjZ42OjUz#v8DxifE;{R>@P7f5lLEF_?V1FT&`5)XcRdXBQO=B`uGWa=dr>- zAb`aZ&qu-F6lQb$sEdRn#N-%tb!S+XpM@kzOiXxiIV>z+<|KW(cPR)0k%&C4O(?`< zB`AXG7J-S$z{1Cy?0Z+|zs+V_GJj}nYUavMT#q1%$k7-sr-RCMYi8v0uC5+_^1vgQ zEoP!o8L!um)oNkqm7gUXj*^j)77t1Ftv!c$d+Ff|L@*e&(_n@`z%5QqMSCPkWNIq1 zu>L1|7Tvth=O+{j&7r?``@#T(!(oPoMsT|)h(@CvJb0Lm8#kaTDxuI68clqoxjET1 zx3+Qc&7%|*6{68-$j;8d7x3e-+t~f$(*%M+%oZ~#4m*AQgK_Yabol%cqSGWO7E>7- z@sOPv=OmGktONql9w`u(I{>1Qh2uOD7+4g5(b183>+8Ho5;YoZHe0;Bov+d9@gd7m zt@N73>ET3g#GDK4V6whoueNq%lNu~>|; zF*hx(?L76{=XmgEchhv%PitEz*)Ek8g{jokbz`?#@OXn1U77kTL6$7t{9WYwxt5)!Ta?&&}9 zgCE|@8wU?_#g31#e0d=a4NWvOH1YfkyUEVVL?cOjao0CUNKD|FXJ4SRtB1S(<337? zizqC}Lm*D4FJ6~VYKoP0<+)^}B~5FIqgYH@dWR?5#QM_%`#rv?NN6g$;87q5Dt=Gf zyq^W9rsj?R#nNg|PcH_8o}d5xF>b!;3%FdVtSl);r_=GXpZ$`?re-3M2(RrufZ1%~ zc+Cmyb{luy^=(c!G!YI**t_?2%2$`NEI)@!w{GOlJHEl)Km2a|R0w*J!ya_g%JAC< zv%;Y;et#r%;^fGF@y(OH14CoJx>UQ7p5F0=!@xg301c-b=I!hIyuKNg=k2*65{c)V z*4B0k3zyN*(8#)VYlz7TjZMw`_4%i1s6WE-WBUO(c<3nk`MG!|y%ZMYV>IfiJJrCl z{9FbGhdEwTM_z6=k#GdPPDfg*NKs)b&XoBnd}u1n@VKw8wyAqa1PJ(|hjm(sfdTiz zWH2^Dz&mta40||steVNm`KQ&Q(I}_t>*s*r_4?3HQ`n6gH}D_d{}GK%&8%Bjfuh8? z>XSRU=DN?bvg~4d`}zTRzgwq zOec)so(wWN<|7oEEr^Vb`w>-D@dQGLW;DT1?I_vw`RglRZ||94%Oxe^d>x@lPmobh zB8J3rCMG5cO$CY5LiIdN@O-uxXM&QXA;n?GY&K&uo3PuH85!tQ0pBo**$Cx{XYSN&d~BYBs;{(&?ibfX24bo{j5rcV?$2rFZmB3iAy;b##w2;U2~pG=Lz1 zsv=1ef+!G+#fZfeWla-l)q>am0q99^4 z>abYM)4V~QAuZ?k2Hz4pe11RO-MtJBk5E{UKl44UR?E~>5Tn?M$sjU1?x($T42Rt^ zlM7T8T3Y(?`9jqXJod&9X7vSn`zHTfkmFc8*fIjE=k^AQi(J#{kV;Cp1|_)^>P1x+eb1VKdRx)W>2sM4dW~XQGpT*7EuNjEsz(OSq9K#8@w)2#1cf zQ(M;qz~Jz?1byIOGt2YrN_UU@H^+{(dFO49AFJ(ncx2qyQ&yC!?EOdM!U~ZH;fdD? z`iB200C*<7jE%dei#i!Oa1xh8k03yDk_oGIw!j+*Mi?EQBovmrUOCqEiv{NcUOw11 zcB*mk?xX|*UXPz~_re8|MvUSgc@^JzN8^XRVsZpI*ojdW!erK?s*viil46gK@vU4D zpKf_^PaPMp$x==>^xb{rNS}Mr5t*Mn_Qn$}9bmo*#f(sQcNbQ}C`rZvtY(S!u2Gs=hDmW)>Fsy3EH5RV z11tvofiO?~{!OmfvOIF6rfb))eqViX$p8QxuIWCrJlB!1wk&Hyd*`U&3r5LIPriUR zOc4pRpxbi^z^$Q{r7ubxqZ?7UMSvVP1`Fe37I8T6*((v>bix2Vc(+R zaIPN+TG59_>0@&IEJ6PWp`edwBt$4Iqc<35866A;3HU|{1%?QC+nMq-U=({WXnklU z6`w!M;p%o|S)sHzgA}_3lSxP4z+@Z%qmD7RpNAja&-EWGRl55op8x9`FWuDDwfMyN zk{+0-s6hJEWmo)a^~#JJ51;532gick@-JIvRM~gB6h*}!lu=bNt|TckMuRwKvg_@u z{!Blq&IHUR9o>CyN{Z6(`9fH&25L|Bu;-OieE#YRrLk@3iC2!i{N)QxiZ96n00sw9 z_P*Kn*P>+(8XJpR<1!iu7_clE%8APDGn8Vq_7y-q-{*UStuEh@c_`N_|9 z%!HH0tVfbWo_h8O1HGeMvtwoC#F>Hn?!5o+U%$|ue@6hkwf=FqeP3!yLQ7tzZPUeT zvdvFDS1q)(k5F2iu_OcD>vFpTq&O^SG$IzWp1RY0JowAKtS`$@iVITv57l&k>7GaS zKm1Ovsd=ZHIC`S{j80;Y$)qp3d~;!*2GRyK(-j~PZ7FsC|%XG73jE5iF zk9*9^jaQc|V-tZ_4;TO1sk|iP-%{+B+@mMD#Y45-tXZAI z&dWJSP9G?v0 z4@L=vqR5JZ$*9AqldxEHWTqyNnU&-T=)lS5-hmHtfBzqpiy;_LBaChU0000 Date: Tue, 12 Nov 2013 22:36:13 +0100 Subject: [PATCH 015/118] FIX FR translation. --- account_banking_sepa_direct_debit/i18n/fr.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/account_banking_sepa_direct_debit/i18n/fr.po b/account_banking_sepa_direct_debit/i18n/fr.po index c823791c8..25b2df96f 100644 --- a/account_banking_sepa_direct_debit/i18n/fr.po +++ b/account_banking_sepa_direct_debit/i18n/fr.po @@ -191,7 +191,7 @@ msgstr "Le mandat de prélèvement SEPA a expiré" #: help:banking.export.sdd,charge_bearer:0 #: help:banking.export.sdd.wizard,charge_bearer:0 msgid "Following service level : transaction charges are to be applied following the rules agreed in the service level and/or scheme (SEPA Core messages must use this). Shared : transaction charges on the creditor side are to be borne by the creditor, transaction charges on the debtor side are to be borne by the debtor. Borne by creditor : all transaction charges are to be borne by the creditor. Borne by debtor : all transaction charges are to be borne by the debtor." -msgstr "Suivant le niveau de service : la répartition des frais bancaires suit les règles pré-établies dans le schema ou dans le contrat avec la banque (les messages SEPA Core doivent utiliser ce paramètre). Partagés : les frais bancaires côté débiteur sont à la charge du débiteur, les frais bancaires côté créditeur sont à la charge du créditeur. Supportés par le créancier : tous les frais bancaires sont à la charge du créancier. Supportés par le débiteur : tous les frais bancaires sont à la charge du débiteur." +msgstr "Suivant le niveau de service : la répartition des frais bancaires suit les règles pré-établies dans le schema ou dans le contrat avec la banque (les messages SEPA Core doivent utiliser ce paramètre). Partagés : les frais bancaires côté débiteur sont à la charge du débiteur, les frais bancaires côté créancier sont à la charge du créancier. Supportés par le créancier : tous les frais bancaires sont à la charge du créancier. Supportés par le débiteur : tous les frais bancaires sont à la charge du débiteur." #. module: account_banking_sepa_direct_debit #: view:sdd.mandate:0 From 239ee148e4560ad02471f656e1e92160eaba4127 Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Thu, 21 Nov 2013 00:24:56 +0100 Subject: [PATCH 016/118] Remove fields_view_get() on payment.order because dynamic domain is now possible and I implemented it in a previous commit. Minor usability improvements in mandate menu and views Refresh partner_id field on mandate in the on_change of partner_bank_id --- .../account_banking_sdd.py | 15 +++++++++------ .../sdd_mandate_view.xml | 10 +++++----- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/account_banking_sepa_direct_debit/account_banking_sdd.py b/account_banking_sepa_direct_debit/account_banking_sdd.py index 52c3b6f11..d65aff415 100644 --- a/account_banking_sepa_direct_debit/account_banking_sdd.py +++ b/account_banking_sepa_direct_debit/account_banking_sdd.py @@ -223,18 +223,21 @@ class sdd_mandate(orm.Model): def mandate_partner_bank_change( self, cr, uid, ids, partner_bank_id, type, recurrent_sequence_type, last_debit_date, state): + res = {'value': {}} + if partner_bank_id: + partner_bank_read = self.pool['res.partner.bank'].read( + cr, uid, partner_bank_id, ['partner_id'])['partner_id'] + if partner_bank_read: + res['value']['partner_id'] = partner_bank_read[0] if (state == 'valid' and partner_bank_id and type == 'recurrent' and recurrent_sequence_type != 'first'): - return { - 'value': {'recurrent_sequence_type': 'first'}, - 'warning': { + res['value']['recurrent_sequence_type'] = 'first' + res['warning'] = { 'title': _('Mandate update'), 'message': _("As you changed the bank account attached to this mandate, the 'Sequence Type' has been set back to 'First'."), - } } - else: - return True + return res def validate(self, cr, uid, ids, context=None): to_validate_ids = [] diff --git a/account_banking_sepa_direct_debit/sdd_mandate_view.xml b/account_banking_sepa_direct_debit/sdd_mandate_view.xml index 9e6e17991..ad11d8804 100644 --- a/account_banking_sepa_direct_debit/sdd_mandate_view.xml +++ b/account_banking_sepa_direct_debit/sdd_mandate_view.xml @@ -25,16 +25,16 @@ + - @@ -95,7 +95,7 @@ From f65f2f3448e6f6b4335c9ec804c127f6cac75299 Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Thu, 12 Dec 2013 14:47:01 +0100 Subject: [PATCH 017/118] Start code factoring between SCT and SDD. --- .../__openerp__.py | 2 +- .../wizard/export_sdd.py | 174 +++++------------- 2 files changed, 47 insertions(+), 129 deletions(-) diff --git a/account_banking_sepa_direct_debit/__openerp__.py b/account_banking_sepa_direct_debit/__openerp__.py index 44c744a4a..070d965a1 100644 --- a/account_banking_sepa_direct_debit/__openerp__.py +++ b/account_banking_sepa_direct_debit/__openerp__.py @@ -26,7 +26,7 @@ 'author': 'Akretion', 'website': 'http://www.akretion.com', 'category': 'Banking addons', - 'depends': ['account_direct_debit'], + 'depends': ['account_direct_debit', 'account_banking_pain_base'], 'external_dependencies': { 'python': ['unidecode', 'lxml'], }, diff --git a/account_banking_sepa_direct_debit/wizard/export_sdd.py b/account_banking_sepa_direct_debit/wizard/export_sdd.py index 1f68674a7..39422b74c 100644 --- a/account_banking_sepa_direct_debit/wizard/export_sdd.py +++ b/account_banking_sepa_direct_debit/wizard/export_sdd.py @@ -36,6 +36,7 @@ _logger = logging.getLogger(__name__) class banking_export_sdd_wizard(orm.TransientModel): _name = 'banking.export.sdd.wizard' + _inherit = ['banking.export.pain'] _description = 'Export SEPA Direct Debit File' _columns = { 'state': fields.selection([ @@ -78,16 +79,6 @@ class banking_export_sdd_wizard(orm.TransientModel): 'state': 'create', } - def _validate_iban(self, cr, uid, iban, context=None): - '''if IBAN is valid, returns IBAN - if IBAN is NOT valid, raises an error message''' - partner_bank_obj = self.pool.get('res.partner.bank') - if partner_bank_obj.is_iban_valid(cr, uid, iban, context=context): - return iban.replace(' ', '') - else: - raise orm.except_orm( - _('Error:'), _("This IBAN is not valid : %s") % iban) - def create(self, cr, uid, vals, context=None): payment_order_ids = context.get('active_ids', []) vals.update({ @@ -96,44 +87,6 @@ class banking_export_sdd_wizard(orm.TransientModel): return super(banking_export_sdd_wizard, self).create( cr, uid, vals, context=context) - def _prepare_field( - self, cr, uid, field_name, field_value, eval_ctx, max_size=0, - context=None): - '''This function is designed to be inherited !''' - assert isinstance(eval_ctx, dict), 'eval_ctx must contain a dict' - try: - # SEPA uses XML ; XML = UTF-8 ; UTF-8 = support for all characters - # But we are dealing with banks... - # and many banks don't want non-ASCCI characters ! - # cf section 1.4 "Character set" of the SEPA Core Direct Debit - # Customer-to-bank implementation guidelines - value = unidecode(safe_eval(field_value, eval_ctx)) - except: - line = eval_ctx.get('line') - if line: - raise orm.except_orm( - _('Error:'), - _("Cannot compute the '%s' of the Payment Line with Invoice Reference '%s'.") - % (field_name, self.pool['account.invoice'].name_get( - cr, uid, [line.ml_inv_ref.id], context=context)[0][1])) - else: - raise orm.except_orm( - _('Error:'), - _("Cannot compute the '%s'.") % field_name) - if not isinstance(value, (str, unicode)): - raise orm.except_orm( - _('Field type error:'), - _("The type of the field '%s' is %s. It should be a string or unicode.") - % (field_name, type(value))) - if not value: - raise orm.except_orm( - _('Error:'), - _("The '%s' is empty or 0. It should have a non-null value.") - % field_name) - if max_size and len(value) > max_size: - value = value[0:max_size] - return value - def _prepare_export_sepa( self, cr, uid, sepa_export, total_amount, transactions_count, xml_string, context=None): @@ -149,26 +102,6 @@ class banking_export_sdd_wizard(orm.TransientModel): ], } - def _validate_xml(self, cr, uid, xml_string, pain_flavor): - xsd_etree_obj = etree.parse( - tools.file_open( - 'account_banking_sepa_direct_debit/data/%s.xsd' - % pain_flavor)) - official_pain_schema = etree.XMLSchema(xsd_etree_obj) - - try: - root_to_validate = etree.fromstring(xml_string) - official_pain_schema.assertValid(root_to_validate) - except Exception, e: - _logger.warning( - "The XML file is invalid against the XML Schema Definition") - _logger.warning(xml_string) - _logger.warning(e) - raise orm.except_orm( - _('Error:'), - _('The generated XML file is not valid against the official XML Schema Definition. The generated XML file and the full error have been written in the server logs. Here is the error, which may give you an idea on the cause of the problem : %s') - % str(e)) - return True def _get_previous_bank(self, cr, uid, payline, context=None): payline_obj = self.pool['payment.line'] @@ -203,6 +136,8 @@ class banking_export_sdd_wizard(orm.TransientModel): sepa_export = self.browse(cr, uid, ids[0], context=context) pain_flavor = sepa_export.payment_order_ids[0].mode.type.code + convert_to_ascii = \ + sepa_export.payment_order_ids[0].mode.convert_to_ascii if pain_flavor == 'pain.008.001.02': bic_xml_tag = 'BIC' name_maxsize = 70 @@ -217,6 +152,13 @@ class banking_export_sdd_wizard(orm.TransientModel): root_xml_tag = 'CstmrDrctDbtInitn' else: raise orm.except_orm(_('Error:'), _("Payment Type Code '%s' is not supported. The only Payment Type Code supported for SEPA Direct Debit are 'pain.008.001.02', 'pain.008.001.03' and 'pain.008.001.04'.") % pain_flavor) + + gen_args = { + 'bic_xml_tag': bic_xml_tag, + 'name_maxsize': name_maxsize, + 'convert_to_ascii': convert_to_ascii, + } + if sepa_export.requested_collec_date: my_requested_collec_date = sepa_export.requested_collec_date else: @@ -243,15 +185,16 @@ class banking_export_sdd_wizard(orm.TransientModel): message_identification_1_1.text = self._prepare_field( cr, uid, 'Message Identification', 'sepa_export.payment_order_ids[0].reference', - {'sepa_export': sepa_export}, 35, context=context) + {'sepa_export': sepa_export}, 35, + convert_to_ascii=convert_to_ascii, context=context) creation_date_time_1_2 = etree.SubElement(group_header_1_0, 'CreDtTm') creation_date_time_1_2.text = datetime.strftime( datetime.today(), '%Y-%m-%dT%H:%M:%S') nb_of_transactions_1_6 = etree.SubElement(group_header_1_0, 'NbOfTxs') control_sum_1_7 = etree.SubElement(group_header_1_0, 'CtrlSum') - initiating_party_1_8 = etree.SubElement(group_header_1_0, 'InitgPty') - initiating_party_name = etree.SubElement(initiating_party_1_8, 'Nm') - initiating_party_name.text = my_company_name + self.generate_initiating_party_block( + cr, uid, group_header_1_0, sepa_export, gen_args, + context=context) transactions_count_1_6 = 0 total_amount = 0.0 @@ -312,7 +255,7 @@ class banking_export_sdd_wizard(orm.TransientModel): cr, uid, 'Payment Information Identification', "sequence_type + '-' + sepa_export.payment_order_ids[0].reference", {'sepa_export': sepa_export, 'sequence_type': sequence_type}, - 35, context=context) + 35, convert_to_ascii=convert_to_ascii, context=context) payment_method_2_2 = etree.SubElement(payment_info_2_0, 'PmtMtd') payment_method_2_2.text = 'DD' # batch_booking is in "Payment Info" with pain.008.001.02/03 @@ -347,30 +290,14 @@ class banking_export_sdd_wizard(orm.TransientModel): requested_collec_date_2_18 = etree.SubElement( payment_info_2_0, 'ReqdColltnDt') requested_collec_date_2_18.text = my_requested_collec_date - creditor_2_19 = etree.SubElement(payment_info_2_0, 'Cdtr') - creditor_name = etree.SubElement(creditor_2_19, 'Nm') - creditor_name.text = my_company_name - creditor_account_2_20 = etree.SubElement( - payment_info_2_0, 'CdtrAcct') - creditor_account_id = etree.SubElement(creditor_account_2_20, 'Id') - creditor_account_iban = etree.SubElement( - creditor_account_id, 'IBAN') - creditor_account_iban.text = self._validate_iban( - cr, uid, self._prepare_field( - cr, uid, 'Company IBAN', - 'sepa_export.payment_order_ids[0].mode.bank_id.acc_number', - {'sepa_export': sepa_export}, context=context), - context=context) - creditor_agent_2_21 = etree.SubElement(payment_info_2_0, 'CdtrAgt') - creditor_agent_institution = etree.SubElement( - creditor_agent_2_21, 'FinInstnId') - creditor_agent_bic = etree.SubElement( - creditor_agent_institution, bic_xml_tag) - creditor_agent_bic.text = self._prepare_field( - cr, uid, 'Company BIC', + self.generate_party_block( + cr, uid, payment_info_2_0, 'Cdtr', 'B', + 'sepa_export.payment_order_ids[0].mode.bank_id.partner_id.name', + 'sepa_export.payment_order_ids[0].mode.bank_id.acc_number', 'sepa_export.payment_order_ids[0].mode.bank_id.bank.bic', - {'sepa_export': sepa_export}, context=context) + {'sepa_export': sepa_export}, + gen_args, context=context) charge_bearer_2_24 = etree.SubElement(payment_info_2_0, 'ChrgBr') charge_bearer_2_24.text = sepa_export.charge_bearer @@ -385,7 +312,8 @@ class banking_export_sdd_wizard(orm.TransientModel): csi_other_id.text = self._prepare_field( cr, uid, 'SEPA Creditor Identifier', 'sepa_export.payment_order_ids[0].company_id.sepa_creditor_identifier', - {'sepa_export': sepa_export}, context=context) + {'sepa_export': sepa_export}, + convert_to_ascii=convert_to_ascii, context=context) csi_scheme_name = etree.SubElement(csi_other, 'SchmeNm') csi_scheme_name_proprietary = etree.SubElement( csi_scheme_name, 'Prtry') @@ -404,10 +332,12 @@ class banking_export_sdd_wizard(orm.TransientModel): payment_identification_2_29, 'EndToEndId') end2end_identification_2_31.text = self._prepare_field( cr, uid, 'End to End Identification', 'line.name', - {'line': line}, 35, context=context) + {'line': line}, 35, + convert_to_ascii=convert_to_ascii, context=context) currency_name = self._prepare_field( cr, uid, 'Currency Code', 'line.currency.name', - {'line': line}, 3, context=context) + {'line': line}, 3, convert_to_ascii=convert_to_ascii, + context=context) instructed_amount_2_44 = etree.SubElement( dd_transaction_info_2_28, 'InstdAmt', Ccy=currency_name) instructed_amount_2_44.text = '%.2f' % line.amount_currency @@ -422,13 +352,15 @@ class banking_export_sdd_wizard(orm.TransientModel): mandate_identification_2_48.text = self._prepare_field( cr, uid, 'Unique Mandate Reference', 'line.sdd_mandate_id.unique_mandate_reference', - {'line': line}, 35, context=context) + {'line': line}, 35, + convert_to_ascii=convert_to_ascii, context=context) mandate_signature_date_2_49 = etree.SubElement( mandate_related_info_2_47, 'DtOfSgntr') mandate_signature_date_2_49.text = self._prepare_field( cr, uid, 'Mandate Signature Date', 'line.sdd_mandate_id.signature_date', - {'line': line}, 10, context=context) + {'line': line}, 10, + convert_to_ascii=convert_to_ascii, context=context) if (sequence_type == 'FRST' and line.sdd_mandate_id.last_debit_date): previous_bank = self._get_previous_bank( @@ -451,6 +383,7 @@ class banking_export_sdd_wizard(orm.TransientModel): cr, uid, 'Original Debtor Account', 'previous_bank.acc_number', {'previous_bank': previous_bank}, + convert_to_ascii=convert_to_ascii, context=context), context=context) else: @@ -464,6 +397,7 @@ class banking_export_sdd_wizard(orm.TransientModel): cr, uid, 'Original Debtor Agent', 'previous_bank.bank.bic', {'previous_bank': previous_bank}, + convert_to_ascii=convert_to_ascii, context=context) ori_debtor_agent_other = etree.SubElement( ori_debtor_agent_institution, 'Othr') @@ -472,32 +406,13 @@ class banking_export_sdd_wizard(orm.TransientModel): ori_debtor_agent_other_id.text = 'SMNDA' # SMNDA = Same Mandate New Debtor Agent - debtor_agent_2_70 = etree.SubElement( - dd_transaction_info_2_28, 'DbtrAgt') - debtor_agent_institution = etree.SubElement( - debtor_agent_2_70, 'FinInstnId') - debtor_agent_bic = etree.SubElement( - debtor_agent_institution, bic_xml_tag) - debtor_agent_bic.text = self._prepare_field( - cr, uid, 'Customer BIC', 'line.bank_id.bank.bic', - {'line': line}, context=context) - debtor_2_72 = etree.SubElement( - dd_transaction_info_2_28, 'Dbtr') - debtor_name = etree.SubElement(debtor_2_72, 'Nm') - debtor_name.text = self._prepare_field( - cr, uid, 'Customer Name', 'line.partner_id.name', - {'line': line}, name_maxsize, context=context) - debtor_account_2_73 = etree.SubElement( - dd_transaction_info_2_28, 'DbtrAcct') - debtor_account_id = etree.SubElement(debtor_account_2_73, 'Id') - debtor_account_iban = etree.SubElement( - debtor_account_id, 'IBAN') - debtor_account_iban.text = self._validate_iban( - cr, uid, self._prepare_field( - cr, uid, 'Customer IBAN', - 'line.bank_id.acc_number', {'line': line}, - context=context), - context=context) + self.generate_party_block( + cr, uid, dd_transaction_info_2_28, 'Dbtr', 'C', + 'line.partner_id.name', + 'line.bank_id.acc_number', + 'line.bank_id.bank.bic', + {'line': line}, gen_args, context=context) + remittance_info_2_88 = etree.SubElement( dd_transaction_info_2_28, 'RmtInf') # switch to Structured (Strdr) ? If we do it, beware that the format is not the same between pain 02 and pain 03 @@ -505,7 +420,8 @@ class banking_export_sdd_wizard(orm.TransientModel): remittance_info_2_88, 'Ustrd') remittance_info_unstructured_2_89.text = self._prepare_field( cr, uid, 'Remittance Information', 'line.communication', - {'line': line}, 140, context=context) + {'line': line}, 140, convert_to_ascii=convert_to_ascii, + context=context) nb_of_transactions_2_4.text = str(transactions_count_2_4) control_sum_2_5.text = '%.2f' % amount_control_sum_2_5 nb_of_transactions_1_6.text = str(transactions_count_1_6) @@ -516,7 +432,9 @@ class banking_export_sdd_wizard(orm.TransientModel): _logger.debug( "Generated SDD XML file in format %s below" % pain_flavor) _logger.debug(xml_string) - self._validate_xml(cr, uid, xml_string, pain_flavor) + pain_xsd_file = \ + 'account_banking_sepa_direct_debit/data/%s.xsd' % pain_flavor + self._validate_xml(cr, uid, xml_string, pain_xsd_file) # CREATE the banking.export.sepa record file_id = self.pool.get('banking.export.sdd').create( From 39d8b5c2a986fad92cd3830844fe1f5f92e1a1b0 Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Thu, 12 Dec 2013 22:46:16 +0100 Subject: [PATCH 018/118] More code factoring between SCT and SDD As a consequence, we now have support for structured remittance info in SDD. --- .../account_banking_sdd_view.xml | 2 +- .../wizard/export_sdd.py | 34 +++++-------------- 2 files changed, 9 insertions(+), 27 deletions(-) diff --git a/account_banking_sepa_direct_debit/account_banking_sdd_view.xml b/account_banking_sepa_direct_debit/account_banking_sdd_view.xml index 079e2023b..f3712479a 100644 --- a/account_banking_sepa_direct_debit/account_banking_sdd_view.xml +++ b/account_banking_sepa_direct_debit/account_banking_sdd_view.xml @@ -56,7 +56,7 @@ - Generated SEPA Direct Debit Files + SEPA Direct Debit Files banking.export.sdd form tree,form diff --git a/account_banking_sepa_direct_debit/wizard/export_sdd.py b/account_banking_sepa_direct_debit/wizard/export_sdd.py index 39422b74c..e285a36c7 100644 --- a/account_banking_sepa_direct_debit/wizard/export_sdd.py +++ b/account_banking_sepa_direct_debit/wizard/export_sdd.py @@ -29,7 +29,6 @@ import base64 from datetime import datetime, timedelta from lxml import etree import logging -from unidecode import unidecode _logger = logging.getLogger(__name__) @@ -157,6 +156,7 @@ class banking_export_sdd_wizard(orm.TransientModel): 'bic_xml_tag': bic_xml_tag, 'name_maxsize': name_maxsize, 'convert_to_ascii': convert_to_ascii, + 'pain_flavor': pain_flavor, } if sepa_export.requested_collec_date: @@ -179,22 +179,9 @@ class banking_export_sdd_wizard(orm.TransientModel): {'sepa_export': sepa_export}, name_maxsize, context=context) # A. Group header - group_header_1_0 = etree.SubElement(pain_root, 'GrpHdr') - message_identification_1_1 = etree.SubElement( - group_header_1_0, 'MsgId') - message_identification_1_1.text = self._prepare_field( - cr, uid, 'Message Identification', - 'sepa_export.payment_order_ids[0].reference', - {'sepa_export': sepa_export}, 35, - convert_to_ascii=convert_to_ascii, context=context) - creation_date_time_1_2 = etree.SubElement(group_header_1_0, 'CreDtTm') - creation_date_time_1_2.text = datetime.strftime( - datetime.today(), '%Y-%m-%dT%H:%M:%S') - nb_of_transactions_1_6 = etree.SubElement(group_header_1_0, 'NbOfTxs') - control_sum_1_7 = etree.SubElement(group_header_1_0, 'CtrlSum') - self.generate_initiating_party_block( - cr, uid, group_header_1_0, sepa_export, gen_args, - context=context) + group_header_1_0, nb_of_transactions_1_6, control_sum_1_7 = \ + self.generate_group_header_block( + cr, uid, pain_root, sepa_export, gen_args, context=context) transactions_count_1_6 = 0 total_amount = 0.0 @@ -413,15 +400,10 @@ class banking_export_sdd_wizard(orm.TransientModel): 'line.bank_id.bank.bic', {'line': line}, gen_args, context=context) - remittance_info_2_88 = etree.SubElement( - dd_transaction_info_2_28, 'RmtInf') - # switch to Structured (Strdr) ? If we do it, beware that the format is not the same between pain 02 and pain 03 - remittance_info_unstructured_2_89 = etree.SubElement( - remittance_info_2_88, 'Ustrd') - remittance_info_unstructured_2_89.text = self._prepare_field( - cr, uid, 'Remittance Information', 'line.communication', - {'line': line}, 140, convert_to_ascii=convert_to_ascii, - context=context) + self.generate_remittance_info_block( + cr, uid, dd_transaction_info_2_28, + line, gen_args, context=context) + nb_of_transactions_2_4.text = str(transactions_count_2_4) control_sum_2_5.text = '%.2f' % amount_control_sum_2_5 nb_of_transactions_1_6.text = str(transactions_count_1_6) From 27da3996bd40526f29a7511c0dda60a2a11b55b6 Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Thu, 12 Dec 2013 23:19:53 +0100 Subject: [PATCH 019/118] The requested collection date now uses the fields date_prefered and date_scheduled of payment.order, instead of the field in the SDD wizard. --- .../account_banking_sdd.py | 2 - .../account_banking_sdd_view.xml | 2 - .../wizard/export_sdd.py | 61 +++++++++++-------- .../wizard/export_sdd_view.xml | 1 - 4 files changed, 36 insertions(+), 30 deletions(-) diff --git a/account_banking_sepa_direct_debit/account_banking_sdd.py b/account_banking_sepa_direct_debit/account_banking_sdd.py index d65aff415..7b2be778f 100644 --- a/account_banking_sepa_direct_debit/account_banking_sdd.py +++ b/account_banking_sepa_direct_debit/account_banking_sdd.py @@ -56,8 +56,6 @@ class banking_export_sdd(orm.Model): 'banking_export_sepa_id', 'account_order_id', 'Payment Orders', readonly=True), - 'requested_collec_date': fields.date( - 'Requested Collection Date', readonly=True), 'nb_transactions': fields.integer( 'Number of Transactions', readonly=True), 'total_amount': fields.float( diff --git a/account_banking_sepa_direct_debit/account_banking_sdd_view.xml b/account_banking_sepa_direct_debit/account_banking_sdd_view.xml index f3712479a..f89ec7389 100644 --- a/account_banking_sepa_direct_debit/account_banking_sdd_view.xml +++ b/account_banking_sepa_direct_debit/account_banking_sdd_view.xml @@ -16,7 +16,6 @@ - @@ -47,7 +46,6 @@ - diff --git a/account_banking_sepa_direct_debit/wizard/export_sdd.py b/account_banking_sepa_direct_debit/wizard/export_sdd.py index e285a36c7..59d031362 100644 --- a/account_banking_sepa_direct_debit/wizard/export_sdd.py +++ b/account_banking_sepa_direct_debit/wizard/export_sdd.py @@ -45,9 +45,6 @@ class banking_export_sdd_wizard(orm.TransientModel): 'batch_booking': fields.boolean( 'Batch Booking', help="If true, the bank statement will display only one credit line for all the direct debits of the SEPA file ; if false, the bank statement will display one credit line per direct debit of the SEPA file."), - 'requested_collec_date': fields.date( - 'Requested Collection Date', - help='This is the date on which you would like the collection to be made by the bank. Please keep in mind that there are minimum delays for SEPA direct debits that depend on the type of mandate and the type of sequence.'), 'charge_bearer': fields.selection([ ('SLEV', 'Following Service Level'), ('SHAR', 'Shared'), @@ -92,7 +89,6 @@ class banking_export_sdd_wizard(orm.TransientModel): return { 'batch_booking': sepa_export.batch_booking, 'charge_bearer': sepa_export.charge_bearer, - 'requested_collec_date': sepa_export.requested_collec_date, 'total_amount': total_amount, 'nb_transactions': transactions_count, 'file': base64.encodestring(xml_string), @@ -159,12 +155,6 @@ class banking_export_sdd_wizard(orm.TransientModel): 'pain_flavor': pain_flavor, } - if sepa_export.requested_collec_date: - my_requested_collec_date = sepa_export.requested_collec_date - else: - my_requested_collec_date = datetime.strftime( - datetime.today() + timedelta(days=1), '%Y-%m-%d') - pain_ns = { 'xsi': 'http://www.w3.org/2001/XMLSchema-instance', None: 'urn:iso:std:iso:20022:tech:xsd:%s' % pain_flavor, @@ -186,14 +176,23 @@ class banking_export_sdd_wizard(orm.TransientModel): transactions_count_1_6 = 0 total_amount = 0.0 amount_control_sum_1_7 = 0.0 - lines_per_seq_type = {} - # key = sequence type ; value = list of lines as objects + lines_per_group = {} + # key = (requested_collec_date, priority, sequence type) + # value = list of lines as objects # Iterate on payment orders + today = fields.date.context_today(self, cr, uid, context=context) for payment_order in sepa_export.payment_order_ids: total_amount = total_amount + payment_order.total # Iterate each payment lines for line in payment_order.line_ids: transactions_count_1_6 += 1 + priority = line.priority + if payment_order.date_prefered == 'due': + requested_collec_date = line.ml_maturity_date or today + elif payment_order.date_prefered == 'fixed': + requested_collec_date = payment_order.date_scheduled or today + else: + requested_collec_date = today if not line.sdd_mandate_id: raise orm.except_orm( _('Error:'), @@ -208,10 +207,7 @@ class banking_export_sdd_wizard(orm.TransientModel): line.sdd_mandate_id.partner_id.name)) if line.sdd_mandate_id.type == 'oneoff': if not line.sdd_mandate_id.last_debit_date: - if lines_per_seq_type.get('OOFF'): - lines_per_seq_type['OOFF'].append(line) - else: - lines_per_seq_type['OOFF'] = [line] + seq_type = 'OOFF' else: raise orm.except_orm( _('Error:'), @@ -228,21 +224,32 @@ class banking_export_sdd_wizard(orm.TransientModel): seq_type_label = line.sdd_mandate_id.recurrent_sequence_type assert seq_type_label is not False seq_type = seq_type_map[seq_type_label] - if lines_per_seq_type.get(seq_type): - lines_per_seq_type[seq_type].append(line) - else: - lines_per_seq_type[seq_type] = [line] - for sequence_type, lines in lines_per_seq_type.items(): + key = (requested_collec_date, priority, seq_type) + if key in lines_per_group: + lines_per_group[key].append(line) + else: + lines_per_group[key] = [line] + # Write requested_exec_date on 'Payment date' of the pay line + if requested_collec_date != line.date: + self.pool['payment.line'].write( + cr, uid, line.id, + {'date': requested_collec_date}, context=context) + + for (requested_collec_date, priority, sequence_type), lines in lines_per_group.items(): # B. Payment info payment_info_2_0 = etree.SubElement(pain_root, 'PmtInf') payment_info_identification_2_1 = etree.SubElement( payment_info_2_0, 'PmtInfId') payment_info_identification_2_1.text = self._prepare_field( cr, uid, 'Payment Information Identification', - "sequence_type + '-' + sepa_export.payment_order_ids[0].reference", - {'sepa_export': sepa_export, 'sequence_type': sequence_type}, - 35, convert_to_ascii=convert_to_ascii, context=context) + "sepa_export.payment_order_ids[0].reference + '-' + sequence_type + '-' + requested_collec_date.replace('-', '') + '-' + priority", + { + 'sepa_export': sepa_export, + 'sequence_type': sequence_type, + 'priority': priority, + 'requested_collec_date': requested_collec_date, + }, 35, convert_to_ascii=convert_to_ascii, context=context) payment_method_2_2 = etree.SubElement(payment_info_2_0, 'PmtMtd') payment_method_2_2.text = 'DD' # batch_booking is in "Payment Info" with pain.008.001.02/03 @@ -257,6 +264,10 @@ class banking_export_sdd_wizard(orm.TransientModel): control_sum_2_5 = etree.SubElement(payment_info_2_0, 'CtrlSum') payment_type_info_2_6 = etree.SubElement( payment_info_2_0, 'PmtTpInf') + if priority: + instruction_priority_2_7 = etree.SubElement( + payment_type_info_2_6, 'InstrPrty') + instruction_priority_2_7.text = priority service_level_2_8 = etree.SubElement( payment_type_info_2_6, 'SvcLvl') service_level_code_2_9 = etree.SubElement(service_level_2_8, 'Cd') @@ -276,7 +287,7 @@ class banking_export_sdd_wizard(orm.TransientModel): requested_collec_date_2_18 = etree.SubElement( payment_info_2_0, 'ReqdColltnDt') - requested_collec_date_2_18.text = my_requested_collec_date + requested_collec_date_2_18.text = requested_collec_date self.generate_party_block( cr, uid, payment_info_2_0, 'Cdtr', 'B', diff --git a/account_banking_sepa_direct_debit/wizard/export_sdd_view.xml b/account_banking_sepa_direct_debit/wizard/export_sdd_view.xml index c1b8a77c2..3699de91c 100644 --- a/account_banking_sepa_direct_debit/wizard/export_sdd_view.xml +++ b/account_banking_sepa_direct_debit/wizard/export_sdd_view.xml @@ -15,7 +15,6 @@ - From 2e3174c0de5a77eca54efd45c7e3caaedaaf0beb Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Fri, 13 Dec 2013 00:40:45 +0100 Subject: [PATCH 020/118] Add support for direct debit migration from national format to SEPA Source : Standard-XML-SDD-Initiation-v3-EN by Febelfin --- .../account_banking_sdd.py | 7 +++ account_banking_sepa_direct_debit/company.py | 2 + .../company_view.xml | 1 + .../sdd_mandate_view.xml | 2 + .../wizard/export_sdd.py | 49 ++++++++++++------- 5 files changed, 43 insertions(+), 18 deletions(-) diff --git a/account_banking_sepa_direct_debit/account_banking_sdd.py b/account_banking_sepa_direct_debit/account_banking_sdd.py index 7b2be778f..b54f3002c 100644 --- a/account_banking_sepa_direct_debit/account_banking_sdd.py +++ b/account_banking_sepa_direct_debit/account_banking_sdd.py @@ -148,6 +148,12 @@ class sdd_mandate(orm.Model): help="Only valid mandates can be used in a payment line. A cancelled mandate is a mandate that has been cancelled by the customer. A one-off mandate expires after its first use. A recurrent mandate expires after it's final use or if it hasn't been used for 36 months."), 'payment_line_ids': fields.one2many( 'payment.line', 'sdd_mandate_id', "Related Payment Lines"), + 'sepa_migrated': fields.boolean( + 'Migrated to SEPA', + help="If this field is not active, the mandate section of the direct debit file will contain the Original Mandate Identification and the Original Creditor Scheme Identification."), + 'original_mandate_identification': fields.char( + 'Original Mandate Identification', size=35, + help="When the field 'Migrated to SEPA' is not active, this field will be used as the Original Mandate Identification in the the Direct Debit file."), } _defaults = { @@ -157,6 +163,7 @@ class sdd_mandate(orm.Model): 'unique_mandate_reference': lambda self, cr, uid, ctx: self.pool['ir.sequence'].get(cr, uid, 'sdd.mandate.reference'), 'state': 'draft', + 'sepa_migrated': True, } _sql_constraints = [( diff --git a/account_banking_sepa_direct_debit/company.py b/account_banking_sepa_direct_debit/company.py index eb3730d57..ba4c7b7c8 100644 --- a/account_banking_sepa_direct_debit/company.py +++ b/account_banking_sepa_direct_debit/company.py @@ -32,6 +32,8 @@ class res_company(orm.Model): 'sepa_creditor_identifier': fields.char( 'SEPA Creditor Identifier', size=35, help="Enter the Creditor Identifier that has been attributed to your company to make SEPA Direct Debits. This identifier is composed of :\n- your country ISO code (2 letters)\n- a 2-digits checkum\n- a 3-letters business code\n- a country-specific identifier"), + 'original_creditor_identifier': fields.char( + 'Original Creditor Identifier', size=70), } def is_sepa_creditor_identifier_valid( diff --git a/account_banking_sepa_direct_debit/company_view.xml b/account_banking_sepa_direct_debit/company_view.xml index 7691844c1..4599454f5 100644 --- a/account_banking_sepa_direct_debit/company_view.xml +++ b/account_banking_sepa_direct_debit/company_view.xml @@ -14,6 +14,7 @@ + diff --git a/account_banking_sepa_direct_debit/sdd_mandate_view.xml b/account_banking_sepa_direct_debit/sdd_mandate_view.xml index ad11d8804..15ec3a675 100644 --- a/account_banking_sepa_direct_debit/sdd_mandate_view.xml +++ b/account_banking_sepa_direct_debit/sdd_mandate_view.xml @@ -35,6 +35,8 @@ + + diff --git a/account_banking_sepa_direct_debit/wizard/export_sdd.py b/account_banking_sepa_direct_debit/wizard/export_sdd.py index 59d031362..babec1260 100644 --- a/account_banking_sepa_direct_debit/wizard/export_sdd.py +++ b/account_banking_sepa_direct_debit/wizard/export_sdd.py @@ -302,20 +302,11 @@ class banking_export_sdd_wizard(orm.TransientModel): creditor_scheme_identification_2_27 = etree.SubElement( payment_info_2_0, 'CdtrSchmeId') - csi_id = etree.SubElement( - creditor_scheme_identification_2_27, 'Id') - csi_privateid = csi_id = etree.SubElement(csi_id, 'PrvtId') - csi_other = etree.SubElement(csi_privateid, 'Othr') - csi_other_id = etree.SubElement(csi_other, 'Id') - csi_other_id.text = self._prepare_field( - cr, uid, 'SEPA Creditor Identifier', + self.generate_creditor_scheme_identification( + cr, uid, creditor_scheme_identification_2_27, 'sepa_export.payment_order_ids[0].company_id.sepa_creditor_identifier', - {'sepa_export': sepa_export}, - convert_to_ascii=convert_to_ascii, context=context) - csi_scheme_name = etree.SubElement(csi_other, 'SchmeNm') - csi_scheme_name_proprietary = etree.SubElement( - csi_scheme_name, 'Prtry') - csi_scheme_name_proprietary.text = 'SEPA' + 'SEPA Creditor Identifier', {'sepa_export': sepa_export}, + 'SEPA', gen_args, context=context) transactions_count_2_4 = 0 amount_control_sum_2_5 = 0.0 @@ -359,16 +350,18 @@ class banking_export_sdd_wizard(orm.TransientModel): 'line.sdd_mandate_id.signature_date', {'line': line}, 10, convert_to_ascii=convert_to_ascii, context=context) - if (sequence_type == 'FRST' - and line.sdd_mandate_id.last_debit_date): + if sequence_type == 'FRST' and ( + line.sdd_mandate_id.last_debit_date or + not line.sdd_mandate_id.sepa_migrated): previous_bank = self._get_previous_bank( cr, uid, line, context=context) - if previous_bank: + if previous_bank or not line.sdd_mandate_id.sepa_migrated: amendment_indicator_2_50 = etree.SubElement( mandate_related_info_2_47, 'AmdmntInd') amendment_indicator_2_50.text = 'true' amendment_info_details_2_51 = etree.SubElement( mandate_related_info_2_47, 'AmdmntInfDtls') + if previous_bank: if previous_bank.bank.bic == line.bank_id.bank.bic: ori_debtor_account_2_57 = etree.SubElement( amendment_info_details_2_51, 'OrgnlDbtrAcct') @@ -403,6 +396,24 @@ class banking_export_sdd_wizard(orm.TransientModel): ori_debtor_agent_other, 'Id') ori_debtor_agent_other_id.text = 'SMNDA' # SMNDA = Same Mandate New Debtor Agent + elif not line.sdd_mandate_id.sepa_migrated: + ori_mandate_identification_2_52 = etree.SubElement( + amendment_info_details_2_51, 'OrgnlMndtId') + ori_mandate_identification_2_52.text = \ + self._prepare_field( + cr, uid, 'Original Mandate Identification', + 'line.sdd_mandate_id.original_mandate_identification', + {'line': line}, + convert_to_ascii=convert_to_ascii, + context=context) + ori_creditor_scheme_id_2_53 = etree.SubElement( + amendment_info_details_2_51, 'OrgnlCdtrSchmeId') + self.generate_creditor_scheme_identification( + cr, uid, ori_creditor_scheme_id_2_53, + 'sepa_export.payment_order_ids[0].company_id.original_creditor_identifier', + 'Original Creditor Identifier', + {'sepa_export': sepa_export}, + 'SEPA', gen_args, context=context) self.generate_party_block( cr, uid, dd_transaction_info_2_28, 'Dbtr', 'C', @@ -494,6 +505,8 @@ class banking_export_sdd_wizard(orm.TransientModel): self.pool['sdd.mandate'].write( cr, uid, to_expire_ids, {'state': 'expired'}, context=context) self.pool['sdd.mandate'].write( - cr, uid, first_mandate_ids, - {'recurrent_sequence_type': 'recurring'}, context=context) + cr, uid, first_mandate_ids, { + 'recurrent_sequence_type': 'recurring', + 'sepa_migrated': True, + }, context=context) return {'type': 'ir.actions.act_window_close'} From 09af19ee2ea72dd65709a12b86f1ba24dca144f2 Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Mon, 16 Dec 2013 00:46:50 +0100 Subject: [PATCH 021/118] Add group in order to mask the fields for "Original Mandate Indentification" for user s in countries that don't required it. Add tracking on important fields of the mandate. Better form view on company. Update constraint on mandate following my devs on "Original Mandate Identification". --- .../__openerp__.py | 1 + .../account_banking_sdd.py | 67 +++++++++++-------- .../company_view.xml | 8 +-- .../sdd_mandate_view.xml | 4 +- .../original_mandate_required_security.xml | 17 +++++ 5 files changed, 64 insertions(+), 33 deletions(-) create mode 100644 account_banking_sepa_direct_debit/security/original_mandate_required_security.xml diff --git a/account_banking_sepa_direct_debit/__openerp__.py b/account_banking_sepa_direct_debit/__openerp__.py index 070d965a1..95ac05413 100644 --- a/account_banking_sepa_direct_debit/__openerp__.py +++ b/account_banking_sepa_direct_debit/__openerp__.py @@ -31,6 +31,7 @@ 'python': ['unidecode', 'lxml'], }, 'data': [ + 'security/original_mandate_required_security.xml', 'account_banking_sdd_view.xml', 'sdd_mandate_view.xml', 'res_partner_bank_view.xml', diff --git a/account_banking_sepa_direct_debit/account_banking_sdd.py b/account_banking_sepa_direct_debit/account_banking_sdd.py index b54f3002c..28759ef64 100644 --- a/account_banking_sepa_direct_debit/account_banking_sdd.py +++ b/account_banking_sepa_direct_debit/account_banking_sdd.py @@ -118,24 +118,27 @@ class sdd_mandate(orm.Model): } _columns = { - 'partner_bank_id': fields.many2one('res.partner.bank', 'Bank Account'), + 'partner_bank_id': fields.many2one( + 'res.partner.bank', 'Bank Account', track_visibility='onchange'), 'partner_id': fields.related( 'partner_bank_id', 'partner_id', type='many2one', relation='res.partner', string='Partner', readonly=True), 'company_id': fields.many2one('res.company', 'Company', required=True), 'unique_mandate_reference': fields.char( - 'Unique Mandate Reference', size=35, readonly=True), + 'Unique Mandate Reference', size=35, readonly=True, + track_visibility='always'), 'type': fields.selection([ ('recurrent', 'Recurrent'), ('oneoff', 'One-Off'), - ], 'Type of Mandate', required=True), + ], 'Type of Mandate', required=True, track_visibility='always'), 'recurrent_sequence_type': fields.selection([ ('first', 'First'), ('recurring', 'Recurring'), ('final', 'Final'), - ], 'Sequence Type for Next Debit', + ], 'Sequence Type for Next Debit', track_visibility='onchange', help="This field is only used for Recurrent mandates, not for One-Off mandates."), - 'signature_date': fields.date('Date of Signature of the Mandate'), + 'signature_date': fields.date( + 'Date of Signature of the Mandate', track_visibility='onchange'), 'scan': fields.binary('Scan of the Mandate'), 'last_debit_date': fields.date( 'Date of the Last Debit', readonly=True), @@ -149,10 +152,11 @@ class sdd_mandate(orm.Model): 'payment_line_ids': fields.one2many( 'payment.line', 'sdd_mandate_id', "Related Payment Lines"), 'sepa_migrated': fields.boolean( - 'Migrated to SEPA', - help="If this field is not active, the mandate section of the direct debit file will contain the Original Mandate Identification and the Original Creditor Scheme Identification."), + 'Migrated to SEPA', track_visibility='onchange', + help="If this field is not active, the mandate section of the next direct debit file that include this mandate will contain the 'Original Mandate Identification' and the 'Original Creditor Scheme Identification'. This is required in a few countries (Belgium for instance), but not in all countries. If this is not required in your country, you should keep this field always active."), 'original_mandate_identification': fields.char( 'Original Mandate Identification', size=35, + track_visibility='onchange', help="When the field 'Migrated to SEPA' is not active, this field will be used as the Original Mandate Identification in the the Direct Debit file."), } @@ -172,48 +176,57 @@ class sdd_mandate(orm.Model): 'A Mandate with the same reference already exists for this company !' )] - def _check_sdd_mandate(self, cr, uid, ids, context=None): - for mandate in self.read(cr, uid, ids, [ - 'last_debit_date', 'signature_date', - 'unique_mandate_reference', 'state', 'partner_bank_id', - 'type', 'recurrent_sequence_type', - ], context=context): - if (mandate['signature_date'] and - mandate['signature_date'] > + def _check_sdd_mandate(self, cr, uid, ids): + for mandate in self.browse(cr, uid, ids): + if (mandate.signature_date and + mandate.signature_date > datetime.today().strftime('%Y-%m-%d')): raise orm.except_orm( _('Error:'), _("The date of signature of mandate '%s' is in the future!") - % mandate['unique_mandate_reference']) - if mandate['state'] == 'valid' and not mandate['signature_date']: + % mandate.unique_mandate_reference) + if mandate.state == 'valid' and not mandate.signature_date: raise orm.except_orm( _('Error:'), _("Cannot validate the mandate '%s' without a date of signature.") - % mandate['unique_mandate_reference']) - if mandate['state'] == 'valid' and not mandate['partner_bank_id']: + % mandate.unique_mandate_reference) + if mandate.state == 'valid' and not mandate.partner_bank_id: raise orm.except_orm( _('Error:'), _("Cannot validate the mandate '%s' because it is not attached to a bank account.") - % mandate['unique_mandate_reference']) + % mandate.unique_mandate_reference) - if (mandate['signature_date'] and mandate['last_debit_date'] and - mandate['signature_date'] > mandate['last_debit_date']): + if (mandate.signature_date and mandate.last_debit_date and + mandate.signature_date > mandate.last_debit_date): raise orm.except_orm( _('Error:'), _("The mandate '%s' can't have a date of last debit before the date of signature.") - % mandate['unique_mandate_reference']) - if (mandate['type'] == 'recurrent' - and not mandate['recurrent_sequence_type']): + % mandate.unique_mandate_reference) + if (mandate.type == 'recurrent' + and not mandate.recurrent_sequence_type): raise orm.except_orm( _('Error:'), _("The recurrent mandate '%s' must have a sequence type.") - % mandate['unique_mandate_reference']) + % mandate.unique_mandate_reference) + if (mandate.type == 'recurrent' and not mandate.sepa_migrated + and mandate.recurrent_sequence_type != 'first'): + raise orm.except_orm( + _('Error:'), + _("The recurrent mandate '%s' which is not marked as 'Migrated to SEPA' must have its recurrent sequence type set to 'First'.") + % mandate.unique_mandate_reference) + if (mandate.type == 'recurrent' and not mandate.sepa_migrated + and not mandate.original_mandate_identification): + raise orm.except_orm( + _('Error:'), + _("You must set the 'Original Mandate Identification' on the recurrent mandate '%s' which is not marked as 'Migrated to SEPA'.") + % mandate.unique_mandate_reference) return True _constraints = [ (_check_sdd_mandate, "Error msg in raise", [ 'last_debit_date', 'signature_date', 'state', 'partner_bank_id', - 'type', 'recurrent_sequence_type', + 'type', 'recurrent_sequence_type', 'sepa_migrated', + 'original_mandate_identification', ]), ] diff --git a/account_banking_sepa_direct_debit/company_view.xml b/account_banking_sepa_direct_debit/company_view.xml index 4599454f5..e4c9e0b93 100644 --- a/account_banking_sepa_direct_debit/company_view.xml +++ b/account_banking_sepa_direct_debit/company_view.xml @@ -10,12 +10,12 @@ sepa_direct_debit.res.company.form res.company - + - + - - + + diff --git a/account_banking_sepa_direct_debit/sdd_mandate_view.xml b/account_banking_sepa_direct_debit/sdd_mandate_view.xml index 15ec3a675..d86f74f5b 100644 --- a/account_banking_sepa_direct_debit/sdd_mandate_view.xml +++ b/account_banking_sepa_direct_debit/sdd_mandate_view.xml @@ -35,8 +35,8 @@ - - + + diff --git a/account_banking_sepa_direct_debit/security/original_mandate_required_security.xml b/account_banking_sepa_direct_debit/security/original_mandate_required_security.xml new file mode 100644 index 000000000..e6a8570cf --- /dev/null +++ b/account_banking_sepa_direct_debit/security/original_mandate_required_security.xml @@ -0,0 +1,17 @@ + + + + + + + + Original Mandate Required (SEPA) + + + + + From ba18bf3e91c33d022b633b0f3da8e9d9a6d0c9fc Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Fri, 20 Dec 2013 14:13:20 +0100 Subject: [PATCH 022/118] Mutualize more code between SCT and SDD. --- .../wizard/export_sdd.py | 112 ++++-------------- 1 file changed, 25 insertions(+), 87 deletions(-) diff --git a/account_banking_sepa_direct_debit/wizard/export_sdd.py b/account_banking_sepa_direct_debit/wizard/export_sdd.py index babec1260..5e4134f73 100644 --- a/account_banking_sepa_direct_debit/wizard/export_sdd.py +++ b/account_banking_sepa_direct_debit/wizard/export_sdd.py @@ -23,10 +23,8 @@ from openerp.osv import orm, fields from openerp.tools.translate import _ -from openerp.tools.safe_eval import safe_eval from openerp import tools, netsvc -import base64 -from datetime import datetime, timedelta +from datetime import datetime from lxml import etree import logging @@ -83,21 +81,6 @@ class banking_export_sdd_wizard(orm.TransientModel): return super(banking_export_sdd_wizard, self).create( cr, uid, vals, context=context) - def _prepare_export_sepa( - self, cr, uid, sepa_export, total_amount, transactions_count, - xml_string, context=None): - return { - 'batch_booking': sepa_export.batch_booking, - 'charge_bearer': sepa_export.charge_bearer, - 'total_amount': total_amount, - 'nb_transactions': transactions_count, - 'file': base64.encodestring(xml_string), - 'payment_order_ids': [ - (6, 0, [x.id for x in sepa_export.payment_order_ids]) - ], - } - - def _get_previous_bank(self, cr, uid, payline, context=None): payline_obj = self.pool['payment.line'] previous_bank = False @@ -163,11 +146,6 @@ class banking_export_sdd_wizard(orm.TransientModel): root = etree.Element('Document', nsmap=pain_ns) pain_root = etree.SubElement(root, root_xml_tag) - my_company_name = self._prepare_field( - cr, uid, 'Company Name', - 'sepa_export.payment_order_ids[0].company_id.partner_id.name', - {'sepa_export': sepa_export}, name_maxsize, context=context) - # A. Group header group_header_1_0, nb_of_transactions_1_6, control_sum_1_7 = \ self.generate_group_header_block( @@ -177,7 +155,7 @@ class banking_export_sdd_wizard(orm.TransientModel): total_amount = 0.0 amount_control_sum_1_7 = 0.0 lines_per_group = {} - # key = (requested_collec_date, priority, sequence type) + # key = (requested_date, priority, sequence type) # value = list of lines as objects # Iterate on payment orders today = fields.date.context_today(self, cr, uid, context=context) @@ -188,11 +166,11 @@ class banking_export_sdd_wizard(orm.TransientModel): transactions_count_1_6 += 1 priority = line.priority if payment_order.date_prefered == 'due': - requested_collec_date = line.ml_maturity_date or today + requested_date = line.ml_maturity_date or today elif payment_order.date_prefered == 'fixed': - requested_collec_date = payment_order.date_scheduled or today + requested_date = payment_order.date_scheduled or today else: - requested_collec_date = today + requested_date = today if not line.sdd_mandate_id: raise orm.except_orm( _('Error:'), @@ -225,69 +203,29 @@ class banking_export_sdd_wizard(orm.TransientModel): assert seq_type_label is not False seq_type = seq_type_map[seq_type_label] - key = (requested_collec_date, priority, seq_type) + key = (requested_date, priority, seq_type) if key in lines_per_group: lines_per_group[key].append(line) else: lines_per_group[key] = [line] # Write requested_exec_date on 'Payment date' of the pay line - if requested_collec_date != line.date: + if requested_date != line.date: self.pool['payment.line'].write( cr, uid, line.id, - {'date': requested_collec_date}, context=context) + {'date': requested_date}, context=context) - for (requested_collec_date, priority, sequence_type), lines in lines_per_group.items(): + for (requested_date, priority, sequence_type), lines in lines_per_group.items(): # B. Payment info - payment_info_2_0 = etree.SubElement(pain_root, 'PmtInf') - payment_info_identification_2_1 = etree.SubElement( - payment_info_2_0, 'PmtInfId') - payment_info_identification_2_1.text = self._prepare_field( - cr, uid, 'Payment Information Identification', - "sepa_export.payment_order_ids[0].reference + '-' + sequence_type + '-' + requested_collec_date.replace('-', '') + '-' + priority", - { + payment_info_2_0, nb_of_transactions_2_4, control_sum_2_5 = \ + self.generate_start_payment_info_block( + cr, uid, pain_root, sepa_export, + "sepa_export.payment_order_ids[0].reference + '-' + sequence_type + '-' + requested_date.replace('-', '') + '-' + priority", + priority, 'CORE', sequence_type, requested_date, { 'sepa_export': sepa_export, 'sequence_type': sequence_type, 'priority': priority, - 'requested_collec_date': requested_collec_date, - }, 35, convert_to_ascii=convert_to_ascii, context=context) - payment_method_2_2 = etree.SubElement(payment_info_2_0, 'PmtMtd') - payment_method_2_2.text = 'DD' - # batch_booking is in "Payment Info" with pain.008.001.02/03 - batch_booking_2_3 = etree.SubElement(payment_info_2_0, 'BtchBookg') - batch_booking_2_3.text = str(sepa_export.batch_booking).lower() - # The "SEPA Core Direct Debit Scheme Customer-to-bank - # Implementation guidelines" v6.0 says that control sum - # and nb_of_transactions should be present - # at both "group header" level and "payment info" level - nb_of_transactions_2_4 = etree.SubElement( - payment_info_2_0, 'NbOfTxs') - control_sum_2_5 = etree.SubElement(payment_info_2_0, 'CtrlSum') - payment_type_info_2_6 = etree.SubElement( - payment_info_2_0, 'PmtTpInf') - if priority: - instruction_priority_2_7 = etree.SubElement( - payment_type_info_2_6, 'InstrPrty') - instruction_priority_2_7.text = priority - service_level_2_8 = etree.SubElement( - payment_type_info_2_6, 'SvcLvl') - service_level_code_2_9 = etree.SubElement(service_level_2_8, 'Cd') - service_level_code_2_9.text = 'SEPA' - local_instrument_2_11 = etree.SubElement( - payment_type_info_2_6, 'LclInstrm') - local_instr_code_2_12 = etree.SubElement( - local_instrument_2_11, 'Cd') - local_instr_code_2_12.text = 'CORE' - # 2.14 Sequence Type MANDATORY - # this message element must indicate ‘FRST - # 'FRST' = First ; 'OOFF' = One Off ; 'RCUR' : Recurring - # 'FNAL' = Final - sequence_type_2_14 = etree.SubElement( - payment_type_info_2_6, 'SeqTp') - sequence_type_2_14.text = sequence_type - - requested_collec_date_2_18 = etree.SubElement( - payment_info_2_0, 'ReqdColltnDt') - requested_collec_date_2_18.text = requested_collec_date + 'requested_date': requested_date, + }, gen_args, context=context) self.generate_party_block( cr, uid, payment_info_2_0, 'Cdtr', 'B', @@ -322,10 +260,10 @@ class banking_export_sdd_wizard(orm.TransientModel): end2end_identification_2_31.text = self._prepare_field( cr, uid, 'End to End Identification', 'line.name', {'line': line}, 35, - convert_to_ascii=convert_to_ascii, context=context) + gen_args=gen_args, context=context) currency_name = self._prepare_field( cr, uid, 'Currency Code', 'line.currency.name', - {'line': line}, 3, convert_to_ascii=convert_to_ascii, + {'line': line}, 3, gen_args=gen_args, context=context) instructed_amount_2_44 = etree.SubElement( dd_transaction_info_2_28, 'InstdAmt', Ccy=currency_name) @@ -342,14 +280,14 @@ class banking_export_sdd_wizard(orm.TransientModel): cr, uid, 'Unique Mandate Reference', 'line.sdd_mandate_id.unique_mandate_reference', {'line': line}, 35, - convert_to_ascii=convert_to_ascii, context=context) + gen_args=gen_args, context=context) mandate_signature_date_2_49 = etree.SubElement( mandate_related_info_2_47, 'DtOfSgntr') mandate_signature_date_2_49.text = self._prepare_field( cr, uid, 'Mandate Signature Date', 'line.sdd_mandate_id.signature_date', {'line': line}, 10, - convert_to_ascii=convert_to_ascii, context=context) + gen_args=gen_args, context=context) if sequence_type == 'FRST' and ( line.sdd_mandate_id.last_debit_date or not line.sdd_mandate_id.sepa_migrated): @@ -374,7 +312,7 @@ class banking_export_sdd_wizard(orm.TransientModel): cr, uid, 'Original Debtor Account', 'previous_bank.acc_number', {'previous_bank': previous_bank}, - convert_to_ascii=convert_to_ascii, + gen_args=gen_args, context=context), context=context) else: @@ -388,7 +326,7 @@ class banking_export_sdd_wizard(orm.TransientModel): cr, uid, 'Original Debtor Agent', 'previous_bank.bank.bic', {'previous_bank': previous_bank}, - convert_to_ascii=convert_to_ascii, + gen_args=gen_args, context=context) ori_debtor_agent_other = etree.SubElement( ori_debtor_agent_institution, 'Othr') @@ -404,7 +342,7 @@ class banking_export_sdd_wizard(orm.TransientModel): cr, uid, 'Original Mandate Identification', 'line.sdd_mandate_id.original_mandate_identification', {'line': line}, - convert_to_ascii=convert_to_ascii, + gen_args=gen_args, context=context) ori_creditor_scheme_id_2_53 = etree.SubElement( amendment_info_details_2_51, 'OrgnlCdtrSchmeId') @@ -444,7 +382,7 @@ class banking_export_sdd_wizard(orm.TransientModel): file_id = self.pool.get('banking.export.sdd').create( cr, uid, self._prepare_export_sepa( cr, uid, sepa_export, total_amount, transactions_count_1_6, - xml_string, context=context), + xml_string, gen_args, context=context), context=context) self.write( @@ -466,7 +404,7 @@ class banking_export_sdd_wizard(orm.TransientModel): def cancel_sepa(self, cr, uid, ids, context=None): ''' - Cancel the SEPA Direct Debit file: just drop the file + Cancel the SEPA file: just drop the file ''' sepa_export = self.browse(cr, uid, ids[0], context=context) self.pool.get('banking.export.sdd').unlink( From aac9974103f2f1b6227f2bf22e8e98fce58f6b77 Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Tue, 24 Dec 2013 01:01:04 +0100 Subject: [PATCH 023/118] Replace unallowed ascii caracters by '-' Update some error messages Update translation files and FR translation Include sepa_export in gen_args Factorize more code between SDD and SCT Fix view of payment lines The modules account_banking_pain_base and account_banking_sepa_* are now fully PEP8 compliant --- .../account_banking_sdd.py | 113 ++++++--- account_banking_sepa_direct_debit/company.py | 6 +- .../account_banking_sepa_direct_debit.pot | 194 +++++++-------- account_banking_sepa_direct_debit/i18n/fr.po | 224 +++++++++--------- .../wizard/export_sdd.py | 122 +++++----- 5 files changed, 342 insertions(+), 317 deletions(-) diff --git a/account_banking_sepa_direct_debit/account_banking_sdd.py b/account_banking_sepa_direct_debit/account_banking_sdd.py index 28759ef64..d0edb5e90 100644 --- a/account_banking_sepa_direct_debit/account_banking_sdd.py +++ b/account_banking_sepa_direct_debit/account_banking_sdd.py @@ -63,14 +63,24 @@ class banking_export_sdd(orm.Model): readonly=True), 'batch_booking': fields.boolean( 'Batch Booking', readonly=True, - help="If true, the bank statement will display only one credit line for all the direct debits of the SEPA file ; if false, the bank statement will display one credit line per direct debit of the SEPA file."), + help="If true, the bank statement will display only one credit " + "line for all the direct debits of the SEPA file ; if false, " + "the bank statement will display one credit line per direct " + "debit of the SEPA file."), 'charge_bearer': fields.selection([ ('SLEV', 'Following Service Level'), ('SHAR', 'Shared'), ('CRED', 'Borne by Creditor'), ('DEBT', 'Borne by Debtor'), ], 'Charge Bearer', readonly=True, - help='Following service level : transaction charges are to be applied following the rules agreed in the service level and/or scheme (SEPA Core messages must use this). Shared : transaction charges on the creditor side are to be borne by the creditor, transaction charges on the debtor side are to be borne by the debtor. Borne by creditor : all transaction charges are to be borne by the creditor. Borne by debtor : all transaction charges are to be borne by the debtor.'), + help="Following service level : transaction charges are to be " + "applied following the rules agreed in the service level and/or " + "scheme (SEPA Core messages must use this). Shared : " + "transaction charges on the creditor side are to be borne by " + "the creditor, transaction charges on the debtor side are to be " + "borne by the debtor. Borne by creditor : all transaction " + "charges are to be borne by the creditor. Borne by debtor : " + "all transaction charges are to be borne by the debtor."), 'create_date': fields.datetime('Generation Date', readonly=True), 'file': fields.binary('SEPA File', readonly=True), 'filename': fields.function( @@ -98,22 +108,26 @@ class sdd_mandate(orm.Model): _track = { 'state': { 'account_banking_sepa_direct_debit.mandate_valid': - lambda self, cr, uid, obj, ctx=None: obj['state'] == 'valid', + lambda self, cr, uid, obj, ctx=None: + obj['state'] == 'valid', 'account_banking_sepa_direct_debit.mandate_expired': - lambda self, cr, uid, obj, ctx=None: obj['state'] == 'expired', + lambda self, cr, uid, obj, ctx=None: + obj['state'] == 'expired', 'account_banking_sepa_direct_debit.mandate_cancel': - lambda self, cr, uid, obj, ctx=None: obj['state'] == 'cancel', + lambda self, cr, uid, obj, ctx=None: + obj['state'] == 'cancel', }, 'recurrent_sequence_type': { 'account_banking_sepa_direct_debit.recurrent_sequence_type_first': - lambda self, cr, uid, obj, ctx=None: - obj['recurrent_sequence_type'] == 'first', - 'account_banking_sepa_direct_debit.recurrent_sequence_type_recurring': - lambda self, cr, uid, obj, ctx=None: - obj['recurrent_sequence_type'] == 'recurring', + lambda self, cr, uid, obj, ctx=None: + obj['recurrent_sequence_type'] == 'first', + 'account_banking_sepa_direct_debit.' + 'recurrent_sequence_type_recurring': + lambda self, cr, uid, obj, ctx=None: + obj['recurrent_sequence_type'] == 'recurring', 'account_banking_sepa_direct_debit.recurrent_sequence_type_final': - lambda self, cr, uid, obj, ctx=None: - obj['recurrent_sequence_type'] == 'final', + lambda self, cr, uid, obj, ctx=None: + obj['recurrent_sequence_type'] == 'final', } } @@ -136,7 +150,8 @@ class sdd_mandate(orm.Model): ('recurring', 'Recurring'), ('final', 'Final'), ], 'Sequence Type for Next Debit', track_visibility='onchange', - help="This field is only used for Recurrent mandates, not for One-Off mandates."), + help="This field is only used for Recurrent mandates, not for " + "One-Off mandates."), 'signature_date': fields.date( 'Date of Signature of the Mandate', track_visibility='onchange'), 'scan': fields.binary('Scan of the Mandate'), @@ -148,24 +163,36 @@ class sdd_mandate(orm.Model): ('expired', 'Expired'), ('cancel', 'Cancelled'), ], 'Status', - help="Only valid mandates can be used in a payment line. A cancelled mandate is a mandate that has been cancelled by the customer. A one-off mandate expires after its first use. A recurrent mandate expires after it's final use or if it hasn't been used for 36 months."), + help="Only valid mandates can be used in a payment line. A " + "cancelled mandate is a mandate that has been cancelled by " + "the customer. A one-off mandate expires after its first use. " + "A recurrent mandate expires after it's final use or if it " + "hasn't been used for 36 months."), 'payment_line_ids': fields.one2many( 'payment.line', 'sdd_mandate_id', "Related Payment Lines"), 'sepa_migrated': fields.boolean( 'Migrated to SEPA', track_visibility='onchange', - help="If this field is not active, the mandate section of the next direct debit file that include this mandate will contain the 'Original Mandate Identification' and the 'Original Creditor Scheme Identification'. This is required in a few countries (Belgium for instance), but not in all countries. If this is not required in your country, you should keep this field always active."), + help="If this field is not active, the mandate section of the " + "next direct debit file that include this mandate will contain " + "the 'Original Mandate Identification' and the 'Original " + "Creditor Scheme Identification'. This is required in a few " + "countries (Belgium for instance), but not in all countries. " + "If this is not required in your country, you should keep this " + "field always active."), 'original_mandate_identification': fields.char( 'Original Mandate Identification', size=35, track_visibility='onchange', - help="When the field 'Migrated to SEPA' is not active, this field will be used as the Original Mandate Identification in the the Direct Debit file."), + help="When the field 'Migrated to SEPA' is not active, this " + "field will be used as the Original Mandate Identification in " + "the Direct Debit file."), } _defaults = { 'company_id': lambda self, cr, uid, context: - self.pool['res.company'].\ - _company_default_get(cr, uid, 'sdd.mandate', context=context), + self.pool['res.company']._company_default_get( + cr, uid, 'sdd.mandate', context=context), 'unique_mandate_reference': lambda self, cr, uid, ctx: - self.pool['ir.sequence'].get(cr, uid, 'sdd.mandate.reference'), + self.pool['ir.sequence'].get(cr, uid, 'sdd.mandate.reference'), 'state': 'draft', 'sepa_migrated': True, } @@ -183,24 +210,28 @@ class sdd_mandate(orm.Model): datetime.today().strftime('%Y-%m-%d')): raise orm.except_orm( _('Error:'), - _("The date of signature of mandate '%s' is in the future!") + _("The date of signature of mandate '%s' is in the " + "future !") % mandate.unique_mandate_reference) if mandate.state == 'valid' and not mandate.signature_date: raise orm.except_orm( _('Error:'), - _("Cannot validate the mandate '%s' without a date of signature.") + _("Cannot validate the mandate '%s' without a date of " + "signature.") % mandate.unique_mandate_reference) if mandate.state == 'valid' and not mandate.partner_bank_id: raise orm.except_orm( _('Error:'), - _("Cannot validate the mandate '%s' because it is not attached to a bank account.") + _("Cannot validate the mandate '%s' because it is not " + "attached to a bank account.") % mandate.unique_mandate_reference) if (mandate.signature_date and mandate.last_debit_date and mandate.signature_date > mandate.last_debit_date): raise orm.except_orm( _('Error:'), - _("The mandate '%s' can't have a date of last debit before the date of signature.") + _("The mandate '%s' can't have a date of last debit " + "before the date of signature.") % mandate.unique_mandate_reference) if (mandate.type == 'recurrent' and not mandate.recurrent_sequence_type): @@ -212,13 +243,17 @@ class sdd_mandate(orm.Model): and mandate.recurrent_sequence_type != 'first'): raise orm.except_orm( _('Error:'), - _("The recurrent mandate '%s' which is not marked as 'Migrated to SEPA' must have its recurrent sequence type set to 'First'.") + _("The recurrent mandate '%s' which is not marked as " + "'Migrated to SEPA' must have its recurrent sequence " + "type set to 'First'.") % mandate.unique_mandate_reference) if (mandate.type == 'recurrent' and not mandate.sepa_migrated and not mandate.original_mandate_identification): raise orm.except_orm( _('Error:'), - _("You must set the 'Original Mandate Identification' on the recurrent mandate '%s' which is not marked as 'Migrated to SEPA'.") + _("You must set the 'Original Mandate Identification' " + "on the recurrent mandate '%s' which is not marked " + "as 'Migrated to SEPA'.") % mandate.unique_mandate_reference) return True @@ -252,8 +287,11 @@ class sdd_mandate(orm.Model): and recurrent_sequence_type != 'first'): res['value']['recurrent_sequence_type'] = 'first' res['warning'] = { - 'title': _('Mandate update'), - 'message': _("As you changed the bank account attached to this mandate, the 'Sequence Type' has been set back to 'First'."), + 'title': _('Mandate update'), + 'message': _( + "As you changed the bank account attached to this " + "mandate, the 'Sequence Type' has been set back to " + "'First'."), } return res @@ -337,7 +375,7 @@ class payment_line(orm.Model): vals.update({ 'sdd_mandate_id': line.invoice.sdd_mandate_id.id, 'bank_id': - line.invoice.sdd_mandate_id.partner_bank_id.id, + line.invoice.sdd_mandate_id.partner_bank_id.id, }) if partner_bank_id and 'sdd_mandate_id' not in vals: mandate_ids = self.pool['sdd.mandate'].search(cr, uid, [ @@ -355,14 +393,17 @@ class payment_line(orm.Model): payline.bank_id.id): raise orm.except_orm( _('Error:'), - _("The payment line with reference '%s' has the bank account '%s' which is not attached to the mandate '%s' (this mandate is attached to the bank account '%s').") - % (payline.name, - self.pool['res.partner.bank'].name_get( - cr, uid, [payline.bank_id.id])[0][1], - payline.sdd_mandate_id.unique_mandate_reference, - self.pool['res.partner.bank'].name_get( - cr, uid, - [payline.sdd_mandate_id.partner_bank_id.id])[0][1], + _("The payment line with reference '%s' has the bank " + "account '%s' which is not attached to the mandate " + "'%s' (this mandate is attached to the bank account " + "'%s').") % ( + payline.name, + self.pool['res.partner.bank'].name_get( + cr, uid, [payline.bank_id.id])[0][1], + payline.sdd_mandate_id.unique_mandate_reference, + self.pool['res.partner.bank'].name_get( + cr, uid, + [payline.sdd_mandate_id.partner_bank_id.id])[0][1], )) return True diff --git a/account_banking_sepa_direct_debit/company.py b/account_banking_sepa_direct_debit/company.py index ba4c7b7c8..5dd960224 100644 --- a/account_banking_sepa_direct_debit/company.py +++ b/account_banking_sepa_direct_debit/company.py @@ -31,7 +31,11 @@ class res_company(orm.Model): _columns = { 'sepa_creditor_identifier': fields.char( 'SEPA Creditor Identifier', size=35, - help="Enter the Creditor Identifier that has been attributed to your company to make SEPA Direct Debits. This identifier is composed of :\n- your country ISO code (2 letters)\n- a 2-digits checkum\n- a 3-letters business code\n- a country-specific identifier"), + help="Enter the Creditor Identifier that has been attributed " + "to your company to make SEPA Direct Debits. This identifier " + "is composed of :\n- your country ISO code (2 letters)\n- a " + "2-digits checkum\n- a 3-letters business code\n- a " + "country-specific identifier"), 'original_creditor_identifier': fields.char( 'Original Creditor Identifier', size=70), } diff --git a/account_banking_sepa_direct_debit/i18n/account_banking_sepa_direct_debit.pot b/account_banking_sepa_direct_debit/i18n/account_banking_sepa_direct_debit.pot index c33a775b4..0db576726 100644 --- a/account_banking_sepa_direct_debit/i18n/account_banking_sepa_direct_debit.pot +++ b/account_banking_sepa_direct_debit/i18n/account_banking_sepa_direct_debit.pot @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: OpenERP Server 7.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-11-11 14:28+0000\n" -"PO-Revision-Date: 2013-11-11 14:28+0000\n" +"POT-Creation-Date: 2013-12-23 22:24+0000\n" +"PO-Revision-Date: 2013-12-23 22:24+0000\n" "Last-Translator: <>\n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -27,19 +27,13 @@ msgid "Filename" msgstr "" #. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,requested_collec_date:0 -#: field:banking.export.sdd.wizard,requested_collec_date:0 -msgid "Requested Collection Date" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:276 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:200 #, python-format msgid "The SEPA Direct Debit mandate with reference '%s' for partner '%s' has expired." msgstr "" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:186 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:219 #, python-format msgid "Cannot validate the mandate '%s' without a date of signature." msgstr "" @@ -67,8 +61,8 @@ msgid "Error msg in raise" msgstr "" #. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,company_id:0 -msgid "Company" +#: selection:banking.export.sdd,state:0 +msgid "Reconciled" msgstr "" #. module: account_banking_sepa_direct_debit @@ -119,21 +113,18 @@ msgid "Borne by Debtor" msgstr "" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:180 -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:185 -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:190 -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:197 -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:203 -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:336 -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:89 -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:115 -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:121 -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:130 -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:168 -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:219 -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:269 -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:275 -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:287 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:212 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:218 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:224 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:232 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:239 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:245 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:253 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:395 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:140 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:192 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:199 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:209 #, python-format msgid "Error:" msgstr "" @@ -144,20 +135,8 @@ msgid "Messages" msgstr "" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:131 -#, python-format -msgid "The '%s' is empty or 0. It should have a non-null value." -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:89 -#, python-format -msgid "This IBAN is not valid : %s" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: model:ir.model,name:account_banking_sepa_direct_debit.model_banking_export_sdd_wizard -msgid "Export SEPA Direct Debit XML file" +#: field:sdd.mandate,unique_mandate_reference:0 +msgid "Unique Mandate Reference" msgstr "" #. module: account_banking_sepa_direct_debit @@ -167,7 +146,7 @@ msgid "Cancelled" msgstr "" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:219 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:141 #, python-format msgid "Payment Type Code '%s' is not supported. The only Payment Type Code supported for SEPA Direct Debit are 'pain.008.001.02', 'pain.008.001.03' and 'pain.008.001.04'." msgstr "" @@ -187,6 +166,12 @@ msgstr "" msgid "SEPA Direct Debit Mandate has Expired" msgstr "" +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:246 +#, python-format +msgid "The recurrent mandate '%s' which is not marked as 'Migrated to SEPA' must have its recurrent sequence type set to 'First'." +msgstr "" + #. module: account_banking_sepa_direct_debit #: help:banking.export.sdd,charge_bearer:0 #: help:banking.export.sdd.wizard,charge_bearer:0 @@ -213,11 +198,6 @@ msgstr "" msgid "Holds the Chatter summary (number of messages, ...). This summary is directly in html format in order to be inserted in kanban views." msgstr "" -#. module: account_banking_sepa_direct_debit -#: help:banking.export.sdd.wizard,requested_collec_date:0 -msgid "This is the date on which you would like the collection to be made by the bank. Please keep in mind that there are minimum delays for SEPA direct debits that depend on the type of mandate and the type of sequence." -msgstr "" - #. module: account_banking_sepa_direct_debit #: model:ir.model,name:account_banking_sepa_direct_debit.model_payment_line msgid "Payment Line" @@ -229,7 +209,7 @@ msgid "Generation Date" msgstr "" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:337 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:396 #, python-format msgid "The payment line with reference '%s' has the bank account '%s' which is not attached to the mandate '%s' (this mandate is attached to the bank account '%s')." msgstr "" @@ -258,7 +238,7 @@ msgid "State" msgstr "" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:204 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:240 #, python-format msgid "The recurrent mandate '%s' must have a sequence type." msgstr "" @@ -291,14 +271,13 @@ msgid "Sent" msgstr "" #. module: account_banking_sepa_direct_debit -#: selection:sdd.mandate,recurrent_sequence_type:0 -msgid "Recurring" +#: field:res.company,original_creditor_identifier:0 +msgid "Original Creditor Identifier" msgstr "" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:181 -#, python-format -msgid "The date of signature of mandate '%s' is in the future!" +#: selection:sdd.mandate,recurrent_sequence_type:0 +msgid "Recurring" msgstr "" #. module: account_banking_sepa_direct_debit @@ -325,6 +304,12 @@ msgstr "" msgid "This field is only used for Recurrent mandates, not for One-Off mandates." msgstr "" +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:213 +#, python-format +msgid "The date of signature of mandate '%s' is in the future !" +msgstr "" + #. module: account_banking_sepa_direct_debit #: view:sdd.mandate:0 msgid "Signature Date" @@ -341,12 +326,6 @@ msgstr "" msgid "Partner" msgstr "" -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:125 -#, python-format -msgid "Field type error:" -msgstr "" - #. module: account_banking_sepa_direct_debit #: selection:sdd.mandate,recurrent_sequence_type:0 msgid "First" @@ -364,18 +343,32 @@ msgstr "" #. module: account_banking_sepa_direct_debit #: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.act_banking_export_sdd_payment_order -#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.action_account_banking_sdd -#: model:ir.ui.menu,name:account_banking_sepa_direct_debit.menu_account_banking_sdd msgid "Generated SEPA Direct Debit Files" msgstr "" #. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd,state:0 -msgid "Reconciled" +#: help:sdd.mandate,sepa_migrated:0 +msgid "If this field is not active, the mandate section of the next direct debit file that include this mandate will contain the 'Original Mandate Identification' and the 'Original Creditor Scheme Identification'. This is required in a few countries (Belgium for instance), but not in all countries. If this is not required in your country, you should keep this field always active." msgstr "" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:191 +#: field:sdd.mandate,company_id:0 +msgid "Company" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_banking_export_sdd_wizard +msgid "Export SEPA Direct Debit File" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: help:banking.export.sdd,batch_booking:0 +#: help:banking.export.sdd.wizard,batch_booking:0 +msgid "If true, the bank statement will display only one credit line for all the direct debits of the SEPA file ; if false, the bank statement will display one credit line per direct debit of the SEPA file." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:225 #, python-format msgid "Cannot validate the mandate '%s' because it is not attached to a bank account." msgstr "" @@ -388,17 +381,11 @@ msgid "Draft" msgstr "" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:232 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:290 #, python-format msgid "Mandate update" msgstr "" -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:116 -#, python-format -msgid "Cannot compute the '%s' of the Payment Line with Invoice Reference '%s'." -msgstr "" - #. module: account_banking_sepa_direct_debit #: selection:banking.export.sdd,charge_bearer:0 #: selection:banking.export.sdd.wizard,charge_bearer:0 @@ -411,6 +398,11 @@ msgstr "" msgid "Batch Booking" msgstr "" +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,sepa_migrated:0 +msgid "Migrated to SEPA" +msgstr "" + #. module: account_banking_sepa_direct_debit #: field:sdd.mandate,state:0 msgid "Status" @@ -423,9 +415,9 @@ msgid "Total Amount" msgstr "" #. module: account_banking_sepa_direct_debit -#: help:banking.export.sdd,batch_booking:0 -#: help:banking.export.sdd.wizard,batch_booking:0 -msgid "If true, the bank statement will display only one credit line for all the direct debits of the SEPA file ; if false, the bank statement will display one credit line per direct debit of the SEPA file." +#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.action_account_banking_sdd +#: model:ir.ui.menu,name:account_banking_sepa_direct_debit.menu_account_banking_sdd +msgid "SEPA Direct Debit Files" msgstr "" #. module: account_banking_sepa_direct_debit @@ -435,7 +427,7 @@ msgid "Following Service Level" msgstr "" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:198 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:233 #, python-format msgid "The mandate '%s' can't have a date of last debit before the date of signature." msgstr "" @@ -451,11 +443,21 @@ msgstr "" msgid "Is a Follower" msgstr "" +#. module: account_banking_sepa_direct_debit +#: help:sdd.mandate,original_mandate_identification:0 +msgid "When the field 'Migrated to SEPA' is not active, this field will be used as the Original Mandate Identification in the Direct Debit file." +msgstr "" + #. module: account_banking_sepa_direct_debit #: view:payment.order:0 msgid "SDD Mandate" msgstr "" +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,original_mandate_identification:0 +msgid "Original Mandate Identification" +msgstr "" + #. module: account_banking_sepa_direct_debit #: model:ir.model,name:account_banking_sepa_direct_debit.model_res_company msgid "Companies" @@ -466,6 +468,11 @@ msgstr "" msgid "Summary" msgstr "" +#. module: account_banking_sepa_direct_debit +#: model:res.groups,name:account_banking_sepa_direct_debit.group_original_mandate_required +msgid "Original Mandate Required (SEPA)" +msgstr "" + #. module: account_banking_sepa_direct_debit #: field:account.invoice,sdd_mandate_id:0 #: model:ir.model,name:account_banking_sepa_direct_debit.model_sdd_mandate @@ -475,13 +482,13 @@ msgid "SEPA Direct Debit Mandate" msgstr "" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:270 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:193 #, python-format msgid "Missing SEPA Direct Debit mandate on the payment line with partner '%s' and Invoice ref '%s'." msgstr "" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:288 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:210 #, python-format msgid "The mandate with reference '%s' for partner '%s' has type set to 'One-Off' and it has a last debit date set to '%s', so we can't use it." msgstr "" @@ -549,12 +556,6 @@ msgstr "" msgid "Related Payment Lines" msgstr "" -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:169 -#, python-format -msgid "The generated XML file is not valid against the official XML Schema Definition. The generated XML file and the full error have been written in the server logs. Here is the error, which may give you an idea on the cause of the problem : %s" -msgstr "" - #. module: account_banking_sepa_direct_debit #: view:sdd.mandate:0 #: selection:sdd.mandate,type:0 @@ -581,18 +582,6 @@ msgstr "" msgid "SEPA Creditor Identifier" msgstr "" -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:122 -#, python-format -msgid "Cannot compute the '%s'." -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:126 -#, python-format -msgid "The type of the field '%s' is %s. It should be a string or unicode." -msgstr "" - #. module: account_banking_sepa_direct_debit #: model:ir.model,name:account_banking_sepa_direct_debit.model_banking_export_sdd msgid "SEPA Direct Debit export" @@ -609,6 +598,12 @@ msgstr "" msgid "Bank Account" msgstr "" +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:254 +#, python-format +msgid "You must set the 'Original Mandate Identification' on the recurrent mandate '%s' which is not marked as 'Migrated to SEPA'." +msgstr "" + #. module: account_banking_sepa_direct_debit #: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_first #: model:mail.message.subtype,name:account_banking_sepa_direct_debit.recurrent_sequence_type_first @@ -616,7 +611,7 @@ msgid "Sequence Type set to First" msgstr "" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:233 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:291 #, python-format msgid "As you changed the bank account attached to this mandate, the 'Sequence Type' has been set back to 'First'." msgstr "" @@ -631,11 +626,6 @@ msgstr "" msgid "Search SEPA Direct Debit Mandates" msgstr "" -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,unique_mandate_reference:0 -msgid "Unique Mandate Reference" -msgstr "" - #. module: account_banking_sepa_direct_debit #: field:banking.export.sdd.wizard,file:0 msgid "File" diff --git a/account_banking_sepa_direct_debit/i18n/fr.po b/account_banking_sepa_direct_debit/i18n/fr.po index 25b2df96f..9d30343dd 100644 --- a/account_banking_sepa_direct_debit/i18n/fr.po +++ b/account_banking_sepa_direct_debit/i18n/fr.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: OpenERP Server 7.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-11-11 14:04+0000\n" -"PO-Revision-Date: 2013-11-11 14:04+0000\n" +"POT-Creation-Date: 2013-12-23 22:25+0000\n" +"PO-Revision-Date: 2013-12-23 22:25+0000\n" "Last-Translator: <>\n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -27,19 +27,13 @@ msgid "Filename" msgstr "Nom du fichier" #. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,requested_collec_date:0 -#: field:banking.export.sdd.wizard,requested_collec_date:0 -msgid "Requested Collection Date" -msgstr "Date de collecte demandée" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:276 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:200 #, python-format msgid "The SEPA Direct Debit mandate with reference '%s' for partner '%s' has expired." msgstr "Le mandat de prélèvement SEPA portant la référence '%s' pour le partenaire '%s' a expiré." #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:186 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:219 #, python-format msgid "Cannot validate the mandate '%s' without a date of signature." msgstr "Impossible de valider le mandat '%s' sans date de signature." @@ -119,21 +113,18 @@ msgid "Borne by Debtor" msgstr "Supportés par le débiteur" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:180 -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:185 -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:190 -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:197 -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:203 -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:336 -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:89 -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:115 -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:121 -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:130 -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:168 -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:219 -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:269 -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:275 -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:287 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:212 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:218 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:224 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:232 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:239 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:245 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:253 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:395 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:140 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:192 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:199 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:209 #, python-format msgid "Error:" msgstr "Erreur :" @@ -144,21 +135,9 @@ msgid "Messages" msgstr "Messages" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:131 -#, python-format -msgid "The '%s' is empty or 0. It should have a non-null value." -msgstr "Le champ '%s' est vide ou nul. Il doit avoir une valeur non nulle." - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:89 -#, python-format -msgid "This IBAN is not valid : %s" -msgstr "Cet IBAN n'est pas valide : %s" - -#. module: account_banking_sepa_direct_debit -#: model:ir.model,name:account_banking_sepa_direct_debit.model_banking_export_sdd_wizard -msgid "Export SEPA Direct Debit XML file" -msgstr "Export des fichiers de prélèvement SEPA" +#: field:sdd.mandate,unique_mandate_reference:0 +msgid "Unique Mandate Reference" +msgstr "Référence unique de mandat" #. module: account_banking_sepa_direct_debit #: view:sdd.mandate:0 @@ -167,7 +146,7 @@ msgid "Cancelled" msgstr "Annulé" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:219 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:141 #, python-format msgid "Payment Type Code '%s' is not supported. The only Payment Type Code supported for SEPA Direct Debit are 'pain.008.001.02', 'pain.008.001.03' and 'pain.008.001.04'." msgstr "Le code du Type de paiement '%s' n'est pas supporté. Les seuls codes de Type de paiement supportés pour les prélèvements SEPA sont 'pain.008.001.02', 'pain.008.001.03' et 'pain.008.001.04'." @@ -187,6 +166,12 @@ msgstr "Fichier de prélèvement SEPA" msgid "SEPA Direct Debit Mandate has Expired" msgstr "Le mandat de prélèvement SEPA a expiré" +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:246 +#, python-format +msgid "The recurrent mandate '%s' which is not marked as 'Migrated to SEPA' must have its recurrent sequence type set to 'First'." +msgstr "Le mandat récurrent '%s' dont l'option 'Migré à SEPA' n'est pas activée doit avec sa séquence mise à 'First'." + #. module: account_banking_sepa_direct_debit #: help:banking.export.sdd,charge_bearer:0 #: help:banking.export.sdd.wizard,charge_bearer:0 @@ -224,7 +209,7 @@ msgid "Generation Date" msgstr "Date de génération" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:337 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:396 #, python-format msgid "The payment line with reference '%s' has the bank account '%s' which is not attached to the mandate '%s' (this mandate is attached to the bank account '%s')." msgstr "La ligne de paiement portant la référence '%s' est configurée avec le compte bancaire '%s' qui n'est pas rattaché au mandat '%s' (ce mandat est rattaché au compte bancaire '%s')." @@ -253,7 +238,7 @@ msgid "State" msgstr "État" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:204 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:240 #, python-format msgid "The recurrent mandate '%s' must have a sequence type." msgstr "Le mandat récurrent '%s' doit avoir un type de séquence." @@ -285,17 +270,16 @@ msgstr "Type" msgid "Sent" msgstr "Envoyé" +#. module: account_banking_sepa_direct_debit +#: field:res.company,original_creditor_identifier:0 +msgid "Original Creditor Identifier" +msgstr "Ancien Identifiant Créancier" + #. module: account_banking_sepa_direct_debit #: selection:sdd.mandate,recurrent_sequence_type:0 msgid "Recurring" msgstr "Recurring" -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:181 -#, python-format -msgid "The date of signature of mandate '%s' is in the future!" -msgstr "La date de signature du mandat '%s' est dans le futur !" - #. module: account_banking_sepa_direct_debit #: help:res.company,sepa_creditor_identifier:0 msgid "Enter the Creditor Identifier that has been attributed to your company to make SEPA Direct Debits. This identifier is composed of :\n" @@ -324,6 +308,12 @@ msgstr "Seuls des mandats valides peuvent être utilisés dans une ligne de paie msgid "This field is only used for Recurrent mandates, not for One-Off mandates." msgstr "Ce champ n'est utilisé que pour les mandats récurrents, pas pour les mandats One-Off." +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:213 +#, python-format +msgid "The date of signature of mandate '%s' is in the future !" +msgstr "La date de signature du mandat '%s' est dans le futur !" + #. module: account_banking_sepa_direct_debit #: view:sdd.mandate:0 msgid "Signature Date" @@ -340,12 +330,6 @@ msgstr "Répartition des frais" msgid "Partner" msgstr "Partenaire" -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:125 -#, python-format -msgid "Field type error:" -msgstr "Erreur de type de champ :" - #. module: account_banking_sepa_direct_debit #: selection:sdd.mandate,recurrent_sequence_type:0 msgid "First" @@ -363,18 +347,32 @@ msgstr "Mandat annulé" #. module: account_banking_sepa_direct_debit #: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.act_banking_export_sdd_payment_order -#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.action_account_banking_sdd -#: model:ir.ui.menu,name:account_banking_sepa_direct_debit.menu_account_banking_sdd msgid "Generated SEPA Direct Debit Files" msgstr "Fichiers de prélèvement SEPA générés" +#. module: account_banking_sepa_direct_debit +#: help:sdd.mandate,sepa_migrated:0 +msgid "If this field is not active, the mandate section of the next direct debit file that include this mandate will contain the 'Original Mandate Identification' and the 'Original Creditor Scheme Identification'. This is required in a few countries (Belgium for instance), but not in all countries. If this is not required in your country, you should keep this field always active." +msgstr "Si cette option n'est pas activée, la section qui concerne le mandat dans le prochain fichier de prélèvement qui incluera ce mandat contiendra les champs 'Original Mandate Identification' et 'Original Creditor Scheme Identification'. Ces champs sont requis dans certains pays (en Belgique notamment), mais pas dans tous les pays. Si ces champs ne sont pas requis dans votre pays, vous devriez garder ce champ toujours actif." + #. module: account_banking_sepa_direct_debit #: field:sdd.mandate,company_id:0 msgid "Company" msgstr "Société" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:191 +#: model:ir.model,name:account_banking_sepa_direct_debit.model_banking_export_sdd_wizard +msgid "Export SEPA Direct Debit File" +msgstr "Export du fichier de prélèvement SEPA" + +#. module: account_banking_sepa_direct_debit +#: help:banking.export.sdd,batch_booking:0 +#: help:banking.export.sdd.wizard,batch_booking:0 +msgid "If true, the bank statement will display only one credit line for all the direct debits of the SEPA file ; if false, the bank statement will display one credit line per direct debit of the SEPA file." +msgstr "Si activé, le relevé de compte ne fera apparaître qu'une ligne de crédit pour tous les prélèvements du fichier SEPA ; si désactivé, le relevé de banque fera apparaître une ligne de crédit pour chaque prélèvement du fichier SEPA." + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:225 #, python-format msgid "Cannot validate the mandate '%s' because it is not attached to a bank account." msgstr "Impossible de valider le mandat '%s' car il n'est pas rattaché à un compte bancaire." @@ -387,17 +385,11 @@ msgid "Draft" msgstr "Brouillon" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:232 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:290 #, python-format msgid "Mandate update" msgstr "Mise-à-jour du mandat" -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:116 -#, python-format -msgid "Cannot compute the '%s' of the Payment Line with Invoice Reference '%s'." -msgstr "Impossible de générer le '%s' de la ligne de paiement ayant la référence de facture '%s'." - #. module: account_banking_sepa_direct_debit #: selection:banking.export.sdd,charge_bearer:0 #: selection:banking.export.sdd.wizard,charge_bearer:0 @@ -410,6 +402,11 @@ msgstr "Partagée" msgid "Batch Booking" msgstr "Crédit groupé" +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,sepa_migrated:0 +msgid "Migrated to SEPA" +msgstr "Migré à SEPA" + #. module: account_banking_sepa_direct_debit #: field:sdd.mandate,state:0 msgid "Status" @@ -422,10 +419,10 @@ msgid "Total Amount" msgstr "Montant total" #. module: account_banking_sepa_direct_debit -#: help:banking.export.sdd,batch_booking:0 -#: help:banking.export.sdd.wizard,batch_booking:0 -msgid "If true, the bank statement will display only one credit line for all the direct debits of the SEPA file ; if false, the bank statement will display one credit line per direct debit of the SEPA file." -msgstr "Si activé, le relevé de compte ne fera apparaître qu'une ligne de crédit pour tous les prélèvements du fichier SEPA ; si désactivé, le relevé de banque fera apparaître une ligne de crédit pour chaque prélèvement du fichier SEPA." +#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.action_account_banking_sdd +#: model:ir.ui.menu,name:account_banking_sepa_direct_debit.menu_account_banking_sdd +msgid "SEPA Direct Debit Files" +msgstr "Fichiers de prélèvement SEPA" #. module: account_banking_sepa_direct_debit #: selection:banking.export.sdd,charge_bearer:0 @@ -434,7 +431,7 @@ msgid "Following Service Level" msgstr "Suivant le niveau de service" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:198 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:233 #, python-format msgid "The mandate '%s' can't have a date of last debit before the date of signature." msgstr "Le mandat '%s' ne peut pas avoir une date de dernier débit antérieure à la date de signature." @@ -450,11 +447,21 @@ msgstr "Type de Séquence mis à Final" msgid "Is a Follower" msgstr "Is a Follower" +#. module: account_banking_sepa_direct_debit +#: help:sdd.mandate,original_mandate_identification:0 +msgid "When the field 'Migrated to SEPA' is not active, this field will be used as the Original Mandate Identification in the Direct Debit file." +msgstr "Quand le champ 'Migré à SEPA' n'est pas activé, ce champ sera le 'Original Mandate Identification' dans le fichier de prélèvement." + #. module: account_banking_sepa_direct_debit #: view:payment.order:0 msgid "SDD Mandate" msgstr "Mandat de prélèvement" +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,original_mandate_identification:0 +msgid "Original Mandate Identification" +msgstr "Ancien Identifiant du Mandat" + #. module: account_banking_sepa_direct_debit #: model:ir.model,name:account_banking_sepa_direct_debit.model_res_company msgid "Companies" @@ -465,6 +472,11 @@ msgstr "Sociétés" msgid "Summary" msgstr "Résumé" +#. module: account_banking_sepa_direct_debit +#: model:res.groups,name:account_banking_sepa_direct_debit.group_original_mandate_required +msgid "Original Mandate Required (SEPA)" +msgstr "Ancien mandat requis (SEPA)" + #. module: account_banking_sepa_direct_debit #: field:account.invoice,sdd_mandate_id:0 #: model:ir.model,name:account_banking_sepa_direct_debit.model_sdd_mandate @@ -474,13 +486,13 @@ msgid "SEPA Direct Debit Mandate" msgstr "Mandat de prélèvement SEPA" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:270 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:193 #, python-format msgid "Missing SEPA Direct Debit mandate on the payment line with partner '%s' and Invoice ref '%s'." msgstr "Mandat de prélèvement SEPA manquant sur la ligne de paiement ayant pour partenaire '%s' et pour référence de facture '%s'." #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:288 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:210 #, python-format msgid "The mandate with reference '%s' for partner '%s' has type set to 'One-Off' and it has a last debit date set to '%s', so we can't use it." msgstr "Le mandat portant la référence '%s' pour le partenaire '%s' est de type 'One-Off' et il a une date de dernier débit au '%s', donc il n'est pas utilisable." @@ -510,6 +522,21 @@ msgstr "Identifiant créancier SEPA invalide." msgid "Bank Accounts" msgstr "Comptes bancaires" +#. module: account_banking_sepa_direct_debit +#: model:ir.actions.act_window,help:account_banking_sepa_direct_debit.sdd_mandate_action +msgid "

\n" +" Click to create a new SEPA Direct Debit Mandate.\n" +"

\n" +" A SEPA Direct Debit Mandate is a document signed by your customer that gives you the autorization to do one or several direct debits on his bank account.\n" +"

\n" +" " +msgstr "

\n" +" Cliquez pour créer un mandat de prélèvement SEPA.\n" +"

\n" +" Un mandat de prélèvement SEPA est un document signé par votre client qui vous donne l'autorisation de réaliser un ou plusieurs prélèvements sur son compte bancaire.\n" +"

\n" +" " + #. module: account_banking_sepa_direct_debit #: view:banking.export.sdd:0 msgid "General Information" @@ -538,12 +565,6 @@ msgstr "Annuler" msgid "Related Payment Lines" msgstr "Lignes de paiement associées" -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:169 -#, python-format -msgid "The generated XML file is not valid against the official XML Schema Definition. The generated XML file and the full error have been written in the server logs. Here is the error, which may give you an idea on the cause of the problem : %s" -msgstr "Le fichier XML généré n'est pas valide par rapport à la Définition du Schéma XML officiel. Le fichier XML généré et le message d'erreur complet ont été écrits dans les logs du serveur. Voici l'erreur, qui vous donnera peut-être une idée sur la cause du problème : %s" - #. module: account_banking_sepa_direct_debit #: view:sdd.mandate:0 #: selection:sdd.mandate,type:0 @@ -563,25 +584,13 @@ msgstr "Mandat validé" #. module: account_banking_sepa_direct_debit #: field:banking.export.sdd,file:0 msgid "SEPA File" -msgstr "SEPA File" +msgstr "Fichier SEPA" #. module: account_banking_sepa_direct_debit #: field:res.company,sepa_creditor_identifier:0 msgid "SEPA Creditor Identifier" msgstr "Identifiant créancier SEPA" -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:122 -#, python-format -msgid "Cannot compute the '%s'." -msgstr "Impossible de calculer le '%s'." - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:126 -#, python-format -msgid "The type of the field '%s' is %s. It should be a string or unicode." -msgstr "Le champ '%s' est de type %s. Il devrait être de type string ou unicode." - #. module: account_banking_sepa_direct_debit #: model:ir.model,name:account_banking_sepa_direct_debit.model_banking_export_sdd msgid "SEPA Direct Debit export" @@ -598,6 +607,12 @@ msgstr "Expiré" msgid "Bank Account" msgstr "Compte bancaire" +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:254 +#, python-format +msgid "You must set the 'Original Mandate Identification' on the recurrent mandate '%s' which is not marked as 'Migrated to SEPA'." +msgstr "Vous devez renseigner le champ 'Ancien identifiant du mandat' sur le mandat récurrent '%s' qui n'est pas marqué comme étant 'Migré à SEPA'." + #. module: account_banking_sepa_direct_debit #: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_first #: model:mail.message.subtype,name:account_banking_sepa_direct_debit.recurrent_sequence_type_first @@ -605,22 +620,7 @@ msgid "Sequence Type set to First" msgstr "Type de Séquence mis à First" #. module: account_banking_sepa_direct_debit -#: model:ir.actions.act_window,help:account_banking_sepa_direct_debit.sdd_mandate_action -msgid "

\n" -" Click to create a new SEPA Direct Debit Mandate.\n" -"

\n" -" A SEPA Direct Debit Mandate is a document signed by your customer that gives you the autorization to do one or several direct debits on his bank account.\n" -"

\n" -" " -msgstr "

\n" -" Cliquez pour créer un mandat de prélèvement SEPA.\n" -"

\n" -" Un mandat de prélèvement SEPA est un document signé par votre client qui vous donne l'autorisation de réaliser un ou plusieurs prélèvements sur son compte bancaire.\n" -"

\n" -" " - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:233 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:291 #, python-format msgid "As you changed the bank account attached to this mandate, the 'Sequence Type' has been set back to 'First'." msgstr "Etant donné que vous avez changé le compte bancaire associé à ce mandat, le 'Type de séquence' a été remis à 'First'." @@ -635,16 +635,6 @@ msgstr "Messages and communication history" msgid "Search SEPA Direct Debit Mandates" msgstr "Recherche dans les mandats de prélèvement SEPA" -#. module: account_banking_sepa_direct_debit -#: help:banking.export.sdd.wizard,requested_collec_date:0 -msgid "This is the date on which you would like the collection to be made by the bank. Please keep in mind that there are minimum delays for SEPA direct debits that depend on the type of mandate and the type of sequence." -msgstr "Entrez la date à laquelle vous voudriez que le prélèvement soit effectué par la banque. Gardez en mémoire qu'il y a un délai minimum pour les prélèvements SEPA qui dépend du type de mandat et du type de séquence." - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,unique_mandate_reference:0 -msgid "Unique Mandate Reference" -msgstr "Référence unique de mandat" - #. module: account_banking_sepa_direct_debit #: field:banking.export.sdd.wizard,file:0 msgid "File" diff --git a/account_banking_sepa_direct_debit/wizard/export_sdd.py b/account_banking_sepa_direct_debit/wizard/export_sdd.py index 5e4134f73..9657d0484 100644 --- a/account_banking_sepa_direct_debit/wizard/export_sdd.py +++ b/account_banking_sepa_direct_debit/wizard/export_sdd.py @@ -23,12 +23,9 @@ from openerp.osv import orm, fields from openerp.tools.translate import _ -from openerp import tools, netsvc +from openerp import netsvc from datetime import datetime from lxml import etree -import logging - -_logger = logging.getLogger(__name__) class banking_export_sdd_wizard(orm.TransientModel): @@ -42,14 +39,24 @@ class banking_export_sdd_wizard(orm.TransientModel): ], 'State', readonly=True), 'batch_booking': fields.boolean( 'Batch Booking', - help="If true, the bank statement will display only one credit line for all the direct debits of the SEPA file ; if false, the bank statement will display one credit line per direct debit of the SEPA file."), + help="If true, the bank statement will display only one credit " + "line for all the direct debits of the SEPA file ; if false, " + "the bank statement will display one credit line per direct " + "debit of the SEPA file."), 'charge_bearer': fields.selection([ ('SLEV', 'Following Service Level'), ('SHAR', 'Shared'), ('CRED', 'Borne by Creditor'), ('DEBT', 'Borne by Debtor'), ], 'Charge Bearer', required=True, - help='Following service level : transaction charges are to be applied following the rules agreed in the service level and/or scheme (SEPA Core messages must use this). Shared : transaction charges on the creditor side are to be borne by the creditor, transaction charges on the debtor side are to be borne by the debtor. Borne by creditor : all transaction charges are to be borne by the creditor. Borne by debtor : all transaction charges are to be borne by the debtor.'), + help="Following service level : transaction charges are to be " + "applied following the rules agreed in the service level and/or " + "scheme (SEPA Core messages must use this). Shared : transaction " + "charges on the creditor side are to be borne by the creditor, " + "transaction charges on the debtor side are to be borne by the " + "debtor. Borne by creditor : all transaction charges are to be " + "borne by the creditor. Borne by debtor : all transaction " + "charges are to be borne by the debtor."), 'nb_transactions': fields.related( 'file_id', 'nb_transactions', type='integer', string='Number of Transactions', readonly=True), @@ -129,13 +136,22 @@ class banking_export_sdd_wizard(orm.TransientModel): name_maxsize = 140 root_xml_tag = 'CstmrDrctDbtInitn' else: - raise orm.except_orm(_('Error:'), _("Payment Type Code '%s' is not supported. The only Payment Type Code supported for SEPA Direct Debit are 'pain.008.001.02', 'pain.008.001.03' and 'pain.008.001.04'.") % pain_flavor) + raise orm.except_orm( + _('Error:'), + _("Payment Type Code '%s' is not supported. The only " + "Payment Type Code supported for SEPA Direct Debit " + "are 'pain.008.001.02', 'pain.008.001.03' and " + "'pain.008.001.04'.") % pain_flavor) gen_args = { 'bic_xml_tag': bic_xml_tag, 'name_maxsize': name_maxsize, 'convert_to_ascii': convert_to_ascii, 'pain_flavor': pain_flavor, + 'sepa_export': sepa_export, + 'file_obj': self.pool['banking.export.sdd'], + 'pain_xsd_file': + 'account_banking_sepa_direct_debit/data/%s.xsd' % pain_flavor, } pain_ns = { @@ -143,13 +159,13 @@ class banking_export_sdd_wizard(orm.TransientModel): None: 'urn:iso:std:iso:20022:tech:xsd:%s' % pain_flavor, } - root = etree.Element('Document', nsmap=pain_ns) - pain_root = etree.SubElement(root, root_xml_tag) + xml_root = etree.Element('Document', nsmap=pain_ns) + pain_root = etree.SubElement(xml_root, root_xml_tag) # A. Group header group_header_1_0, nb_of_transactions_1_6, control_sum_1_7 = \ - self.generate_group_header_block( - cr, uid, pain_root, sepa_export, gen_args, context=context) + self.generate_group_header_block( + cr, uid, pain_root, gen_args, context=context) transactions_count_1_6 = 0 total_amount = 0.0 @@ -174,13 +190,15 @@ class banking_export_sdd_wizard(orm.TransientModel): if not line.sdd_mandate_id: raise orm.except_orm( _('Error:'), - _("Missing SEPA Direct Debit mandate on the payment line with partner '%s' and Invoice ref '%s'.") + _("Missing SEPA Direct Debit mandate on the payment " + "line with partner '%s' and Invoice ref '%s'.") % (line.partner_id.name, line.ml_inv_ref.number)) if line.sdd_mandate_id.state != 'valid': raise orm.except_orm( _('Error:'), - _("The SEPA Direct Debit mandate with reference '%s' for partner '%s' has expired.") + _("The SEPA Direct Debit mandate with reference '%s' " + "for partner '%s' has expired.") % (line.sdd_mandate_id.unique_mandate_reference, line.sdd_mandate_id.partner_id.name)) if line.sdd_mandate_id.type == 'oneoff': @@ -189,7 +207,10 @@ class banking_export_sdd_wizard(orm.TransientModel): else: raise orm.except_orm( _('Error:'), - _("The mandate with reference '%s' for partner '%s' has type set to 'One-Off' and it has a last debit date set to '%s', so we can't use it.") + _("The mandate with reference '%s' for partner " + "'%s' has type set to 'One-Off' and it has a " + "last debit date set to '%s', so we can't use " + "it.") % (line.sdd_mandate_id.unique_mandate_reference, line.sdd_mandate_id.partner_id.name, line.sdd_mandate_id.last_debit_date)) @@ -199,7 +220,8 @@ class banking_export_sdd_wizard(orm.TransientModel): 'first': 'FRST', 'final': 'FNAL', } - seq_type_label = line.sdd_mandate_id.recurrent_sequence_type + seq_type_label = \ + line.sdd_mandate_id.recurrent_sequence_type assert seq_type_label is not False seq_type = seq_type_map[seq_type_label] @@ -214,22 +236,26 @@ class banking_export_sdd_wizard(orm.TransientModel): cr, uid, line.id, {'date': requested_date}, context=context) - for (requested_date, priority, sequence_type), lines in lines_per_group.items(): + for (requested_date, priority, sequence_type), lines in \ + lines_per_group.items(): # B. Payment info payment_info_2_0, nb_of_transactions_2_4, control_sum_2_5 = \ - self.generate_start_payment_info_block( - cr, uid, pain_root, sepa_export, - "sepa_export.payment_order_ids[0].reference + '-' + sequence_type + '-' + requested_date.replace('-', '') + '-' + priority", - priority, 'CORE', sequence_type, requested_date, { - 'sepa_export': sepa_export, - 'sequence_type': sequence_type, - 'priority': priority, - 'requested_date': requested_date, - }, gen_args, context=context) + self.generate_start_payment_info_block( + cr, uid, pain_root, + "sepa_export.payment_order_ids[0].reference + '-' + " + "sequence_type + '-' + requested_date.replace('-', '') " + "+ '-' + priority", + priority, 'CORE', sequence_type, requested_date, { + 'sepa_export': sepa_export, + 'sequence_type': sequence_type, + 'priority': priority, + 'requested_date': requested_date, + }, gen_args, context=context) self.generate_party_block( cr, uid, payment_info_2_0, 'Cdtr', 'B', - 'sepa_export.payment_order_ids[0].mode.bank_id.partner_id.name', + 'sepa_export.payment_order_ids[0].mode.bank_id.partner_id.' + 'name', 'sepa_export.payment_order_ids[0].mode.bank_id.acc_number', 'sepa_export.payment_order_ids[0].mode.bank_id.bank.bic', {'sepa_export': sepa_export}, @@ -242,7 +268,8 @@ class banking_export_sdd_wizard(orm.TransientModel): payment_info_2_0, 'CdtrSchmeId') self.generate_creditor_scheme_identification( cr, uid, creditor_scheme_identification_2_27, - 'sepa_export.payment_order_ids[0].company_id.sepa_creditor_identifier', + 'sepa_export.payment_order_ids[0].company_id.' + 'sepa_creditor_identifier', 'SEPA Creditor Identifier', {'sepa_export': sepa_export}, 'SEPA', gen_args, context=context) @@ -340,7 +367,8 @@ class banking_export_sdd_wizard(orm.TransientModel): ori_mandate_identification_2_52.text = \ self._prepare_field( cr, uid, 'Original Mandate Identification', - 'line.sdd_mandate_id.original_mandate_identification', + 'line.sdd_mandate_id.' + 'original_mandate_identification', {'line': line}, gen_args=gen_args, context=context) @@ -348,7 +376,8 @@ class banking_export_sdd_wizard(orm.TransientModel): amendment_info_details_2_51, 'OrgnlCdtrSchmeId') self.generate_creditor_scheme_identification( cr, uid, ori_creditor_scheme_id_2_53, - 'sepa_export.payment_order_ids[0].company_id.original_creditor_identifier', + 'sepa_export.payment_order_ids[0].company_id.' + 'original_creditor_identifier', 'Original Creditor Identifier', {'sepa_export': sepa_export}, 'SEPA', gen_args, context=context) @@ -369,38 +398,9 @@ class banking_export_sdd_wizard(orm.TransientModel): nb_of_transactions_1_6.text = str(transactions_count_1_6) control_sum_1_7.text = '%.2f' % amount_control_sum_1_7 - xml_string = etree.tostring( - root, pretty_print=True, encoding='UTF-8', xml_declaration=True) - _logger.debug( - "Generated SDD XML file in format %s below" % pain_flavor) - _logger.debug(xml_string) - pain_xsd_file = \ - 'account_banking_sepa_direct_debit/data/%s.xsd' % pain_flavor - self._validate_xml(cr, uid, xml_string, pain_xsd_file) - - # CREATE the banking.export.sepa record - file_id = self.pool.get('banking.export.sdd').create( - cr, uid, self._prepare_export_sepa( - cr, uid, sepa_export, total_amount, transactions_count_1_6, - xml_string, gen_args, context=context), - context=context) - - self.write( - cr, uid, ids, { - 'file_id': file_id, - 'state': 'finish', - }, context=context) - - action = { - 'name': 'SEPA Direct Debit File', - 'type': 'ir.actions.act_window', - 'view_type': 'form', - 'view_mode': 'form,tree', - 'res_model': self._name, - 'res_id': ids[0], - 'target': 'new', - } - return action + return self.finalize_sepa_file_creation( + cr, uid, ids, xml_root, total_amount, transactions_count_1_6, + gen_args, context=context) def cancel_sepa(self, cr, uid, ids, context=None): ''' From 08e50ac66b55cb3f887d939bd32c0c9c186582c3 Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Mon, 6 Jan 2014 00:51:22 +0100 Subject: [PATCH 024/118] For SCT, if BIC is not provided, we should not put the 'Creditor Agent' block at all, according to EPC guidelines (on this point, it is different from the Direct Debit !) --- account_banking_sepa_direct_debit/wizard/export_sdd.py | 1 + 1 file changed, 1 insertion(+) diff --git a/account_banking_sepa_direct_debit/wizard/export_sdd.py b/account_banking_sepa_direct_debit/wizard/export_sdd.py index 9657d0484..19520d318 100644 --- a/account_banking_sepa_direct_debit/wizard/export_sdd.py +++ b/account_banking_sepa_direct_debit/wizard/export_sdd.py @@ -147,6 +147,7 @@ class banking_export_sdd_wizard(orm.TransientModel): 'bic_xml_tag': bic_xml_tag, 'name_maxsize': name_maxsize, 'convert_to_ascii': convert_to_ascii, + 'payment_method': 'DD', 'pain_flavor': pain_flavor, 'sepa_export': sepa_export, 'file_obj': self.pool['banking.export.sdd'], From 3ec35340859f9d4f764eb7b90baf60161e2f73bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Bidoul?= Date: Sun, 16 Feb 2014 14:56:24 +0100 Subject: [PATCH 025/118] move SEPA direct debit menu entries to a menu that does not depend on the core account_banking --- account_banking_sepa_direct_debit/sdd_mandate_view.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/account_banking_sepa_direct_debit/sdd_mandate_view.xml b/account_banking_sepa_direct_debit/sdd_mandate_view.xml index d86f74f5b..409919dc5 100644 --- a/account_banking_sepa_direct_debit/sdd_mandate_view.xml +++ b/account_banking_sepa_direct_debit/sdd_mandate_view.xml @@ -97,7 +97,7 @@ From 10035cb0e9bac46d35d743a686a8b77bdbdd824c Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Sun, 16 Feb 2014 15:01:09 +0100 Subject: [PATCH 026/118] Add demo data --- .../__openerp__.py | 1 + .../data/payment_type_sdd.xml | 4 +-- .../sepa_direct_debit_demo.xml | 27 +++++++++++++++++++ 3 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 account_banking_sepa_direct_debit/sepa_direct_debit_demo.xml diff --git a/account_banking_sepa_direct_debit/__openerp__.py b/account_banking_sepa_direct_debit/__openerp__.py index 95ac05413..cd603fc03 100644 --- a/account_banking_sepa_direct_debit/__openerp__.py +++ b/account_banking_sepa_direct_debit/__openerp__.py @@ -44,6 +44,7 @@ 'data/mandate_reference_sequence.xml', 'security/ir.model.access.csv', ], + 'demo': ['sepa_direct_debit_demo.xml'], 'description': ''' Module to export direct debit payment orders in SEPA XML file format. diff --git a/account_banking_sepa_direct_debit/data/payment_type_sdd.xml b/account_banking_sepa_direct_debit/data/payment_type_sdd.xml index fcc742531..a17b3b21c 100644 --- a/account_banking_sepa_direct_debit/data/payment_type_sdd.xml +++ b/account_banking_sepa_direct_debit/data/payment_type_sdd.xml @@ -1,9 +1,8 @@ - + - SEPA Direct Debit v02 (recommended) pain.008.001.02 @@ -32,6 +31,5 @@ - diff --git a/account_banking_sepa_direct_debit/sepa_direct_debit_demo.xml b/account_banking_sepa_direct_debit/sepa_direct_debit_demo.xml new file mode 100644 index 000000000..220261088 --- /dev/null +++ b/account_banking_sepa_direct_debit/sepa_direct_debit_demo.xml @@ -0,0 +1,27 @@ + + + + + + + SEPA Direct Debit La Banque Postale + + + + + + + + FR78ZZZ424242 + + + + + recurrent + first + 2014-02-01 + valid + + + + From b4f57bc58541f75bc7ddc6ee8aa8aaec015e4f7b Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Wed, 12 Mar 2014 23:18:33 +0100 Subject: [PATCH 027/118] Add missing utf-8 header Update state field on SEPA file objects and display it in tree+form views. Migrate form views to version 7.0 and simplify them. --- .../__openerp__.py | 1 + .../account_banking_sdd.py | 2 +- .../account_banking_sdd_view.xml | 33 +++++++++---------- account_banking_sepa_direct_debit/company.py | 1 + 4 files changed, 18 insertions(+), 19 deletions(-) diff --git a/account_banking_sepa_direct_debit/__openerp__.py b/account_banking_sepa_direct_debit/__openerp__.py index cd603fc03..611127a84 100644 --- a/account_banking_sepa_direct_debit/__openerp__.py +++ b/account_banking_sepa_direct_debit/__openerp__.py @@ -1,3 +1,4 @@ +# -*- encoding: utf-8 -*- ############################################################################## # # SEPA Direct Debit module for OpenERP diff --git a/account_banking_sepa_direct_debit/account_banking_sdd.py b/account_banking_sepa_direct_debit/account_banking_sdd.py index d0edb5e90..cbf0d0d10 100644 --- a/account_banking_sepa_direct_debit/account_banking_sdd.py +++ b/account_banking_sepa_direct_debit/account_banking_sdd.py @@ -1,3 +1,4 @@ +# -*- encoding: utf-8 -*- ############################################################################## # # SEPA Direct Debit module for OpenERP @@ -89,7 +90,6 @@ class banking_export_sdd(orm.Model): 'state': fields.selection([ ('draft', 'Draft'), ('sent', 'Sent'), - ('done', 'Reconciled'), ], 'State', readonly=True), } diff --git a/account_banking_sepa_direct_debit/account_banking_sdd_view.xml b/account_banking_sepa_direct_debit/account_banking_sdd_view.xml index f89ec7389..f74b60353 100644 --- a/account_banking_sepa_direct_debit/account_banking_sdd_view.xml +++ b/account_banking_sepa_direct_debit/account_banking_sdd_view.xml @@ -11,28 +11,24 @@ account.banking.export.sdd.form banking.export.sdd -
+ +
+ +
- - - - - - - - + + + + + + + + + - - - - - - - - - +
@@ -48,6 +44,7 @@ +
diff --git a/account_banking_sepa_direct_debit/company.py b/account_banking_sepa_direct_debit/company.py index 5dd960224..6d54ba8e6 100644 --- a/account_banking_sepa_direct_debit/company.py +++ b/account_banking_sepa_direct_debit/company.py @@ -1,3 +1,4 @@ +# -*- encoding: utf-8 -*- ############################################################################## # # SEPA Direct Debit module for OpenERP From 3fc07a1c61e05da86755a43ba0892ca4baa1f81a Mon Sep 17 00:00:00 2001 From: Launchpad Translations on behalf of banking-addons-team Date: Sat, 1 Feb 2014 06:56:49 +0000 Subject: [PATCH 028/118] Launchpad automatic translations update. --- account_banking_sepa_direct_debit/i18n/fr.po | 199 +++-- account_banking_sepa_direct_debit/i18n/nl.po | 754 +++++++++++++++++++ 2 files changed, 907 insertions(+), 46 deletions(-) create mode 100644 account_banking_sepa_direct_debit/i18n/nl.po diff --git a/account_banking_sepa_direct_debit/i18n/fr.po b/account_banking_sepa_direct_debit/i18n/fr.po index 9d30343dd..3744da850 100644 --- a/account_banking_sepa_direct_debit/i18n/fr.po +++ b/account_banking_sepa_direct_debit/i18n/fr.po @@ -6,14 +6,15 @@ msgid "" msgstr "" "Project-Id-Version: OpenERP Server 7.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-12-23 22:25+0000\n" -"PO-Revision-Date: 2013-12-23 22:25+0000\n" -"Last-Translator: <>\n" +"POT-Creation-Date: 2013-12-23 22:24+0000\n" +"PO-Revision-Date: 2014-02-01 04:49+0000\n" +"Last-Translator: Alexis de Lattre \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Plural-Forms: \n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2014-05-31 06:02+0000\n" +"X-Generator: Launchpad (build 17031)\n" #. module: account_banking_sepa_direct_debit #: model:mail.message.subtype,description:account_banking_sepa_direct_debit.mandate_valid @@ -29,8 +30,12 @@ msgstr "Nom du fichier" #. module: account_banking_sepa_direct_debit #: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:200 #, python-format -msgid "The SEPA Direct Debit mandate with reference '%s' for partner '%s' has expired." -msgstr "Le mandat de prélèvement SEPA portant la référence '%s' pour le partenaire '%s' a expiré." +msgid "" +"The SEPA Direct Debit mandate with reference '%s' for partner '%s' has " +"expired." +msgstr "" +"Le mandat de prélèvement SEPA portant la référence '%s' pour le partenaire " +"'%s' a expiré." #. module: account_banking_sepa_direct_debit #: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:219 @@ -148,8 +153,14 @@ msgstr "Annulé" #. module: account_banking_sepa_direct_debit #: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:141 #, python-format -msgid "Payment Type Code '%s' is not supported. The only Payment Type Code supported for SEPA Direct Debit are 'pain.008.001.02', 'pain.008.001.03' and 'pain.008.001.04'." -msgstr "Le code du Type de paiement '%s' n'est pas supporté. Les seuls codes de Type de paiement supportés pour les prélèvements SEPA sont 'pain.008.001.02', 'pain.008.001.03' et 'pain.008.001.04'." +msgid "" +"Payment Type Code '%s' is not supported. The only Payment Type Code " +"supported for SEPA Direct Debit are 'pain.008.001.02', 'pain.008.001.03' and " +"'pain.008.001.04'." +msgstr "" +"Le code du Type de paiement '%s' n'est pas supporté. Les seuls codes de Type " +"de paiement supportés pour les prélèvements SEPA sont 'pain.008.001.02', " +"'pain.008.001.03' et 'pain.008.001.04'." #. module: account_banking_sepa_direct_debit #: help:sdd.mandate,message_unread:0 @@ -169,14 +180,32 @@ msgstr "Le mandat de prélèvement SEPA a expiré" #. module: account_banking_sepa_direct_debit #: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:246 #, python-format -msgid "The recurrent mandate '%s' which is not marked as 'Migrated to SEPA' must have its recurrent sequence type set to 'First'." -msgstr "Le mandat récurrent '%s' dont l'option 'Migré à SEPA' n'est pas activée doit avec sa séquence mise à 'First'." +msgid "" +"The recurrent mandate '%s' which is not marked as 'Migrated to SEPA' must " +"have its recurrent sequence type set to 'First'." +msgstr "" +"Le mandat récurrent '%s' dont l'option 'Migré à SEPA' n'est pas activée doit " +"avec sa séquence mise à 'First'." #. module: account_banking_sepa_direct_debit #: help:banking.export.sdd,charge_bearer:0 #: help:banking.export.sdd.wizard,charge_bearer:0 -msgid "Following service level : transaction charges are to be applied following the rules agreed in the service level and/or scheme (SEPA Core messages must use this). Shared : transaction charges on the creditor side are to be borne by the creditor, transaction charges on the debtor side are to be borne by the debtor. Borne by creditor : all transaction charges are to be borne by the creditor. Borne by debtor : all transaction charges are to be borne by the debtor." -msgstr "Suivant le niveau de service : la répartition des frais bancaires suit les règles pré-établies dans le schema ou dans le contrat avec la banque (les messages SEPA Core doivent utiliser ce paramètre). Partagés : les frais bancaires côté débiteur sont à la charge du débiteur, les frais bancaires côté créancier sont à la charge du créancier. Supportés par le créancier : tous les frais bancaires sont à la charge du créancier. Supportés par le débiteur : tous les frais bancaires sont à la charge du débiteur." +msgid "" +"Following service level : transaction charges are to be applied following " +"the rules agreed in the service level and/or scheme (SEPA Core messages must " +"use this). Shared : transaction charges on the creditor side are to be borne " +"by the creditor, transaction charges on the debtor side are to be borne by " +"the debtor. Borne by creditor : all transaction charges are to be borne by " +"the creditor. Borne by debtor : all transaction charges are to be borne by " +"the debtor." +msgstr "" +"Suivant le niveau de service : la répartition des frais bancaires suit les " +"règles pré-établies dans le schema ou dans le contrat avec la banque (les " +"messages SEPA Core doivent utiliser ce paramètre). Partagés : les frais " +"bancaires côté débiteur sont à la charge du débiteur, les frais bancaires " +"côté créancier sont à la charge du créancier. Supportés par le créancier : " +"tous les frais bancaires sont à la charge du créancier. Supportés par le " +"débiteur : tous les frais bancaires sont à la charge du débiteur." #. module: account_banking_sepa_direct_debit #: view:sdd.mandate:0 @@ -195,8 +224,12 @@ msgstr "Génération de fichiers de prélèvement SEPA XML" #. module: account_banking_sepa_direct_debit #: help:sdd.mandate,message_summary:0 -msgid "Holds the Chatter summary (number of messages, ...). This summary is directly in html format in order to be inserted in kanban views." -msgstr "Holds the Chatter summary (number of messages, ...). This summary is directly in html format in order to be inserted in kanban views." +msgid "" +"Holds the Chatter summary (number of messages, ...). This summary is " +"directly in html format in order to be inserted in kanban views." +msgstr "" +"Holds the Chatter summary (number of messages, ...). This summary is " +"directly in html format in order to be inserted in kanban views." #. module: account_banking_sepa_direct_debit #: model:ir.model,name:account_banking_sepa_direct_debit.model_payment_line @@ -211,8 +244,14 @@ msgstr "Date de génération" #. module: account_banking_sepa_direct_debit #: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:396 #, python-format -msgid "The payment line with reference '%s' has the bank account '%s' which is not attached to the mandate '%s' (this mandate is attached to the bank account '%s')." -msgstr "La ligne de paiement portant la référence '%s' est configurée avec le compte bancaire '%s' qui n'est pas rattaché au mandat '%s' (ce mandat est rattaché au compte bancaire '%s')." +msgid "" +"The payment line with reference '%s' has the bank account '%s' which is not " +"attached to the mandate '%s' (this mandate is attached to the bank account " +"'%s')." +msgstr "" +"La ligne de paiement portant la référence '%s' est configurée avec le compte " +"bancaire '%s' qui n'est pas rattaché au mandat '%s' (ce mandat est rattaché " +"au compte bancaire '%s')." #. module: account_banking_sepa_direct_debit #: selection:banking.export.sdd.wizard,state:0 @@ -282,12 +321,16 @@ msgstr "Recurring" #. module: account_banking_sepa_direct_debit #: help:res.company,sepa_creditor_identifier:0 -msgid "Enter the Creditor Identifier that has been attributed to your company to make SEPA Direct Debits. This identifier is composed of :\n" +msgid "" +"Enter the Creditor Identifier that has been attributed to your company to " +"make SEPA Direct Debits. This identifier is composed of :\n" "- your country ISO code (2 letters)\n" "- a 2-digits checkum\n" "- a 3-letters business code\n" "- a country-specific identifier" -msgstr "Entrez l'Identifiant créancier qui a été attribué à votre société pour réaliser des prélèvements SEPA. Cet identifiant est composé de :\n" +msgstr "" +"Entrez l'Identifiant créancier qui a été attribué à votre société pour " +"réaliser des prélèvements SEPA. Cet identifiant est composé de :\n" "- du code ISO de votre pays (2 lettres)\n" "- un code de contrôle à 2 chiffres\n" "- un code d'activité à 3 lettres\n" @@ -300,13 +343,25 @@ msgstr "Un mandat avec la même référence existe déjà pour cette société ! #. module: account_banking_sepa_direct_debit #: help:sdd.mandate,state:0 -msgid "Only valid mandates can be used in a payment line. A cancelled mandate is a mandate that has been cancelled by the customer. A one-off mandate expires after its first use. A recurrent mandate expires after it's final use or if it hasn't been used for 36 months." -msgstr "Seuls des mandats valides peuvent être utilisés dans une ligne de paiement. Un mandate annulé est un mandat qui a été annulé par le client. Un mandat One-Off expire à l'issue de sa première utilisation. Un mandate récurrent expire après sa dernière utilisation ou si il n'a pas été utilisé pendant 36 mois." +msgid "" +"Only valid mandates can be used in a payment line. A cancelled mandate is a " +"mandate that has been cancelled by the customer. A one-off mandate expires " +"after its first use. A recurrent mandate expires after it's final use or if " +"it hasn't been used for 36 months." +msgstr "" +"Seuls des mandats valides peuvent être utilisés dans une ligne de paiement. " +"Un mandate annulé est un mandat qui a été annulé par le client. Un mandat " +"One-Off expire à l'issue de sa première utilisation. Un mandate récurrent " +"expire après sa dernière utilisation ou si il n'a pas été utilisé pendant 36 " +"mois." #. module: account_banking_sepa_direct_debit #: help:sdd.mandate,recurrent_sequence_type:0 -msgid "This field is only used for Recurrent mandates, not for One-Off mandates." -msgstr "Ce champ n'est utilisé que pour les mandats récurrents, pas pour les mandats One-Off." +msgid "" +"This field is only used for Recurrent mandates, not for One-Off mandates." +msgstr "" +"Ce champ n'est utilisé que pour les mandats récurrents, pas pour les mandats " +"One-Off." #. module: account_banking_sepa_direct_debit #: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:213 @@ -352,8 +407,20 @@ msgstr "Fichiers de prélèvement SEPA générés" #. module: account_banking_sepa_direct_debit #: help:sdd.mandate,sepa_migrated:0 -msgid "If this field is not active, the mandate section of the next direct debit file that include this mandate will contain the 'Original Mandate Identification' and the 'Original Creditor Scheme Identification'. This is required in a few countries (Belgium for instance), but not in all countries. If this is not required in your country, you should keep this field always active." -msgstr "Si cette option n'est pas activée, la section qui concerne le mandat dans le prochain fichier de prélèvement qui incluera ce mandat contiendra les champs 'Original Mandate Identification' et 'Original Creditor Scheme Identification'. Ces champs sont requis dans certains pays (en Belgique notamment), mais pas dans tous les pays. Si ces champs ne sont pas requis dans votre pays, vous devriez garder ce champ toujours actif." +msgid "" +"If this field is not active, the mandate section of the next direct debit " +"file that include this mandate will contain the 'Original Mandate " +"Identification' and the 'Original Creditor Scheme Identification'. This is " +"required in a few countries (Belgium for instance), but not in all " +"countries. If this is not required in your country, you should keep this " +"field always active." +msgstr "" +"Si cette option n'est pas activée, la section qui concerne le mandat dans le " +"prochain fichier de prélèvement qui incluera ce mandat contiendra les champs " +"'Original Mandate Identification' et 'Original Creditor Scheme " +"Identification'. Ces champs sont requis dans certains pays (en Belgique " +"notamment), mais pas dans tous les pays. Si ces champs ne sont pas requis " +"dans votre pays, vous devriez garder ce champ toujours actif." #. module: account_banking_sepa_direct_debit #: field:sdd.mandate,company_id:0 @@ -368,14 +435,25 @@ msgstr "Export du fichier de prélèvement SEPA" #. module: account_banking_sepa_direct_debit #: help:banking.export.sdd,batch_booking:0 #: help:banking.export.sdd.wizard,batch_booking:0 -msgid "If true, the bank statement will display only one credit line for all the direct debits of the SEPA file ; if false, the bank statement will display one credit line per direct debit of the SEPA file." -msgstr "Si activé, le relevé de compte ne fera apparaître qu'une ligne de crédit pour tous les prélèvements du fichier SEPA ; si désactivé, le relevé de banque fera apparaître une ligne de crédit pour chaque prélèvement du fichier SEPA." +msgid "" +"If true, the bank statement will display only one credit line for all the " +"direct debits of the SEPA file ; if false, the bank statement will display " +"one credit line per direct debit of the SEPA file." +msgstr "" +"Si activé, le relevé de compte ne fera apparaître qu'une ligne de crédit " +"pour tous les prélèvements du fichier SEPA ; si désactivé, le relevé de " +"banque fera apparaître une ligne de crédit pour chaque prélèvement du " +"fichier SEPA." #. module: account_banking_sepa_direct_debit #: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:225 #, python-format -msgid "Cannot validate the mandate '%s' because it is not attached to a bank account." -msgstr "Impossible de valider le mandat '%s' car il n'est pas rattaché à un compte bancaire." +msgid "" +"Cannot validate the mandate '%s' because it is not attached to a bank " +"account." +msgstr "" +"Impossible de valider le mandat '%s' car il n'est pas rattaché à un compte " +"bancaire." #. module: account_banking_sepa_direct_debit #: selection:banking.export.sdd,state:0 @@ -433,8 +511,12 @@ msgstr "Suivant le niveau de service" #. module: account_banking_sepa_direct_debit #: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:233 #, python-format -msgid "The mandate '%s' can't have a date of last debit before the date of signature." -msgstr "Le mandat '%s' ne peut pas avoir une date de dernier débit antérieure à la date de signature." +msgid "" +"The mandate '%s' can't have a date of last debit before the date of " +"signature." +msgstr "" +"Le mandat '%s' ne peut pas avoir une date de dernier débit antérieure à la " +"date de signature." #. module: account_banking_sepa_direct_debit #: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_final @@ -449,8 +531,12 @@ msgstr "Is a Follower" #. module: account_banking_sepa_direct_debit #: help:sdd.mandate,original_mandate_identification:0 -msgid "When the field 'Migrated to SEPA' is not active, this field will be used as the Original Mandate Identification in the Direct Debit file." -msgstr "Quand le champ 'Migré à SEPA' n'est pas activé, ce champ sera le 'Original Mandate Identification' dans le fichier de prélèvement." +msgid "" +"When the field 'Migrated to SEPA' is not active, this field will be used as " +"the Original Mandate Identification in the Direct Debit file." +msgstr "" +"Quand le champ 'Migré à SEPA' n'est pas activé, ce champ sera le 'Original " +"Mandate Identification' dans le fichier de prélèvement." #. module: account_banking_sepa_direct_debit #: view:payment.order:0 @@ -488,14 +574,22 @@ msgstr "Mandat de prélèvement SEPA" #. module: account_banking_sepa_direct_debit #: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:193 #, python-format -msgid "Missing SEPA Direct Debit mandate on the payment line with partner '%s' and Invoice ref '%s'." -msgstr "Mandat de prélèvement SEPA manquant sur la ligne de paiement ayant pour partenaire '%s' et pour référence de facture '%s'." +msgid "" +"Missing SEPA Direct Debit mandate on the payment line with partner '%s' and " +"Invoice ref '%s'." +msgstr "" +"Mandat de prélèvement SEPA manquant sur la ligne de paiement ayant pour " +"partenaire '%s' et pour référence de facture '%s'." #. module: account_banking_sepa_direct_debit #: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:210 #, python-format -msgid "The mandate with reference '%s' for partner '%s' has type set to 'One-Off' and it has a last debit date set to '%s', so we can't use it." -msgstr "Le mandat portant la référence '%s' pour le partenaire '%s' est de type 'One-Off' et il a une date de dernier débit au '%s', donc il n'est pas utilisable." +msgid "" +"The mandate with reference '%s' for partner '%s' has type set to 'One-Off' " +"and it has a last debit date set to '%s', so we can't use it." +msgstr "" +"Le mandat portant la référence '%s' pour le partenaire '%s' est de type 'One-" +"Off' et il a une date de dernier débit au '%s', donc il n'est pas utilisable." #. module: account_banking_sepa_direct_debit #: field:sdd.mandate,scan:0 @@ -524,16 +618,22 @@ msgstr "Comptes bancaires" #. module: account_banking_sepa_direct_debit #: model:ir.actions.act_window,help:account_banking_sepa_direct_debit.sdd_mandate_action -msgid "

\n" +msgid "" +"

\n" " Click to create a new SEPA Direct Debit Mandate.\n" "

\n" -" A SEPA Direct Debit Mandate is a document signed by your customer that gives you the autorization to do one or several direct debits on his bank account.\n" +" A SEPA Direct Debit Mandate is a document signed by your customer " +"that gives you the autorization to do one or several direct debits on his " +"bank account.\n" "

\n" " " -msgstr "

\n" +msgstr "" +"

\n" " Cliquez pour créer un mandat de prélèvement SEPA.\n" "

\n" -" Un mandat de prélèvement SEPA est un document signé par votre client qui vous donne l'autorisation de réaliser un ou plusieurs prélèvements sur son compte bancaire.\n" +" Un mandat de prélèvement SEPA est un document signé par votre client " +"qui vous donne l'autorisation de réaliser un ou plusieurs prélèvements sur " +"son compte bancaire.\n" "

\n" " " @@ -610,8 +710,12 @@ msgstr "Compte bancaire" #. module: account_banking_sepa_direct_debit #: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:254 #, python-format -msgid "You must set the 'Original Mandate Identification' on the recurrent mandate '%s' which is not marked as 'Migrated to SEPA'." -msgstr "Vous devez renseigner le champ 'Ancien identifiant du mandat' sur le mandat récurrent '%s' qui n'est pas marqué comme étant 'Migré à SEPA'." +msgid "" +"You must set the 'Original Mandate Identification' on the recurrent mandate " +"'%s' which is not marked as 'Migrated to SEPA'." +msgstr "" +"Vous devez renseigner le champ 'Ancien identifiant du mandat' sur le mandat " +"récurrent '%s' qui n'est pas marqué comme étant 'Migré à SEPA'." #. module: account_banking_sepa_direct_debit #: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_first @@ -622,8 +726,12 @@ msgstr "Type de Séquence mis à First" #. module: account_banking_sepa_direct_debit #: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:291 #, python-format -msgid "As you changed the bank account attached to this mandate, the 'Sequence Type' has been set back to 'First'." -msgstr "Etant donné que vous avez changé le compte bancaire associé à ce mandat, le 'Type de séquence' a été remis à 'First'." +msgid "" +"As you changed the bank account attached to this mandate, the 'Sequence " +"Type' has been set back to 'First'." +msgstr "" +"Etant donné que vous avez changé le compte bancaire associé à ce mandat, le " +"'Type de séquence' a été remis à 'First'." #. module: account_banking_sepa_direct_debit #: help:sdd.mandate,message_ids:0 @@ -639,4 +747,3 @@ msgstr "Recherche dans les mandats de prélèvement SEPA" #: field:banking.export.sdd.wizard,file:0 msgid "File" msgstr "Fichier" - diff --git a/account_banking_sepa_direct_debit/i18n/nl.po b/account_banking_sepa_direct_debit/i18n/nl.po new file mode 100644 index 000000000..2c2ccc12f --- /dev/null +++ b/account_banking_sepa_direct_debit/i18n/nl.po @@ -0,0 +1,754 @@ +# Dutch translation for banking-addons +# Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 +# This file is distributed under the same license as the banking-addons package. +# FIRST AUTHOR , 2014. +# +msgid "" +msgstr "" +"Project-Id-Version: banking-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2013-12-23 22:24+0000\n" +"PO-Revision-Date: 2014-04-24 10:38+0000\n" +"Last-Translator: Erwin van der Ploeg (BAS Solutions) \n" +"Language-Team: Dutch \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2014-05-31 06:02+0000\n" +"X-Generator: Launchpad (build 17031)\n" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.mandate_valid +msgid "SEPA Direct Debit Mandate Validated" +msgstr "SEPA incasso machtiging bevestigd." + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,filename:0 +#: field:banking.export.sdd.wizard,filename:0 +msgid "Filename" +msgstr "Bestandsnaam" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:200 +#, python-format +msgid "" +"The SEPA Direct Debit mandate with reference '%s' for partner '%s' has " +"expired." +msgstr "" +"De SEPA incasso machtiging met referentie '%s' voor relatie '%s' is verlopen." + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:219 +#, python-format +msgid "Cannot validate the mandate '%s' without a date of signature." +msgstr "" +"Het is niet mogelijk de machtiging '%s' te bevestigen zonder een datum van " +"ondertekenen." + +#. module: account_banking_sepa_direct_debit +#: selection:sdd.mandate,recurrent_sequence_type:0 +msgid "Final" +msgstr "Definitief" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd.wizard,state:0 +msgid "Finish" +msgstr "Gereed" + +#. module: account_banking_sepa_direct_debit +#: view:res.partner:0 +#: view:res.partner.bank:0 +msgid "SDD Mandates" +msgstr "SDD machteging" + +#. module: account_banking_sepa_direct_debit +#: constraint:payment.line:0 +#: constraint:sdd.mandate:0 +msgid "Error msg in raise" +msgstr "Fout bericht" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,state:0 +msgid "Reconciled" +msgstr "Afgeletterd" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,recurrent_sequence_type:0 +msgid "Sequence Type for Next Debit" +msgstr "Reeks soort voor volgende incasso" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,charge_bearer:0 +#: selection:banking.export.sdd.wizard,charge_bearer:0 +msgid "Borne by Creditor" +msgstr "Op rekening van schuldeiser" + +#. module: account_banking_sepa_direct_debit +#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.sdd_mandate_action +#: model:ir.ui.menu,name:account_banking_sepa_direct_debit.sdd_mandate_menu +#: view:res.partner.bank:0 +#: field:res.partner.bank,sdd_mandate_ids:0 +msgid "SEPA Direct Debit Mandates" +msgstr "SEPA incasso machtegingen" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd.wizard:0 +#: view:sdd.mandate:0 +msgid "Validate" +msgstr "Bevestigen" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_recurring +#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.recurrent_sequence_type_recurring +msgid "Sequence Type set to Recurring" +msgstr "Reeks soort ingesteld op herhalend" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd.wizard:0 +msgid "Generate" +msgstr "Genereer" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.mandate_cancel +msgid "SEPA Direct Debit Mandate Cancelled" +msgstr "SEPA incasso machtegingen geannuleerd" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,charge_bearer:0 +#: selection:banking.export.sdd.wizard,charge_bearer:0 +msgid "Borne by Debtor" +msgstr "Rekening van schuldenaar" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:212 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:218 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:224 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:232 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:239 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:245 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:253 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:395 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:140 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:192 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:199 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:209 +#, python-format +msgid "Error:" +msgstr "Fout:" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,message_ids:0 +msgid "Messages" +msgstr "Berichten" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,unique_mandate_reference:0 +msgid "Unique Mandate Reference" +msgstr "Unieke machtiging referentie" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +#: selection:sdd.mandate,state:0 +msgid "Cancelled" +msgstr "Geannuleerd" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:141 +#, python-format +msgid "" +"Payment Type Code '%s' is not supported. The only Payment Type Code " +"supported for SEPA Direct Debit are 'pain.008.001.02', 'pain.008.001.03' and " +"'pain.008.001.04'." +msgstr "" +"Betaal soort code '%s' wordt niet ondersteund. De enige betaalsoort code " +"ondersteund voor SEPA incasso's zijn 'pain.008.001.02', 'pain.008.001.03' en " +"'pain.008.001.04'." + +#. module: account_banking_sepa_direct_debit +#: help:sdd.mandate,message_unread:0 +msgid "If checked new messages require your attention." +msgstr "Indien aangevinkt zullen nieuwe berichten uw aandacht vragen." + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,file_id:0 +msgid "SDD File" +msgstr "SDD bestand" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.mandate_expired +msgid "SEPA Direct Debit Mandate has Expired" +msgstr "SEPA Direct incasso machtiging is verlopen" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:246 +#, python-format +msgid "" +"The recurrent mandate '%s' which is not marked as 'Migrated to SEPA' must " +"have its recurrent sequence type set to 'First'." +msgstr "" +"Bij de herhalende machtiging '%s' welke niet is gemarkeerd als 'gemigreerd " +"naar SEPA' dient de reeks soort te worden ingesteld op 'Eerste'." + +#. module: account_banking_sepa_direct_debit +#: help:banking.export.sdd,charge_bearer:0 +#: help:banking.export.sdd.wizard,charge_bearer:0 +msgid "" +"Following service level : transaction charges are to be applied following " +"the rules agreed in the service level and/or scheme (SEPA Core messages must " +"use this). Shared : transaction charges on the creditor side are to be borne " +"by the creditor, transaction charges on the debtor side are to be borne by " +"the debtor. Borne by creditor : all transaction charges are to be borne by " +"the creditor. Borne by debtor : all transaction charges are to be borne by " +"the debtor." +msgstr "" +"Volg service level: Transactie kosten worden toegepast volgens de " +"afgesproken regels in het service level en/of schema (Voor SEPA berichten " +"deze gebruiken). Gedeeld : De transactiekosten aan de crediteur zijde zijn " +"voor de schuldenaar, transactiekosten aan de debiteur kant zijn voor de " +"schuldeiser. Op rekening van de schuldenaar: Alle transactie kosten zijn " +"voor rekening van de schuldenaar. Op rekening van de schuldeiser: Alle " +"transactie kosten zijn voor rekening van de schuldeiser." + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +msgid "Reference" +msgstr "Referentie" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd:0 +msgid "SEPA Direct Debit" +msgstr "SEPA Incasso (Direct Debit)" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd.wizard:0 +msgid "SEPA Direct Debit XML file generation" +msgstr "SEPA Incasso XML bestand aanmaken" + +#. module: account_banking_sepa_direct_debit +#: help:sdd.mandate,message_summary:0 +msgid "" +"Holds the Chatter summary (number of messages, ...). This summary is " +"directly in html format in order to be inserted in kanban views." +msgstr "" +"Bevat de samenvatting van de chatter (aantal berichten,...). Deze " +"samenvatting is direct in html formaat om zo in de kanban weergave te worden " +"ingevoegd." + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_payment_line +msgid "Payment Line" +msgstr "Betaalregel" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,create_date:0 +msgid "Generation Date" +msgstr "Aangemaakt op" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:396 +#, python-format +msgid "" +"The payment line with reference '%s' has the bank account '%s' which is not " +"attached to the mandate '%s' (this mandate is attached to the bank account " +"'%s')." +msgstr "" +"De betaalregel met referentie '%s' heeft het bankrekeningnummer '%s' welke " +"niet is gekoppeld aan de machtiging '%s' (deze machtiging is gekoppeld aan " +"bankrekening '%s')." + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd.wizard,state:0 +msgid "Create" +msgstr "Aanmaken" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,nb_transactions:0 +#: field:banking.export.sdd.wizard,nb_transactions:0 +msgid "Number of Transactions" +msgstr "Aantal transacties" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +#: selection:sdd.mandate,type:0 +msgid "One-Off" +msgstr "Eenmalig" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,state:0 +#: field:banking.export.sdd.wizard,state:0 +msgid "State" +msgstr "Status" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:240 +#, python-format +msgid "The recurrent mandate '%s' must have a sequence type." +msgstr "De herhalende machtiging '%s' dient een reeks soort te hebben." + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,message_follower_ids:0 +msgid "Followers" +msgstr "Volgers" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,message_unread:0 +msgid "Unread Messages" +msgstr "Ongelezen berichten" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd:0 +#: field:banking.export.sdd,payment_order_ids:0 +#: field:banking.export.sdd.wizard,payment_order_ids:0 +msgid "Payment Orders" +msgstr "Betaalopdrachten" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +msgid "Type" +msgstr "Soort" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,state:0 +msgid "Sent" +msgstr "Verstuurd" + +#. module: account_banking_sepa_direct_debit +#: field:res.company,original_creditor_identifier:0 +msgid "Original Creditor Identifier" +msgstr "Originele Incassant-ID" + +#. module: account_banking_sepa_direct_debit +#: selection:sdd.mandate,recurrent_sequence_type:0 +msgid "Recurring" +msgstr "Terugkerend" + +#. module: account_banking_sepa_direct_debit +#: help:res.company,sepa_creditor_identifier:0 +msgid "" +"Enter the Creditor Identifier that has been attributed to your company to " +"make SEPA Direct Debits. This identifier is composed of :\n" +"- your country ISO code (2 letters)\n" +"- a 2-digits checkum\n" +"- a 3-letters business code\n" +"- a country-specific identifier" +msgstr "" +"Geef de Incassant-ID in, welke is toegewezen aan uw bedrijf om incasso's uit " +"te voeren. De Incassant-ID is samengesteld uit:\n" +"- uw ISO landcode (2 letters)\n" +"- een 2 cijferig controlegetal\n" +"- een 3 cijferig business code\n" +"- een landspecifieke identifier" + +#. module: account_banking_sepa_direct_debit +#: sql_constraint:sdd.mandate:0 +msgid "A Mandate with the same reference already exists for this company !" +msgstr "Een machtiging met dezelfde referentie bestaat al vooR dit bedrijf!" + +#. module: account_banking_sepa_direct_debit +#: help:sdd.mandate,state:0 +msgid "" +"Only valid mandates can be used in a payment line. A cancelled mandate is a " +"mandate that has been cancelled by the customer. A one-off mandate expires " +"after its first use. A recurrent mandate expires after it's final use or if " +"it hasn't been used for 36 months." +msgstr "" +"Alleen geldige machtigingen kunnen worden gebruikt op betaalregels. Een " +"geannuleerde machtiging is een machtiging welke is geannuleerd door de " +"klant. Een eenmalige machtiging verloopt na eenmalig gebruik. Een herhalende " +"machtiging verloopt na zijn laatste gebruik of als deze niet is gebruikt " +"voor 36 maanden." + +#. module: account_banking_sepa_direct_debit +#: help:sdd.mandate,recurrent_sequence_type:0 +msgid "" +"This field is only used for Recurrent mandates, not for One-Off mandates." +msgstr "" +"Dit veld wordt alleen gebruikt voor herhalende machtigingen, niet voor een " +"eenmalige machtiging." + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:213 +#, python-format +msgid "The date of signature of mandate '%s' is in the future !" +msgstr "" +"De datum van de handtekening van de machtiging '%s' is in de toekomst!" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +msgid "Signature Date" +msgstr "Handtekening datum" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,charge_bearer:0 +#: field:banking.export.sdd.wizard,charge_bearer:0 +msgid "Charge Bearer" +msgstr "Kostenverdeling" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,partner_id:0 +msgid "Partner" +msgstr "Relatie" + +#. module: account_banking_sepa_direct_debit +#: selection:sdd.mandate,recurrent_sequence_type:0 +msgid "First" +msgstr "Eerste" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,signature_date:0 +msgid "Date of Signature of the Mandate" +msgstr "Datum avn de handtekening van de machtiging" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.mandate_cancel +msgid "Mandate Cancelled" +msgstr "Machtiging geannuleerd" + +#. module: account_banking_sepa_direct_debit +#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.act_banking_export_sdd_payment_order +msgid "Generated SEPA Direct Debit Files" +msgstr "Genereerde SEPA incasso bestanden" + +#. module: account_banking_sepa_direct_debit +#: help:sdd.mandate,sepa_migrated:0 +msgid "" +"If this field is not active, the mandate section of the next direct debit " +"file that include this mandate will contain the 'Original Mandate " +"Identification' and the 'Original Creditor Scheme Identification'. This is " +"required in a few countries (Belgium for instance), but not in all " +"countries. If this is not required in your country, you should keep this " +"field always active." +msgstr "" +"Indien niet aangevinkt, zal het machtiging gedeelte van het volgende incasso " +"bestand, dat deze machtiging bevat, de 'Originele machtiging identificatie' " +"en de 'Origineel schuldeiser identificatie' bevatten. Dit is verplicht in " +"een aantal landen (zoals bijvoorbeeld België), maar niet in alle landen. " +"Indien dit niet verplicht is in uw land, dient u dit veld altijd aangevinkt " +"te houden." + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,company_id:0 +msgid "Company" +msgstr "Bedijf" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_banking_export_sdd_wizard +msgid "Export SEPA Direct Debit File" +msgstr "Exporteer SEPA incasso bestand" + +#. module: account_banking_sepa_direct_debit +#: help:banking.export.sdd,batch_booking:0 +#: help:banking.export.sdd.wizard,batch_booking:0 +msgid "" +"If true, the bank statement will display only one credit line for all the " +"direct debits of the SEPA file ; if false, the bank statement will display " +"one credit line per direct debit of the SEPA file." +msgstr "" +"Indien aangevinkt, zal het bankafschrift maar één credit regel weergeven " +"voor alle incasso's van het SEPA bestand. Indien niet aangevinkt wordt voor " +"iedere incasso een credit regel weergegeven op het bankafschrift." + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:225 +#, python-format +msgid "" +"Cannot validate the mandate '%s' because it is not attached to a bank " +"account." +msgstr "" +"Kan de machtiging '%s' niet bevestigen omdat deze niet is gekoppeld aan een " +"bankrekening." + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,state:0 +#: view:sdd.mandate:0 +#: selection:sdd.mandate,state:0 +msgid "Draft" +msgstr "Concept" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:290 +#, python-format +msgid "Mandate update" +msgstr "Machtiging bijwerken" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,charge_bearer:0 +#: selection:banking.export.sdd.wizard,charge_bearer:0 +msgid "Shared" +msgstr "Gedeeld" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,batch_booking:0 +#: field:banking.export.sdd.wizard,batch_booking:0 +msgid "Batch Booking" +msgstr "Bach verwerking" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,sepa_migrated:0 +msgid "Migrated to SEPA" +msgstr "Gemigreerd naar SEPa" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,state:0 +msgid "Status" +msgstr "Status" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,total_amount:0 +#: field:banking.export.sdd.wizard,total_amount:0 +msgid "Total Amount" +msgstr "Totaalbedrag" + +#. module: account_banking_sepa_direct_debit +#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.action_account_banking_sdd +#: model:ir.ui.menu,name:account_banking_sepa_direct_debit.menu_account_banking_sdd +msgid "SEPA Direct Debit Files" +msgstr "SEPA incasso bestanden" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,charge_bearer:0 +#: selection:banking.export.sdd.wizard,charge_bearer:0 +msgid "Following Service Level" +msgstr "Volg service level" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:233 +#, python-format +msgid "" +"The mandate '%s' can't have a date of last debit before the date of " +"signature." +msgstr "" +"De machtiging '%s' kan geen datum van laatste incasso hebben die eerder is " +"dan de datum van ondertekening." + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_final +#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.recurrent_sequence_type_final +msgid "Sequence Type set to Final" +msgstr "Reeks soort ingesteld op definitief" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,message_is_follower:0 +msgid "Is a Follower" +msgstr "Is een volger" + +#. module: account_banking_sepa_direct_debit +#: help:sdd.mandate,original_mandate_identification:0 +msgid "" +"When the field 'Migrated to SEPA' is not active, this field will be used as " +"the Original Mandate Identification in the Direct Debit file." +msgstr "" +"Wanneer het veld 'gemigreerd naar SEPA' niet actief is, zal dit veld worden " +"gebruikt als de originele machtiging identificatie in het incasso bestand." + +#. module: account_banking_sepa_direct_debit +#: view:payment.order:0 +msgid "SDD Mandate" +msgstr "SDD machtiging" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,original_mandate_identification:0 +msgid "Original Mandate Identification" +msgstr "Originele machtiging indificatie" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_res_company +msgid "Companies" +msgstr "Bedrijven" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,message_summary:0 +msgid "Summary" +msgstr "Samenvatting" + +#. module: account_banking_sepa_direct_debit +#: model:res.groups,name:account_banking_sepa_direct_debit.group_original_mandate_required +msgid "Original Mandate Required (SEPA)" +msgstr "Originele machtiging benodigd (SEPA)" + +#. module: account_banking_sepa_direct_debit +#: field:account.invoice,sdd_mandate_id:0 +#: model:ir.model,name:account_banking_sepa_direct_debit.model_sdd_mandate +#: field:payment.line,sdd_mandate_id:0 +#: view:sdd.mandate:0 +msgid "SEPA Direct Debit Mandate" +msgstr "SEPA incasso machtiging" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:193 +#, python-format +msgid "" +"Missing SEPA Direct Debit mandate on the payment line with partner '%s' and " +"Invoice ref '%s'." +msgstr "" +"Ontbrekende SEPA incasso machtiging op de betaalregel met relatie '%s' en " +"factuur referentie '%s'." + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:210 +#, python-format +msgid "" +"The mandate with reference '%s' for partner '%s' has type set to 'One-Off' " +"and it has a last debit date set to '%s', so we can't use it." +msgstr "" +"De machtiging referentie '%s' voor relatie %s' is ingesteld op 'eenmalig' en " +"de laatste incasso datum is ingesteld op '%s'. Zodoende kunnen we deze niet " +"gebruiken." + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,scan:0 +msgid "Scan of the Mandate" +msgstr "Scan van de machteging" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,last_debit_date:0 +msgid "Date of the Last Debit" +msgstr "Datum van laatste incasso" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.mandate_expired +msgid "Mandate Expired" +msgstr "Machtiging verlopen" + +#. module: account_banking_sepa_direct_debit +#: constraint:res.company:0 +msgid "Invalid SEPA Creditor Identifier." +msgstr "Ongeldige SEPA Incassant-ID." + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_res_partner_bank +msgid "Bank Accounts" +msgstr "Bankrekeningen" + +#. module: account_banking_sepa_direct_debit +#: model:ir.actions.act_window,help:account_banking_sepa_direct_debit.sdd_mandate_action +msgid "" +"

\n" +" Click to create a new SEPA Direct Debit Mandate.\n" +"

\n" +" A SEPA Direct Debit Mandate is a document signed by your customer " +"that gives you the autorization to do one or several direct debits on his " +"bank account.\n" +"

\n" +" " +msgstr "" +"

\n" +" Klik voor het maken van een nieuwe SEPA incasso machtiging.\n" +"

\n" +" Een SEPA incasso machtiging is een document ondertekend door uw " +"klant, welke u toestemming geeft om incasso's uit te voeren op zijn " +"bankrekening.\n" +"

\n" +" " + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd:0 +msgid "General Information" +msgstr "Algemene informatie" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +#: selection:sdd.mandate,state:0 +msgid "Valid" +msgstr "Geldig" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_account_invoice +msgid "Invoice" +msgstr "Factuur" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd.wizard:0 +#: view:sdd.mandate:0 +msgid "Cancel" +msgstr "Annuleer" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +#: field:sdd.mandate,payment_line_ids:0 +msgid "Related Payment Lines" +msgstr "Gerelateerde betaalregels" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +#: selection:sdd.mandate,type:0 +msgid "Recurrent" +msgstr "Terugkerend" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,type:0 +msgid "Type of Mandate" +msgstr "Soort machtiging" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.mandate_valid +msgid "Mandate Validated" +msgstr "Machtiging bevestigd" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,file:0 +msgid "SEPA File" +msgstr "SEPA bestand" + +#. module: account_banking_sepa_direct_debit +#: field:res.company,sepa_creditor_identifier:0 +msgid "SEPA Creditor Identifier" +msgstr "SEPA Incassant-ID" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_banking_export_sdd +msgid "SEPA Direct Debit export" +msgstr "SEPA incasso export" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +#: selection:sdd.mandate,state:0 +msgid "Expired" +msgstr "Verlopen" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,partner_bank_id:0 +msgid "Bank Account" +msgstr "Bankrekening" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:254 +#, python-format +msgid "" +"You must set the 'Original Mandate Identification' on the recurrent mandate " +"'%s' which is not marked as 'Migrated to SEPA'." +msgstr "" +"U dient de 'Originele machtiging identificatie' in te stellen op de " +"herhalende machtiging '%s' welke niet is gemarkeerd als 'Gemigreerd naar " +"SEPA'" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_first +#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.recurrent_sequence_type_first +msgid "Sequence Type set to First" +msgstr "Reeks ingesteld op eerste" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:291 +#, python-format +msgid "" +"As you changed the bank account attached to this mandate, the 'Sequence " +"Type' has been set back to 'First'." +msgstr "" +"Omdat u de gekoppelde bankrekening heeft gewijzigd is de reeks terug gezet " +"naar 'Eerste'." + +#. module: account_banking_sepa_direct_debit +#: help:sdd.mandate,message_ids:0 +msgid "Messages and communication history" +msgstr "Berichten en communicatie historie" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +msgid "Search SEPA Direct Debit Mandates" +msgstr "Zoek SEPA incasso machtigingen" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,file:0 +msgid "File" +msgstr "Bestand" From 7adc9eaf8c51d95e67e0d71e145a79b26ec808b5 Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Thu, 12 Jun 2014 00:03:21 +0200 Subject: [PATCH 029/118] Add back2draft on SEPA Direct Debit mandates (in case it was cancelled by mistake). --- .../account_banking_sdd.py | 10 ++++++++++ account_banking_sepa_direct_debit/sdd_mandate_view.xml | 5 ++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/account_banking_sepa_direct_debit/account_banking_sdd.py b/account_banking_sepa_direct_debit/account_banking_sdd.py index cbf0d0d10..0abd54cdb 100644 --- a/account_banking_sepa_direct_debit/account_banking_sdd.py +++ b/account_banking_sepa_direct_debit/account_banking_sdd.py @@ -314,6 +314,16 @@ class sdd_mandate(orm.Model): cr, uid, to_cancel_ids, {'state': 'cancel'}, context=context) return True + def back2draft(self, cr, uid, ids, context=None): + to_draft_ids = [] + for mandate in self.browse(cr, uid, ids, context=context): + assert mandate.state == 'cancel',\ + 'Mandate should be in cancel state' + to_draft_ids.append(mandate.id) + self.write( + cr, uid, to_draft_ids, {'state': 'draft'}, context=context) + return True + def _sdd_mandate_set_state_to_expired(self, cr, uid, context=None): logger.info('Searching for SDD Mandates that must be set to Expired') expire_limit_date = datetime.today() + \ diff --git a/account_banking_sepa_direct_debit/sdd_mandate_view.xml b/account_banking_sepa_direct_debit/sdd_mandate_view.xml index 409919dc5..bd1dd6e79 100644 --- a/account_banking_sepa_direct_debit/sdd_mandate_view.xml +++ b/account_banking_sepa_direct_debit/sdd_mandate_view.xml @@ -13,8 +13,11 @@
-
From 13d13312a543f7dbb182a241cef0cf4ed2203947 Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Thu, 12 Jun 2014 18:05:52 +0200 Subject: [PATCH 030/118] ir.sequence : Replace deprecated get() by next_by_code() Avoid double increment of sequence when creating an SDD mandate. --- .../account_banking_sdd.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/account_banking_sepa_direct_debit/account_banking_sdd.py b/account_banking_sepa_direct_debit/account_banking_sdd.py index 0abd54cdb..87e50111b 100644 --- a/account_banking_sepa_direct_debit/account_banking_sdd.py +++ b/account_banking_sepa_direct_debit/account_banking_sdd.py @@ -191,8 +191,7 @@ class sdd_mandate(orm.Model): 'company_id': lambda self, cr, uid, context: self.pool['res.company']._company_default_get( cr, uid, 'sdd.mandate', context=context), - 'unique_mandate_reference': lambda self, cr, uid, ctx: - self.pool['ir.sequence'].get(cr, uid, 'sdd.mandate.reference'), + 'unique_mandate_reference': '/', 'state': 'draft', 'sepa_migrated': True, } @@ -203,6 +202,13 @@ class sdd_mandate(orm.Model): 'A Mandate with the same reference already exists for this company !' )] + def create(self, cr, uid, vals, context=None): + if vals.get('unique_mandate_reference', '/') == '/': + vals['unique_mandate_reference'] = \ + self.pool['ir.sequence'].next_by_code( + cr, uid, 'sdd.mandate.reference', context=context) + return super(sdd_mandate, self).create(cr, uid, vals, context=context) + def _check_sdd_mandate(self, cr, uid, ids): for mandate in self.browse(cr, uid, ids): if (mandate.signature_date and From 97db07c3962c270621c30ef8a9dff808ea93061e Mon Sep 17 00:00:00 2001 From: Sandy Carter Date: Thu, 21 Aug 2014 12:39:12 -0400 Subject: [PATCH 031/118] PEP8 on account_banking_sepa_direct_debit --- .../__openerp__.py | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/account_banking_sepa_direct_debit/__openerp__.py b/account_banking_sepa_direct_debit/__openerp__.py index 611127a84..5ea5dadb4 100644 --- a/account_banking_sepa_direct_debit/__openerp__.py +++ b/account_banking_sepa_direct_debit/__openerp__.py @@ -30,7 +30,7 @@ 'depends': ['account_direct_debit', 'account_banking_pain_base'], 'external_dependencies': { 'python': ['unidecode', 'lxml'], - }, + }, 'data': [ 'security/original_mandate_required_security.xml', 'account_banking_sdd_view.xml', @@ -49,13 +49,23 @@ 'description': ''' Module to export direct debit payment orders in SEPA XML file format. -SEPA PAIN (PAyment INitiation) is the new european standard for Customer-to-Bank payment instructions. This module implements SEPA Direct Debit (SDD), more specifically PAIN versions 008.001.02, 008.001.03 and 008.001.04. It is part of the ISO 20022 standard, available on http://www.iso20022.org. +SEPA PAIN (PAyment INitiation) is the new european standard for +Customer-to-Bank payment instructions. -The Implementation Guidelines for SEPA Direct Debit published by the European Payments Council (http://http://www.europeanpaymentscouncil.eu) use PAIN version 008.001.02. So if you don't know which version your bank supports, you should try version 008.001.02 first. +This module implements SEPA Direct Debit (SDD), more specifically PAIN +versions 008.001.02, 008.001.03 and 008.001.04. +It is part of the ISO 20022 standard, available on http://www.iso20022.org. -This module uses the framework provided by the banking addons, cf https://launchpad.net/banking-addons +The Implementation Guidelines for SEPA Direct Debit published by the European +Payments Council (http://http://www.europeanpaymentscouncil.eu) use PAIN +version 008.001.02. So if you don't know which version your bank supports, +you should try version 008.001.02 first. -Please contact Alexis de Lattre from Akretion for any help or question about this module. +This module uses the framework provided by the banking addons, +cf https://www.github.com/OCA/banking-addons + +Please contact Alexis de Lattre from Akretion +for any help or question about this module. ''', 'active': False, 'installable': True, From 02acf290e855c34c7f8b4e7da13b20d1ed6f9556 Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Wed, 10 Sep 2014 12:19:20 +0200 Subject: [PATCH 032/118] Initial adjustments for 8.0 repository --- account_banking_sepa_direct_debit/__init__.py | 25 - .../__openerp__.py | 72 -- .../account_banking_sdd.py | 440 --------- .../account_banking_sdd_view.xml | 77 -- .../account_invoice_view.xml | 22 - .../account_payment_view.xml | 26 - account_banking_sepa_direct_debit/company.py | 90 -- .../company_view.xml | 23 - .../data/mandate_reference_sequence.xml | 21 - .../data/pain.008.001.02.xsd | 879 ----------------- .../data/pain.008.001.03.xsd | 925 ------------------ .../data/pain.008.001.04.xsd | 892 ----------------- .../data/payment_type_sdd.xml | 35 - .../account_banking_sepa_direct_debit.pot | 633 ------------ account_banking_sepa_direct_debit/i18n/fr.po | 749 -------------- account_banking_sepa_direct_debit/i18n/nl.po | 754 -------------- .../mandate_expire_cron.xml | 26 - .../res_partner_bank_view.xml | 48 - .../sdd_mandate_view.xml | 152 --- .../security/ir.model.access.csv | 4 - .../original_mandate_required_security.xml | 17 - .../sepa_direct_debit_demo.xml | 27 - .../static/src/img/icon.png | Bin 6892 -> 0 bytes .../wizard/__init__.py | 23 - .../wizard/export_sdd.py | 451 --------- .../wizard/export_sdd_view.xml | 37 - 26 files changed, 6448 deletions(-) delete mode 100644 account_banking_sepa_direct_debit/__init__.py delete mode 100644 account_banking_sepa_direct_debit/__openerp__.py delete mode 100644 account_banking_sepa_direct_debit/account_banking_sdd.py delete mode 100644 account_banking_sepa_direct_debit/account_banking_sdd_view.xml delete mode 100644 account_banking_sepa_direct_debit/account_invoice_view.xml delete mode 100644 account_banking_sepa_direct_debit/account_payment_view.xml delete mode 100644 account_banking_sepa_direct_debit/company.py delete mode 100644 account_banking_sepa_direct_debit/company_view.xml delete mode 100644 account_banking_sepa_direct_debit/data/mandate_reference_sequence.xml delete mode 100644 account_banking_sepa_direct_debit/data/pain.008.001.02.xsd delete mode 100644 account_banking_sepa_direct_debit/data/pain.008.001.03.xsd delete mode 100644 account_banking_sepa_direct_debit/data/pain.008.001.04.xsd delete mode 100644 account_banking_sepa_direct_debit/data/payment_type_sdd.xml delete mode 100644 account_banking_sepa_direct_debit/i18n/account_banking_sepa_direct_debit.pot delete mode 100644 account_banking_sepa_direct_debit/i18n/fr.po delete mode 100644 account_banking_sepa_direct_debit/i18n/nl.po delete mode 100644 account_banking_sepa_direct_debit/mandate_expire_cron.xml delete mode 100644 account_banking_sepa_direct_debit/res_partner_bank_view.xml delete mode 100644 account_banking_sepa_direct_debit/sdd_mandate_view.xml delete mode 100644 account_banking_sepa_direct_debit/security/ir.model.access.csv delete mode 100644 account_banking_sepa_direct_debit/security/original_mandate_required_security.xml delete mode 100644 account_banking_sepa_direct_debit/sepa_direct_debit_demo.xml delete mode 100644 account_banking_sepa_direct_debit/static/src/img/icon.png delete mode 100644 account_banking_sepa_direct_debit/wizard/__init__.py delete mode 100644 account_banking_sepa_direct_debit/wizard/export_sdd.py delete mode 100644 account_banking_sepa_direct_debit/wizard/export_sdd_view.xml diff --git a/account_banking_sepa_direct_debit/__init__.py b/account_banking_sepa_direct_debit/__init__.py deleted file mode 100644 index f852fb7bd..000000000 --- a/account_banking_sepa_direct_debit/__init__.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- encoding: utf-8 -*- -############################################################################## -# -# SEPA Direct Debit module for OpenERP -# Copyright (C) 2013 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 . -# -############################################################################## - -from . import company -from . import wizard -from . import account_banking_sdd diff --git a/account_banking_sepa_direct_debit/__openerp__.py b/account_banking_sepa_direct_debit/__openerp__.py deleted file mode 100644 index 5ea5dadb4..000000000 --- a/account_banking_sepa_direct_debit/__openerp__.py +++ /dev/null @@ -1,72 +0,0 @@ -# -*- encoding: utf-8 -*- -############################################################################## -# -# SEPA Direct Debit module for OpenERP -# Copyright (C) 2013 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 . -# -############################################################################## -{ - 'name': 'Account Banking SEPA Direct Debit', - 'summary': 'Create SEPA files for Direct Debit', - 'version': '0.1', - 'license': 'AGPL-3', - 'author': 'Akretion', - 'website': 'http://www.akretion.com', - 'category': 'Banking addons', - 'depends': ['account_direct_debit', 'account_banking_pain_base'], - 'external_dependencies': { - 'python': ['unidecode', 'lxml'], - }, - 'data': [ - 'security/original_mandate_required_security.xml', - 'account_banking_sdd_view.xml', - 'sdd_mandate_view.xml', - 'res_partner_bank_view.xml', - 'account_payment_view.xml', - 'company_view.xml', - 'mandate_expire_cron.xml', - 'account_invoice_view.xml', - 'wizard/export_sdd_view.xml', - 'data/payment_type_sdd.xml', - 'data/mandate_reference_sequence.xml', - 'security/ir.model.access.csv', - ], - 'demo': ['sepa_direct_debit_demo.xml'], - 'description': ''' -Module to export direct debit payment orders in SEPA XML file format. - -SEPA PAIN (PAyment INitiation) is the new european standard for -Customer-to-Bank payment instructions. - -This module implements SEPA Direct Debit (SDD), more specifically PAIN -versions 008.001.02, 008.001.03 and 008.001.04. -It is part of the ISO 20022 standard, available on http://www.iso20022.org. - -The Implementation Guidelines for SEPA Direct Debit published by the European -Payments Council (http://http://www.europeanpaymentscouncil.eu) use PAIN -version 008.001.02. So if you don't know which version your bank supports, -you should try version 008.001.02 first. - -This module uses the framework provided by the banking addons, -cf https://www.github.com/OCA/banking-addons - -Please contact Alexis de Lattre from Akretion -for any help or question about this module. - ''', - 'active': False, - 'installable': True, -} diff --git a/account_banking_sepa_direct_debit/account_banking_sdd.py b/account_banking_sepa_direct_debit/account_banking_sdd.py deleted file mode 100644 index 87e50111b..000000000 --- a/account_banking_sepa_direct_debit/account_banking_sdd.py +++ /dev/null @@ -1,440 +0,0 @@ -# -*- encoding: utf-8 -*- -############################################################################## -# -# SEPA Direct Debit module for OpenERP -# Copyright (C) 2013 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 . -# -############################################################################## - -from openerp.osv import orm, fields -from openerp.tools.translate import _ -from openerp.addons.decimal_precision import decimal_precision as dp -from unidecode import unidecode -from datetime import datetime -from dateutil.relativedelta import relativedelta -import logging - -NUMBER_OF_UNUSED_MONTHS_BEFORE_EXPIRY = 36 - -logger = logging.getLogger(__name__) - - -class banking_export_sdd(orm.Model): - '''SEPA Direct Debit export''' - _name = 'banking.export.sdd' - _description = __doc__ - _rec_name = 'filename' - - def _generate_filename(self, cr, uid, ids, name, arg, context=None): - res = {} - for sepa_file in self.browse(cr, uid, ids, context=context): - ref = sepa_file.payment_order_ids[0].reference - if ref: - label = unidecode(ref.replace('/', '-')) - else: - label = 'error' - res[sepa_file.id] = 'sdd_%s.xml' % label - return res - - _columns = { - 'payment_order_ids': fields.many2many( - 'payment.order', - 'account_payment_order_sdd_rel', - 'banking_export_sepa_id', 'account_order_id', - 'Payment Orders', - readonly=True), - 'nb_transactions': fields.integer( - 'Number of Transactions', readonly=True), - 'total_amount': fields.float( - 'Total Amount', digits_compute=dp.get_precision('Account'), - readonly=True), - 'batch_booking': fields.boolean( - 'Batch Booking', readonly=True, - help="If true, the bank statement will display only one credit " - "line for all the direct debits of the SEPA file ; if false, " - "the bank statement will display one credit line per direct " - "debit of the SEPA file."), - 'charge_bearer': fields.selection([ - ('SLEV', 'Following Service Level'), - ('SHAR', 'Shared'), - ('CRED', 'Borne by Creditor'), - ('DEBT', 'Borne by Debtor'), - ], 'Charge Bearer', readonly=True, - help="Following service level : transaction charges are to be " - "applied following the rules agreed in the service level and/or " - "scheme (SEPA Core messages must use this). Shared : " - "transaction charges on the creditor side are to be borne by " - "the creditor, transaction charges on the debtor side are to be " - "borne by the debtor. Borne by creditor : all transaction " - "charges are to be borne by the creditor. Borne by debtor : " - "all transaction charges are to be borne by the debtor."), - 'create_date': fields.datetime('Generation Date', readonly=True), - 'file': fields.binary('SEPA File', readonly=True), - 'filename': fields.function( - _generate_filename, type='char', size=256, - string='Filename', readonly=True, store=True), - 'state': fields.selection([ - ('draft', 'Draft'), - ('sent', 'Sent'), - ], 'State', readonly=True), - } - - _defaults = { - 'state': 'draft', - } - - -class sdd_mandate(orm.Model): - '''SEPA Direct Debit Mandate''' - _name = 'sdd.mandate' - _description = __doc__ - _rec_name = 'unique_mandate_reference' - _inherit = ['mail.thread'] - _order = 'signature_date desc' - _track = { - 'state': { - 'account_banking_sepa_direct_debit.mandate_valid': - lambda self, cr, uid, obj, ctx=None: - obj['state'] == 'valid', - 'account_banking_sepa_direct_debit.mandate_expired': - lambda self, cr, uid, obj, ctx=None: - obj['state'] == 'expired', - 'account_banking_sepa_direct_debit.mandate_cancel': - lambda self, cr, uid, obj, ctx=None: - obj['state'] == 'cancel', - }, - 'recurrent_sequence_type': { - 'account_banking_sepa_direct_debit.recurrent_sequence_type_first': - lambda self, cr, uid, obj, ctx=None: - obj['recurrent_sequence_type'] == 'first', - 'account_banking_sepa_direct_debit.' - 'recurrent_sequence_type_recurring': - lambda self, cr, uid, obj, ctx=None: - obj['recurrent_sequence_type'] == 'recurring', - 'account_banking_sepa_direct_debit.recurrent_sequence_type_final': - lambda self, cr, uid, obj, ctx=None: - obj['recurrent_sequence_type'] == 'final', - } - } - - _columns = { - 'partner_bank_id': fields.many2one( - 'res.partner.bank', 'Bank Account', track_visibility='onchange'), - 'partner_id': fields.related( - 'partner_bank_id', 'partner_id', type='many2one', - relation='res.partner', string='Partner', readonly=True), - 'company_id': fields.many2one('res.company', 'Company', required=True), - 'unique_mandate_reference': fields.char( - 'Unique Mandate Reference', size=35, readonly=True, - track_visibility='always'), - 'type': fields.selection([ - ('recurrent', 'Recurrent'), - ('oneoff', 'One-Off'), - ], 'Type of Mandate', required=True, track_visibility='always'), - 'recurrent_sequence_type': fields.selection([ - ('first', 'First'), - ('recurring', 'Recurring'), - ('final', 'Final'), - ], 'Sequence Type for Next Debit', track_visibility='onchange', - help="This field is only used for Recurrent mandates, not for " - "One-Off mandates."), - 'signature_date': fields.date( - 'Date of Signature of the Mandate', track_visibility='onchange'), - 'scan': fields.binary('Scan of the Mandate'), - 'last_debit_date': fields.date( - 'Date of the Last Debit', readonly=True), - 'state': fields.selection([ - ('draft', 'Draft'), - ('valid', 'Valid'), - ('expired', 'Expired'), - ('cancel', 'Cancelled'), - ], 'Status', - help="Only valid mandates can be used in a payment line. A " - "cancelled mandate is a mandate that has been cancelled by " - "the customer. A one-off mandate expires after its first use. " - "A recurrent mandate expires after it's final use or if it " - "hasn't been used for 36 months."), - 'payment_line_ids': fields.one2many( - 'payment.line', 'sdd_mandate_id', "Related Payment Lines"), - 'sepa_migrated': fields.boolean( - 'Migrated to SEPA', track_visibility='onchange', - help="If this field is not active, the mandate section of the " - "next direct debit file that include this mandate will contain " - "the 'Original Mandate Identification' and the 'Original " - "Creditor Scheme Identification'. This is required in a few " - "countries (Belgium for instance), but not in all countries. " - "If this is not required in your country, you should keep this " - "field always active."), - 'original_mandate_identification': fields.char( - 'Original Mandate Identification', size=35, - track_visibility='onchange', - help="When the field 'Migrated to SEPA' is not active, this " - "field will be used as the Original Mandate Identification in " - "the Direct Debit file."), - } - - _defaults = { - 'company_id': lambda self, cr, uid, context: - self.pool['res.company']._company_default_get( - cr, uid, 'sdd.mandate', context=context), - 'unique_mandate_reference': '/', - 'state': 'draft', - 'sepa_migrated': True, - } - - _sql_constraints = [( - 'mandate_ref_company_uniq', - 'unique(unique_mandate_reference, company_id)', - 'A Mandate with the same reference already exists for this company !' - )] - - def create(self, cr, uid, vals, context=None): - if vals.get('unique_mandate_reference', '/') == '/': - vals['unique_mandate_reference'] = \ - self.pool['ir.sequence'].next_by_code( - cr, uid, 'sdd.mandate.reference', context=context) - return super(sdd_mandate, self).create(cr, uid, vals, context=context) - - def _check_sdd_mandate(self, cr, uid, ids): - for mandate in self.browse(cr, uid, ids): - if (mandate.signature_date and - mandate.signature_date > - datetime.today().strftime('%Y-%m-%d')): - raise orm.except_orm( - _('Error:'), - _("The date of signature of mandate '%s' is in the " - "future !") - % mandate.unique_mandate_reference) - if mandate.state == 'valid' and not mandate.signature_date: - raise orm.except_orm( - _('Error:'), - _("Cannot validate the mandate '%s' without a date of " - "signature.") - % mandate.unique_mandate_reference) - if mandate.state == 'valid' and not mandate.partner_bank_id: - raise orm.except_orm( - _('Error:'), - _("Cannot validate the mandate '%s' because it is not " - "attached to a bank account.") - % mandate.unique_mandate_reference) - - if (mandate.signature_date and mandate.last_debit_date and - mandate.signature_date > mandate.last_debit_date): - raise orm.except_orm( - _('Error:'), - _("The mandate '%s' can't have a date of last debit " - "before the date of signature.") - % mandate.unique_mandate_reference) - if (mandate.type == 'recurrent' - and not mandate.recurrent_sequence_type): - raise orm.except_orm( - _('Error:'), - _("The recurrent mandate '%s' must have a sequence type.") - % mandate.unique_mandate_reference) - if (mandate.type == 'recurrent' and not mandate.sepa_migrated - and mandate.recurrent_sequence_type != 'first'): - raise orm.except_orm( - _('Error:'), - _("The recurrent mandate '%s' which is not marked as " - "'Migrated to SEPA' must have its recurrent sequence " - "type set to 'First'.") - % mandate.unique_mandate_reference) - if (mandate.type == 'recurrent' and not mandate.sepa_migrated - and not mandate.original_mandate_identification): - raise orm.except_orm( - _('Error:'), - _("You must set the 'Original Mandate Identification' " - "on the recurrent mandate '%s' which is not marked " - "as 'Migrated to SEPA'.") - % mandate.unique_mandate_reference) - return True - - _constraints = [ - (_check_sdd_mandate, "Error msg in raise", [ - 'last_debit_date', 'signature_date', 'state', 'partner_bank_id', - 'type', 'recurrent_sequence_type', 'sepa_migrated', - 'original_mandate_identification', - ]), - ] - - def mandate_type_change(self, cr, uid, ids, type): - if type == 'recurrent': - recurrent_sequence_type = 'first' - else: - recurrent_sequence_type = False - res = {'value': {'recurrent_sequence_type': recurrent_sequence_type}} - return res - - def mandate_partner_bank_change( - self, cr, uid, ids, partner_bank_id, type, recurrent_sequence_type, - last_debit_date, state): - res = {'value': {}} - if partner_bank_id: - partner_bank_read = self.pool['res.partner.bank'].read( - cr, uid, partner_bank_id, ['partner_id'])['partner_id'] - if partner_bank_read: - res['value']['partner_id'] = partner_bank_read[0] - if (state == 'valid' and partner_bank_id - and type == 'recurrent' - and recurrent_sequence_type != 'first'): - res['value']['recurrent_sequence_type'] = 'first' - res['warning'] = { - 'title': _('Mandate update'), - 'message': _( - "As you changed the bank account attached to this " - "mandate, the 'Sequence Type' has been set back to " - "'First'."), - } - return res - - def validate(self, cr, uid, ids, context=None): - to_validate_ids = [] - for mandate in self.browse(cr, uid, ids, context=context): - assert mandate.state == 'draft', 'Mandate should be in draft state' - to_validate_ids.append(mandate.id) - self.write( - cr, uid, to_validate_ids, {'state': 'valid'}, context=context) - return True - - def cancel(self, cr, uid, ids, context=None): - to_cancel_ids = [] - for mandate in self.browse(cr, uid, ids, context=context): - assert mandate.state in ('draft', 'valid'),\ - 'Mandate should be in draft or valid state' - to_cancel_ids.append(mandate.id) - self.write( - cr, uid, to_cancel_ids, {'state': 'cancel'}, context=context) - return True - - def back2draft(self, cr, uid, ids, context=None): - to_draft_ids = [] - for mandate in self.browse(cr, uid, ids, context=context): - assert mandate.state == 'cancel',\ - 'Mandate should be in cancel state' - to_draft_ids.append(mandate.id) - self.write( - cr, uid, to_draft_ids, {'state': 'draft'}, context=context) - return True - - def _sdd_mandate_set_state_to_expired(self, cr, uid, context=None): - logger.info('Searching for SDD Mandates that must be set to Expired') - expire_limit_date = datetime.today() + \ - relativedelta(months=-NUMBER_OF_UNUSED_MONTHS_BEFORE_EXPIRY) - expire_limit_date_str = expire_limit_date.strftime('%Y-%m-%d') - expired_mandate_ids = self.search(cr, uid, [ - '|', - ('last_debit_date', '=', False), - ('last_debit_date', '<=', expire_limit_date_str), - ('state', '=', 'valid'), - ('signature_date', '<=', expire_limit_date_str), - ], context=context) - if expired_mandate_ids: - self.write( - cr, uid, expired_mandate_ids, {'state': 'expired'}, - context=context) - logger.info( - 'The following SDD Mandate IDs has been set to expired: %s' - % expired_mandate_ids) - else: - logger.info('0 SDD Mandates must be set to Expired') - return True - - -class res_partner_bank(orm.Model): - _inherit = 'res.partner.bank' - - _columns = { - 'sdd_mandate_ids': fields.one2many( - 'sdd.mandate', 'partner_bank_id', 'SEPA Direct Debit Mandates'), - } - - -class payment_line(orm.Model): - _inherit = 'payment.line' - - _columns = { - 'sdd_mandate_id': fields.many2one( - 'sdd.mandate', 'SEPA Direct Debit Mandate', - domain=[('state', '=', 'valid')]), - } - - def create(self, cr, uid, vals, context=None): - '''If the customer invoice has a mandate, take it - otherwise, take the first valid mandate of the bank account''' - if context is None: - context = {} - if not vals: - vals = {} - partner_bank_id = vals.get('bank_id') - move_line_id = vals.get('move_line_id') - if (context.get('default_payment_order_type') == 'debit' - and 'sdd_mandate_id' not in vals): - if move_line_id: - line = self.pool['account.move.line'].browse( - cr, uid, move_line_id, context=context) - if (line.invoice and line.invoice.type == 'out_invoice' - and line.invoice.sdd_mandate_id): - vals.update({ - 'sdd_mandate_id': line.invoice.sdd_mandate_id.id, - 'bank_id': - line.invoice.sdd_mandate_id.partner_bank_id.id, - }) - if partner_bank_id and 'sdd_mandate_id' not in vals: - mandate_ids = self.pool['sdd.mandate'].search(cr, uid, [ - ('partner_bank_id', '=', partner_bank_id), - ('state', '=', 'valid'), - ], context=context) - if mandate_ids: - vals['sdd_mandate_id'] = mandate_ids[0] - return super(payment_line, self).create(cr, uid, vals, context=context) - - def _check_mandate_bank_link(self, cr, uid, ids): - for payline in self.browse(cr, uid, ids): - if (payline.sdd_mandate_id and payline.bank_id - and payline.sdd_mandate_id.partner_bank_id.id != - payline.bank_id.id): - raise orm.except_orm( - _('Error:'), - _("The payment line with reference '%s' has the bank " - "account '%s' which is not attached to the mandate " - "'%s' (this mandate is attached to the bank account " - "'%s').") % ( - payline.name, - self.pool['res.partner.bank'].name_get( - cr, uid, [payline.bank_id.id])[0][1], - payline.sdd_mandate_id.unique_mandate_reference, - self.pool['res.partner.bank'].name_get( - cr, uid, - [payline.sdd_mandate_id.partner_bank_id.id])[0][1], - )) - return True - - _constraints = [ - (_check_mandate_bank_link, 'Error msg in raise', - ['sdd_mandate_id', 'bank_id']), - ] - - -class account_invoice(orm.Model): - _inherit = 'account.invoice' - - _columns = { - 'sdd_mandate_id': fields.many2one( - 'sdd.mandate', 'SEPA Direct Debit Mandate', - domain=[('state', '=', 'valid')], readonly=True, - states={'draft': [('readonly', False)]}) - } diff --git a/account_banking_sepa_direct_debit/account_banking_sdd_view.xml b/account_banking_sepa_direct_debit/account_banking_sdd_view.xml deleted file mode 100644 index f74b60353..000000000 --- a/account_banking_sepa_direct_debit/account_banking_sdd_view.xml +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - account.banking.export.sdd.form - banking.export.sdd - - -
- -
- - - - - - - - - - - - - - - - - -
-
- - - - account.banking.export.sdd.tree - banking.export.sdd - - - - - - - - - - - - - SEPA Direct Debit Files - banking.export.sdd - form - tree,form - - - - - - - -
-
diff --git a/account_banking_sepa_direct_debit/account_invoice_view.xml b/account_banking_sepa_direct_debit/account_invoice_view.xml deleted file mode 100644 index 2ca480e54..000000000 --- a/account_banking_sepa_direct_debit/account_invoice_view.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - add.sdd.mandate.on.customer.invoice.form - account.invoice - - - - - - - - - - diff --git a/account_banking_sepa_direct_debit/account_payment_view.xml b/account_banking_sepa_direct_debit/account_payment_view.xml deleted file mode 100644 index 74098c44e..000000000 --- a/account_banking_sepa_direct_debit/account_payment_view.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - sdd.payment.order.form - payment.order - - - - - - - - - - - - - - diff --git a/account_banking_sepa_direct_debit/company.py b/account_banking_sepa_direct_debit/company.py deleted file mode 100644 index 6d54ba8e6..000000000 --- a/account_banking_sepa_direct_debit/company.py +++ /dev/null @@ -1,90 +0,0 @@ -# -*- encoding: utf-8 -*- -############################################################################## -# -# SEPA Direct Debit module for OpenERP -# Copyright (C) 2013 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 . -# -############################################################################## - -from openerp.osv import orm, fields -import logging - -logger = logging.getLogger(__name__) - - -class res_company(orm.Model): - _inherit = 'res.company' - - _columns = { - 'sepa_creditor_identifier': fields.char( - 'SEPA Creditor Identifier', size=35, - help="Enter the Creditor Identifier that has been attributed " - "to your company to make SEPA Direct Debits. This identifier " - "is composed of :\n- your country ISO code (2 letters)\n- a " - "2-digits checkum\n- a 3-letters business code\n- a " - "country-specific identifier"), - 'original_creditor_identifier': fields.char( - 'Original Creditor Identifier', size=70), - } - - def is_sepa_creditor_identifier_valid( - self, cr, uid, sepa_creditor_identifier, context=None): - """Check if SEPA Creditor Identifier is valid - @param sepa_creditor_identifier: SEPA Creditor Identifier as str - or unicode - @return: True if valid, False otherwise - """ - if not isinstance(sepa_creditor_identifier, (str, unicode)): - return False - try: - sci_str = str(sepa_creditor_identifier) - except: - logger.warning( - "SEPA Creditor ID should contain only ASCII caracters.") - return False - sci = sci_str.lower() - if len(sci) < 9: - return False - before_replacement = sci[7:] + sci[0:2] + '00' - logger.debug( - "SEPA ID check before_replacement = %s" % before_replacement) - after_replacement = '' - for char in before_replacement: - if char.isalpha(): - after_replacement += str(ord(char)-87) - else: - after_replacement += char - logger.debug( - "SEPA ID check after_replacement = %s" % after_replacement) - if int(sci[2:4]) == (98 - (int(after_replacement) % 97)): - return True - else: - return False - - def _check_sepa_creditor_identifier(self, cr, uid, ids): - for company in self.browse(cr, uid, ids): - if company.sepa_creditor_identifier: - if not self.is_sepa_creditor_identifier_valid( - cr, uid, company.sepa_creditor_identifier): - return False - return True - - _constraints = [ - (_check_sepa_creditor_identifier, - "Invalid SEPA Creditor Identifier.", - ['sepa_creditor_identifier']), - ] diff --git a/account_banking_sepa_direct_debit/company_view.xml b/account_banking_sepa_direct_debit/company_view.xml deleted file mode 100644 index e4c9e0b93..000000000 --- a/account_banking_sepa_direct_debit/company_view.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - sepa_direct_debit.res.company.form - res.company - - - - - - - - - - - diff --git a/account_banking_sepa_direct_debit/data/mandate_reference_sequence.xml b/account_banking_sepa_direct_debit/data/mandate_reference_sequence.xml deleted file mode 100644 index 68075d526..000000000 --- a/account_banking_sepa_direct_debit/data/mandate_reference_sequence.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - SDD Mandate Reference - sdd.mandate.reference - - - - SDD Mandate Reference - sdd.mandate.reference - RUM - - - - - - - diff --git a/account_banking_sepa_direct_debit/data/pain.008.001.02.xsd b/account_banking_sepa_direct_debit/data/pain.008.001.02.xsd deleted file mode 100644 index 633597256..000000000 --- a/account_banking_sepa_direct_debit/data/pain.008.001.02.xsd +++ /dev/null @@ -1,879 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/account_banking_sepa_direct_debit/data/pain.008.001.03.xsd b/account_banking_sepa_direct_debit/data/pain.008.001.03.xsd deleted file mode 100644 index 73d894379..000000000 --- a/account_banking_sepa_direct_debit/data/pain.008.001.03.xsd +++ /dev/null @@ -1,925 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/account_banking_sepa_direct_debit/data/pain.008.001.04.xsd b/account_banking_sepa_direct_debit/data/pain.008.001.04.xsd deleted file mode 100644 index 93806815a..000000000 --- a/account_banking_sepa_direct_debit/data/pain.008.001.04.xsd +++ /dev/null @@ -1,892 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/account_banking_sepa_direct_debit/data/payment_type_sdd.xml b/account_banking_sepa_direct_debit/data/payment_type_sdd.xml deleted file mode 100644 index a17b3b21c..000000000 --- a/account_banking_sepa_direct_debit/data/payment_type_sdd.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - SEPA Direct Debit v02 (recommended) - pain.008.001.02 - - - debit - - - - SEPA Direct Debit v03 - pain.008.001.03 - - - debit - - - - SEPA Direct Debit v04 - pain.008.001.04 - - - debit - - - - - diff --git a/account_banking_sepa_direct_debit/i18n/account_banking_sepa_direct_debit.pot b/account_banking_sepa_direct_debit/i18n/account_banking_sepa_direct_debit.pot deleted file mode 100644 index 0db576726..000000000 --- a/account_banking_sepa_direct_debit/i18n/account_banking_sepa_direct_debit.pot +++ /dev/null @@ -1,633 +0,0 @@ -# Translation of OpenERP Server. -# This file contains the translation of the following modules: -# * account_banking_sepa_direct_debit -# -msgid "" -msgstr "" -"Project-Id-Version: OpenERP Server 7.0\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-12-23 22:24+0000\n" -"PO-Revision-Date: 2013-12-23 22:24+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_sepa_direct_debit -#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.mandate_valid -msgid "SEPA Direct Debit Mandate Validated" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,filename:0 -#: field:banking.export.sdd.wizard,filename:0 -msgid "Filename" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:200 -#, python-format -msgid "The SEPA Direct Debit mandate with reference '%s' for partner '%s' has expired." -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:219 -#, python-format -msgid "Cannot validate the mandate '%s' without a date of signature." -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: selection:sdd.mandate,recurrent_sequence_type:0 -msgid "Final" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd.wizard,state:0 -msgid "Finish" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: view:res.partner:0 -#: view:res.partner.bank:0 -msgid "SDD Mandates" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: constraint:payment.line:0 -#: constraint:sdd.mandate:0 -msgid "Error msg in raise" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd,state:0 -msgid "Reconciled" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,recurrent_sequence_type:0 -msgid "Sequence Type for Next Debit" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd,charge_bearer:0 -#: selection:banking.export.sdd.wizard,charge_bearer:0 -msgid "Borne by Creditor" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.sdd_mandate_action -#: model:ir.ui.menu,name:account_banking_sepa_direct_debit.sdd_mandate_menu -#: view:res.partner.bank:0 -#: field:res.partner.bank,sdd_mandate_ids:0 -msgid "SEPA Direct Debit Mandates" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: view:banking.export.sdd.wizard:0 -#: view:sdd.mandate:0 -msgid "Validate" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_recurring -#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.recurrent_sequence_type_recurring -msgid "Sequence Type set to Recurring" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: view:banking.export.sdd.wizard:0 -msgid "Generate" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.mandate_cancel -msgid "SEPA Direct Debit Mandate Cancelled" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd,charge_bearer:0 -#: selection:banking.export.sdd.wizard,charge_bearer:0 -msgid "Borne by Debtor" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:212 -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:218 -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:224 -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:232 -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:239 -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:245 -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:253 -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:395 -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:140 -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:192 -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:199 -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:209 -#, python-format -msgid "Error:" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,message_ids:0 -msgid "Messages" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,unique_mandate_reference:0 -msgid "Unique Mandate Reference" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -#: selection:sdd.mandate,state:0 -msgid "Cancelled" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:141 -#, python-format -msgid "Payment Type Code '%s' is not supported. The only Payment Type Code supported for SEPA Direct Debit are 'pain.008.001.02', 'pain.008.001.03' and 'pain.008.001.04'." -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: help:sdd.mandate,message_unread:0 -msgid "If checked new messages require your attention." -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd.wizard,file_id:0 -msgid "SDD File" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.mandate_expired -msgid "SEPA Direct Debit Mandate has Expired" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:246 -#, python-format -msgid "The recurrent mandate '%s' which is not marked as 'Migrated to SEPA' must have its recurrent sequence type set to 'First'." -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: help:banking.export.sdd,charge_bearer:0 -#: help:banking.export.sdd.wizard,charge_bearer:0 -msgid "Following service level : transaction charges are to be applied following the rules agreed in the service level and/or scheme (SEPA Core messages must use this). Shared : transaction charges on the creditor side are to be borne by the creditor, transaction charges on the debtor side are to be borne by the debtor. Borne by creditor : all transaction charges are to be borne by the creditor. Borne by debtor : all transaction charges are to be borne by the debtor." -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -msgid "Reference" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: view:banking.export.sdd:0 -msgid "SEPA Direct Debit" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: view:banking.export.sdd.wizard:0 -msgid "SEPA Direct Debit XML file generation" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: help:sdd.mandate,message_summary:0 -msgid "Holds the Chatter summary (number of messages, ...). This summary is directly in html format in order to be inserted in kanban views." -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: model:ir.model,name:account_banking_sepa_direct_debit.model_payment_line -msgid "Payment Line" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,create_date:0 -msgid "Generation Date" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:396 -#, python-format -msgid "The payment line with reference '%s' has the bank account '%s' which is not attached to the mandate '%s' (this mandate is attached to the bank account '%s')." -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd.wizard,state:0 -msgid "Create" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,nb_transactions:0 -#: field:banking.export.sdd.wizard,nb_transactions:0 -msgid "Number of Transactions" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -#: selection:sdd.mandate,type:0 -msgid "One-Off" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,state:0 -#: field:banking.export.sdd.wizard,state:0 -msgid "State" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:240 -#, python-format -msgid "The recurrent mandate '%s' must have a sequence type." -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,message_follower_ids:0 -msgid "Followers" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,message_unread:0 -msgid "Unread Messages" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: view:banking.export.sdd:0 -#: field:banking.export.sdd,payment_order_ids:0 -#: field:banking.export.sdd.wizard,payment_order_ids:0 -msgid "Payment Orders" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -msgid "Type" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd,state:0 -msgid "Sent" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:res.company,original_creditor_identifier:0 -msgid "Original Creditor Identifier" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: selection:sdd.mandate,recurrent_sequence_type:0 -msgid "Recurring" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: help:res.company,sepa_creditor_identifier:0 -msgid "Enter the Creditor Identifier that has been attributed to your company to make SEPA Direct Debits. This identifier is composed of :\n" -"- your country ISO code (2 letters)\n" -"- a 2-digits checkum\n" -"- a 3-letters business code\n" -"- a country-specific identifier" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: sql_constraint:sdd.mandate:0 -msgid "A Mandate with the same reference already exists for this company !" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: help:sdd.mandate,state:0 -msgid "Only valid mandates can be used in a payment line. A cancelled mandate is a mandate that has been cancelled by the customer. A one-off mandate expires after its first use. A recurrent mandate expires after it's final use or if it hasn't been used for 36 months." -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: help:sdd.mandate,recurrent_sequence_type:0 -msgid "This field is only used for Recurrent mandates, not for One-Off mandates." -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:213 -#, python-format -msgid "The date of signature of mandate '%s' is in the future !" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -msgid "Signature Date" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,charge_bearer:0 -#: field:banking.export.sdd.wizard,charge_bearer:0 -msgid "Charge Bearer" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,partner_id:0 -msgid "Partner" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: selection:sdd.mandate,recurrent_sequence_type:0 -msgid "First" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,signature_date:0 -msgid "Date of Signature of the Mandate" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.mandate_cancel -msgid "Mandate Cancelled" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.act_banking_export_sdd_payment_order -msgid "Generated SEPA Direct Debit Files" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: help:sdd.mandate,sepa_migrated:0 -msgid "If this field is not active, the mandate section of the next direct debit file that include this mandate will contain the 'Original Mandate Identification' and the 'Original Creditor Scheme Identification'. This is required in a few countries (Belgium for instance), but not in all countries. If this is not required in your country, you should keep this field always active." -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,company_id:0 -msgid "Company" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: model:ir.model,name:account_banking_sepa_direct_debit.model_banking_export_sdd_wizard -msgid "Export SEPA Direct Debit File" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: help:banking.export.sdd,batch_booking:0 -#: help:banking.export.sdd.wizard,batch_booking:0 -msgid "If true, the bank statement will display only one credit line for all the direct debits of the SEPA file ; if false, the bank statement will display one credit line per direct debit of the SEPA file." -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:225 -#, python-format -msgid "Cannot validate the mandate '%s' because it is not attached to a bank account." -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd,state:0 -#: view:sdd.mandate:0 -#: selection:sdd.mandate,state:0 -msgid "Draft" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:290 -#, python-format -msgid "Mandate update" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd,charge_bearer:0 -#: selection:banking.export.sdd.wizard,charge_bearer:0 -msgid "Shared" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,batch_booking:0 -#: field:banking.export.sdd.wizard,batch_booking:0 -msgid "Batch Booking" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,sepa_migrated:0 -msgid "Migrated to SEPA" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,state:0 -msgid "Status" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,total_amount:0 -#: field:banking.export.sdd.wizard,total_amount:0 -msgid "Total Amount" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.action_account_banking_sdd -#: model:ir.ui.menu,name:account_banking_sepa_direct_debit.menu_account_banking_sdd -msgid "SEPA Direct Debit Files" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd,charge_bearer:0 -#: selection:banking.export.sdd.wizard,charge_bearer:0 -msgid "Following Service Level" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:233 -#, python-format -msgid "The mandate '%s' can't have a date of last debit before the date of signature." -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_final -#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.recurrent_sequence_type_final -msgid "Sequence Type set to Final" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,message_is_follower:0 -msgid "Is a Follower" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: help:sdd.mandate,original_mandate_identification:0 -msgid "When the field 'Migrated to SEPA' is not active, this field will be used as the Original Mandate Identification in the Direct Debit file." -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: view:payment.order:0 -msgid "SDD Mandate" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,original_mandate_identification:0 -msgid "Original Mandate Identification" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: model:ir.model,name:account_banking_sepa_direct_debit.model_res_company -msgid "Companies" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,message_summary:0 -msgid "Summary" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: model:res.groups,name:account_banking_sepa_direct_debit.group_original_mandate_required -msgid "Original Mandate Required (SEPA)" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:account.invoice,sdd_mandate_id:0 -#: model:ir.model,name:account_banking_sepa_direct_debit.model_sdd_mandate -#: field:payment.line,sdd_mandate_id:0 -#: view:sdd.mandate:0 -msgid "SEPA Direct Debit Mandate" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:193 -#, python-format -msgid "Missing SEPA Direct Debit mandate on the payment line with partner '%s' and Invoice ref '%s'." -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:210 -#, python-format -msgid "The mandate with reference '%s' for partner '%s' has type set to 'One-Off' and it has a last debit date set to '%s', so we can't use it." -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,scan:0 -msgid "Scan of the Mandate" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,last_debit_date:0 -msgid "Date of the Last Debit" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.mandate_expired -msgid "Mandate Expired" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: constraint:res.company:0 -msgid "Invalid SEPA Creditor Identifier." -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: model:ir.model,name:account_banking_sepa_direct_debit.model_res_partner_bank -msgid "Bank Accounts" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: model:ir.actions.act_window,help:account_banking_sepa_direct_debit.sdd_mandate_action -msgid "

\n" -" Click to create a new SEPA Direct Debit Mandate.\n" -"

\n" -" A SEPA Direct Debit Mandate is a document signed by your customer that gives you the autorization to do one or several direct debits on his bank account.\n" -"

\n" -" " -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: view:banking.export.sdd:0 -msgid "General Information" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -#: selection:sdd.mandate,state:0 -msgid "Valid" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: model:ir.model,name:account_banking_sepa_direct_debit.model_account_invoice -msgid "Invoice" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: view:banking.export.sdd.wizard:0 -#: view:sdd.mandate:0 -msgid "Cancel" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -#: field:sdd.mandate,payment_line_ids:0 -msgid "Related Payment Lines" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -#: selection:sdd.mandate,type:0 -msgid "Recurrent" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,type:0 -msgid "Type of Mandate" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.mandate_valid -msgid "Mandate Validated" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,file:0 -msgid "SEPA File" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:res.company,sepa_creditor_identifier:0 -msgid "SEPA Creditor Identifier" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: model:ir.model,name:account_banking_sepa_direct_debit.model_banking_export_sdd -msgid "SEPA Direct Debit export" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -#: selection:sdd.mandate,state:0 -msgid "Expired" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,partner_bank_id:0 -msgid "Bank Account" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:254 -#, python-format -msgid "You must set the 'Original Mandate Identification' on the recurrent mandate '%s' which is not marked as 'Migrated to SEPA'." -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_first -#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.recurrent_sequence_type_first -msgid "Sequence Type set to First" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:291 -#, python-format -msgid "As you changed the bank account attached to this mandate, the 'Sequence Type' has been set back to 'First'." -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: help:sdd.mandate,message_ids:0 -msgid "Messages and communication history" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -msgid "Search SEPA Direct Debit Mandates" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd.wizard,file:0 -msgid "File" -msgstr "" - diff --git a/account_banking_sepa_direct_debit/i18n/fr.po b/account_banking_sepa_direct_debit/i18n/fr.po deleted file mode 100644 index 3744da850..000000000 --- a/account_banking_sepa_direct_debit/i18n/fr.po +++ /dev/null @@ -1,749 +0,0 @@ -# Translation of OpenERP Server. -# This file contains the translation of the following modules: -# * account_banking_sepa_direct_debit -# -msgid "" -msgstr "" -"Project-Id-Version: OpenERP Server 7.0\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-12-23 22:24+0000\n" -"PO-Revision-Date: 2014-02-01 04:49+0000\n" -"Last-Translator: Alexis de Lattre \n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2014-05-31 06:02+0000\n" -"X-Generator: Launchpad (build 17031)\n" - -#. module: account_banking_sepa_direct_debit -#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.mandate_valid -msgid "SEPA Direct Debit Mandate Validated" -msgstr "Mandat de prélèvement SEPA validé" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,filename:0 -#: field:banking.export.sdd.wizard,filename:0 -msgid "Filename" -msgstr "Nom du fichier" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:200 -#, python-format -msgid "" -"The SEPA Direct Debit mandate with reference '%s' for partner '%s' has " -"expired." -msgstr "" -"Le mandat de prélèvement SEPA portant la référence '%s' pour le partenaire " -"'%s' a expiré." - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:219 -#, python-format -msgid "Cannot validate the mandate '%s' without a date of signature." -msgstr "Impossible de valider le mandat '%s' sans date de signature." - -#. module: account_banking_sepa_direct_debit -#: selection:sdd.mandate,recurrent_sequence_type:0 -msgid "Final" -msgstr "Final" - -#. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd.wizard,state:0 -msgid "Finish" -msgstr "Finir" - -#. module: account_banking_sepa_direct_debit -#: view:res.partner:0 -#: view:res.partner.bank:0 -msgid "SDD Mandates" -msgstr "Mandats SEPA" - -#. module: account_banking_sepa_direct_debit -#: constraint:payment.line:0 -#: constraint:sdd.mandate:0 -msgid "Error msg in raise" -msgstr "Error msg in raise" - -#. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd,state:0 -msgid "Reconciled" -msgstr "Réconcilié" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,recurrent_sequence_type:0 -msgid "Sequence Type for Next Debit" -msgstr "Type de séquence pour le prochain prélèvement" - -#. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd,charge_bearer:0 -#: selection:banking.export.sdd.wizard,charge_bearer:0 -msgid "Borne by Creditor" -msgstr "Supportés par le créancier" - -#. module: account_banking_sepa_direct_debit -#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.sdd_mandate_action -#: model:ir.ui.menu,name:account_banking_sepa_direct_debit.sdd_mandate_menu -#: view:res.partner.bank:0 -#: field:res.partner.bank,sdd_mandate_ids:0 -msgid "SEPA Direct Debit Mandates" -msgstr "Mandats de prélèvement SEPA" - -#. module: account_banking_sepa_direct_debit -#: view:banking.export.sdd.wizard:0 -#: view:sdd.mandate:0 -msgid "Validate" -msgstr "Valider" - -#. module: account_banking_sepa_direct_debit -#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_recurring -#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.recurrent_sequence_type_recurring -msgid "Sequence Type set to Recurring" -msgstr "Type de séquence mis à Recurring" - -#. module: account_banking_sepa_direct_debit -#: view:banking.export.sdd.wizard:0 -msgid "Generate" -msgstr "Générer" - -#. module: account_banking_sepa_direct_debit -#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.mandate_cancel -msgid "SEPA Direct Debit Mandate Cancelled" -msgstr "Mandat de prélèvement SEPA annulé" - -#. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd,charge_bearer:0 -#: selection:banking.export.sdd.wizard,charge_bearer:0 -msgid "Borne by Debtor" -msgstr "Supportés par le débiteur" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:212 -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:218 -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:224 -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:232 -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:239 -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:245 -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:253 -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:395 -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:140 -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:192 -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:199 -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:209 -#, python-format -msgid "Error:" -msgstr "Erreur :" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,message_ids:0 -msgid "Messages" -msgstr "Messages" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,unique_mandate_reference:0 -msgid "Unique Mandate Reference" -msgstr "Référence unique de mandat" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -#: selection:sdd.mandate,state:0 -msgid "Cancelled" -msgstr "Annulé" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:141 -#, python-format -msgid "" -"Payment Type Code '%s' is not supported. The only Payment Type Code " -"supported for SEPA Direct Debit are 'pain.008.001.02', 'pain.008.001.03' and " -"'pain.008.001.04'." -msgstr "" -"Le code du Type de paiement '%s' n'est pas supporté. Les seuls codes de Type " -"de paiement supportés pour les prélèvements SEPA sont 'pain.008.001.02', " -"'pain.008.001.03' et 'pain.008.001.04'." - -#. module: account_banking_sepa_direct_debit -#: help:sdd.mandate,message_unread:0 -msgid "If checked new messages require your attention." -msgstr "If checked new messages require your attention." - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd.wizard,file_id:0 -msgid "SDD File" -msgstr "Fichier de prélèvement SEPA" - -#. module: account_banking_sepa_direct_debit -#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.mandate_expired -msgid "SEPA Direct Debit Mandate has Expired" -msgstr "Le mandat de prélèvement SEPA a expiré" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:246 -#, python-format -msgid "" -"The recurrent mandate '%s' which is not marked as 'Migrated to SEPA' must " -"have its recurrent sequence type set to 'First'." -msgstr "" -"Le mandat récurrent '%s' dont l'option 'Migré à SEPA' n'est pas activée doit " -"avec sa séquence mise à 'First'." - -#. module: account_banking_sepa_direct_debit -#: help:banking.export.sdd,charge_bearer:0 -#: help:banking.export.sdd.wizard,charge_bearer:0 -msgid "" -"Following service level : transaction charges are to be applied following " -"the rules agreed in the service level and/or scheme (SEPA Core messages must " -"use this). Shared : transaction charges on the creditor side are to be borne " -"by the creditor, transaction charges on the debtor side are to be borne by " -"the debtor. Borne by creditor : all transaction charges are to be borne by " -"the creditor. Borne by debtor : all transaction charges are to be borne by " -"the debtor." -msgstr "" -"Suivant le niveau de service : la répartition des frais bancaires suit les " -"règles pré-établies dans le schema ou dans le contrat avec la banque (les " -"messages SEPA Core doivent utiliser ce paramètre). Partagés : les frais " -"bancaires côté débiteur sont à la charge du débiteur, les frais bancaires " -"côté créancier sont à la charge du créancier. Supportés par le créancier : " -"tous les frais bancaires sont à la charge du créancier. Supportés par le " -"débiteur : tous les frais bancaires sont à la charge du débiteur." - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -msgid "Reference" -msgstr "Référence" - -#. module: account_banking_sepa_direct_debit -#: view:banking.export.sdd:0 -msgid "SEPA Direct Debit" -msgstr "Prélèvement SEPA" - -#. module: account_banking_sepa_direct_debit -#: view:banking.export.sdd.wizard:0 -msgid "SEPA Direct Debit XML file generation" -msgstr "Génération de fichiers de prélèvement SEPA XML" - -#. module: account_banking_sepa_direct_debit -#: help:sdd.mandate,message_summary:0 -msgid "" -"Holds the Chatter summary (number of messages, ...). This summary is " -"directly in html format in order to be inserted in kanban views." -msgstr "" -"Holds the Chatter summary (number of messages, ...). This summary is " -"directly in html format in order to be inserted in kanban views." - -#. module: account_banking_sepa_direct_debit -#: model:ir.model,name:account_banking_sepa_direct_debit.model_payment_line -msgid "Payment Line" -msgstr "Ligne de paiement" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,create_date:0 -msgid "Generation Date" -msgstr "Date de génération" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:396 -#, python-format -msgid "" -"The payment line with reference '%s' has the bank account '%s' which is not " -"attached to the mandate '%s' (this mandate is attached to the bank account " -"'%s')." -msgstr "" -"La ligne de paiement portant la référence '%s' est configurée avec le compte " -"bancaire '%s' qui n'est pas rattaché au mandat '%s' (ce mandat est rattaché " -"au compte bancaire '%s')." - -#. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd.wizard,state:0 -msgid "Create" -msgstr "Créer" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,nb_transactions:0 -#: field:banking.export.sdd.wizard,nb_transactions:0 -msgid "Number of Transactions" -msgstr "Nombre de transactions" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -#: selection:sdd.mandate,type:0 -msgid "One-Off" -msgstr "One-Off" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,state:0 -#: field:banking.export.sdd.wizard,state:0 -msgid "State" -msgstr "État" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:240 -#, python-format -msgid "The recurrent mandate '%s' must have a sequence type." -msgstr "Le mandat récurrent '%s' doit avoir un type de séquence." - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,message_follower_ids:0 -msgid "Followers" -msgstr "Followers" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,message_unread:0 -msgid "Unread Messages" -msgstr "Unread Messages" - -#. module: account_banking_sepa_direct_debit -#: view:banking.export.sdd:0 -#: field:banking.export.sdd,payment_order_ids:0 -#: field:banking.export.sdd.wizard,payment_order_ids:0 -msgid "Payment Orders" -msgstr "Ordres de paiement" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -msgid "Type" -msgstr "Type" - -#. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd,state:0 -msgid "Sent" -msgstr "Envoyé" - -#. module: account_banking_sepa_direct_debit -#: field:res.company,original_creditor_identifier:0 -msgid "Original Creditor Identifier" -msgstr "Ancien Identifiant Créancier" - -#. module: account_banking_sepa_direct_debit -#: selection:sdd.mandate,recurrent_sequence_type:0 -msgid "Recurring" -msgstr "Recurring" - -#. module: account_banking_sepa_direct_debit -#: help:res.company,sepa_creditor_identifier:0 -msgid "" -"Enter the Creditor Identifier that has been attributed to your company to " -"make SEPA Direct Debits. This identifier is composed of :\n" -"- your country ISO code (2 letters)\n" -"- a 2-digits checkum\n" -"- a 3-letters business code\n" -"- a country-specific identifier" -msgstr "" -"Entrez l'Identifiant créancier qui a été attribué à votre société pour " -"réaliser des prélèvements SEPA. Cet identifiant est composé de :\n" -"- du code ISO de votre pays (2 lettres)\n" -"- un code de contrôle à 2 chiffres\n" -"- un code d'activité à 3 lettres\n" -"- un identifiant national" - -#. module: account_banking_sepa_direct_debit -#: sql_constraint:sdd.mandate:0 -msgid "A Mandate with the same reference already exists for this company !" -msgstr "Un mandat avec la même référence existe déjà pour cette société !" - -#. module: account_banking_sepa_direct_debit -#: help:sdd.mandate,state:0 -msgid "" -"Only valid mandates can be used in a payment line. A cancelled mandate is a " -"mandate that has been cancelled by the customer. A one-off mandate expires " -"after its first use. A recurrent mandate expires after it's final use or if " -"it hasn't been used for 36 months." -msgstr "" -"Seuls des mandats valides peuvent être utilisés dans une ligne de paiement. " -"Un mandate annulé est un mandat qui a été annulé par le client. Un mandat " -"One-Off expire à l'issue de sa première utilisation. Un mandate récurrent " -"expire après sa dernière utilisation ou si il n'a pas été utilisé pendant 36 " -"mois." - -#. module: account_banking_sepa_direct_debit -#: help:sdd.mandate,recurrent_sequence_type:0 -msgid "" -"This field is only used for Recurrent mandates, not for One-Off mandates." -msgstr "" -"Ce champ n'est utilisé que pour les mandats récurrents, pas pour les mandats " -"One-Off." - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:213 -#, python-format -msgid "The date of signature of mandate '%s' is in the future !" -msgstr "La date de signature du mandat '%s' est dans le futur !" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -msgid "Signature Date" -msgstr "Date de signature" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,charge_bearer:0 -#: field:banking.export.sdd.wizard,charge_bearer:0 -msgid "Charge Bearer" -msgstr "Répartition des frais" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,partner_id:0 -msgid "Partner" -msgstr "Partenaire" - -#. module: account_banking_sepa_direct_debit -#: selection:sdd.mandate,recurrent_sequence_type:0 -msgid "First" -msgstr "First" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,signature_date:0 -msgid "Date of Signature of the Mandate" -msgstr "Date de signature du mandat" - -#. module: account_banking_sepa_direct_debit -#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.mandate_cancel -msgid "Mandate Cancelled" -msgstr "Mandat annulé" - -#. module: account_banking_sepa_direct_debit -#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.act_banking_export_sdd_payment_order -msgid "Generated SEPA Direct Debit Files" -msgstr "Fichiers de prélèvement SEPA générés" - -#. module: account_banking_sepa_direct_debit -#: help:sdd.mandate,sepa_migrated:0 -msgid "" -"If this field is not active, the mandate section of the next direct debit " -"file that include this mandate will contain the 'Original Mandate " -"Identification' and the 'Original Creditor Scheme Identification'. This is " -"required in a few countries (Belgium for instance), but not in all " -"countries. If this is not required in your country, you should keep this " -"field always active." -msgstr "" -"Si cette option n'est pas activée, la section qui concerne le mandat dans le " -"prochain fichier de prélèvement qui incluera ce mandat contiendra les champs " -"'Original Mandate Identification' et 'Original Creditor Scheme " -"Identification'. Ces champs sont requis dans certains pays (en Belgique " -"notamment), mais pas dans tous les pays. Si ces champs ne sont pas requis " -"dans votre pays, vous devriez garder ce champ toujours actif." - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,company_id:0 -msgid "Company" -msgstr "Société" - -#. module: account_banking_sepa_direct_debit -#: model:ir.model,name:account_banking_sepa_direct_debit.model_banking_export_sdd_wizard -msgid "Export SEPA Direct Debit File" -msgstr "Export du fichier de prélèvement SEPA" - -#. module: account_banking_sepa_direct_debit -#: help:banking.export.sdd,batch_booking:0 -#: help:banking.export.sdd.wizard,batch_booking:0 -msgid "" -"If true, the bank statement will display only one credit line for all the " -"direct debits of the SEPA file ; if false, the bank statement will display " -"one credit line per direct debit of the SEPA file." -msgstr "" -"Si activé, le relevé de compte ne fera apparaître qu'une ligne de crédit " -"pour tous les prélèvements du fichier SEPA ; si désactivé, le relevé de " -"banque fera apparaître une ligne de crédit pour chaque prélèvement du " -"fichier SEPA." - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:225 -#, python-format -msgid "" -"Cannot validate the mandate '%s' because it is not attached to a bank " -"account." -msgstr "" -"Impossible de valider le mandat '%s' car il n'est pas rattaché à un compte " -"bancaire." - -#. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd,state:0 -#: view:sdd.mandate:0 -#: selection:sdd.mandate,state:0 -msgid "Draft" -msgstr "Brouillon" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:290 -#, python-format -msgid "Mandate update" -msgstr "Mise-à-jour du mandat" - -#. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd,charge_bearer:0 -#: selection:banking.export.sdd.wizard,charge_bearer:0 -msgid "Shared" -msgstr "Partagée" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,batch_booking:0 -#: field:banking.export.sdd.wizard,batch_booking:0 -msgid "Batch Booking" -msgstr "Crédit groupé" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,sepa_migrated:0 -msgid "Migrated to SEPA" -msgstr "Migré à SEPA" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,state:0 -msgid "Status" -msgstr "Statut" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,total_amount:0 -#: field:banking.export.sdd.wizard,total_amount:0 -msgid "Total Amount" -msgstr "Montant total" - -#. module: account_banking_sepa_direct_debit -#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.action_account_banking_sdd -#: model:ir.ui.menu,name:account_banking_sepa_direct_debit.menu_account_banking_sdd -msgid "SEPA Direct Debit Files" -msgstr "Fichiers de prélèvement SEPA" - -#. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd,charge_bearer:0 -#: selection:banking.export.sdd.wizard,charge_bearer:0 -msgid "Following Service Level" -msgstr "Suivant le niveau de service" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:233 -#, python-format -msgid "" -"The mandate '%s' can't have a date of last debit before the date of " -"signature." -msgstr "" -"Le mandat '%s' ne peut pas avoir une date de dernier débit antérieure à la " -"date de signature." - -#. module: account_banking_sepa_direct_debit -#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_final -#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.recurrent_sequence_type_final -msgid "Sequence Type set to Final" -msgstr "Type de Séquence mis à Final" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,message_is_follower:0 -msgid "Is a Follower" -msgstr "Is a Follower" - -#. module: account_banking_sepa_direct_debit -#: help:sdd.mandate,original_mandate_identification:0 -msgid "" -"When the field 'Migrated to SEPA' is not active, this field will be used as " -"the Original Mandate Identification in the Direct Debit file." -msgstr "" -"Quand le champ 'Migré à SEPA' n'est pas activé, ce champ sera le 'Original " -"Mandate Identification' dans le fichier de prélèvement." - -#. module: account_banking_sepa_direct_debit -#: view:payment.order:0 -msgid "SDD Mandate" -msgstr "Mandat de prélèvement" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,original_mandate_identification:0 -msgid "Original Mandate Identification" -msgstr "Ancien Identifiant du Mandat" - -#. module: account_banking_sepa_direct_debit -#: model:ir.model,name:account_banking_sepa_direct_debit.model_res_company -msgid "Companies" -msgstr "Sociétés" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,message_summary:0 -msgid "Summary" -msgstr "Résumé" - -#. module: account_banking_sepa_direct_debit -#: model:res.groups,name:account_banking_sepa_direct_debit.group_original_mandate_required -msgid "Original Mandate Required (SEPA)" -msgstr "Ancien mandat requis (SEPA)" - -#. module: account_banking_sepa_direct_debit -#: field:account.invoice,sdd_mandate_id:0 -#: model:ir.model,name:account_banking_sepa_direct_debit.model_sdd_mandate -#: field:payment.line,sdd_mandate_id:0 -#: view:sdd.mandate:0 -msgid "SEPA Direct Debit Mandate" -msgstr "Mandat de prélèvement SEPA" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:193 -#, python-format -msgid "" -"Missing SEPA Direct Debit mandate on the payment line with partner '%s' and " -"Invoice ref '%s'." -msgstr "" -"Mandat de prélèvement SEPA manquant sur la ligne de paiement ayant pour " -"partenaire '%s' et pour référence de facture '%s'." - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:210 -#, python-format -msgid "" -"The mandate with reference '%s' for partner '%s' has type set to 'One-Off' " -"and it has a last debit date set to '%s', so we can't use it." -msgstr "" -"Le mandat portant la référence '%s' pour le partenaire '%s' est de type 'One-" -"Off' et il a une date de dernier débit au '%s', donc il n'est pas utilisable." - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,scan:0 -msgid "Scan of the Mandate" -msgstr "Scan du mandat" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,last_debit_date:0 -msgid "Date of the Last Debit" -msgstr "Date du dernier prélèvement" - -#. module: account_banking_sepa_direct_debit -#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.mandate_expired -msgid "Mandate Expired" -msgstr "Mandat expiré" - -#. module: account_banking_sepa_direct_debit -#: constraint:res.company:0 -msgid "Invalid SEPA Creditor Identifier." -msgstr "Identifiant créancier SEPA invalide." - -#. module: account_banking_sepa_direct_debit -#: model:ir.model,name:account_banking_sepa_direct_debit.model_res_partner_bank -msgid "Bank Accounts" -msgstr "Comptes bancaires" - -#. module: account_banking_sepa_direct_debit -#: model:ir.actions.act_window,help:account_banking_sepa_direct_debit.sdd_mandate_action -msgid "" -"

\n" -" Click to create a new SEPA Direct Debit Mandate.\n" -"

\n" -" A SEPA Direct Debit Mandate is a document signed by your customer " -"that gives you the autorization to do one or several direct debits on his " -"bank account.\n" -"

\n" -" " -msgstr "" -"

\n" -" Cliquez pour créer un mandat de prélèvement SEPA.\n" -"

\n" -" Un mandat de prélèvement SEPA est un document signé par votre client " -"qui vous donne l'autorisation de réaliser un ou plusieurs prélèvements sur " -"son compte bancaire.\n" -"

\n" -" " - -#. module: account_banking_sepa_direct_debit -#: view:banking.export.sdd:0 -msgid "General Information" -msgstr "Informations générales" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -#: selection:sdd.mandate,state:0 -msgid "Valid" -msgstr "Valide" - -#. module: account_banking_sepa_direct_debit -#: model:ir.model,name:account_banking_sepa_direct_debit.model_account_invoice -msgid "Invoice" -msgstr "Facture" - -#. module: account_banking_sepa_direct_debit -#: view:banking.export.sdd.wizard:0 -#: view:sdd.mandate:0 -msgid "Cancel" -msgstr "Annuler" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -#: field:sdd.mandate,payment_line_ids:0 -msgid "Related Payment Lines" -msgstr "Lignes de paiement associées" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -#: selection:sdd.mandate,type:0 -msgid "Recurrent" -msgstr "Récurrent" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,type:0 -msgid "Type of Mandate" -msgstr "Type de mandat" - -#. module: account_banking_sepa_direct_debit -#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.mandate_valid -msgid "Mandate Validated" -msgstr "Mandat validé" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,file:0 -msgid "SEPA File" -msgstr "Fichier SEPA" - -#. module: account_banking_sepa_direct_debit -#: field:res.company,sepa_creditor_identifier:0 -msgid "SEPA Creditor Identifier" -msgstr "Identifiant créancier SEPA" - -#. module: account_banking_sepa_direct_debit -#: model:ir.model,name:account_banking_sepa_direct_debit.model_banking_export_sdd -msgid "SEPA Direct Debit export" -msgstr "Export de prélèvement SEPA" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -#: selection:sdd.mandate,state:0 -msgid "Expired" -msgstr "Expiré" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,partner_bank_id:0 -msgid "Bank Account" -msgstr "Compte bancaire" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:254 -#, python-format -msgid "" -"You must set the 'Original Mandate Identification' on the recurrent mandate " -"'%s' which is not marked as 'Migrated to SEPA'." -msgstr "" -"Vous devez renseigner le champ 'Ancien identifiant du mandat' sur le mandat " -"récurrent '%s' qui n'est pas marqué comme étant 'Migré à SEPA'." - -#. module: account_banking_sepa_direct_debit -#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_first -#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.recurrent_sequence_type_first -msgid "Sequence Type set to First" -msgstr "Type de Séquence mis à First" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:291 -#, python-format -msgid "" -"As you changed the bank account attached to this mandate, the 'Sequence " -"Type' has been set back to 'First'." -msgstr "" -"Etant donné que vous avez changé le compte bancaire associé à ce mandat, le " -"'Type de séquence' a été remis à 'First'." - -#. module: account_banking_sepa_direct_debit -#: help:sdd.mandate,message_ids:0 -msgid "Messages and communication history" -msgstr "Messages and communication history" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -msgid "Search SEPA Direct Debit Mandates" -msgstr "Recherche dans les mandats de prélèvement SEPA" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd.wizard,file:0 -msgid "File" -msgstr "Fichier" diff --git a/account_banking_sepa_direct_debit/i18n/nl.po b/account_banking_sepa_direct_debit/i18n/nl.po deleted file mode 100644 index 2c2ccc12f..000000000 --- a/account_banking_sepa_direct_debit/i18n/nl.po +++ /dev/null @@ -1,754 +0,0 @@ -# Dutch translation for banking-addons -# Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 -# This file is distributed under the same license as the banking-addons package. -# FIRST AUTHOR , 2014. -# -msgid "" -msgstr "" -"Project-Id-Version: banking-addons\n" -"Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2013-12-23 22:24+0000\n" -"PO-Revision-Date: 2014-04-24 10:38+0000\n" -"Last-Translator: Erwin van der Ploeg (BAS Solutions) \n" -"Language-Team: Dutch \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2014-05-31 06:02+0000\n" -"X-Generator: Launchpad (build 17031)\n" - -#. module: account_banking_sepa_direct_debit -#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.mandate_valid -msgid "SEPA Direct Debit Mandate Validated" -msgstr "SEPA incasso machtiging bevestigd." - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,filename:0 -#: field:banking.export.sdd.wizard,filename:0 -msgid "Filename" -msgstr "Bestandsnaam" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:200 -#, python-format -msgid "" -"The SEPA Direct Debit mandate with reference '%s' for partner '%s' has " -"expired." -msgstr "" -"De SEPA incasso machtiging met referentie '%s' voor relatie '%s' is verlopen." - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:219 -#, python-format -msgid "Cannot validate the mandate '%s' without a date of signature." -msgstr "" -"Het is niet mogelijk de machtiging '%s' te bevestigen zonder een datum van " -"ondertekenen." - -#. module: account_banking_sepa_direct_debit -#: selection:sdd.mandate,recurrent_sequence_type:0 -msgid "Final" -msgstr "Definitief" - -#. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd.wizard,state:0 -msgid "Finish" -msgstr "Gereed" - -#. module: account_banking_sepa_direct_debit -#: view:res.partner:0 -#: view:res.partner.bank:0 -msgid "SDD Mandates" -msgstr "SDD machteging" - -#. module: account_banking_sepa_direct_debit -#: constraint:payment.line:0 -#: constraint:sdd.mandate:0 -msgid "Error msg in raise" -msgstr "Fout bericht" - -#. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd,state:0 -msgid "Reconciled" -msgstr "Afgeletterd" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,recurrent_sequence_type:0 -msgid "Sequence Type for Next Debit" -msgstr "Reeks soort voor volgende incasso" - -#. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd,charge_bearer:0 -#: selection:banking.export.sdd.wizard,charge_bearer:0 -msgid "Borne by Creditor" -msgstr "Op rekening van schuldeiser" - -#. module: account_banking_sepa_direct_debit -#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.sdd_mandate_action -#: model:ir.ui.menu,name:account_banking_sepa_direct_debit.sdd_mandate_menu -#: view:res.partner.bank:0 -#: field:res.partner.bank,sdd_mandate_ids:0 -msgid "SEPA Direct Debit Mandates" -msgstr "SEPA incasso machtegingen" - -#. module: account_banking_sepa_direct_debit -#: view:banking.export.sdd.wizard:0 -#: view:sdd.mandate:0 -msgid "Validate" -msgstr "Bevestigen" - -#. module: account_banking_sepa_direct_debit -#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_recurring -#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.recurrent_sequence_type_recurring -msgid "Sequence Type set to Recurring" -msgstr "Reeks soort ingesteld op herhalend" - -#. module: account_banking_sepa_direct_debit -#: view:banking.export.sdd.wizard:0 -msgid "Generate" -msgstr "Genereer" - -#. module: account_banking_sepa_direct_debit -#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.mandate_cancel -msgid "SEPA Direct Debit Mandate Cancelled" -msgstr "SEPA incasso machtegingen geannuleerd" - -#. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd,charge_bearer:0 -#: selection:banking.export.sdd.wizard,charge_bearer:0 -msgid "Borne by Debtor" -msgstr "Rekening van schuldenaar" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:212 -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:218 -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:224 -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:232 -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:239 -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:245 -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:253 -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:395 -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:140 -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:192 -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:199 -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:209 -#, python-format -msgid "Error:" -msgstr "Fout:" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,message_ids:0 -msgid "Messages" -msgstr "Berichten" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,unique_mandate_reference:0 -msgid "Unique Mandate Reference" -msgstr "Unieke machtiging referentie" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -#: selection:sdd.mandate,state:0 -msgid "Cancelled" -msgstr "Geannuleerd" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:141 -#, python-format -msgid "" -"Payment Type Code '%s' is not supported. The only Payment Type Code " -"supported for SEPA Direct Debit are 'pain.008.001.02', 'pain.008.001.03' and " -"'pain.008.001.04'." -msgstr "" -"Betaal soort code '%s' wordt niet ondersteund. De enige betaalsoort code " -"ondersteund voor SEPA incasso's zijn 'pain.008.001.02', 'pain.008.001.03' en " -"'pain.008.001.04'." - -#. module: account_banking_sepa_direct_debit -#: help:sdd.mandate,message_unread:0 -msgid "If checked new messages require your attention." -msgstr "Indien aangevinkt zullen nieuwe berichten uw aandacht vragen." - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd.wizard,file_id:0 -msgid "SDD File" -msgstr "SDD bestand" - -#. module: account_banking_sepa_direct_debit -#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.mandate_expired -msgid "SEPA Direct Debit Mandate has Expired" -msgstr "SEPA Direct incasso machtiging is verlopen" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:246 -#, python-format -msgid "" -"The recurrent mandate '%s' which is not marked as 'Migrated to SEPA' must " -"have its recurrent sequence type set to 'First'." -msgstr "" -"Bij de herhalende machtiging '%s' welke niet is gemarkeerd als 'gemigreerd " -"naar SEPA' dient de reeks soort te worden ingesteld op 'Eerste'." - -#. module: account_banking_sepa_direct_debit -#: help:banking.export.sdd,charge_bearer:0 -#: help:banking.export.sdd.wizard,charge_bearer:0 -msgid "" -"Following service level : transaction charges are to be applied following " -"the rules agreed in the service level and/or scheme (SEPA Core messages must " -"use this). Shared : transaction charges on the creditor side are to be borne " -"by the creditor, transaction charges on the debtor side are to be borne by " -"the debtor. Borne by creditor : all transaction charges are to be borne by " -"the creditor. Borne by debtor : all transaction charges are to be borne by " -"the debtor." -msgstr "" -"Volg service level: Transactie kosten worden toegepast volgens de " -"afgesproken regels in het service level en/of schema (Voor SEPA berichten " -"deze gebruiken). Gedeeld : De transactiekosten aan de crediteur zijde zijn " -"voor de schuldenaar, transactiekosten aan de debiteur kant zijn voor de " -"schuldeiser. Op rekening van de schuldenaar: Alle transactie kosten zijn " -"voor rekening van de schuldenaar. Op rekening van de schuldeiser: Alle " -"transactie kosten zijn voor rekening van de schuldeiser." - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -msgid "Reference" -msgstr "Referentie" - -#. module: account_banking_sepa_direct_debit -#: view:banking.export.sdd:0 -msgid "SEPA Direct Debit" -msgstr "SEPA Incasso (Direct Debit)" - -#. module: account_banking_sepa_direct_debit -#: view:banking.export.sdd.wizard:0 -msgid "SEPA Direct Debit XML file generation" -msgstr "SEPA Incasso XML bestand aanmaken" - -#. module: account_banking_sepa_direct_debit -#: help:sdd.mandate,message_summary:0 -msgid "" -"Holds the Chatter summary (number of messages, ...). This summary is " -"directly in html format in order to be inserted in kanban views." -msgstr "" -"Bevat de samenvatting van de chatter (aantal berichten,...). Deze " -"samenvatting is direct in html formaat om zo in de kanban weergave te worden " -"ingevoegd." - -#. module: account_banking_sepa_direct_debit -#: model:ir.model,name:account_banking_sepa_direct_debit.model_payment_line -msgid "Payment Line" -msgstr "Betaalregel" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,create_date:0 -msgid "Generation Date" -msgstr "Aangemaakt op" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:396 -#, python-format -msgid "" -"The payment line with reference '%s' has the bank account '%s' which is not " -"attached to the mandate '%s' (this mandate is attached to the bank account " -"'%s')." -msgstr "" -"De betaalregel met referentie '%s' heeft het bankrekeningnummer '%s' welke " -"niet is gekoppeld aan de machtiging '%s' (deze machtiging is gekoppeld aan " -"bankrekening '%s')." - -#. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd.wizard,state:0 -msgid "Create" -msgstr "Aanmaken" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,nb_transactions:0 -#: field:banking.export.sdd.wizard,nb_transactions:0 -msgid "Number of Transactions" -msgstr "Aantal transacties" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -#: selection:sdd.mandate,type:0 -msgid "One-Off" -msgstr "Eenmalig" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,state:0 -#: field:banking.export.sdd.wizard,state:0 -msgid "State" -msgstr "Status" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:240 -#, python-format -msgid "The recurrent mandate '%s' must have a sequence type." -msgstr "De herhalende machtiging '%s' dient een reeks soort te hebben." - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,message_follower_ids:0 -msgid "Followers" -msgstr "Volgers" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,message_unread:0 -msgid "Unread Messages" -msgstr "Ongelezen berichten" - -#. module: account_banking_sepa_direct_debit -#: view:banking.export.sdd:0 -#: field:banking.export.sdd,payment_order_ids:0 -#: field:banking.export.sdd.wizard,payment_order_ids:0 -msgid "Payment Orders" -msgstr "Betaalopdrachten" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -msgid "Type" -msgstr "Soort" - -#. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd,state:0 -msgid "Sent" -msgstr "Verstuurd" - -#. module: account_banking_sepa_direct_debit -#: field:res.company,original_creditor_identifier:0 -msgid "Original Creditor Identifier" -msgstr "Originele Incassant-ID" - -#. module: account_banking_sepa_direct_debit -#: selection:sdd.mandate,recurrent_sequence_type:0 -msgid "Recurring" -msgstr "Terugkerend" - -#. module: account_banking_sepa_direct_debit -#: help:res.company,sepa_creditor_identifier:0 -msgid "" -"Enter the Creditor Identifier that has been attributed to your company to " -"make SEPA Direct Debits. This identifier is composed of :\n" -"- your country ISO code (2 letters)\n" -"- a 2-digits checkum\n" -"- a 3-letters business code\n" -"- a country-specific identifier" -msgstr "" -"Geef de Incassant-ID in, welke is toegewezen aan uw bedrijf om incasso's uit " -"te voeren. De Incassant-ID is samengesteld uit:\n" -"- uw ISO landcode (2 letters)\n" -"- een 2 cijferig controlegetal\n" -"- een 3 cijferig business code\n" -"- een landspecifieke identifier" - -#. module: account_banking_sepa_direct_debit -#: sql_constraint:sdd.mandate:0 -msgid "A Mandate with the same reference already exists for this company !" -msgstr "Een machtiging met dezelfde referentie bestaat al vooR dit bedrijf!" - -#. module: account_banking_sepa_direct_debit -#: help:sdd.mandate,state:0 -msgid "" -"Only valid mandates can be used in a payment line. A cancelled mandate is a " -"mandate that has been cancelled by the customer. A one-off mandate expires " -"after its first use. A recurrent mandate expires after it's final use or if " -"it hasn't been used for 36 months." -msgstr "" -"Alleen geldige machtigingen kunnen worden gebruikt op betaalregels. Een " -"geannuleerde machtiging is een machtiging welke is geannuleerd door de " -"klant. Een eenmalige machtiging verloopt na eenmalig gebruik. Een herhalende " -"machtiging verloopt na zijn laatste gebruik of als deze niet is gebruikt " -"voor 36 maanden." - -#. module: account_banking_sepa_direct_debit -#: help:sdd.mandate,recurrent_sequence_type:0 -msgid "" -"This field is only used for Recurrent mandates, not for One-Off mandates." -msgstr "" -"Dit veld wordt alleen gebruikt voor herhalende machtigingen, niet voor een " -"eenmalige machtiging." - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:213 -#, python-format -msgid "The date of signature of mandate '%s' is in the future !" -msgstr "" -"De datum van de handtekening van de machtiging '%s' is in de toekomst!" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -msgid "Signature Date" -msgstr "Handtekening datum" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,charge_bearer:0 -#: field:banking.export.sdd.wizard,charge_bearer:0 -msgid "Charge Bearer" -msgstr "Kostenverdeling" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,partner_id:0 -msgid "Partner" -msgstr "Relatie" - -#. module: account_banking_sepa_direct_debit -#: selection:sdd.mandate,recurrent_sequence_type:0 -msgid "First" -msgstr "Eerste" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,signature_date:0 -msgid "Date of Signature of the Mandate" -msgstr "Datum avn de handtekening van de machtiging" - -#. module: account_banking_sepa_direct_debit -#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.mandate_cancel -msgid "Mandate Cancelled" -msgstr "Machtiging geannuleerd" - -#. module: account_banking_sepa_direct_debit -#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.act_banking_export_sdd_payment_order -msgid "Generated SEPA Direct Debit Files" -msgstr "Genereerde SEPA incasso bestanden" - -#. module: account_banking_sepa_direct_debit -#: help:sdd.mandate,sepa_migrated:0 -msgid "" -"If this field is not active, the mandate section of the next direct debit " -"file that include this mandate will contain the 'Original Mandate " -"Identification' and the 'Original Creditor Scheme Identification'. This is " -"required in a few countries (Belgium for instance), but not in all " -"countries. If this is not required in your country, you should keep this " -"field always active." -msgstr "" -"Indien niet aangevinkt, zal het machtiging gedeelte van het volgende incasso " -"bestand, dat deze machtiging bevat, de 'Originele machtiging identificatie' " -"en de 'Origineel schuldeiser identificatie' bevatten. Dit is verplicht in " -"een aantal landen (zoals bijvoorbeeld België), maar niet in alle landen. " -"Indien dit niet verplicht is in uw land, dient u dit veld altijd aangevinkt " -"te houden." - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,company_id:0 -msgid "Company" -msgstr "Bedijf" - -#. module: account_banking_sepa_direct_debit -#: model:ir.model,name:account_banking_sepa_direct_debit.model_banking_export_sdd_wizard -msgid "Export SEPA Direct Debit File" -msgstr "Exporteer SEPA incasso bestand" - -#. module: account_banking_sepa_direct_debit -#: help:banking.export.sdd,batch_booking:0 -#: help:banking.export.sdd.wizard,batch_booking:0 -msgid "" -"If true, the bank statement will display only one credit line for all the " -"direct debits of the SEPA file ; if false, the bank statement will display " -"one credit line per direct debit of the SEPA file." -msgstr "" -"Indien aangevinkt, zal het bankafschrift maar één credit regel weergeven " -"voor alle incasso's van het SEPA bestand. Indien niet aangevinkt wordt voor " -"iedere incasso een credit regel weergegeven op het bankafschrift." - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:225 -#, python-format -msgid "" -"Cannot validate the mandate '%s' because it is not attached to a bank " -"account." -msgstr "" -"Kan de machtiging '%s' niet bevestigen omdat deze niet is gekoppeld aan een " -"bankrekening." - -#. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd,state:0 -#: view:sdd.mandate:0 -#: selection:sdd.mandate,state:0 -msgid "Draft" -msgstr "Concept" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:290 -#, python-format -msgid "Mandate update" -msgstr "Machtiging bijwerken" - -#. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd,charge_bearer:0 -#: selection:banking.export.sdd.wizard,charge_bearer:0 -msgid "Shared" -msgstr "Gedeeld" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,batch_booking:0 -#: field:banking.export.sdd.wizard,batch_booking:0 -msgid "Batch Booking" -msgstr "Bach verwerking" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,sepa_migrated:0 -msgid "Migrated to SEPA" -msgstr "Gemigreerd naar SEPa" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,state:0 -msgid "Status" -msgstr "Status" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,total_amount:0 -#: field:banking.export.sdd.wizard,total_amount:0 -msgid "Total Amount" -msgstr "Totaalbedrag" - -#. module: account_banking_sepa_direct_debit -#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.action_account_banking_sdd -#: model:ir.ui.menu,name:account_banking_sepa_direct_debit.menu_account_banking_sdd -msgid "SEPA Direct Debit Files" -msgstr "SEPA incasso bestanden" - -#. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd,charge_bearer:0 -#: selection:banking.export.sdd.wizard,charge_bearer:0 -msgid "Following Service Level" -msgstr "Volg service level" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:233 -#, python-format -msgid "" -"The mandate '%s' can't have a date of last debit before the date of " -"signature." -msgstr "" -"De machtiging '%s' kan geen datum van laatste incasso hebben die eerder is " -"dan de datum van ondertekening." - -#. module: account_banking_sepa_direct_debit -#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_final -#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.recurrent_sequence_type_final -msgid "Sequence Type set to Final" -msgstr "Reeks soort ingesteld op definitief" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,message_is_follower:0 -msgid "Is a Follower" -msgstr "Is een volger" - -#. module: account_banking_sepa_direct_debit -#: help:sdd.mandate,original_mandate_identification:0 -msgid "" -"When the field 'Migrated to SEPA' is not active, this field will be used as " -"the Original Mandate Identification in the Direct Debit file." -msgstr "" -"Wanneer het veld 'gemigreerd naar SEPA' niet actief is, zal dit veld worden " -"gebruikt als de originele machtiging identificatie in het incasso bestand." - -#. module: account_banking_sepa_direct_debit -#: view:payment.order:0 -msgid "SDD Mandate" -msgstr "SDD machtiging" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,original_mandate_identification:0 -msgid "Original Mandate Identification" -msgstr "Originele machtiging indificatie" - -#. module: account_banking_sepa_direct_debit -#: model:ir.model,name:account_banking_sepa_direct_debit.model_res_company -msgid "Companies" -msgstr "Bedrijven" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,message_summary:0 -msgid "Summary" -msgstr "Samenvatting" - -#. module: account_banking_sepa_direct_debit -#: model:res.groups,name:account_banking_sepa_direct_debit.group_original_mandate_required -msgid "Original Mandate Required (SEPA)" -msgstr "Originele machtiging benodigd (SEPA)" - -#. module: account_banking_sepa_direct_debit -#: field:account.invoice,sdd_mandate_id:0 -#: model:ir.model,name:account_banking_sepa_direct_debit.model_sdd_mandate -#: field:payment.line,sdd_mandate_id:0 -#: view:sdd.mandate:0 -msgid "SEPA Direct Debit Mandate" -msgstr "SEPA incasso machtiging" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:193 -#, python-format -msgid "" -"Missing SEPA Direct Debit mandate on the payment line with partner '%s' and " -"Invoice ref '%s'." -msgstr "" -"Ontbrekende SEPA incasso machtiging op de betaalregel met relatie '%s' en " -"factuur referentie '%s'." - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:210 -#, python-format -msgid "" -"The mandate with reference '%s' for partner '%s' has type set to 'One-Off' " -"and it has a last debit date set to '%s', so we can't use it." -msgstr "" -"De machtiging referentie '%s' voor relatie %s' is ingesteld op 'eenmalig' en " -"de laatste incasso datum is ingesteld op '%s'. Zodoende kunnen we deze niet " -"gebruiken." - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,scan:0 -msgid "Scan of the Mandate" -msgstr "Scan van de machteging" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,last_debit_date:0 -msgid "Date of the Last Debit" -msgstr "Datum van laatste incasso" - -#. module: account_banking_sepa_direct_debit -#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.mandate_expired -msgid "Mandate Expired" -msgstr "Machtiging verlopen" - -#. module: account_banking_sepa_direct_debit -#: constraint:res.company:0 -msgid "Invalid SEPA Creditor Identifier." -msgstr "Ongeldige SEPA Incassant-ID." - -#. module: account_banking_sepa_direct_debit -#: model:ir.model,name:account_banking_sepa_direct_debit.model_res_partner_bank -msgid "Bank Accounts" -msgstr "Bankrekeningen" - -#. module: account_banking_sepa_direct_debit -#: model:ir.actions.act_window,help:account_banking_sepa_direct_debit.sdd_mandate_action -msgid "" -"

\n" -" Click to create a new SEPA Direct Debit Mandate.\n" -"

\n" -" A SEPA Direct Debit Mandate is a document signed by your customer " -"that gives you the autorization to do one or several direct debits on his " -"bank account.\n" -"

\n" -" " -msgstr "" -"

\n" -" Klik voor het maken van een nieuwe SEPA incasso machtiging.\n" -"

\n" -" Een SEPA incasso machtiging is een document ondertekend door uw " -"klant, welke u toestemming geeft om incasso's uit te voeren op zijn " -"bankrekening.\n" -"

\n" -" " - -#. module: account_banking_sepa_direct_debit -#: view:banking.export.sdd:0 -msgid "General Information" -msgstr "Algemene informatie" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -#: selection:sdd.mandate,state:0 -msgid "Valid" -msgstr "Geldig" - -#. module: account_banking_sepa_direct_debit -#: model:ir.model,name:account_banking_sepa_direct_debit.model_account_invoice -msgid "Invoice" -msgstr "Factuur" - -#. module: account_banking_sepa_direct_debit -#: view:banking.export.sdd.wizard:0 -#: view:sdd.mandate:0 -msgid "Cancel" -msgstr "Annuleer" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -#: field:sdd.mandate,payment_line_ids:0 -msgid "Related Payment Lines" -msgstr "Gerelateerde betaalregels" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -#: selection:sdd.mandate,type:0 -msgid "Recurrent" -msgstr "Terugkerend" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,type:0 -msgid "Type of Mandate" -msgstr "Soort machtiging" - -#. module: account_banking_sepa_direct_debit -#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.mandate_valid -msgid "Mandate Validated" -msgstr "Machtiging bevestigd" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,file:0 -msgid "SEPA File" -msgstr "SEPA bestand" - -#. module: account_banking_sepa_direct_debit -#: field:res.company,sepa_creditor_identifier:0 -msgid "SEPA Creditor Identifier" -msgstr "SEPA Incassant-ID" - -#. module: account_banking_sepa_direct_debit -#: model:ir.model,name:account_banking_sepa_direct_debit.model_banking_export_sdd -msgid "SEPA Direct Debit export" -msgstr "SEPA incasso export" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -#: selection:sdd.mandate,state:0 -msgid "Expired" -msgstr "Verlopen" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,partner_bank_id:0 -msgid "Bank Account" -msgstr "Bankrekening" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:254 -#, python-format -msgid "" -"You must set the 'Original Mandate Identification' on the recurrent mandate " -"'%s' which is not marked as 'Migrated to SEPA'." -msgstr "" -"U dient de 'Originele machtiging identificatie' in te stellen op de " -"herhalende machtiging '%s' welke niet is gemarkeerd als 'Gemigreerd naar " -"SEPA'" - -#. module: account_banking_sepa_direct_debit -#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_first -#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.recurrent_sequence_type_first -msgid "Sequence Type set to First" -msgstr "Reeks ingesteld op eerste" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:291 -#, python-format -msgid "" -"As you changed the bank account attached to this mandate, the 'Sequence " -"Type' has been set back to 'First'." -msgstr "" -"Omdat u de gekoppelde bankrekening heeft gewijzigd is de reeks terug gezet " -"naar 'Eerste'." - -#. module: account_banking_sepa_direct_debit -#: help:sdd.mandate,message_ids:0 -msgid "Messages and communication history" -msgstr "Berichten en communicatie historie" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -msgid "Search SEPA Direct Debit Mandates" -msgstr "Zoek SEPA incasso machtigingen" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd.wizard,file:0 -msgid "File" -msgstr "Bestand" diff --git a/account_banking_sepa_direct_debit/mandate_expire_cron.xml b/account_banking_sepa_direct_debit/mandate_expire_cron.xml deleted file mode 100644 index 4cb0693d2..000000000 --- a/account_banking_sepa_direct_debit/mandate_expire_cron.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - Set SEPA Direct Debit Mandates to Expired - - - 1 - days - -1 - - - - - - - - diff --git a/account_banking_sepa_direct_debit/res_partner_bank_view.xml b/account_banking_sepa_direct_debit/res_partner_bank_view.xml deleted file mode 100644 index 0b32e9f1c..000000000 --- a/account_banking_sepa_direct_debit/res_partner_bank_view.xml +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - sdd.mandate.res.partner.bank.form - res.partner.bank - - - - - - - - - - - - sdd.mandate.res.partner.bank.tree - res.partner.bank - - - - - - - - - - - sdd.mandate.partner.form - res.partner - - - - - - - - - - diff --git a/account_banking_sepa_direct_debit/sdd_mandate_view.xml b/account_banking_sepa_direct_debit/sdd_mandate_view.xml deleted file mode 100644 index bd1dd6e79..000000000 --- a/account_banking_sepa_direct_debit/sdd_mandate_view.xml +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - sdd.mandate.form - sdd.mandate - -
-
-
- -
-

- -

-
- - - - - - - - - - - - - - - -
-
- - -
-
-
-
- - - sdd.mandate.tree - sdd.mandate - - - - - - - - - - - - - - - sdd.mandate.search - sdd.mandate - - - - - - - - - - - - - - - SEPA Direct Debit Mandates - sdd.mandate - form - tree,form - -

- Click to create a new SEPA Direct Debit Mandate. -

- A SEPA Direct Debit Mandate is a document signed by your customer that gives you the autorization to do one or several direct debits on his bank account. -

-
-
- - - - - - Mandate Validated - sdd.mandate - - SEPA Direct Debit Mandate Validated - - - - Mandate Expired - sdd.mandate - - SEPA Direct Debit Mandate has Expired - - - - Mandate Cancelled - sdd.mandate - - SEPA Direct Debit Mandate Cancelled - - - - Sequence Type set to First - sdd.mandate - - Sequence Type set to First - - - - Sequence Type set to Recurring - sdd.mandate - - Sequence Type set to Recurring - - - - Sequence Type set to Final - sdd.mandate - - Sequence Type set to Final - - -
-
diff --git a/account_banking_sepa_direct_debit/security/ir.model.access.csv b/account_banking_sepa_direct_debit/security/ir.model.access.csv deleted file mode 100644 index cf78ffb59..000000000 --- a/account_banking_sepa_direct_debit/security/ir.model.access.csv +++ /dev/null @@ -1,4 +0,0 @@ -"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" -"access_banking_export_sdd","Full access on banking.export.sdd","model_banking_export_sdd","account_payment.group_account_payment",1,1,1,1 -"access_sdd_mandate","Full access on sdd.mandate","model_sdd_mandate","account_payment.group_account_payment",1,1,1,1 -"access_sdd_mandate_read","Read access on sdd.mandate","model_sdd_mandate","base.group_user",1,0,0,0 diff --git a/account_banking_sepa_direct_debit/security/original_mandate_required_security.xml b/account_banking_sepa_direct_debit/security/original_mandate_required_security.xml deleted file mode 100644 index e6a8570cf..000000000 --- a/account_banking_sepa_direct_debit/security/original_mandate_required_security.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - Original Mandate Required (SEPA) - - - - - diff --git a/account_banking_sepa_direct_debit/sepa_direct_debit_demo.xml b/account_banking_sepa_direct_debit/sepa_direct_debit_demo.xml deleted file mode 100644 index 220261088..000000000 --- a/account_banking_sepa_direct_debit/sepa_direct_debit_demo.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - SEPA Direct Debit La Banque Postale - - - - - - - - FR78ZZZ424242 - - - - - recurrent - first - 2014-02-01 - valid - - - - diff --git a/account_banking_sepa_direct_debit/static/src/img/icon.png b/account_banking_sepa_direct_debit/static/src/img/icon.png deleted file mode 100644 index 6d1d923b6506b33ca0825af17ed0ae36c9bd0dc6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6892 zcmVPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i*$` z7B3e|!Eq@702*vbL_t(|+RdAHcwFVR?tgpFo<5^8Ga8M0v1A#^k}b=Yja)D`;hH!h zp@cw^OL9)Yq+CcN<6E5%AqMj|;G$)Txm zv~I!^I(n+U|IaV%J#*-PEC8EIvy(P$%HNgdO88Wo)4Jx^$zJiqnE@oNL}_sbt5#-` zn{6jC!MNykqR|+A0~0j24O4rvo6#{JPP>^cm3fMya-x68^T%U{J0Cw#*ERV+0)Xw? z^PE*Hm)%;JXZu1R7){^3zgZMD8a}eEn2qa~A&T!EDNduL$l2G| z?|I^Ib>}0m9&R7`rvY&Lm$vLGD@wn^;}2!--hWoi&vSCawd=523?E3mswy0=Zs#vA zoun|&&brdfuKK2dAOG~%haUe>0oZjz#fp-mjE6JR61P43w|dd#O5!uut;cB4@?ovo zQ$0NQ{Bb_Au|UyC!v5;ou3Mk^+v&3(H~?R}sp@l8Yx3{!=oxn%sq5p*|9S~&uEY<; z=<3=oDl2klUdLhz&puy6PtO=1-C8(wx_RhpKY8?x=ibRRHSgrhKe+w!`!|&5-t)J8 zO$jE8iLc(g^#gPF`Bo?##g=Sl+#MhkiefhDDJ#h!H^;$m|5#(WxIF8s%JMAJKMuF= zdtU*ls6e{y3s*c@R+N6rZ(lg6`Q*peu(_)6JsINC$> zNhT&HgP;mn%z8%0{G_=O*>rIsFYKuov(u8Qwr?!RaR*!X3=X2a=MdPs73ou#eexMs ziuLN>zgRDR`R1)SY?gOqY+y`e0MUY=F=MeNqS0tTRZ&$1k7p7^_M^o7sPY7A z%#FnmMHJ)L@cF~+ef=z18A+^NoilUoqcxpuSerNV`oEt!g59jeYSI7cg#$0%aNq#) zdjjCc-`(+KNs;TuXZ}_%e&yy%m+bP9D8z(xM13|%wroUEL`4NuR7IKon;8I9Rh@pR z#NPw_zA?gqZgj#3MtzKl$sk&-hSv5GBGDL?YjO!rg)y7-^z^yO&a?sWm)&((w4f^L z2#y}Y&K93A-N&ee=ehSBM@H+}zGm)-xa za=>@Ly7l^XtFrFfeV|2i-L;k2lFS#}@Kn@}*>NdJjv^$jVLGPO_yIn>dVBi_27_2E z=U-1<;P1GHXfzTAlbyCsFDWSw%=$1Ula8J~H^=L`iOMp|3sNx|bcDk)k%-Ki)j7O= zq+KXpmQq=iXKy-G)7`ja57>1>#fplOjGxvu4oaJ<3Q0{#Sk!PiCJ>d%NX^}e+2WXo zz^L^0_HpRYVVav;@cDf2$|EF6OHxWX<5Rf=L-7bU8?@Mx%=Gk45Q`}cjd+>#1OfQp z*KgopZMRf*QTl^7UbSlZk^v~aDC=QaQJoQ0q~xNE#f?`abV=JtNn0}~iw6P$nwy(B z@cJ8^ZEhhH3Zbeh$;rv@=>*BiDZ&?7hR%@4%Hj-s{s?uadpTCyg(Qh6(@rFc0-wIR zlDej$^tG#V9$r!ieCNxT?pj-xdFz`ed&TRnUdLi5Q&iSrw0#6?Vg{ht1qR|*5V_pC@ZYZRobyQqkoPNjFisiFnR675~=CXpXI_;Lsu0fxepPRCv z@rnZarnWu>U9ir4EU5{b~()`rL9o%7qI`kM zNfN56@Vlq~fXCxy-)n#2uP^Qa;MLdu!6jR&`0Qt{QhlQIW@n4;oLanAmJf|bXA^(0MA&0KTMm3;Xt-=wiIUei=U3aaCS0QF(oH@4m@s#B4U9 zo|hB;_=l%BR$as1egELb&wq(MFFnVmEjxJW#b-%OOh8o>+S)qs`vW}rn}=|vrlP6} zimLGYXJ6okPhZ8vq=(*qHxZ=(gE)#t6zCtEM3!TetVl_Vs0p-u~@s;UrEVmRzJ1Odjz-8k%abUF?F{R6}TC(%kWvaFDn znutz!E+NXY!ttXmihDBfz#aF!@@)|y$zrH-dx9)4T=?#)8Ykui*OG|JeD0r=lz=2j z7m&PE#>Xe-yl*rZiALpFNmo%6L{WpmU?4Lijo!X~Iy!qm5Qzzn>0?ryVTI?|q=-4e zAX=^ZDgbePSw^PQVJQnm6mhX)M`tNmGE;NA-E-rA3G8opWCWkji`P4wDx1wF91a`V zS(!wmQ2-JX6H%1dIoGzB(CM@Yf`A}7h{fVQ6pBRW<{h05m)*L$;-VavSW%X}Ex~Hg znHDi#RRt`G1xq$QcHYL`y0bQ$eZk)}Hl1b16;~6Q3Zo)$@utgXeV&+@fJP(Y_4+Ux zjWeM#JTe+5N$p*PLlNYtJZ+$fsA8PqERo3U{n%|*bUKY;?Hbo*qSIwv24FE87CHJ7 z(dtY~0$_aHJ*OtnXf)XE^Ls!z9A?j+S1B)F6|WFgm1BqZ&Kp+2;1r38Rzl%0$;nCN z=48bUmNZCO39artQC6@{eZg~GT}Q+ZU+pnWAtON)Q^JnnBYnJ}4*^LjvW@kP|0sAJ3KDxz|XhBJ*6m#m<^p^>XTu@j@w z$jQ3XJo?B3yuAB4{_^}&05qIwV$;UT8RG$JYU;?%%{rF?G$IjMo#`LUsb>TMK@v@( zMkAW^+6#1agr&6)CfxJI|NP-|*=1Y#Kev99y1IHcZ>~Zk3Y=+dV&@f?Q(Iey#bV** zSN5@b)k?m4+qb!5=XLBqaEMd&4eYpl8@GM^4t8GoS@yiLm!6(JoT(|?e9P?&3=E%_ z2Q-X~`Z#r_pA+@H3=VtFM*xi=ScJ##xn?js%jR@tITs}OCg-)7ttlvqf*>$26AXt# z?B9QYxHqY&N?gb&E?z;JEA=g2x1cIKF)>LX5I`e|bai$!G(1Yhnle;HrLplW7Zn%L z($b2-U?3|q9Tk-mC+b;KUdqVG810>1tgkGmq2VkA%W}{g^mLwmjc{m+43Ac~dv;9M2ET#m{S8V1d0`d~#e{@cfq^b%|r*lc(qtok%#bQLGG8&Br zqap6zo!vc@l*ARJNJK``NV8a7ykiu?F#Y|g97B>M!r=&G6Fzct?C5k7MuV1&v_u95 zJu{+4OjZ42OjUz#v8DxifE;{R>@P7f5lLEF_?V1FT&`5)XcRdXBQO=B`uGWa=dr>- zAb`aZ&qu-F6lQb$sEdRn#N-%tb!S+XpM@kzOiXxiIV>z+<|KW(cPR)0k%&C4O(?`< zB`AXG7J-S$z{1Cy?0Z+|zs+V_GJj}nYUavMT#q1%$k7-sr-RCMYi8v0uC5+_^1vgQ zEoP!o8L!um)oNkqm7gUXj*^j)77t1Ftv!c$d+Ff|L@*e&(_n@`z%5QqMSCPkWNIq1 zu>L1|7Tvth=O+{j&7r?``@#T(!(oPoMsT|)h(@CvJb0Lm8#kaTDxuI68clqoxjET1 zx3+Qc&7%|*6{68-$j;8d7x3e-+t~f$(*%M+%oZ~#4m*AQgK_Yabol%cqSGWO7E>7- z@sOPv=OmGktONql9w`u(I{>1Qh2uOD7+4g5(b183>+8Ho5;YoZHe0;Bov+d9@gd7m zt@N73>ET3g#GDK4V6whoueNq%lNu~>|; zF*hx(?L76{=XmgEchhv%PitEz*)Ek8g{jokbz`?#@OXn1U77kTL6$7t{9WYwxt5)!Ta?&&}9 zgCE|@8wU?_#g31#e0d=a4NWvOH1YfkyUEVVL?cOjao0CUNKD|FXJ4SRtB1S(<337? zizqC}Lm*D4FJ6~VYKoP0<+)^}B~5FIqgYH@dWR?5#QM_%`#rv?NN6g$;87q5Dt=Gf zyq^W9rsj?R#nNg|PcH_8o}d5xF>b!;3%FdVtSl);r_=GXpZ$`?re-3M2(RrufZ1%~ zc+Cmyb{luy^=(c!G!YI**t_?2%2$`NEI)@!w{GOlJHEl)Km2a|R0w*J!ya_g%JAC< zv%;Y;et#r%;^fGF@y(OH14CoJx>UQ7p5F0=!@xg301c-b=I!hIyuKNg=k2*65{c)V z*4B0k3zyN*(8#)VYlz7TjZMw`_4%i1s6WE-WBUO(c<3nk`MG!|y%ZMYV>IfiJJrCl z{9FbGhdEwTM_z6=k#GdPPDfg*NKs)b&XoBnd}u1n@VKw8wyAqa1PJ(|hjm(sfdTiz zWH2^Dz&mta40||steVNm`KQ&Q(I}_t>*s*r_4?3HQ`n6gH}D_d{}GK%&8%Bjfuh8? z>XSRU=DN?bvg~4d`}zTRzgwq zOec)so(wWN<|7oEEr^Vb`w>-D@dQGLW;DT1?I_vw`RglRZ||94%Oxe^d>x@lPmobh zB8J3rCMG5cO$CY5LiIdN@O-uxXM&QXA;n?GY&K&uo3PuH85!tQ0pBo**$Cx{XYSN&d~BYBs;{(&?ibfX24bo{j5rcV?$2rFZmB3iAy;b##w2;U2~pG=Lz1 zsv=1ef+!G+#fZfeWla-l)q>am0q99^4 z>abYM)4V~QAuZ?k2Hz4pe11RO-MtJBk5E{UKl44UR?E~>5Tn?M$sjU1?x($T42Rt^ zlM7T8T3Y(?`9jqXJod&9X7vSn`zHTfkmFc8*fIjE=k^AQi(J#{kV;Cp1|_)^>P1x+eb1VKdRx)W>2sM4dW~XQGpT*7EuNjEsz(OSq9K#8@w)2#1cf zQ(M;qz~Jz?1byIOGt2YrN_UU@H^+{(dFO49AFJ(ncx2qyQ&yC!?EOdM!U~ZH;fdD? z`iB200C*<7jE%dei#i!Oa1xh8k03yDk_oGIw!j+*Mi?EQBovmrUOCqEiv{NcUOw11 zcB*mk?xX|*UXPz~_re8|MvUSgc@^JzN8^XRVsZpI*ojdW!erK?s*viil46gK@vU4D zpKf_^PaPMp$x==>^xb{rNS}Mr5t*Mn_Qn$}9bmo*#f(sQcNbQ}C`rZvtY(S!u2Gs=hDmW)>Fsy3EH5RV z11tvofiO?~{!OmfvOIF6rfb))eqViX$p8QxuIWCrJlB!1wk&Hyd*`U&3r5LIPriUR zOc4pRpxbi^z^$Q{r7ubxqZ?7UMSvVP1`Fe37I8T6*((v>bix2Vc(+R zaIPN+TG59_>0@&IEJ6PWp`edwBt$4Iqc<35866A;3HU|{1%?QC+nMq-U=({WXnklU z6`w!M;p%o|S)sHzgA}_3lSxP4z+@Z%qmD7RpNAja&-EWGRl55op8x9`FWuDDwfMyN zk{+0-s6hJEWmo)a^~#JJ51;532gick@-JIvRM~gB6h*}!lu=bNt|TckMuRwKvg_@u z{!Blq&IHUR9o>CyN{Z6(`9fH&25L|Bu;-OieE#YRrLk@3iC2!i{N)QxiZ96n00sw9 z_P*Kn*P>+(8XJpR<1!iu7_clE%8APDGn8Vq_7y-q-{*UStuEh@c_`N_|9 z%!HH0tVfbWo_h8O1HGeMvtwoC#F>Hn?!5o+U%$|ue@6hkwf=FqeP3!yLQ7tzZPUeT zvdvFDS1q)(k5F2iu_OcD>vFpTq&O^SG$IzWp1RY0JowAKtS`$@iVITv57l&k>7GaS zKm1Ovsd=ZHIC`S{j80;Y$)qp3d~;!*2GRyK(-j~PZ7FsC|%XG73jE5iF zk9*9^jaQc|V-tZ_4;TO1sk|iP-%{+B+@mMD#Y45-tXZAI z&dWJSP9G?v0 z4@L=vqR5JZ$*9AqldxEHWTqyNnU&-T=)lS5-hmHtfBzqpiy;_LBaChU0000 -# -# 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 . import export_sdd diff --git a/account_banking_sepa_direct_debit/wizard/export_sdd.py b/account_banking_sepa_direct_debit/wizard/export_sdd.py deleted file mode 100644 index 19520d318..000000000 --- a/account_banking_sepa_direct_debit/wizard/export_sdd.py +++ /dev/null @@ -1,451 +0,0 @@ -# -*- encoding: utf-8 -*- -############################################################################## -# -# SEPA Direct Debit module for OpenERP -# Copyright (C) 2013 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 . -# -############################################################################## - - -from openerp.osv import orm, fields -from openerp.tools.translate import _ -from openerp import netsvc -from datetime import datetime -from lxml import etree - - -class banking_export_sdd_wizard(orm.TransientModel): - _name = 'banking.export.sdd.wizard' - _inherit = ['banking.export.pain'] - _description = 'Export SEPA Direct Debit File' - _columns = { - 'state': fields.selection([ - ('create', 'Create'), - ('finish', 'Finish'), - ], 'State', readonly=True), - 'batch_booking': fields.boolean( - 'Batch Booking', - help="If true, the bank statement will display only one credit " - "line for all the direct debits of the SEPA file ; if false, " - "the bank statement will display one credit line per direct " - "debit of the SEPA file."), - 'charge_bearer': fields.selection([ - ('SLEV', 'Following Service Level'), - ('SHAR', 'Shared'), - ('CRED', 'Borne by Creditor'), - ('DEBT', 'Borne by Debtor'), - ], 'Charge Bearer', required=True, - help="Following service level : transaction charges are to be " - "applied following the rules agreed in the service level and/or " - "scheme (SEPA Core messages must use this). Shared : transaction " - "charges on the creditor side are to be borne by the creditor, " - "transaction charges on the debtor side are to be borne by the " - "debtor. Borne by creditor : all transaction charges are to be " - "borne by the creditor. Borne by debtor : all transaction " - "charges are to be borne by the debtor."), - 'nb_transactions': fields.related( - 'file_id', 'nb_transactions', type='integer', - string='Number of Transactions', readonly=True), - 'total_amount': fields.related( - 'file_id', 'total_amount', type='float', string='Total Amount', - readonly=True), - 'file_id': fields.many2one( - 'banking.export.sdd', 'SDD File', readonly=True), - 'file': fields.related( - 'file_id', 'file', string="File", type='binary', readonly=True), - 'filename': fields.related( - 'file_id', 'filename', string="Filename", type='char', size=256, - readonly=True), - 'payment_order_ids': fields.many2many( - 'payment.order', 'wiz_sdd_payorders_rel', 'wizard_id', - 'payment_order_id', 'Payment Orders', readonly=True), - } - - _defaults = { - 'charge_bearer': 'SLEV', - 'state': 'create', - } - - def create(self, cr, uid, vals, context=None): - payment_order_ids = context.get('active_ids', []) - vals.update({ - 'payment_order_ids': [[6, 0, payment_order_ids]], - }) - return super(banking_export_sdd_wizard, self).create( - cr, uid, vals, context=context) - - def _get_previous_bank(self, cr, uid, payline, context=None): - payline_obj = self.pool['payment.line'] - previous_bank = False - payline_ids = payline_obj.search( - cr, uid, [ - ('sdd_mandate_id', '=', payline.sdd_mandate_id.id), - ('bank_id', '!=', payline.bank_id.id), - ], - context=context) - if payline_ids: - older_lines = payline_obj.browse( - cr, uid, payline_ids, context=context) - previous_date = False - previous_payline_id = False - for older_line in older_lines: - older_line_date_sent = older_line.order_id.date_sent - if (older_line_date_sent - and older_line_date_sent > previous_date): - previous_date = older_line_date_sent - previous_payline_id = older_line.id - if previous_payline_id: - previous_payline = payline_obj.browse( - cr, uid, previous_payline_id, context=context) - previous_bank = previous_payline.bank_id - return previous_bank - - def create_sepa(self, cr, uid, ids, context=None): - ''' - Creates the SEPA Direct Debit file. That's the important code ! - ''' - sepa_export = self.browse(cr, uid, ids[0], context=context) - - pain_flavor = sepa_export.payment_order_ids[0].mode.type.code - convert_to_ascii = \ - sepa_export.payment_order_ids[0].mode.convert_to_ascii - if pain_flavor == 'pain.008.001.02': - bic_xml_tag = 'BIC' - name_maxsize = 70 - root_xml_tag = 'CstmrDrctDbtInitn' - elif pain_flavor == 'pain.008.001.03': - bic_xml_tag = 'BICFI' - name_maxsize = 140 - root_xml_tag = 'CstmrDrctDbtInitn' - elif pain_flavor == 'pain.008.001.04': - bic_xml_tag = 'BICFI' - name_maxsize = 140 - root_xml_tag = 'CstmrDrctDbtInitn' - else: - raise orm.except_orm( - _('Error:'), - _("Payment Type Code '%s' is not supported. The only " - "Payment Type Code supported for SEPA Direct Debit " - "are 'pain.008.001.02', 'pain.008.001.03' and " - "'pain.008.001.04'.") % pain_flavor) - - gen_args = { - 'bic_xml_tag': bic_xml_tag, - 'name_maxsize': name_maxsize, - 'convert_to_ascii': convert_to_ascii, - 'payment_method': 'DD', - 'pain_flavor': pain_flavor, - 'sepa_export': sepa_export, - 'file_obj': self.pool['banking.export.sdd'], - 'pain_xsd_file': - 'account_banking_sepa_direct_debit/data/%s.xsd' % pain_flavor, - } - - pain_ns = { - 'xsi': 'http://www.w3.org/2001/XMLSchema-instance', - None: 'urn:iso:std:iso:20022:tech:xsd:%s' % pain_flavor, - } - - xml_root = etree.Element('Document', nsmap=pain_ns) - pain_root = etree.SubElement(xml_root, root_xml_tag) - - # A. Group header - group_header_1_0, nb_of_transactions_1_6, control_sum_1_7 = \ - self.generate_group_header_block( - cr, uid, pain_root, gen_args, context=context) - - transactions_count_1_6 = 0 - total_amount = 0.0 - amount_control_sum_1_7 = 0.0 - lines_per_group = {} - # key = (requested_date, priority, sequence type) - # value = list of lines as objects - # Iterate on payment orders - today = fields.date.context_today(self, cr, uid, context=context) - for payment_order in sepa_export.payment_order_ids: - total_amount = total_amount + payment_order.total - # Iterate each payment lines - for line in payment_order.line_ids: - transactions_count_1_6 += 1 - priority = line.priority - if payment_order.date_prefered == 'due': - requested_date = line.ml_maturity_date or today - elif payment_order.date_prefered == 'fixed': - requested_date = payment_order.date_scheduled or today - else: - requested_date = today - if not line.sdd_mandate_id: - raise orm.except_orm( - _('Error:'), - _("Missing SEPA Direct Debit mandate on the payment " - "line with partner '%s' and Invoice ref '%s'.") - % (line.partner_id.name, - line.ml_inv_ref.number)) - if line.sdd_mandate_id.state != 'valid': - raise orm.except_orm( - _('Error:'), - _("The SEPA Direct Debit mandate with reference '%s' " - "for partner '%s' has expired.") - % (line.sdd_mandate_id.unique_mandate_reference, - line.sdd_mandate_id.partner_id.name)) - if line.sdd_mandate_id.type == 'oneoff': - if not line.sdd_mandate_id.last_debit_date: - seq_type = 'OOFF' - else: - raise orm.except_orm( - _('Error:'), - _("The mandate with reference '%s' for partner " - "'%s' has type set to 'One-Off' and it has a " - "last debit date set to '%s', so we can't use " - "it.") - % (line.sdd_mandate_id.unique_mandate_reference, - line.sdd_mandate_id.partner_id.name, - line.sdd_mandate_id.last_debit_date)) - elif line.sdd_mandate_id.type == 'recurrent': - seq_type_map = { - 'recurring': 'RCUR', - 'first': 'FRST', - 'final': 'FNAL', - } - seq_type_label = \ - line.sdd_mandate_id.recurrent_sequence_type - assert seq_type_label is not False - seq_type = seq_type_map[seq_type_label] - - key = (requested_date, priority, seq_type) - if key in lines_per_group: - lines_per_group[key].append(line) - else: - lines_per_group[key] = [line] - # Write requested_exec_date on 'Payment date' of the pay line - if requested_date != line.date: - self.pool['payment.line'].write( - cr, uid, line.id, - {'date': requested_date}, context=context) - - for (requested_date, priority, sequence_type), lines in \ - lines_per_group.items(): - # B. Payment info - payment_info_2_0, nb_of_transactions_2_4, control_sum_2_5 = \ - self.generate_start_payment_info_block( - cr, uid, pain_root, - "sepa_export.payment_order_ids[0].reference + '-' + " - "sequence_type + '-' + requested_date.replace('-', '') " - "+ '-' + priority", - priority, 'CORE', sequence_type, requested_date, { - 'sepa_export': sepa_export, - 'sequence_type': sequence_type, - 'priority': priority, - 'requested_date': requested_date, - }, gen_args, context=context) - - self.generate_party_block( - cr, uid, payment_info_2_0, 'Cdtr', 'B', - 'sepa_export.payment_order_ids[0].mode.bank_id.partner_id.' - 'name', - 'sepa_export.payment_order_ids[0].mode.bank_id.acc_number', - 'sepa_export.payment_order_ids[0].mode.bank_id.bank.bic', - {'sepa_export': sepa_export}, - gen_args, context=context) - - charge_bearer_2_24 = etree.SubElement(payment_info_2_0, 'ChrgBr') - charge_bearer_2_24.text = sepa_export.charge_bearer - - creditor_scheme_identification_2_27 = etree.SubElement( - payment_info_2_0, 'CdtrSchmeId') - self.generate_creditor_scheme_identification( - cr, uid, creditor_scheme_identification_2_27, - 'sepa_export.payment_order_ids[0].company_id.' - 'sepa_creditor_identifier', - 'SEPA Creditor Identifier', {'sepa_export': sepa_export}, - 'SEPA', gen_args, context=context) - - transactions_count_2_4 = 0 - amount_control_sum_2_5 = 0.0 - for line in lines: - transactions_count_2_4 += 1 - # C. Direct Debit Transaction Info - dd_transaction_info_2_28 = etree.SubElement( - payment_info_2_0, 'DrctDbtTxInf') - payment_identification_2_29 = etree.SubElement( - dd_transaction_info_2_28, 'PmtId') - end2end_identification_2_31 = etree.SubElement( - payment_identification_2_29, 'EndToEndId') - end2end_identification_2_31.text = self._prepare_field( - cr, uid, 'End to End Identification', 'line.name', - {'line': line}, 35, - gen_args=gen_args, context=context) - currency_name = self._prepare_field( - cr, uid, 'Currency Code', 'line.currency.name', - {'line': line}, 3, gen_args=gen_args, - context=context) - instructed_amount_2_44 = etree.SubElement( - dd_transaction_info_2_28, 'InstdAmt', Ccy=currency_name) - instructed_amount_2_44.text = '%.2f' % line.amount_currency - amount_control_sum_1_7 += line.amount_currency - amount_control_sum_2_5 += line.amount_currency - dd_transaction_2_46 = etree.SubElement( - dd_transaction_info_2_28, 'DrctDbtTx') - mandate_related_info_2_47 = etree.SubElement( - dd_transaction_2_46, 'MndtRltdInf') - mandate_identification_2_48 = etree.SubElement( - mandate_related_info_2_47, 'MndtId') - mandate_identification_2_48.text = self._prepare_field( - cr, uid, 'Unique Mandate Reference', - 'line.sdd_mandate_id.unique_mandate_reference', - {'line': line}, 35, - gen_args=gen_args, context=context) - mandate_signature_date_2_49 = etree.SubElement( - mandate_related_info_2_47, 'DtOfSgntr') - mandate_signature_date_2_49.text = self._prepare_field( - cr, uid, 'Mandate Signature Date', - 'line.sdd_mandate_id.signature_date', - {'line': line}, 10, - gen_args=gen_args, context=context) - if sequence_type == 'FRST' and ( - line.sdd_mandate_id.last_debit_date or - not line.sdd_mandate_id.sepa_migrated): - previous_bank = self._get_previous_bank( - cr, uid, line, context=context) - if previous_bank or not line.sdd_mandate_id.sepa_migrated: - amendment_indicator_2_50 = etree.SubElement( - mandate_related_info_2_47, 'AmdmntInd') - amendment_indicator_2_50.text = 'true' - amendment_info_details_2_51 = etree.SubElement( - mandate_related_info_2_47, 'AmdmntInfDtls') - if previous_bank: - if previous_bank.bank.bic == line.bank_id.bank.bic: - ori_debtor_account_2_57 = etree.SubElement( - amendment_info_details_2_51, 'OrgnlDbtrAcct') - ori_debtor_account_id = etree.SubElement( - ori_debtor_account_2_57, 'Id') - ori_debtor_account_iban = etree.SubElement( - ori_debtor_account_id, 'IBAN') - ori_debtor_account_iban.text = self._validate_iban( - cr, uid, self._prepare_field( - cr, uid, 'Original Debtor Account', - 'previous_bank.acc_number', - {'previous_bank': previous_bank}, - gen_args=gen_args, - context=context), - context=context) - else: - ori_debtor_agent_2_58 = etree.SubElement( - amendment_info_details_2_51, 'OrgnlDbtrAgt') - ori_debtor_agent_institution = etree.SubElement( - ori_debtor_agent_2_58, 'FinInstnId') - ori_debtor_agent_bic = etree.SubElement( - ori_debtor_agent_institution, bic_xml_tag) - ori_debtor_agent_bic.text = self._prepare_field( - cr, uid, 'Original Debtor Agent', - 'previous_bank.bank.bic', - {'previous_bank': previous_bank}, - gen_args=gen_args, - context=context) - ori_debtor_agent_other = etree.SubElement( - ori_debtor_agent_institution, 'Othr') - ori_debtor_agent_other_id = etree.SubElement( - ori_debtor_agent_other, 'Id') - ori_debtor_agent_other_id.text = 'SMNDA' - # SMNDA = Same Mandate New Debtor Agent - elif not line.sdd_mandate_id.sepa_migrated: - ori_mandate_identification_2_52 = etree.SubElement( - amendment_info_details_2_51, 'OrgnlMndtId') - ori_mandate_identification_2_52.text = \ - self._prepare_field( - cr, uid, 'Original Mandate Identification', - 'line.sdd_mandate_id.' - 'original_mandate_identification', - {'line': line}, - gen_args=gen_args, - context=context) - ori_creditor_scheme_id_2_53 = etree.SubElement( - amendment_info_details_2_51, 'OrgnlCdtrSchmeId') - self.generate_creditor_scheme_identification( - cr, uid, ori_creditor_scheme_id_2_53, - 'sepa_export.payment_order_ids[0].company_id.' - 'original_creditor_identifier', - 'Original Creditor Identifier', - {'sepa_export': sepa_export}, - 'SEPA', gen_args, context=context) - - self.generate_party_block( - cr, uid, dd_transaction_info_2_28, 'Dbtr', 'C', - 'line.partner_id.name', - 'line.bank_id.acc_number', - 'line.bank_id.bank.bic', - {'line': line}, gen_args, context=context) - - self.generate_remittance_info_block( - cr, uid, dd_transaction_info_2_28, - line, gen_args, context=context) - - nb_of_transactions_2_4.text = str(transactions_count_2_4) - control_sum_2_5.text = '%.2f' % amount_control_sum_2_5 - nb_of_transactions_1_6.text = str(transactions_count_1_6) - control_sum_1_7.text = '%.2f' % amount_control_sum_1_7 - - return self.finalize_sepa_file_creation( - cr, uid, ids, xml_root, total_amount, transactions_count_1_6, - gen_args, context=context) - - def cancel_sepa(self, cr, uid, ids, context=None): - ''' - Cancel the SEPA file: just drop the file - ''' - sepa_export = self.browse(cr, uid, ids[0], context=context) - self.pool.get('banking.export.sdd').unlink( - cr, uid, sepa_export.file_id.id, context=context) - return {'type': 'ir.actions.act_window_close'} - - def save_sepa(self, cr, uid, ids, context=None): - ''' - Save the SEPA Direct Debit file: mark all payments in the file - as 'sent'. Write 'last debit date' on mandate and set oneoff - mandate to expired - ''' - sepa_export = self.browse(cr, uid, ids[0], context=context) - self.pool.get('banking.export.sdd').write( - cr, uid, sepa_export.file_id.id, {'state': 'sent'}, - context=context) - wf_service = netsvc.LocalService('workflow') - for order in sepa_export.payment_order_ids: - wf_service.trg_validate(uid, 'payment.order', order.id, 'done', cr) - mandate_ids = [line.sdd_mandate_id.id for line in order.line_ids] - self.pool['sdd.mandate'].write( - cr, uid, mandate_ids, - {'last_debit_date': datetime.today().strftime('%Y-%m-%d')}, - context=context) - to_expire_ids = [] - first_mandate_ids = [] - for line in order.line_ids: - if line.sdd_mandate_id.type == 'oneoff': - to_expire_ids.append(line.sdd_mandate_id.id) - elif line.sdd_mandate_id.type == 'recurrent': - seq_type = line.sdd_mandate_id.recurrent_sequence_type - if seq_type == 'final': - to_expire_ids.append(line.sdd_mandate_id.id) - elif seq_type == 'first': - first_mandate_ids.append(line.sdd_mandate_id.id) - self.pool['sdd.mandate'].write( - cr, uid, to_expire_ids, {'state': 'expired'}, context=context) - self.pool['sdd.mandate'].write( - cr, uid, first_mandate_ids, { - 'recurrent_sequence_type': 'recurring', - 'sepa_migrated': True, - }, context=context) - return {'type': 'ir.actions.act_window_close'} diff --git a/account_banking_sepa_direct_debit/wizard/export_sdd_view.xml b/account_banking_sepa_direct_debit/wizard/export_sdd_view.xml deleted file mode 100644 index 3699de91c..000000000 --- a/account_banking_sepa_direct_debit/wizard/export_sdd_view.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - banking.export.sdd.wizard.view - banking.export.sdd.wizard - -
- - - - - - - - - - - -
-
- -
-
- -
-
From e89b7a59df6602032b22d4a3889cc4755b313211 Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Wed, 10 Sep 2014 12:48:09 +0200 Subject: [PATCH 033/118] Migration and enhancement of all modules involved in SEPA --- account_banking_sepa_direct_debit/__init__.py | 24 + .../__openerp__.py | 65 ++ .../account_banking_sdd.py | 440 +++++++++ .../account_banking_sdd_view.xml | 77 ++ .../account_invoice_view.xml | 22 + .../account_payment_view.xml | 26 + account_banking_sepa_direct_debit/company.py | 90 ++ .../company_view.xml | 23 + .../data/mandate_expire_cron.xml | 26 + .../data/mandate_reference_sequence.xml | 21 + .../data/pain.008.001.02.xsd | 879 +++++++++++++++++ .../data/pain.008.001.03.xsd | 925 ++++++++++++++++++ .../data/pain.008.001.04.xsd | 892 +++++++++++++++++ .../data/payment_type_sdd.xml | 35 + .../demo/sepa_direct_debit_demo.xml | 27 + .../account_banking_sepa_direct_debit.pot | 633 ++++++++++++ account_banking_sepa_direct_debit/i18n/fr.po | 749 ++++++++++++++ account_banking_sepa_direct_debit/i18n/nl.po | 754 ++++++++++++++ .../mandate_expire_cron.xml | 26 + .../models/__init__.py | 28 + .../models/account_invoice.py | 32 + .../models/banking_export_sdd.py | 78 ++ .../models/payment_line.py | 74 ++ .../models/res_company.py | 80 ++ .../models/res_partner_bank.py | 30 + .../models/sdd_mandate.py | 291 ++++++ .../res_partner_bank_view.xml | 48 + .../sdd_mandate_view.xml | 152 +++ .../security/ir.model.access.csv | 4 + .../original_mandate_required_security.xml | 17 + .../sepa_direct_debit_demo.xml | 27 + .../static/description/icon.svg | 92 ++ .../static/src/img/icon.png | Bin 0 -> 6892 bytes .../views/account_banking_sdd_view.xml | 77 ++ .../views/account_invoice_view.xml | 22 + .../views/account_payment_view.xml | 26 + .../views/res_company_view.xml | 23 + .../views/res_partner_bank_view.xml | 48 + .../views/sdd_mandate_view.xml | 153 +++ .../wizard/__init__.py | 23 + .../wizard/export_sdd.py | 451 +++++++++ .../wizard/export_sdd_view.xml | 37 + 42 files changed, 7547 insertions(+) create mode 100644 account_banking_sepa_direct_debit/__init__.py create mode 100644 account_banking_sepa_direct_debit/__openerp__.py create mode 100644 account_banking_sepa_direct_debit/account_banking_sdd.py create mode 100644 account_banking_sepa_direct_debit/account_banking_sdd_view.xml create mode 100644 account_banking_sepa_direct_debit/account_invoice_view.xml create mode 100644 account_banking_sepa_direct_debit/account_payment_view.xml create mode 100644 account_banking_sepa_direct_debit/company.py create mode 100644 account_banking_sepa_direct_debit/company_view.xml create mode 100644 account_banking_sepa_direct_debit/data/mandate_expire_cron.xml create mode 100644 account_banking_sepa_direct_debit/data/mandate_reference_sequence.xml create mode 100644 account_banking_sepa_direct_debit/data/pain.008.001.02.xsd create mode 100644 account_banking_sepa_direct_debit/data/pain.008.001.03.xsd create mode 100644 account_banking_sepa_direct_debit/data/pain.008.001.04.xsd create mode 100644 account_banking_sepa_direct_debit/data/payment_type_sdd.xml create mode 100644 account_banking_sepa_direct_debit/demo/sepa_direct_debit_demo.xml create mode 100644 account_banking_sepa_direct_debit/i18n/account_banking_sepa_direct_debit.pot create mode 100644 account_banking_sepa_direct_debit/i18n/fr.po create mode 100644 account_banking_sepa_direct_debit/i18n/nl.po create mode 100644 account_banking_sepa_direct_debit/mandate_expire_cron.xml create mode 100644 account_banking_sepa_direct_debit/models/__init__.py create mode 100644 account_banking_sepa_direct_debit/models/account_invoice.py create mode 100644 account_banking_sepa_direct_debit/models/banking_export_sdd.py create mode 100644 account_banking_sepa_direct_debit/models/payment_line.py create mode 100644 account_banking_sepa_direct_debit/models/res_company.py create mode 100644 account_banking_sepa_direct_debit/models/res_partner_bank.py create mode 100644 account_banking_sepa_direct_debit/models/sdd_mandate.py create mode 100644 account_banking_sepa_direct_debit/res_partner_bank_view.xml create mode 100644 account_banking_sepa_direct_debit/sdd_mandate_view.xml create mode 100644 account_banking_sepa_direct_debit/security/ir.model.access.csv create mode 100644 account_banking_sepa_direct_debit/security/original_mandate_required_security.xml create mode 100644 account_banking_sepa_direct_debit/sepa_direct_debit_demo.xml create mode 100644 account_banking_sepa_direct_debit/static/description/icon.svg create mode 100644 account_banking_sepa_direct_debit/static/src/img/icon.png create mode 100644 account_banking_sepa_direct_debit/views/account_banking_sdd_view.xml create mode 100644 account_banking_sepa_direct_debit/views/account_invoice_view.xml create mode 100644 account_banking_sepa_direct_debit/views/account_payment_view.xml create mode 100644 account_banking_sepa_direct_debit/views/res_company_view.xml create mode 100644 account_banking_sepa_direct_debit/views/res_partner_bank_view.xml create mode 100644 account_banking_sepa_direct_debit/views/sdd_mandate_view.xml create mode 100644 account_banking_sepa_direct_debit/wizard/__init__.py create mode 100644 account_banking_sepa_direct_debit/wizard/export_sdd.py create mode 100644 account_banking_sepa_direct_debit/wizard/export_sdd_view.xml diff --git a/account_banking_sepa_direct_debit/__init__.py b/account_banking_sepa_direct_debit/__init__.py new file mode 100644 index 000000000..096fe8ad3 --- /dev/null +++ b/account_banking_sepa_direct_debit/__init__.py @@ -0,0 +1,24 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# SEPA Direct Debit module for OpenERP +# Copyright (C) 2013 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 . +# +############################################################################## + +from . import models +from . import wizard diff --git a/account_banking_sepa_direct_debit/__openerp__.py b/account_banking_sepa_direct_debit/__openerp__.py new file mode 100644 index 000000000..5f222df80 --- /dev/null +++ b/account_banking_sepa_direct_debit/__openerp__.py @@ -0,0 +1,65 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# SEPA Direct Debit module for OpenERP +# Copyright (C) 2013 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 . +# +############################################################################## +{ + 'name': 'Account Banking SEPA Direct Debit', + 'summary': 'Create SEPA files for Direct Debit', + 'version': '0.1', + 'license': 'AGPL-3', + 'author': 'Akretion', + 'website': 'http://www.akretion.com', + 'contributors': ['Pedro M. Baeza '], + 'category': 'Banking addons', + 'depends': ['account_direct_debit', 'account_banking_pain_base'], + 'external_dependencies': { + 'python': ['unidecode', 'lxml'], + }, + 'data': [ + 'views/account_banking_sdd_view.xml', + 'views/sdd_mandate_view.xml', + 'views/res_partner_bank_view.xml', + 'views/account_payment_view.xml', + 'views/res_company_view.xml', + 'views/account_invoice_view.xml', + 'wizard/export_sdd_view.xml', + 'data/mandate_expire_cron.xml', + 'data/payment_type_sdd.xml', + 'data/mandate_reference_sequence.xml', + 'security/original_mandate_required_security.xml', + 'security/ir.model.access.csv', + ], + 'demo': ['demo/sepa_direct_debit_demo.xml'], + 'description': ''' +Module to export direct debit payment orders in SEPA XML file format. + +SEPA PAIN (PAyment INitiation) is the new european standard for +Customer-to-Bank payment instructions. This module implements SEPA Direct +Debit (SDD), more specifically PAIN versions 008.001.02, 008.001.03 and +008.001.04. It is part of the ISO 20022 standard, available on +http://www.iso20022.org. + +The Implementation Guidelines for SEPA Direct Debit published by the European +Payments Council (http://http://www.europeanpaymentscouncil.eu) use PAIN +version 008.001.02. So if you don't know which version your bank supports, you +should try version 008.001.02 first. + ''', + 'installable': True, +} diff --git a/account_banking_sepa_direct_debit/account_banking_sdd.py b/account_banking_sepa_direct_debit/account_banking_sdd.py new file mode 100644 index 000000000..87e50111b --- /dev/null +++ b/account_banking_sepa_direct_debit/account_banking_sdd.py @@ -0,0 +1,440 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# SEPA Direct Debit module for OpenERP +# Copyright (C) 2013 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 . +# +############################################################################## + +from openerp.osv import orm, fields +from openerp.tools.translate import _ +from openerp.addons.decimal_precision import decimal_precision as dp +from unidecode import unidecode +from datetime import datetime +from dateutil.relativedelta import relativedelta +import logging + +NUMBER_OF_UNUSED_MONTHS_BEFORE_EXPIRY = 36 + +logger = logging.getLogger(__name__) + + +class banking_export_sdd(orm.Model): + '''SEPA Direct Debit export''' + _name = 'banking.export.sdd' + _description = __doc__ + _rec_name = 'filename' + + def _generate_filename(self, cr, uid, ids, name, arg, context=None): + res = {} + for sepa_file in self.browse(cr, uid, ids, context=context): + ref = sepa_file.payment_order_ids[0].reference + if ref: + label = unidecode(ref.replace('/', '-')) + else: + label = 'error' + res[sepa_file.id] = 'sdd_%s.xml' % label + return res + + _columns = { + 'payment_order_ids': fields.many2many( + 'payment.order', + 'account_payment_order_sdd_rel', + 'banking_export_sepa_id', 'account_order_id', + 'Payment Orders', + readonly=True), + 'nb_transactions': fields.integer( + 'Number of Transactions', readonly=True), + 'total_amount': fields.float( + 'Total Amount', digits_compute=dp.get_precision('Account'), + readonly=True), + 'batch_booking': fields.boolean( + 'Batch Booking', readonly=True, + help="If true, the bank statement will display only one credit " + "line for all the direct debits of the SEPA file ; if false, " + "the bank statement will display one credit line per direct " + "debit of the SEPA file."), + 'charge_bearer': fields.selection([ + ('SLEV', 'Following Service Level'), + ('SHAR', 'Shared'), + ('CRED', 'Borne by Creditor'), + ('DEBT', 'Borne by Debtor'), + ], 'Charge Bearer', readonly=True, + help="Following service level : transaction charges are to be " + "applied following the rules agreed in the service level and/or " + "scheme (SEPA Core messages must use this). Shared : " + "transaction charges on the creditor side are to be borne by " + "the creditor, transaction charges on the debtor side are to be " + "borne by the debtor. Borne by creditor : all transaction " + "charges are to be borne by the creditor. Borne by debtor : " + "all transaction charges are to be borne by the debtor."), + 'create_date': fields.datetime('Generation Date', readonly=True), + 'file': fields.binary('SEPA File', readonly=True), + 'filename': fields.function( + _generate_filename, type='char', size=256, + string='Filename', readonly=True, store=True), + 'state': fields.selection([ + ('draft', 'Draft'), + ('sent', 'Sent'), + ], 'State', readonly=True), + } + + _defaults = { + 'state': 'draft', + } + + +class sdd_mandate(orm.Model): + '''SEPA Direct Debit Mandate''' + _name = 'sdd.mandate' + _description = __doc__ + _rec_name = 'unique_mandate_reference' + _inherit = ['mail.thread'] + _order = 'signature_date desc' + _track = { + 'state': { + 'account_banking_sepa_direct_debit.mandate_valid': + lambda self, cr, uid, obj, ctx=None: + obj['state'] == 'valid', + 'account_banking_sepa_direct_debit.mandate_expired': + lambda self, cr, uid, obj, ctx=None: + obj['state'] == 'expired', + 'account_banking_sepa_direct_debit.mandate_cancel': + lambda self, cr, uid, obj, ctx=None: + obj['state'] == 'cancel', + }, + 'recurrent_sequence_type': { + 'account_banking_sepa_direct_debit.recurrent_sequence_type_first': + lambda self, cr, uid, obj, ctx=None: + obj['recurrent_sequence_type'] == 'first', + 'account_banking_sepa_direct_debit.' + 'recurrent_sequence_type_recurring': + lambda self, cr, uid, obj, ctx=None: + obj['recurrent_sequence_type'] == 'recurring', + 'account_banking_sepa_direct_debit.recurrent_sequence_type_final': + lambda self, cr, uid, obj, ctx=None: + obj['recurrent_sequence_type'] == 'final', + } + } + + _columns = { + 'partner_bank_id': fields.many2one( + 'res.partner.bank', 'Bank Account', track_visibility='onchange'), + 'partner_id': fields.related( + 'partner_bank_id', 'partner_id', type='many2one', + relation='res.partner', string='Partner', readonly=True), + 'company_id': fields.many2one('res.company', 'Company', required=True), + 'unique_mandate_reference': fields.char( + 'Unique Mandate Reference', size=35, readonly=True, + track_visibility='always'), + 'type': fields.selection([ + ('recurrent', 'Recurrent'), + ('oneoff', 'One-Off'), + ], 'Type of Mandate', required=True, track_visibility='always'), + 'recurrent_sequence_type': fields.selection([ + ('first', 'First'), + ('recurring', 'Recurring'), + ('final', 'Final'), + ], 'Sequence Type for Next Debit', track_visibility='onchange', + help="This field is only used for Recurrent mandates, not for " + "One-Off mandates."), + 'signature_date': fields.date( + 'Date of Signature of the Mandate', track_visibility='onchange'), + 'scan': fields.binary('Scan of the Mandate'), + 'last_debit_date': fields.date( + 'Date of the Last Debit', readonly=True), + 'state': fields.selection([ + ('draft', 'Draft'), + ('valid', 'Valid'), + ('expired', 'Expired'), + ('cancel', 'Cancelled'), + ], 'Status', + help="Only valid mandates can be used in a payment line. A " + "cancelled mandate is a mandate that has been cancelled by " + "the customer. A one-off mandate expires after its first use. " + "A recurrent mandate expires after it's final use or if it " + "hasn't been used for 36 months."), + 'payment_line_ids': fields.one2many( + 'payment.line', 'sdd_mandate_id', "Related Payment Lines"), + 'sepa_migrated': fields.boolean( + 'Migrated to SEPA', track_visibility='onchange', + help="If this field is not active, the mandate section of the " + "next direct debit file that include this mandate will contain " + "the 'Original Mandate Identification' and the 'Original " + "Creditor Scheme Identification'. This is required in a few " + "countries (Belgium for instance), but not in all countries. " + "If this is not required in your country, you should keep this " + "field always active."), + 'original_mandate_identification': fields.char( + 'Original Mandate Identification', size=35, + track_visibility='onchange', + help="When the field 'Migrated to SEPA' is not active, this " + "field will be used as the Original Mandate Identification in " + "the Direct Debit file."), + } + + _defaults = { + 'company_id': lambda self, cr, uid, context: + self.pool['res.company']._company_default_get( + cr, uid, 'sdd.mandate', context=context), + 'unique_mandate_reference': '/', + 'state': 'draft', + 'sepa_migrated': True, + } + + _sql_constraints = [( + 'mandate_ref_company_uniq', + 'unique(unique_mandate_reference, company_id)', + 'A Mandate with the same reference already exists for this company !' + )] + + def create(self, cr, uid, vals, context=None): + if vals.get('unique_mandate_reference', '/') == '/': + vals['unique_mandate_reference'] = \ + self.pool['ir.sequence'].next_by_code( + cr, uid, 'sdd.mandate.reference', context=context) + return super(sdd_mandate, self).create(cr, uid, vals, context=context) + + def _check_sdd_mandate(self, cr, uid, ids): + for mandate in self.browse(cr, uid, ids): + if (mandate.signature_date and + mandate.signature_date > + datetime.today().strftime('%Y-%m-%d')): + raise orm.except_orm( + _('Error:'), + _("The date of signature of mandate '%s' is in the " + "future !") + % mandate.unique_mandate_reference) + if mandate.state == 'valid' and not mandate.signature_date: + raise orm.except_orm( + _('Error:'), + _("Cannot validate the mandate '%s' without a date of " + "signature.") + % mandate.unique_mandate_reference) + if mandate.state == 'valid' and not mandate.partner_bank_id: + raise orm.except_orm( + _('Error:'), + _("Cannot validate the mandate '%s' because it is not " + "attached to a bank account.") + % mandate.unique_mandate_reference) + + if (mandate.signature_date and mandate.last_debit_date and + mandate.signature_date > mandate.last_debit_date): + raise orm.except_orm( + _('Error:'), + _("The mandate '%s' can't have a date of last debit " + "before the date of signature.") + % mandate.unique_mandate_reference) + if (mandate.type == 'recurrent' + and not mandate.recurrent_sequence_type): + raise orm.except_orm( + _('Error:'), + _("The recurrent mandate '%s' must have a sequence type.") + % mandate.unique_mandate_reference) + if (mandate.type == 'recurrent' and not mandate.sepa_migrated + and mandate.recurrent_sequence_type != 'first'): + raise orm.except_orm( + _('Error:'), + _("The recurrent mandate '%s' which is not marked as " + "'Migrated to SEPA' must have its recurrent sequence " + "type set to 'First'.") + % mandate.unique_mandate_reference) + if (mandate.type == 'recurrent' and not mandate.sepa_migrated + and not mandate.original_mandate_identification): + raise orm.except_orm( + _('Error:'), + _("You must set the 'Original Mandate Identification' " + "on the recurrent mandate '%s' which is not marked " + "as 'Migrated to SEPA'.") + % mandate.unique_mandate_reference) + return True + + _constraints = [ + (_check_sdd_mandate, "Error msg in raise", [ + 'last_debit_date', 'signature_date', 'state', 'partner_bank_id', + 'type', 'recurrent_sequence_type', 'sepa_migrated', + 'original_mandate_identification', + ]), + ] + + def mandate_type_change(self, cr, uid, ids, type): + if type == 'recurrent': + recurrent_sequence_type = 'first' + else: + recurrent_sequence_type = False + res = {'value': {'recurrent_sequence_type': recurrent_sequence_type}} + return res + + def mandate_partner_bank_change( + self, cr, uid, ids, partner_bank_id, type, recurrent_sequence_type, + last_debit_date, state): + res = {'value': {}} + if partner_bank_id: + partner_bank_read = self.pool['res.partner.bank'].read( + cr, uid, partner_bank_id, ['partner_id'])['partner_id'] + if partner_bank_read: + res['value']['partner_id'] = partner_bank_read[0] + if (state == 'valid' and partner_bank_id + and type == 'recurrent' + and recurrent_sequence_type != 'first'): + res['value']['recurrent_sequence_type'] = 'first' + res['warning'] = { + 'title': _('Mandate update'), + 'message': _( + "As you changed the bank account attached to this " + "mandate, the 'Sequence Type' has been set back to " + "'First'."), + } + return res + + def validate(self, cr, uid, ids, context=None): + to_validate_ids = [] + for mandate in self.browse(cr, uid, ids, context=context): + assert mandate.state == 'draft', 'Mandate should be in draft state' + to_validate_ids.append(mandate.id) + self.write( + cr, uid, to_validate_ids, {'state': 'valid'}, context=context) + return True + + def cancel(self, cr, uid, ids, context=None): + to_cancel_ids = [] + for mandate in self.browse(cr, uid, ids, context=context): + assert mandate.state in ('draft', 'valid'),\ + 'Mandate should be in draft or valid state' + to_cancel_ids.append(mandate.id) + self.write( + cr, uid, to_cancel_ids, {'state': 'cancel'}, context=context) + return True + + def back2draft(self, cr, uid, ids, context=None): + to_draft_ids = [] + for mandate in self.browse(cr, uid, ids, context=context): + assert mandate.state == 'cancel',\ + 'Mandate should be in cancel state' + to_draft_ids.append(mandate.id) + self.write( + cr, uid, to_draft_ids, {'state': 'draft'}, context=context) + return True + + def _sdd_mandate_set_state_to_expired(self, cr, uid, context=None): + logger.info('Searching for SDD Mandates that must be set to Expired') + expire_limit_date = datetime.today() + \ + relativedelta(months=-NUMBER_OF_UNUSED_MONTHS_BEFORE_EXPIRY) + expire_limit_date_str = expire_limit_date.strftime('%Y-%m-%d') + expired_mandate_ids = self.search(cr, uid, [ + '|', + ('last_debit_date', '=', False), + ('last_debit_date', '<=', expire_limit_date_str), + ('state', '=', 'valid'), + ('signature_date', '<=', expire_limit_date_str), + ], context=context) + if expired_mandate_ids: + self.write( + cr, uid, expired_mandate_ids, {'state': 'expired'}, + context=context) + logger.info( + 'The following SDD Mandate IDs has been set to expired: %s' + % expired_mandate_ids) + else: + logger.info('0 SDD Mandates must be set to Expired') + return True + + +class res_partner_bank(orm.Model): + _inherit = 'res.partner.bank' + + _columns = { + 'sdd_mandate_ids': fields.one2many( + 'sdd.mandate', 'partner_bank_id', 'SEPA Direct Debit Mandates'), + } + + +class payment_line(orm.Model): + _inherit = 'payment.line' + + _columns = { + 'sdd_mandate_id': fields.many2one( + 'sdd.mandate', 'SEPA Direct Debit Mandate', + domain=[('state', '=', 'valid')]), + } + + def create(self, cr, uid, vals, context=None): + '''If the customer invoice has a mandate, take it + otherwise, take the first valid mandate of the bank account''' + if context is None: + context = {} + if not vals: + vals = {} + partner_bank_id = vals.get('bank_id') + move_line_id = vals.get('move_line_id') + if (context.get('default_payment_order_type') == 'debit' + and 'sdd_mandate_id' not in vals): + if move_line_id: + line = self.pool['account.move.line'].browse( + cr, uid, move_line_id, context=context) + if (line.invoice and line.invoice.type == 'out_invoice' + and line.invoice.sdd_mandate_id): + vals.update({ + 'sdd_mandate_id': line.invoice.sdd_mandate_id.id, + 'bank_id': + line.invoice.sdd_mandate_id.partner_bank_id.id, + }) + if partner_bank_id and 'sdd_mandate_id' not in vals: + mandate_ids = self.pool['sdd.mandate'].search(cr, uid, [ + ('partner_bank_id', '=', partner_bank_id), + ('state', '=', 'valid'), + ], context=context) + if mandate_ids: + vals['sdd_mandate_id'] = mandate_ids[0] + return super(payment_line, self).create(cr, uid, vals, context=context) + + def _check_mandate_bank_link(self, cr, uid, ids): + for payline in self.browse(cr, uid, ids): + if (payline.sdd_mandate_id and payline.bank_id + and payline.sdd_mandate_id.partner_bank_id.id != + payline.bank_id.id): + raise orm.except_orm( + _('Error:'), + _("The payment line with reference '%s' has the bank " + "account '%s' which is not attached to the mandate " + "'%s' (this mandate is attached to the bank account " + "'%s').") % ( + payline.name, + self.pool['res.partner.bank'].name_get( + cr, uid, [payline.bank_id.id])[0][1], + payline.sdd_mandate_id.unique_mandate_reference, + self.pool['res.partner.bank'].name_get( + cr, uid, + [payline.sdd_mandate_id.partner_bank_id.id])[0][1], + )) + return True + + _constraints = [ + (_check_mandate_bank_link, 'Error msg in raise', + ['sdd_mandate_id', 'bank_id']), + ] + + +class account_invoice(orm.Model): + _inherit = 'account.invoice' + + _columns = { + 'sdd_mandate_id': fields.many2one( + 'sdd.mandate', 'SEPA Direct Debit Mandate', + domain=[('state', '=', 'valid')], readonly=True, + states={'draft': [('readonly', False)]}) + } diff --git a/account_banking_sepa_direct_debit/account_banking_sdd_view.xml b/account_banking_sepa_direct_debit/account_banking_sdd_view.xml new file mode 100644 index 000000000..f74b60353 --- /dev/null +++ b/account_banking_sepa_direct_debit/account_banking_sdd_view.xml @@ -0,0 +1,77 @@ + + + + + + + account.banking.export.sdd.form + banking.export.sdd + +
+
+ +
+ + + + + + + + + + + + + + + + +
+
+
+ + + + account.banking.export.sdd.tree + banking.export.sdd + + + + + + + + + + + + + SEPA Direct Debit Files + banking.export.sdd + form + tree,form + + + + + + + +
+
diff --git a/account_banking_sepa_direct_debit/account_invoice_view.xml b/account_banking_sepa_direct_debit/account_invoice_view.xml new file mode 100644 index 000000000..2ca480e54 --- /dev/null +++ b/account_banking_sepa_direct_debit/account_invoice_view.xml @@ -0,0 +1,22 @@ + + + + + + + add.sdd.mandate.on.customer.invoice.form + account.invoice + + + + + + + + + + diff --git a/account_banking_sepa_direct_debit/account_payment_view.xml b/account_banking_sepa_direct_debit/account_payment_view.xml new file mode 100644 index 000000000..74098c44e --- /dev/null +++ b/account_banking_sepa_direct_debit/account_payment_view.xml @@ -0,0 +1,26 @@ + + + + + + + sdd.payment.order.form + payment.order + + + + + + + + + + + + + + diff --git a/account_banking_sepa_direct_debit/company.py b/account_banking_sepa_direct_debit/company.py new file mode 100644 index 000000000..6d54ba8e6 --- /dev/null +++ b/account_banking_sepa_direct_debit/company.py @@ -0,0 +1,90 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# SEPA Direct Debit module for OpenERP +# Copyright (C) 2013 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 . +# +############################################################################## + +from openerp.osv import orm, fields +import logging + +logger = logging.getLogger(__name__) + + +class res_company(orm.Model): + _inherit = 'res.company' + + _columns = { + 'sepa_creditor_identifier': fields.char( + 'SEPA Creditor Identifier', size=35, + help="Enter the Creditor Identifier that has been attributed " + "to your company to make SEPA Direct Debits. This identifier " + "is composed of :\n- your country ISO code (2 letters)\n- a " + "2-digits checkum\n- a 3-letters business code\n- a " + "country-specific identifier"), + 'original_creditor_identifier': fields.char( + 'Original Creditor Identifier', size=70), + } + + def is_sepa_creditor_identifier_valid( + self, cr, uid, sepa_creditor_identifier, context=None): + """Check if SEPA Creditor Identifier is valid + @param sepa_creditor_identifier: SEPA Creditor Identifier as str + or unicode + @return: True if valid, False otherwise + """ + if not isinstance(sepa_creditor_identifier, (str, unicode)): + return False + try: + sci_str = str(sepa_creditor_identifier) + except: + logger.warning( + "SEPA Creditor ID should contain only ASCII caracters.") + return False + sci = sci_str.lower() + if len(sci) < 9: + return False + before_replacement = sci[7:] + sci[0:2] + '00' + logger.debug( + "SEPA ID check before_replacement = %s" % before_replacement) + after_replacement = '' + for char in before_replacement: + if char.isalpha(): + after_replacement += str(ord(char)-87) + else: + after_replacement += char + logger.debug( + "SEPA ID check after_replacement = %s" % after_replacement) + if int(sci[2:4]) == (98 - (int(after_replacement) % 97)): + return True + else: + return False + + def _check_sepa_creditor_identifier(self, cr, uid, ids): + for company in self.browse(cr, uid, ids): + if company.sepa_creditor_identifier: + if not self.is_sepa_creditor_identifier_valid( + cr, uid, company.sepa_creditor_identifier): + return False + return True + + _constraints = [ + (_check_sepa_creditor_identifier, + "Invalid SEPA Creditor Identifier.", + ['sepa_creditor_identifier']), + ] diff --git a/account_banking_sepa_direct_debit/company_view.xml b/account_banking_sepa_direct_debit/company_view.xml new file mode 100644 index 000000000..e4c9e0b93 --- /dev/null +++ b/account_banking_sepa_direct_debit/company_view.xml @@ -0,0 +1,23 @@ + + + + + + + sepa_direct_debit.res.company.form + res.company + + + + + + + + + + + diff --git a/account_banking_sepa_direct_debit/data/mandate_expire_cron.xml b/account_banking_sepa_direct_debit/data/mandate_expire_cron.xml new file mode 100644 index 000000000..4cb0693d2 --- /dev/null +++ b/account_banking_sepa_direct_debit/data/mandate_expire_cron.xml @@ -0,0 +1,26 @@ + + + + + + + + + Set SEPA Direct Debit Mandates to Expired + + + 1 + days + -1 + + + + + + + + diff --git a/account_banking_sepa_direct_debit/data/mandate_reference_sequence.xml b/account_banking_sepa_direct_debit/data/mandate_reference_sequence.xml new file mode 100644 index 000000000..68075d526 --- /dev/null +++ b/account_banking_sepa_direct_debit/data/mandate_reference_sequence.xml @@ -0,0 +1,21 @@ + + + + + + + SDD Mandate Reference + sdd.mandate.reference + + + + SDD Mandate Reference + sdd.mandate.reference + RUM + + + + + + + diff --git a/account_banking_sepa_direct_debit/data/pain.008.001.02.xsd b/account_banking_sepa_direct_debit/data/pain.008.001.02.xsd new file mode 100644 index 000000000..633597256 --- /dev/null +++ b/account_banking_sepa_direct_debit/data/pain.008.001.02.xsd @@ -0,0 +1,879 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/account_banking_sepa_direct_debit/data/pain.008.001.03.xsd b/account_banking_sepa_direct_debit/data/pain.008.001.03.xsd new file mode 100644 index 000000000..73d894379 --- /dev/null +++ b/account_banking_sepa_direct_debit/data/pain.008.001.03.xsd @@ -0,0 +1,925 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/account_banking_sepa_direct_debit/data/pain.008.001.04.xsd b/account_banking_sepa_direct_debit/data/pain.008.001.04.xsd new file mode 100644 index 000000000..93806815a --- /dev/null +++ b/account_banking_sepa_direct_debit/data/pain.008.001.04.xsd @@ -0,0 +1,892 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/account_banking_sepa_direct_debit/data/payment_type_sdd.xml b/account_banking_sepa_direct_debit/data/payment_type_sdd.xml new file mode 100644 index 000000000..a17b3b21c --- /dev/null +++ b/account_banking_sepa_direct_debit/data/payment_type_sdd.xml @@ -0,0 +1,35 @@ + + + + + + + SEPA Direct Debit v02 (recommended) + pain.008.001.02 + + + debit + + + + SEPA Direct Debit v03 + pain.008.001.03 + + + debit + + + + SEPA Direct Debit v04 + pain.008.001.04 + + + debit + + + + + diff --git a/account_banking_sepa_direct_debit/demo/sepa_direct_debit_demo.xml b/account_banking_sepa_direct_debit/demo/sepa_direct_debit_demo.xml new file mode 100644 index 000000000..220261088 --- /dev/null +++ b/account_banking_sepa_direct_debit/demo/sepa_direct_debit_demo.xml @@ -0,0 +1,27 @@ + + + + + + + SEPA Direct Debit La Banque Postale + + + + + + + + FR78ZZZ424242 + + + + + recurrent + first + 2014-02-01 + valid + + + + diff --git a/account_banking_sepa_direct_debit/i18n/account_banking_sepa_direct_debit.pot b/account_banking_sepa_direct_debit/i18n/account_banking_sepa_direct_debit.pot new file mode 100644 index 000000000..0db576726 --- /dev/null +++ b/account_banking_sepa_direct_debit/i18n/account_banking_sepa_direct_debit.pot @@ -0,0 +1,633 @@ +# Translation of OpenERP Server. +# This file contains the translation of the following modules: +# * account_banking_sepa_direct_debit +# +msgid "" +msgstr "" +"Project-Id-Version: OpenERP Server 7.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2013-12-23 22:24+0000\n" +"PO-Revision-Date: 2013-12-23 22:24+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_sepa_direct_debit +#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.mandate_valid +msgid "SEPA Direct Debit Mandate Validated" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,filename:0 +#: field:banking.export.sdd.wizard,filename:0 +msgid "Filename" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:200 +#, python-format +msgid "The SEPA Direct Debit mandate with reference '%s' for partner '%s' has expired." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:219 +#, python-format +msgid "Cannot validate the mandate '%s' without a date of signature." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:sdd.mandate,recurrent_sequence_type:0 +msgid "Final" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd.wizard,state:0 +msgid "Finish" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:res.partner:0 +#: view:res.partner.bank:0 +msgid "SDD Mandates" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: constraint:payment.line:0 +#: constraint:sdd.mandate:0 +msgid "Error msg in raise" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,state:0 +msgid "Reconciled" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,recurrent_sequence_type:0 +msgid "Sequence Type for Next Debit" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,charge_bearer:0 +#: selection:banking.export.sdd.wizard,charge_bearer:0 +msgid "Borne by Creditor" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.sdd_mandate_action +#: model:ir.ui.menu,name:account_banking_sepa_direct_debit.sdd_mandate_menu +#: view:res.partner.bank:0 +#: field:res.partner.bank,sdd_mandate_ids:0 +msgid "SEPA Direct Debit Mandates" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd.wizard:0 +#: view:sdd.mandate:0 +msgid "Validate" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_recurring +#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.recurrent_sequence_type_recurring +msgid "Sequence Type set to Recurring" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd.wizard:0 +msgid "Generate" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.mandate_cancel +msgid "SEPA Direct Debit Mandate Cancelled" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,charge_bearer:0 +#: selection:banking.export.sdd.wizard,charge_bearer:0 +msgid "Borne by Debtor" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:212 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:218 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:224 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:232 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:239 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:245 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:253 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:395 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:140 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:192 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:199 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:209 +#, python-format +msgid "Error:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,message_ids:0 +msgid "Messages" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,unique_mandate_reference:0 +msgid "Unique Mandate Reference" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +#: selection:sdd.mandate,state:0 +msgid "Cancelled" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:141 +#, python-format +msgid "Payment Type Code '%s' is not supported. The only Payment Type Code supported for SEPA Direct Debit are 'pain.008.001.02', 'pain.008.001.03' and 'pain.008.001.04'." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: help:sdd.mandate,message_unread:0 +msgid "If checked new messages require your attention." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,file_id:0 +msgid "SDD File" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.mandate_expired +msgid "SEPA Direct Debit Mandate has Expired" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:246 +#, python-format +msgid "The recurrent mandate '%s' which is not marked as 'Migrated to SEPA' must have its recurrent sequence type set to 'First'." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: help:banking.export.sdd,charge_bearer:0 +#: help:banking.export.sdd.wizard,charge_bearer:0 +msgid "Following service level : transaction charges are to be applied following the rules agreed in the service level and/or scheme (SEPA Core messages must use this). Shared : transaction charges on the creditor side are to be borne by the creditor, transaction charges on the debtor side are to be borne by the debtor. Borne by creditor : all transaction charges are to be borne by the creditor. Borne by debtor : all transaction charges are to be borne by the debtor." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +msgid "Reference" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd:0 +msgid "SEPA Direct Debit" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd.wizard:0 +msgid "SEPA Direct Debit XML file generation" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: help:sdd.mandate,message_summary:0 +msgid "Holds the Chatter summary (number of messages, ...). This summary is directly in html format in order to be inserted in kanban views." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_payment_line +msgid "Payment Line" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,create_date:0 +msgid "Generation Date" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:396 +#, python-format +msgid "The payment line with reference '%s' has the bank account '%s' which is not attached to the mandate '%s' (this mandate is attached to the bank account '%s')." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd.wizard,state:0 +msgid "Create" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,nb_transactions:0 +#: field:banking.export.sdd.wizard,nb_transactions:0 +msgid "Number of Transactions" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +#: selection:sdd.mandate,type:0 +msgid "One-Off" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,state:0 +#: field:banking.export.sdd.wizard,state:0 +msgid "State" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:240 +#, python-format +msgid "The recurrent mandate '%s' must have a sequence type." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,message_follower_ids:0 +msgid "Followers" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,message_unread:0 +msgid "Unread Messages" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd:0 +#: field:banking.export.sdd,payment_order_ids:0 +#: field:banking.export.sdd.wizard,payment_order_ids:0 +msgid "Payment Orders" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +msgid "Type" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,state:0 +msgid "Sent" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:res.company,original_creditor_identifier:0 +msgid "Original Creditor Identifier" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:sdd.mandate,recurrent_sequence_type:0 +msgid "Recurring" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: help:res.company,sepa_creditor_identifier:0 +msgid "Enter the Creditor Identifier that has been attributed to your company to make SEPA Direct Debits. This identifier is composed of :\n" +"- your country ISO code (2 letters)\n" +"- a 2-digits checkum\n" +"- a 3-letters business code\n" +"- a country-specific identifier" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: sql_constraint:sdd.mandate:0 +msgid "A Mandate with the same reference already exists for this company !" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: help:sdd.mandate,state:0 +msgid "Only valid mandates can be used in a payment line. A cancelled mandate is a mandate that has been cancelled by the customer. A one-off mandate expires after its first use. A recurrent mandate expires after it's final use or if it hasn't been used for 36 months." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: help:sdd.mandate,recurrent_sequence_type:0 +msgid "This field is only used for Recurrent mandates, not for One-Off mandates." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:213 +#, python-format +msgid "The date of signature of mandate '%s' is in the future !" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +msgid "Signature Date" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,charge_bearer:0 +#: field:banking.export.sdd.wizard,charge_bearer:0 +msgid "Charge Bearer" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,partner_id:0 +msgid "Partner" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:sdd.mandate,recurrent_sequence_type:0 +msgid "First" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,signature_date:0 +msgid "Date of Signature of the Mandate" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.mandate_cancel +msgid "Mandate Cancelled" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.act_banking_export_sdd_payment_order +msgid "Generated SEPA Direct Debit Files" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: help:sdd.mandate,sepa_migrated:0 +msgid "If this field is not active, the mandate section of the next direct debit file that include this mandate will contain the 'Original Mandate Identification' and the 'Original Creditor Scheme Identification'. This is required in a few countries (Belgium for instance), but not in all countries. If this is not required in your country, you should keep this field always active." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,company_id:0 +msgid "Company" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_banking_export_sdd_wizard +msgid "Export SEPA Direct Debit File" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: help:banking.export.sdd,batch_booking:0 +#: help:banking.export.sdd.wizard,batch_booking:0 +msgid "If true, the bank statement will display only one credit line for all the direct debits of the SEPA file ; if false, the bank statement will display one credit line per direct debit of the SEPA file." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:225 +#, python-format +msgid "Cannot validate the mandate '%s' because it is not attached to a bank account." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,state:0 +#: view:sdd.mandate:0 +#: selection:sdd.mandate,state:0 +msgid "Draft" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:290 +#, python-format +msgid "Mandate update" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,charge_bearer:0 +#: selection:banking.export.sdd.wizard,charge_bearer:0 +msgid "Shared" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,batch_booking:0 +#: field:banking.export.sdd.wizard,batch_booking:0 +msgid "Batch Booking" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,sepa_migrated:0 +msgid "Migrated to SEPA" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,state:0 +msgid "Status" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,total_amount:0 +#: field:banking.export.sdd.wizard,total_amount:0 +msgid "Total Amount" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.action_account_banking_sdd +#: model:ir.ui.menu,name:account_banking_sepa_direct_debit.menu_account_banking_sdd +msgid "SEPA Direct Debit Files" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,charge_bearer:0 +#: selection:banking.export.sdd.wizard,charge_bearer:0 +msgid "Following Service Level" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:233 +#, python-format +msgid "The mandate '%s' can't have a date of last debit before the date of signature." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_final +#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.recurrent_sequence_type_final +msgid "Sequence Type set to Final" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,message_is_follower:0 +msgid "Is a Follower" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: help:sdd.mandate,original_mandate_identification:0 +msgid "When the field 'Migrated to SEPA' is not active, this field will be used as the Original Mandate Identification in the Direct Debit file." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:payment.order:0 +msgid "SDD Mandate" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,original_mandate_identification:0 +msgid "Original Mandate Identification" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_res_company +msgid "Companies" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,message_summary:0 +msgid "Summary" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:res.groups,name:account_banking_sepa_direct_debit.group_original_mandate_required +msgid "Original Mandate Required (SEPA)" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:account.invoice,sdd_mandate_id:0 +#: model:ir.model,name:account_banking_sepa_direct_debit.model_sdd_mandate +#: field:payment.line,sdd_mandate_id:0 +#: view:sdd.mandate:0 +msgid "SEPA Direct Debit Mandate" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:193 +#, python-format +msgid "Missing SEPA Direct Debit mandate on the payment line with partner '%s' and Invoice ref '%s'." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:210 +#, python-format +msgid "The mandate with reference '%s' for partner '%s' has type set to 'One-Off' and it has a last debit date set to '%s', so we can't use it." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,scan:0 +msgid "Scan of the Mandate" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,last_debit_date:0 +msgid "Date of the Last Debit" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.mandate_expired +msgid "Mandate Expired" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: constraint:res.company:0 +msgid "Invalid SEPA Creditor Identifier." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_res_partner_bank +msgid "Bank Accounts" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.actions.act_window,help:account_banking_sepa_direct_debit.sdd_mandate_action +msgid "

\n" +" Click to create a new SEPA Direct Debit Mandate.\n" +"

\n" +" A SEPA Direct Debit Mandate is a document signed by your customer that gives you the autorization to do one or several direct debits on his bank account.\n" +"

\n" +" " +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd:0 +msgid "General Information" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +#: selection:sdd.mandate,state:0 +msgid "Valid" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_account_invoice +msgid "Invoice" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd.wizard:0 +#: view:sdd.mandate:0 +msgid "Cancel" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +#: field:sdd.mandate,payment_line_ids:0 +msgid "Related Payment Lines" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +#: selection:sdd.mandate,type:0 +msgid "Recurrent" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,type:0 +msgid "Type of Mandate" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.mandate_valid +msgid "Mandate Validated" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,file:0 +msgid "SEPA File" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:res.company,sepa_creditor_identifier:0 +msgid "SEPA Creditor Identifier" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_banking_export_sdd +msgid "SEPA Direct Debit export" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +#: selection:sdd.mandate,state:0 +msgid "Expired" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,partner_bank_id:0 +msgid "Bank Account" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:254 +#, python-format +msgid "You must set the 'Original Mandate Identification' on the recurrent mandate '%s' which is not marked as 'Migrated to SEPA'." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_first +#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.recurrent_sequence_type_first +msgid "Sequence Type set to First" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:291 +#, python-format +msgid "As you changed the bank account attached to this mandate, the 'Sequence Type' has been set back to 'First'." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: help:sdd.mandate,message_ids:0 +msgid "Messages and communication history" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +msgid "Search SEPA Direct Debit Mandates" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,file:0 +msgid "File" +msgstr "" + diff --git a/account_banking_sepa_direct_debit/i18n/fr.po b/account_banking_sepa_direct_debit/i18n/fr.po new file mode 100644 index 000000000..3744da850 --- /dev/null +++ b/account_banking_sepa_direct_debit/i18n/fr.po @@ -0,0 +1,749 @@ +# Translation of OpenERP Server. +# This file contains the translation of the following modules: +# * account_banking_sepa_direct_debit +# +msgid "" +msgstr "" +"Project-Id-Version: OpenERP Server 7.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2013-12-23 22:24+0000\n" +"PO-Revision-Date: 2014-02-01 04:49+0000\n" +"Last-Translator: Alexis de Lattre \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2014-05-31 06:02+0000\n" +"X-Generator: Launchpad (build 17031)\n" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.mandate_valid +msgid "SEPA Direct Debit Mandate Validated" +msgstr "Mandat de prélèvement SEPA validé" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,filename:0 +#: field:banking.export.sdd.wizard,filename:0 +msgid "Filename" +msgstr "Nom du fichier" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:200 +#, python-format +msgid "" +"The SEPA Direct Debit mandate with reference '%s' for partner '%s' has " +"expired." +msgstr "" +"Le mandat de prélèvement SEPA portant la référence '%s' pour le partenaire " +"'%s' a expiré." + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:219 +#, python-format +msgid "Cannot validate the mandate '%s' without a date of signature." +msgstr "Impossible de valider le mandat '%s' sans date de signature." + +#. module: account_banking_sepa_direct_debit +#: selection:sdd.mandate,recurrent_sequence_type:0 +msgid "Final" +msgstr "Final" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd.wizard,state:0 +msgid "Finish" +msgstr "Finir" + +#. module: account_banking_sepa_direct_debit +#: view:res.partner:0 +#: view:res.partner.bank:0 +msgid "SDD Mandates" +msgstr "Mandats SEPA" + +#. module: account_banking_sepa_direct_debit +#: constraint:payment.line:0 +#: constraint:sdd.mandate:0 +msgid "Error msg in raise" +msgstr "Error msg in raise" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,state:0 +msgid "Reconciled" +msgstr "Réconcilié" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,recurrent_sequence_type:0 +msgid "Sequence Type for Next Debit" +msgstr "Type de séquence pour le prochain prélèvement" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,charge_bearer:0 +#: selection:banking.export.sdd.wizard,charge_bearer:0 +msgid "Borne by Creditor" +msgstr "Supportés par le créancier" + +#. module: account_banking_sepa_direct_debit +#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.sdd_mandate_action +#: model:ir.ui.menu,name:account_banking_sepa_direct_debit.sdd_mandate_menu +#: view:res.partner.bank:0 +#: field:res.partner.bank,sdd_mandate_ids:0 +msgid "SEPA Direct Debit Mandates" +msgstr "Mandats de prélèvement SEPA" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd.wizard:0 +#: view:sdd.mandate:0 +msgid "Validate" +msgstr "Valider" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_recurring +#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.recurrent_sequence_type_recurring +msgid "Sequence Type set to Recurring" +msgstr "Type de séquence mis à Recurring" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd.wizard:0 +msgid "Generate" +msgstr "Générer" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.mandate_cancel +msgid "SEPA Direct Debit Mandate Cancelled" +msgstr "Mandat de prélèvement SEPA annulé" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,charge_bearer:0 +#: selection:banking.export.sdd.wizard,charge_bearer:0 +msgid "Borne by Debtor" +msgstr "Supportés par le débiteur" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:212 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:218 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:224 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:232 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:239 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:245 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:253 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:395 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:140 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:192 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:199 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:209 +#, python-format +msgid "Error:" +msgstr "Erreur :" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,message_ids:0 +msgid "Messages" +msgstr "Messages" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,unique_mandate_reference:0 +msgid "Unique Mandate Reference" +msgstr "Référence unique de mandat" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +#: selection:sdd.mandate,state:0 +msgid "Cancelled" +msgstr "Annulé" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:141 +#, python-format +msgid "" +"Payment Type Code '%s' is not supported. The only Payment Type Code " +"supported for SEPA Direct Debit are 'pain.008.001.02', 'pain.008.001.03' and " +"'pain.008.001.04'." +msgstr "" +"Le code du Type de paiement '%s' n'est pas supporté. Les seuls codes de Type " +"de paiement supportés pour les prélèvements SEPA sont 'pain.008.001.02', " +"'pain.008.001.03' et 'pain.008.001.04'." + +#. module: account_banking_sepa_direct_debit +#: help:sdd.mandate,message_unread:0 +msgid "If checked new messages require your attention." +msgstr "If checked new messages require your attention." + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,file_id:0 +msgid "SDD File" +msgstr "Fichier de prélèvement SEPA" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.mandate_expired +msgid "SEPA Direct Debit Mandate has Expired" +msgstr "Le mandat de prélèvement SEPA a expiré" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:246 +#, python-format +msgid "" +"The recurrent mandate '%s' which is not marked as 'Migrated to SEPA' must " +"have its recurrent sequence type set to 'First'." +msgstr "" +"Le mandat récurrent '%s' dont l'option 'Migré à SEPA' n'est pas activée doit " +"avec sa séquence mise à 'First'." + +#. module: account_banking_sepa_direct_debit +#: help:banking.export.sdd,charge_bearer:0 +#: help:banking.export.sdd.wizard,charge_bearer:0 +msgid "" +"Following service level : transaction charges are to be applied following " +"the rules agreed in the service level and/or scheme (SEPA Core messages must " +"use this). Shared : transaction charges on the creditor side are to be borne " +"by the creditor, transaction charges on the debtor side are to be borne by " +"the debtor. Borne by creditor : all transaction charges are to be borne by " +"the creditor. Borne by debtor : all transaction charges are to be borne by " +"the debtor." +msgstr "" +"Suivant le niveau de service : la répartition des frais bancaires suit les " +"règles pré-établies dans le schema ou dans le contrat avec la banque (les " +"messages SEPA Core doivent utiliser ce paramètre). Partagés : les frais " +"bancaires côté débiteur sont à la charge du débiteur, les frais bancaires " +"côté créancier sont à la charge du créancier. Supportés par le créancier : " +"tous les frais bancaires sont à la charge du créancier. Supportés par le " +"débiteur : tous les frais bancaires sont à la charge du débiteur." + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +msgid "Reference" +msgstr "Référence" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd:0 +msgid "SEPA Direct Debit" +msgstr "Prélèvement SEPA" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd.wizard:0 +msgid "SEPA Direct Debit XML file generation" +msgstr "Génération de fichiers de prélèvement SEPA XML" + +#. module: account_banking_sepa_direct_debit +#: help:sdd.mandate,message_summary:0 +msgid "" +"Holds the Chatter summary (number of messages, ...). This summary is " +"directly in html format in order to be inserted in kanban views." +msgstr "" +"Holds the Chatter summary (number of messages, ...). This summary is " +"directly in html format in order to be inserted in kanban views." + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_payment_line +msgid "Payment Line" +msgstr "Ligne de paiement" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,create_date:0 +msgid "Generation Date" +msgstr "Date de génération" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:396 +#, python-format +msgid "" +"The payment line with reference '%s' has the bank account '%s' which is not " +"attached to the mandate '%s' (this mandate is attached to the bank account " +"'%s')." +msgstr "" +"La ligne de paiement portant la référence '%s' est configurée avec le compte " +"bancaire '%s' qui n'est pas rattaché au mandat '%s' (ce mandat est rattaché " +"au compte bancaire '%s')." + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd.wizard,state:0 +msgid "Create" +msgstr "Créer" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,nb_transactions:0 +#: field:banking.export.sdd.wizard,nb_transactions:0 +msgid "Number of Transactions" +msgstr "Nombre de transactions" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +#: selection:sdd.mandate,type:0 +msgid "One-Off" +msgstr "One-Off" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,state:0 +#: field:banking.export.sdd.wizard,state:0 +msgid "State" +msgstr "État" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:240 +#, python-format +msgid "The recurrent mandate '%s' must have a sequence type." +msgstr "Le mandat récurrent '%s' doit avoir un type de séquence." + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,message_follower_ids:0 +msgid "Followers" +msgstr "Followers" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,message_unread:0 +msgid "Unread Messages" +msgstr "Unread Messages" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd:0 +#: field:banking.export.sdd,payment_order_ids:0 +#: field:banking.export.sdd.wizard,payment_order_ids:0 +msgid "Payment Orders" +msgstr "Ordres de paiement" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +msgid "Type" +msgstr "Type" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,state:0 +msgid "Sent" +msgstr "Envoyé" + +#. module: account_banking_sepa_direct_debit +#: field:res.company,original_creditor_identifier:0 +msgid "Original Creditor Identifier" +msgstr "Ancien Identifiant Créancier" + +#. module: account_banking_sepa_direct_debit +#: selection:sdd.mandate,recurrent_sequence_type:0 +msgid "Recurring" +msgstr "Recurring" + +#. module: account_banking_sepa_direct_debit +#: help:res.company,sepa_creditor_identifier:0 +msgid "" +"Enter the Creditor Identifier that has been attributed to your company to " +"make SEPA Direct Debits. This identifier is composed of :\n" +"- your country ISO code (2 letters)\n" +"- a 2-digits checkum\n" +"- a 3-letters business code\n" +"- a country-specific identifier" +msgstr "" +"Entrez l'Identifiant créancier qui a été attribué à votre société pour " +"réaliser des prélèvements SEPA. Cet identifiant est composé de :\n" +"- du code ISO de votre pays (2 lettres)\n" +"- un code de contrôle à 2 chiffres\n" +"- un code d'activité à 3 lettres\n" +"- un identifiant national" + +#. module: account_banking_sepa_direct_debit +#: sql_constraint:sdd.mandate:0 +msgid "A Mandate with the same reference already exists for this company !" +msgstr "Un mandat avec la même référence existe déjà pour cette société !" + +#. module: account_banking_sepa_direct_debit +#: help:sdd.mandate,state:0 +msgid "" +"Only valid mandates can be used in a payment line. A cancelled mandate is a " +"mandate that has been cancelled by the customer. A one-off mandate expires " +"after its first use. A recurrent mandate expires after it's final use or if " +"it hasn't been used for 36 months." +msgstr "" +"Seuls des mandats valides peuvent être utilisés dans une ligne de paiement. " +"Un mandate annulé est un mandat qui a été annulé par le client. Un mandat " +"One-Off expire à l'issue de sa première utilisation. Un mandate récurrent " +"expire après sa dernière utilisation ou si il n'a pas été utilisé pendant 36 " +"mois." + +#. module: account_banking_sepa_direct_debit +#: help:sdd.mandate,recurrent_sequence_type:0 +msgid "" +"This field is only used for Recurrent mandates, not for One-Off mandates." +msgstr "" +"Ce champ n'est utilisé que pour les mandats récurrents, pas pour les mandats " +"One-Off." + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:213 +#, python-format +msgid "The date of signature of mandate '%s' is in the future !" +msgstr "La date de signature du mandat '%s' est dans le futur !" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +msgid "Signature Date" +msgstr "Date de signature" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,charge_bearer:0 +#: field:banking.export.sdd.wizard,charge_bearer:0 +msgid "Charge Bearer" +msgstr "Répartition des frais" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,partner_id:0 +msgid "Partner" +msgstr "Partenaire" + +#. module: account_banking_sepa_direct_debit +#: selection:sdd.mandate,recurrent_sequence_type:0 +msgid "First" +msgstr "First" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,signature_date:0 +msgid "Date of Signature of the Mandate" +msgstr "Date de signature du mandat" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.mandate_cancel +msgid "Mandate Cancelled" +msgstr "Mandat annulé" + +#. module: account_banking_sepa_direct_debit +#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.act_banking_export_sdd_payment_order +msgid "Generated SEPA Direct Debit Files" +msgstr "Fichiers de prélèvement SEPA générés" + +#. module: account_banking_sepa_direct_debit +#: help:sdd.mandate,sepa_migrated:0 +msgid "" +"If this field is not active, the mandate section of the next direct debit " +"file that include this mandate will contain the 'Original Mandate " +"Identification' and the 'Original Creditor Scheme Identification'. This is " +"required in a few countries (Belgium for instance), but not in all " +"countries. If this is not required in your country, you should keep this " +"field always active." +msgstr "" +"Si cette option n'est pas activée, la section qui concerne le mandat dans le " +"prochain fichier de prélèvement qui incluera ce mandat contiendra les champs " +"'Original Mandate Identification' et 'Original Creditor Scheme " +"Identification'. Ces champs sont requis dans certains pays (en Belgique " +"notamment), mais pas dans tous les pays. Si ces champs ne sont pas requis " +"dans votre pays, vous devriez garder ce champ toujours actif." + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,company_id:0 +msgid "Company" +msgstr "Société" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_banking_export_sdd_wizard +msgid "Export SEPA Direct Debit File" +msgstr "Export du fichier de prélèvement SEPA" + +#. module: account_banking_sepa_direct_debit +#: help:banking.export.sdd,batch_booking:0 +#: help:banking.export.sdd.wizard,batch_booking:0 +msgid "" +"If true, the bank statement will display only one credit line for all the " +"direct debits of the SEPA file ; if false, the bank statement will display " +"one credit line per direct debit of the SEPA file." +msgstr "" +"Si activé, le relevé de compte ne fera apparaître qu'une ligne de crédit " +"pour tous les prélèvements du fichier SEPA ; si désactivé, le relevé de " +"banque fera apparaître une ligne de crédit pour chaque prélèvement du " +"fichier SEPA." + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:225 +#, python-format +msgid "" +"Cannot validate the mandate '%s' because it is not attached to a bank " +"account." +msgstr "" +"Impossible de valider le mandat '%s' car il n'est pas rattaché à un compte " +"bancaire." + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,state:0 +#: view:sdd.mandate:0 +#: selection:sdd.mandate,state:0 +msgid "Draft" +msgstr "Brouillon" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:290 +#, python-format +msgid "Mandate update" +msgstr "Mise-à-jour du mandat" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,charge_bearer:0 +#: selection:banking.export.sdd.wizard,charge_bearer:0 +msgid "Shared" +msgstr "Partagée" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,batch_booking:0 +#: field:banking.export.sdd.wizard,batch_booking:0 +msgid "Batch Booking" +msgstr "Crédit groupé" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,sepa_migrated:0 +msgid "Migrated to SEPA" +msgstr "Migré à SEPA" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,state:0 +msgid "Status" +msgstr "Statut" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,total_amount:0 +#: field:banking.export.sdd.wizard,total_amount:0 +msgid "Total Amount" +msgstr "Montant total" + +#. module: account_banking_sepa_direct_debit +#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.action_account_banking_sdd +#: model:ir.ui.menu,name:account_banking_sepa_direct_debit.menu_account_banking_sdd +msgid "SEPA Direct Debit Files" +msgstr "Fichiers de prélèvement SEPA" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,charge_bearer:0 +#: selection:banking.export.sdd.wizard,charge_bearer:0 +msgid "Following Service Level" +msgstr "Suivant le niveau de service" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:233 +#, python-format +msgid "" +"The mandate '%s' can't have a date of last debit before the date of " +"signature." +msgstr "" +"Le mandat '%s' ne peut pas avoir une date de dernier débit antérieure à la " +"date de signature." + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_final +#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.recurrent_sequence_type_final +msgid "Sequence Type set to Final" +msgstr "Type de Séquence mis à Final" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,message_is_follower:0 +msgid "Is a Follower" +msgstr "Is a Follower" + +#. module: account_banking_sepa_direct_debit +#: help:sdd.mandate,original_mandate_identification:0 +msgid "" +"When the field 'Migrated to SEPA' is not active, this field will be used as " +"the Original Mandate Identification in the Direct Debit file." +msgstr "" +"Quand le champ 'Migré à SEPA' n'est pas activé, ce champ sera le 'Original " +"Mandate Identification' dans le fichier de prélèvement." + +#. module: account_banking_sepa_direct_debit +#: view:payment.order:0 +msgid "SDD Mandate" +msgstr "Mandat de prélèvement" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,original_mandate_identification:0 +msgid "Original Mandate Identification" +msgstr "Ancien Identifiant du Mandat" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_res_company +msgid "Companies" +msgstr "Sociétés" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,message_summary:0 +msgid "Summary" +msgstr "Résumé" + +#. module: account_banking_sepa_direct_debit +#: model:res.groups,name:account_banking_sepa_direct_debit.group_original_mandate_required +msgid "Original Mandate Required (SEPA)" +msgstr "Ancien mandat requis (SEPA)" + +#. module: account_banking_sepa_direct_debit +#: field:account.invoice,sdd_mandate_id:0 +#: model:ir.model,name:account_banking_sepa_direct_debit.model_sdd_mandate +#: field:payment.line,sdd_mandate_id:0 +#: view:sdd.mandate:0 +msgid "SEPA Direct Debit Mandate" +msgstr "Mandat de prélèvement SEPA" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:193 +#, python-format +msgid "" +"Missing SEPA Direct Debit mandate on the payment line with partner '%s' and " +"Invoice ref '%s'." +msgstr "" +"Mandat de prélèvement SEPA manquant sur la ligne de paiement ayant pour " +"partenaire '%s' et pour référence de facture '%s'." + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:210 +#, python-format +msgid "" +"The mandate with reference '%s' for partner '%s' has type set to 'One-Off' " +"and it has a last debit date set to '%s', so we can't use it." +msgstr "" +"Le mandat portant la référence '%s' pour le partenaire '%s' est de type 'One-" +"Off' et il a une date de dernier débit au '%s', donc il n'est pas utilisable." + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,scan:0 +msgid "Scan of the Mandate" +msgstr "Scan du mandat" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,last_debit_date:0 +msgid "Date of the Last Debit" +msgstr "Date du dernier prélèvement" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.mandate_expired +msgid "Mandate Expired" +msgstr "Mandat expiré" + +#. module: account_banking_sepa_direct_debit +#: constraint:res.company:0 +msgid "Invalid SEPA Creditor Identifier." +msgstr "Identifiant créancier SEPA invalide." + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_res_partner_bank +msgid "Bank Accounts" +msgstr "Comptes bancaires" + +#. module: account_banking_sepa_direct_debit +#: model:ir.actions.act_window,help:account_banking_sepa_direct_debit.sdd_mandate_action +msgid "" +"

\n" +" Click to create a new SEPA Direct Debit Mandate.\n" +"

\n" +" A SEPA Direct Debit Mandate is a document signed by your customer " +"that gives you the autorization to do one or several direct debits on his " +"bank account.\n" +"

\n" +" " +msgstr "" +"

\n" +" Cliquez pour créer un mandat de prélèvement SEPA.\n" +"

\n" +" Un mandat de prélèvement SEPA est un document signé par votre client " +"qui vous donne l'autorisation de réaliser un ou plusieurs prélèvements sur " +"son compte bancaire.\n" +"

\n" +" " + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd:0 +msgid "General Information" +msgstr "Informations générales" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +#: selection:sdd.mandate,state:0 +msgid "Valid" +msgstr "Valide" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_account_invoice +msgid "Invoice" +msgstr "Facture" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd.wizard:0 +#: view:sdd.mandate:0 +msgid "Cancel" +msgstr "Annuler" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +#: field:sdd.mandate,payment_line_ids:0 +msgid "Related Payment Lines" +msgstr "Lignes de paiement associées" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +#: selection:sdd.mandate,type:0 +msgid "Recurrent" +msgstr "Récurrent" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,type:0 +msgid "Type of Mandate" +msgstr "Type de mandat" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.mandate_valid +msgid "Mandate Validated" +msgstr "Mandat validé" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,file:0 +msgid "SEPA File" +msgstr "Fichier SEPA" + +#. module: account_banking_sepa_direct_debit +#: field:res.company,sepa_creditor_identifier:0 +msgid "SEPA Creditor Identifier" +msgstr "Identifiant créancier SEPA" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_banking_export_sdd +msgid "SEPA Direct Debit export" +msgstr "Export de prélèvement SEPA" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +#: selection:sdd.mandate,state:0 +msgid "Expired" +msgstr "Expiré" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,partner_bank_id:0 +msgid "Bank Account" +msgstr "Compte bancaire" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:254 +#, python-format +msgid "" +"You must set the 'Original Mandate Identification' on the recurrent mandate " +"'%s' which is not marked as 'Migrated to SEPA'." +msgstr "" +"Vous devez renseigner le champ 'Ancien identifiant du mandat' sur le mandat " +"récurrent '%s' qui n'est pas marqué comme étant 'Migré à SEPA'." + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_first +#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.recurrent_sequence_type_first +msgid "Sequence Type set to First" +msgstr "Type de Séquence mis à First" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:291 +#, python-format +msgid "" +"As you changed the bank account attached to this mandate, the 'Sequence " +"Type' has been set back to 'First'." +msgstr "" +"Etant donné que vous avez changé le compte bancaire associé à ce mandat, le " +"'Type de séquence' a été remis à 'First'." + +#. module: account_banking_sepa_direct_debit +#: help:sdd.mandate,message_ids:0 +msgid "Messages and communication history" +msgstr "Messages and communication history" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +msgid "Search SEPA Direct Debit Mandates" +msgstr "Recherche dans les mandats de prélèvement SEPA" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,file:0 +msgid "File" +msgstr "Fichier" diff --git a/account_banking_sepa_direct_debit/i18n/nl.po b/account_banking_sepa_direct_debit/i18n/nl.po new file mode 100644 index 000000000..2c2ccc12f --- /dev/null +++ b/account_banking_sepa_direct_debit/i18n/nl.po @@ -0,0 +1,754 @@ +# Dutch translation for banking-addons +# Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 +# This file is distributed under the same license as the banking-addons package. +# FIRST AUTHOR , 2014. +# +msgid "" +msgstr "" +"Project-Id-Version: banking-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2013-12-23 22:24+0000\n" +"PO-Revision-Date: 2014-04-24 10:38+0000\n" +"Last-Translator: Erwin van der Ploeg (BAS Solutions) \n" +"Language-Team: Dutch \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2014-05-31 06:02+0000\n" +"X-Generator: Launchpad (build 17031)\n" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.mandate_valid +msgid "SEPA Direct Debit Mandate Validated" +msgstr "SEPA incasso machtiging bevestigd." + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,filename:0 +#: field:banking.export.sdd.wizard,filename:0 +msgid "Filename" +msgstr "Bestandsnaam" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:200 +#, python-format +msgid "" +"The SEPA Direct Debit mandate with reference '%s' for partner '%s' has " +"expired." +msgstr "" +"De SEPA incasso machtiging met referentie '%s' voor relatie '%s' is verlopen." + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:219 +#, python-format +msgid "Cannot validate the mandate '%s' without a date of signature." +msgstr "" +"Het is niet mogelijk de machtiging '%s' te bevestigen zonder een datum van " +"ondertekenen." + +#. module: account_banking_sepa_direct_debit +#: selection:sdd.mandate,recurrent_sequence_type:0 +msgid "Final" +msgstr "Definitief" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd.wizard,state:0 +msgid "Finish" +msgstr "Gereed" + +#. module: account_banking_sepa_direct_debit +#: view:res.partner:0 +#: view:res.partner.bank:0 +msgid "SDD Mandates" +msgstr "SDD machteging" + +#. module: account_banking_sepa_direct_debit +#: constraint:payment.line:0 +#: constraint:sdd.mandate:0 +msgid "Error msg in raise" +msgstr "Fout bericht" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,state:0 +msgid "Reconciled" +msgstr "Afgeletterd" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,recurrent_sequence_type:0 +msgid "Sequence Type for Next Debit" +msgstr "Reeks soort voor volgende incasso" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,charge_bearer:0 +#: selection:banking.export.sdd.wizard,charge_bearer:0 +msgid "Borne by Creditor" +msgstr "Op rekening van schuldeiser" + +#. module: account_banking_sepa_direct_debit +#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.sdd_mandate_action +#: model:ir.ui.menu,name:account_banking_sepa_direct_debit.sdd_mandate_menu +#: view:res.partner.bank:0 +#: field:res.partner.bank,sdd_mandate_ids:0 +msgid "SEPA Direct Debit Mandates" +msgstr "SEPA incasso machtegingen" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd.wizard:0 +#: view:sdd.mandate:0 +msgid "Validate" +msgstr "Bevestigen" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_recurring +#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.recurrent_sequence_type_recurring +msgid "Sequence Type set to Recurring" +msgstr "Reeks soort ingesteld op herhalend" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd.wizard:0 +msgid "Generate" +msgstr "Genereer" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.mandate_cancel +msgid "SEPA Direct Debit Mandate Cancelled" +msgstr "SEPA incasso machtegingen geannuleerd" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,charge_bearer:0 +#: selection:banking.export.sdd.wizard,charge_bearer:0 +msgid "Borne by Debtor" +msgstr "Rekening van schuldenaar" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:212 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:218 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:224 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:232 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:239 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:245 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:253 +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:395 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:140 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:192 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:199 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:209 +#, python-format +msgid "Error:" +msgstr "Fout:" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,message_ids:0 +msgid "Messages" +msgstr "Berichten" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,unique_mandate_reference:0 +msgid "Unique Mandate Reference" +msgstr "Unieke machtiging referentie" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +#: selection:sdd.mandate,state:0 +msgid "Cancelled" +msgstr "Geannuleerd" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:141 +#, python-format +msgid "" +"Payment Type Code '%s' is not supported. The only Payment Type Code " +"supported for SEPA Direct Debit are 'pain.008.001.02', 'pain.008.001.03' and " +"'pain.008.001.04'." +msgstr "" +"Betaal soort code '%s' wordt niet ondersteund. De enige betaalsoort code " +"ondersteund voor SEPA incasso's zijn 'pain.008.001.02', 'pain.008.001.03' en " +"'pain.008.001.04'." + +#. module: account_banking_sepa_direct_debit +#: help:sdd.mandate,message_unread:0 +msgid "If checked new messages require your attention." +msgstr "Indien aangevinkt zullen nieuwe berichten uw aandacht vragen." + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,file_id:0 +msgid "SDD File" +msgstr "SDD bestand" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.mandate_expired +msgid "SEPA Direct Debit Mandate has Expired" +msgstr "SEPA Direct incasso machtiging is verlopen" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:246 +#, python-format +msgid "" +"The recurrent mandate '%s' which is not marked as 'Migrated to SEPA' must " +"have its recurrent sequence type set to 'First'." +msgstr "" +"Bij de herhalende machtiging '%s' welke niet is gemarkeerd als 'gemigreerd " +"naar SEPA' dient de reeks soort te worden ingesteld op 'Eerste'." + +#. module: account_banking_sepa_direct_debit +#: help:banking.export.sdd,charge_bearer:0 +#: help:banking.export.sdd.wizard,charge_bearer:0 +msgid "" +"Following service level : transaction charges are to be applied following " +"the rules agreed in the service level and/or scheme (SEPA Core messages must " +"use this). Shared : transaction charges on the creditor side are to be borne " +"by the creditor, transaction charges on the debtor side are to be borne by " +"the debtor. Borne by creditor : all transaction charges are to be borne by " +"the creditor. Borne by debtor : all transaction charges are to be borne by " +"the debtor." +msgstr "" +"Volg service level: Transactie kosten worden toegepast volgens de " +"afgesproken regels in het service level en/of schema (Voor SEPA berichten " +"deze gebruiken). Gedeeld : De transactiekosten aan de crediteur zijde zijn " +"voor de schuldenaar, transactiekosten aan de debiteur kant zijn voor de " +"schuldeiser. Op rekening van de schuldenaar: Alle transactie kosten zijn " +"voor rekening van de schuldenaar. Op rekening van de schuldeiser: Alle " +"transactie kosten zijn voor rekening van de schuldeiser." + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +msgid "Reference" +msgstr "Referentie" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd:0 +msgid "SEPA Direct Debit" +msgstr "SEPA Incasso (Direct Debit)" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd.wizard:0 +msgid "SEPA Direct Debit XML file generation" +msgstr "SEPA Incasso XML bestand aanmaken" + +#. module: account_banking_sepa_direct_debit +#: help:sdd.mandate,message_summary:0 +msgid "" +"Holds the Chatter summary (number of messages, ...). This summary is " +"directly in html format in order to be inserted in kanban views." +msgstr "" +"Bevat de samenvatting van de chatter (aantal berichten,...). Deze " +"samenvatting is direct in html formaat om zo in de kanban weergave te worden " +"ingevoegd." + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_payment_line +msgid "Payment Line" +msgstr "Betaalregel" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,create_date:0 +msgid "Generation Date" +msgstr "Aangemaakt op" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:396 +#, python-format +msgid "" +"The payment line with reference '%s' has the bank account '%s' which is not " +"attached to the mandate '%s' (this mandate is attached to the bank account " +"'%s')." +msgstr "" +"De betaalregel met referentie '%s' heeft het bankrekeningnummer '%s' welke " +"niet is gekoppeld aan de machtiging '%s' (deze machtiging is gekoppeld aan " +"bankrekening '%s')." + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd.wizard,state:0 +msgid "Create" +msgstr "Aanmaken" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,nb_transactions:0 +#: field:banking.export.sdd.wizard,nb_transactions:0 +msgid "Number of Transactions" +msgstr "Aantal transacties" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +#: selection:sdd.mandate,type:0 +msgid "One-Off" +msgstr "Eenmalig" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,state:0 +#: field:banking.export.sdd.wizard,state:0 +msgid "State" +msgstr "Status" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:240 +#, python-format +msgid "The recurrent mandate '%s' must have a sequence type." +msgstr "De herhalende machtiging '%s' dient een reeks soort te hebben." + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,message_follower_ids:0 +msgid "Followers" +msgstr "Volgers" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,message_unread:0 +msgid "Unread Messages" +msgstr "Ongelezen berichten" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd:0 +#: field:banking.export.sdd,payment_order_ids:0 +#: field:banking.export.sdd.wizard,payment_order_ids:0 +msgid "Payment Orders" +msgstr "Betaalopdrachten" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +msgid "Type" +msgstr "Soort" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,state:0 +msgid "Sent" +msgstr "Verstuurd" + +#. module: account_banking_sepa_direct_debit +#: field:res.company,original_creditor_identifier:0 +msgid "Original Creditor Identifier" +msgstr "Originele Incassant-ID" + +#. module: account_banking_sepa_direct_debit +#: selection:sdd.mandate,recurrent_sequence_type:0 +msgid "Recurring" +msgstr "Terugkerend" + +#. module: account_banking_sepa_direct_debit +#: help:res.company,sepa_creditor_identifier:0 +msgid "" +"Enter the Creditor Identifier that has been attributed to your company to " +"make SEPA Direct Debits. This identifier is composed of :\n" +"- your country ISO code (2 letters)\n" +"- a 2-digits checkum\n" +"- a 3-letters business code\n" +"- a country-specific identifier" +msgstr "" +"Geef de Incassant-ID in, welke is toegewezen aan uw bedrijf om incasso's uit " +"te voeren. De Incassant-ID is samengesteld uit:\n" +"- uw ISO landcode (2 letters)\n" +"- een 2 cijferig controlegetal\n" +"- een 3 cijferig business code\n" +"- een landspecifieke identifier" + +#. module: account_banking_sepa_direct_debit +#: sql_constraint:sdd.mandate:0 +msgid "A Mandate with the same reference already exists for this company !" +msgstr "Een machtiging met dezelfde referentie bestaat al vooR dit bedrijf!" + +#. module: account_banking_sepa_direct_debit +#: help:sdd.mandate,state:0 +msgid "" +"Only valid mandates can be used in a payment line. A cancelled mandate is a " +"mandate that has been cancelled by the customer. A one-off mandate expires " +"after its first use. A recurrent mandate expires after it's final use or if " +"it hasn't been used for 36 months." +msgstr "" +"Alleen geldige machtigingen kunnen worden gebruikt op betaalregels. Een " +"geannuleerde machtiging is een machtiging welke is geannuleerd door de " +"klant. Een eenmalige machtiging verloopt na eenmalig gebruik. Een herhalende " +"machtiging verloopt na zijn laatste gebruik of als deze niet is gebruikt " +"voor 36 maanden." + +#. module: account_banking_sepa_direct_debit +#: help:sdd.mandate,recurrent_sequence_type:0 +msgid "" +"This field is only used for Recurrent mandates, not for One-Off mandates." +msgstr "" +"Dit veld wordt alleen gebruikt voor herhalende machtigingen, niet voor een " +"eenmalige machtiging." + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:213 +#, python-format +msgid "The date of signature of mandate '%s' is in the future !" +msgstr "" +"De datum van de handtekening van de machtiging '%s' is in de toekomst!" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +msgid "Signature Date" +msgstr "Handtekening datum" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,charge_bearer:0 +#: field:banking.export.sdd.wizard,charge_bearer:0 +msgid "Charge Bearer" +msgstr "Kostenverdeling" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,partner_id:0 +msgid "Partner" +msgstr "Relatie" + +#. module: account_banking_sepa_direct_debit +#: selection:sdd.mandate,recurrent_sequence_type:0 +msgid "First" +msgstr "Eerste" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,signature_date:0 +msgid "Date of Signature of the Mandate" +msgstr "Datum avn de handtekening van de machtiging" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.mandate_cancel +msgid "Mandate Cancelled" +msgstr "Machtiging geannuleerd" + +#. module: account_banking_sepa_direct_debit +#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.act_banking_export_sdd_payment_order +msgid "Generated SEPA Direct Debit Files" +msgstr "Genereerde SEPA incasso bestanden" + +#. module: account_banking_sepa_direct_debit +#: help:sdd.mandate,sepa_migrated:0 +msgid "" +"If this field is not active, the mandate section of the next direct debit " +"file that include this mandate will contain the 'Original Mandate " +"Identification' and the 'Original Creditor Scheme Identification'. This is " +"required in a few countries (Belgium for instance), but not in all " +"countries. If this is not required in your country, you should keep this " +"field always active." +msgstr "" +"Indien niet aangevinkt, zal het machtiging gedeelte van het volgende incasso " +"bestand, dat deze machtiging bevat, de 'Originele machtiging identificatie' " +"en de 'Origineel schuldeiser identificatie' bevatten. Dit is verplicht in " +"een aantal landen (zoals bijvoorbeeld België), maar niet in alle landen. " +"Indien dit niet verplicht is in uw land, dient u dit veld altijd aangevinkt " +"te houden." + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,company_id:0 +msgid "Company" +msgstr "Bedijf" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_banking_export_sdd_wizard +msgid "Export SEPA Direct Debit File" +msgstr "Exporteer SEPA incasso bestand" + +#. module: account_banking_sepa_direct_debit +#: help:banking.export.sdd,batch_booking:0 +#: help:banking.export.sdd.wizard,batch_booking:0 +msgid "" +"If true, the bank statement will display only one credit line for all the " +"direct debits of the SEPA file ; if false, the bank statement will display " +"one credit line per direct debit of the SEPA file." +msgstr "" +"Indien aangevinkt, zal het bankafschrift maar één credit regel weergeven " +"voor alle incasso's van het SEPA bestand. Indien niet aangevinkt wordt voor " +"iedere incasso een credit regel weergegeven op het bankafschrift." + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:225 +#, python-format +msgid "" +"Cannot validate the mandate '%s' because it is not attached to a bank " +"account." +msgstr "" +"Kan de machtiging '%s' niet bevestigen omdat deze niet is gekoppeld aan een " +"bankrekening." + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,state:0 +#: view:sdd.mandate:0 +#: selection:sdd.mandate,state:0 +msgid "Draft" +msgstr "Concept" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:290 +#, python-format +msgid "Mandate update" +msgstr "Machtiging bijwerken" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,charge_bearer:0 +#: selection:banking.export.sdd.wizard,charge_bearer:0 +msgid "Shared" +msgstr "Gedeeld" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,batch_booking:0 +#: field:banking.export.sdd.wizard,batch_booking:0 +msgid "Batch Booking" +msgstr "Bach verwerking" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,sepa_migrated:0 +msgid "Migrated to SEPA" +msgstr "Gemigreerd naar SEPa" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,state:0 +msgid "Status" +msgstr "Status" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,total_amount:0 +#: field:banking.export.sdd.wizard,total_amount:0 +msgid "Total Amount" +msgstr "Totaalbedrag" + +#. module: account_banking_sepa_direct_debit +#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.action_account_banking_sdd +#: model:ir.ui.menu,name:account_banking_sepa_direct_debit.menu_account_banking_sdd +msgid "SEPA Direct Debit Files" +msgstr "SEPA incasso bestanden" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,charge_bearer:0 +#: selection:banking.export.sdd.wizard,charge_bearer:0 +msgid "Following Service Level" +msgstr "Volg service level" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:233 +#, python-format +msgid "" +"The mandate '%s' can't have a date of last debit before the date of " +"signature." +msgstr "" +"De machtiging '%s' kan geen datum van laatste incasso hebben die eerder is " +"dan de datum van ondertekening." + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_final +#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.recurrent_sequence_type_final +msgid "Sequence Type set to Final" +msgstr "Reeks soort ingesteld op definitief" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,message_is_follower:0 +msgid "Is a Follower" +msgstr "Is een volger" + +#. module: account_banking_sepa_direct_debit +#: help:sdd.mandate,original_mandate_identification:0 +msgid "" +"When the field 'Migrated to SEPA' is not active, this field will be used as " +"the Original Mandate Identification in the Direct Debit file." +msgstr "" +"Wanneer het veld 'gemigreerd naar SEPA' niet actief is, zal dit veld worden " +"gebruikt als de originele machtiging identificatie in het incasso bestand." + +#. module: account_banking_sepa_direct_debit +#: view:payment.order:0 +msgid "SDD Mandate" +msgstr "SDD machtiging" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,original_mandate_identification:0 +msgid "Original Mandate Identification" +msgstr "Originele machtiging indificatie" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_res_company +msgid "Companies" +msgstr "Bedrijven" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,message_summary:0 +msgid "Summary" +msgstr "Samenvatting" + +#. module: account_banking_sepa_direct_debit +#: model:res.groups,name:account_banking_sepa_direct_debit.group_original_mandate_required +msgid "Original Mandate Required (SEPA)" +msgstr "Originele machtiging benodigd (SEPA)" + +#. module: account_banking_sepa_direct_debit +#: field:account.invoice,sdd_mandate_id:0 +#: model:ir.model,name:account_banking_sepa_direct_debit.model_sdd_mandate +#: field:payment.line,sdd_mandate_id:0 +#: view:sdd.mandate:0 +msgid "SEPA Direct Debit Mandate" +msgstr "SEPA incasso machtiging" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:193 +#, python-format +msgid "" +"Missing SEPA Direct Debit mandate on the payment line with partner '%s' and " +"Invoice ref '%s'." +msgstr "" +"Ontbrekende SEPA incasso machtiging op de betaalregel met relatie '%s' en " +"factuur referentie '%s'." + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:210 +#, python-format +msgid "" +"The mandate with reference '%s' for partner '%s' has type set to 'One-Off' " +"and it has a last debit date set to '%s', so we can't use it." +msgstr "" +"De machtiging referentie '%s' voor relatie %s' is ingesteld op 'eenmalig' en " +"de laatste incasso datum is ingesteld op '%s'. Zodoende kunnen we deze niet " +"gebruiken." + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,scan:0 +msgid "Scan of the Mandate" +msgstr "Scan van de machteging" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,last_debit_date:0 +msgid "Date of the Last Debit" +msgstr "Datum van laatste incasso" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.mandate_expired +msgid "Mandate Expired" +msgstr "Machtiging verlopen" + +#. module: account_banking_sepa_direct_debit +#: constraint:res.company:0 +msgid "Invalid SEPA Creditor Identifier." +msgstr "Ongeldige SEPA Incassant-ID." + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_res_partner_bank +msgid "Bank Accounts" +msgstr "Bankrekeningen" + +#. module: account_banking_sepa_direct_debit +#: model:ir.actions.act_window,help:account_banking_sepa_direct_debit.sdd_mandate_action +msgid "" +"

\n" +" Click to create a new SEPA Direct Debit Mandate.\n" +"

\n" +" A SEPA Direct Debit Mandate is a document signed by your customer " +"that gives you the autorization to do one or several direct debits on his " +"bank account.\n" +"

\n" +" " +msgstr "" +"

\n" +" Klik voor het maken van een nieuwe SEPA incasso machtiging.\n" +"

\n" +" Een SEPA incasso machtiging is een document ondertekend door uw " +"klant, welke u toestemming geeft om incasso's uit te voeren op zijn " +"bankrekening.\n" +"

\n" +" " + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd:0 +msgid "General Information" +msgstr "Algemene informatie" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +#: selection:sdd.mandate,state:0 +msgid "Valid" +msgstr "Geldig" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_account_invoice +msgid "Invoice" +msgstr "Factuur" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd.wizard:0 +#: view:sdd.mandate:0 +msgid "Cancel" +msgstr "Annuleer" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +#: field:sdd.mandate,payment_line_ids:0 +msgid "Related Payment Lines" +msgstr "Gerelateerde betaalregels" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +#: selection:sdd.mandate,type:0 +msgid "Recurrent" +msgstr "Terugkerend" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,type:0 +msgid "Type of Mandate" +msgstr "Soort machtiging" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.mandate_valid +msgid "Mandate Validated" +msgstr "Machtiging bevestigd" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,file:0 +msgid "SEPA File" +msgstr "SEPA bestand" + +#. module: account_banking_sepa_direct_debit +#: field:res.company,sepa_creditor_identifier:0 +msgid "SEPA Creditor Identifier" +msgstr "SEPA Incassant-ID" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_banking_export_sdd +msgid "SEPA Direct Debit export" +msgstr "SEPA incasso export" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +#: selection:sdd.mandate,state:0 +msgid "Expired" +msgstr "Verlopen" + +#. module: account_banking_sepa_direct_debit +#: field:sdd.mandate,partner_bank_id:0 +msgid "Bank Account" +msgstr "Bankrekening" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:254 +#, python-format +msgid "" +"You must set the 'Original Mandate Identification' on the recurrent mandate " +"'%s' which is not marked as 'Migrated to SEPA'." +msgstr "" +"U dient de 'Originele machtiging identificatie' in te stellen op de " +"herhalende machtiging '%s' welke niet is gemarkeerd als 'Gemigreerd naar " +"SEPA'" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_first +#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.recurrent_sequence_type_first +msgid "Sequence Type set to First" +msgstr "Reeks ingesteld op eerste" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:291 +#, python-format +msgid "" +"As you changed the bank account attached to this mandate, the 'Sequence " +"Type' has been set back to 'First'." +msgstr "" +"Omdat u de gekoppelde bankrekening heeft gewijzigd is de reeks terug gezet " +"naar 'Eerste'." + +#. module: account_banking_sepa_direct_debit +#: help:sdd.mandate,message_ids:0 +msgid "Messages and communication history" +msgstr "Berichten en communicatie historie" + +#. module: account_banking_sepa_direct_debit +#: view:sdd.mandate:0 +msgid "Search SEPA Direct Debit Mandates" +msgstr "Zoek SEPA incasso machtigingen" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,file:0 +msgid "File" +msgstr "Bestand" diff --git a/account_banking_sepa_direct_debit/mandate_expire_cron.xml b/account_banking_sepa_direct_debit/mandate_expire_cron.xml new file mode 100644 index 000000000..4cb0693d2 --- /dev/null +++ b/account_banking_sepa_direct_debit/mandate_expire_cron.xml @@ -0,0 +1,26 @@ + + + + + + + + + Set SEPA Direct Debit Mandates to Expired + + + 1 + days + -1 + + + + + + + + diff --git a/account_banking_sepa_direct_debit/models/__init__.py b/account_banking_sepa_direct_debit/models/__init__.py new file mode 100644 index 000000000..36b8b4b56 --- /dev/null +++ b/account_banking_sepa_direct_debit/models/__init__.py @@ -0,0 +1,28 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# SEPA Direct Debit module for OpenERP +# Copyright (C) 2013 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 . +# +############################################################################## + +from . import account_invoice +from . import banking_export_sdd +from . import payment_line +from . import res_company +from . import res_partner_bank +from . import sdd_mandate diff --git a/account_banking_sepa_direct_debit/models/account_invoice.py b/account_banking_sepa_direct_debit/models/account_invoice.py new file mode 100644 index 000000000..eee2b7757 --- /dev/null +++ b/account_banking_sepa_direct_debit/models/account_invoice.py @@ -0,0 +1,32 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# SEPA Direct Debit module for OpenERP +# Copyright (C) 2013 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 . +# +############################################################################## + +from openerp import models, fields + + +class AccountInvoice(models.Model): + _inherit = 'account.invoice' + + sdd_mandate_id = fields.Many2one( + 'sdd.mandate', string='SEPA Direct Debit Mandate', + domain=[('state', '=', 'valid')], readonly=True, + states={'draft': [('readonly', False)]}) diff --git a/account_banking_sepa_direct_debit/models/banking_export_sdd.py b/account_banking_sepa_direct_debit/models/banking_export_sdd.py new file mode 100644 index 000000000..80f5f4a13 --- /dev/null +++ b/account_banking_sepa_direct_debit/models/banking_export_sdd.py @@ -0,0 +1,78 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# SEPA Direct Debit module for OpenERP +# Copyright (C) 2013 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 . +# +############################################################################## + +from openerp import models, fields, api +from openerp.addons.decimal_precision import decimal_precision as dp +from unidecode import unidecode + + +class BankingExportSdd(models.Model): + """SEPA Direct Debit export""" + _name = 'banking.export.sdd' + _description = __doc__ + _rec_name = 'filename' + + @api.one + def _generate_filename(self): + filename = '' + if self.payment_order_ids: + ref = self.payment_order_ids[0].reference + label = unidecode(ref.replace('/', '-')) if ref else 'error' + filename = 'sdd_%s.xml' % label + self.filename = filename + + payment_order_ids = fields.Many2many( + comodel_name='payment.order', + relation='account_payment_order_sdd_rel', + column1='banking_export_sepa_id', column2='account_order_id', + string='Payment Orders', + readonly=True) + nb_transactions = fields.Integer( + string='Number of Transactions', readonly=True) + total_amount = fields.Float( + string='Total Amount', digits_compute=dp.get_precision('Account'), + readonly=True) + batch_booking = fields.Boolean( + 'Batch Booking', readonly=True, + help="If true, the bank statement will display only one credit line " + "for all the direct debits of the SEPA file ; if false, the bank " + "statement will display one credit line per direct debit of the " + "SEPA file.") + charge_bearer = fields.Selection( + [('SLEV', 'Following Service Level'), + ('SHAR', 'Shared'), + ('CRED', 'Borne by Creditor'), + ('DEBT', 'Borne by Debtor')], 'Charge Bearer', readonly=True, + help="Following service level : transaction charges are to be applied " + "following the rules agreed in the service level and/or scheme " + "(SEPA Core messages must use this). Shared : transaction " + "charges on the creditor side are to be borne by the creditor, " + "transaction charges on the debtor side are to be borne by the " + "debtor. Borne by creditor : all transaction charges are to be " + "borne by the creditor. Borne by debtor : all transaction " + "charges are to be borne by the debtor.") + create_date = fields.Datetime(string='Generation Date', readonly=True) + file = fields.Binary(string='SEPA File', readonly=True) + filename = fields.Char(compute=_generate_filename, size=256, + string='Filename', readonly=True, store=True) + state = fields.Selection([('draft', 'Draft'), ('sent', 'Sent')], + string='State', readonly=True, default='draft') diff --git a/account_banking_sepa_direct_debit/models/payment_line.py b/account_banking_sepa_direct_debit/models/payment_line.py new file mode 100644 index 000000000..31c47bd89 --- /dev/null +++ b/account_banking_sepa_direct_debit/models/payment_line.py @@ -0,0 +1,74 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# SEPA Direct Debit module for OpenERP +# Copyright (C) 2013 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 . +# +############################################################################## + +from openerp import models, fields, api, exceptions, _ + + +class PaymentLine(models.Model): + _inherit = 'payment.line' + + sdd_mandate_id = fields.Many2one( + 'sdd.mandate', string='SEPA Direct Debit Mandate', + domain=[('state', '=', 'valid')]) + + def create(self, vals=None): + """If the customer invoice has a mandate, take it. Otherwise, take the + first valid mandate of the bank account. + """ + if not vals: + vals = {} + partner_bank_id = vals.get('bank_id') + if (self.env.context.get('search_payment_order_type') == 'debit' + and 'sdd_mandate_id' not in vals): + if vals.get('move_line_id'): + line = self.env['account.move.line'].browse( + vals['move_line_id']) + if (line.invoice and line.invoice.type == 'out_invoice' + and line.invoice.sdd_mandate_id): + vals.update( + {'sdd_mandate_id': line.invoice.sdd_mandate_id.id, + 'bank_id': + line.invoice.sdd_mandate_id.partner_bank_id.id}) + if partner_bank_id and 'sdd_mandate_id' not in vals: + mandates = self.env['sdd.mandate'].search( + [('partner_bank_id', '=', partner_bank_id), + ('state', '=', 'valid')]) + if mandates: + vals['sdd_mandate_id'] = mandates.ids[0] + return super(PaymentLine, self).create(vals) + + @api.one + @api.constrains('sdd_mandate_id', 'bank_id') + def _check_mandate_bank_link(self): + if (self.sdd_mandate_id and self.bank_id + and self.sdd_mandate_id.partner_bank_id.id != + self.bank_id.id): + raise exceptions.Warning( + _('Error:'), + _("The payment line with reference '%s' has the bank " + "account '%s' which is not attached to the mandate " + "'%s' (this mandate is attached to the bank account " + "'%s').") % + (self.name, + self.bank_id.name_get()[0][1], + self.sdd_mandate_id.unique_mandate_reference, + self.sdd_mandate_id.partner_bank_id.name_get()[0][1])) diff --git a/account_banking_sepa_direct_debit/models/res_company.py b/account_banking_sepa_direct_debit/models/res_company.py new file mode 100644 index 000000000..327edc401 --- /dev/null +++ b/account_banking_sepa_direct_debit/models/res_company.py @@ -0,0 +1,80 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# SEPA Direct Debit module for OpenERP +# Copyright (C) 2013 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 . +# +############################################################################## + +from openerp import models, fields, api, exceptions, _ +import logging + +logger = logging.getLogger(__name__) + + +class ResCompany(models.Model): + _inherit = 'res.company' + + sepa_creditor_identifier = fields.Char( + string='SEPA Creditor Identifier', size=35, + help="Enter the Creditor Identifier that has been attributed to your " + "company to make SEPA Direct Debits. This identifier is composed " + "of :\n- your country ISO code (2 letters)\n- a 2-digits " + "checkum\n- a 3-letters business code\n- a country-specific " + "identifier") + original_creditor_identifier = fields.Char( + string='Original Creditor Identifier', size=70) + + def is_sepa_creditor_identifier_valid( + self, sepa_creditor_identifier): + """Check if SEPA Creditor Identifier is valid + @param sepa_creditor_identifier: SEPA Creditor Identifier as str + or unicode + @return: True if valid, False otherwise + """ + if not isinstance(sepa_creditor_identifier, (str, unicode)): + return False + try: + sci = str(sepa_creditor_identifier).lower() + except: + logger.warning( + "SEPA Creditor ID should contain only ASCII caracters.") + return False + if len(sci) < 9: + return False + before_replacement = sci[7:] + sci[0:2] + '00' + logger.debug( + "SEPA ID check before_replacement = %s" % before_replacement) + after_replacement = '' + for char in before_replacement: + if char.isalpha(): + after_replacement += str(ord(char)-87) + else: + after_replacement += char + logger.debug( + "SEPA ID check after_replacement = %s" % after_replacement) + return int(sci[2:4]) == (98 - (int(after_replacement) % 97)) + + @api.one + @api.constrains('sepa_creditor_identifier') + def _check_sepa_creditor_identifier(self): + if self.sepa_creditor_identifier: + if not self.is_sepa_creditor_identifier_valid( + self.sepa_creditor_identifier): + raise exceptions.Warning( + _('Error'), + _("Invalid SEPA Creditor Identifier.")) diff --git a/account_banking_sepa_direct_debit/models/res_partner_bank.py b/account_banking_sepa_direct_debit/models/res_partner_bank.py new file mode 100644 index 000000000..132a4fa42 --- /dev/null +++ b/account_banking_sepa_direct_debit/models/res_partner_bank.py @@ -0,0 +1,30 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# SEPA Direct Debit module for OpenERP +# Copyright (C) 2013 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 . +# +############################################################################## + +from openerp import models, fields + + +class ResPartnerBank(models.Model): + _inherit = 'res.partner.bank' + + sdd_mandate_ids = fields.One2many( + 'sdd.mandate', 'partner_bank_id', string='SEPA Direct Debit Mandates') diff --git a/account_banking_sepa_direct_debit/models/sdd_mandate.py b/account_banking_sepa_direct_debit/models/sdd_mandate.py new file mode 100644 index 000000000..ebee316d2 --- /dev/null +++ b/account_banking_sepa_direct_debit/models/sdd_mandate.py @@ -0,0 +1,291 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# SEPA Direct Debit module for OpenERP +# Copyright (C) 2013 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 . +# +############################################################################## + +from openerp.osv import orm, fields +from openerp.tools.translate import _ +from datetime import datetime +from dateutil.relativedelta import relativedelta +import logging + +NUMBER_OF_UNUSED_MONTHS_BEFORE_EXPIRY = 36 + +logger = logging.getLogger(__name__) + + +class SddMandate(orm.Model): + """SEPA Direct Debit Mandate""" + _name = 'sdd.mandate' + _description = __doc__ + _rec_name = 'unique_mandate_reference' + _inherit = ['mail.thread'] + _order = 'signature_date desc' + _track = { + 'state': { + 'account_banking_sepa_direct_debit.mandate_valid': + lambda self, cr, uid, obj, ctx=None: + obj['state'] == 'valid', + 'account_banking_sepa_direct_debit.mandate_expired': + lambda self, cr, uid, obj, ctx=None: + obj['state'] == 'expired', + 'account_banking_sepa_direct_debit.mandate_cancel': + lambda self, cr, uid, obj, ctx=None: + obj['state'] == 'cancel', + }, + 'recurrent_sequence_type': { + 'account_banking_sepa_direct_debit.recurrent_sequence_type_first': + lambda self, cr, uid, obj, ctx=None: + obj['recurrent_sequence_type'] == 'first', + 'account_banking_sepa_direct_debit.' + 'recurrent_sequence_type_recurring': + lambda self, cr, uid, obj, ctx=None: + obj['recurrent_sequence_type'] == 'recurring', + 'account_banking_sepa_direct_debit.recurrent_sequence_type_final': + lambda self, cr, uid, obj, ctx=None: + obj['recurrent_sequence_type'] == 'final', + } + } + + _columns = { + 'partner_bank_id': fields.many2one( + 'res.partner.bank', 'Bank Account', track_visibility='onchange'), + 'partner_id': fields.related( + 'partner_bank_id', 'partner_id', type='many2one', + relation='res.partner', string='Partner', readonly=True), + 'company_id': fields.many2one('res.company', 'Company', required=True), + 'unique_mandate_reference': fields.char( + 'Unique Mandate Reference', size=35, readonly=True, + track_visibility='always'), + 'type': fields.selection([ + ('recurrent', 'Recurrent'), + ('oneoff', 'One-Off'), + ], 'Type of Mandate', required=True, track_visibility='always'), + 'recurrent_sequence_type': fields.selection([ + ('first', 'First'), + ('recurring', 'Recurring'), + ('final', 'Final'), + ], 'Sequence Type for Next Debit', track_visibility='onchange', + help="This field is only used for Recurrent mandates, not for " + "One-Off mandates."), + 'signature_date': fields.date( + 'Date of Signature of the Mandate', track_visibility='onchange'), + 'scan': fields.binary('Scan of the Mandate'), + 'last_debit_date': fields.date( + 'Date of the Last Debit', readonly=True), + 'state': fields.selection([ + ('draft', 'Draft'), + ('valid', 'Valid'), + ('expired', 'Expired'), + ('cancel', 'Cancelled'), + ], 'Status', + help="Only valid mandates can be used in a payment line. A " + "cancelled mandate is a mandate that has been cancelled by " + "the customer. A one-off mandate expires after its first use. " + "A recurrent mandate expires after it's final use or if it " + "hasn't been used for 36 months."), + 'payment_line_ids': fields.one2many( + 'payment.line', 'sdd_mandate_id', "Related Payment Lines"), + 'sepa_migrated': fields.boolean( + 'Migrated to SEPA', track_visibility='onchange', + help="If this field is not active, the mandate section of the " + "next direct debit file that include this mandate will contain " + "the 'Original Mandate Identification' and the 'Original " + "Creditor Scheme Identification'. This is required in a few " + "countries (Belgium for instance), but not in all countries. " + "If this is not required in your country, you should keep this " + "field always active."), + 'original_mandate_identification': fields.char( + 'Original Mandate Identification', size=35, + track_visibility='onchange', + help="When the field 'Migrated to SEPA' is not active, this " + "field will be used as the Original Mandate Identification in " + "the Direct Debit file."), + 'scheme': fields.selection([('CORE', 'Basic (CORE)'), + ('B2B', 'Enterprise (B2B)')], + 'Scheme', required=True), + } + + _defaults = { + 'company_id': lambda self, cr, uid, context: + self.pool['res.company']._company_default_get( + cr, uid, 'sdd.mandate', context=context), + 'unique_mandate_reference': '/', + 'state': 'draft', + 'sepa_migrated': True, + 'scheme': 'CORE', + } + + _sql_constraints = [( + 'mandate_ref_company_uniq', + 'unique(unique_mandate_reference, company_id)', + 'A Mandate with the same reference already exists for this company !' + )] + + def create(self, cr, uid, vals, context=None): + if vals.get('unique_mandate_reference', '/') == '/': + vals['unique_mandate_reference'] = \ + self.pool['ir.sequence'].next_by_code( + cr, uid, 'sdd.mandate.reference', context=context) + return super(SddMandate, self).create(cr, uid, vals, context=context) + + def _check_sdd_mandate(self, cr, uid, ids): + for mandate in self.browse(cr, uid, ids): + if (mandate.signature_date and + mandate.signature_date > + datetime.today().strftime('%Y-%m-%d')): + raise orm.except_orm( + _('Error:'), + _("The date of signature of mandate '%s' is in the " + "future !") + % mandate.unique_mandate_reference) + if mandate.state == 'valid' and not mandate.signature_date: + raise orm.except_orm( + _('Error:'), + _("Cannot validate the mandate '%s' without a date of " + "signature.") + % mandate.unique_mandate_reference) + if mandate.state == 'valid' and not mandate.partner_bank_id: + raise orm.except_orm( + _('Error:'), + _("Cannot validate the mandate '%s' because it is not " + "attached to a bank account.") + % mandate.unique_mandate_reference) + + if (mandate.signature_date and mandate.last_debit_date and + mandate.signature_date > mandate.last_debit_date): + raise orm.except_orm( + _('Error:'), + _("The mandate '%s' can't have a date of last debit " + "before the date of signature.") + % mandate.unique_mandate_reference) + if (mandate.type == 'recurrent' + and not mandate.recurrent_sequence_type): + raise orm.except_orm( + _('Error:'), + _("The recurrent mandate '%s' must have a sequence type.") + % mandate.unique_mandate_reference) + if (mandate.type == 'recurrent' and not mandate.sepa_migrated + and mandate.recurrent_sequence_type != 'first'): + raise orm.except_orm( + _('Error:'), + _("The recurrent mandate '%s' which is not marked as " + "'Migrated to SEPA' must have its recurrent sequence " + "type set to 'First'.") + % mandate.unique_mandate_reference) + if (mandate.type == 'recurrent' and not mandate.sepa_migrated + and not mandate.original_mandate_identification): + raise orm.except_orm( + _('Error:'), + _("You must set the 'Original Mandate Identification' " + "on the recurrent mandate '%s' which is not marked " + "as 'Migrated to SEPA'.") + % mandate.unique_mandate_reference) + return True + + _constraints = [ + (_check_sdd_mandate, "Error msg in raise", [ + 'last_debit_date', 'signature_date', 'state', 'partner_bank_id', + 'type', 'recurrent_sequence_type', 'sepa_migrated', + 'original_mandate_identification', + ]), + ] + + def mandate_type_change(self, cr, uid, ids, type): + if type == 'recurrent': + recurrent_sequence_type = 'first' + else: + recurrent_sequence_type = False + res = {'value': {'recurrent_sequence_type': recurrent_sequence_type}} + return res + + def mandate_partner_bank_change( + self, cr, uid, ids, partner_bank_id, type, recurrent_sequence_type, + last_debit_date, state): + res = {'value': {}} + if partner_bank_id: + partner_bank_read = self.pool['res.partner.bank'].read( + cr, uid, partner_bank_id, ['partner_id'])['partner_id'] + if partner_bank_read: + res['value']['partner_id'] = partner_bank_read[0] + if (state == 'valid' and partner_bank_id + and type == 'recurrent' + and recurrent_sequence_type != 'first'): + res['value']['recurrent_sequence_type'] = 'first' + res['warning'] = { + 'title': _('Mandate update'), + 'message': _( + "As you changed the bank account attached to this " + "mandate, the 'Sequence Type' has been set back to " + "'First'."), + } + return res + + def validate(self, cr, uid, ids, context=None): + to_validate_ids = [] + for mandate in self.browse(cr, uid, ids, context=context): + assert mandate.state == 'draft', 'Mandate should be in draft state' + to_validate_ids.append(mandate.id) + self.write( + cr, uid, to_validate_ids, {'state': 'valid'}, context=context) + return True + + def cancel(self, cr, uid, ids, context=None): + to_cancel_ids = [] + for mandate in self.browse(cr, uid, ids, context=context): + assert mandate.state in ('draft', 'valid'),\ + 'Mandate should be in draft or valid state' + to_cancel_ids.append(mandate.id) + self.write( + cr, uid, to_cancel_ids, {'state': 'cancel'}, context=context) + return True + + def back2draft(self, cr, uid, ids, context=None): + to_draft_ids = [] + for mandate in self.browse(cr, uid, ids, context=context): + assert mandate.state == 'cancel',\ + 'Mandate should be in cancel state' + to_draft_ids.append(mandate.id) + self.write( + cr, uid, to_draft_ids, {'state': 'draft'}, context=context) + return True + + def _sdd_mandate_set_state_to_expired(self, cr, uid, context=None): + logger.info('Searching for SDD Mandates that must be set to Expired') + expire_limit_date = datetime.today() + \ + relativedelta(months=-NUMBER_OF_UNUSED_MONTHS_BEFORE_EXPIRY) + expire_limit_date_str = expire_limit_date.strftime('%Y-%m-%d') + expired_mandate_ids = self.search(cr, uid, [ + '|', + ('last_debit_date', '=', False), + ('last_debit_date', '<=', expire_limit_date_str), + ('state', '=', 'valid'), + ('signature_date', '<=', expire_limit_date_str), + ], context=context) + if expired_mandate_ids: + self.write( + cr, uid, expired_mandate_ids, {'state': 'expired'}, + context=context) + logger.info( + 'The following SDD Mandate IDs has been set to expired: %s' + % expired_mandate_ids) + else: + logger.info('0 SDD Mandates must be set to Expired') + return True diff --git a/account_banking_sepa_direct_debit/res_partner_bank_view.xml b/account_banking_sepa_direct_debit/res_partner_bank_view.xml new file mode 100644 index 000000000..0b32e9f1c --- /dev/null +++ b/account_banking_sepa_direct_debit/res_partner_bank_view.xml @@ -0,0 +1,48 @@ + + + + + + + sdd.mandate.res.partner.bank.form + res.partner.bank + + + + + + + + + + + + sdd.mandate.res.partner.bank.tree + res.partner.bank + + + + + + + + + + + sdd.mandate.partner.form + res.partner + + + + + + + + + + diff --git a/account_banking_sepa_direct_debit/sdd_mandate_view.xml b/account_banking_sepa_direct_debit/sdd_mandate_view.xml new file mode 100644 index 000000000..bd1dd6e79 --- /dev/null +++ b/account_banking_sepa_direct_debit/sdd_mandate_view.xml @@ -0,0 +1,152 @@ + + + + + + + sdd.mandate.form + sdd.mandate + +
+
+
+ +
+

+ +

+
+ + + + + + + + + + + + + + + +
+
+ + +
+
+
+
+ + + sdd.mandate.tree + sdd.mandate + + + + + + + + + + + + + + + sdd.mandate.search + sdd.mandate + + + + + + + + + + + + + + + SEPA Direct Debit Mandates + sdd.mandate + form + tree,form + +

+ Click to create a new SEPA Direct Debit Mandate. +

+ A SEPA Direct Debit Mandate is a document signed by your customer that gives you the autorization to do one or several direct debits on his bank account. +

+
+
+ + + + + + Mandate Validated + sdd.mandate + + SEPA Direct Debit Mandate Validated + + + + Mandate Expired + sdd.mandate + + SEPA Direct Debit Mandate has Expired + + + + Mandate Cancelled + sdd.mandate + + SEPA Direct Debit Mandate Cancelled + + + + Sequence Type set to First + sdd.mandate + + Sequence Type set to First + + + + Sequence Type set to Recurring + sdd.mandate + + Sequence Type set to Recurring + + + + Sequence Type set to Final + sdd.mandate + + Sequence Type set to Final + + +
+
diff --git a/account_banking_sepa_direct_debit/security/ir.model.access.csv b/account_banking_sepa_direct_debit/security/ir.model.access.csv new file mode 100644 index 000000000..cf78ffb59 --- /dev/null +++ b/account_banking_sepa_direct_debit/security/ir.model.access.csv @@ -0,0 +1,4 @@ +"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" +"access_banking_export_sdd","Full access on banking.export.sdd","model_banking_export_sdd","account_payment.group_account_payment",1,1,1,1 +"access_sdd_mandate","Full access on sdd.mandate","model_sdd_mandate","account_payment.group_account_payment",1,1,1,1 +"access_sdd_mandate_read","Read access on sdd.mandate","model_sdd_mandate","base.group_user",1,0,0,0 diff --git a/account_banking_sepa_direct_debit/security/original_mandate_required_security.xml b/account_banking_sepa_direct_debit/security/original_mandate_required_security.xml new file mode 100644 index 000000000..e6a8570cf --- /dev/null +++ b/account_banking_sepa_direct_debit/security/original_mandate_required_security.xml @@ -0,0 +1,17 @@ + + + + + + + + Original Mandate Required (SEPA) + + + + + diff --git a/account_banking_sepa_direct_debit/sepa_direct_debit_demo.xml b/account_banking_sepa_direct_debit/sepa_direct_debit_demo.xml new file mode 100644 index 000000000..220261088 --- /dev/null +++ b/account_banking_sepa_direct_debit/sepa_direct_debit_demo.xml @@ -0,0 +1,27 @@ + + + + + + + SEPA Direct Debit La Banque Postale + + + + + + + + FR78ZZZ424242 + + + + + recurrent + first + 2014-02-01 + valid + + + + diff --git a/account_banking_sepa_direct_debit/static/description/icon.svg b/account_banking_sepa_direct_debit/static/description/icon.svg new file mode 100644 index 000000000..c3bc242a4 --- /dev/null +++ b/account_banking_sepa_direct_debit/static/description/icon.svg @@ -0,0 +1,92 @@ + + + +image/svg+xmlDIRECTDEBIT + \ No newline at end of file diff --git a/account_banking_sepa_direct_debit/static/src/img/icon.png b/account_banking_sepa_direct_debit/static/src/img/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..6d1d923b6506b33ca0825af17ed0ae36c9bd0dc6 GIT binary patch literal 6892 zcmVPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i*$` z7B3e|!Eq@702*vbL_t(|+RdAHcwFVR?tgpFo<5^8Ga8M0v1A#^k}b=Yja)D`;hH!h zp@cw^OL9)Yq+CcN<6E5%AqMj|;G$)Txm zv~I!^I(n+U|IaV%J#*-PEC8EIvy(P$%HNgdO88Wo)4Jx^$zJiqnE@oNL}_sbt5#-` zn{6jC!MNykqR|+A0~0j24O4rvo6#{JPP>^cm3fMya-x68^T%U{J0Cw#*ERV+0)Xw? z^PE*Hm)%;JXZu1R7){^3zgZMD8a}eEn2qa~A&T!EDNduL$l2G| z?|I^Ib>}0m9&R7`rvY&Lm$vLGD@wn^;}2!--hWoi&vSCawd=523?E3mswy0=Zs#vA zoun|&&brdfuKK2dAOG~%haUe>0oZjz#fp-mjE6JR61P43w|dd#O5!uut;cB4@?ovo zQ$0NQ{Bb_Au|UyC!v5;ou3Mk^+v&3(H~?R}sp@l8Yx3{!=oxn%sq5p*|9S~&uEY<; z=<3=oDl2klUdLhz&puy6PtO=1-C8(wx_RhpKY8?x=ibRRHSgrhKe+w!`!|&5-t)J8 zO$jE8iLc(g^#gPF`Bo?##g=Sl+#MhkiefhDDJ#h!H^;$m|5#(WxIF8s%JMAJKMuF= zdtU*ls6e{y3s*c@R+N6rZ(lg6`Q*peu(_)6JsINC$> zNhT&HgP;mn%z8%0{G_=O*>rIsFYKuov(u8Qwr?!RaR*!X3=X2a=MdPs73ou#eexMs ziuLN>zgRDR`R1)SY?gOqY+y`e0MUY=F=MeNqS0tTRZ&$1k7p7^_M^o7sPY7A z%#FnmMHJ)L@cF~+ef=z18A+^NoilUoqcxpuSerNV`oEt!g59jeYSI7cg#$0%aNq#) zdjjCc-`(+KNs;TuXZ}_%e&yy%m+bP9D8z(xM13|%wroUEL`4NuR7IKon;8I9Rh@pR z#NPw_zA?gqZgj#3MtzKl$sk&-hSv5GBGDL?YjO!rg)y7-^z^yO&a?sWm)&((w4f^L z2#y}Y&K93A-N&ee=ehSBM@H+}zGm)-xa za=>@Ly7l^XtFrFfeV|2i-L;k2lFS#}@Kn@}*>NdJjv^$jVLGPO_yIn>dVBi_27_2E z=U-1<;P1GHXfzTAlbyCsFDWSw%=$1Ula8J~H^=L`iOMp|3sNx|bcDk)k%-Ki)j7O= zq+KXpmQq=iXKy-G)7`ja57>1>#fplOjGxvu4oaJ<3Q0{#Sk!PiCJ>d%NX^}e+2WXo zz^L^0_HpRYVVav;@cDf2$|EF6OHxWX<5Rf=L-7bU8?@Mx%=Gk45Q`}cjd+>#1OfQp z*KgopZMRf*QTl^7UbSlZk^v~aDC=QaQJoQ0q~xNE#f?`abV=JtNn0}~iw6P$nwy(B z@cJ8^ZEhhH3Zbeh$;rv@=>*BiDZ&?7hR%@4%Hj-s{s?uadpTCyg(Qh6(@rFc0-wIR zlDej$^tG#V9$r!ieCNxT?pj-xdFz`ed&TRnUdLi5Q&iSrw0#6?Vg{ht1qR|*5V_pC@ZYZRobyQqkoPNjFisiFnR675~=CXpXI_;Lsu0fxepPRCv z@rnZarnWu>U9ir4EU5{b~()`rL9o%7qI`kM zNfN56@Vlq~fXCxy-)n#2uP^Qa;MLdu!6jR&`0Qt{QhlQIW@n4;oLanAmJf|bXA^(0MA&0KTMm3;Xt-=wiIUei=U3aaCS0QF(oH@4m@s#B4U9 zo|hB;_=l%BR$as1egELb&wq(MFFnVmEjxJW#b-%OOh8o>+S)qs`vW}rn}=|vrlP6} zimLGYXJ6okPhZ8vq=(*qHxZ=(gE)#t6zCtEM3!TetVl_Vs0p-u~@s;UrEVmRzJ1Odjz-8k%abUF?F{R6}TC(%kWvaFDn znutz!E+NXY!ttXmihDBfz#aF!@@)|y$zrH-dx9)4T=?#)8Ykui*OG|JeD0r=lz=2j z7m&PE#>Xe-yl*rZiALpFNmo%6L{WpmU?4Lijo!X~Iy!qm5Qzzn>0?ryVTI?|q=-4e zAX=^ZDgbePSw^PQVJQnm6mhX)M`tNmGE;NA-E-rA3G8opWCWkji`P4wDx1wF91a`V zS(!wmQ2-JX6H%1dIoGzB(CM@Yf`A}7h{fVQ6pBRW<{h05m)*L$;-VavSW%X}Ex~Hg znHDi#RRt`G1xq$QcHYL`y0bQ$eZk)}Hl1b16;~6Q3Zo)$@utgXeV&+@fJP(Y_4+Ux zjWeM#JTe+5N$p*PLlNYtJZ+$fsA8PqERo3U{n%|*bUKY;?Hbo*qSIwv24FE87CHJ7 z(dtY~0$_aHJ*OtnXf)XE^Ls!z9A?j+S1B)F6|WFgm1BqZ&Kp+2;1r38Rzl%0$;nCN z=48bUmNZCO39artQC6@{eZg~GT}Q+ZU+pnWAtON)Q^JnnBYnJ}4*^LjvW@kP|0sAJ3KDxz|XhBJ*6m#m<^p^>XTu@j@w z$jQ3XJo?B3yuAB4{_^}&05qIwV$;UT8RG$JYU;?%%{rF?G$IjMo#`LUsb>TMK@v@( zMkAW^+6#1agr&6)CfxJI|NP-|*=1Y#Kev99y1IHcZ>~Zk3Y=+dV&@f?Q(Iey#bV** zSN5@b)k?m4+qb!5=XLBqaEMd&4eYpl8@GM^4t8GoS@yiLm!6(JoT(|?e9P?&3=E%_ z2Q-X~`Z#r_pA+@H3=VtFM*xi=ScJ##xn?js%jR@tITs}OCg-)7ttlvqf*>$26AXt# z?B9QYxHqY&N?gb&E?z;JEA=g2x1cIKF)>LX5I`e|bai$!G(1Yhnle;HrLplW7Zn%L z($b2-U?3|q9Tk-mC+b;KUdqVG810>1tgkGmq2VkA%W}{g^mLwmjc{m+43Ac~dv;9M2ET#m{S8V1d0`d~#e{@cfq^b%|r*lc(qtok%#bQLGG8&Br zqap6zo!vc@l*ARJNJK``NV8a7ykiu?F#Y|g97B>M!r=&G6Fzct?C5k7MuV1&v_u95 zJu{+4OjZ42OjUz#v8DxifE;{R>@P7f5lLEF_?V1FT&`5)XcRdXBQO=B`uGWa=dr>- zAb`aZ&qu-F6lQb$sEdRn#N-%tb!S+XpM@kzOiXxiIV>z+<|KW(cPR)0k%&C4O(?`< zB`AXG7J-S$z{1Cy?0Z+|zs+V_GJj}nYUavMT#q1%$k7-sr-RCMYi8v0uC5+_^1vgQ zEoP!o8L!um)oNkqm7gUXj*^j)77t1Ftv!c$d+Ff|L@*e&(_n@`z%5QqMSCPkWNIq1 zu>L1|7Tvth=O+{j&7r?``@#T(!(oPoMsT|)h(@CvJb0Lm8#kaTDxuI68clqoxjET1 zx3+Qc&7%|*6{68-$j;8d7x3e-+t~f$(*%M+%oZ~#4m*AQgK_Yabol%cqSGWO7E>7- z@sOPv=OmGktONql9w`u(I{>1Qh2uOD7+4g5(b183>+8Ho5;YoZHe0;Bov+d9@gd7m zt@N73>ET3g#GDK4V6whoueNq%lNu~>|; zF*hx(?L76{=XmgEchhv%PitEz*)Ek8g{jokbz`?#@OXn1U77kTL6$7t{9WYwxt5)!Ta?&&}9 zgCE|@8wU?_#g31#e0d=a4NWvOH1YfkyUEVVL?cOjao0CUNKD|FXJ4SRtB1S(<337? zizqC}Lm*D4FJ6~VYKoP0<+)^}B~5FIqgYH@dWR?5#QM_%`#rv?NN6g$;87q5Dt=Gf zyq^W9rsj?R#nNg|PcH_8o}d5xF>b!;3%FdVtSl);r_=GXpZ$`?re-3M2(RrufZ1%~ zc+Cmyb{luy^=(c!G!YI**t_?2%2$`NEI)@!w{GOlJHEl)Km2a|R0w*J!ya_g%JAC< zv%;Y;et#r%;^fGF@y(OH14CoJx>UQ7p5F0=!@xg301c-b=I!hIyuKNg=k2*65{c)V z*4B0k3zyN*(8#)VYlz7TjZMw`_4%i1s6WE-WBUO(c<3nk`MG!|y%ZMYV>IfiJJrCl z{9FbGhdEwTM_z6=k#GdPPDfg*NKs)b&XoBnd}u1n@VKw8wyAqa1PJ(|hjm(sfdTiz zWH2^Dz&mta40||steVNm`KQ&Q(I}_t>*s*r_4?3HQ`n6gH}D_d{}GK%&8%Bjfuh8? z>XSRU=DN?bvg~4d`}zTRzgwq zOec)so(wWN<|7oEEr^Vb`w>-D@dQGLW;DT1?I_vw`RglRZ||94%Oxe^d>x@lPmobh zB8J3rCMG5cO$CY5LiIdN@O-uxXM&QXA;n?GY&K&uo3PuH85!tQ0pBo**$Cx{XYSN&d~BYBs;{(&?ibfX24bo{j5rcV?$2rFZmB3iAy;b##w2;U2~pG=Lz1 zsv=1ef+!G+#fZfeWla-l)q>am0q99^4 z>abYM)4V~QAuZ?k2Hz4pe11RO-MtJBk5E{UKl44UR?E~>5Tn?M$sjU1?x($T42Rt^ zlM7T8T3Y(?`9jqXJod&9X7vSn`zHTfkmFc8*fIjE=k^AQi(J#{kV;Cp1|_)^>P1x+eb1VKdRx)W>2sM4dW~XQGpT*7EuNjEsz(OSq9K#8@w)2#1cf zQ(M;qz~Jz?1byIOGt2YrN_UU@H^+{(dFO49AFJ(ncx2qyQ&yC!?EOdM!U~ZH;fdD? z`iB200C*<7jE%dei#i!Oa1xh8k03yDk_oGIw!j+*Mi?EQBovmrUOCqEiv{NcUOw11 zcB*mk?xX|*UXPz~_re8|MvUSgc@^JzN8^XRVsZpI*ojdW!erK?s*viil46gK@vU4D zpKf_^PaPMp$x==>^xb{rNS}Mr5t*Mn_Qn$}9bmo*#f(sQcNbQ}C`rZvtY(S!u2Gs=hDmW)>Fsy3EH5RV z11tvofiO?~{!OmfvOIF6rfb))eqViX$p8QxuIWCrJlB!1wk&Hyd*`U&3r5LIPriUR zOc4pRpxbi^z^$Q{r7ubxqZ?7UMSvVP1`Fe37I8T6*((v>bix2Vc(+R zaIPN+TG59_>0@&IEJ6PWp`edwBt$4Iqc<35866A;3HU|{1%?QC+nMq-U=({WXnklU z6`w!M;p%o|S)sHzgA}_3lSxP4z+@Z%qmD7RpNAja&-EWGRl55op8x9`FWuDDwfMyN zk{+0-s6hJEWmo)a^~#JJ51;532gick@-JIvRM~gB6h*}!lu=bNt|TckMuRwKvg_@u z{!Blq&IHUR9o>CyN{Z6(`9fH&25L|Bu;-OieE#YRrLk@3iC2!i{N)QxiZ96n00sw9 z_P*Kn*P>+(8XJpR<1!iu7_clE%8APDGn8Vq_7y-q-{*UStuEh@c_`N_|9 z%!HH0tVfbWo_h8O1HGeMvtwoC#F>Hn?!5o+U%$|ue@6hkwf=FqeP3!yLQ7tzZPUeT zvdvFDS1q)(k5F2iu_OcD>vFpTq&O^SG$IzWp1RY0JowAKtS`$@iVITv57l&k>7GaS zKm1Ovsd=ZHIC`S{j80;Y$)qp3d~;!*2GRyK(-j~PZ7FsC|%XG73jE5iF zk9*9^jaQc|V-tZ_4;TO1sk|iP-%{+B+@mMD#Y45-tXZAI z&dWJSP9G?v0 z4@L=vqR5JZ$*9AqldxEHWTqyNnU&-T=)lS5-hmHtfBzqpiy;_LBaChU0000 + + + + + + account.banking.export.sdd.form + banking.export.sdd + +
+
+ +
+ + + + + + + + + + + + + + + + +
+
+
+ + + + account.banking.export.sdd.tree + banking.export.sdd + + + + + + + + + + + + + SEPA Direct Debit Files + banking.export.sdd + form + tree,form + + + + + + + +
+
diff --git a/account_banking_sepa_direct_debit/views/account_invoice_view.xml b/account_banking_sepa_direct_debit/views/account_invoice_view.xml new file mode 100644 index 000000000..2ca480e54 --- /dev/null +++ b/account_banking_sepa_direct_debit/views/account_invoice_view.xml @@ -0,0 +1,22 @@ + + + + + + + add.sdd.mandate.on.customer.invoice.form + account.invoice + + + + + + + + + + diff --git a/account_banking_sepa_direct_debit/views/account_payment_view.xml b/account_banking_sepa_direct_debit/views/account_payment_view.xml new file mode 100644 index 000000000..74098c44e --- /dev/null +++ b/account_banking_sepa_direct_debit/views/account_payment_view.xml @@ -0,0 +1,26 @@ + + + + + + + sdd.payment.order.form + payment.order + + + + + + + + + + + + + + diff --git a/account_banking_sepa_direct_debit/views/res_company_view.xml b/account_banking_sepa_direct_debit/views/res_company_view.xml new file mode 100644 index 000000000..e4c9e0b93 --- /dev/null +++ b/account_banking_sepa_direct_debit/views/res_company_view.xml @@ -0,0 +1,23 @@ + + + + + + + sepa_direct_debit.res.company.form + res.company + + + + + + + + + + + diff --git a/account_banking_sepa_direct_debit/views/res_partner_bank_view.xml b/account_banking_sepa_direct_debit/views/res_partner_bank_view.xml new file mode 100644 index 000000000..0b32e9f1c --- /dev/null +++ b/account_banking_sepa_direct_debit/views/res_partner_bank_view.xml @@ -0,0 +1,48 @@ + + + + + + + sdd.mandate.res.partner.bank.form + res.partner.bank + + + + + + + + + + + + sdd.mandate.res.partner.bank.tree + res.partner.bank + + + + + + + + + + + sdd.mandate.partner.form + res.partner + + + + + + + + + + diff --git a/account_banking_sepa_direct_debit/views/sdd_mandate_view.xml b/account_banking_sepa_direct_debit/views/sdd_mandate_view.xml new file mode 100644 index 000000000..4388bd314 --- /dev/null +++ b/account_banking_sepa_direct_debit/views/sdd_mandate_view.xml @@ -0,0 +1,153 @@ + + + + + + + sdd.mandate.form + sdd.mandate + +
+
+
+ +
+

+ +

+
+ + + + + + + + + + + + + + + + +
+
+ + +
+
+
+
+ + + sdd.mandate.tree + sdd.mandate + + + + + + + + + + + + + + + sdd.mandate.search + sdd.mandate + + + + + + + + + + + + + + + SEPA Direct Debit Mandates + sdd.mandate + form + tree,form + +

+ Click to create a new SEPA Direct Debit Mandate. +

+ A SEPA Direct Debit Mandate is a document signed by your customer that gives you the autorization to do one or several direct debits on his bank account. +

+
+
+ + + + + + Mandate Validated + sdd.mandate + + SEPA Direct Debit Mandate Validated + + + + Mandate Expired + sdd.mandate + + SEPA Direct Debit Mandate has Expired + + + + Mandate Cancelled + sdd.mandate + + SEPA Direct Debit Mandate Cancelled + + + + Sequence Type set to First + sdd.mandate + + Sequence Type set to First + + + + Sequence Type set to Recurring + sdd.mandate + + Sequence Type set to Recurring + + + + Sequence Type set to Final + sdd.mandate + + Sequence Type set to Final + + +
+
diff --git a/account_banking_sepa_direct_debit/wizard/__init__.py b/account_banking_sepa_direct_debit/wizard/__init__.py new file mode 100644 index 000000000..3830e36d9 --- /dev/null +++ b/account_banking_sepa_direct_debit/wizard/__init__.py @@ -0,0 +1,23 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# SEPA Direct Debit module for OpenERP +# Copyright (C) 2013 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 . +# +############################################################################## + +from . import export_sdd diff --git a/account_banking_sepa_direct_debit/wizard/export_sdd.py b/account_banking_sepa_direct_debit/wizard/export_sdd.py new file mode 100644 index 000000000..34e37fc59 --- /dev/null +++ b/account_banking_sepa_direct_debit/wizard/export_sdd.py @@ -0,0 +1,451 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# SEPA Direct Debit module for OpenERP +# Copyright (C) 2013 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 . +# +############################################################################## + + +from openerp.osv import orm, fields +from openerp.tools.translate import _ +from openerp import netsvc +from datetime import datetime +from lxml import etree + + +class banking_export_sdd_wizard(orm.TransientModel): + _name = 'banking.export.sdd.wizard' + _inherit = ['banking.export.pain'] + _description = 'Export SEPA Direct Debit File' + _columns = { + 'state': fields.selection([ + ('create', 'Create'), + ('finish', 'Finish'), + ], 'State', readonly=True), + 'batch_booking': fields.boolean( + 'Batch Booking', + help="If true, the bank statement will display only one credit " + "line for all the direct debits of the SEPA file ; if false, " + "the bank statement will display one credit line per direct " + "debit of the SEPA file."), + 'charge_bearer': fields.selection([ + ('SLEV', 'Following Service Level'), + ('SHAR', 'Shared'), + ('CRED', 'Borne by Creditor'), + ('DEBT', 'Borne by Debtor'), + ], 'Charge Bearer', required=True, + help="Following service level : transaction charges are to be " + "applied following the rules agreed in the service level and/or " + "scheme (SEPA Core messages must use this). Shared : transaction " + "charges on the creditor side are to be borne by the creditor, " + "transaction charges on the debtor side are to be borne by the " + "debtor. Borne by creditor : all transaction charges are to be " + "borne by the creditor. Borne by debtor : all transaction " + "charges are to be borne by the debtor."), + 'nb_transactions': fields.related( + 'file_id', 'nb_transactions', type='integer', + string='Number of Transactions', readonly=True), + 'total_amount': fields.related( + 'file_id', 'total_amount', type='float', string='Total Amount', + readonly=True), + 'file_id': fields.many2one( + 'banking.export.sdd', 'SDD File', readonly=True), + 'file': fields.related( + 'file_id', 'file', string="File", type='binary', readonly=True), + 'filename': fields.related( + 'file_id', 'filename', string="Filename", type='char', size=256, + readonly=True), + 'payment_order_ids': fields.many2many( + 'payment.order', 'wiz_sdd_payorders_rel', 'wizard_id', + 'payment_order_id', 'Payment Orders', readonly=True), + } + + _defaults = { + 'charge_bearer': 'SLEV', + 'state': 'create', + } + + def create(self, cr, uid, vals, context=None): + payment_order_ids = context.get('active_ids', []) + vals.update({ + 'payment_order_ids': [[6, 0, payment_order_ids]], + }) + return super(banking_export_sdd_wizard, self).create( + cr, uid, vals, context=context) + + def _get_previous_bank(self, cr, uid, payline, context=None): + payline_obj = self.pool['payment.line'] + previous_bank = False + payline_ids = payline_obj.search( + cr, uid, [ + ('sdd_mandate_id', '=', payline.sdd_mandate_id.id), + ('bank_id', '!=', payline.bank_id.id), + ], + context=context) + if payline_ids: + older_lines = payline_obj.browse( + cr, uid, payline_ids, context=context) + previous_date = False + previous_payline_id = False + for older_line in older_lines: + older_line_date_sent = older_line.order_id.date_sent + if (older_line_date_sent + and older_line_date_sent > previous_date): + previous_date = older_line_date_sent + previous_payline_id = older_line.id + if previous_payline_id: + previous_payline = payline_obj.browse( + cr, uid, previous_payline_id, context=context) + previous_bank = previous_payline.bank_id + return previous_bank + + def create_sepa(self, cr, uid, ids, context=None): + ''' + Creates the SEPA Direct Debit file. That's the important code ! + ''' + sepa_export = self.browse(cr, uid, ids[0], context=context) + + pain_flavor = sepa_export.payment_order_ids[0].mode.type.code + convert_to_ascii = \ + sepa_export.payment_order_ids[0].mode.convert_to_ascii + if pain_flavor == 'pain.008.001.02': + bic_xml_tag = 'BIC' + name_maxsize = 70 + root_xml_tag = 'CstmrDrctDbtInitn' + elif pain_flavor == 'pain.008.001.03': + bic_xml_tag = 'BICFI' + name_maxsize = 140 + root_xml_tag = 'CstmrDrctDbtInitn' + elif pain_flavor == 'pain.008.001.04': + bic_xml_tag = 'BICFI' + name_maxsize = 140 + root_xml_tag = 'CstmrDrctDbtInitn' + else: + raise orm.except_orm( + _('Error:'), + _("Payment Type Code '%s' is not supported. The only " + "Payment Type Code supported for SEPA Direct Debit " + "are 'pain.008.001.02', 'pain.008.001.03' and " + "'pain.008.001.04'.") % pain_flavor) + + gen_args = { + 'bic_xml_tag': bic_xml_tag, + 'name_maxsize': name_maxsize, + 'convert_to_ascii': convert_to_ascii, + 'payment_method': 'DD', + 'pain_flavor': pain_flavor, + 'sepa_export': sepa_export, + 'file_obj': self.pool['banking.export.sdd'], + 'pain_xsd_file': + 'account_banking_sepa_direct_debit/data/%s.xsd' % pain_flavor, + } + + pain_ns = { + 'xsi': 'http://www.w3.org/2001/XMLSchema-instance', + None: 'urn:iso:std:iso:20022:tech:xsd:%s' % pain_flavor, + } + + xml_root = etree.Element('Document', nsmap=pain_ns) + pain_root = etree.SubElement(xml_root, root_xml_tag) + + # A. Group header + group_header_1_0, nb_of_transactions_1_6, control_sum_1_7 = \ + self.generate_group_header_block( + cr, uid, pain_root, gen_args, context=context) + + transactions_count_1_6 = 0 + total_amount = 0.0 + amount_control_sum_1_7 = 0.0 + lines_per_group = {} + # key = (requested_date, priority, sequence type) + # value = list of lines as objects + # Iterate on payment orders + today = fields.date.context_today(self, cr, uid, context=context) + for payment_order in sepa_export.payment_order_ids: + total_amount = total_amount + payment_order.total + # Iterate each payment lines + for line in payment_order.line_ids: + transactions_count_1_6 += 1 + priority = line.priority + if payment_order.date_prefered == 'due': + requested_date = line.ml_maturity_date or today + elif payment_order.date_prefered == 'fixed': + requested_date = payment_order.date_scheduled or today + else: + requested_date = today + if not line.sdd_mandate_id: + raise orm.except_orm( + _('Error:'), + _("Missing SEPA Direct Debit mandate on the payment " + "line with partner '%s' and Invoice ref '%s'.") + % (line.partner_id.name, + line.ml_inv_ref.number)) + scheme = line.sdd_mandate_id.scheme + if line.sdd_mandate_id.state != 'valid': + raise orm.except_orm( + _('Error:'), + _("The SEPA Direct Debit mandate with reference '%s' " + "for partner '%s' has expired.") + % (line.sdd_mandate_id.unique_mandate_reference, + line.sdd_mandate_id.partner_id.name)) + if line.sdd_mandate_id.type == 'oneoff': + if not line.sdd_mandate_id.last_debit_date: + seq_type = 'OOFF' + else: + raise orm.except_orm( + _('Error:'), + _("The mandate with reference '%s' for partner " + "'%s' has type set to 'One-Off' and it has a " + "last debit date set to '%s', so we can't use " + "it.") + % (line.sdd_mandate_id.unique_mandate_reference, + line.sdd_mandate_id.partner_id.name, + line.sdd_mandate_id.last_debit_date)) + elif line.sdd_mandate_id.type == 'recurrent': + seq_type_map = { + 'recurring': 'RCUR', + 'first': 'FRST', + 'final': 'FNAL', + } + seq_type_label = \ + line.sdd_mandate_id.recurrent_sequence_type + assert seq_type_label is not False + seq_type = seq_type_map[seq_type_label] + key = (requested_date, priority, seq_type, scheme) + if key in lines_per_group: + lines_per_group[key].append(line) + else: + lines_per_group[key] = [line] + # Write requested_exec_date on 'Payment date' of the pay line + if requested_date != line.date: + self.pool['payment.line'].write( + cr, uid, line.id, + {'date': requested_date}, context=context) + + for (requested_date, priority, sequence_type, scheme), lines in \ + lines_per_group.items(): + # B. Payment info + payment_info_2_0, nb_of_transactions_2_4, control_sum_2_5 = \ + self.generate_start_payment_info_block( + cr, uid, pain_root, + "sepa_export.payment_order_ids[0].reference + '-' + " + "sequence_type + '-' + requested_date.replace('-', '') " + "+ '-' + priority", + priority, scheme, sequence_type, requested_date, { + 'sepa_export': sepa_export, + 'sequence_type': sequence_type, + 'priority': priority, + 'requested_date': requested_date, + }, gen_args, context=context) + + self.generate_party_block( + cr, uid, payment_info_2_0, 'Cdtr', 'B', + 'sepa_export.payment_order_ids[0].mode.bank_id.partner_id.' + 'name', + 'sepa_export.payment_order_ids[0].mode.bank_id.acc_number', + 'sepa_export.payment_order_ids[0].mode.bank_id.bank.bic', + {'sepa_export': sepa_export}, + gen_args, context=context) + + charge_bearer_2_24 = etree.SubElement(payment_info_2_0, 'ChrgBr') + charge_bearer_2_24.text = sepa_export.charge_bearer + + creditor_scheme_identification_2_27 = etree.SubElement( + payment_info_2_0, 'CdtrSchmeId') + self.generate_creditor_scheme_identification( + cr, uid, creditor_scheme_identification_2_27, + 'sepa_export.payment_order_ids[0].company_id.' + 'sepa_creditor_identifier', + 'SEPA Creditor Identifier', {'sepa_export': sepa_export}, + 'SEPA', gen_args, context=context) + + transactions_count_2_4 = 0 + amount_control_sum_2_5 = 0.0 + for line in lines: + transactions_count_2_4 += 1 + # C. Direct Debit Transaction Info + dd_transaction_info_2_28 = etree.SubElement( + payment_info_2_0, 'DrctDbtTxInf') + payment_identification_2_29 = etree.SubElement( + dd_transaction_info_2_28, 'PmtId') + end2end_identification_2_31 = etree.SubElement( + payment_identification_2_29, 'EndToEndId') + end2end_identification_2_31.text = self._prepare_field( + cr, uid, 'End to End Identification', 'line.name', + {'line': line}, 35, + gen_args=gen_args, context=context) + currency_name = self._prepare_field( + cr, uid, 'Currency Code', 'line.currency.name', + {'line': line}, 3, gen_args=gen_args, + context=context) + instructed_amount_2_44 = etree.SubElement( + dd_transaction_info_2_28, 'InstdAmt', Ccy=currency_name) + instructed_amount_2_44.text = '%.2f' % line.amount_currency + amount_control_sum_1_7 += line.amount_currency + amount_control_sum_2_5 += line.amount_currency + dd_transaction_2_46 = etree.SubElement( + dd_transaction_info_2_28, 'DrctDbtTx') + mandate_related_info_2_47 = etree.SubElement( + dd_transaction_2_46, 'MndtRltdInf') + mandate_identification_2_48 = etree.SubElement( + mandate_related_info_2_47, 'MndtId') + mandate_identification_2_48.text = self._prepare_field( + cr, uid, 'Unique Mandate Reference', + 'line.sdd_mandate_id.unique_mandate_reference', + {'line': line}, 35, + gen_args=gen_args, context=context) + mandate_signature_date_2_49 = etree.SubElement( + mandate_related_info_2_47, 'DtOfSgntr') + mandate_signature_date_2_49.text = self._prepare_field( + cr, uid, 'Mandate Signature Date', + 'line.sdd_mandate_id.signature_date', + {'line': line}, 10, + gen_args=gen_args, context=context) + if sequence_type == 'FRST' and ( + line.sdd_mandate_id.last_debit_date or + not line.sdd_mandate_id.sepa_migrated): + previous_bank = self._get_previous_bank( + cr, uid, line, context=context) + if previous_bank or not line.sdd_mandate_id.sepa_migrated: + amendment_indicator_2_50 = etree.SubElement( + mandate_related_info_2_47, 'AmdmntInd') + amendment_indicator_2_50.text = 'true' + amendment_info_details_2_51 = etree.SubElement( + mandate_related_info_2_47, 'AmdmntInfDtls') + if previous_bank: + if previous_bank.bank.bic == line.bank_id.bank.bic: + ori_debtor_account_2_57 = etree.SubElement( + amendment_info_details_2_51, 'OrgnlDbtrAcct') + ori_debtor_account_id = etree.SubElement( + ori_debtor_account_2_57, 'Id') + ori_debtor_account_iban = etree.SubElement( + ori_debtor_account_id, 'IBAN') + ori_debtor_account_iban.text = self._validate_iban( + cr, uid, self._prepare_field( + cr, uid, 'Original Debtor Account', + 'previous_bank.acc_number', + {'previous_bank': previous_bank}, + gen_args=gen_args, + context=context), + context=context) + else: + ori_debtor_agent_2_58 = etree.SubElement( + amendment_info_details_2_51, 'OrgnlDbtrAgt') + ori_debtor_agent_institution = etree.SubElement( + ori_debtor_agent_2_58, 'FinInstnId') + ori_debtor_agent_bic = etree.SubElement( + ori_debtor_agent_institution, bic_xml_tag) + ori_debtor_agent_bic.text = self._prepare_field( + cr, uid, 'Original Debtor Agent', + 'previous_bank.bank.bic', + {'previous_bank': previous_bank}, + gen_args=gen_args, + context=context) + ori_debtor_agent_other = etree.SubElement( + ori_debtor_agent_institution, 'Othr') + ori_debtor_agent_other_id = etree.SubElement( + ori_debtor_agent_other, 'Id') + ori_debtor_agent_other_id.text = 'SMNDA' + # SMNDA = Same Mandate New Debtor Agent + elif not line.sdd_mandate_id.sepa_migrated: + ori_mandate_identification_2_52 = etree.SubElement( + amendment_info_details_2_51, 'OrgnlMndtId') + ori_mandate_identification_2_52.text = \ + self._prepare_field( + cr, uid, 'Original Mandate Identification', + 'line.sdd_mandate_id.' + 'original_mandate_identification', + {'line': line}, + gen_args=gen_args, + context=context) + ori_creditor_scheme_id_2_53 = etree.SubElement( + amendment_info_details_2_51, 'OrgnlCdtrSchmeId') + self.generate_creditor_scheme_identification( + cr, uid, ori_creditor_scheme_id_2_53, + 'sepa_export.payment_order_ids[0].company_id.' + 'original_creditor_identifier', + 'Original Creditor Identifier', + {'sepa_export': sepa_export}, + 'SEPA', gen_args, context=context) + + self.generate_party_block( + cr, uid, dd_transaction_info_2_28, 'Dbtr', 'C', + 'line.partner_id.name', + 'line.bank_id.acc_number', + 'line.bank_id.bank.bic', + {'line': line}, gen_args, context=context) + + self.generate_remittance_info_block( + cr, uid, dd_transaction_info_2_28, + line, gen_args, context=context) + + nb_of_transactions_2_4.text = str(transactions_count_2_4) + control_sum_2_5.text = '%.2f' % amount_control_sum_2_5 + nb_of_transactions_1_6.text = str(transactions_count_1_6) + control_sum_1_7.text = '%.2f' % amount_control_sum_1_7 + + return self.finalize_sepa_file_creation( + cr, uid, ids, xml_root, total_amount, transactions_count_1_6, + gen_args, context=context) + + def cancel_sepa(self, cr, uid, ids, context=None): + ''' + Cancel the SEPA file: just drop the file + ''' + sepa_export = self.browse(cr, uid, ids[0], context=context) + self.pool.get('banking.export.sdd').unlink( + cr, uid, sepa_export.file_id.id, context=context) + return {'type': 'ir.actions.act_window_close'} + + def save_sepa(self, cr, uid, ids, context=None): + ''' + Save the SEPA Direct Debit file: mark all payments in the file + as 'sent'. Write 'last debit date' on mandate and set oneoff + mandate to expired + ''' + sepa_export = self.browse(cr, uid, ids[0], context=context) + self.pool.get('banking.export.sdd').write( + cr, uid, sepa_export.file_id.id, {'state': 'sent'}, + context=context) + wf_service = netsvc.LocalService('workflow') + for order in sepa_export.payment_order_ids: + wf_service.trg_validate(uid, 'payment.order', order.id, 'done', cr) + mandate_ids = [line.sdd_mandate_id.id for line in order.line_ids] + self.pool['sdd.mandate'].write( + cr, uid, mandate_ids, + {'last_debit_date': datetime.today().strftime('%Y-%m-%d')}, + context=context) + to_expire_ids = [] + first_mandate_ids = [] + for line in order.line_ids: + if line.sdd_mandate_id.type == 'oneoff': + to_expire_ids.append(line.sdd_mandate_id.id) + elif line.sdd_mandate_id.type == 'recurrent': + seq_type = line.sdd_mandate_id.recurrent_sequence_type + if seq_type == 'final': + to_expire_ids.append(line.sdd_mandate_id.id) + elif seq_type == 'first': + first_mandate_ids.append(line.sdd_mandate_id.id) + self.pool['sdd.mandate'].write( + cr, uid, to_expire_ids, {'state': 'expired'}, context=context) + self.pool['sdd.mandate'].write( + cr, uid, first_mandate_ids, { + 'recurrent_sequence_type': 'recurring', + 'sepa_migrated': True, + }, context=context) + return {'type': 'ir.actions.act_window_close'} diff --git a/account_banking_sepa_direct_debit/wizard/export_sdd_view.xml b/account_banking_sepa_direct_debit/wizard/export_sdd_view.xml new file mode 100644 index 000000000..3699de91c --- /dev/null +++ b/account_banking_sepa_direct_debit/wizard/export_sdd_view.xml @@ -0,0 +1,37 @@ + + + + + + + banking.export.sdd.wizard.view + banking.export.sdd.wizard + +
+ + + + + + + + + + + +
+
+ +
+
+ +
+
From a7bdb142f7d4efa3a939136caa543a05f101ee7a Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Tue, 23 Sep 2014 08:41:37 +0200 Subject: [PATCH 034/118] Update icon files --- .../static/description/icon.png | Bin 0 -> 7840 bytes .../static/src/img/icon.png | Bin 6892 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 account_banking_sepa_direct_debit/static/description/icon.png delete mode 100644 account_banking_sepa_direct_debit/static/src/img/icon.png diff --git a/account_banking_sepa_direct_debit/static/description/icon.png b/account_banking_sepa_direct_debit/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..dca4d23f2d85309ed0527e32e30be6ceb09fd5db GIT binary patch literal 7840 zcmbt(Wl$VEwD#f-1qvwC;&gPe z$v6=s1pp{1l;xy#JTs58ynJHOOI;k&64Cxb0fH-h*2(;uLJl9s5*I}l;MP#PdLJ>sfV2%i;50bK6MWi_#UfR9wS25*H8&)BB zb-Z;PS12md+!=dd*M;^Z==8VG%~VG8LH@Y5}X z1LT-*b+jyGyDXh0G9xmPe9L4pyb+?y;c+u$+j9NL$${%u;>7UtwDeoGjfp|@qpw4g zH*A=URd)MS++X)|yxph}E>O5^$V1jL9CMKaZ?VpOe%5IlEfEAB1uO{EI$aNRhho(< z$g^^Fnj?zF2QUfG>z;oGQs87F)!Lbgi$M`g->v-=@?u#{YikG+>2jI+f@g)ZUu&jy z_@{f>kTKc)*zusr64AEp1=)%IBSThQT&!CEBT! zH}lJ?F&zCZaS}Jt2i+*=eV-17Z$b#w$Z~uNe>KJ*jB@E5+1iJZ*Qc&X| z+VB@5UQa^^5(ZJc=Enqq$>S+?1%P_LvFJcgeM+pVg}ea5ADm>1-!@~lQMz$9PR81-XC0!lcS zN~3r{#pY@3$P0WB9N(0?*r2UYz(qxj!){o+AKW2+-Lsk|Lbkd`WGjbQs z0$#a-xxN$6o_K(J^q2Dbz_h<`l~clJJ387P=d3u@i>L+w00H{G!TH0i`I#W52T_*{ zV6z+5k8#`Md_AJ!EFn>XiQidLNNpVxC<<{AE@)1Qvb@W1=<)4}$MYhdheLIPSJfpY zY^%E*3A2OCp`qeW&3uJ;_~%p3%O1UYb%|+_4<)q@i+{S2UWyjyY{0f2xw=ISUoP?* z;o&3gE8B6U-iI0M0idpz(!8s3xBWI~4x+k_E+2ti*9e*h2_FA2Kw}i7m4{C!81ugR zvBC<*>8wcm1pVIdynT}A)!~@o%Petb6w1~)1PA?N`s#7*?K7Y5YHZZ9wNUeLB?Joi zw$(%-@a6W>pK76{;6$xNc@;R@TyqB{5srm-@FQ%;XZ3enUfrNrz@CzN$DRAl%18I` z=~5PHoB9L-`4vGBsZ#W}K5y$uGysNy?@=H+Yzr8BnEz0;y7p{!Gn-54G{`He7N4EQ zuH%h(cSm)V3*1G#Gw?jbt}YI$$HcDh_~MHRZW4ua0!&$|u2KfI6-*W^M)-YB)lrdJ z^_)&>=1e@dzW;~U?)|g;dur*hMpCrNV5M-7jCoXf8Cli3?PRT;Li){<0dm?4mbWo_ zP)cw44KA7ldeIu;!Or8J*B(m3vukU%4N&CZKPz~`VFWjH^@vp;^&B{{X zBPBuDw?Pd z-i3k5j_rPlATZWpFW6PI?q;A*(LMNha0I4=8}tn!1nu9WiKK3owO!T!w*|?}xQDx| z7*Ej)raYmqYXX`;Ubpabr&btGCco>&!*3&EoXcIh-E z|IA>((GC-T;D3u=aC~p~H|tAMoh1xDesj|);@!R*(zJ{{6J)j}KErvd1z;zpi9u&^ zNZ$WpfKY zT&i&1qY=q$c9!>#=P-52**yt4`iQ8ofMV{i&l(Iza4I+F5tED^wWS{*Ffqcitfi2o zINNDVaMO+WHO4={uszGgKiX!nO_WncenXIHuBlX}86C%zUBRL-x;G&CDFURE01WFl zoY{5?ulydX?6Y)dxH0v;qiNE%ahX5eMK9m~;mN?!*k>c!p2ApesPpg%i4%jVJOx;4 z1+>aTZwMVQXRfG*mR@55d~ZE&Jbosxvyl@Z*&-zdIUx+-s}$VA#Z#@O9_$eE(-pl)GxVQu4y=;ia~kZJCUr^~p6g$@-QY%lCoS0L)K_ zCe<_NHSC=QL{eH2nRNdhgt^~2x*|^Q5aWxI+rEBi!aC~;vUe$i>m+%T&AV46Fygb1 z2SY;19E*ia@m1dZb21PKxN*hvcSAfR#t+lYN#&v0Rmvg+ZDM~Y17R+sG;z{eb*)6S z1?0Pn%=V5RMY*-Ol5jK1jaqIx4Ov0EOqt?IrK2wj&}T`+bU4ocU(HqyilzV{1zw>5HB3DHa_E5Q)p4UAM> z2njG?!ryG)6S1Av%K?r@Ca3nG{-Cl=8h4O;R+Zqr+$lj`vBIdIEX>F$n2 zT7h5Yr@ru&SIhg?x|{a4UZ>(M3kCSvS-6us%H7K(C}nDv9!3|tM04_Xr)R|wNe9PH z28V^rjISn;nQUJepr)AU2L2!wAlef4E?Uew3>4u!1r)y95~i#;wR}~-IOAMD z5$no2Lob=01i8g6HHx`R&Agb?MmJZLL2B|o@v*q3?wZN_Ql}bT03-8y1P>!0c(-2c z;nV!M(}k*;{J8;Km+02#NG@eU1DWzb*bF2{_c($UZ6yx!<*06-5=dN~;zp$oRi-(4clsvM70?F$2*CrPyrCneDOjSRnP{<#Cx5v^gXk63K>LExsdN$5m4N_dRNFy))MqGhe_pi3&>;A!Vn{2a6 zfWD;{P;4Gz+bm9Sx_T~crm=9h#D^r?*LDstx6EC7_px)9So8(+D6Xnj+zieTrgH+Z z)#kqL&NvtjWat5A3qNh7soT`97{hqkLrP#E-vAqf#eO;nn#TUlz@*-ZF{%Fyp4X{jnMe&m(m%f&DE18H$%hsnvtoS8wKQ(->77H-GX?PZ9U7Fnv=I6Mn4AM8QH2s3aUFBilsHmH^ z;`J!XhGg*%aj;7C<-i>!oN>j09M}C>@(@j(bME8(UOZf^Xfj5(jqKGt?UKymx_ zdHZpc%)~Cqt$3DPW^P)1L_4pHJf5Q4(7;~;o@zBS6zAdo-fEfnno<`SbTX$@Ptv2_gV0pD5-2Tgc^Bz;29Gs5C4 zW!Dpwb5zh(tA_~54!-ABAaAlBA?>xmlAUgzA+SJU@*niXIPaUn89eK;7?W@tdpc@0 z8=u_wTXet?8Czl9k8p5%c-Iza++UEwlsFJ9NlJceJ0Ek~Q^1+Ka-E1-&IfUOe};dz ze588GSe}25ML^ffz$z$cU2vuy;C~YuP}a1O>MCG#WffX#mt_-gbz!{jg~Bisxf+%# z(SDW5-9VP$`7&)=g>W~EG~2RMg$i4!PG|I9Q=xWh@Y03le)YY zv10Rb(crZ);0M1cM+$KDPsN!tO1SAoDNl@(TQUcFZRl$Wc^>cf`t7t<`%h~pT*<}> zCiFh9ryLyoV2e1El_Q266yz1SiJhSp+wd}XCoHOcnWe(FKu)=lDW1cl2qTcTF-U1A z{YIN#vc&6k(L+Na_$4V_XSQ5*BTr5I^Xa!Kn(f@_J6v2Hfg-1XqNkRj&!_C=Dy+{g zHhnE7e*W87(%n|crt0-Am zXCEfO!Qg?!XJ8H`X4@OB8QQ@>dLm`SM0|qYeC*nuE@lJ{9&BM|eTItZC=Q%ulHW9~ zcUwuqQn=7uwiPA2)%CSNkb?)F-RhAP{HdS>9*vt*?crxP$MuyqO;+AcpY!ks$BHNI zx4aSt)rS}KGCA}nsKU%cRrLebuG-R15Lkkpz&kQ~%?{VB@Vmw1UC9jM)yUA-O~fh5 zm_|okHhavm#Pu z{!;jQ)}i{?5Jj?9 zak;Bvl$Me_1%uiqNeaUGoVU{LKnmXcpn|mnt74lX)?@jI2D^(n%HJ-vi~MsA_qQRj zYhMmc$v-~WC64GDPX!mu+nDH5*!ZWdO|*ygyEvu`+5r`;PpGj@>exMQz*`lSB9kf+ zTy1jlII(=X$cq~cc?&}de=vo9?>77YKJUFRuo-P1*K+M(!B(m$Hfr@4th2H+XnGeJ z{sraoFBYID;cH^-1(A-`xX%R>`o?m110eLKx8%^Ma8Rb)ZVLqh@># z^OEtIWBEkK6hnz&Pbl6l8)&J2Z^y}@VV04n!(wC|`P|d6aaR{CrU;8s*(JiPq^UtH z`>Q=viuT~R^Gdv}5xr>1k3&epj<*kX!oj~728qn~#vg?V^Bqv=|U<46Fc%kM2&7}Y2XahI5gUUQXM>( z&CrZDy20%TPV@{Cd-)1L)iPl*PW48{(b}pC*qH0mHqW)UX+Wn~zXsNzTvK_tpD|42 zVWRr|LsqUj%Y)l7u2n!(r;w%r+RuoO9V3jVhzvxW6igAa<4yh8x_Vn){iVw7)n~TEnTi*Rb0O`q*r=G<0)Tpt2Ly>ex`tT4c_V_tn%*DK0a4yC}zwhN8lDe z;iZlf(tEQSy7P8Rc=%CFF{7(B@)q#NYG);;mwjBzv?x$DYn~F{Snx-wbPYStO7R3W zEt+35MEZv87{ccJZW7r6FV_|f{KCkpsP`G;;IP)NAlPnkxqbEw#;ei-`Jk<%2-#lw zu`^Ikgl*BdEQmmy|M!g->Kpdk%DCq-U)V%jby|ekL?;1<-qn2!Pc-3h;-9&m$wB)n zRH#Ng*IR&6RW)e=xFAD)>R9+M5o4tNxR48v{TSI|SqvJoRFa4FRs?g>sOK)3)bO-k^gdca4}nO3 zDIq%<9A?&(67|tB=r#yq9nKmbr=<|157JIJ41!}_kVn4Wteoak5@rX1Vg(pguNE`c z$@qrUlq}x{!-$$yZ;OlcOXx?zAV2e&9(yIRJ8aW7zLte;ms`D=ew6v*j~>rr{T6_f zy`-=LDnw@QcM85iw~kFF~}Ko@7$;ltkN?`897- z^TAE3zl)tld$@YmFcAo&_d~x6v}(DQzdcRTOB(yi;}RSC?V?!6XB>uq-zS5cUg!`J zKvmK>(>WXUj1uWn&N%XW77HRmM`1YEtQeIJYSKukgBHDaoI3f3S=B0t>s2b~8E431h8gB4Se8;zcb z@K^U|atn#QIfM4TaZ1Nt`j2(vA`!c|C7lxMp9?V`+K-L>YkQ13HPw!M5dL?L_y6y@ zS6!jo^Q5Nj2>MO-wlT*T?nr{Y|q6(hWeo1B<2-8VtBk@dVGGP18xDog&U?h&;uos_)cEG8hH| z>Nl2ss;r65=Aq%Vyg(q8LvBT#6v~R#>AC0JRtF1hmd*!#BR`fE^_2%#H##hQp1@uw zH?*Iut&4jO-HW6+C=2V$$I}5*QF6I$CX_F>1-a|alJA+|`*@Rx@7rtZp%(tTOVDxD zdO+&Kq}F*ms{JHaSrLk-fQtC(dD1fK6`s&4X(OvrJM8Jg&#k7i;l+8#0}<$+1CfAM zx1Ff2ohTfL^i(rx1$8Ot!U8_e!FAmIq=eCQ+;!>PbKa^MAf0u;1cyD6e|du%Ij~L3 zn`QC!A{Aoq2Pa%+rA)W0*JQ!Xnu~LmdkSV+!@)0c?2aCRh;Xg_L(PQ{ zPd|_wSB+mz#c59f2;}}`MHtc3I&L0IBmG2}B7>*^#XS`XKbY_zBTY9rw6f4fB80yv zmOh!VO!=u5{f-y_;HOQFi)5>)$s;kN-K;Gi6?< zg};Hk{Dz=N7@+mj#zPMWgd@P+1!KUvS#XT}7H`}=_A`=iJh+{P02AnL7g8fh&Lm39 zAa|vTCDT9Yhl-7n=qUfoR}VhuPbLH6T0M zYYx>OcUf31HW$k4mY+>SIG|=7SGb-?qV}Ue1f&By1Ws)2umG&_u~bGWX>JPST7dKw z&besEiKR)mQruJpVKJmd=la&OyRs8L{lqDk5;mD;@q~z1X94hc%k)59Q>3pBh6VTB zG0f1x^CFJ=L`$YH9bqml&q^{K2b*sDNXT@F`ki;wcGnIzivkfwQ4tXj3%68sMSl_G z2-t*BPA_-^4l>LsqXmsx-<`d2qU1($R6ME0yau5c6(HQ{?k%09>X?+R^+TFzW$Hfb zxYJc>%4wZ>+(F6KUjvUxv0Nc+M5pj)={Sxt5%lTX>Y_X9JQL6iv@&3hl?nI#e$I3w zX%1y3C+ax4;~x#`0;npa`ERx_EclNq8YOO`gkr17=H5PAW!ODV$=-h7zBwR>9B>hc z_CX0{Qm$#LSYR6 literal 0 HcmV?d00001 diff --git a/account_banking_sepa_direct_debit/static/src/img/icon.png b/account_banking_sepa_direct_debit/static/src/img/icon.png deleted file mode 100644 index 6d1d923b6506b33ca0825af17ed0ae36c9bd0dc6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6892 zcmVPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i*$` z7B3e|!Eq@702*vbL_t(|+RdAHcwFVR?tgpFo<5^8Ga8M0v1A#^k}b=Yja)D`;hH!h zp@cw^OL9)Yq+CcN<6E5%AqMj|;G$)Txm zv~I!^I(n+U|IaV%J#*-PEC8EIvy(P$%HNgdO88Wo)4Jx^$zJiqnE@oNL}_sbt5#-` zn{6jC!MNykqR|+A0~0j24O4rvo6#{JPP>^cm3fMya-x68^T%U{J0Cw#*ERV+0)Xw? z^PE*Hm)%;JXZu1R7){^3zgZMD8a}eEn2qa~A&T!EDNduL$l2G| z?|I^Ib>}0m9&R7`rvY&Lm$vLGD@wn^;}2!--hWoi&vSCawd=523?E3mswy0=Zs#vA zoun|&&brdfuKK2dAOG~%haUe>0oZjz#fp-mjE6JR61P43w|dd#O5!uut;cB4@?ovo zQ$0NQ{Bb_Au|UyC!v5;ou3Mk^+v&3(H~?R}sp@l8Yx3{!=oxn%sq5p*|9S~&uEY<; z=<3=oDl2klUdLhz&puy6PtO=1-C8(wx_RhpKY8?x=ibRRHSgrhKe+w!`!|&5-t)J8 zO$jE8iLc(g^#gPF`Bo?##g=Sl+#MhkiefhDDJ#h!H^;$m|5#(WxIF8s%JMAJKMuF= zdtU*ls6e{y3s*c@R+N6rZ(lg6`Q*peu(_)6JsINC$> zNhT&HgP;mn%z8%0{G_=O*>rIsFYKuov(u8Qwr?!RaR*!X3=X2a=MdPs73ou#eexMs ziuLN>zgRDR`R1)SY?gOqY+y`e0MUY=F=MeNqS0tTRZ&$1k7p7^_M^o7sPY7A z%#FnmMHJ)L@cF~+ef=z18A+^NoilUoqcxpuSerNV`oEt!g59jeYSI7cg#$0%aNq#) zdjjCc-`(+KNs;TuXZ}_%e&yy%m+bP9D8z(xM13|%wroUEL`4NuR7IKon;8I9Rh@pR z#NPw_zA?gqZgj#3MtzKl$sk&-hSv5GBGDL?YjO!rg)y7-^z^yO&a?sWm)&((w4f^L z2#y}Y&K93A-N&ee=ehSBM@H+}zGm)-xa za=>@Ly7l^XtFrFfeV|2i-L;k2lFS#}@Kn@}*>NdJjv^$jVLGPO_yIn>dVBi_27_2E z=U-1<;P1GHXfzTAlbyCsFDWSw%=$1Ula8J~H^=L`iOMp|3sNx|bcDk)k%-Ki)j7O= zq+KXpmQq=iXKy-G)7`ja57>1>#fplOjGxvu4oaJ<3Q0{#Sk!PiCJ>d%NX^}e+2WXo zz^L^0_HpRYVVav;@cDf2$|EF6OHxWX<5Rf=L-7bU8?@Mx%=Gk45Q`}cjd+>#1OfQp z*KgopZMRf*QTl^7UbSlZk^v~aDC=QaQJoQ0q~xNE#f?`abV=JtNn0}~iw6P$nwy(B z@cJ8^ZEhhH3Zbeh$;rv@=>*BiDZ&?7hR%@4%Hj-s{s?uadpTCyg(Qh6(@rFc0-wIR zlDej$^tG#V9$r!ieCNxT?pj-xdFz`ed&TRnUdLi5Q&iSrw0#6?Vg{ht1qR|*5V_pC@ZYZRobyQqkoPNjFisiFnR675~=CXpXI_;Lsu0fxepPRCv z@rnZarnWu>U9ir4EU5{b~()`rL9o%7qI`kM zNfN56@Vlq~fXCxy-)n#2uP^Qa;MLdu!6jR&`0Qt{QhlQIW@n4;oLanAmJf|bXA^(0MA&0KTMm3;Xt-=wiIUei=U3aaCS0QF(oH@4m@s#B4U9 zo|hB;_=l%BR$as1egELb&wq(MFFnVmEjxJW#b-%OOh8o>+S)qs`vW}rn}=|vrlP6} zimLGYXJ6okPhZ8vq=(*qHxZ=(gE)#t6zCtEM3!TetVl_Vs0p-u~@s;UrEVmRzJ1Odjz-8k%abUF?F{R6}TC(%kWvaFDn znutz!E+NXY!ttXmihDBfz#aF!@@)|y$zrH-dx9)4T=?#)8Ykui*OG|JeD0r=lz=2j z7m&PE#>Xe-yl*rZiALpFNmo%6L{WpmU?4Lijo!X~Iy!qm5Qzzn>0?ryVTI?|q=-4e zAX=^ZDgbePSw^PQVJQnm6mhX)M`tNmGE;NA-E-rA3G8opWCWkji`P4wDx1wF91a`V zS(!wmQ2-JX6H%1dIoGzB(CM@Yf`A}7h{fVQ6pBRW<{h05m)*L$;-VavSW%X}Ex~Hg znHDi#RRt`G1xq$QcHYL`y0bQ$eZk)}Hl1b16;~6Q3Zo)$@utgXeV&+@fJP(Y_4+Ux zjWeM#JTe+5N$p*PLlNYtJZ+$fsA8PqERo3U{n%|*bUKY;?Hbo*qSIwv24FE87CHJ7 z(dtY~0$_aHJ*OtnXf)XE^Ls!z9A?j+S1B)F6|WFgm1BqZ&Kp+2;1r38Rzl%0$;nCN z=48bUmNZCO39artQC6@{eZg~GT}Q+ZU+pnWAtON)Q^JnnBYnJ}4*^LjvW@kP|0sAJ3KDxz|XhBJ*6m#m<^p^>XTu@j@w z$jQ3XJo?B3yuAB4{_^}&05qIwV$;UT8RG$JYU;?%%{rF?G$IjMo#`LUsb>TMK@v@( zMkAW^+6#1agr&6)CfxJI|NP-|*=1Y#Kev99y1IHcZ>~Zk3Y=+dV&@f?Q(Iey#bV** zSN5@b)k?m4+qb!5=XLBqaEMd&4eYpl8@GM^4t8GoS@yiLm!6(JoT(|?e9P?&3=E%_ z2Q-X~`Z#r_pA+@H3=VtFM*xi=ScJ##xn?js%jR@tITs}OCg-)7ttlvqf*>$26AXt# z?B9QYxHqY&N?gb&E?z;JEA=g2x1cIKF)>LX5I`e|bai$!G(1Yhnle;HrLplW7Zn%L z($b2-U?3|q9Tk-mC+b;KUdqVG810>1tgkGmq2VkA%W}{g^mLwmjc{m+43Ac~dv;9M2ET#m{S8V1d0`d~#e{@cfq^b%|r*lc(qtok%#bQLGG8&Br zqap6zo!vc@l*ARJNJK``NV8a7ykiu?F#Y|g97B>M!r=&G6Fzct?C5k7MuV1&v_u95 zJu{+4OjZ42OjUz#v8DxifE;{R>@P7f5lLEF_?V1FT&`5)XcRdXBQO=B`uGWa=dr>- zAb`aZ&qu-F6lQb$sEdRn#N-%tb!S+XpM@kzOiXxiIV>z+<|KW(cPR)0k%&C4O(?`< zB`AXG7J-S$z{1Cy?0Z+|zs+V_GJj}nYUavMT#q1%$k7-sr-RCMYi8v0uC5+_^1vgQ zEoP!o8L!um)oNkqm7gUXj*^j)77t1Ftv!c$d+Ff|L@*e&(_n@`z%5QqMSCPkWNIq1 zu>L1|7Tvth=O+{j&7r?``@#T(!(oPoMsT|)h(@CvJb0Lm8#kaTDxuI68clqoxjET1 zx3+Qc&7%|*6{68-$j;8d7x3e-+t~f$(*%M+%oZ~#4m*AQgK_Yabol%cqSGWO7E>7- z@sOPv=OmGktONql9w`u(I{>1Qh2uOD7+4g5(b183>+8Ho5;YoZHe0;Bov+d9@gd7m zt@N73>ET3g#GDK4V6whoueNq%lNu~>|; zF*hx(?L76{=XmgEchhv%PitEz*)Ek8g{jokbz`?#@OXn1U77kTL6$7t{9WYwxt5)!Ta?&&}9 zgCE|@8wU?_#g31#e0d=a4NWvOH1YfkyUEVVL?cOjao0CUNKD|FXJ4SRtB1S(<337? zizqC}Lm*D4FJ6~VYKoP0<+)^}B~5FIqgYH@dWR?5#QM_%`#rv?NN6g$;87q5Dt=Gf zyq^W9rsj?R#nNg|PcH_8o}d5xF>b!;3%FdVtSl);r_=GXpZ$`?re-3M2(RrufZ1%~ zc+Cmyb{luy^=(c!G!YI**t_?2%2$`NEI)@!w{GOlJHEl)Km2a|R0w*J!ya_g%JAC< zv%;Y;et#r%;^fGF@y(OH14CoJx>UQ7p5F0=!@xg301c-b=I!hIyuKNg=k2*65{c)V z*4B0k3zyN*(8#)VYlz7TjZMw`_4%i1s6WE-WBUO(c<3nk`MG!|y%ZMYV>IfiJJrCl z{9FbGhdEwTM_z6=k#GdPPDfg*NKs)b&XoBnd}u1n@VKw8wyAqa1PJ(|hjm(sfdTiz zWH2^Dz&mta40||steVNm`KQ&Q(I}_t>*s*r_4?3HQ`n6gH}D_d{}GK%&8%Bjfuh8? z>XSRU=DN?bvg~4d`}zTRzgwq zOec)so(wWN<|7oEEr^Vb`w>-D@dQGLW;DT1?I_vw`RglRZ||94%Oxe^d>x@lPmobh zB8J3rCMG5cO$CY5LiIdN@O-uxXM&QXA;n?GY&K&uo3PuH85!tQ0pBo**$Cx{XYSN&d~BYBs;{(&?ibfX24bo{j5rcV?$2rFZmB3iAy;b##w2;U2~pG=Lz1 zsv=1ef+!G+#fZfeWla-l)q>am0q99^4 z>abYM)4V~QAuZ?k2Hz4pe11RO-MtJBk5E{UKl44UR?E~>5Tn?M$sjU1?x($T42Rt^ zlM7T8T3Y(?`9jqXJod&9X7vSn`zHTfkmFc8*fIjE=k^AQi(J#{kV;Cp1|_)^>P1x+eb1VKdRx)W>2sM4dW~XQGpT*7EuNjEsz(OSq9K#8@w)2#1cf zQ(M;qz~Jz?1byIOGt2YrN_UU@H^+{(dFO49AFJ(ncx2qyQ&yC!?EOdM!U~ZH;fdD? z`iB200C*<7jE%dei#i!Oa1xh8k03yDk_oGIw!j+*Mi?EQBovmrUOCqEiv{NcUOw11 zcB*mk?xX|*UXPz~_re8|MvUSgc@^JzN8^XRVsZpI*ojdW!erK?s*viil46gK@vU4D zpKf_^PaPMp$x==>^xb{rNS}Mr5t*Mn_Qn$}9bmo*#f(sQcNbQ}C`rZvtY(S!u2Gs=hDmW)>Fsy3EH5RV z11tvofiO?~{!OmfvOIF6rfb))eqViX$p8QxuIWCrJlB!1wk&Hyd*`U&3r5LIPriUR zOc4pRpxbi^z^$Q{r7ubxqZ?7UMSvVP1`Fe37I8T6*((v>bix2Vc(+R zaIPN+TG59_>0@&IEJ6PWp`edwBt$4Iqc<35866A;3HU|{1%?QC+nMq-U=({WXnklU z6`w!M;p%o|S)sHzgA}_3lSxP4z+@Z%qmD7RpNAja&-EWGRl55op8x9`FWuDDwfMyN zk{+0-s6hJEWmo)a^~#JJ51;532gick@-JIvRM~gB6h*}!lu=bNt|TckMuRwKvg_@u z{!Blq&IHUR9o>CyN{Z6(`9fH&25L|Bu;-OieE#YRrLk@3iC2!i{N)QxiZ96n00sw9 z_P*Kn*P>+(8XJpR<1!iu7_clE%8APDGn8Vq_7y-q-{*UStuEh@c_`N_|9 z%!HH0tVfbWo_h8O1HGeMvtwoC#F>Hn?!5o+U%$|ue@6hkwf=FqeP3!yLQ7tzZPUeT zvdvFDS1q)(k5F2iu_OcD>vFpTq&O^SG$IzWp1RY0JowAKtS`$@iVITv57l&k>7GaS zKm1Ovsd=ZHIC`S{j80;Y$)qp3d~;!*2GRyK(-j~PZ7FsC|%XG73jE5iF zk9*9^jaQc|V-tZ_4;TO1sk|iP-%{+B+@mMD#Y45-tXZAI z&dWJSP9G?v0 z4@L=vqR5JZ$*9AqldxEHWTqyNnU&-T=)lS5-hmHtfBzqpiy;_LBaChU0000 Date: Tue, 7 Oct 2014 00:09:26 +0200 Subject: [PATCH 035/118] Clean files --- .../account_banking_sdd.py | 440 ------------------ .../account_banking_sdd_view.xml | 77 --- .../account_invoice_view.xml | 22 - .../account_payment_view.xml | 26 -- account_banking_sepa_direct_debit/company.py | 90 ---- .../company_view.xml | 23 - .../mandate_expire_cron.xml | 26 -- .../res_partner_bank_view.xml | 48 -- .../sdd_mandate_view.xml | 152 ------ .../sepa_direct_debit_demo.xml | 27 -- 10 files changed, 931 deletions(-) delete mode 100644 account_banking_sepa_direct_debit/account_banking_sdd.py delete mode 100644 account_banking_sepa_direct_debit/account_banking_sdd_view.xml delete mode 100644 account_banking_sepa_direct_debit/account_invoice_view.xml delete mode 100644 account_banking_sepa_direct_debit/account_payment_view.xml delete mode 100644 account_banking_sepa_direct_debit/company.py delete mode 100644 account_banking_sepa_direct_debit/company_view.xml delete mode 100644 account_banking_sepa_direct_debit/mandate_expire_cron.xml delete mode 100644 account_banking_sepa_direct_debit/res_partner_bank_view.xml delete mode 100644 account_banking_sepa_direct_debit/sdd_mandate_view.xml delete mode 100644 account_banking_sepa_direct_debit/sepa_direct_debit_demo.xml diff --git a/account_banking_sepa_direct_debit/account_banking_sdd.py b/account_banking_sepa_direct_debit/account_banking_sdd.py deleted file mode 100644 index 87e50111b..000000000 --- a/account_banking_sepa_direct_debit/account_banking_sdd.py +++ /dev/null @@ -1,440 +0,0 @@ -# -*- encoding: utf-8 -*- -############################################################################## -# -# SEPA Direct Debit module for OpenERP -# Copyright (C) 2013 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 . -# -############################################################################## - -from openerp.osv import orm, fields -from openerp.tools.translate import _ -from openerp.addons.decimal_precision import decimal_precision as dp -from unidecode import unidecode -from datetime import datetime -from dateutil.relativedelta import relativedelta -import logging - -NUMBER_OF_UNUSED_MONTHS_BEFORE_EXPIRY = 36 - -logger = logging.getLogger(__name__) - - -class banking_export_sdd(orm.Model): - '''SEPA Direct Debit export''' - _name = 'banking.export.sdd' - _description = __doc__ - _rec_name = 'filename' - - def _generate_filename(self, cr, uid, ids, name, arg, context=None): - res = {} - for sepa_file in self.browse(cr, uid, ids, context=context): - ref = sepa_file.payment_order_ids[0].reference - if ref: - label = unidecode(ref.replace('/', '-')) - else: - label = 'error' - res[sepa_file.id] = 'sdd_%s.xml' % label - return res - - _columns = { - 'payment_order_ids': fields.many2many( - 'payment.order', - 'account_payment_order_sdd_rel', - 'banking_export_sepa_id', 'account_order_id', - 'Payment Orders', - readonly=True), - 'nb_transactions': fields.integer( - 'Number of Transactions', readonly=True), - 'total_amount': fields.float( - 'Total Amount', digits_compute=dp.get_precision('Account'), - readonly=True), - 'batch_booking': fields.boolean( - 'Batch Booking', readonly=True, - help="If true, the bank statement will display only one credit " - "line for all the direct debits of the SEPA file ; if false, " - "the bank statement will display one credit line per direct " - "debit of the SEPA file."), - 'charge_bearer': fields.selection([ - ('SLEV', 'Following Service Level'), - ('SHAR', 'Shared'), - ('CRED', 'Borne by Creditor'), - ('DEBT', 'Borne by Debtor'), - ], 'Charge Bearer', readonly=True, - help="Following service level : transaction charges are to be " - "applied following the rules agreed in the service level and/or " - "scheme (SEPA Core messages must use this). Shared : " - "transaction charges on the creditor side are to be borne by " - "the creditor, transaction charges on the debtor side are to be " - "borne by the debtor. Borne by creditor : all transaction " - "charges are to be borne by the creditor. Borne by debtor : " - "all transaction charges are to be borne by the debtor."), - 'create_date': fields.datetime('Generation Date', readonly=True), - 'file': fields.binary('SEPA File', readonly=True), - 'filename': fields.function( - _generate_filename, type='char', size=256, - string='Filename', readonly=True, store=True), - 'state': fields.selection([ - ('draft', 'Draft'), - ('sent', 'Sent'), - ], 'State', readonly=True), - } - - _defaults = { - 'state': 'draft', - } - - -class sdd_mandate(orm.Model): - '''SEPA Direct Debit Mandate''' - _name = 'sdd.mandate' - _description = __doc__ - _rec_name = 'unique_mandate_reference' - _inherit = ['mail.thread'] - _order = 'signature_date desc' - _track = { - 'state': { - 'account_banking_sepa_direct_debit.mandate_valid': - lambda self, cr, uid, obj, ctx=None: - obj['state'] == 'valid', - 'account_banking_sepa_direct_debit.mandate_expired': - lambda self, cr, uid, obj, ctx=None: - obj['state'] == 'expired', - 'account_banking_sepa_direct_debit.mandate_cancel': - lambda self, cr, uid, obj, ctx=None: - obj['state'] == 'cancel', - }, - 'recurrent_sequence_type': { - 'account_banking_sepa_direct_debit.recurrent_sequence_type_first': - lambda self, cr, uid, obj, ctx=None: - obj['recurrent_sequence_type'] == 'first', - 'account_banking_sepa_direct_debit.' - 'recurrent_sequence_type_recurring': - lambda self, cr, uid, obj, ctx=None: - obj['recurrent_sequence_type'] == 'recurring', - 'account_banking_sepa_direct_debit.recurrent_sequence_type_final': - lambda self, cr, uid, obj, ctx=None: - obj['recurrent_sequence_type'] == 'final', - } - } - - _columns = { - 'partner_bank_id': fields.many2one( - 'res.partner.bank', 'Bank Account', track_visibility='onchange'), - 'partner_id': fields.related( - 'partner_bank_id', 'partner_id', type='many2one', - relation='res.partner', string='Partner', readonly=True), - 'company_id': fields.many2one('res.company', 'Company', required=True), - 'unique_mandate_reference': fields.char( - 'Unique Mandate Reference', size=35, readonly=True, - track_visibility='always'), - 'type': fields.selection([ - ('recurrent', 'Recurrent'), - ('oneoff', 'One-Off'), - ], 'Type of Mandate', required=True, track_visibility='always'), - 'recurrent_sequence_type': fields.selection([ - ('first', 'First'), - ('recurring', 'Recurring'), - ('final', 'Final'), - ], 'Sequence Type for Next Debit', track_visibility='onchange', - help="This field is only used for Recurrent mandates, not for " - "One-Off mandates."), - 'signature_date': fields.date( - 'Date of Signature of the Mandate', track_visibility='onchange'), - 'scan': fields.binary('Scan of the Mandate'), - 'last_debit_date': fields.date( - 'Date of the Last Debit', readonly=True), - 'state': fields.selection([ - ('draft', 'Draft'), - ('valid', 'Valid'), - ('expired', 'Expired'), - ('cancel', 'Cancelled'), - ], 'Status', - help="Only valid mandates can be used in a payment line. A " - "cancelled mandate is a mandate that has been cancelled by " - "the customer. A one-off mandate expires after its first use. " - "A recurrent mandate expires after it's final use or if it " - "hasn't been used for 36 months."), - 'payment_line_ids': fields.one2many( - 'payment.line', 'sdd_mandate_id', "Related Payment Lines"), - 'sepa_migrated': fields.boolean( - 'Migrated to SEPA', track_visibility='onchange', - help="If this field is not active, the mandate section of the " - "next direct debit file that include this mandate will contain " - "the 'Original Mandate Identification' and the 'Original " - "Creditor Scheme Identification'. This is required in a few " - "countries (Belgium for instance), but not in all countries. " - "If this is not required in your country, you should keep this " - "field always active."), - 'original_mandate_identification': fields.char( - 'Original Mandate Identification', size=35, - track_visibility='onchange', - help="When the field 'Migrated to SEPA' is not active, this " - "field will be used as the Original Mandate Identification in " - "the Direct Debit file."), - } - - _defaults = { - 'company_id': lambda self, cr, uid, context: - self.pool['res.company']._company_default_get( - cr, uid, 'sdd.mandate', context=context), - 'unique_mandate_reference': '/', - 'state': 'draft', - 'sepa_migrated': True, - } - - _sql_constraints = [( - 'mandate_ref_company_uniq', - 'unique(unique_mandate_reference, company_id)', - 'A Mandate with the same reference already exists for this company !' - )] - - def create(self, cr, uid, vals, context=None): - if vals.get('unique_mandate_reference', '/') == '/': - vals['unique_mandate_reference'] = \ - self.pool['ir.sequence'].next_by_code( - cr, uid, 'sdd.mandate.reference', context=context) - return super(sdd_mandate, self).create(cr, uid, vals, context=context) - - def _check_sdd_mandate(self, cr, uid, ids): - for mandate in self.browse(cr, uid, ids): - if (mandate.signature_date and - mandate.signature_date > - datetime.today().strftime('%Y-%m-%d')): - raise orm.except_orm( - _('Error:'), - _("The date of signature of mandate '%s' is in the " - "future !") - % mandate.unique_mandate_reference) - if mandate.state == 'valid' and not mandate.signature_date: - raise orm.except_orm( - _('Error:'), - _("Cannot validate the mandate '%s' without a date of " - "signature.") - % mandate.unique_mandate_reference) - if mandate.state == 'valid' and not mandate.partner_bank_id: - raise orm.except_orm( - _('Error:'), - _("Cannot validate the mandate '%s' because it is not " - "attached to a bank account.") - % mandate.unique_mandate_reference) - - if (mandate.signature_date and mandate.last_debit_date and - mandate.signature_date > mandate.last_debit_date): - raise orm.except_orm( - _('Error:'), - _("The mandate '%s' can't have a date of last debit " - "before the date of signature.") - % mandate.unique_mandate_reference) - if (mandate.type == 'recurrent' - and not mandate.recurrent_sequence_type): - raise orm.except_orm( - _('Error:'), - _("The recurrent mandate '%s' must have a sequence type.") - % mandate.unique_mandate_reference) - if (mandate.type == 'recurrent' and not mandate.sepa_migrated - and mandate.recurrent_sequence_type != 'first'): - raise orm.except_orm( - _('Error:'), - _("The recurrent mandate '%s' which is not marked as " - "'Migrated to SEPA' must have its recurrent sequence " - "type set to 'First'.") - % mandate.unique_mandate_reference) - if (mandate.type == 'recurrent' and not mandate.sepa_migrated - and not mandate.original_mandate_identification): - raise orm.except_orm( - _('Error:'), - _("You must set the 'Original Mandate Identification' " - "on the recurrent mandate '%s' which is not marked " - "as 'Migrated to SEPA'.") - % mandate.unique_mandate_reference) - return True - - _constraints = [ - (_check_sdd_mandate, "Error msg in raise", [ - 'last_debit_date', 'signature_date', 'state', 'partner_bank_id', - 'type', 'recurrent_sequence_type', 'sepa_migrated', - 'original_mandate_identification', - ]), - ] - - def mandate_type_change(self, cr, uid, ids, type): - if type == 'recurrent': - recurrent_sequence_type = 'first' - else: - recurrent_sequence_type = False - res = {'value': {'recurrent_sequence_type': recurrent_sequence_type}} - return res - - def mandate_partner_bank_change( - self, cr, uid, ids, partner_bank_id, type, recurrent_sequence_type, - last_debit_date, state): - res = {'value': {}} - if partner_bank_id: - partner_bank_read = self.pool['res.partner.bank'].read( - cr, uid, partner_bank_id, ['partner_id'])['partner_id'] - if partner_bank_read: - res['value']['partner_id'] = partner_bank_read[0] - if (state == 'valid' and partner_bank_id - and type == 'recurrent' - and recurrent_sequence_type != 'first'): - res['value']['recurrent_sequence_type'] = 'first' - res['warning'] = { - 'title': _('Mandate update'), - 'message': _( - "As you changed the bank account attached to this " - "mandate, the 'Sequence Type' has been set back to " - "'First'."), - } - return res - - def validate(self, cr, uid, ids, context=None): - to_validate_ids = [] - for mandate in self.browse(cr, uid, ids, context=context): - assert mandate.state == 'draft', 'Mandate should be in draft state' - to_validate_ids.append(mandate.id) - self.write( - cr, uid, to_validate_ids, {'state': 'valid'}, context=context) - return True - - def cancel(self, cr, uid, ids, context=None): - to_cancel_ids = [] - for mandate in self.browse(cr, uid, ids, context=context): - assert mandate.state in ('draft', 'valid'),\ - 'Mandate should be in draft or valid state' - to_cancel_ids.append(mandate.id) - self.write( - cr, uid, to_cancel_ids, {'state': 'cancel'}, context=context) - return True - - def back2draft(self, cr, uid, ids, context=None): - to_draft_ids = [] - for mandate in self.browse(cr, uid, ids, context=context): - assert mandate.state == 'cancel',\ - 'Mandate should be in cancel state' - to_draft_ids.append(mandate.id) - self.write( - cr, uid, to_draft_ids, {'state': 'draft'}, context=context) - return True - - def _sdd_mandate_set_state_to_expired(self, cr, uid, context=None): - logger.info('Searching for SDD Mandates that must be set to Expired') - expire_limit_date = datetime.today() + \ - relativedelta(months=-NUMBER_OF_UNUSED_MONTHS_BEFORE_EXPIRY) - expire_limit_date_str = expire_limit_date.strftime('%Y-%m-%d') - expired_mandate_ids = self.search(cr, uid, [ - '|', - ('last_debit_date', '=', False), - ('last_debit_date', '<=', expire_limit_date_str), - ('state', '=', 'valid'), - ('signature_date', '<=', expire_limit_date_str), - ], context=context) - if expired_mandate_ids: - self.write( - cr, uid, expired_mandate_ids, {'state': 'expired'}, - context=context) - logger.info( - 'The following SDD Mandate IDs has been set to expired: %s' - % expired_mandate_ids) - else: - logger.info('0 SDD Mandates must be set to Expired') - return True - - -class res_partner_bank(orm.Model): - _inherit = 'res.partner.bank' - - _columns = { - 'sdd_mandate_ids': fields.one2many( - 'sdd.mandate', 'partner_bank_id', 'SEPA Direct Debit Mandates'), - } - - -class payment_line(orm.Model): - _inherit = 'payment.line' - - _columns = { - 'sdd_mandate_id': fields.many2one( - 'sdd.mandate', 'SEPA Direct Debit Mandate', - domain=[('state', '=', 'valid')]), - } - - def create(self, cr, uid, vals, context=None): - '''If the customer invoice has a mandate, take it - otherwise, take the first valid mandate of the bank account''' - if context is None: - context = {} - if not vals: - vals = {} - partner_bank_id = vals.get('bank_id') - move_line_id = vals.get('move_line_id') - if (context.get('default_payment_order_type') == 'debit' - and 'sdd_mandate_id' not in vals): - if move_line_id: - line = self.pool['account.move.line'].browse( - cr, uid, move_line_id, context=context) - if (line.invoice and line.invoice.type == 'out_invoice' - and line.invoice.sdd_mandate_id): - vals.update({ - 'sdd_mandate_id': line.invoice.sdd_mandate_id.id, - 'bank_id': - line.invoice.sdd_mandate_id.partner_bank_id.id, - }) - if partner_bank_id and 'sdd_mandate_id' not in vals: - mandate_ids = self.pool['sdd.mandate'].search(cr, uid, [ - ('partner_bank_id', '=', partner_bank_id), - ('state', '=', 'valid'), - ], context=context) - if mandate_ids: - vals['sdd_mandate_id'] = mandate_ids[0] - return super(payment_line, self).create(cr, uid, vals, context=context) - - def _check_mandate_bank_link(self, cr, uid, ids): - for payline in self.browse(cr, uid, ids): - if (payline.sdd_mandate_id and payline.bank_id - and payline.sdd_mandate_id.partner_bank_id.id != - payline.bank_id.id): - raise orm.except_orm( - _('Error:'), - _("The payment line with reference '%s' has the bank " - "account '%s' which is not attached to the mandate " - "'%s' (this mandate is attached to the bank account " - "'%s').") % ( - payline.name, - self.pool['res.partner.bank'].name_get( - cr, uid, [payline.bank_id.id])[0][1], - payline.sdd_mandate_id.unique_mandate_reference, - self.pool['res.partner.bank'].name_get( - cr, uid, - [payline.sdd_mandate_id.partner_bank_id.id])[0][1], - )) - return True - - _constraints = [ - (_check_mandate_bank_link, 'Error msg in raise', - ['sdd_mandate_id', 'bank_id']), - ] - - -class account_invoice(orm.Model): - _inherit = 'account.invoice' - - _columns = { - 'sdd_mandate_id': fields.many2one( - 'sdd.mandate', 'SEPA Direct Debit Mandate', - domain=[('state', '=', 'valid')], readonly=True, - states={'draft': [('readonly', False)]}) - } diff --git a/account_banking_sepa_direct_debit/account_banking_sdd_view.xml b/account_banking_sepa_direct_debit/account_banking_sdd_view.xml deleted file mode 100644 index f74b60353..000000000 --- a/account_banking_sepa_direct_debit/account_banking_sdd_view.xml +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - account.banking.export.sdd.form - banking.export.sdd - -
-
- -
- - - - - - - - - - - - - - - - -
-
-
- - - - account.banking.export.sdd.tree - banking.export.sdd - - - - - - - - - - - - - SEPA Direct Debit Files - banking.export.sdd - form - tree,form - - - - - - - -
-
diff --git a/account_banking_sepa_direct_debit/account_invoice_view.xml b/account_banking_sepa_direct_debit/account_invoice_view.xml deleted file mode 100644 index 2ca480e54..000000000 --- a/account_banking_sepa_direct_debit/account_invoice_view.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - add.sdd.mandate.on.customer.invoice.form - account.invoice - - - - - - - - - - diff --git a/account_banking_sepa_direct_debit/account_payment_view.xml b/account_banking_sepa_direct_debit/account_payment_view.xml deleted file mode 100644 index 74098c44e..000000000 --- a/account_banking_sepa_direct_debit/account_payment_view.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - sdd.payment.order.form - payment.order - - - - - - - - - - - - - - diff --git a/account_banking_sepa_direct_debit/company.py b/account_banking_sepa_direct_debit/company.py deleted file mode 100644 index 6d54ba8e6..000000000 --- a/account_banking_sepa_direct_debit/company.py +++ /dev/null @@ -1,90 +0,0 @@ -# -*- encoding: utf-8 -*- -############################################################################## -# -# SEPA Direct Debit module for OpenERP -# Copyright (C) 2013 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 . -# -############################################################################## - -from openerp.osv import orm, fields -import logging - -logger = logging.getLogger(__name__) - - -class res_company(orm.Model): - _inherit = 'res.company' - - _columns = { - 'sepa_creditor_identifier': fields.char( - 'SEPA Creditor Identifier', size=35, - help="Enter the Creditor Identifier that has been attributed " - "to your company to make SEPA Direct Debits. This identifier " - "is composed of :\n- your country ISO code (2 letters)\n- a " - "2-digits checkum\n- a 3-letters business code\n- a " - "country-specific identifier"), - 'original_creditor_identifier': fields.char( - 'Original Creditor Identifier', size=70), - } - - def is_sepa_creditor_identifier_valid( - self, cr, uid, sepa_creditor_identifier, context=None): - """Check if SEPA Creditor Identifier is valid - @param sepa_creditor_identifier: SEPA Creditor Identifier as str - or unicode - @return: True if valid, False otherwise - """ - if not isinstance(sepa_creditor_identifier, (str, unicode)): - return False - try: - sci_str = str(sepa_creditor_identifier) - except: - logger.warning( - "SEPA Creditor ID should contain only ASCII caracters.") - return False - sci = sci_str.lower() - if len(sci) < 9: - return False - before_replacement = sci[7:] + sci[0:2] + '00' - logger.debug( - "SEPA ID check before_replacement = %s" % before_replacement) - after_replacement = '' - for char in before_replacement: - if char.isalpha(): - after_replacement += str(ord(char)-87) - else: - after_replacement += char - logger.debug( - "SEPA ID check after_replacement = %s" % after_replacement) - if int(sci[2:4]) == (98 - (int(after_replacement) % 97)): - return True - else: - return False - - def _check_sepa_creditor_identifier(self, cr, uid, ids): - for company in self.browse(cr, uid, ids): - if company.sepa_creditor_identifier: - if not self.is_sepa_creditor_identifier_valid( - cr, uid, company.sepa_creditor_identifier): - return False - return True - - _constraints = [ - (_check_sepa_creditor_identifier, - "Invalid SEPA Creditor Identifier.", - ['sepa_creditor_identifier']), - ] diff --git a/account_banking_sepa_direct_debit/company_view.xml b/account_banking_sepa_direct_debit/company_view.xml deleted file mode 100644 index e4c9e0b93..000000000 --- a/account_banking_sepa_direct_debit/company_view.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - sepa_direct_debit.res.company.form - res.company - - - - - - - - - - - diff --git a/account_banking_sepa_direct_debit/mandate_expire_cron.xml b/account_banking_sepa_direct_debit/mandate_expire_cron.xml deleted file mode 100644 index 4cb0693d2..000000000 --- a/account_banking_sepa_direct_debit/mandate_expire_cron.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - Set SEPA Direct Debit Mandates to Expired - - - 1 - days - -1 - - - - - - - - diff --git a/account_banking_sepa_direct_debit/res_partner_bank_view.xml b/account_banking_sepa_direct_debit/res_partner_bank_view.xml deleted file mode 100644 index 0b32e9f1c..000000000 --- a/account_banking_sepa_direct_debit/res_partner_bank_view.xml +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - sdd.mandate.res.partner.bank.form - res.partner.bank - - - - - - - - - - - - sdd.mandate.res.partner.bank.tree - res.partner.bank - - - - - - - - - - - sdd.mandate.partner.form - res.partner - - - - - - - - - - diff --git a/account_banking_sepa_direct_debit/sdd_mandate_view.xml b/account_banking_sepa_direct_debit/sdd_mandate_view.xml deleted file mode 100644 index bd1dd6e79..000000000 --- a/account_banking_sepa_direct_debit/sdd_mandate_view.xml +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - sdd.mandate.form - sdd.mandate - -
-
-
- -
-

- -

-
- - - - - - - - - - - - - - - -
-
- - -
-
-
-
- - - sdd.mandate.tree - sdd.mandate - - - - - - - - - - - - - - - sdd.mandate.search - sdd.mandate - - - - - - - - - - - - - - - SEPA Direct Debit Mandates - sdd.mandate - form - tree,form - -

- Click to create a new SEPA Direct Debit Mandate. -

- A SEPA Direct Debit Mandate is a document signed by your customer that gives you the autorization to do one or several direct debits on his bank account. -

-
-
- - - - - - Mandate Validated - sdd.mandate - - SEPA Direct Debit Mandate Validated - - - - Mandate Expired - sdd.mandate - - SEPA Direct Debit Mandate has Expired - - - - Mandate Cancelled - sdd.mandate - - SEPA Direct Debit Mandate Cancelled - - - - Sequence Type set to First - sdd.mandate - - Sequence Type set to First - - - - Sequence Type set to Recurring - sdd.mandate - - Sequence Type set to Recurring - - - - Sequence Type set to Final - sdd.mandate - - Sequence Type set to Final - - -
-
diff --git a/account_banking_sepa_direct_debit/sepa_direct_debit_demo.xml b/account_banking_sepa_direct_debit/sepa_direct_debit_demo.xml deleted file mode 100644 index 220261088..000000000 --- a/account_banking_sepa_direct_debit/sepa_direct_debit_demo.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - SEPA Direct Debit La Banque Postale - - - - - - - - FR78ZZZ424242 - - - - - recurrent - first - 2014-02-01 - valid - - - - From 8a24809a139861bdd969af6240a5b188da7b678a Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Tue, 7 Oct 2014 11:51:19 +0200 Subject: [PATCH 036/118] Replace deprecated workflow calls --- account_banking_sepa_direct_debit/wizard/export_sdd.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/account_banking_sepa_direct_debit/wizard/export_sdd.py b/account_banking_sepa_direct_debit/wizard/export_sdd.py index 34e37fc59..60dce7653 100644 --- a/account_banking_sepa_direct_debit/wizard/export_sdd.py +++ b/account_banking_sepa_direct_debit/wizard/export_sdd.py @@ -23,7 +23,7 @@ from openerp.osv import orm, fields from openerp.tools.translate import _ -from openerp import netsvc +from openerp import workflow from datetime import datetime from lxml import etree @@ -422,9 +422,8 @@ class banking_export_sdd_wizard(orm.TransientModel): self.pool.get('banking.export.sdd').write( cr, uid, sepa_export.file_id.id, {'state': 'sent'}, context=context) - wf_service = netsvc.LocalService('workflow') for order in sepa_export.payment_order_ids: - wf_service.trg_validate(uid, 'payment.order', order.id, 'done', cr) + workflow.trg_validate(uid, 'payment.order', order.id, 'done', cr) mandate_ids = [line.sdd_mandate_id.id for line in order.line_ids] self.pool['sdd.mandate'].write( cr, uid, mandate_ids, From 62d13a87d26209ac450b0ac74a0852ac39f939c4 Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Wed, 8 Oct 2014 03:34:21 +0200 Subject: [PATCH 037/118] account_banking_mandate, spliting functionality in two modules --- .../__openerp__.py | 6 +- .../data/mandate_expire_cron.xml | 30 +- .../data/mandate_reference_sequence.xml | 21 -- .../demo/sepa_direct_debit_demo.xml | 2 +- .../models/__init__.py | 5 +- .../models/account_banking_mandate.py | 145 +++++++++ .../models/account_invoice.py | 32 -- .../models/payment_line.py | 74 ----- .../models/res_partner_bank.py | 30 -- .../models/sdd_mandate.py | 291 ------------------ .../security/ir.model.access.csv | 2 - .../views/account_banking_mandate_view.xml | 117 +++++++ .../views/account_invoice_view.xml | 22 -- .../views/account_payment_view.xml | 26 -- .../views/res_partner_bank_view.xml | 48 --- .../views/sdd_mandate_view.xml | 153 --------- 16 files changed, 279 insertions(+), 725 deletions(-) delete mode 100644 account_banking_sepa_direct_debit/data/mandate_reference_sequence.xml create mode 100644 account_banking_sepa_direct_debit/models/account_banking_mandate.py delete mode 100644 account_banking_sepa_direct_debit/models/account_invoice.py delete mode 100644 account_banking_sepa_direct_debit/models/payment_line.py delete mode 100644 account_banking_sepa_direct_debit/models/res_partner_bank.py delete mode 100644 account_banking_sepa_direct_debit/models/sdd_mandate.py create mode 100644 account_banking_sepa_direct_debit/views/account_banking_mandate_view.xml delete mode 100644 account_banking_sepa_direct_debit/views/account_invoice_view.xml delete mode 100644 account_banking_sepa_direct_debit/views/account_payment_view.xml delete mode 100644 account_banking_sepa_direct_debit/views/res_partner_bank_view.xml delete mode 100644 account_banking_sepa_direct_debit/views/sdd_mandate_view.xml diff --git a/account_banking_sepa_direct_debit/__openerp__.py b/account_banking_sepa_direct_debit/__openerp__.py index 5f222df80..c5fc42fb4 100644 --- a/account_banking_sepa_direct_debit/__openerp__.py +++ b/account_banking_sepa_direct_debit/__openerp__.py @@ -34,15 +34,11 @@ }, 'data': [ 'views/account_banking_sdd_view.xml', - 'views/sdd_mandate_view.xml', - 'views/res_partner_bank_view.xml', - 'views/account_payment_view.xml', + 'views/account_banking_mandate_view.xml', 'views/res_company_view.xml', - 'views/account_invoice_view.xml', 'wizard/export_sdd_view.xml', 'data/mandate_expire_cron.xml', 'data/payment_type_sdd.xml', - 'data/mandate_reference_sequence.xml', 'security/original_mandate_required_security.xml', 'security/ir.model.access.csv', ], diff --git a/account_banking_sepa_direct_debit/data/mandate_expire_cron.xml b/account_banking_sepa_direct_debit/data/mandate_expire_cron.xml index 4cb0693d2..79aa05689 100644 --- a/account_banking_sepa_direct_debit/data/mandate_expire_cron.xml +++ b/account_banking_sepa_direct_debit/data/mandate_expire_cron.xml @@ -7,20 +7,18 @@ --> - - - - Set SEPA Direct Debit Mandates to Expired - - - 1 - days - -1 - - - - - - - + + + Set SEPA Direct Debit Mandates to Expired + + + 1 + days + -1 + + + + + + diff --git a/account_banking_sepa_direct_debit/data/mandate_reference_sequence.xml b/account_banking_sepa_direct_debit/data/mandate_reference_sequence.xml deleted file mode 100644 index 68075d526..000000000 --- a/account_banking_sepa_direct_debit/data/mandate_reference_sequence.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - SDD Mandate Reference - sdd.mandate.reference - - - - SDD Mandate Reference - sdd.mandate.reference - RUM - - - - - - - diff --git a/account_banking_sepa_direct_debit/demo/sepa_direct_debit_demo.xml b/account_banking_sepa_direct_debit/demo/sepa_direct_debit_demo.xml index 220261088..041082d76 100644 --- a/account_banking_sepa_direct_debit/demo/sepa_direct_debit_demo.xml +++ b/account_banking_sepa_direct_debit/demo/sepa_direct_debit_demo.xml @@ -15,7 +15,7 @@ FR78ZZZ424242 - + recurrent first diff --git a/account_banking_sepa_direct_debit/models/__init__.py b/account_banking_sepa_direct_debit/models/__init__.py index 36b8b4b56..274855e14 100644 --- a/account_banking_sepa_direct_debit/models/__init__.py +++ b/account_banking_sepa_direct_debit/models/__init__.py @@ -20,9 +20,6 @@ # ############################################################################## -from . import account_invoice from . import banking_export_sdd -from . import payment_line from . import res_company -from . import res_partner_bank -from . import sdd_mandate +from . import account_banking_mandate diff --git a/account_banking_sepa_direct_debit/models/account_banking_mandate.py b/account_banking_sepa_direct_debit/models/account_banking_mandate.py new file mode 100644 index 000000000..4df706378 --- /dev/null +++ b/account_banking_sepa_direct_debit/models/account_banking_mandate.py @@ -0,0 +1,145 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# SEPA Direct Debit module for OpenERP +# Copyright (C) 2013 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 . +# +############################################################################## + +from openerp import models, fields, api, exceptions, _ +from datetime import datetime +from dateutil.relativedelta import relativedelta +import logging + +NUMBER_OF_UNUSED_MONTHS_BEFORE_EXPIRY = 36 + +logger = logging.getLogger(__name__) + + +class AccountBankingMandate(models.Model): + """SEPA Direct Debit Mandate""" + _inherit = 'account.banking.mandate' + _track = { + 'recurrent_sequence_type': { + 'account_banking_sepa_direct_debit.recurrent_sequence_type_first': + lambda self, cr, uid, obj, ctx=None: + obj['recurrent_sequence_type'] == 'first', + 'account_banking_sepa_direct_debit.' + 'recurrent_sequence_type_recurring': + lambda self, cr, uid, obj, ctx=None: + obj['recurrent_sequence_type'] == 'recurring', + 'account_banking_sepa_direct_debit.recurrent_sequence_type_final': + lambda self, cr, uid, obj, ctx=None: + obj['recurrent_sequence_type'] == 'final', + } + } + + type = fields.Selection([('recurrent', 'Recurrent'), + ('oneoff', 'One-Off')], + string='Type of Mandate', required=True, + track_visibility='always') + recurrent_sequence_type = fields.Selection( + [('first', 'First'), + ('recurring', 'Recurring'), + ('final', 'Final')], + string='Sequence Type for Next Debit', track_visibility='onchange', + help="This field is only used for Recurrent mandates, not for " + "One-Off mandates.", default="first") + sepa_migrated = fields.Boolean( + string='Migrated to SEPA', track_visibility='onchange', + help="If this field is not active, the mandate section of the next " + "direct debit file that include this mandate will contain the " + "'Original Mandate Identification' and the 'Original Creditor " + "Scheme Identification'. This is required in a few countries " + "(Belgium for instance), but not in all countries. If this is " + "not required in your country, you should keep this field always " + "active.", default=True) + original_mandate_identification = fields.Char( + string='Original Mandate Identification', track_visibility='onchange', + help="When the field 'Migrated to SEPA' is not active, this field " + "will be used as the Original Mandate Identification in the " + "Direct Debit file.") + scheme = fields.Selection([('CORE', 'Basic (CORE)'), + ('B2B', 'Enterprise (B2B)')], + string='Scheme', required=True, default="CORE") + + @api.one + @api.constrains('type', 'recurrent_sequence_type') + def _check_recurring_type(self): + if (self.type == 'recurrent' + and not self.recurrent_sequence_type): + raise exceptions.Warning( + _("The recurrent mandate '%s' must have a sequence type.") + % self.unique_mandate_reference) + + @api.one + @api.constrains('type', 'recurrent_sequence_type', 'sepa_migrated') + def _check_migrated_to_sepa(self): + if (self.type == 'recurrent' and not self.sepa_migrated + and self.recurrent_sequence_type != 'first'): + raise exceptions.Warning( + _("The recurrent mandate '%s' which is not marked as " + "'Migrated to SEPA' must have its recurrent sequence type " + "set to 'First'.") % self.unique_mandate_reference) + + @api.one + @api.constrains('type', 'original_mandate_identification', 'sepa_migrated') + def _check_original_mandate_identification(self): + if (self.type == 'recurrent' and not self.sepa_migrated + and not self.original_mandate_identification): + raise exceptions.Warning( + _("You must set the 'Original Mandate Identification' on the " + "recurrent mandate '%s' which is not marked as 'Migrated to " + "SEPA'.") % self.unique_mandate_reference) + + @api.one + @api.onchange('partner_bank_id') + def mandate_partner_bank_change(self): + super(AccountBankingMandate, self).mandate_partner_bank_change() + res = {} + if (self.state == 'valid' and self.partner_bank_id + and self.type == 'recurrent' + and self.recurrent_sequence_type != 'first'): + self.recurrent_sequence_type = 'first' + res['warning'] = { + 'title': _('Mandate update'), + 'message': _("As you changed the bank account attached to " + "this mandate, the 'Sequence Type' has been set " + "back to 'First'."), + } + return res + + @api.multi + def _sdd_mandate_set_state_to_expired(self): + logger.info('Searching for SDD Mandates that must be set to Expired') + expire_limit_date = datetime.today() + \ + relativedelta(months=-NUMBER_OF_UNUSED_MONTHS_BEFORE_EXPIRY) + expire_limit_date_str = expire_limit_date.strftime('%Y-%m-%d') + expired_mandates = self.search( + ['|', + ('last_debit_date', '=', False), + ('last_debit_date', '<=', expire_limit_date_str), + ('state', '=', 'valid'), + ('signature_date', '<=', expire_limit_date_str)]) + if expired_mandates: + expired_mandates.write({'state': 'expired'}) + logger.info( + 'The following SDD Mandate IDs has been set to expired: %s' + % expired_mandates.ids) + else: + logger.info('0 SDD Mandates must be set to Expired') + return True diff --git a/account_banking_sepa_direct_debit/models/account_invoice.py b/account_banking_sepa_direct_debit/models/account_invoice.py deleted file mode 100644 index eee2b7757..000000000 --- a/account_banking_sepa_direct_debit/models/account_invoice.py +++ /dev/null @@ -1,32 +0,0 @@ -# -*- encoding: utf-8 -*- -############################################################################## -# -# SEPA Direct Debit module for OpenERP -# Copyright (C) 2013 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 . -# -############################################################################## - -from openerp import models, fields - - -class AccountInvoice(models.Model): - _inherit = 'account.invoice' - - sdd_mandate_id = fields.Many2one( - 'sdd.mandate', string='SEPA Direct Debit Mandate', - domain=[('state', '=', 'valid')], readonly=True, - states={'draft': [('readonly', False)]}) diff --git a/account_banking_sepa_direct_debit/models/payment_line.py b/account_banking_sepa_direct_debit/models/payment_line.py deleted file mode 100644 index 31c47bd89..000000000 --- a/account_banking_sepa_direct_debit/models/payment_line.py +++ /dev/null @@ -1,74 +0,0 @@ -# -*- encoding: utf-8 -*- -############################################################################## -# -# SEPA Direct Debit module for OpenERP -# Copyright (C) 2013 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 . -# -############################################################################## - -from openerp import models, fields, api, exceptions, _ - - -class PaymentLine(models.Model): - _inherit = 'payment.line' - - sdd_mandate_id = fields.Many2one( - 'sdd.mandate', string='SEPA Direct Debit Mandate', - domain=[('state', '=', 'valid')]) - - def create(self, vals=None): - """If the customer invoice has a mandate, take it. Otherwise, take the - first valid mandate of the bank account. - """ - if not vals: - vals = {} - partner_bank_id = vals.get('bank_id') - if (self.env.context.get('search_payment_order_type') == 'debit' - and 'sdd_mandate_id' not in vals): - if vals.get('move_line_id'): - line = self.env['account.move.line'].browse( - vals['move_line_id']) - if (line.invoice and line.invoice.type == 'out_invoice' - and line.invoice.sdd_mandate_id): - vals.update( - {'sdd_mandate_id': line.invoice.sdd_mandate_id.id, - 'bank_id': - line.invoice.sdd_mandate_id.partner_bank_id.id}) - if partner_bank_id and 'sdd_mandate_id' not in vals: - mandates = self.env['sdd.mandate'].search( - [('partner_bank_id', '=', partner_bank_id), - ('state', '=', 'valid')]) - if mandates: - vals['sdd_mandate_id'] = mandates.ids[0] - return super(PaymentLine, self).create(vals) - - @api.one - @api.constrains('sdd_mandate_id', 'bank_id') - def _check_mandate_bank_link(self): - if (self.sdd_mandate_id and self.bank_id - and self.sdd_mandate_id.partner_bank_id.id != - self.bank_id.id): - raise exceptions.Warning( - _('Error:'), - _("The payment line with reference '%s' has the bank " - "account '%s' which is not attached to the mandate " - "'%s' (this mandate is attached to the bank account " - "'%s').") % - (self.name, - self.bank_id.name_get()[0][1], - self.sdd_mandate_id.unique_mandate_reference, - self.sdd_mandate_id.partner_bank_id.name_get()[0][1])) diff --git a/account_banking_sepa_direct_debit/models/res_partner_bank.py b/account_banking_sepa_direct_debit/models/res_partner_bank.py deleted file mode 100644 index 132a4fa42..000000000 --- a/account_banking_sepa_direct_debit/models/res_partner_bank.py +++ /dev/null @@ -1,30 +0,0 @@ -# -*- encoding: utf-8 -*- -############################################################################## -# -# SEPA Direct Debit module for OpenERP -# Copyright (C) 2013 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 . -# -############################################################################## - -from openerp import models, fields - - -class ResPartnerBank(models.Model): - _inherit = 'res.partner.bank' - - sdd_mandate_ids = fields.One2many( - 'sdd.mandate', 'partner_bank_id', string='SEPA Direct Debit Mandates') diff --git a/account_banking_sepa_direct_debit/models/sdd_mandate.py b/account_banking_sepa_direct_debit/models/sdd_mandate.py deleted file mode 100644 index ebee316d2..000000000 --- a/account_banking_sepa_direct_debit/models/sdd_mandate.py +++ /dev/null @@ -1,291 +0,0 @@ -# -*- encoding: utf-8 -*- -############################################################################## -# -# SEPA Direct Debit module for OpenERP -# Copyright (C) 2013 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 . -# -############################################################################## - -from openerp.osv import orm, fields -from openerp.tools.translate import _ -from datetime import datetime -from dateutil.relativedelta import relativedelta -import logging - -NUMBER_OF_UNUSED_MONTHS_BEFORE_EXPIRY = 36 - -logger = logging.getLogger(__name__) - - -class SddMandate(orm.Model): - """SEPA Direct Debit Mandate""" - _name = 'sdd.mandate' - _description = __doc__ - _rec_name = 'unique_mandate_reference' - _inherit = ['mail.thread'] - _order = 'signature_date desc' - _track = { - 'state': { - 'account_banking_sepa_direct_debit.mandate_valid': - lambda self, cr, uid, obj, ctx=None: - obj['state'] == 'valid', - 'account_banking_sepa_direct_debit.mandate_expired': - lambda self, cr, uid, obj, ctx=None: - obj['state'] == 'expired', - 'account_banking_sepa_direct_debit.mandate_cancel': - lambda self, cr, uid, obj, ctx=None: - obj['state'] == 'cancel', - }, - 'recurrent_sequence_type': { - 'account_banking_sepa_direct_debit.recurrent_sequence_type_first': - lambda self, cr, uid, obj, ctx=None: - obj['recurrent_sequence_type'] == 'first', - 'account_banking_sepa_direct_debit.' - 'recurrent_sequence_type_recurring': - lambda self, cr, uid, obj, ctx=None: - obj['recurrent_sequence_type'] == 'recurring', - 'account_banking_sepa_direct_debit.recurrent_sequence_type_final': - lambda self, cr, uid, obj, ctx=None: - obj['recurrent_sequence_type'] == 'final', - } - } - - _columns = { - 'partner_bank_id': fields.many2one( - 'res.partner.bank', 'Bank Account', track_visibility='onchange'), - 'partner_id': fields.related( - 'partner_bank_id', 'partner_id', type='many2one', - relation='res.partner', string='Partner', readonly=True), - 'company_id': fields.many2one('res.company', 'Company', required=True), - 'unique_mandate_reference': fields.char( - 'Unique Mandate Reference', size=35, readonly=True, - track_visibility='always'), - 'type': fields.selection([ - ('recurrent', 'Recurrent'), - ('oneoff', 'One-Off'), - ], 'Type of Mandate', required=True, track_visibility='always'), - 'recurrent_sequence_type': fields.selection([ - ('first', 'First'), - ('recurring', 'Recurring'), - ('final', 'Final'), - ], 'Sequence Type for Next Debit', track_visibility='onchange', - help="This field is only used for Recurrent mandates, not for " - "One-Off mandates."), - 'signature_date': fields.date( - 'Date of Signature of the Mandate', track_visibility='onchange'), - 'scan': fields.binary('Scan of the Mandate'), - 'last_debit_date': fields.date( - 'Date of the Last Debit', readonly=True), - 'state': fields.selection([ - ('draft', 'Draft'), - ('valid', 'Valid'), - ('expired', 'Expired'), - ('cancel', 'Cancelled'), - ], 'Status', - help="Only valid mandates can be used in a payment line. A " - "cancelled mandate is a mandate that has been cancelled by " - "the customer. A one-off mandate expires after its first use. " - "A recurrent mandate expires after it's final use or if it " - "hasn't been used for 36 months."), - 'payment_line_ids': fields.one2many( - 'payment.line', 'sdd_mandate_id', "Related Payment Lines"), - 'sepa_migrated': fields.boolean( - 'Migrated to SEPA', track_visibility='onchange', - help="If this field is not active, the mandate section of the " - "next direct debit file that include this mandate will contain " - "the 'Original Mandate Identification' and the 'Original " - "Creditor Scheme Identification'. This is required in a few " - "countries (Belgium for instance), but not in all countries. " - "If this is not required in your country, you should keep this " - "field always active."), - 'original_mandate_identification': fields.char( - 'Original Mandate Identification', size=35, - track_visibility='onchange', - help="When the field 'Migrated to SEPA' is not active, this " - "field will be used as the Original Mandate Identification in " - "the Direct Debit file."), - 'scheme': fields.selection([('CORE', 'Basic (CORE)'), - ('B2B', 'Enterprise (B2B)')], - 'Scheme', required=True), - } - - _defaults = { - 'company_id': lambda self, cr, uid, context: - self.pool['res.company']._company_default_get( - cr, uid, 'sdd.mandate', context=context), - 'unique_mandate_reference': '/', - 'state': 'draft', - 'sepa_migrated': True, - 'scheme': 'CORE', - } - - _sql_constraints = [( - 'mandate_ref_company_uniq', - 'unique(unique_mandate_reference, company_id)', - 'A Mandate with the same reference already exists for this company !' - )] - - def create(self, cr, uid, vals, context=None): - if vals.get('unique_mandate_reference', '/') == '/': - vals['unique_mandate_reference'] = \ - self.pool['ir.sequence'].next_by_code( - cr, uid, 'sdd.mandate.reference', context=context) - return super(SddMandate, self).create(cr, uid, vals, context=context) - - def _check_sdd_mandate(self, cr, uid, ids): - for mandate in self.browse(cr, uid, ids): - if (mandate.signature_date and - mandate.signature_date > - datetime.today().strftime('%Y-%m-%d')): - raise orm.except_orm( - _('Error:'), - _("The date of signature of mandate '%s' is in the " - "future !") - % mandate.unique_mandate_reference) - if mandate.state == 'valid' and not mandate.signature_date: - raise orm.except_orm( - _('Error:'), - _("Cannot validate the mandate '%s' without a date of " - "signature.") - % mandate.unique_mandate_reference) - if mandate.state == 'valid' and not mandate.partner_bank_id: - raise orm.except_orm( - _('Error:'), - _("Cannot validate the mandate '%s' because it is not " - "attached to a bank account.") - % mandate.unique_mandate_reference) - - if (mandate.signature_date and mandate.last_debit_date and - mandate.signature_date > mandate.last_debit_date): - raise orm.except_orm( - _('Error:'), - _("The mandate '%s' can't have a date of last debit " - "before the date of signature.") - % mandate.unique_mandate_reference) - if (mandate.type == 'recurrent' - and not mandate.recurrent_sequence_type): - raise orm.except_orm( - _('Error:'), - _("The recurrent mandate '%s' must have a sequence type.") - % mandate.unique_mandate_reference) - if (mandate.type == 'recurrent' and not mandate.sepa_migrated - and mandate.recurrent_sequence_type != 'first'): - raise orm.except_orm( - _('Error:'), - _("The recurrent mandate '%s' which is not marked as " - "'Migrated to SEPA' must have its recurrent sequence " - "type set to 'First'.") - % mandate.unique_mandate_reference) - if (mandate.type == 'recurrent' and not mandate.sepa_migrated - and not mandate.original_mandate_identification): - raise orm.except_orm( - _('Error:'), - _("You must set the 'Original Mandate Identification' " - "on the recurrent mandate '%s' which is not marked " - "as 'Migrated to SEPA'.") - % mandate.unique_mandate_reference) - return True - - _constraints = [ - (_check_sdd_mandate, "Error msg in raise", [ - 'last_debit_date', 'signature_date', 'state', 'partner_bank_id', - 'type', 'recurrent_sequence_type', 'sepa_migrated', - 'original_mandate_identification', - ]), - ] - - def mandate_type_change(self, cr, uid, ids, type): - if type == 'recurrent': - recurrent_sequence_type = 'first' - else: - recurrent_sequence_type = False - res = {'value': {'recurrent_sequence_type': recurrent_sequence_type}} - return res - - def mandate_partner_bank_change( - self, cr, uid, ids, partner_bank_id, type, recurrent_sequence_type, - last_debit_date, state): - res = {'value': {}} - if partner_bank_id: - partner_bank_read = self.pool['res.partner.bank'].read( - cr, uid, partner_bank_id, ['partner_id'])['partner_id'] - if partner_bank_read: - res['value']['partner_id'] = partner_bank_read[0] - if (state == 'valid' and partner_bank_id - and type == 'recurrent' - and recurrent_sequence_type != 'first'): - res['value']['recurrent_sequence_type'] = 'first' - res['warning'] = { - 'title': _('Mandate update'), - 'message': _( - "As you changed the bank account attached to this " - "mandate, the 'Sequence Type' has been set back to " - "'First'."), - } - return res - - def validate(self, cr, uid, ids, context=None): - to_validate_ids = [] - for mandate in self.browse(cr, uid, ids, context=context): - assert mandate.state == 'draft', 'Mandate should be in draft state' - to_validate_ids.append(mandate.id) - self.write( - cr, uid, to_validate_ids, {'state': 'valid'}, context=context) - return True - - def cancel(self, cr, uid, ids, context=None): - to_cancel_ids = [] - for mandate in self.browse(cr, uid, ids, context=context): - assert mandate.state in ('draft', 'valid'),\ - 'Mandate should be in draft or valid state' - to_cancel_ids.append(mandate.id) - self.write( - cr, uid, to_cancel_ids, {'state': 'cancel'}, context=context) - return True - - def back2draft(self, cr, uid, ids, context=None): - to_draft_ids = [] - for mandate in self.browse(cr, uid, ids, context=context): - assert mandate.state == 'cancel',\ - 'Mandate should be in cancel state' - to_draft_ids.append(mandate.id) - self.write( - cr, uid, to_draft_ids, {'state': 'draft'}, context=context) - return True - - def _sdd_mandate_set_state_to_expired(self, cr, uid, context=None): - logger.info('Searching for SDD Mandates that must be set to Expired') - expire_limit_date = datetime.today() + \ - relativedelta(months=-NUMBER_OF_UNUSED_MONTHS_BEFORE_EXPIRY) - expire_limit_date_str = expire_limit_date.strftime('%Y-%m-%d') - expired_mandate_ids = self.search(cr, uid, [ - '|', - ('last_debit_date', '=', False), - ('last_debit_date', '<=', expire_limit_date_str), - ('state', '=', 'valid'), - ('signature_date', '<=', expire_limit_date_str), - ], context=context) - if expired_mandate_ids: - self.write( - cr, uid, expired_mandate_ids, {'state': 'expired'}, - context=context) - logger.info( - 'The following SDD Mandate IDs has been set to expired: %s' - % expired_mandate_ids) - else: - logger.info('0 SDD Mandates must be set to Expired') - return True diff --git a/account_banking_sepa_direct_debit/security/ir.model.access.csv b/account_banking_sepa_direct_debit/security/ir.model.access.csv index cf78ffb59..0cd579511 100644 --- a/account_banking_sepa_direct_debit/security/ir.model.access.csv +++ b/account_banking_sepa_direct_debit/security/ir.model.access.csv @@ -1,4 +1,2 @@ "id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" "access_banking_export_sdd","Full access on banking.export.sdd","model_banking_export_sdd","account_payment.group_account_payment",1,1,1,1 -"access_sdd_mandate","Full access on sdd.mandate","model_sdd_mandate","account_payment.group_account_payment",1,1,1,1 -"access_sdd_mandate_read","Read access on sdd.mandate","model_sdd_mandate","base.group_user",1,0,0,0 diff --git a/account_banking_sepa_direct_debit/views/account_banking_mandate_view.xml b/account_banking_sepa_direct_debit/views/account_banking_mandate_view.xml new file mode 100644 index 000000000..eba8ae28b --- /dev/null +++ b/account_banking_sepa_direct_debit/views/account_banking_mandate_view.xml @@ -0,0 +1,117 @@ + + + + + + + sdd.mandate.form + account.banking.mandate + + + + + + + + + + + + + + + + + sdd.mandate.tree + account.banking.mandate + + + + + + + + + + sdd.mandate.search + account.banking.mandate + + + + + + + + + + + SEPA Direct Debit Mandates + account.banking.mandate + form + tree,form + +

+ Click to create a new SEPA Direct Debit Mandate. +

+ A SEPA Direct Debit Mandate is a document signed by your customer that gives you the autorization to do one or several direct debits on his bank account. +

+
+
+ + + + + sdd.mandate.res.partner.bank.tree + res.partner.bank + + + + SDD Mandates + + + + + + sdd.mandate.partner.form + res.partner + + + + SDD Mandates + + + + + + Sequence Type set to First + account.banking.mandate + + Sequence Type set to First + + + + Sequence Type set to Recurring + account.banking.mandate + + Sequence Type set to Recurring + + + + Sequence Type set to Final + account.banking.mandate + + Sequence Type set to Final + + +
+
diff --git a/account_banking_sepa_direct_debit/views/account_invoice_view.xml b/account_banking_sepa_direct_debit/views/account_invoice_view.xml deleted file mode 100644 index 2ca480e54..000000000 --- a/account_banking_sepa_direct_debit/views/account_invoice_view.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - add.sdd.mandate.on.customer.invoice.form - account.invoice - - - - - - - - - - diff --git a/account_banking_sepa_direct_debit/views/account_payment_view.xml b/account_banking_sepa_direct_debit/views/account_payment_view.xml deleted file mode 100644 index 74098c44e..000000000 --- a/account_banking_sepa_direct_debit/views/account_payment_view.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - sdd.payment.order.form - payment.order - - - - - - - - - - - - - - diff --git a/account_banking_sepa_direct_debit/views/res_partner_bank_view.xml b/account_banking_sepa_direct_debit/views/res_partner_bank_view.xml deleted file mode 100644 index 0b32e9f1c..000000000 --- a/account_banking_sepa_direct_debit/views/res_partner_bank_view.xml +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - sdd.mandate.res.partner.bank.form - res.partner.bank - - - - - - - - - - - - sdd.mandate.res.partner.bank.tree - res.partner.bank - - - - - - - - - - - sdd.mandate.partner.form - res.partner - - - - - - - - - - diff --git a/account_banking_sepa_direct_debit/views/sdd_mandate_view.xml b/account_banking_sepa_direct_debit/views/sdd_mandate_view.xml deleted file mode 100644 index 4388bd314..000000000 --- a/account_banking_sepa_direct_debit/views/sdd_mandate_view.xml +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - - sdd.mandate.form - sdd.mandate - -
-
-
- -
-

- -

-
- - - - - - - - - - - - - - - - -
-
- - -
-
-
-
- - - sdd.mandate.tree - sdd.mandate - - - - - - - - - - - - - - - sdd.mandate.search - sdd.mandate - - - - - - - - - - - - - - - SEPA Direct Debit Mandates - sdd.mandate - form - tree,form - -

- Click to create a new SEPA Direct Debit Mandate. -

- A SEPA Direct Debit Mandate is a document signed by your customer that gives you the autorization to do one or several direct debits on his bank account. -

-
-
- - - - - - Mandate Validated - sdd.mandate - - SEPA Direct Debit Mandate Validated - - - - Mandate Expired - sdd.mandate - - SEPA Direct Debit Mandate has Expired - - - - Mandate Cancelled - sdd.mandate - - SEPA Direct Debit Mandate Cancelled - - - - Sequence Type set to First - sdd.mandate - - Sequence Type set to First - - - - Sequence Type set to Recurring - sdd.mandate - - Sequence Type set to Recurring - - - - Sequence Type set to Final - sdd.mandate - - Sequence Type set to Final - - -
-
From a90a66e961ab0202834a48a49b9af05f57648c2c Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Thu, 9 Oct 2014 09:57:05 +0200 Subject: [PATCH 038/118] account_banking_mandate dependency --- account_banking_sepa_direct_debit/__openerp__.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/account_banking_sepa_direct_debit/__openerp__.py b/account_banking_sepa_direct_debit/__openerp__.py index c5fc42fb4..160e52605 100644 --- a/account_banking_sepa_direct_debit/__openerp__.py +++ b/account_banking_sepa_direct_debit/__openerp__.py @@ -28,7 +28,11 @@ 'website': 'http://www.akretion.com', 'contributors': ['Pedro M. Baeza '], 'category': 'Banking addons', - 'depends': ['account_direct_debit', 'account_banking_pain_base'], + 'depends': [ + 'account_direct_debit', + 'account_banking_pain_base', + 'account_banking_mandate', + ], 'external_dependencies': { 'python': ['unidecode', 'lxml'], }, From 69b331b3f4226e5f7d75cd1b644177aec8e8eefa Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Fri, 10 Oct 2014 20:09:17 +0200 Subject: [PATCH 039/118] replace old sdd.mandate referencess --- .../models/banking_export_sdd.py | 3 + .../wizard/export_sdd.py | 60 +++++++++---------- 2 files changed, 33 insertions(+), 30 deletions(-) diff --git a/account_banking_sepa_direct_debit/models/banking_export_sdd.py b/account_banking_sepa_direct_debit/models/banking_export_sdd.py index 80f5f4a13..4bcd49367 100644 --- a/account_banking_sepa_direct_debit/models/banking_export_sdd.py +++ b/account_banking_sepa_direct_debit/models/banking_export_sdd.py @@ -34,10 +34,13 @@ class BankingExportSdd(models.Model): @api.one def _generate_filename(self): filename = '' + # FIXME : we never enter inside the IF to give a good filename if self.payment_order_ids: ref = self.payment_order_ids[0].reference label = unidecode(ref.replace('/', '-')) if ref else 'error' filename = 'sdd_%s.xml' % label + else: + filename = 'sdd.xml' self.filename = filename payment_order_ids = fields.Many2many( diff --git a/account_banking_sepa_direct_debit/wizard/export_sdd.py b/account_banking_sepa_direct_debit/wizard/export_sdd.py index 60dce7653..79ead28b8 100644 --- a/account_banking_sepa_direct_debit/wizard/export_sdd.py +++ b/account_banking_sepa_direct_debit/wizard/export_sdd.py @@ -93,7 +93,7 @@ class banking_export_sdd_wizard(orm.TransientModel): previous_bank = False payline_ids = payline_obj.search( cr, uid, [ - ('sdd_mandate_id', '=', payline.sdd_mandate_id.id), + ('mandate_id', '=', payline.mandate_id.id), ('bank_id', '!=', payline.bank_id.id), ], context=context) @@ -188,23 +188,23 @@ class banking_export_sdd_wizard(orm.TransientModel): requested_date = payment_order.date_scheduled or today else: requested_date = today - if not line.sdd_mandate_id: + if not line.mandate_id: raise orm.except_orm( _('Error:'), _("Missing SEPA Direct Debit mandate on the payment " "line with partner '%s' and Invoice ref '%s'.") % (line.partner_id.name, line.ml_inv_ref.number)) - scheme = line.sdd_mandate_id.scheme - if line.sdd_mandate_id.state != 'valid': + scheme = line.mandate_id.scheme + if line.mandate_id.state != 'valid': raise orm.except_orm( _('Error:'), _("The SEPA Direct Debit mandate with reference '%s' " "for partner '%s' has expired.") - % (line.sdd_mandate_id.unique_mandate_reference, - line.sdd_mandate_id.partner_id.name)) - if line.sdd_mandate_id.type == 'oneoff': - if not line.sdd_mandate_id.last_debit_date: + % (line.mandate_id.unique_mandate_reference, + line.mandate_id.partner_id.name)) + if line.mandate_id.type == 'oneoff': + if not line.mandate_id.last_debit_date: seq_type = 'OOFF' else: raise orm.except_orm( @@ -213,17 +213,17 @@ class banking_export_sdd_wizard(orm.TransientModel): "'%s' has type set to 'One-Off' and it has a " "last debit date set to '%s', so we can't use " "it.") - % (line.sdd_mandate_id.unique_mandate_reference, - line.sdd_mandate_id.partner_id.name, - line.sdd_mandate_id.last_debit_date)) - elif line.sdd_mandate_id.type == 'recurrent': + % (line.mandate_id.unique_mandate_reference, + line.mandate_id.partner_id.name, + line.mandate_id.last_debit_date)) + elif line.mandate_id.type == 'recurrent': seq_type_map = { 'recurring': 'RCUR', 'first': 'FRST', 'final': 'FNAL', } seq_type_label = \ - line.sdd_mandate_id.recurrent_sequence_type + line.mandate_id.recurrent_sequence_type assert seq_type_label is not False seq_type = seq_type_map[seq_type_label] key = (requested_date, priority, seq_type, scheme) @@ -306,22 +306,22 @@ class banking_export_sdd_wizard(orm.TransientModel): mandate_related_info_2_47, 'MndtId') mandate_identification_2_48.text = self._prepare_field( cr, uid, 'Unique Mandate Reference', - 'line.sdd_mandate_id.unique_mandate_reference', + 'line.mandate_id.unique_mandate_reference', {'line': line}, 35, gen_args=gen_args, context=context) mandate_signature_date_2_49 = etree.SubElement( mandate_related_info_2_47, 'DtOfSgntr') mandate_signature_date_2_49.text = self._prepare_field( cr, uid, 'Mandate Signature Date', - 'line.sdd_mandate_id.signature_date', + 'line.mandate_id.signature_date', {'line': line}, 10, gen_args=gen_args, context=context) if sequence_type == 'FRST' and ( - line.sdd_mandate_id.last_debit_date or - not line.sdd_mandate_id.sepa_migrated): + line.mandate_id.last_debit_date or + not line.mandate_id.sepa_migrated): previous_bank = self._get_previous_bank( cr, uid, line, context=context) - if previous_bank or not line.sdd_mandate_id.sepa_migrated: + if previous_bank or not line.mandate_id.sepa_migrated: amendment_indicator_2_50 = etree.SubElement( mandate_related_info_2_47, 'AmdmntInd') amendment_indicator_2_50.text = 'true' @@ -362,13 +362,13 @@ class banking_export_sdd_wizard(orm.TransientModel): ori_debtor_agent_other, 'Id') ori_debtor_agent_other_id.text = 'SMNDA' # SMNDA = Same Mandate New Debtor Agent - elif not line.sdd_mandate_id.sepa_migrated: + elif not line.mandate_id.sepa_migrated: ori_mandate_identification_2_52 = etree.SubElement( amendment_info_details_2_51, 'OrgnlMndtId') ori_mandate_identification_2_52.text = \ self._prepare_field( cr, uid, 'Original Mandate Identification', - 'line.sdd_mandate_id.' + 'line.mandate_id.' 'original_mandate_identification', {'line': line}, gen_args=gen_args, @@ -424,25 +424,25 @@ class banking_export_sdd_wizard(orm.TransientModel): context=context) for order in sepa_export.payment_order_ids: workflow.trg_validate(uid, 'payment.order', order.id, 'done', cr) - mandate_ids = [line.sdd_mandate_id.id for line in order.line_ids] - self.pool['sdd.mandate'].write( + mandate_ids = [line.mandate_id.id for line in order.line_ids] + self.pool['account.banking.mandate'].write( cr, uid, mandate_ids, {'last_debit_date': datetime.today().strftime('%Y-%m-%d')}, context=context) to_expire_ids = [] first_mandate_ids = [] for line in order.line_ids: - if line.sdd_mandate_id.type == 'oneoff': - to_expire_ids.append(line.sdd_mandate_id.id) - elif line.sdd_mandate_id.type == 'recurrent': - seq_type = line.sdd_mandate_id.recurrent_sequence_type + if line.mandate_id.type == 'oneoff': + to_expire_ids.append(line.mandate_id.id) + elif line.mandate_id.type == 'recurrent': + seq_type = line.mandate_id.recurrent_sequence_type if seq_type == 'final': - to_expire_ids.append(line.sdd_mandate_id.id) + to_expire_ids.append(line.mandate_id.id) elif seq_type == 'first': - first_mandate_ids.append(line.sdd_mandate_id.id) - self.pool['sdd.mandate'].write( + first_mandate_ids.append(line.mandate_id.id) + self.pool['account.banking.mandate'].write( cr, uid, to_expire_ids, {'state': 'expired'}, context=context) - self.pool['sdd.mandate'].write( + self.pool['account.banking.mandate'].write( cr, uid, first_mandate_ids, { 'recurrent_sequence_type': 'recurring', 'sepa_migrated': True, From c09e27065a329dbe883a77e2b00f2c511aad3d0f Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Tue, 21 Oct 2014 01:53:12 +0200 Subject: [PATCH 040/118] account_banking_sepa_direct_debit: Restore scheme field in mandate view --- .../views/account_banking_mandate_view.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/account_banking_sepa_direct_debit/views/account_banking_mandate_view.xml b/account_banking_sepa_direct_debit/views/account_banking_mandate_view.xml index eba8ae28b..a2065dc75 100644 --- a/account_banking_sepa_direct_debit/views/account_banking_mandate_view.xml +++ b/account_banking_sepa_direct_debit/views/account_banking_mandate_view.xml @@ -18,6 +18,7 @@ + From 0e991a29d53cc5749fefede39d9cfe02b18ae364 Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Tue, 21 Oct 2014 09:51:40 +0200 Subject: [PATCH 041/118] Uncaught flake8 errors --- .../models/res_company.py | 2 +- .../wizard/export_sdd.py | 97 ++++++++----------- 2 files changed, 42 insertions(+), 57 deletions(-) diff --git a/account_banking_sepa_direct_debit/models/res_company.py b/account_banking_sepa_direct_debit/models/res_company.py index 327edc401..46f98bbc2 100644 --- a/account_banking_sepa_direct_debit/models/res_company.py +++ b/account_banking_sepa_direct_debit/models/res_company.py @@ -62,7 +62,7 @@ class ResCompany(models.Model): after_replacement = '' for char in before_replacement: if char.isalpha(): - after_replacement += str(ord(char)-87) + after_replacement += str(ord(char) - 87) else: after_replacement += char logger.debug( diff --git a/account_banking_sepa_direct_debit/wizard/export_sdd.py b/account_banking_sepa_direct_debit/wizard/export_sdd.py index 79ead28b8..aa46ff8b1 100644 --- a/account_banking_sepa_direct_debit/wizard/export_sdd.py +++ b/account_banking_sepa_direct_debit/wizard/export_sdd.py @@ -28,35 +28,34 @@ from datetime import datetime from lxml import etree -class banking_export_sdd_wizard(orm.TransientModel): +class BankingExportSddWizard(orm.TransientModel): _name = 'banking.export.sdd.wizard' _inherit = ['banking.export.pain'] _description = 'Export SEPA Direct Debit File' _columns = { - 'state': fields.selection([ - ('create', 'Create'), - ('finish', 'Finish'), - ], 'State', readonly=True), + 'state': fields.selection( + [('create', 'Create'), + ('finish', 'Finish')], 'State', readonly=True), 'batch_booking': fields.boolean( 'Batch Booking', help="If true, the bank statement will display only one credit " "line for all the direct debits of the SEPA file ; if false, " "the bank statement will display one credit line per direct " "debit of the SEPA file."), - 'charge_bearer': fields.selection([ - ('SLEV', 'Following Service Level'), - ('SHAR', 'Shared'), - ('CRED', 'Borne by Creditor'), - ('DEBT', 'Borne by Debtor'), - ], 'Charge Bearer', required=True, + 'charge_bearer': fields.selection( + [('SLEV', 'Following Service Level'), + ('SHAR', 'Shared'), + ('CRED', 'Borne by Creditor'), + ('DEBT', 'Borne by Debtor')], 'Charge Bearer', required=True, help="Following service level : transaction charges are to be " - "applied following the rules agreed in the service level and/or " - "scheme (SEPA Core messages must use this). Shared : transaction " - "charges on the creditor side are to be borne by the creditor, " - "transaction charges on the debtor side are to be borne by the " - "debtor. Borne by creditor : all transaction charges are to be " - "borne by the creditor. Borne by debtor : all transaction " - "charges are to be borne by the debtor."), + "applied following the rules agreed in the service level " + "and/or scheme (SEPA Core messages must use this). Shared : " + "transaction charges on the creditor side are to be borne " + "by the creditor, transaction charges on the debtor side are " + "to be borne by the debtor. Borne by creditor : all " + "transaction charges are to be borne by the creditor. Borne " + "by debtor : all transaction charges are to be borne by the " + "debtor."), 'nb_transactions': fields.related( 'file_id', 'nb_transactions', type='integer', string='Number of Transactions', readonly=True), @@ -73,19 +72,19 @@ class banking_export_sdd_wizard(orm.TransientModel): 'payment_order_ids': fields.many2many( 'payment.order', 'wiz_sdd_payorders_rel', 'wizard_id', 'payment_order_id', 'Payment Orders', readonly=True), - } + } _defaults = { 'charge_bearer': 'SLEV', 'state': 'create', - } + } def create(self, cr, uid, vals, context=None): payment_order_ids = context.get('active_ids', []) vals.update({ 'payment_order_ids': [[6, 0, payment_order_ids]], }) - return super(banking_export_sdd_wizard, self).create( + return super(BankingExportSddWizard, self).create( cr, uid, vals, context=context) def _get_previous_bank(self, cr, uid, payline, context=None): @@ -115,9 +114,7 @@ class banking_export_sdd_wizard(orm.TransientModel): return previous_bank def create_sepa(self, cr, uid, ids, context=None): - ''' - Creates the SEPA Direct Debit file. That's the important code ! - ''' + """Creates the SEPA Direct Debit file. That's the important code !""" sepa_export = self.browse(cr, uid, ids[0], context=context) pain_flavor = sepa_export.payment_order_ids[0].mode.type.code @@ -139,10 +136,9 @@ class banking_export_sdd_wizard(orm.TransientModel): raise orm.except_orm( _('Error:'), _("Payment Type Code '%s' is not supported. The only " - "Payment Type Code supported for SEPA Direct Debit " - "are 'pain.008.001.02', 'pain.008.001.03' and " - "'pain.008.001.04'.") % pain_flavor) - + "Payment Type Code supported for SEPA Direct Debit are " + "'pain.008.001.02', 'pain.008.001.03' and " + "'pain.008.001.04'.") % pain_flavor) gen_args = { 'bic_xml_tag': bic_xml_tag, 'name_maxsize': name_maxsize, @@ -154,20 +150,16 @@ class banking_export_sdd_wizard(orm.TransientModel): 'pain_xsd_file': 'account_banking_sepa_direct_debit/data/%s.xsd' % pain_flavor, } - pain_ns = { 'xsi': 'http://www.w3.org/2001/XMLSchema-instance', None: 'urn:iso:std:iso:20022:tech:xsd:%s' % pain_flavor, - } - + } xml_root = etree.Element('Document', nsmap=pain_ns) pain_root = etree.SubElement(xml_root, root_xml_tag) - # A. Group header group_header_1_0, nb_of_transactions_1_6, control_sum_1_7 = \ self.generate_group_header_block( cr, uid, pain_root, gen_args, context=context) - transactions_count_1_6 = 0 total_amount = 0.0 amount_control_sum_1_7 = 0.0 @@ -192,36 +184,35 @@ class banking_export_sdd_wizard(orm.TransientModel): raise orm.except_orm( _('Error:'), _("Missing SEPA Direct Debit mandate on the payment " - "line with partner '%s' and Invoice ref '%s'.") + "line with partner '%s' and Invoice ref '%s'.") % (line.partner_id.name, - line.ml_inv_ref.number)) + line.ml_inv_ref.number)) scheme = line.mandate_id.scheme if line.mandate_id.state != 'valid': raise orm.except_orm( _('Error:'), _("The SEPA Direct Debit mandate with reference '%s' " - "for partner '%s' has expired.") + "for partner '%s' has expired.") % (line.mandate_id.unique_mandate_reference, - line.mandate_id.partner_id.name)) + line.mandate_id.partner_id.name)) if line.mandate_id.type == 'oneoff': - if not line.mandate_id.last_debit_date: - seq_type = 'OOFF' - else: + seq_type = 'OOFF' + if line.mandate_id.last_debit_date: raise orm.except_orm( _('Error:'), _("The mandate with reference '%s' for partner " - "'%s' has type set to 'One-Off' and it has a " - "last debit date set to '%s', so we can't use " - "it.") + "'%s' has type set to 'One-Off' and it has a " + "last debit date set to '%s', so we can't use " + "it.") % (line.mandate_id.unique_mandate_reference, - line.mandate_id.partner_id.name, - line.mandate_id.last_debit_date)) + line.mandate_id.partner_id.name, + line.mandate_id.last_debit_date)) elif line.mandate_id.type == 'recurrent': seq_type_map = { 'recurring': 'RCUR', 'first': 'FRST', 'final': 'FNAL', - } + } seq_type_label = \ line.mandate_id.recurrent_sequence_type assert seq_type_label is not False @@ -261,10 +252,8 @@ class banking_export_sdd_wizard(orm.TransientModel): 'sepa_export.payment_order_ids[0].mode.bank_id.bank.bic', {'sepa_export': sepa_export}, gen_args, context=context) - charge_bearer_2_24 = etree.SubElement(payment_info_2_0, 'ChrgBr') charge_bearer_2_24.text = sepa_export.charge_bearer - creditor_scheme_identification_2_27 = etree.SubElement( payment_info_2_0, 'CdtrSchmeId') self.generate_creditor_scheme_identification( @@ -273,7 +262,6 @@ class banking_export_sdd_wizard(orm.TransientModel): 'sepa_creditor_identifier', 'SEPA Creditor Identifier', {'sepa_export': sepa_export}, 'SEPA', gen_args, context=context) - transactions_count_2_4 = 0 amount_control_sum_2_5 = 0.0 for line in lines: @@ -404,20 +392,17 @@ class banking_export_sdd_wizard(orm.TransientModel): gen_args, context=context) def cancel_sepa(self, cr, uid, ids, context=None): - ''' - Cancel the SEPA file: just drop the file - ''' + """Cancel the SEPA file: just drop the file""" sepa_export = self.browse(cr, uid, ids[0], context=context) self.pool.get('banking.export.sdd').unlink( cr, uid, sepa_export.file_id.id, context=context) return {'type': 'ir.actions.act_window_close'} def save_sepa(self, cr, uid, ids, context=None): - ''' - Save the SEPA Direct Debit file: mark all payments in the file + """Save the SEPA Direct Debit file: mark all payments in the file as 'sent'. Write 'last debit date' on mandate and set oneoff - mandate to expired - ''' + mandate to expired. + """ sepa_export = self.browse(cr, uid, ids[0], context=context) self.pool.get('banking.export.sdd').write( cr, uid, sepa_export.file_id.id, {'state': 'sent'}, From 3d3edfc2eca564149035d7f4eb947556a2fd3207 Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Wed, 22 Oct 2014 20:13:23 +0200 Subject: [PATCH 042/118] account_banking_sepa_direct_debit: Set args correctly for cron job --- account_banking_sepa_direct_debit/data/mandate_expire_cron.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/account_banking_sepa_direct_debit/data/mandate_expire_cron.xml b/account_banking_sepa_direct_debit/data/mandate_expire_cron.xml index 79aa05689..48fe6fc63 100644 --- a/account_banking_sepa_direct_debit/data/mandate_expire_cron.xml +++ b/account_banking_sepa_direct_debit/data/mandate_expire_cron.xml @@ -18,7 +18,7 @@ - +
From 98158f895347c22785c2e5224139590b9d96fd6b Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Fri, 31 Oct 2014 23:54:24 +0100 Subject: [PATCH 043/118] account_payment_sale_stock: Split for removing stock dependency on sale [DEL] Remove old translations templates [IMP] More reorder on folder structure --- .../account_banking_sepa_direct_debit.pot | 633 ------------------ .../models/banking_export_sdd.py | 3 +- 2 files changed, 1 insertion(+), 635 deletions(-) delete mode 100644 account_banking_sepa_direct_debit/i18n/account_banking_sepa_direct_debit.pot diff --git a/account_banking_sepa_direct_debit/i18n/account_banking_sepa_direct_debit.pot b/account_banking_sepa_direct_debit/i18n/account_banking_sepa_direct_debit.pot deleted file mode 100644 index 0db576726..000000000 --- a/account_banking_sepa_direct_debit/i18n/account_banking_sepa_direct_debit.pot +++ /dev/null @@ -1,633 +0,0 @@ -# Translation of OpenERP Server. -# This file contains the translation of the following modules: -# * account_banking_sepa_direct_debit -# -msgid "" -msgstr "" -"Project-Id-Version: OpenERP Server 7.0\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-12-23 22:24+0000\n" -"PO-Revision-Date: 2013-12-23 22:24+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_sepa_direct_debit -#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.mandate_valid -msgid "SEPA Direct Debit Mandate Validated" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,filename:0 -#: field:banking.export.sdd.wizard,filename:0 -msgid "Filename" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:200 -#, python-format -msgid "The SEPA Direct Debit mandate with reference '%s' for partner '%s' has expired." -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:219 -#, python-format -msgid "Cannot validate the mandate '%s' without a date of signature." -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: selection:sdd.mandate,recurrent_sequence_type:0 -msgid "Final" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd.wizard,state:0 -msgid "Finish" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: view:res.partner:0 -#: view:res.partner.bank:0 -msgid "SDD Mandates" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: constraint:payment.line:0 -#: constraint:sdd.mandate:0 -msgid "Error msg in raise" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd,state:0 -msgid "Reconciled" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,recurrent_sequence_type:0 -msgid "Sequence Type for Next Debit" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd,charge_bearer:0 -#: selection:banking.export.sdd.wizard,charge_bearer:0 -msgid "Borne by Creditor" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.sdd_mandate_action -#: model:ir.ui.menu,name:account_banking_sepa_direct_debit.sdd_mandate_menu -#: view:res.partner.bank:0 -#: field:res.partner.bank,sdd_mandate_ids:0 -msgid "SEPA Direct Debit Mandates" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: view:banking.export.sdd.wizard:0 -#: view:sdd.mandate:0 -msgid "Validate" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_recurring -#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.recurrent_sequence_type_recurring -msgid "Sequence Type set to Recurring" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: view:banking.export.sdd.wizard:0 -msgid "Generate" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.mandate_cancel -msgid "SEPA Direct Debit Mandate Cancelled" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd,charge_bearer:0 -#: selection:banking.export.sdd.wizard,charge_bearer:0 -msgid "Borne by Debtor" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:212 -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:218 -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:224 -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:232 -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:239 -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:245 -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:253 -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:395 -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:140 -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:192 -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:199 -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:209 -#, python-format -msgid "Error:" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,message_ids:0 -msgid "Messages" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,unique_mandate_reference:0 -msgid "Unique Mandate Reference" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -#: selection:sdd.mandate,state:0 -msgid "Cancelled" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:141 -#, python-format -msgid "Payment Type Code '%s' is not supported. The only Payment Type Code supported for SEPA Direct Debit are 'pain.008.001.02', 'pain.008.001.03' and 'pain.008.001.04'." -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: help:sdd.mandate,message_unread:0 -msgid "If checked new messages require your attention." -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd.wizard,file_id:0 -msgid "SDD File" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.mandate_expired -msgid "SEPA Direct Debit Mandate has Expired" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:246 -#, python-format -msgid "The recurrent mandate '%s' which is not marked as 'Migrated to SEPA' must have its recurrent sequence type set to 'First'." -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: help:banking.export.sdd,charge_bearer:0 -#: help:banking.export.sdd.wizard,charge_bearer:0 -msgid "Following service level : transaction charges are to be applied following the rules agreed in the service level and/or scheme (SEPA Core messages must use this). Shared : transaction charges on the creditor side are to be borne by the creditor, transaction charges on the debtor side are to be borne by the debtor. Borne by creditor : all transaction charges are to be borne by the creditor. Borne by debtor : all transaction charges are to be borne by the debtor." -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -msgid "Reference" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: view:banking.export.sdd:0 -msgid "SEPA Direct Debit" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: view:banking.export.sdd.wizard:0 -msgid "SEPA Direct Debit XML file generation" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: help:sdd.mandate,message_summary:0 -msgid "Holds the Chatter summary (number of messages, ...). This summary is directly in html format in order to be inserted in kanban views." -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: model:ir.model,name:account_banking_sepa_direct_debit.model_payment_line -msgid "Payment Line" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,create_date:0 -msgid "Generation Date" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:396 -#, python-format -msgid "The payment line with reference '%s' has the bank account '%s' which is not attached to the mandate '%s' (this mandate is attached to the bank account '%s')." -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd.wizard,state:0 -msgid "Create" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,nb_transactions:0 -#: field:banking.export.sdd.wizard,nb_transactions:0 -msgid "Number of Transactions" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -#: selection:sdd.mandate,type:0 -msgid "One-Off" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,state:0 -#: field:banking.export.sdd.wizard,state:0 -msgid "State" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:240 -#, python-format -msgid "The recurrent mandate '%s' must have a sequence type." -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,message_follower_ids:0 -msgid "Followers" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,message_unread:0 -msgid "Unread Messages" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: view:banking.export.sdd:0 -#: field:banking.export.sdd,payment_order_ids:0 -#: field:banking.export.sdd.wizard,payment_order_ids:0 -msgid "Payment Orders" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -msgid "Type" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd,state:0 -msgid "Sent" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:res.company,original_creditor_identifier:0 -msgid "Original Creditor Identifier" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: selection:sdd.mandate,recurrent_sequence_type:0 -msgid "Recurring" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: help:res.company,sepa_creditor_identifier:0 -msgid "Enter the Creditor Identifier that has been attributed to your company to make SEPA Direct Debits. This identifier is composed of :\n" -"- your country ISO code (2 letters)\n" -"- a 2-digits checkum\n" -"- a 3-letters business code\n" -"- a country-specific identifier" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: sql_constraint:sdd.mandate:0 -msgid "A Mandate with the same reference already exists for this company !" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: help:sdd.mandate,state:0 -msgid "Only valid mandates can be used in a payment line. A cancelled mandate is a mandate that has been cancelled by the customer. A one-off mandate expires after its first use. A recurrent mandate expires after it's final use or if it hasn't been used for 36 months." -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: help:sdd.mandate,recurrent_sequence_type:0 -msgid "This field is only used for Recurrent mandates, not for One-Off mandates." -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:213 -#, python-format -msgid "The date of signature of mandate '%s' is in the future !" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -msgid "Signature Date" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,charge_bearer:0 -#: field:banking.export.sdd.wizard,charge_bearer:0 -msgid "Charge Bearer" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,partner_id:0 -msgid "Partner" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: selection:sdd.mandate,recurrent_sequence_type:0 -msgid "First" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,signature_date:0 -msgid "Date of Signature of the Mandate" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.mandate_cancel -msgid "Mandate Cancelled" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.act_banking_export_sdd_payment_order -msgid "Generated SEPA Direct Debit Files" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: help:sdd.mandate,sepa_migrated:0 -msgid "If this field is not active, the mandate section of the next direct debit file that include this mandate will contain the 'Original Mandate Identification' and the 'Original Creditor Scheme Identification'. This is required in a few countries (Belgium for instance), but not in all countries. If this is not required in your country, you should keep this field always active." -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,company_id:0 -msgid "Company" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: model:ir.model,name:account_banking_sepa_direct_debit.model_banking_export_sdd_wizard -msgid "Export SEPA Direct Debit File" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: help:banking.export.sdd,batch_booking:0 -#: help:banking.export.sdd.wizard,batch_booking:0 -msgid "If true, the bank statement will display only one credit line for all the direct debits of the SEPA file ; if false, the bank statement will display one credit line per direct debit of the SEPA file." -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:225 -#, python-format -msgid "Cannot validate the mandate '%s' because it is not attached to a bank account." -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd,state:0 -#: view:sdd.mandate:0 -#: selection:sdd.mandate,state:0 -msgid "Draft" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:290 -#, python-format -msgid "Mandate update" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd,charge_bearer:0 -#: selection:banking.export.sdd.wizard,charge_bearer:0 -msgid "Shared" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,batch_booking:0 -#: field:banking.export.sdd.wizard,batch_booking:0 -msgid "Batch Booking" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,sepa_migrated:0 -msgid "Migrated to SEPA" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,state:0 -msgid "Status" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,total_amount:0 -#: field:banking.export.sdd.wizard,total_amount:0 -msgid "Total Amount" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.action_account_banking_sdd -#: model:ir.ui.menu,name:account_banking_sepa_direct_debit.menu_account_banking_sdd -msgid "SEPA Direct Debit Files" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd,charge_bearer:0 -#: selection:banking.export.sdd.wizard,charge_bearer:0 -msgid "Following Service Level" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:233 -#, python-format -msgid "The mandate '%s' can't have a date of last debit before the date of signature." -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_final -#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.recurrent_sequence_type_final -msgid "Sequence Type set to Final" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,message_is_follower:0 -msgid "Is a Follower" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: help:sdd.mandate,original_mandate_identification:0 -msgid "When the field 'Migrated to SEPA' is not active, this field will be used as the Original Mandate Identification in the Direct Debit file." -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: view:payment.order:0 -msgid "SDD Mandate" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,original_mandate_identification:0 -msgid "Original Mandate Identification" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: model:ir.model,name:account_banking_sepa_direct_debit.model_res_company -msgid "Companies" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,message_summary:0 -msgid "Summary" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: model:res.groups,name:account_banking_sepa_direct_debit.group_original_mandate_required -msgid "Original Mandate Required (SEPA)" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:account.invoice,sdd_mandate_id:0 -#: model:ir.model,name:account_banking_sepa_direct_debit.model_sdd_mandate -#: field:payment.line,sdd_mandate_id:0 -#: view:sdd.mandate:0 -msgid "SEPA Direct Debit Mandate" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:193 -#, python-format -msgid "Missing SEPA Direct Debit mandate on the payment line with partner '%s' and Invoice ref '%s'." -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:210 -#, python-format -msgid "The mandate with reference '%s' for partner '%s' has type set to 'One-Off' and it has a last debit date set to '%s', so we can't use it." -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,scan:0 -msgid "Scan of the Mandate" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,last_debit_date:0 -msgid "Date of the Last Debit" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.mandate_expired -msgid "Mandate Expired" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: constraint:res.company:0 -msgid "Invalid SEPA Creditor Identifier." -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: model:ir.model,name:account_banking_sepa_direct_debit.model_res_partner_bank -msgid "Bank Accounts" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: model:ir.actions.act_window,help:account_banking_sepa_direct_debit.sdd_mandate_action -msgid "

\n" -" Click to create a new SEPA Direct Debit Mandate.\n" -"

\n" -" A SEPA Direct Debit Mandate is a document signed by your customer that gives you the autorization to do one or several direct debits on his bank account.\n" -"

\n" -" " -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: view:banking.export.sdd:0 -msgid "General Information" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -#: selection:sdd.mandate,state:0 -msgid "Valid" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: model:ir.model,name:account_banking_sepa_direct_debit.model_account_invoice -msgid "Invoice" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: view:banking.export.sdd.wizard:0 -#: view:sdd.mandate:0 -msgid "Cancel" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -#: field:sdd.mandate,payment_line_ids:0 -msgid "Related Payment Lines" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -#: selection:sdd.mandate,type:0 -msgid "Recurrent" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,type:0 -msgid "Type of Mandate" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.mandate_valid -msgid "Mandate Validated" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,file:0 -msgid "SEPA File" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:res.company,sepa_creditor_identifier:0 -msgid "SEPA Creditor Identifier" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: model:ir.model,name:account_banking_sepa_direct_debit.model_banking_export_sdd -msgid "SEPA Direct Debit export" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -#: selection:sdd.mandate,state:0 -msgid "Expired" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,partner_bank_id:0 -msgid "Bank Account" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:254 -#, python-format -msgid "You must set the 'Original Mandate Identification' on the recurrent mandate '%s' which is not marked as 'Migrated to SEPA'." -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_first -#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.recurrent_sequence_type_first -msgid "Sequence Type set to First" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:291 -#, python-format -msgid "As you changed the bank account attached to this mandate, the 'Sequence Type' has been set back to 'First'." -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: help:sdd.mandate,message_ids:0 -msgid "Messages and communication history" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -msgid "Search SEPA Direct Debit Mandates" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd.wizard,file:0 -msgid "File" -msgstr "" - diff --git a/account_banking_sepa_direct_debit/models/banking_export_sdd.py b/account_banking_sepa_direct_debit/models/banking_export_sdd.py index 4bcd49367..c80cebf6e 100644 --- a/account_banking_sepa_direct_debit/models/banking_export_sdd.py +++ b/account_banking_sepa_direct_debit/models/banking_export_sdd.py @@ -32,9 +32,8 @@ class BankingExportSdd(models.Model): _rec_name = 'filename' @api.one + @api.depends('payment_order_ids', 'payment_order_ids.reference') def _generate_filename(self): - filename = '' - # FIXME : we never enter inside the IF to give a good filename if self.payment_order_ids: ref = self.payment_order_ids[0].reference label = unidecode(ref.replace('/', '-')) if ref else 'error' From d965af29015c97ae6ddb9e2f8a9e6e17012a78bf Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Sat, 1 Nov 2014 01:48:26 +0100 Subject: [PATCH 044/118] Translation template files [IMP] Translations to spanish --- .../account_banking_sepa_direct_debit.pot | 447 +++++++++++++++++ account_banking_sepa_direct_debit/i18n/es.po | 456 ++++++++++++++++++ 2 files changed, 903 insertions(+) create mode 100644 account_banking_sepa_direct_debit/i18n/account_banking_sepa_direct_debit.pot create mode 100644 account_banking_sepa_direct_debit/i18n/es.po diff --git a/account_banking_sepa_direct_debit/i18n/account_banking_sepa_direct_debit.pot b/account_banking_sepa_direct_debit/i18n/account_banking_sepa_direct_debit.pot new file mode 100644 index 000000000..a39fa750a --- /dev/null +++ b/account_banking_sepa_direct_debit/i18n/account_banking_sepa_direct_debit.pot @@ -0,0 +1,447 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_banking_sepa_direct_debit +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 8.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-10-31 22:53+0000\n" +"PO-Revision-Date: 2014-10-31 22:53+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_sepa_direct_debit +#: model:ir.actions.act_window,help:account_banking_sepa_direct_debit.mandate_action +msgid "

\n" +" Click to create a new SEPA Direct Debit Mandate.\n" +"

\n" +" A SEPA Direct Debit Mandate is a document signed by your customer that gives you the autorization to do one or several direct debits on his bank account.\n" +"

\n" +" " +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_account_banking_mandate +msgid "A generic banking mandate" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:120 +#, python-format +msgid "As you changed the bank account attached to this mandate, the 'Sequence Type' has been set back to 'First'." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:account.banking.mandate,scheme:0 +msgid "Basic (CORE)" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,batch_booking:0 +#: field:banking.export.sdd.wizard,batch_booking:0 +msgid "Batch Booking" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,charge_bearer:0 +#: selection:banking.export.sdd.wizard,charge_bearer:0 +msgid "Borne by Creditor" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,charge_bearer:0 +#: selection:banking.export.sdd.wizard,charge_bearer:0 +msgid "Borne by Debtor" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd.wizard:account_banking_sepa_direct_debit.banking_export_sdd_wizard_view +msgid "Cancel" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,charge_bearer:0 +#: field:banking.export.sdd.wizard,charge_bearer:0 +msgid "Charge Bearer" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_res_company +msgid "Companies" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd.wizard,state:0 +msgid "Create" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,create_uid:0 +#: field:banking.export.sdd.wizard,create_uid:0 +msgid "Created by" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,create_date:0 +msgid "Created on" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,state:0 +msgid "Draft" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: help:res.company,sepa_creditor_identifier:0 +msgid "Enter the Creditor Identifier that has been attributed to your company to make SEPA Direct Debits. This identifier is composed of :\n" +"- your country ISO code (2 letters)\n" +"- a 2-digits checkum\n" +"- a 3-letters business code\n" +"- a country-specific identifier" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:account.banking.mandate,scheme:0 +msgid "Enterprise (B2B)" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/res_company.py:79 +#, python-format +msgid "Error" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:137 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:185 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:193 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:202 +#, python-format +msgid "Error:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_banking_export_sdd_wizard +msgid "Export SEPA Direct Debit File" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,file:0 +msgid "File" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,filename:0 +#: field:banking.export.sdd.wizard,filename:0 +msgid "Filename" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:account.banking.mandate,recurrent_sequence_type:0 +msgid "Final" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd.wizard,state:0 +msgid "Finish" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:account.banking.mandate,recurrent_sequence_type:0 +msgid "First" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,charge_bearer:0 +#: selection:banking.export.sdd.wizard,charge_bearer:0 +msgid "Following Service Level" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: help:banking.export.sdd,charge_bearer:0 +#: help:banking.export.sdd.wizard,charge_bearer:0 +msgid "Following service level : transaction charges are to be applied following the rules agreed in the service level and/or scheme (SEPA Core messages must use this). Shared : transaction charges on the creditor side are to be borne by the creditor, transaction charges on the debtor side are to be borne by the debtor. Borne by creditor : all transaction charges are to be borne by the creditor. Borne by debtor : all transaction charges are to be borne by the debtor." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd:account_banking_sepa_direct_debit.view_banking_export_sdd_form +msgid "General Information" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd.wizard:account_banking_sepa_direct_debit.banking_export_sdd_wizard_view +msgid "Generate" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.act_banking_export_sdd_payment_order +msgid "Generated SEPA Direct Debit Files" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,create_date:0 +msgid "Generation Date" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,id:0 +#: field:banking.export.sdd.wizard,id:0 +msgid "ID" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: help:account.banking.mandate,sepa_migrated:0 +msgid "If this field is not active, the mandate section of the next direct debit file that include this mandate will contain the 'Original Mandate Identification' and the 'Original Creditor Scheme Identification'. This is required in a few countries (Belgium for instance), but not in all countries. If this is not required in your country, you should keep this field always active." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: help:banking.export.sdd,batch_booking:0 +#: help:banking.export.sdd.wizard,batch_booking:0 +msgid "If true, the bank statement will display only one credit line for all the direct debits of the SEPA file ; if false, the bank statement will display one credit line per direct debit of the SEPA file." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/res_company.py:80 +#, python-format +msgid "Invalid SEPA Creditor Identifier." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,write_uid:0 +#: field:banking.export.sdd.wizard,write_uid:0 +msgid "Last Updated by" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,write_date:0 +#: field:banking.export.sdd.wizard,write_date:0 +msgid "Last Updated on" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:119 +#, python-format +msgid "Mandate update" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:account.banking.mandate,sepa_migrated:0 +msgid "Migrated to SEPA" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:186 +#, python-format +msgid "Missing SEPA Direct Debit mandate on the payment line with partner '%s' and Invoice ref '%s'." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,nb_transactions:0 +#: field:banking.export.sdd.wizard,nb_transactions:0 +msgid "Number of Transactions" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:account.banking.mandate:account_banking_sepa_direct_debit.sdd_mandate_search +#: selection:account.banking.mandate,type:0 +msgid "One-Off" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:res.company,original_creditor_identifier:0 +msgid "Original Creditor Identifier" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:account.banking.mandate,original_mandate_identification:0 +msgid "Original Mandate Identification" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:res.groups,name:account_banking_sepa_direct_debit.group_original_mandate_required +msgid "Original Mandate Required (SEPA)" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd:account_banking_sepa_direct_debit.view_banking_export_sdd_form +#: field:banking.export.sdd,payment_order_ids:0 +#: field:banking.export.sdd.wizard,payment_order_ids:0 +msgid "Payment Orders" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:138 +#, python-format +msgid "Payment Type Code '%s' is not supported. The only Payment Type Code supported for SEPA Direct Debit are 'pain.008.001.02', 'pain.008.001.03' and 'pain.008.001.04'." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:account.banking.mandate:account_banking_sepa_direct_debit.sdd_mandate_search +#: selection:account.banking.mandate,type:0 +msgid "Recurrent" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:account.banking.mandate,recurrent_sequence_type:0 +msgid "Recurring" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,file_id:0 +msgid "SDD File" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:res.partner:account_banking_sepa_direct_debit.sdd_mandate_partner_form +#: view:res.partner.bank:account_banking_sepa_direct_debit.sdd_mandate_partner_bank_tree +msgid "SDD Mandates" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:res.company,sepa_creditor_identifier:0 +msgid "SEPA Creditor Identifier" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd:account_banking_sepa_direct_debit.view_banking_export_sdd_form +#: view:banking.export.sdd:account_banking_sepa_direct_debit.view_banking_export_sdd_tree +msgid "SEPA Direct Debit" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.action_account_banking_sdd +#: model:ir.ui.menu,name:account_banking_sepa_direct_debit.menu_account_banking_sdd +msgid "SEPA Direct Debit Files" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.mandate_action +msgid "SEPA Direct Debit Mandates" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd.wizard:account_banking_sepa_direct_debit.banking_export_sdd_wizard_view +msgid "SEPA Direct Debit XML file generation" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_banking_export_sdd +msgid "SEPA Direct Debit export" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,file:0 +msgid "SEPA File" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:account.banking.mandate,scheme:0 +msgid "Scheme" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,state:0 +msgid "Sent" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:account.banking.mandate,recurrent_sequence_type:0 +msgid "Sequence Type for Next Debit" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_final +#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.recurrent_sequence_type_final +msgid "Sequence Type set to Final" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_first +#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.recurrent_sequence_type_first +msgid "Sequence Type set to First" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_recurring +#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.recurrent_sequence_type_recurring +msgid "Sequence Type set to Recurring" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,charge_bearer:0 +#: selection:banking.export.sdd.wizard,charge_bearer:0 +msgid "Shared" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,state:0 +#: field:banking.export.sdd.wizard,state:0 +msgid "State" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:194 +#, python-format +msgid "The SEPA Direct Debit mandate with reference '%s' for partner '%s' has expired." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:203 +#, python-format +msgid "The mandate with reference '%s' for partner '%s' has type set to 'One-Off' and it has a last debit date set to '%s', so we can't use it." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:86 +#, python-format +msgid "The recurrent mandate '%s' must have a sequence type." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:95 +#, python-format +msgid "The recurrent mandate '%s' which is not marked as 'Migrated to SEPA' must have its recurrent sequence type set to 'First'." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: help:account.banking.mandate,recurrent_sequence_type:0 +msgid "This field is only used for Recurrent mandates, not for One-Off mandates." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,total_amount:0 +#: field:banking.export.sdd.wizard,total_amount:0 +msgid "Total Amount" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:account.banking.mandate:account_banking_sepa_direct_debit.sdd_mandate_tree +msgid "Type" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:account.banking.mandate,type:0 +msgid "Type of Mandate" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd.wizard:account_banking_sepa_direct_debit.banking_export_sdd_wizard_view +msgid "Validate" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: help:account.banking.mandate,original_mandate_identification:0 +msgid "When the field 'Migrated to SEPA' is not active, this field will be used as the Original Mandate Identification in the Direct Debit file." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:105 +#, python-format +msgid "You must set the 'Original Mandate Identification' on the recurrent mandate '%s' which is not marked as 'Migrated to SEPA'." +msgstr "" + diff --git a/account_banking_sepa_direct_debit/i18n/es.po b/account_banking_sepa_direct_debit/i18n/es.po new file mode 100644 index 000000000..98334c842 --- /dev/null +++ b/account_banking_sepa_direct_debit/i18n/es.po @@ -0,0 +1,456 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_banking_sepa_direct_debit +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 8.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-10-31 22:53+0000\n" +"PO-Revision-Date: 2014-10-31 22:53+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_sepa_direct_debit +#: model:ir.actions.act_window,help:account_banking_sepa_direct_debit.mandate_action +msgid "

\n" +" Click to create a new SEPA Direct Debit Mandate.\n" +"

\n" +" A SEPA Direct Debit Mandate is a document signed by your customer that gives you the autorization to do one or several direct debits on his bank account.\n" +"

\n" +" " +msgstr "

\n" +" Pulse para crear un nuevo mandato de adeudo directo SEPA.\n" +"

\n" +" Un mandato de adeudo directo SEPA es un documento firmado por su cliente que le autoriza a realizar uno o más cobros directos en su cuenta bancaria, también conocidas como domiciliaciones.\n" +"

\n" +" " + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_account_banking_mandate +msgid "A generic banking mandate" +msgstr "Un mandato bancario genérico" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:120 +#, python-format +msgid "As you changed the bank account attached to this mandate, the 'Sequence Type' has been set back to 'First'." +msgstr "Puesto que ha cambiar la cuenta bancaria relacionada con este mandato, el 'Tipo de secuencia' se ha vuelto a 'Inicial'." + +#. module: account_banking_sepa_direct_debit +#: selection:account.banking.mandate,scheme:0 +msgid "Basic (CORE)" +msgstr "Básico (CORE)" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,batch_booking:0 +#: field:banking.export.sdd.wizard,batch_booking:0 +msgid "Batch Booking" +msgstr "Registro en lote" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,charge_bearer:0 +#: selection:banking.export.sdd.wizard,charge_bearer:0 +msgid "Borne by Creditor" +msgstr "A cargo del acreedor" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,charge_bearer:0 +#: selection:banking.export.sdd.wizard,charge_bearer:0 +msgid "Borne by Debtor" +msgstr "A cargo del deudor" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd.wizard:account_banking_sepa_direct_debit.banking_export_sdd_wizard_view +msgid "Cancel" +msgstr "Cancelar" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,charge_bearer:0 +#: field:banking.export.sdd.wizard,charge_bearer:0 +msgid "Charge Bearer" +msgstr "A cargo del portador" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_res_company +msgid "Companies" +msgstr "Compañías" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd.wizard,state:0 +msgid "Create" +msgstr "Crear" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,create_uid:0 +#: field:banking.export.sdd.wizard,create_uid:0 +msgid "Created by" +msgstr "Creado por" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,create_date:0 +msgid "Created on" +msgstr "Creado en" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,state:0 +msgid "Draft" +msgstr "Borrador" + +#. module: account_banking_sepa_direct_debit +#: help:res.company,sepa_creditor_identifier:0 +msgid "Enter the Creditor Identifier that has been attributed to your company to make SEPA Direct Debits. This identifier is composed of :\n" +"- your country ISO code (2 letters)\n" +"- a 2-digits checkum\n" +"- a 3-letters business code\n" +"- a country-specific identifier" +msgstr "Introduzca el identificador de acreedor que se le ha atribuido a su compañía para realizar adeudos directos SEPA. Su banco suele poseer esta información. Este identificador se compone de:\n" +"- el código ISO de 2 letras de su país\n" +"- dos dígitos de comprobación\n" +"- tres letras de código de negocio\n" +"- un identificador específico de país (en España, el NIF)" + +#. module: account_banking_sepa_direct_debit +#: selection:account.banking.mandate,scheme:0 +msgid "Enterprise (B2B)" +msgstr "Empresa (B2B)" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/res_company.py:79 +#, python-format +msgid "Error" +msgstr "Error" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:137 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:185 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:193 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:202 +#, python-format +msgid "Error:" +msgstr "Error:" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_banking_export_sdd_wizard +msgid "Export SEPA Direct Debit File" +msgstr "Exportar archivo de adeudo directo SEPA" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,file:0 +msgid "File" +msgstr "Archivo" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,filename:0 +#: field:banking.export.sdd.wizard,filename:0 +msgid "Filename" +msgstr "Nombre de archivo" + +#. module: account_banking_sepa_direct_debit +#: selection:account.banking.mandate,recurrent_sequence_type:0 +msgid "Final" +msgstr "Final" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd.wizard,state:0 +msgid "Finish" +msgstr "Finalizar" + +#. module: account_banking_sepa_direct_debit +#: selection:account.banking.mandate,recurrent_sequence_type:0 +msgid "First" +msgstr "Inicial" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,charge_bearer:0 +#: selection:banking.export.sdd.wizard,charge_bearer:0 +msgid "Following Service Level" +msgstr "Según el acuerdo de servicio" + +#. module: account_banking_sepa_direct_debit +#: help:banking.export.sdd,charge_bearer:0 +#: help:banking.export.sdd.wizard,charge_bearer:0 +msgid "Following service level : transaction charges are to be applied following the rules agreed in the service level and/or scheme (SEPA Core messages must use this). Shared : transaction charges on the creditor side are to be borne by the creditor, transaction charges on the debtor side are to be borne by the debtor. Borne by creditor : all transaction charges are to be borne by the creditor. Borne by debtor : all transaction charges are to be borne by the debtor." +msgstr "Según el acuerdo de servicio: los costes de la transacción se aplicarán siguiendo las reglas acordadas en el nivel de servicio y/o en el esquema (las remesas SEPA Core deben usar esta opción). Compartidos: los costes de la transacción en la parte del acreedor están a cargo del acreedor, y los costes de la transacción del lado del deudor estarán a cargo del deudor. A cargo del acreedor: todos los costes de la transacción estarán a cargo del acreedor. A cargo del deudor: Todos los costes de la transacción estarán a cargo del deudor." + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd:account_banking_sepa_direct_debit.view_banking_export_sdd_form +msgid "General Information" +msgstr "Información general" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd.wizard:account_banking_sepa_direct_debit.banking_export_sdd_wizard_view +msgid "Generate" +msgstr "Generar" + +#. module: account_banking_sepa_direct_debit +#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.act_banking_export_sdd_payment_order +msgid "Generated SEPA Direct Debit Files" +msgstr "Archivos de adeudos directos SEPA generados" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,create_date:0 +msgid "Generation Date" +msgstr "Fecha de generación" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,id:0 +#: field:banking.export.sdd.wizard,id:0 +msgid "ID" +msgstr "ID" + +#. module: account_banking_sepa_direct_debit +#: help:account.banking.mandate,sepa_migrated:0 +msgid "If this field is not active, the mandate section of the next direct debit file that include this mandate will contain the 'Original Mandate Identification' and the 'Original Creditor Scheme Identification'. This is required in a few countries (Belgium for instance), but not in all countries. If this is not required in your country, you should keep this field always active." +msgstr "Si este campo no está marcado, la sección 'mandato' del próximo archivo de adeudo directo que lo incluya contendrá el valor de los campos 'Identificación del mandato original' y 'Identificación del esquema original del acreedor'. Esto se requiere en algunos países (Bélgica por ejemplo), pero no en todos ellos. Si no es un requisito en su país, este campo siempre debe estar marcado." + +#. module: account_banking_sepa_direct_debit +#: help:banking.export.sdd,batch_booking:0 +#: help:banking.export.sdd.wizard,batch_booking:0 +msgid "If true, the bank statement will display only one credit line for all the direct debits of the SEPA file ; if false, the bank statement will display one credit line per direct debit of the SEPA file." +msgstr "Si está marcado, el extracto bancario mostrará sólo una línea del haber para todos los adeudos directos del archivo SEPA; si no está marcado, entonces el extracto bancario mostrará una línea por cada adeudo directo del archivo SEPA." + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/res_company.py:80 +#, python-format +msgid "Invalid SEPA Creditor Identifier." +msgstr "Identificador de acreedor SEPA no válido." + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,write_uid:0 +#: field:banking.export.sdd.wizard,write_uid:0 +msgid "Last Updated by" +msgstr "Última actualización por" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,write_date:0 +#: field:banking.export.sdd.wizard,write_date:0 +msgid "Last Updated on" +msgstr "Última actualización en" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:119 +#, python-format +msgid "Mandate update" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:account.banking.mandate,sepa_migrated:0 +msgid "Migrated to SEPA" +msgstr "Migrado a SEPA" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:186 +#, python-format +msgid "Missing SEPA Direct Debit mandate on the payment line with partner '%s' and Invoice ref '%s'." +msgstr "Falta el mandato de adeudo directo SEPA en la línea con la empresa '%s' y la factura con referencia '%s'" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,nb_transactions:0 +#: field:banking.export.sdd.wizard,nb_transactions:0 +msgid "Number of Transactions" +msgstr "Nº de transacciones" + +#. module: account_banking_sepa_direct_debit +#: view:account.banking.mandate:account_banking_sepa_direct_debit.sdd_mandate_search +#: selection:account.banking.mandate,type:0 +msgid "One-Off" +msgstr "Único" + +#. module: account_banking_sepa_direct_debit +#: field:res.company,original_creditor_identifier:0 +msgid "Original Creditor Identifier" +msgstr "Identificador del acreedor original" + +#. module: account_banking_sepa_direct_debit +#: field:account.banking.mandate,original_mandate_identification:0 +msgid "Original Mandate Identification" +msgstr "Identificación del mandato original" + +#. module: account_banking_sepa_direct_debit +#: model:res.groups,name:account_banking_sepa_direct_debit.group_original_mandate_required +msgid "Original Mandate Required (SEPA)" +msgstr "Mandato original requerido (SEPA)" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd:account_banking_sepa_direct_debit.view_banking_export_sdd_form +#: field:banking.export.sdd,payment_order_ids:0 +#: field:banking.export.sdd.wizard,payment_order_ids:0 +msgid "Payment Orders" +msgstr "Órdenes de pago" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:138 +#, python-format +msgid "Payment Type Code '%s' is not supported. The only Payment Type Code supported for SEPA Direct Debit are 'pain.008.001.02', 'pain.008.001.03' and 'pain.008.001.04'." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:account.banking.mandate:account_banking_sepa_direct_debit.sdd_mandate_search +#: selection:account.banking.mandate,type:0 +msgid "Recurrent" +msgstr "Recurrente" + +#. module: account_banking_sepa_direct_debit +#: selection:account.banking.mandate,recurrent_sequence_type:0 +msgid "Recurring" +msgstr "Periódico" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,file_id:0 +msgid "SDD File" +msgstr "Archivo SDD" + +#. module: account_banking_sepa_direct_debit +#: view:res.partner:account_banking_sepa_direct_debit.sdd_mandate_partner_form +#: view:res.partner.bank:account_banking_sepa_direct_debit.sdd_mandate_partner_bank_tree +msgid "SDD Mandates" +msgstr "Mandatos SDD" + +#. module: account_banking_sepa_direct_debit +#: field:res.company,sepa_creditor_identifier:0 +msgid "SEPA Creditor Identifier" +msgstr "Identificador de acreedor SEPA" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd:account_banking_sepa_direct_debit.view_banking_export_sdd_form +#: view:banking.export.sdd:account_banking_sepa_direct_debit.view_banking_export_sdd_tree +msgid "SEPA Direct Debit" +msgstr "Adeudo directo SEPA" + +#. module: account_banking_sepa_direct_debit +#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.action_account_banking_sdd +#: model:ir.ui.menu,name:account_banking_sepa_direct_debit.menu_account_banking_sdd +msgid "SEPA Direct Debit Files" +msgstr "Archivos de adeudos directos SEPA" + +#. module: account_banking_sepa_direct_debit +#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.mandate_action +msgid "SEPA Direct Debit Mandates" +msgstr "Mandatos de adeudos directos SEPA" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd.wizard:account_banking_sepa_direct_debit.banking_export_sdd_wizard_view +msgid "SEPA Direct Debit XML file generation" +msgstr "Generación del archivo XML de adeudo directo SEPA" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_banking_export_sdd +msgid "SEPA Direct Debit export" +msgstr "Exportación de adeudo directo SEPA" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,file:0 +msgid "SEPA File" +msgstr "Archivo SEPA" + +#. module: account_banking_sepa_direct_debit +#: field:account.banking.mandate,scheme:0 +msgid "Scheme" +msgstr "Esquema" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,state:0 +msgid "Sent" +msgstr "Enviado" + +#. module: account_banking_sepa_direct_debit +#: field:account.banking.mandate,recurrent_sequence_type:0 +msgid "Sequence Type for Next Debit" +msgstr "Tipo de secuencia para el próximo cobro" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_final +#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.recurrent_sequence_type_final +msgid "Sequence Type set to Final" +msgstr "Tipo de secuencia establecida a 'Final'" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_first +#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.recurrent_sequence_type_first +msgid "Sequence Type set to First" +msgstr "Tipo de secuencia establecida a 'Inicial'" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_recurring +#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.recurrent_sequence_type_recurring +msgid "Sequence Type set to Recurring" +msgstr "Tipo de secuencia establecida a 'Recurrente'" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd,charge_bearer:0 +#: selection:banking.export.sdd.wizard,charge_bearer:0 +msgid "Shared" +msgstr "Compartidos" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,state:0 +#: field:banking.export.sdd.wizard,state:0 +msgid "State" +msgstr "Estado" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:194 +#, python-format +msgid "The SEPA Direct Debit mandate with reference '%s' for partner '%s' has expired." +msgstr "El mandato de adeudo directo SEPA con referencia '%s' para la empresa '%s' ha expirado." + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:203 +#, python-format +msgid "The mandate with reference '%s' for partner '%s' has type set to 'One-Off' and it has a last debit date set to '%s', so we can't use it." +msgstr "El mandato con referencia '%s' para la empresa '%s' tipo como 'Único', ya tiene como fecha de último cobro '%s', por lo que no se puede usar." + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:86 +#, python-format +msgid "The recurrent mandate '%s' must have a sequence type." +msgstr "El mandato periódico '%s' debe tener un tipo de secuencia." + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:95 +#, python-format +msgid "The recurrent mandate '%s' which is not marked as 'Migrated to SEPA' must have its recurrent sequence type set to 'First'." +msgstr "El mandato periódico '%s', que no está marcado como 'Migrado a SEPA', debe establecer su tipo de secuencia a 'Inicial'." + +#. module: account_banking_sepa_direct_debit +#: help:account.banking.mandate,recurrent_sequence_type:0 +msgid "This field is only used for Recurrent mandates, not for One-Off mandates." +msgstr "Este campo se utiliza sólo para mandatos periódicos, no para únicos." + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd,total_amount:0 +#: field:banking.export.sdd.wizard,total_amount:0 +msgid "Total Amount" +msgstr "Importe total" + +#. module: account_banking_sepa_direct_debit +#: view:account.banking.mandate:account_banking_sepa_direct_debit.sdd_mandate_tree +msgid "Type" +msgstr "Tipo" + +#. module: account_banking_sepa_direct_debit +#: field:account.banking.mandate,type:0 +msgid "Type of Mandate" +msgstr "Tipo de mandato" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd.wizard:account_banking_sepa_direct_debit.banking_export_sdd_wizard_view +msgid "Validate" +msgstr "Validar" + +#. module: account_banking_sepa_direct_debit +#: help:account.banking.mandate,original_mandate_identification:0 +msgid "When the field 'Migrated to SEPA' is not active, this field will be used as the Original Mandate Identification in the Direct Debit file." +msgstr "Cuando el campo 'Migrado a SEPA' no está marcado, este campo se usa como identificación del mandato original en el archivo de adeudo directo." + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:105 +#, python-format +msgid "You must set the 'Original Mandate Identification' on the recurrent mandate '%s' which is not marked as 'Migrated to SEPA'." +msgstr "Debe establecer el campo 'Identificación de mandato original en el mandato periódico '%s', que no está marcado como 'Migrado a SEPA'." + From ff7688112f4d23a6c1202ccd3e06126ae8f9a549 Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Fri, 19 Dec 2014 23:59:02 +0100 Subject: [PATCH 045/118] Transfer move: one transfer move for each payment.order with only 1 line in the transfer account for the total of the account move. Move the inherit of the 'Invoice' button of payment.order from account_banking_payment_transfer to account_banking_payment_export Demo data: Add a bank account + mandate on Agrolait, to be able to easily test multi-partner SEPA DD --- .../demo/sepa_direct_debit_demo.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/account_banking_sepa_direct_debit/demo/sepa_direct_debit_demo.xml b/account_banking_sepa_direct_debit/demo/sepa_direct_debit_demo.xml index 041082d76..609824e68 100644 --- a/account_banking_sepa_direct_debit/demo/sepa_direct_debit_demo.xml +++ b/account_banking_sepa_direct_debit/demo/sepa_direct_debit_demo.xml @@ -23,5 +23,13 @@ valid
+ + + recurrent + first + + valid + + From 9a38b86a6cb5f1f655a4340151c8b310bd0dba9c Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Fri, 16 Jan 2015 01:05:26 +0100 Subject: [PATCH 046/118] mandates: search by reference, add group_by, add seq type in tree view --- .../views/account_banking_mandate_view.xml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/account_banking_sepa_direct_debit/views/account_banking_mandate_view.xml b/account_banking_sepa_direct_debit/views/account_banking_mandate_view.xml index a2065dc75..dac1fd5c8 100644 --- a/account_banking_sepa_direct_debit/views/account_banking_mandate_view.xml +++ b/account_banking_sepa_direct_debit/views/account_banking_mandate_view.xml @@ -35,6 +35,7 @@ + @@ -48,13 +49,19 @@ + + + + SEPA Direct Debit Mandates account.banking.mandate - form tree,form

From adb8abe7d4e5491c6c6c1343d27ba49be16976e1 Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Mon, 19 Jan 2015 17:15:36 +0100 Subject: [PATCH 047/118] Add scheme in mandate tree+search view Replace tabs by spaces in mandate views account_banking_mandate/views/account_banking_mandate_view.xml: convert from dos to unix format --- .../views/account_banking_mandate_view.xml | 210 +++++++++--------- 1 file changed, 107 insertions(+), 103 deletions(-) diff --git a/account_banking_sepa_direct_debit/views/account_banking_mandate_view.xml b/account_banking_sepa_direct_debit/views/account_banking_mandate_view.xml index dac1fd5c8..366edfaf8 100644 --- a/account_banking_sepa_direct_debit/views/account_banking_mandate_view.xml +++ b/account_banking_sepa_direct_debit/views/account_banking_mandate_view.xml @@ -5,121 +5,125 @@ The licence is in the file __openerp__.py --> - - sdd.mandate.form - account.banking.mandate - - - - - - - - - - - - - - - - - sdd.mandate.tree - account.banking.mandate - - - - - - - - - - sdd.mandate.search - account.banking.mandate - - - - - - - - - - - - + + sdd.mandate.form + account.banking.mandate + + + + + + + + + + + + + - - SEPA Direct Debit Mandates - account.banking.mandate - tree,form - -

- Click to create a new SEPA Direct Debit Mandate. -

- A SEPA Direct Debit Mandate is a document signed by your customer that gives you the autorization to do one or several direct debits on his bank account. -

-
-
+ + sdd.mandate.tree + account.banking.mandate + + + + + + + + + - + + sdd.mandate.search + account.banking.mandate + + + + + + + + + + + + + - - sdd.mandate.res.partner.bank.tree - res.partner.bank - - - - SDD Mandates - - - + + SEPA Direct Debit Mandates + account.banking.mandate + tree,form + +

+ Click to create a new SEPA Direct Debit Mandate. +

+ A SEPA Direct Debit Mandate is a document signed by your customer that gives you the autorization to do one or several direct debits on his bank account. +

+
+
- - sdd.mandate.partner.form - res.partner - - - - SDD Mandates - - - + - - Sequence Type set to First - account.banking.mandate - - Sequence Type set to First - + + sdd.mandate.res.partner.bank.tree + res.partner.bank + + + + SDD Mandates + + + - - Sequence Type set to Recurring - account.banking.mandate - - Sequence Type set to Recurring - + + sdd.mandate.partner.form + res.partner + + + + SDD Mandates + + + + + + Sequence Type set to First + account.banking.mandate + + Sequence Type set to First + + + + Sequence Type set to Recurring + account.banking.mandate + + Sequence Type set to Recurring + + + + Sequence Type set to Final + account.banking.mandate + + Sequence Type set to Final + - - Sequence Type set to Final - account.banking.mandate - - Sequence Type set to Final - From d94c26b6969f1efa9a4946d388e51b65ed536b74 Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Mon, 19 Jan 2015 22:52:38 +0100 Subject: [PATCH 048/118] Add sale_ok and purchase_ok filters in partner/sale/purchase form views Use widget=selection for payment_mode_id fields Update demo data --- .../demo/sepa_direct_debit_demo.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/account_banking_sepa_direct_debit/demo/sepa_direct_debit_demo.xml b/account_banking_sepa_direct_debit/demo/sepa_direct_debit_demo.xml index 609824e68..51a24bad1 100644 --- a/account_banking_sepa_direct_debit/demo/sepa_direct_debit_demo.xml +++ b/account_banking_sepa_direct_debit/demo/sepa_direct_debit_demo.xml @@ -9,6 +9,7 @@ + From bc565493c89b950cbd086ae0aa02223dd461b3a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Bidoul?= Date: Fri, 27 Feb 2015 15:47:35 +0100 Subject: [PATCH 049/118] flake8 W503 --- .../models/account_banking_mandate.py | 19 ++++++++++--------- .../wizard/export_sdd.py | 4 ++-- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/account_banking_sepa_direct_debit/models/account_banking_mandate.py b/account_banking_sepa_direct_debit/models/account_banking_mandate.py index 4df706378..170866798 100644 --- a/account_banking_sepa_direct_debit/models/account_banking_mandate.py +++ b/account_banking_sepa_direct_debit/models/account_banking_mandate.py @@ -80,8 +80,8 @@ class AccountBankingMandate(models.Model): @api.one @api.constrains('type', 'recurrent_sequence_type') def _check_recurring_type(self): - if (self.type == 'recurrent' - and not self.recurrent_sequence_type): + if (self.type == 'recurrent' and + not self.recurrent_sequence_type): raise exceptions.Warning( _("The recurrent mandate '%s' must have a sequence type.") % self.unique_mandate_reference) @@ -89,8 +89,8 @@ class AccountBankingMandate(models.Model): @api.one @api.constrains('type', 'recurrent_sequence_type', 'sepa_migrated') def _check_migrated_to_sepa(self): - if (self.type == 'recurrent' and not self.sepa_migrated - and self.recurrent_sequence_type != 'first'): + if (self.type == 'recurrent' and not self.sepa_migrated and + self.recurrent_sequence_type != 'first'): raise exceptions.Warning( _("The recurrent mandate '%s' which is not marked as " "'Migrated to SEPA' must have its recurrent sequence type " @@ -99,8 +99,8 @@ class AccountBankingMandate(models.Model): @api.one @api.constrains('type', 'original_mandate_identification', 'sepa_migrated') def _check_original_mandate_identification(self): - if (self.type == 'recurrent' and not self.sepa_migrated - and not self.original_mandate_identification): + if (self.type == 'recurrent' and not self.sepa_migrated and + not self.original_mandate_identification): raise exceptions.Warning( _("You must set the 'Original Mandate Identification' on the " "recurrent mandate '%s' which is not marked as 'Migrated to " @@ -111,9 +111,10 @@ class AccountBankingMandate(models.Model): def mandate_partner_bank_change(self): super(AccountBankingMandate, self).mandate_partner_bank_change() res = {} - if (self.state == 'valid' and self.partner_bank_id - and self.type == 'recurrent' - and self.recurrent_sequence_type != 'first'): + if (self.state == 'valid' and + self.partner_bank_id and + self.type == 'recurrent' and + self.recurrent_sequence_type != 'first'): self.recurrent_sequence_type = 'first' res['warning'] = { 'title': _('Mandate update'), diff --git a/account_banking_sepa_direct_debit/wizard/export_sdd.py b/account_banking_sepa_direct_debit/wizard/export_sdd.py index aa46ff8b1..2fffdda65 100644 --- a/account_banking_sepa_direct_debit/wizard/export_sdd.py +++ b/account_banking_sepa_direct_debit/wizard/export_sdd.py @@ -103,8 +103,8 @@ class BankingExportSddWizard(orm.TransientModel): previous_payline_id = False for older_line in older_lines: older_line_date_sent = older_line.order_id.date_sent - if (older_line_date_sent - and older_line_date_sent > previous_date): + if (older_line_date_sent and + older_line_date_sent > previous_date): previous_date = older_line_date_sent previous_payline_id = older_line.id if previous_payline_id: From 17e74ef7d66cb7b13a795675af004918ce1c0110 Mon Sep 17 00:00:00 2001 From: Alexandre Fayolle Date: Mon, 2 Mar 2015 17:23:15 +0100 Subject: [PATCH 050/118] Add OCA as author of OCA addons In order to get visibility on https://www.odoo.com/apps the OCA board has decided to add the OCA as author of all the addons maintained as part of the association. --- account_banking_sepa_direct_debit/__openerp__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/account_banking_sepa_direct_debit/__openerp__.py b/account_banking_sepa_direct_debit/__openerp__.py index 160e52605..db4e77a91 100644 --- a/account_banking_sepa_direct_debit/__openerp__.py +++ b/account_banking_sepa_direct_debit/__openerp__.py @@ -24,7 +24,7 @@ 'summary': 'Create SEPA files for Direct Debit', 'version': '0.1', 'license': 'AGPL-3', - 'author': 'Akretion', + 'author': "Akretion,Odoo Community Association (OCA)", 'website': 'http://www.akretion.com', 'contributors': ['Pedro M. Baeza '], 'category': 'Banking addons', From e314467222f728fdbfaa596d05ece03a9de02801 Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Wed, 11 Mar 2015 11:57:54 +0100 Subject: [PATCH 051/118] Limit lenght of mandate reference, according to ISO 20022 --- .../models/account_banking_mandate.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/account_banking_sepa_direct_debit/models/account_banking_mandate.py b/account_banking_sepa_direct_debit/models/account_banking_mandate.py index 170866798..56b4c870d 100644 --- a/account_banking_sepa_direct_debit/models/account_banking_mandate.py +++ b/account_banking_sepa_direct_debit/models/account_banking_mandate.py @@ -70,12 +70,14 @@ class AccountBankingMandate(models.Model): "active.", default=True) original_mandate_identification = fields.Char( string='Original Mandate Identification', track_visibility='onchange', + size=35, help="When the field 'Migrated to SEPA' is not active, this field " "will be used as the Original Mandate Identification in the " "Direct Debit file.") scheme = fields.Selection([('CORE', 'Basic (CORE)'), ('B2B', 'Enterprise (B2B)')], string='Scheme', required=True, default="CORE") + unique_mandate_reference = fields.Char(size=35) # cf ISO 20022 @api.one @api.constrains('type', 'recurrent_sequence_type') From d41e641403f5efefcc74b85a7365846c23b03fa8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Bidoul?= Date: Thu, 22 Jan 2015 17:24:23 +0100 Subject: [PATCH 052/118] sepa direct debit: get BIC from bank account if not available on bank --- .../wizard/export_sdd.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/account_banking_sepa_direct_debit/wizard/export_sdd.py b/account_banking_sepa_direct_debit/wizard/export_sdd.py index 2fffdda65..948fa68be 100644 --- a/account_banking_sepa_direct_debit/wizard/export_sdd.py +++ b/account_banking_sepa_direct_debit/wizard/export_sdd.py @@ -249,7 +249,8 @@ class BankingExportSddWizard(orm.TransientModel): 'sepa_export.payment_order_ids[0].mode.bank_id.partner_id.' 'name', 'sepa_export.payment_order_ids[0].mode.bank_id.acc_number', - 'sepa_export.payment_order_ids[0].mode.bank_id.bank.bic', + 'sepa_export.payment_order_ids[0].mode.bank_id.bank.bic or ' + 'sepa_export.payment_order_ids[0].mode.bank_id.bank_bic', {'sepa_export': sepa_export}, gen_args, context=context) charge_bearer_2_24 = etree.SubElement(payment_info_2_0, 'ChrgBr') @@ -316,7 +317,10 @@ class BankingExportSddWizard(orm.TransientModel): amendment_info_details_2_51 = etree.SubElement( mandate_related_info_2_47, 'AmdmntInfDtls') if previous_bank: - if previous_bank.bank.bic == line.bank_id.bank.bic: + if (previous_bank.bank.bic or + previous_bank.bank_bic) == \ + (line.bank_id.bank.bic or + line.bank_id.bank_bic): ori_debtor_account_2_57 = etree.SubElement( amendment_info_details_2_51, 'OrgnlDbtrAcct') ori_debtor_account_id = etree.SubElement( @@ -340,7 +344,8 @@ class BankingExportSddWizard(orm.TransientModel): ori_debtor_agent_institution, bic_xml_tag) ori_debtor_agent_bic.text = self._prepare_field( cr, uid, 'Original Debtor Agent', - 'previous_bank.bank.bic', + 'previous_bank.bank.bic or ' + 'previous_bank.bank_bic', {'previous_bank': previous_bank}, gen_args=gen_args, context=context) @@ -375,7 +380,8 @@ class BankingExportSddWizard(orm.TransientModel): cr, uid, dd_transaction_info_2_28, 'Dbtr', 'C', 'line.partner_id.name', 'line.bank_id.acc_number', - 'line.bank_id.bank.bic', + 'line.bank_id.bank.bic or ' + 'line.bank_id.bank_bic', {'line': line}, gen_args, context=context) self.generate_remittance_info_block( From c09e5c936c5d4abdcb44e9b53c80c74fbcbb9cfa Mon Sep 17 00:00:00 2001 From: Alexandre Fayolle Date: Wed, 25 Mar 2015 09:11:12 +0100 Subject: [PATCH 053/118] protect import of external dependencies Odoo won't install an addon if the external dependencies are not met. However, the python modules of the addons are imported at startup, and the lack of an external dependency for an external addon will cause a crash, therefore the import needs to be in a try..except block. --- .../models/banking_export_sdd.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/account_banking_sepa_direct_debit/models/banking_export_sdd.py b/account_banking_sepa_direct_debit/models/banking_export_sdd.py index c80cebf6e..84ac0b5e7 100644 --- a/account_banking_sepa_direct_debit/models/banking_export_sdd.py +++ b/account_banking_sepa_direct_debit/models/banking_export_sdd.py @@ -22,7 +22,11 @@ from openerp import models, fields, api from openerp.addons.decimal_precision import decimal_precision as dp -from unidecode import unidecode + +try: + from unidecode import unidecode +except ImportError: + unidecode = None class BankingExportSdd(models.Model): From 27fc16106bec923b2e131fc64e913deac05f99aa Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Mon, 25 May 2015 17:14:05 +0200 Subject: [PATCH 054/118] Expand authors + manifest cleaning --- account_banking_sepa_direct_debit/__openerp__.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/account_banking_sepa_direct_debit/__openerp__.py b/account_banking_sepa_direct_debit/__openerp__.py index db4e77a91..1e5afb367 100644 --- a/account_banking_sepa_direct_debit/__openerp__.py +++ b/account_banking_sepa_direct_debit/__openerp__.py @@ -24,9 +24,10 @@ 'summary': 'Create SEPA files for Direct Debit', 'version': '0.1', 'license': 'AGPL-3', - 'author': "Akretion,Odoo Community Association (OCA)", - 'website': 'http://www.akretion.com', - 'contributors': ['Pedro M. Baeza '], + 'author': "Akretion, " + "Serv. Tecnol. Avanzados - Pedro M. Baeza, " + "Odoo Community Association (OCA)", + 'website': 'https://github.com/OCA/bank-payment', 'category': 'Banking addons', 'depends': [ 'account_direct_debit', From b6af1f29ff3010d7947c5163a1f4324f5cb3a9f3 Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Thu, 29 Jan 2015 16:30:02 +0100 Subject: [PATCH 055/118] Use attachments instead of creating a specific object for each kind of payment order --- .../__openerp__.py | 9 +- .../models/__init__.py | 1 - .../models/banking_export_sdd.py | 84 ------------------- .../security/ir.model.access.csv | 2 - .../views/account_banking_sdd_view.xml | 77 ----------------- .../wizard/export_sdd.py | 50 ++++------- .../wizard/export_sdd_view.xml | 5 +- 7 files changed, 22 insertions(+), 206 deletions(-) delete mode 100644 account_banking_sepa_direct_debit/models/banking_export_sdd.py delete mode 100644 account_banking_sepa_direct_debit/security/ir.model.access.csv delete mode 100644 account_banking_sepa_direct_debit/views/account_banking_sdd_view.xml diff --git a/account_banking_sepa_direct_debit/__openerp__.py b/account_banking_sepa_direct_debit/__openerp__.py index 1e5afb367..e57209eff 100644 --- a/account_banking_sepa_direct_debit/__openerp__.py +++ b/account_banking_sepa_direct_debit/__openerp__.py @@ -1,8 +1,8 @@ # -*- encoding: utf-8 -*- ############################################################################## # -# SEPA Direct Debit module for OpenERP -# Copyright (C) 2013 Akretion (http://www.akretion.com) +# SEPA Direct Debit module for Odoo +# Copyright (C) 2013-2015 Akretion (http://www.akretion.com) # @author: Alexis de Lattre # # This program is free software: you can redistribute it and/or modify @@ -34,18 +34,13 @@ 'account_banking_pain_base', 'account_banking_mandate', ], - 'external_dependencies': { - 'python': ['unidecode', 'lxml'], - }, 'data': [ - 'views/account_banking_sdd_view.xml', 'views/account_banking_mandate_view.xml', 'views/res_company_view.xml', 'wizard/export_sdd_view.xml', 'data/mandate_expire_cron.xml', 'data/payment_type_sdd.xml', 'security/original_mandate_required_security.xml', - 'security/ir.model.access.csv', ], 'demo': ['demo/sepa_direct_debit_demo.xml'], 'description': ''' diff --git a/account_banking_sepa_direct_debit/models/__init__.py b/account_banking_sepa_direct_debit/models/__init__.py index 274855e14..153ab3543 100644 --- a/account_banking_sepa_direct_debit/models/__init__.py +++ b/account_banking_sepa_direct_debit/models/__init__.py @@ -20,6 +20,5 @@ # ############################################################################## -from . import banking_export_sdd from . import res_company from . import account_banking_mandate diff --git a/account_banking_sepa_direct_debit/models/banking_export_sdd.py b/account_banking_sepa_direct_debit/models/banking_export_sdd.py deleted file mode 100644 index 84ac0b5e7..000000000 --- a/account_banking_sepa_direct_debit/models/banking_export_sdd.py +++ /dev/null @@ -1,84 +0,0 @@ -# -*- encoding: utf-8 -*- -############################################################################## -# -# SEPA Direct Debit module for OpenERP -# Copyright (C) 2013 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 . -# -############################################################################## - -from openerp import models, fields, api -from openerp.addons.decimal_precision import decimal_precision as dp - -try: - from unidecode import unidecode -except ImportError: - unidecode = None - - -class BankingExportSdd(models.Model): - """SEPA Direct Debit export""" - _name = 'banking.export.sdd' - _description = __doc__ - _rec_name = 'filename' - - @api.one - @api.depends('payment_order_ids', 'payment_order_ids.reference') - def _generate_filename(self): - if self.payment_order_ids: - ref = self.payment_order_ids[0].reference - label = unidecode(ref.replace('/', '-')) if ref else 'error' - filename = 'sdd_%s.xml' % label - else: - filename = 'sdd.xml' - self.filename = filename - - payment_order_ids = fields.Many2many( - comodel_name='payment.order', - relation='account_payment_order_sdd_rel', - column1='banking_export_sepa_id', column2='account_order_id', - string='Payment Orders', - readonly=True) - nb_transactions = fields.Integer( - string='Number of Transactions', readonly=True) - total_amount = fields.Float( - string='Total Amount', digits_compute=dp.get_precision('Account'), - readonly=True) - batch_booking = fields.Boolean( - 'Batch Booking', readonly=True, - help="If true, the bank statement will display only one credit line " - "for all the direct debits of the SEPA file ; if false, the bank " - "statement will display one credit line per direct debit of the " - "SEPA file.") - charge_bearer = fields.Selection( - [('SLEV', 'Following Service Level'), - ('SHAR', 'Shared'), - ('CRED', 'Borne by Creditor'), - ('DEBT', 'Borne by Debtor')], 'Charge Bearer', readonly=True, - help="Following service level : transaction charges are to be applied " - "following the rules agreed in the service level and/or scheme " - "(SEPA Core messages must use this). Shared : transaction " - "charges on the creditor side are to be borne by the creditor, " - "transaction charges on the debtor side are to be borne by the " - "debtor. Borne by creditor : all transaction charges are to be " - "borne by the creditor. Borne by debtor : all transaction " - "charges are to be borne by the debtor.") - create_date = fields.Datetime(string='Generation Date', readonly=True) - file = fields.Binary(string='SEPA File', readonly=True) - filename = fields.Char(compute=_generate_filename, size=256, - string='Filename', readonly=True, store=True) - state = fields.Selection([('draft', 'Draft'), ('sent', 'Sent')], - string='State', readonly=True, default='draft') diff --git a/account_banking_sepa_direct_debit/security/ir.model.access.csv b/account_banking_sepa_direct_debit/security/ir.model.access.csv deleted file mode 100644 index 0cd579511..000000000 --- a/account_banking_sepa_direct_debit/security/ir.model.access.csv +++ /dev/null @@ -1,2 +0,0 @@ -"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" -"access_banking_export_sdd","Full access on banking.export.sdd","model_banking_export_sdd","account_payment.group_account_payment",1,1,1,1 diff --git a/account_banking_sepa_direct_debit/views/account_banking_sdd_view.xml b/account_banking_sepa_direct_debit/views/account_banking_sdd_view.xml deleted file mode 100644 index f74b60353..000000000 --- a/account_banking_sepa_direct_debit/views/account_banking_sdd_view.xml +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - account.banking.export.sdd.form - banking.export.sdd - -
-
- -
- - - - - - - - - - - - - - - - -
-
-
- - - - account.banking.export.sdd.tree - banking.export.sdd - - - - - - - - - - - - - SEPA Direct Debit Files - banking.export.sdd - form - tree,form - - - - - - - -
-
diff --git a/account_banking_sepa_direct_debit/wizard/export_sdd.py b/account_banking_sepa_direct_debit/wizard/export_sdd.py index 948fa68be..9fc1e2876 100644 --- a/account_banking_sepa_direct_debit/wizard/export_sdd.py +++ b/account_banking_sepa_direct_debit/wizard/export_sdd.py @@ -1,8 +1,8 @@ # -*- encoding: utf-8 -*- ############################################################################## # -# SEPA Direct Debit module for OpenERP -# Copyright (C) 2013 Akretion (http://www.akretion.com) +# SEPA Direct Debit module for Odoo +# Copyright (C) 2013-2015 Akretion (http://www.akretion.com) # @author: Alexis de Lattre # # This program is free software: you can redistribute it and/or modify @@ -24,7 +24,6 @@ from openerp.osv import orm, fields from openerp.tools.translate import _ from openerp import workflow -from datetime import datetime from lxml import etree @@ -56,19 +55,14 @@ class BankingExportSddWizard(orm.TransientModel): "transaction charges are to be borne by the creditor. Borne " "by debtor : all transaction charges are to be borne by the " "debtor."), - 'nb_transactions': fields.related( - 'file_id', 'nb_transactions', type='integer', + 'nb_transactions': fields.integer( string='Number of Transactions', readonly=True), - 'total_amount': fields.related( - 'file_id', 'total_amount', type='float', string='Total Amount', - readonly=True), - 'file_id': fields.many2one( - 'banking.export.sdd', 'SDD File', readonly=True), - 'file': fields.related( - 'file_id', 'file', string="File", type='binary', readonly=True), - 'filename': fields.related( - 'file_id', 'filename', string="Filename", type='char', size=256, - readonly=True), + 'total_amount': fields.float( + string='Total Amount', readonly=True), + 'file': fields.binary( + string="File", readonly=True), + 'filename': fields.char( + string="Filename", readonly=True), 'payment_order_ids': fields.many2many( 'payment.order', 'wiz_sdd_payorders_rel', 'wizard_id', 'payment_order_id', 'Payment Orders', readonly=True), @@ -144,9 +138,9 @@ class BankingExportSddWizard(orm.TransientModel): 'name_maxsize': name_maxsize, 'convert_to_ascii': convert_to_ascii, 'payment_method': 'DD', + 'file_prefix': 'sdd_', 'pain_flavor': pain_flavor, 'sepa_export': sepa_export, - 'file_obj': self.pool['banking.export.sdd'], 'pain_xsd_file': 'account_banking_sepa_direct_debit/data/%s.xsd' % pain_flavor, } @@ -397,29 +391,21 @@ class BankingExportSddWizard(orm.TransientModel): cr, uid, ids, xml_root, total_amount, transactions_count_1_6, gen_args, context=context) - def cancel_sepa(self, cr, uid, ids, context=None): - """Cancel the SEPA file: just drop the file""" - sepa_export = self.browse(cr, uid, ids[0], context=context) - self.pool.get('banking.export.sdd').unlink( - cr, uid, sepa_export.file_id.id, context=context) - return {'type': 'ir.actions.act_window_close'} - def save_sepa(self, cr, uid, ids, context=None): """Save the SEPA Direct Debit file: mark all payments in the file as 'sent'. Write 'last debit date' on mandate and set oneoff mandate to expired. """ sepa_export = self.browse(cr, uid, ids[0], context=context) - self.pool.get('banking.export.sdd').write( - cr, uid, sepa_export.file_id.id, {'state': 'sent'}, - context=context) for order in sepa_export.payment_order_ids: workflow.trg_validate(uid, 'payment.order', order.id, 'done', cr) - mandate_ids = [line.mandate_id.id for line in order.line_ids] - self.pool['account.banking.mandate'].write( - cr, uid, mandate_ids, - {'last_debit_date': datetime.today().strftime('%Y-%m-%d')}, - context=context) + self.pool['ir.attachment'].create( + cr, uid, { + 'res_model': 'payment.order', + 'res_id': order.id, + 'name': sepa_export.filename, + 'datas': sepa_export.file, + }, context=context) to_expire_ids = [] first_mandate_ids = [] for line in order.line_ids: @@ -438,4 +424,4 @@ class BankingExportSddWizard(orm.TransientModel): 'recurrent_sequence_type': 'recurring', 'sepa_migrated': True, }, context=context) - return {'type': 'ir.actions.act_window_close'} + return True diff --git a/account_banking_sepa_direct_debit/wizard/export_sdd_view.xml b/account_banking_sepa_direct_debit/wizard/export_sdd_view.xml index 3699de91c..95117e270 100644 --- a/account_banking_sepa_direct_debit/wizard/export_sdd_view.xml +++ b/account_banking_sepa_direct_debit/wizard/export_sdd_view.xml @@ -11,7 +11,7 @@ banking.export.sdd.wizard.view banking.export.sdd.wizard -
+ @@ -25,9 +25,8 @@
From 3d9457d862e1721dee836dd2068742d649147b64 Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Mon, 1 Jun 2015 20:58:21 +0200 Subject: [PATCH 056/118] Add migration scripts to move files to attachments --- .../__openerp__.py | 2 +- .../migrations/8.0.0.2/post-migration.py | 50 +++++++++++++++++++ .../migrations/8.0.0.2/pre-migration.py | 32 ++++++++++++ 3 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 account_banking_sepa_direct_debit/migrations/8.0.0.2/post-migration.py create mode 100644 account_banking_sepa_direct_debit/migrations/8.0.0.2/pre-migration.py diff --git a/account_banking_sepa_direct_debit/__openerp__.py b/account_banking_sepa_direct_debit/__openerp__.py index e57209eff..bf622c44c 100644 --- a/account_banking_sepa_direct_debit/__openerp__.py +++ b/account_banking_sepa_direct_debit/__openerp__.py @@ -22,7 +22,7 @@ { 'name': 'Account Banking SEPA Direct Debit', 'summary': 'Create SEPA files for Direct Debit', - 'version': '0.1', + 'version': '0.2', 'license': 'AGPL-3', 'author': "Akretion, " "Serv. Tecnol. Avanzados - Pedro M. Baeza, " diff --git a/account_banking_sepa_direct_debit/migrations/8.0.0.2/post-migration.py b/account_banking_sepa_direct_debit/migrations/8.0.0.2/post-migration.py new file mode 100644 index 000000000..dd759cac6 --- /dev/null +++ b/account_banking_sepa_direct_debit/migrations/8.0.0.2/post-migration.py @@ -0,0 +1,50 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Copyright (C) 2015 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 . +# +############################################################################## + +from openerp import pooler, SUPERUSER_ID + + +def migrate(cr, version): + if not version: + return + + pool = pooler.get_pool(cr.dbname) + cr.execute(''' + SELECT + old_sepa.file, + rel.account_order_id AS payment_order_id, + payment_order.reference + FROM migration_banking_export_sdd old_sepa + LEFT JOIN migration_account_payment_order_sdd_rel rel + ON old_sepa.id=rel.banking_export_sepa_id + LEFT JOIN payment_order ON payment_order.id=rel.account_order_id + ''') + + for sepa_file in cr.dictfetchall(): + filename = 'sdd_%s.xml' % sepa_file['reference'].replace('/', '-') + pool['ir.attachment'].create( + cr, SUPERUSER_ID, { + 'name': filename, + 'res_id': sepa_file['payment_order_id'], + 'res_model': 'payment.order', + 'datas': str(sepa_file['file']), + }) + return diff --git a/account_banking_sepa_direct_debit/migrations/8.0.0.2/pre-migration.py b/account_banking_sepa_direct_debit/migrations/8.0.0.2/pre-migration.py new file mode 100644 index 000000000..42fa23b0a --- /dev/null +++ b/account_banking_sepa_direct_debit/migrations/8.0.0.2/pre-migration.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Copyright (C) 2015 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( + 'ALTER TABLE banking_export_sdd ' + 'RENAME TO migration_banking_export_sdd') + cr.execute( + 'ALTER TABLE account_payment_order_sdd_rel ' + 'RENAME TO migration_account_payment_order_sdd_rel') From 8f0164d9889ab1e17cb42e6f78efca9ec20eada9 Mon Sep 17 00:00:00 2001 From: Philippe Schmidt Date: Mon, 1 Jun 2015 17:10:58 +0200 Subject: [PATCH 057/118] Add requested descriptions in an OCA README.rst file --- account_banking_sepa_direct_debit/README.rst | 87 +++++++++++++++++++ .../__openerp__.py | 14 --- 2 files changed, 87 insertions(+), 14 deletions(-) create mode 100644 account_banking_sepa_direct_debit/README.rst diff --git a/account_banking_sepa_direct_debit/README.rst b/account_banking_sepa_direct_debit/README.rst new file mode 100644 index 000000000..33e4b4a55 --- /dev/null +++ b/account_banking_sepa_direct_debit/README.rst @@ -0,0 +1,87 @@ +.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg + :alt: License: AGPL-3 + +Account Banking SEPA Direct Debit +================================= + +Create SEPA files for Direct Debit + +Module to export direct debit payment orders in SEPA XML file format. + +SEPA PAIN (PAyment INitiation) is the new european standard for +Customer-to-Bank payment instructions. This module implements SEPA Direct +Debit (SDD), more specifically PAIN versions 008.001.02, 008.001.03 and +008.001.04. It is part of the ISO 20022 standard, available on +http://www.iso20022.org. + +The Implementation Guidelines for SEPA Direct Debit published by the European +Payments Council (http://http://www.europeanpaymentscouncil.eu) use PAIN +version 008.001.02. So if you don't know which version your bank supports, you +should try version 008.001.02 first. + +Installation +============ + +This module depends on : +* account_direct_debit +* account_banking_pain_base', +* account_banking_mandate + +This modules are parts of the OCA/bank-payment suite. + +Configuration +============= + +To configure this module, you need to: + + * Create a payment mode and select an export type related to debit order ( eg. "SEPA direct debit ...") + +Usage +===== + +To use this module, you must select this payment mode on a direct debit order (Menu :Accounting > Payment > Direct Debit orders) + +For further information, please visit: + + * https://www.odoo.com/forum/help-1 + +Known issues / Roadmap +====================== + + * ... + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed feedback +`here `_. + +Credits +======= + +Contributors +------------ + +* Firsname Lastname +* Alexis de Lattre +* Pedro M. Baeza +* Stéphane Bidoul +* Alexandre Fayolle +* Raphaël Valyi +* Sandy Carter + + +Maintainer +---------- + +.. image:: http://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: http://odoo-community.org + +This module is maintained by the OCA. + +OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. + +To contribute to this module, please visit http://odoo-community.org. diff --git a/account_banking_sepa_direct_debit/__openerp__.py b/account_banking_sepa_direct_debit/__openerp__.py index bf622c44c..f0288fd4c 100644 --- a/account_banking_sepa_direct_debit/__openerp__.py +++ b/account_banking_sepa_direct_debit/__openerp__.py @@ -43,19 +43,5 @@ 'security/original_mandate_required_security.xml', ], 'demo': ['demo/sepa_direct_debit_demo.xml'], - 'description': ''' -Module to export direct debit payment orders in SEPA XML file format. - -SEPA PAIN (PAyment INitiation) is the new european standard for -Customer-to-Bank payment instructions. This module implements SEPA Direct -Debit (SDD), more specifically PAIN versions 008.001.02, 008.001.03 and -008.001.04. It is part of the ISO 20022 standard, available on -http://www.iso20022.org. - -The Implementation Guidelines for SEPA Direct Debit published by the European -Payments Council (http://http://www.europeanpaymentscouncil.eu) use PAIN -version 008.001.02. So if you don't know which version your bank supports, you -should try version 008.001.02 first. - ''', 'installable': True, } From 56e2b7080f1c9005be33181156c27cb33d08232e Mon Sep 17 00:00:00 2001 From: Philippe Schmidt Date: Fri, 5 Jun 2015 12:31:00 +0200 Subject: [PATCH 058/118] some typo corrections --- account_banking_sepa_direct_debit/README.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/account_banking_sepa_direct_debit/README.rst b/account_banking_sepa_direct_debit/README.rst index 33e4b4a55..ace5ce806 100644 --- a/account_banking_sepa_direct_debit/README.rst +++ b/account_banking_sepa_direct_debit/README.rst @@ -27,7 +27,7 @@ This module depends on : * account_banking_pain_base', * account_banking_mandate -This modules are parts of the OCA/bank-payment suite. +This module is part of the OCA/bank-payment suite. Configuration ============= @@ -48,7 +48,7 @@ For further information, please visit: Known issues / Roadmap ====================== - * ... + * No known issues Bug Tracker =========== From de3584d93fce47753fe0f86e7e73f81e8e74ad80 Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Sat, 6 Jun 2015 00:20:41 +0200 Subject: [PATCH 059/118] Port SEPA modules to new API Fix an important regression in account_banking_sepa_direct_debit: "Date of Last Debit" was not set any more Proper write of date_done with account_banking_payment_export is installed without account_banking_payment_transfer Add post-install script for date_sent on payment.order --- .../wizard/export_sdd.py | 295 ++++++++---------- 1 file changed, 131 insertions(+), 164 deletions(-) diff --git a/account_banking_sepa_direct_debit/wizard/export_sdd.py b/account_banking_sepa_direct_debit/wizard/export_sdd.py index 9fc1e2876..2c0d93d57 100644 --- a/account_banking_sepa_direct_debit/wizard/export_sdd.py +++ b/account_banking_sepa_direct_debit/wizard/export_sdd.py @@ -21,99 +21,85 @@ ############################################################################## -from openerp.osv import orm, fields -from openerp.tools.translate import _ +from openerp import models, fields, api, _ +from openerp.exceptions import Warning from openerp import workflow from lxml import etree -class BankingExportSddWizard(orm.TransientModel): +class BankingExportSddWizard(models.TransientModel): _name = 'banking.export.sdd.wizard' _inherit = ['banking.export.pain'] _description = 'Export SEPA Direct Debit File' - _columns = { - 'state': fields.selection( - [('create', 'Create'), - ('finish', 'Finish')], 'State', readonly=True), - 'batch_booking': fields.boolean( - 'Batch Booking', - help="If true, the bank statement will display only one credit " - "line for all the direct debits of the SEPA file ; if false, " - "the bank statement will display one credit line per direct " - "debit of the SEPA file."), - 'charge_bearer': fields.selection( - [('SLEV', 'Following Service Level'), - ('SHAR', 'Shared'), - ('CRED', 'Borne by Creditor'), - ('DEBT', 'Borne by Debtor')], 'Charge Bearer', required=True, - help="Following service level : transaction charges are to be " - "applied following the rules agreed in the service level " - "and/or scheme (SEPA Core messages must use this). Shared : " - "transaction charges on the creditor side are to be borne " - "by the creditor, transaction charges on the debtor side are " - "to be borne by the debtor. Borne by creditor : all " - "transaction charges are to be borne by the creditor. Borne " - "by debtor : all transaction charges are to be borne by the " - "debtor."), - 'nb_transactions': fields.integer( - string='Number of Transactions', readonly=True), - 'total_amount': fields.float( - string='Total Amount', readonly=True), - 'file': fields.binary( - string="File", readonly=True), - 'filename': fields.char( - string="Filename", readonly=True), - 'payment_order_ids': fields.many2many( - 'payment.order', 'wiz_sdd_payorders_rel', 'wizard_id', - 'payment_order_id', 'Payment Orders', readonly=True), - } - _defaults = { - 'charge_bearer': 'SLEV', - 'state': 'create', - } + state = fields.Selection([ + ('create', 'Create'), + ('finish', 'Finish'), + ], string='State', readonly=True, default='create') + batch_booking = fields.Boolean( + string='Batch Booking', + help="If true, the bank statement will display only one credit " + "line for all the direct debits of the SEPA file ; if false, " + "the bank statement will display one credit line per direct " + "debit of the SEPA file.") + charge_bearer = fields.Selection([ + ('SLEV', 'Following Service Level'), + ('SHAR', 'Shared'), + ('CRED', 'Borne by Creditor'), + ('DEBT', 'Borne by Debtor'), + ], string='Charge Bearer', required=True, default='SLEV', + help="Following service level : transaction charges are to be " + "applied following the rules agreed in the service level " + "and/or scheme (SEPA Core messages must use this). Shared : " + "transaction charges on the creditor side are to be borne " + "by the creditor, transaction charges on the debtor side are " + "to be borne by the debtor. Borne by creditor : all " + "transaction charges are to be borne by the creditor. Borne " + "by debtor : all transaction charges are to be borne by the debtor.") + nb_transactions = fields.Integer( + string='Number of Transactions', readonly=True) + total_amount = fields.Float(string='Total Amount', readonly=True) + file = fields.Binary(string="File", readonly=True) + filename = fields.Char(string="Filename", readonly=True) + payment_order_ids = fields.Many2many( + 'payment.order', 'wiz_sdd_payorders_rel', 'wizard_id', + 'payment_order_id', string='Payment Orders', readonly=True) - def create(self, cr, uid, vals, context=None): - payment_order_ids = context.get('active_ids', []) + @api.model + def create(self, vals): + payment_order_ids = self._context.get('active_ids', []) vals.update({ 'payment_order_ids': [[6, 0, payment_order_ids]], }) - return super(BankingExportSddWizard, self).create( - cr, uid, vals, context=context) + return super(BankingExportSddWizard, self).create(vals) - def _get_previous_bank(self, cr, uid, payline, context=None): - payline_obj = self.pool['payment.line'] + def _get_previous_bank(self, payline): previous_bank = False - payline_ids = payline_obj.search( - cr, uid, [ - ('mandate_id', '=', payline.mandate_id.id), - ('bank_id', '!=', payline.bank_id.id), - ], - context=context) - if payline_ids: - older_lines = payline_obj.browse( - cr, uid, payline_ids, context=context) + older_lines = self.env['payment.line'].search([ + ('mandate_id', '=', payline.mandate_id.id), + ('bank_id', '!=', payline.bank_id.id)]) + if older_lines: previous_date = False - previous_payline_id = False + previous_payline = False for older_line in older_lines: - older_line_date_sent = older_line.order_id.date_sent - if (older_line_date_sent and - older_line_date_sent > previous_date): - previous_date = older_line_date_sent - previous_payline_id = older_line.id - if previous_payline_id: - previous_payline = payline_obj.browse( - cr, uid, previous_payline_id, context=context) + if hasattr(older_line.order_id, 'date_sent'): + older_line_date = older_line.order_id.date_sent + else: + older_line_date = older_line.order_id.date_done + if (older_line_date and + older_line_date > previous_date): + previous_date = older_line_date + previous_payline = older_line + if previous_payline: previous_bank = previous_payline.bank_id return previous_bank - def create_sepa(self, cr, uid, ids, context=None): + @api.multi + def create_sepa(self): """Creates the SEPA Direct Debit file. That's the important code !""" - sepa_export = self.browse(cr, uid, ids[0], context=context) - - pain_flavor = sepa_export.payment_order_ids[0].mode.type.code + pain_flavor = self.payment_order_ids[0].mode.type.code convert_to_ascii = \ - sepa_export.payment_order_ids[0].mode.convert_to_ascii + self.payment_order_ids[0].mode.convert_to_ascii if pain_flavor == 'pain.008.001.02': bic_xml_tag = 'BIC' name_maxsize = 70 @@ -127,8 +113,7 @@ class BankingExportSddWizard(orm.TransientModel): name_maxsize = 140 root_xml_tag = 'CstmrDrctDbtInitn' else: - raise orm.except_orm( - _('Error:'), + raise Warning( _("Payment Type Code '%s' is not supported. The only " "Payment Type Code supported for SEPA Direct Debit are " "'pain.008.001.02', 'pain.008.001.03' and " @@ -140,7 +125,6 @@ class BankingExportSddWizard(orm.TransientModel): 'payment_method': 'DD', 'file_prefix': 'sdd_', 'pain_flavor': pain_flavor, - 'sepa_export': sepa_export, 'pain_xsd_file': 'account_banking_sepa_direct_debit/data/%s.xsd' % pain_flavor, } @@ -152,8 +136,7 @@ class BankingExportSddWizard(orm.TransientModel): pain_root = etree.SubElement(xml_root, root_xml_tag) # A. Group header group_header_1_0, nb_of_transactions_1_6, control_sum_1_7 = \ - self.generate_group_header_block( - cr, uid, pain_root, gen_args, context=context) + self.generate_group_header_block(pain_root, gen_args) transactions_count_1_6 = 0 total_amount = 0.0 amount_control_sum_1_7 = 0.0 @@ -161,8 +144,8 @@ class BankingExportSddWizard(orm.TransientModel): # key = (requested_date, priority, sequence type) # value = list of lines as objects # Iterate on payment orders - today = fields.date.context_today(self, cr, uid, context=context) - for payment_order in sepa_export.payment_order_ids: + today = fields.Date.context_today(self) + for payment_order in self.payment_order_ids: total_amount = total_amount + payment_order.total # Iterate each payment lines for line in payment_order.line_ids: @@ -175,16 +158,14 @@ class BankingExportSddWizard(orm.TransientModel): else: requested_date = today if not line.mandate_id: - raise orm.except_orm( - _('Error:'), + raise Warning( _("Missing SEPA Direct Debit mandate on the payment " "line with partner '%s' and Invoice ref '%s'.") % (line.partner_id.name, line.ml_inv_ref.number)) scheme = line.mandate_id.scheme if line.mandate_id.state != 'valid': - raise orm.except_orm( - _('Error:'), + raise Warning( _("The SEPA Direct Debit mandate with reference '%s' " "for partner '%s' has expired.") % (line.mandate_id.unique_mandate_reference, @@ -192,8 +173,7 @@ class BankingExportSddWizard(orm.TransientModel): if line.mandate_id.type == 'oneoff': seq_type = 'OOFF' if line.mandate_id.last_debit_date: - raise orm.except_orm( - _('Error:'), + raise Warning( _("The mandate with reference '%s' for partner " "'%s' has type set to 'One-Off' and it has a " "last debit date set to '%s', so we can't use " @@ -218,45 +198,41 @@ class BankingExportSddWizard(orm.TransientModel): lines_per_group[key] = [line] # Write requested_exec_date on 'Payment date' of the pay line if requested_date != line.date: - self.pool['payment.line'].write( - cr, uid, line.id, - {'date': requested_date}, context=context) + line.date = requested_date for (requested_date, priority, sequence_type, scheme), lines in \ lines_per_group.items(): # B. Payment info payment_info_2_0, nb_of_transactions_2_4, control_sum_2_5 = \ self.generate_start_payment_info_block( - cr, uid, pain_root, - "sepa_export.payment_order_ids[0].reference + '-' + " + pain_root, + "self.payment_order_ids[0].reference + '-' + " "sequence_type + '-' + requested_date.replace('-', '') " "+ '-' + priority", priority, scheme, sequence_type, requested_date, { - 'sepa_export': sepa_export, + 'self': self, 'sequence_type': sequence_type, 'priority': priority, 'requested_date': requested_date, - }, gen_args, context=context) + }, gen_args) self.generate_party_block( - cr, uid, payment_info_2_0, 'Cdtr', 'B', - 'sepa_export.payment_order_ids[0].mode.bank_id.partner_id.' + payment_info_2_0, 'Cdtr', 'B', + 'self.payment_order_ids[0].mode.bank_id.partner_id.' 'name', - 'sepa_export.payment_order_ids[0].mode.bank_id.acc_number', - 'sepa_export.payment_order_ids[0].mode.bank_id.bank.bic or ' - 'sepa_export.payment_order_ids[0].mode.bank_id.bank_bic', - {'sepa_export': sepa_export}, - gen_args, context=context) + 'self.payment_order_ids[0].mode.bank_id.acc_number', + 'self.payment_order_ids[0].mode.bank_id.bank.bic or ' + 'self.payment_order_ids[0].mode.bank_id.bank_bic', + {'self': self}, gen_args) charge_bearer_2_24 = etree.SubElement(payment_info_2_0, 'ChrgBr') - charge_bearer_2_24.text = sepa_export.charge_bearer + charge_bearer_2_24.text = self.charge_bearer creditor_scheme_identification_2_27 = etree.SubElement( payment_info_2_0, 'CdtrSchmeId') self.generate_creditor_scheme_identification( - cr, uid, creditor_scheme_identification_2_27, - 'sepa_export.payment_order_ids[0].company_id.' + creditor_scheme_identification_2_27, + 'self.payment_order_ids[0].company_id.' 'sepa_creditor_identifier', - 'SEPA Creditor Identifier', {'sepa_export': sepa_export}, - 'SEPA', gen_args, context=context) + 'SEPA Creditor Identifier', {'self': self}, 'SEPA', gen_args) transactions_count_2_4 = 0 amount_control_sum_2_5 = 0.0 for line in lines: @@ -269,13 +245,11 @@ class BankingExportSddWizard(orm.TransientModel): end2end_identification_2_31 = etree.SubElement( payment_identification_2_29, 'EndToEndId') end2end_identification_2_31.text = self._prepare_field( - cr, uid, 'End to End Identification', 'line.name', - {'line': line}, 35, - gen_args=gen_args, context=context) + 'End to End Identification', 'line.name', + {'line': line}, 35, gen_args=gen_args) currency_name = self._prepare_field( - cr, uid, 'Currency Code', 'line.currency.name', - {'line': line}, 3, gen_args=gen_args, - context=context) + 'Currency Code', 'line.currency.name', + {'line': line}, 3, gen_args=gen_args) instructed_amount_2_44 = etree.SubElement( dd_transaction_info_2_28, 'InstdAmt', Ccy=currency_name) instructed_amount_2_44.text = '%.2f' % line.amount_currency @@ -288,22 +262,19 @@ class BankingExportSddWizard(orm.TransientModel): mandate_identification_2_48 = etree.SubElement( mandate_related_info_2_47, 'MndtId') mandate_identification_2_48.text = self._prepare_field( - cr, uid, 'Unique Mandate Reference', + 'Unique Mandate Reference', 'line.mandate_id.unique_mandate_reference', - {'line': line}, 35, - gen_args=gen_args, context=context) + {'line': line}, 35, gen_args=gen_args) mandate_signature_date_2_49 = etree.SubElement( mandate_related_info_2_47, 'DtOfSgntr') mandate_signature_date_2_49.text = self._prepare_field( - cr, uid, 'Mandate Signature Date', + 'Mandate Signature Date', 'line.mandate_id.signature_date', - {'line': line}, 10, - gen_args=gen_args, context=context) + {'line': line}, 10, gen_args=gen_args) if sequence_type == 'FRST' and ( line.mandate_id.last_debit_date or not line.mandate_id.sepa_migrated): - previous_bank = self._get_previous_bank( - cr, uid, line, context=context) + previous_bank = self._get_previous_bank(line) if previous_bank or not line.mandate_id.sepa_migrated: amendment_indicator_2_50 = etree.SubElement( mandate_related_info_2_47, 'AmdmntInd') @@ -322,13 +293,11 @@ class BankingExportSddWizard(orm.TransientModel): ori_debtor_account_iban = etree.SubElement( ori_debtor_account_id, 'IBAN') ori_debtor_account_iban.text = self._validate_iban( - cr, uid, self._prepare_field( - cr, uid, 'Original Debtor Account', + self._prepare_field( + 'Original Debtor Account', 'previous_bank.acc_number', {'previous_bank': previous_bank}, - gen_args=gen_args, - context=context), - context=context) + gen_args=gen_args)) else: ori_debtor_agent_2_58 = etree.SubElement( amendment_info_details_2_51, 'OrgnlDbtrAgt') @@ -337,12 +306,11 @@ class BankingExportSddWizard(orm.TransientModel): ori_debtor_agent_bic = etree.SubElement( ori_debtor_agent_institution, bic_xml_tag) ori_debtor_agent_bic.text = self._prepare_field( - cr, uid, 'Original Debtor Agent', + 'Original Debtor Agent', 'previous_bank.bank.bic or ' 'previous_bank.bank_bic', {'previous_bank': previous_bank}, - gen_args=gen_args, - context=context) + gen_args=gen_args) ori_debtor_agent_other = etree.SubElement( ori_debtor_agent_institution, 'Othr') ori_debtor_agent_other_id = etree.SubElement( @@ -354,74 +322,73 @@ class BankingExportSddWizard(orm.TransientModel): amendment_info_details_2_51, 'OrgnlMndtId') ori_mandate_identification_2_52.text = \ self._prepare_field( - cr, uid, 'Original Mandate Identification', + 'Original Mandate Identification', 'line.mandate_id.' 'original_mandate_identification', {'line': line}, - gen_args=gen_args, - context=context) + gen_args=gen_args) ori_creditor_scheme_id_2_53 = etree.SubElement( amendment_info_details_2_51, 'OrgnlCdtrSchmeId') self.generate_creditor_scheme_identification( - cr, uid, ori_creditor_scheme_id_2_53, - 'sepa_export.payment_order_ids[0].company_id.' + ori_creditor_scheme_id_2_53, + 'self.payment_order_ids[0].company_id.' 'original_creditor_identifier', 'Original Creditor Identifier', - {'sepa_export': sepa_export}, - 'SEPA', gen_args, context=context) + {'self': self}, 'SEPA', gen_args) self.generate_party_block( - cr, uid, dd_transaction_info_2_28, 'Dbtr', 'C', + dd_transaction_info_2_28, 'Dbtr', 'C', 'line.partner_id.name', 'line.bank_id.acc_number', 'line.bank_id.bank.bic or ' 'line.bank_id.bank_bic', - {'line': line}, gen_args, context=context) + {'line': line}, gen_args) self.generate_remittance_info_block( - cr, uid, dd_transaction_info_2_28, - line, gen_args, context=context) + dd_transaction_info_2_28, line, gen_args) - nb_of_transactions_2_4.text = str(transactions_count_2_4) + nb_of_transactions_2_4.text = unicode(transactions_count_2_4) control_sum_2_5.text = '%.2f' % amount_control_sum_2_5 - nb_of_transactions_1_6.text = str(transactions_count_1_6) + nb_of_transactions_1_6.text = unicode(transactions_count_1_6) control_sum_1_7.text = '%.2f' % amount_control_sum_1_7 return self.finalize_sepa_file_creation( - cr, uid, ids, xml_root, total_amount, transactions_count_1_6, - gen_args, context=context) + xml_root, total_amount, transactions_count_1_6, gen_args) - def save_sepa(self, cr, uid, ids, context=None): + @api.multi + def save_sepa(self): """Save the SEPA Direct Debit file: mark all payments in the file as 'sent'. Write 'last debit date' on mandate and set oneoff mandate to expired. """ - sepa_export = self.browse(cr, uid, ids[0], context=context) - for order in sepa_export.payment_order_ids: - workflow.trg_validate(uid, 'payment.order', order.id, 'done', cr) - self.pool['ir.attachment'].create( - cr, uid, { - 'res_model': 'payment.order', - 'res_id': order.id, - 'name': sepa_export.filename, - 'datas': sepa_export.file, - }, context=context) - to_expire_ids = [] - first_mandate_ids = [] + abmo = self.env['account.banking.mandate'] + for order in self.payment_order_ids: + workflow.trg_validate( + self._uid, 'payment.order', order.id, 'done', self._cr) + self.env['ir.attachment'].create({ + 'res_model': 'payment.order', + 'res_id': order.id, + 'name': self.filename, + 'datas': self.file, + }) + to_expire_mandates = abmo.browse([]) + first_mandates = abmo.browse([]) + all_mandates = abmo.browse([]) for line in order.line_ids: + all_mandates += line.mandate_id if line.mandate_id.type == 'oneoff': - to_expire_ids.append(line.mandate_id.id) + to_expire_mandates += line.mandate_id elif line.mandate_id.type == 'recurrent': seq_type = line.mandate_id.recurrent_sequence_type if seq_type == 'final': - to_expire_ids.append(line.mandate_id.id) + to_expire_mandates += line.mandate_id elif seq_type == 'first': - first_mandate_ids.append(line.mandate_id.id) - self.pool['account.banking.mandate'].write( - cr, uid, to_expire_ids, {'state': 'expired'}, context=context) - self.pool['account.banking.mandate'].write( - cr, uid, first_mandate_ids, { - 'recurrent_sequence_type': 'recurring', - 'sepa_migrated': True, - }, context=context) + first_mandates += line.mandate_id + all_mandates.write( + {'last_debit_date': fields.Date.context_today(self)}) + to_expire_mandates.write({'state': 'expired'}) + first_mandates.write({ + 'recurrent_sequence_type': 'recurring', + 'sepa_migrated': True, + }) return True From ae45b579ea34ecc99e53c542d7c8d861c1751911 Mon Sep 17 00:00:00 2001 From: sergio-incaser Date: Wed, 8 Jul 2015 10:07:40 +0200 Subject: [PATCH 060/118] account_banking_sepa_direct_debit: Fix error in payment order validation when there is more than one line with the same mandate. --- account_banking_sepa_direct_debit/wizard/export_sdd.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/account_banking_sepa_direct_debit/wizard/export_sdd.py b/account_banking_sepa_direct_debit/wizard/export_sdd.py index 2c0d93d57..b76e14050 100644 --- a/account_banking_sepa_direct_debit/wizard/export_sdd.py +++ b/account_banking_sepa_direct_debit/wizard/export_sdd.py @@ -375,6 +375,8 @@ class BankingExportSddWizard(models.TransientModel): first_mandates = abmo.browse([]) all_mandates = abmo.browse([]) for line in order.line_ids: + if line.mandate_id in all_mandates: + continue all_mandates += line.mandate_id if line.mandate_id.type == 'oneoff': to_expire_mandates += line.mandate_id From 328bc86fd39fd1a5b2d9f153061a876290992eb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Bidoul?= Date: Fri, 9 Oct 2015 09:59:34 +0200 Subject: [PATCH 061/118] prefix versions with 8.0 --- account_banking_sepa_direct_debit/__openerp__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/account_banking_sepa_direct_debit/__openerp__.py b/account_banking_sepa_direct_debit/__openerp__.py index f0288fd4c..92eea9370 100644 --- a/account_banking_sepa_direct_debit/__openerp__.py +++ b/account_banking_sepa_direct_debit/__openerp__.py @@ -22,7 +22,7 @@ { 'name': 'Account Banking SEPA Direct Debit', 'summary': 'Create SEPA files for Direct Debit', - 'version': '0.2', + 'version': '8.0.0.2.0', 'license': 'AGPL-3', 'author': "Akretion, " "Serv. Tecnol. Avanzados - Pedro M. Baeza, " From c4dccd553ba231fde10a85f169599f40f7a75f00 Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Wed, 14 Oct 2015 03:03:12 +0200 Subject: [PATCH 062/118] Make modules uninstallable --- account_banking_sepa_direct_debit/__openerp__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/account_banking_sepa_direct_debit/__openerp__.py b/account_banking_sepa_direct_debit/__openerp__.py index 92eea9370..67df556e0 100644 --- a/account_banking_sepa_direct_debit/__openerp__.py +++ b/account_banking_sepa_direct_debit/__openerp__.py @@ -43,5 +43,5 @@ 'security/original_mandate_required_security.xml', ], 'demo': ['demo/sepa_direct_debit_demo.xml'], - 'installable': True, + 'installable': False, } From 2bfd46c4f42a5ee4525fbbe8e3648c2eab6eb9b2 Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Mon, 21 Sep 2015 12:32:45 +0200 Subject: [PATCH 063/118] Add bank.payment.lines object to allow grouping in the payments --- .../wizard/export_sdd.py | 26 +++++++------------ 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/account_banking_sepa_direct_debit/wizard/export_sdd.py b/account_banking_sepa_direct_debit/wizard/export_sdd.py index b76e14050..ff5662c46 100644 --- a/account_banking_sepa_direct_debit/wizard/export_sdd.py +++ b/account_banking_sepa_direct_debit/wizard/export_sdd.py @@ -144,25 +144,22 @@ class BankingExportSddWizard(models.TransientModel): # key = (requested_date, priority, sequence type) # value = list of lines as objects # Iterate on payment orders - today = fields.Date.context_today(self) for payment_order in self.payment_order_ids: total_amount = total_amount + payment_order.total # Iterate each payment lines - for line in payment_order.line_ids: + for line in payment_order.bank_line_ids: transactions_count_1_6 += 1 priority = line.priority - if payment_order.date_prefered == 'due': - requested_date = line.ml_maturity_date or today - elif payment_order.date_prefered == 'fixed': - requested_date = payment_order.date_scheduled or today - else: - requested_date = today + # The field line.date is the requested payment date + # taking into account the 'date_prefered' setting + # cf account_banking_payment_export/models/account_payment.py + # in the inherit of action_open() if not line.mandate_id: raise Warning( - _("Missing SEPA Direct Debit mandate on the payment " - "line with partner '%s' and Invoice ref '%s'.") - % (line.partner_id.name, - line.ml_inv_ref.number)) + _("Missing SEPA Direct Debit mandate on the " + "bank payment line with partner '%s' " + "(reference '%s'.") + % (line.partner_id.name, line.name)) scheme = line.mandate_id.scheme if line.mandate_id.state != 'valid': raise Warning( @@ -191,14 +188,11 @@ class BankingExportSddWizard(models.TransientModel): line.mandate_id.recurrent_sequence_type assert seq_type_label is not False seq_type = seq_type_map[seq_type_label] - key = (requested_date, priority, seq_type, scheme) + key = (line.date, priority, seq_type, scheme) if key in lines_per_group: lines_per_group[key].append(line) else: lines_per_group[key] = [line] - # Write requested_exec_date on 'Payment date' of the pay line - if requested_date != line.date: - line.date = requested_date for (requested_date, priority, sequence_type, scheme), lines in \ lines_per_group.items(): From ec65f27b35154c073ac84da454ca12056945568f Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Thu, 24 Sep 2015 11:38:50 +0200 Subject: [PATCH 064/118] Add a hook to inherit grouping of the transfer account move line Use that new hook in SEPA direct debits Better variable names --- .../models/__init__.py | 23 +---------- .../models/bank_payment_line.py | 41 +++++++++++++++++++ 2 files changed, 43 insertions(+), 21 deletions(-) create mode 100644 account_banking_sepa_direct_debit/models/bank_payment_line.py diff --git a/account_banking_sepa_direct_debit/models/__init__.py b/account_banking_sepa_direct_debit/models/__init__.py index 153ab3543..ac7674156 100644 --- a/account_banking_sepa_direct_debit/models/__init__.py +++ b/account_banking_sepa_direct_debit/models/__init__.py @@ -1,24 +1,5 @@ -# -*- encoding: utf-8 -*- -############################################################################## -# -# SEPA Direct Debit module for OpenERP -# Copyright (C) 2013 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 . -# -############################################################################## +# -*- coding: utf-8 -*- from . import res_company from . import account_banking_mandate +from . import bank_payment_line diff --git a/account_banking_sepa_direct_debit/models/bank_payment_line.py b/account_banking_sepa_direct_debit/models/bank_payment_line.py new file mode 100644 index 000000000..9da270e80 --- /dev/null +++ b/account_banking_sepa_direct_debit/models/bank_payment_line.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# SEPA Direct Debit module for Odoo +# Copyright (C) 2015 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 . +# +############################################################################## + +from openerp import models, api + + +class BankPaymentLine(models.Model): + _inherit = 'bank.payment.line' + + @api.multi + def move_line_transfer_account_hashcode(self): + """ + From my experience, even when you ask several direct debits + at the same date with enough delay, you will have several credits + on your bank statement: one for each mandate types. + So we split the transfer move lines by mandate type, so easier + reconciliation of the bank statement. + """ + hashcode = super(BankPaymentLine, self).\ + move_line_transfer_account_hashcode() + hashcode += self.mandate_id.type + return hashcode From 6bd1d0236ec9e18ecc6c77ffa7e7af50bbcd6cf3 Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Thu, 24 Sep 2015 12:29:43 +0200 Subject: [PATCH 065/118] FIX Reading wrong field for sequence type of SEPA DD Loop on bank payment lines instead of payment lines --- .../models/bank_payment_line.py | 2 +- .../wizard/export_sdd.py | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/account_banking_sepa_direct_debit/models/bank_payment_line.py b/account_banking_sepa_direct_debit/models/bank_payment_line.py index 9da270e80..67a0da3f5 100644 --- a/account_banking_sepa_direct_debit/models/bank_payment_line.py +++ b/account_banking_sepa_direct_debit/models/bank_payment_line.py @@ -37,5 +37,5 @@ class BankPaymentLine(models.Model): """ hashcode = super(BankPaymentLine, self).\ move_line_transfer_account_hashcode() - hashcode += self.mandate_id.type + hashcode += '-' + unicode(self.mandate_id.recurrent_sequence_type) return hashcode diff --git a/account_banking_sepa_direct_debit/wizard/export_sdd.py b/account_banking_sepa_direct_debit/wizard/export_sdd.py index ff5662c46..53bdd3d10 100644 --- a/account_banking_sepa_direct_debit/wizard/export_sdd.py +++ b/account_banking_sepa_direct_debit/wizard/export_sdd.py @@ -368,18 +368,18 @@ class BankingExportSddWizard(models.TransientModel): to_expire_mandates = abmo.browse([]) first_mandates = abmo.browse([]) all_mandates = abmo.browse([]) - for line in order.line_ids: - if line.mandate_id in all_mandates: + for bline in order.bank_line_ids: + if bline.mandate_id in all_mandates: continue - all_mandates += line.mandate_id - if line.mandate_id.type == 'oneoff': - to_expire_mandates += line.mandate_id - elif line.mandate_id.type == 'recurrent': - seq_type = line.mandate_id.recurrent_sequence_type + all_mandates += bline.mandate_id + if bline.mandate_id.type == 'oneoff': + to_expire_mandates += bline.mandate_id + elif bline.mandate_id.type == 'recurrent': + seq_type = bline.mandate_id.recurrent_sequence_type if seq_type == 'final': - to_expire_mandates += line.mandate_id + to_expire_mandates += bline.mandate_id elif seq_type == 'first': - first_mandates += line.mandate_id + first_mandates += bline.mandate_id all_mandates.write( {'last_debit_date': fields.Date.context_today(self)}) to_expire_mandates.write({'state': 'expired'}) From 9ca7bdabb125ba1ba25f1f7160f80df778024c72 Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Wed, 2 Dec 2015 00:17:17 +0100 Subject: [PATCH 066/118] Update automated tests and demo data Add on_change on field 'type' of payment.mode for easier configuration --- .../demo/sepa_direct_debit_demo.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/account_banking_sepa_direct_debit/demo/sepa_direct_debit_demo.xml b/account_banking_sepa_direct_debit/demo/sepa_direct_debit_demo.xml index 51a24bad1..07b347f6c 100644 --- a/account_banking_sepa_direct_debit/demo/sepa_direct_debit_demo.xml +++ b/account_banking_sepa_direct_debit/demo/sepa_direct_debit_demo.xml @@ -10,6 +10,7 @@ +
From 23c9cb6725bb0f7e6e7ca9434f68492b8ac9ccbe Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Mon, 15 Feb 2016 23:10:18 +0100 Subject: [PATCH 067/118] *: Short headers --- account_banking_sepa_direct_debit/__init__.py | 24 +++-------------- .../__openerp__.py | 26 ++++--------------- .../models/account_banking_mandate.py | 25 +++--------------- .../models/bank_payment_line.py | 22 ++-------------- .../models/res_company.py | 25 +++--------------- 5 files changed, 18 insertions(+), 104 deletions(-) diff --git a/account_banking_sepa_direct_debit/__init__.py b/account_banking_sepa_direct_debit/__init__.py index 096fe8ad3..b4a69d367 100644 --- a/account_banking_sepa_direct_debit/__init__.py +++ b/account_banking_sepa_direct_debit/__init__.py @@ -1,24 +1,6 @@ -# -*- encoding: utf-8 -*- -############################################################################## -# -# SEPA Direct Debit module for OpenERP -# Copyright (C) 2013 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 . -# -############################################################################## +# -*- coding: utf-8 -*- +# © 2013 Akretion (www.akretion.com) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from . import models from . import wizard diff --git a/account_banking_sepa_direct_debit/__openerp__.py b/account_banking_sepa_direct_debit/__openerp__.py index 67df556e0..979a4a7e8 100644 --- a/account_banking_sepa_direct_debit/__openerp__.py +++ b/account_banking_sepa_direct_debit/__openerp__.py @@ -1,24 +1,8 @@ -# -*- encoding: utf-8 -*- -############################################################################## -# -# SEPA Direct Debit module for Odoo -# Copyright (C) 2013-2015 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 . -# -############################################################################## +# -*- coding: utf-8 -*- +# © 2013-2015 Akretion (www.akretion.com) +# © 2014 Serv. Tecnol. Avanzados - Pedro M. Baeza +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + { 'name': 'Account Banking SEPA Direct Debit', 'summary': 'Create SEPA files for Direct Debit', diff --git a/account_banking_sepa_direct_debit/models/account_banking_mandate.py b/account_banking_sepa_direct_debit/models/account_banking_mandate.py index 56b4c870d..a2e9668f8 100644 --- a/account_banking_sepa_direct_debit/models/account_banking_mandate.py +++ b/account_banking_sepa_direct_debit/models/account_banking_mandate.py @@ -1,24 +1,7 @@ -# -*- encoding: utf-8 -*- -############################################################################## -# -# SEPA Direct Debit module for OpenERP -# Copyright (C) 2013 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 . -# -############################################################################## +# -*- coding: utf-8 -*- +# © 2013 Akretion - Alexis de Lattre +# © 2014 Serv. Tecnol. Avanzados - Pedro M. Baeza +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from openerp import models, fields, api, exceptions, _ from datetime import datetime diff --git a/account_banking_sepa_direct_debit/models/bank_payment_line.py b/account_banking_sepa_direct_debit/models/bank_payment_line.py index 67a0da3f5..e28207ebc 100644 --- a/account_banking_sepa_direct_debit/models/bank_payment_line.py +++ b/account_banking_sepa_direct_debit/models/bank_payment_line.py @@ -1,24 +1,6 @@ # -*- coding: utf-8 -*- -############################################################################## -# -# SEPA Direct Debit module for Odoo -# Copyright (C) 2015 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 . -# -############################################################################## +# © 2015 Akretion - Alexis de Lattre +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from openerp import models, api diff --git a/account_banking_sepa_direct_debit/models/res_company.py b/account_banking_sepa_direct_debit/models/res_company.py index 46f98bbc2..9ce040189 100644 --- a/account_banking_sepa_direct_debit/models/res_company.py +++ b/account_banking_sepa_direct_debit/models/res_company.py @@ -1,24 +1,7 @@ -# -*- encoding: utf-8 -*- -############################################################################## -# -# SEPA Direct Debit module for OpenERP -# Copyright (C) 2013 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 . -# -############################################################################## +# -*- coding: utf-8 -*- +# © 2013 Akretion (www.akretion.com) +# © 2014 Serv. Tecnol. Avanzados - Pedro M. Baeza +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from openerp import models, fields, api, exceptions, _ import logging From 1b3bcff48a3f202e4e32bc784e79f14c6c4843a9 Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Mon, 15 Feb 2016 23:17:37 +0100 Subject: [PATCH 068/118] *: Bump version numbers --- account_banking_sepa_direct_debit/__openerp__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/account_banking_sepa_direct_debit/__openerp__.py b/account_banking_sepa_direct_debit/__openerp__.py index 979a4a7e8..953ff14f7 100644 --- a/account_banking_sepa_direct_debit/__openerp__.py +++ b/account_banking_sepa_direct_debit/__openerp__.py @@ -6,7 +6,7 @@ { 'name': 'Account Banking SEPA Direct Debit', 'summary': 'Create SEPA files for Direct Debit', - 'version': '8.0.0.2.0', + 'version': '8.0.0.3.0', 'license': 'AGPL-3', 'author': "Akretion, " "Serv. Tecnol. Avanzados - Pedro M. Baeza, " From 454da0a88c71d25ef55acd73c27d6e405260080b Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Tue, 16 Feb 2016 09:02:09 +0100 Subject: [PATCH 069/118] *: es translations --- account_banking_sepa_direct_debit/i18n/es.po | 144 +++++------------- .../wizard/export_sdd.py | 2 +- 2 files changed, 40 insertions(+), 106 deletions(-) diff --git a/account_banking_sepa_direct_debit/i18n/es.po b/account_banking_sepa_direct_debit/i18n/es.po index 98334c842..1255410e6 100644 --- a/account_banking_sepa_direct_debit/i18n/es.po +++ b/account_banking_sepa_direct_debit/i18n/es.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 8.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2014-10-31 22:53+0000\n" -"PO-Revision-Date: 2014-10-31 22:53+0000\n" +"POT-Creation-Date: 2016-02-16 07:53+0000\n" +"PO-Revision-Date: 2016-02-16 07:53+0000\n" "Last-Translator: <>\n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -18,17 +18,17 @@ msgstr "" #. module: account_banking_sepa_direct_debit #: model:ir.actions.act_window,help:account_banking_sepa_direct_debit.mandate_action msgid "

\n" -" Click to create a new SEPA Direct Debit Mandate.\n" -"

\n" -" A SEPA Direct Debit Mandate is a document signed by your customer that gives you the autorization to do one or several direct debits on his bank account.\n" -"

\n" -" " +" Click to create a new SEPA Direct Debit Mandate.\n" +"

\n" +" A SEPA Direct Debit Mandate is a document signed by your customer that gives you the autorization to do one or several direct debits on his bank account.\n" +"

\n" +" " msgstr "

\n" -" Pulse para crear un nuevo mandato de adeudo directo SEPA.\n" -"

\n" -" Un mandato de adeudo directo SEPA es un documento firmado por su cliente que le autoriza a realizar uno o más cobros directos en su cuenta bancaria, también conocidas como domiciliaciones.\n" -"

\n" -" " +" Pulse para crear un nuevo mandato bancario.\n" +"

\n" +" Un mandato bancario es un documento firmado por su cliente que le da la autorización para hacer una o varias operaciones en su cuenta bancaria.\n" +"

\n" +" " #. module: account_banking_sepa_direct_debit #: model:ir.model,name:account_banking_sepa_direct_debit.model_account_banking_mandate @@ -36,10 +36,15 @@ msgid "A generic banking mandate" msgstr "Un mandato bancario genérico" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:120 +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:106 #, python-format msgid "As you changed the bank account attached to this mandate, the 'Sequence Type' has been set back to 'First'." -msgstr "Puesto que ha cambiar la cuenta bancaria relacionada con este mandato, el 'Tipo de secuencia' se ha vuelto a 'Inicial'." +msgstr "Puesto que ha cambiado la cuenta bancaria relacionada con este mandato, el 'Tipo de secuencia' se ha vuelto a 'Inicial'." + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_bank_payment_line +msgid "Bank Payment Lines" +msgstr "Lineas de pago bancario" #. module: account_banking_sepa_direct_debit #: selection:account.banking.mandate,scheme:0 @@ -47,19 +52,16 @@ msgid "Basic (CORE)" msgstr "Básico (CORE)" #. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,batch_booking:0 #: field:banking.export.sdd.wizard,batch_booking:0 msgid "Batch Booking" msgstr "Registro en lote" #. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd,charge_bearer:0 #: selection:banking.export.sdd.wizard,charge_bearer:0 msgid "Borne by Creditor" msgstr "A cargo del acreedor" #. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd,charge_bearer:0 #: selection:banking.export.sdd.wizard,charge_bearer:0 msgid "Borne by Debtor" msgstr "A cargo del deudor" @@ -70,7 +72,6 @@ msgid "Cancel" msgstr "Cancelar" #. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,charge_bearer:0 #: field:banking.export.sdd.wizard,charge_bearer:0 msgid "Charge Bearer" msgstr "A cargo del portador" @@ -86,7 +87,6 @@ msgid "Create" msgstr "Crear" #. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,create_uid:0 #: field:banking.export.sdd.wizard,create_uid:0 msgid "Created by" msgstr "Creado por" @@ -96,11 +96,6 @@ msgstr "Creado por" msgid "Created on" msgstr "Creado en" -#. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd,state:0 -msgid "Draft" -msgstr "Borrador" - #. module: account_banking_sepa_direct_debit #: help:res.company,sepa_creditor_identifier:0 msgid "Enter the Creditor Identifier that has been attributed to your company to make SEPA Direct Debits. This identifier is composed of :\n" @@ -120,20 +115,11 @@ msgid "Enterprise (B2B)" msgstr "Empresa (B2B)" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/models/res_company.py:79 +#: code:addons/account_banking_sepa_direct_debit/models/res_company.py:62 #, python-format msgid "Error" msgstr "Error" -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:137 -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:185 -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:193 -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:202 -#, python-format -msgid "Error:" -msgstr "Error:" - #. module: account_banking_sepa_direct_debit #: model:ir.model,name:account_banking_sepa_direct_debit.model_banking_export_sdd_wizard msgid "Export SEPA Direct Debit File" @@ -145,7 +131,6 @@ msgid "File" msgstr "Archivo" #. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,filename:0 #: field:banking.export.sdd.wizard,filename:0 msgid "Filename" msgstr "Nombre de archivo" @@ -166,39 +151,21 @@ msgid "First" msgstr "Inicial" #. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd,charge_bearer:0 #: selection:banking.export.sdd.wizard,charge_bearer:0 msgid "Following Service Level" msgstr "Según el acuerdo de servicio" #. module: account_banking_sepa_direct_debit -#: help:banking.export.sdd,charge_bearer:0 #: help:banking.export.sdd.wizard,charge_bearer:0 msgid "Following service level : transaction charges are to be applied following the rules agreed in the service level and/or scheme (SEPA Core messages must use this). Shared : transaction charges on the creditor side are to be borne by the creditor, transaction charges on the debtor side are to be borne by the debtor. Borne by creditor : all transaction charges are to be borne by the creditor. Borne by debtor : all transaction charges are to be borne by the debtor." msgstr "Según el acuerdo de servicio: los costes de la transacción se aplicarán siguiendo las reglas acordadas en el nivel de servicio y/o en el esquema (las remesas SEPA Core deben usar esta opción). Compartidos: los costes de la transacción en la parte del acreedor están a cargo del acreedor, y los costes de la transacción del lado del deudor estarán a cargo del deudor. A cargo del acreedor: todos los costes de la transacción estarán a cargo del acreedor. A cargo del deudor: Todos los costes de la transacción estarán a cargo del deudor." -#. module: account_banking_sepa_direct_debit -#: view:banking.export.sdd:account_banking_sepa_direct_debit.view_banking_export_sdd_form -msgid "General Information" -msgstr "Información general" - #. module: account_banking_sepa_direct_debit #: view:banking.export.sdd.wizard:account_banking_sepa_direct_debit.banking_export_sdd_wizard_view msgid "Generate" msgstr "Generar" #. module: account_banking_sepa_direct_debit -#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.act_banking_export_sdd_payment_order -msgid "Generated SEPA Direct Debit Files" -msgstr "Archivos de adeudos directos SEPA generados" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,create_date:0 -msgid "Generation Date" -msgstr "Fecha de generación" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,id:0 #: field:banking.export.sdd.wizard,id:0 msgid "ID" msgstr "ID" @@ -209,34 +176,31 @@ msgid "If this field is not active, the mandate section of the next direct debit msgstr "Si este campo no está marcado, la sección 'mandato' del próximo archivo de adeudo directo que lo incluya contendrá el valor de los campos 'Identificación del mandato original' y 'Identificación del esquema original del acreedor'. Esto se requiere en algunos países (Bélgica por ejemplo), pero no en todos ellos. Si no es un requisito en su país, este campo siempre debe estar marcado." #. module: account_banking_sepa_direct_debit -#: help:banking.export.sdd,batch_booking:0 #: help:banking.export.sdd.wizard,batch_booking:0 msgid "If true, the bank statement will display only one credit line for all the direct debits of the SEPA file ; if false, the bank statement will display one credit line per direct debit of the SEPA file." msgstr "Si está marcado, el extracto bancario mostrará sólo una línea del haber para todos los adeudos directos del archivo SEPA; si no está marcado, entonces el extracto bancario mostrará una línea por cada adeudo directo del archivo SEPA." #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/models/res_company.py:80 +#: code:addons/account_banking_sepa_direct_debit/models/res_company.py:63 #, python-format msgid "Invalid SEPA Creditor Identifier." msgstr "Identificador de acreedor SEPA no válido." #. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,write_uid:0 #: field:banking.export.sdd.wizard,write_uid:0 msgid "Last Updated by" msgstr "Última actualización por" #. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,write_date:0 #: field:banking.export.sdd.wizard,write_date:0 msgid "Last Updated on" msgstr "Última actualización en" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:119 +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:105 #, python-format msgid "Mandate update" -msgstr "" +msgstr "Actualizacion de mandato" #. module: account_banking_sepa_direct_debit #: field:account.banking.mandate,sepa_migrated:0 @@ -244,13 +208,12 @@ msgid "Migrated to SEPA" msgstr "Migrado a SEPA" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:186 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:159 #, python-format -msgid "Missing SEPA Direct Debit mandate on the payment line with partner '%s' and Invoice ref '%s'." -msgstr "Falta el mandato de adeudo directo SEPA en la línea con la empresa '%s' y la factura con referencia '%s'" +msgid "Missing SEPA Direct Debit mandate on the bank payment line with partner '%s' (reference '%s')." +msgstr "Falta el mandato de adeudo directo SEPA en la linea de pago bancario con la empresa '%s' (referencia '%s')." #. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,nb_transactions:0 #: field:banking.export.sdd.wizard,nb_transactions:0 msgid "Number of Transactions" msgstr "Nº de transacciones" @@ -277,17 +240,15 @@ msgid "Original Mandate Required (SEPA)" msgstr "Mandato original requerido (SEPA)" #. module: account_banking_sepa_direct_debit -#: view:banking.export.sdd:account_banking_sepa_direct_debit.view_banking_export_sdd_form -#: field:banking.export.sdd,payment_order_ids:0 #: field:banking.export.sdd.wizard,payment_order_ids:0 msgid "Payment Orders" msgstr "Órdenes de pago" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:138 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:117 #, python-format msgid "Payment Type Code '%s' is not supported. The only Payment Type Code supported for SEPA Direct Debit are 'pain.008.001.02', 'pain.008.001.03' and 'pain.008.001.04'." -msgstr "" +msgstr "El código de tipo de pago '%s' no está soportado. Los únicos códigos de tipo de pago soportados para los adedudos directos SEPA son 'pain.008.001.02', 'pain.008.001.03' y 'pain.008.001.04'." #. module: account_banking_sepa_direct_debit #: view:account.banking.mandate:account_banking_sepa_direct_debit.sdd_mandate_search @@ -300,11 +261,6 @@ msgstr "Recurrente" msgid "Recurring" msgstr "Periódico" -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd.wizard,file_id:0 -msgid "SDD File" -msgstr "Archivo SDD" - #. module: account_banking_sepa_direct_debit #: view:res.partner:account_banking_sepa_direct_debit.sdd_mandate_partner_form #: view:res.partner.bank:account_banking_sepa_direct_debit.sdd_mandate_partner_bank_tree @@ -316,18 +272,6 @@ msgstr "Mandatos SDD" msgid "SEPA Creditor Identifier" msgstr "Identificador de acreedor SEPA" -#. module: account_banking_sepa_direct_debit -#: view:banking.export.sdd:account_banking_sepa_direct_debit.view_banking_export_sdd_form -#: view:banking.export.sdd:account_banking_sepa_direct_debit.view_banking_export_sdd_tree -msgid "SEPA Direct Debit" -msgstr "Adeudo directo SEPA" - -#. module: account_banking_sepa_direct_debit -#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.action_account_banking_sdd -#: model:ir.ui.menu,name:account_banking_sepa_direct_debit.menu_account_banking_sdd -msgid "SEPA Direct Debit Files" -msgstr "Archivos de adeudos directos SEPA" - #. module: account_banking_sepa_direct_debit #: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.mandate_action msgid "SEPA Direct Debit Mandates" @@ -339,24 +283,16 @@ msgid "SEPA Direct Debit XML file generation" msgstr "Generación del archivo XML de adeudo directo SEPA" #. module: account_banking_sepa_direct_debit -#: model:ir.model,name:account_banking_sepa_direct_debit.model_banking_export_sdd -msgid "SEPA Direct Debit export" -msgstr "Exportación de adeudo directo SEPA" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,file:0 -msgid "SEPA File" -msgstr "Archivo SEPA" - -#. module: account_banking_sepa_direct_debit +#: view:account.banking.mandate:account_banking_sepa_direct_debit.sdd_mandate_search #: field:account.banking.mandate,scheme:0 msgid "Scheme" msgstr "Esquema" #. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd,state:0 -msgid "Sent" -msgstr "Enviado" +#: view:account.banking.mandate:account_banking_sepa_direct_debit.sdd_mandate_search +#: view:account.banking.mandate:account_banking_sepa_direct_debit.sdd_mandate_tree +msgid "Sequence Type" +msgstr "Tipo de secuencia" #. module: account_banking_sepa_direct_debit #: field:account.banking.mandate,recurrent_sequence_type:0 @@ -382,37 +318,35 @@ msgid "Sequence Type set to Recurring" msgstr "Tipo de secuencia establecida a 'Recurrente'" #. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd,charge_bearer:0 #: selection:banking.export.sdd.wizard,charge_bearer:0 msgid "Shared" msgstr "Compartidos" #. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,state:0 #: field:banking.export.sdd.wizard,state:0 msgid "State" msgstr "Estado" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:194 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:166 #, python-format msgid "The SEPA Direct Debit mandate with reference '%s' for partner '%s' has expired." msgstr "El mandato de adeudo directo SEPA con referencia '%s' para la empresa '%s' ha expirado." #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:203 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:174 #, python-format msgid "The mandate with reference '%s' for partner '%s' has type set to 'One-Off' and it has a last debit date set to '%s', so we can't use it." msgstr "El mandato con referencia '%s' para la empresa '%s' tipo como 'Único', ya tiene como fecha de último cobro '%s', por lo que no se puede usar." #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:86 +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:71 #, python-format msgid "The recurrent mandate '%s' must have a sequence type." msgstr "El mandato periódico '%s' debe tener un tipo de secuencia." #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:95 +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:80 #, python-format msgid "The recurrent mandate '%s' which is not marked as 'Migrated to SEPA' must have its recurrent sequence type set to 'First'." msgstr "El mandato periódico '%s', que no está marcado como 'Migrado a SEPA', debe establecer su tipo de secuencia a 'Inicial'." @@ -423,12 +357,12 @@ msgid "This field is only used for Recurrent mandates, not for One-Off mandates. msgstr "Este campo se utiliza sólo para mandatos periódicos, no para únicos." #. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,total_amount:0 #: field:banking.export.sdd.wizard,total_amount:0 msgid "Total Amount" msgstr "Importe total" #. module: account_banking_sepa_direct_debit +#: view:account.banking.mandate:account_banking_sepa_direct_debit.sdd_mandate_search #: view:account.banking.mandate:account_banking_sepa_direct_debit.sdd_mandate_tree msgid "Type" msgstr "Tipo" @@ -449,7 +383,7 @@ msgid "When the field 'Migrated to SEPA' is not active, this field will be used msgstr "Cuando el campo 'Migrado a SEPA' no está marcado, este campo se usa como identificación del mandato original en el archivo de adeudo directo." #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:105 +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:90 #, python-format msgid "You must set the 'Original Mandate Identification' on the recurrent mandate '%s' which is not marked as 'Migrated to SEPA'." msgstr "Debe establecer el campo 'Identificación de mandato original en el mandato periódico '%s', que no está marcado como 'Migrado a SEPA'." diff --git a/account_banking_sepa_direct_debit/wizard/export_sdd.py b/account_banking_sepa_direct_debit/wizard/export_sdd.py index 53bdd3d10..f2be2df00 100644 --- a/account_banking_sepa_direct_debit/wizard/export_sdd.py +++ b/account_banking_sepa_direct_debit/wizard/export_sdd.py @@ -158,7 +158,7 @@ class BankingExportSddWizard(models.TransientModel): raise Warning( _("Missing SEPA Direct Debit mandate on the " "bank payment line with partner '%s' " - "(reference '%s'.") + "(reference '%s').") % (line.partner_id.name, line.name)) scheme = line.mandate_id.scheme if line.mandate_id.state != 'valid': From 5bcebe7277f45c43761d5ff7049bcb32768972df Mon Sep 17 00:00:00 2001 From: Antonio Espinosa Date: Fri, 4 Mar 2016 17:15:53 +0100 Subject: [PATCH 070/118] Define SEPA identifiers per payment mode --- account_banking_sepa_direct_debit/README.rst | 4 +- .../__openerp__.py | 5 ++- .../models/__init__.py | 1 + .../models/common.py | 39 +++++++++++++++++ .../models/payment_mode.py | 42 +++++++++++++++++++ .../models/res_company.py | 37 ++-------------- .../views/payment_mode_view.xml | 24 +++++++++++ .../wizard/export_sdd.py | 4 ++ 8 files changed, 119 insertions(+), 37 deletions(-) create mode 100644 account_banking_sepa_direct_debit/models/common.py create mode 100644 account_banking_sepa_direct_debit/models/payment_mode.py create mode 100644 account_banking_sepa_direct_debit/views/payment_mode_view.xml diff --git a/account_banking_sepa_direct_debit/README.rst b/account_banking_sepa_direct_debit/README.rst index ace5ce806..10eb9754d 100644 --- a/account_banking_sepa_direct_debit/README.rst +++ b/account_banking_sepa_direct_debit/README.rst @@ -49,7 +49,7 @@ Known issues / Roadmap ====================== * No known issues - + Bug Tracker =========== @@ -64,13 +64,13 @@ Credits Contributors ------------ -* Firsname Lastname * Alexis de Lattre * Pedro M. Baeza * Stéphane Bidoul * Alexandre Fayolle * Raphaël Valyi * Sandy Carter +* Antonio Espinosa Maintainer diff --git a/account_banking_sepa_direct_debit/__openerp__.py b/account_banking_sepa_direct_debit/__openerp__.py index 953ff14f7..f4054364c 100644 --- a/account_banking_sepa_direct_debit/__openerp__.py +++ b/account_banking_sepa_direct_debit/__openerp__.py @@ -1,15 +1,17 @@ # -*- coding: utf-8 -*- # © 2013-2015 Akretion (www.akretion.com) # © 2014 Serv. Tecnol. Avanzados - Pedro M. Baeza +# © 2016 Antiun Ingenieria S.L. - Antonio Espinosa # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). { 'name': 'Account Banking SEPA Direct Debit', 'summary': 'Create SEPA files for Direct Debit', - 'version': '8.0.0.3.0', + 'version': '8.0.0.4.0', 'license': 'AGPL-3', 'author': "Akretion, " "Serv. Tecnol. Avanzados - Pedro M. Baeza, " + "Antiun Ingeniería S.L., " "Odoo Community Association (OCA)", 'website': 'https://github.com/OCA/bank-payment', 'category': 'Banking addons', @@ -21,6 +23,7 @@ 'data': [ 'views/account_banking_mandate_view.xml', 'views/res_company_view.xml', + 'views/payment_mode_view.xml', 'wizard/export_sdd_view.xml', 'data/mandate_expire_cron.xml', 'data/payment_type_sdd.xml', diff --git a/account_banking_sepa_direct_debit/models/__init__.py b/account_banking_sepa_direct_debit/models/__init__.py index ac7674156..93fb91cc8 100644 --- a/account_banking_sepa_direct_debit/models/__init__.py +++ b/account_banking_sepa_direct_debit/models/__init__.py @@ -3,3 +3,4 @@ from . import res_company from . import account_banking_mandate from . import bank_payment_line +from . import payment_mode diff --git a/account_banking_sepa_direct_debit/models/common.py b/account_banking_sepa_direct_debit/models/common.py new file mode 100644 index 000000000..dd507a4db --- /dev/null +++ b/account_banking_sepa_direct_debit/models/common.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +# © 2013 Akretion (www.akretion.com) +# © 2014 Serv. Tecnol. Avanzados - Pedro M. Baeza +# © 2016 Antiun Ingenieria S.L. - Antonio Espinosa +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +import logging + +logger = logging.getLogger(__name__) + + +def is_sepa_creditor_identifier_valid(sepa_creditor_identifier): + """Check if SEPA Creditor Identifier is valid + @param sepa_creditor_identifier: SEPA Creditor Identifier as str + or unicode + @return: True if valid, False otherwise + """ + if not isinstance(sepa_creditor_identifier, (str, unicode)): + return False + try: + sci = str(sepa_creditor_identifier).lower() + except: + logger.warning( + "SEPA Creditor ID should contain only ASCII caracters.") + return False + if len(sci) < 9: + return False + before_replacement = sci[7:] + sci[0:2] + '00' + logger.debug( + "SEPA ID check before_replacement = %s" % before_replacement) + after_replacement = '' + for char in before_replacement: + if char.isalpha(): + after_replacement += str(ord(char) - 87) + else: + after_replacement += char + logger.debug( + "SEPA ID check after_replacement = %s" % after_replacement) + return int(sci[2:4]) == (98 - (int(after_replacement) % 97)) diff --git a/account_banking_sepa_direct_debit/models/payment_mode.py b/account_banking_sepa_direct_debit/models/payment_mode.py new file mode 100644 index 000000000..9753ac319 --- /dev/null +++ b/account_banking_sepa_direct_debit/models/payment_mode.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- +# © 2016 Antiun Ingenieria S.L. - Antonio Espinosa +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from openerp import models, fields, api, exceptions, _ +from .common import is_sepa_creditor_identifier_valid + + +class PaymentMode(models.Model): + _inherit = 'payment.mode' + + sepa_creditor_identifier = fields.Char( + string='SEPA Creditor Identifier', size=35, + help="Enter the Creditor Identifier that has been attributed to your " + "company to make SEPA Direct Debits. If not defined, " + "SEPA Creditor Identifier from company will be used.\n" + "This identifier is composed of :\n" + "- your country ISO code (2 letters)\n" + "- a 2-digits checkum\n" + "- a 3-letters business code\n" + "- a country-specific identifier") + original_creditor_identifier = fields.Char( + string='Original Creditor Identifier', size=70, + help="If not defined, Original Creditor Identifier from company " + "will be used.") + + def _sepa_type_get(self): + res = super(PaymentMode, self)._sepa_type_get() + if not res: + if self.type.code and self.type.code.startswith('pain.008'): + res = 'sepa_direct_debit' + return res + + @api.one + @api.constrains('sepa_creditor_identifier') + def _check_sepa_creditor_identifier(self): + if self.sepa_creditor_identifier: + if not is_sepa_creditor_identifier_valid( + self.sepa_creditor_identifier): + raise exceptions.Warning( + _('Error'), + _("Invalid SEPA Creditor Identifier.")) diff --git a/account_banking_sepa_direct_debit/models/res_company.py b/account_banking_sepa_direct_debit/models/res_company.py index 9ce040189..8b76a9678 100644 --- a/account_banking_sepa_direct_debit/models/res_company.py +++ b/account_banking_sepa_direct_debit/models/res_company.py @@ -1,12 +1,11 @@ # -*- coding: utf-8 -*- # © 2013 Akretion (www.akretion.com) # © 2014 Serv. Tecnol. Avanzados - Pedro M. Baeza +# © 2016 Antiun Ingenieria S.L. - Antonio Espinosa # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from openerp import models, fields, api, exceptions, _ -import logging - -logger = logging.getLogger(__name__) +from .common import is_sepa_creditor_identifier_valid class ResCompany(models.Model): @@ -22,41 +21,11 @@ class ResCompany(models.Model): original_creditor_identifier = fields.Char( string='Original Creditor Identifier', size=70) - def is_sepa_creditor_identifier_valid( - self, sepa_creditor_identifier): - """Check if SEPA Creditor Identifier is valid - @param sepa_creditor_identifier: SEPA Creditor Identifier as str - or unicode - @return: True if valid, False otherwise - """ - if not isinstance(sepa_creditor_identifier, (str, unicode)): - return False - try: - sci = str(sepa_creditor_identifier).lower() - except: - logger.warning( - "SEPA Creditor ID should contain only ASCII caracters.") - return False - if len(sci) < 9: - return False - before_replacement = sci[7:] + sci[0:2] + '00' - logger.debug( - "SEPA ID check before_replacement = %s" % before_replacement) - after_replacement = '' - for char in before_replacement: - if char.isalpha(): - after_replacement += str(ord(char) - 87) - else: - after_replacement += char - logger.debug( - "SEPA ID check after_replacement = %s" % after_replacement) - return int(sci[2:4]) == (98 - (int(after_replacement) % 97)) - @api.one @api.constrains('sepa_creditor_identifier') def _check_sepa_creditor_identifier(self): if self.sepa_creditor_identifier: - if not self.is_sepa_creditor_identifier_valid( + if not is_sepa_creditor_identifier_valid( self.sepa_creditor_identifier): raise exceptions.Warning( _('Error'), diff --git a/account_banking_sepa_direct_debit/views/payment_mode_view.xml b/account_banking_sepa_direct_debit/views/payment_mode_view.xml new file mode 100644 index 000000000..9bba891d6 --- /dev/null +++ b/account_banking_sepa_direct_debit/views/payment_mode_view.xml @@ -0,0 +1,24 @@ + + + + + + + Add SEPA identifiers + payment.mode + + + + + + + + + + + + + diff --git a/account_banking_sepa_direct_debit/wizard/export_sdd.py b/account_banking_sepa_direct_debit/wizard/export_sdd.py index f2be2df00..232bb98a5 100644 --- a/account_banking_sepa_direct_debit/wizard/export_sdd.py +++ b/account_banking_sepa_direct_debit/wizard/export_sdd.py @@ -224,6 +224,8 @@ class BankingExportSddWizard(models.TransientModel): payment_info_2_0, 'CdtrSchmeId') self.generate_creditor_scheme_identification( creditor_scheme_identification_2_27, + 'self.payment_order_ids[0].mode.' + 'sepa_creditor_identifier or' 'self.payment_order_ids[0].company_id.' 'sepa_creditor_identifier', 'SEPA Creditor Identifier', {'self': self}, 'SEPA', gen_args) @@ -325,6 +327,8 @@ class BankingExportSddWizard(models.TransientModel): amendment_info_details_2_51, 'OrgnlCdtrSchmeId') self.generate_creditor_scheme_identification( ori_creditor_scheme_id_2_53, + 'self.payment_order_ids[0].mode.' + 'original_creditor_identifier or' 'self.payment_order_ids[0].company_id.' 'original_creditor_identifier', 'Original Creditor Identifier', From 5a7ee68bcafae3f75a7df98f38bf9f02885f9008 Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Wed, 9 Mar 2016 15:37:55 +0100 Subject: [PATCH 071/118] account_banking_sepa_direct_debit: Fixes #257 --- account_banking_sepa_direct_debit/wizard/export_sdd.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/account_banking_sepa_direct_debit/wizard/export_sdd.py b/account_banking_sepa_direct_debit/wizard/export_sdd.py index 232bb98a5..9b4022d46 100644 --- a/account_banking_sepa_direct_debit/wizard/export_sdd.py +++ b/account_banking_sepa_direct_debit/wizard/export_sdd.py @@ -225,7 +225,7 @@ class BankingExportSddWizard(models.TransientModel): self.generate_creditor_scheme_identification( creditor_scheme_identification_2_27, 'self.payment_order_ids[0].mode.' - 'sepa_creditor_identifier or' + 'sepa_creditor_identifier or ' 'self.payment_order_ids[0].company_id.' 'sepa_creditor_identifier', 'SEPA Creditor Identifier', {'self': self}, 'SEPA', gen_args) @@ -328,7 +328,7 @@ class BankingExportSddWizard(models.TransientModel): self.generate_creditor_scheme_identification( ori_creditor_scheme_id_2_53, 'self.payment_order_ids[0].mode.' - 'original_creditor_identifier or' + 'original_creditor_identifier or ' 'self.payment_order_ids[0].company_id.' 'original_creditor_identifier', 'Original Creditor Identifier', From b06d52b610b65de88d192e39c72d15e4c0d02764 Mon Sep 17 00:00:00 2001 From: Sergio Incaser Date: Fri, 1 Apr 2016 15:16:29 +0200 Subject: [PATCH 072/118] sepa_direct_debit_mandate: Split basic and sepa mandate --- .../__openerp__.py | 3 + .../data/report_paperformat.xml | 22 ++++ .../demo/sepa_direct_debit_demo.xml | 2 + .../models/account_banking_mandate.py | 16 +++ .../reports/sepa_direct_debit_mandate.xml | 21 +++ .../views/account_banking_mandate_view.xml | 8 +- .../report_sepa_direct_debit_mandate.xml | 120 ++++++++++++++++++ 7 files changed, 188 insertions(+), 4 deletions(-) create mode 100644 account_banking_sepa_direct_debit/data/report_paperformat.xml create mode 100644 account_banking_sepa_direct_debit/reports/sepa_direct_debit_mandate.xml create mode 100644 account_banking_sepa_direct_debit/views/report_sepa_direct_debit_mandate.xml diff --git a/account_banking_sepa_direct_debit/__openerp__.py b/account_banking_sepa_direct_debit/__openerp__.py index f4054364c..ce9eb6ee4 100644 --- a/account_banking_sepa_direct_debit/__openerp__.py +++ b/account_banking_sepa_direct_debit/__openerp__.py @@ -27,6 +27,9 @@ 'wizard/export_sdd_view.xml', 'data/mandate_expire_cron.xml', 'data/payment_type_sdd.xml', + 'data/report_paperformat.xml', + 'reports/sepa_direct_debit_mandate.xml', + 'views/report_sepa_direct_debit_mandate.xml', 'security/original_mandate_required_security.xml', ], 'demo': ['demo/sepa_direct_debit_demo.xml'], diff --git a/account_banking_sepa_direct_debit/data/report_paperformat.xml b/account_banking_sepa_direct_debit/data/report_paperformat.xml new file mode 100644 index 000000000..631dc93f7 --- /dev/null +++ b/account_banking_sepa_direct_debit/data/report_paperformat.xml @@ -0,0 +1,22 @@ + + + + + + European A4 low margin for SEPA + + A4 + 0 + 0 + Portrait + 10 + 10 + 5 + 5 + + 0 + 80 + + + + diff --git a/account_banking_sepa_direct_debit/demo/sepa_direct_debit_demo.xml b/account_banking_sepa_direct_debit/demo/sepa_direct_debit_demo.xml index 07b347f6c..bcbeb7fb8 100644 --- a/account_banking_sepa_direct_debit/demo/sepa_direct_debit_demo.xml +++ b/account_banking_sepa_direct_debit/demo/sepa_direct_debit_demo.xml @@ -19,6 +19,7 @@ + sepa recurrent first 2014-02-01 @@ -27,6 +28,7 @@ + sepa recurrent first diff --git a/account_banking_sepa_direct_debit/models/account_banking_mandate.py b/account_banking_sepa_direct_debit/models/account_banking_mandate.py index a2e9668f8..4219cee81 100644 --- a/account_banking_sepa_direct_debit/models/account_banking_mandate.py +++ b/account_banking_sepa_direct_debit/models/account_banking_mandate.py @@ -31,6 +31,10 @@ class AccountBankingMandate(models.Model): } } + format = fields.Selection( + selection_add=[('sepa', _('Sepa Mandate'))], + default='sepa', + ) type = fields.Selection([('recurrent', 'Recurrent'), ('oneoff', 'One-Off')], string='Type of Mandate', required=True, @@ -91,6 +95,18 @@ class AccountBankingMandate(models.Model): "recurrent mandate '%s' which is not marked as 'Migrated to " "SEPA'.") % self.unique_mandate_reference) + @api.model + def _get_mandate_format(self): + res = super(AccountBankingMandate, self)._get_mandate_format() + res.append(('sepa', _('Sepa Mandate'))) + return res + + + @api.model + def _default_mandate_format(self): + res = super(AccountBankingMandate, self).default_mandate_format() + return 'sepa' + @api.one @api.onchange('partner_bank_id') def mandate_partner_bank_change(self): diff --git a/account_banking_sepa_direct_debit/reports/sepa_direct_debit_mandate.xml b/account_banking_sepa_direct_debit/reports/sepa_direct_debit_mandate.xml new file mode 100644 index 000000000..1d6a9daa2 --- /dev/null +++ b/account_banking_sepa_direct_debit/reports/sepa_direct_debit_mandate.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + diff --git a/account_banking_sepa_direct_debit/views/account_banking_mandate_view.xml b/account_banking_sepa_direct_debit/views/account_banking_mandate_view.xml index 366edfaf8..0728c8616 100644 --- a/account_banking_sepa_direct_debit/views/account_banking_mandate_view.xml +++ b/account_banking_sepa_direct_debit/views/account_banking_mandate_view.xml @@ -17,9 +17,10 @@ - - - + + + @@ -124,6 +125,5 @@ Sequence Type set to Final - diff --git a/account_banking_sepa_direct_debit/views/report_sepa_direct_debit_mandate.xml b/account_banking_sepa_direct_debit/views/report_sepa_direct_debit_mandate.xml new file mode 100644 index 000000000..7d5b312c3 --- /dev/null +++ b/account_banking_sepa_direct_debit/views/report_sepa_direct_debit_mandate.xml @@ -0,0 +1,120 @@ + + + + + + + + + + From 04cd3899763beea8b4fb5561c77a4a2a150ccc65 Mon Sep 17 00:00:00 2001 From: sergio-incaser Date: Tue, 5 Apr 2016 23:11:50 +0200 Subject: [PATCH 073/118] account_banking_sepa_direct_debit: Use api.multi instead --- account_banking_sepa_direct_debit/README.rst | 1 + .../models/account_banking_mandate.py | 108 ++++++++---------- .../models/payment_mode.py | 15 +-- .../models/res_company.py | 15 +-- .../views/account_banking_mandate_view.xml | 9 +- .../report_sepa_direct_debit_mandate.xml | 4 +- 6 files changed, 75 insertions(+), 77 deletions(-) diff --git a/account_banking_sepa_direct_debit/README.rst b/account_banking_sepa_direct_debit/README.rst index 10eb9754d..04d40f4c3 100644 --- a/account_banking_sepa_direct_debit/README.rst +++ b/account_banking_sepa_direct_debit/README.rst @@ -71,6 +71,7 @@ Contributors * Raphaël Valyi * Sandy Carter * Antonio Espinosa +* Sergio Teruel Maintainer diff --git a/account_banking_sepa_direct_debit/models/account_banking_mandate.py b/account_banking_sepa_direct_debit/models/account_banking_mandate.py index 4219cee81..f3ac6d38d 100644 --- a/account_banking_sepa_direct_debit/models/account_banking_mandate.py +++ b/account_banking_sepa_direct_debit/models/account_banking_mandate.py @@ -37,7 +37,7 @@ class AccountBankingMandate(models.Model): ) type = fields.Selection([('recurrent', 'Recurrent'), ('oneoff', 'One-Off')], - string='Type of Mandate', required=True, + string='Type of Mandate', track_visibility='always') recurrent_sequence_type = fields.Selection( [('first', 'First'), @@ -63,69 +63,61 @@ class AccountBankingMandate(models.Model): "Direct Debit file.") scheme = fields.Selection([('CORE', 'Basic (CORE)'), ('B2B', 'Enterprise (B2B)')], - string='Scheme', required=True, default="CORE") + string='Scheme', default="CORE") unique_mandate_reference = fields.Char(size=35) # cf ISO 20022 - @api.one + @api.multi @api.constrains('type', 'recurrent_sequence_type') def _check_recurring_type(self): - if (self.type == 'recurrent' and - not self.recurrent_sequence_type): - raise exceptions.Warning( - _("The recurrent mandate '%s' must have a sequence type.") - % self.unique_mandate_reference) - - @api.one - @api.constrains('type', 'recurrent_sequence_type', 'sepa_migrated') - def _check_migrated_to_sepa(self): - if (self.type == 'recurrent' and not self.sepa_migrated and - self.recurrent_sequence_type != 'first'): - raise exceptions.Warning( - _("The recurrent mandate '%s' which is not marked as " - "'Migrated to SEPA' must have its recurrent sequence type " - "set to 'First'.") % self.unique_mandate_reference) - - @api.one - @api.constrains('type', 'original_mandate_identification', 'sepa_migrated') - def _check_original_mandate_identification(self): - if (self.type == 'recurrent' and not self.sepa_migrated and - not self.original_mandate_identification): - raise exceptions.Warning( - _("You must set the 'Original Mandate Identification' on the " - "recurrent mandate '%s' which is not marked as 'Migrated to " - "SEPA'.") % self.unique_mandate_reference) - - @api.model - def _get_mandate_format(self): - res = super(AccountBankingMandate, self)._get_mandate_format() - res.append(('sepa', _('Sepa Mandate'))) - return res - - - @api.model - def _default_mandate_format(self): - res = super(AccountBankingMandate, self).default_mandate_format() - return 'sepa' - - @api.one - @api.onchange('partner_bank_id') - def mandate_partner_bank_change(self): - super(AccountBankingMandate, self).mandate_partner_bank_change() - res = {} - if (self.state == 'valid' and - self.partner_bank_id and - self.type == 'recurrent' and - self.recurrent_sequence_type != 'first'): - self.recurrent_sequence_type = 'first' - res['warning'] = { - 'title': _('Mandate update'), - 'message': _("As you changed the bank account attached to " - "this mandate, the 'Sequence Type' has been set " - "back to 'First'."), - } - return res + for mandate in self: + if (mandate.type == 'recurrent' and + not mandate.recurrent_sequence_type): + raise exceptions.Warning( + _("The recurrent mandate '%s' must have a sequence type.") + % mandate.unique_mandate_reference) @api.multi + @api.constrains('type', 'recurrent_sequence_type', 'sepa_migrated') + def _check_migrated_to_sepa(self): + for mandate in self: + if (mandate.type == 'recurrent' and not mandate.sepa_migrated and + mandate.recurrent_sequence_type != 'first'): + raise exceptions.Warning( + _("The recurrent mandate '%s' which is not marked as " + "'Migrated to SEPA' must have its recurrent sequence type " + "set to 'First'.") % mandate.unique_mandate_reference) + + @api.multi + @api.constrains('type', 'original_mandate_identification', 'sepa_migrated') + def _check_original_mandate_identification(self): + for mandate in self: + if (mandate.type == 'recurrent' and not mandate.sepa_migrated and + not mandate.original_mandate_identification): + raise exceptions.Warning( + _("You must set the 'Original Mandate Identification' on the " + "recurrent mandate '%s' which is not marked as 'Migrated to " + "SEPA'.") % mandate.unique_mandate_reference) + + @api.multi + @api.onchange('partner_bank_id') + def mandate_partner_bank_change(self): + for mandate in self: + super(AccountBankingMandate, self).mandate_partner_bank_change() + res = {} + if (mandate.state == 'valid' and + mandate.partner_bank_id and + mandate.type == 'recurrent' and + mandate.recurrent_sequence_type != 'first'): + mandate.recurrent_sequence_type = 'first' + res['warning'] = { + 'title': _('Mandate update'), + 'message': _("As you changed the bank account attached to " + "this mandate, the 'Sequence Type' has been set " + "back to 'First'."), + } + return res + + @api.model def _sdd_mandate_set_state_to_expired(self): logger.info('Searching for SDD Mandates that must be set to Expired') expire_limit_date = datetime.today() + \ diff --git a/account_banking_sepa_direct_debit/models/payment_mode.py b/account_banking_sepa_direct_debit/models/payment_mode.py index 9753ac319..f3c1ac1b6 100644 --- a/account_banking_sepa_direct_debit/models/payment_mode.py +++ b/account_banking_sepa_direct_debit/models/payment_mode.py @@ -31,12 +31,13 @@ class PaymentMode(models.Model): res = 'sepa_direct_debit' return res - @api.one + @api.multi @api.constrains('sepa_creditor_identifier') def _check_sepa_creditor_identifier(self): - if self.sepa_creditor_identifier: - if not is_sepa_creditor_identifier_valid( - self.sepa_creditor_identifier): - raise exceptions.Warning( - _('Error'), - _("Invalid SEPA Creditor Identifier.")) + for payment_mode in self: + if payment_mode.sepa_creditor_identifier: + if not is_sepa_creditor_identifier_valid( + payment_mode.sepa_creditor_identifier): + raise exceptions.Warning( + _('Error'), + _("Invalid SEPA Creditor Identifier.")) diff --git a/account_banking_sepa_direct_debit/models/res_company.py b/account_banking_sepa_direct_debit/models/res_company.py index 8b76a9678..c57dc8b04 100644 --- a/account_banking_sepa_direct_debit/models/res_company.py +++ b/account_banking_sepa_direct_debit/models/res_company.py @@ -21,12 +21,13 @@ class ResCompany(models.Model): original_creditor_identifier = fields.Char( string='Original Creditor Identifier', size=70) - @api.one + @api.multi @api.constrains('sepa_creditor_identifier') def _check_sepa_creditor_identifier(self): - if self.sepa_creditor_identifier: - if not is_sepa_creditor_identifier_valid( - self.sepa_creditor_identifier): - raise exceptions.Warning( - _('Error'), - _("Invalid SEPA Creditor Identifier.")) + for company in self: + if company.sepa_creditor_identifier: + if not is_sepa_creditor_identifier_valid( + company.sepa_creditor_identifier): + raise exceptions.Warning( + _('Error'), + _("Invalid SEPA Creditor Identifier.")) diff --git a/account_banking_sepa_direct_debit/views/account_banking_mandate_view.xml b/account_banking_sepa_direct_debit/views/account_banking_mandate_view.xml index 0728c8616..667cedb54 100644 --- a/account_banking_sepa_direct_debit/views/account_banking_mandate_view.xml +++ b/account_banking_sepa_direct_debit/views/account_banking_mandate_view.xml @@ -17,10 +17,13 @@ - + - + attrs="{'invisible': ['|', ('type', '=', 'oneoff'), ('format', '!=', 'sepa')], + 'required': [('type', '=', 'recurrent')]}"/> + diff --git a/account_banking_sepa_direct_debit/views/report_sepa_direct_debit_mandate.xml b/account_banking_sepa_direct_debit/views/report_sepa_direct_debit_mandate.xml index 7d5b312c3..42705e28a 100644 --- a/account_banking_sepa_direct_debit/views/report_sepa_direct_debit_mandate.xml +++ b/account_banking_sepa_direct_debit/views/report_sepa_direct_debit_mandate.xml @@ -46,9 +46,9 @@
-

By signing this mandate form, you authorise (A) +

By signing this mandate form, you authorise (A) to send instructions to your bank to debit your account and (B) your bank to - debit your account in accordance with the instructions from . + debit your account in accordance with the instructions from .

From c96d5bb7452b5d8ded4c6e5a8f0d0dcab742cb56 Mon Sep 17 00:00:00 2001 From: Sergio Incaser Date: Wed, 6 Apr 2016 09:12:55 +0200 Subject: [PATCH 074/118] sepa_direct_debit_mandate: Migration script --- account_banking_sepa_direct_debit/__openerp__.py | 2 +- .../migrations/8.0.0.5/post-migration.py | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 account_banking_sepa_direct_debit/migrations/8.0.0.5/post-migration.py diff --git a/account_banking_sepa_direct_debit/__openerp__.py b/account_banking_sepa_direct_debit/__openerp__.py index ce9eb6ee4..7f7de6752 100644 --- a/account_banking_sepa_direct_debit/__openerp__.py +++ b/account_banking_sepa_direct_debit/__openerp__.py @@ -7,7 +7,7 @@ { 'name': 'Account Banking SEPA Direct Debit', 'summary': 'Create SEPA files for Direct Debit', - 'version': '8.0.0.4.0', + 'version': '8.0.0.5.0', 'license': 'AGPL-3', 'author': "Akretion, " "Serv. Tecnol. Avanzados - Pedro M. Baeza, " diff --git a/account_banking_sepa_direct_debit/migrations/8.0.0.5/post-migration.py b/account_banking_sepa_direct_debit/migrations/8.0.0.5/post-migration.py new file mode 100644 index 000000000..958a1af7d --- /dev/null +++ b/account_banking_sepa_direct_debit/migrations/8.0.0.5/post-migration.py @@ -0,0 +1,13 @@ +# -*- coding: utf-8 -*- +# © 2016 Sergio Teruel +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + + +def migrate(cr, version): + if not version: + return + + cr.execute(''' + UPDATE account_banking_mandate SET format='sepa' + ''') + return From 01ee118e94241f0be7f93b52873c6e077a0647e7 Mon Sep 17 00:00:00 2001 From: Sergio Incaser Date: Wed, 6 Apr 2016 11:00:56 +0200 Subject: [PATCH 075/118] account_banking_sepa_direct_debit: Pep8 fixes --- .../models/account_banking_mandate.py | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/account_banking_sepa_direct_debit/models/account_banking_mandate.py b/account_banking_sepa_direct_debit/models/account_banking_mandate.py index f3ac6d38d..ca2381204 100644 --- a/account_banking_sepa_direct_debit/models/account_banking_mandate.py +++ b/account_banking_sepa_direct_debit/models/account_banking_mandate.py @@ -81,11 +81,12 @@ class AccountBankingMandate(models.Model): def _check_migrated_to_sepa(self): for mandate in self: if (mandate.type == 'recurrent' and not mandate.sepa_migrated and - mandate.recurrent_sequence_type != 'first'): + mandate.recurrent_sequence_type != 'first'): raise exceptions.Warning( _("The recurrent mandate '%s' which is not marked as " - "'Migrated to SEPA' must have its recurrent sequence type " - "set to 'First'.") % mandate.unique_mandate_reference) + "'Migrated to SEPA' must have its recurrent sequence " + "type set to 'First'.") + % mandate.unique_mandate_reference) @api.multi @api.constrains('type', 'original_mandate_identification', 'sepa_migrated') @@ -94,9 +95,10 @@ class AccountBankingMandate(models.Model): if (mandate.type == 'recurrent' and not mandate.sepa_migrated and not mandate.original_mandate_identification): raise exceptions.Warning( - _("You must set the 'Original Mandate Identification' on the " - "recurrent mandate '%s' which is not marked as 'Migrated to " - "SEPA'.") % mandate.unique_mandate_reference) + _("You must set the 'Original Mandate Identification' on " + "the recurrent mandate '%s' which is not marked as " + "'Migrated to SEPA'.") + % mandate.unique_mandate_reference) @api.multi @api.onchange('partner_bank_id') @@ -111,9 +113,9 @@ class AccountBankingMandate(models.Model): mandate.recurrent_sequence_type = 'first' res['warning'] = { 'title': _('Mandate update'), - 'message': _("As you changed the bank account attached to " - "this mandate, the 'Sequence Type' has been set " - "back to 'First'."), + 'message': _("As you changed the bank account attached " + "to this mandate, the 'Sequence Type' has " + "been set back to 'First'."), } return res From 4b982c843cb0976e15afa057f30cf94bba3d9150 Mon Sep 17 00:00:00 2001 From: sergio-incaser Date: Wed, 6 Apr 2016 21:47:45 +0200 Subject: [PATCH 076/118] account_banking_sepa_direct_debit: Fix translation --- account_banking_sepa_direct_debit/i18n/es.po | 375 ++++++++++++++++--- 1 file changed, 332 insertions(+), 43 deletions(-) diff --git a/account_banking_sepa_direct_debit/i18n/es.po b/account_banking_sepa_direct_debit/i18n/es.po index 1255410e6..ce10768cd 100644 --- a/account_banking_sepa_direct_debit/i18n/es.po +++ b/account_banking_sepa_direct_debit/i18n/es.po @@ -1,32 +1,38 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: -# * account_banking_sepa_direct_debit +# * account_banking_sepa_direct_debit # msgid "" msgstr "" "Project-Id-Version: Odoo Server 8.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-02-16 07:53+0000\n" -"PO-Revision-Date: 2016-02-16 07:53+0000\n" -"Last-Translator: <>\n" +"POT-Creation-Date: 2016-04-05 20:32+0000\n" +"PO-Revision-Date: 2016-04-05 23:01+0100\n" +"Last-Translator: Sergio Teruel \n" "Language-Team: \n" +"Language: es_ES\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Plural-Forms: \n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.5.4\n" #. module: account_banking_sepa_direct_debit #: model:ir.actions.act_window,help:account_banking_sepa_direct_debit.mandate_action -msgid "

\n" +msgid "" +"

\n" " Click to create a new SEPA Direct Debit Mandate.\n" "

\n" -" A SEPA Direct Debit Mandate is a document signed by your customer that gives you the autorization to do one or several direct debits on his bank account.\n" +" A SEPA Direct Debit Mandate is a document signed by your customer " +"that gives you the autorization to do one or several direct debits on his " +"bank account.\n" "

\n" " " -msgstr "

\n" +msgstr "" +"

\n" " Pulse para crear un nuevo mandato bancario.\n" "

\n" -" Un mandato bancario es un documento firmado por su cliente que le da la autorización para hacer una o varias operaciones en su cuenta bancaria.\n" +" Un mandato bancario es un documento firmado por su cliente que le da " +"la autorización para hacer una o varias operaciones en su cuenta bancaria.\n" "

\n" " " @@ -36,10 +42,70 @@ msgid "A generic banking mandate" msgstr "Un mandato bancario genérico" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:106 +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "" +"ALL GAPS ARE MANDATORY. ONCE THIS MANDATE HAS BEEN SIGNED MUST BE SENT TO " +"CREDITOR FOR STORAGE." +msgstr "" +"TODOS LOS CAMPOS HAN DE SER CUMPLIMENTADOS OBLIGATORIAMENTE. UNA VEZ FIRMADA " +"ESTA ORDEN DE DOMICILIACIÓN DEBE SER ENVIADA AL ACREEDOR PARA SU CUSTODIA." + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "" +"ALL GAPS ARE MANDATORY. ONCE THIS MANDATE HAS BEEN SIGNED MUST BE SENT TO " +"CREDITOR FOR STORAGE.\n" +" NEVERTHELESS, THE BANK OF DEBTOR REQUIRES DEBTOR’S " +"AUTHORIZATION BEFORE DEBITING B2B DIRECT DEBITS IN THE ACCOUNT.\n" +" THE DEBTOR WILL BE ABLE TO MANAGE THE MENTIONED " +"AUTHORIZATION THROUGH THE MEANS PROVIDED BY HIS BANK." +msgstr "" +"TODOS LOS CAMPOS HAN DE SER CUMPLIMENTADOS OBLIGATORIAMENTE. UNA VEZ FIRMADA " +"ESTA ORDEN DE DOMICILIACIÓN DEBE SER ENVIADA AL ACREEDOR PARA SU CUSTODIA.LA " +"ENTIDAD DE DEUDOR REQUIERE AUTORIZACIÓN DE ÉSTE PREVIA AL CARGO EN CUENTA DE " +"LOS ADEUDOS DIRECTOS B2B.EL DEUDOR PODRÁ GESTIONAR DICHA AUTORIZACIÓN CON " +"LOS MEDIOS QUE SU ENTIDAD PONGA A SU DISPOSICIÓN." + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Account Number - IBAN:" +msgstr "Número de cuenta - IBAN:" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Address of the Debtor:" +msgstr "Dirección del deudor:" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Address:" +msgstr "Dirección:" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "" +"As part of your rights, you are entitled to a refund from\n" +" your bank under the terms and conditions of your " +"agreement\n" +" with your bank.\n" +" A refund must be claimed within 8 weeks starting " +"from the date on which your account was debited." +msgstr "" +"Como parte de sus derechos, el deudor está legitimado al reembolso por su " +"entidad en los términos y condiciones del contrato suscrito con la misma. La " +"solicitud de reembolso deberá efectuarse dentro de las ocho semanas que " +"siguen a la fecha de adeudo en cuenta. Puede obtener información adicional " +"sobre sus derechos en su entidad financiera." + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:110 #, python-format -msgid "As you changed the bank account attached to this mandate, the 'Sequence Type' has been set back to 'First'." -msgstr "Puesto que ha cambiado la cuenta bancaria relacionada con este mandato, el 'Tipo de secuencia' se ha vuelto a 'Inicial'." +msgid "" +"As you changed the bank account attached to this mandate, the 'Sequence " +"Type' has been set back to 'First'." +msgstr "" +"Puesto que ha cambiado la cuenta bancaria relacionada con este mandato, el " +"'Tipo de secuencia' se ha vuelto a 'Inicial'." #. module: account_banking_sepa_direct_debit #: model:ir.model,name:account_banking_sepa_direct_debit.model_bank_payment_line @@ -66,6 +132,12 @@ msgstr "A cargo del acreedor" msgid "Borne by Debtor" msgstr "A cargo del deudor" +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "By signing this mandate form, you authorise (A)" +msgstr "" +"Mediante la firma de esta orden de domiciliación, el deudor autoriza (A) " + #. module: account_banking_sepa_direct_debit #: view:banking.export.sdd.wizard:account_banking_sepa_direct_debit.banking_export_sdd_wizard_view msgid "Cancel" @@ -81,6 +153,16 @@ msgstr "A cargo del portador" msgid "Companies" msgstr "Compañías" +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Country of the debtor:" +msgstr "País del deudor:" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Country:" +msgstr "País:" + #. module: account_banking_sepa_direct_debit #: selection:banking.export.sdd.wizard,state:0 msgid "Create" @@ -97,13 +179,53 @@ msgid "Created on" msgstr "Creado en" #. module: account_banking_sepa_direct_debit -#: help:res.company,sepa_creditor_identifier:0 -msgid "Enter the Creditor Identifier that has been attributed to your company to make SEPA Direct Debits. This identifier is composed of :\n" +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Creditor's Name:" +msgstr "Nombre del acreedor:" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Date - Location:" +msgstr "Fecha - Localidad:" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Debtor's Name:" +msgstr "Nombre del deudor:" + +#. module: account_banking_sepa_direct_debit +#: help:payment.mode,sepa_creditor_identifier:0 +msgid "" +"Enter the Creditor Identifier that has been attributed to your company to " +"make SEPA Direct Debits. If not defined, SEPA Creditor Identifier from " +"company will be used.\n" +"This identifier is composed of :\n" "- your country ISO code (2 letters)\n" "- a 2-digits checkum\n" "- a 3-letters business code\n" "- a country-specific identifier" -msgstr "Introduzca el identificador de acreedor que se le ha atribuido a su compañía para realizar adeudos directos SEPA. Su banco suele poseer esta información. Este identificador se compone de:\n" +msgstr "" +"Introduzca el identificador de acreedor que se le ha atribuido a su compañía " +"para realizar adeudos directos SEPA. Su banco suele poseer esta información. " +"Este identificador se compone de:\n" +"- el código ISO de 2 letras de su país\n" +"- dos dígitos de comprobación\n" +"- tres letras de código de negocio\n" +"- un identificador específico de país (en España, el NIF)" + +#. module: account_banking_sepa_direct_debit +#: help:res.company,sepa_creditor_identifier:0 +msgid "" +"Enter the Creditor Identifier that has been attributed to your company to " +"make SEPA Direct Debits. This identifier is composed of :\n" +"- your country ISO code (2 letters)\n" +"- a 2-digits checkum\n" +"- a 3-letters business code\n" +"- a country-specific identifier" +msgstr "" +"Introduzca el identificador de acreedor que se le ha atribuido a su compañía " +"para realizar adeudos directos SEPA. Su banco suele poseer esta información. " +"Este identificador se compone de:\n" "- el código ISO de 2 letras de su país\n" "- dos dígitos de comprobación\n" "- tres letras de código de negocio\n" @@ -115,7 +237,8 @@ msgid "Enterprise (B2B)" msgstr "Empresa (B2B)" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/models/res_company.py:62 +#: code:addons/account_banking_sepa_direct_debit/models/payment_mode.py:41 +#: code:addons/account_banking_sepa_direct_debit/models/res_company.py:31 #, python-format msgid "Error" msgstr "Error" @@ -157,8 +280,23 @@ msgstr "Según el acuerdo de servicio" #. module: account_banking_sepa_direct_debit #: help:banking.export.sdd.wizard,charge_bearer:0 -msgid "Following service level : transaction charges are to be applied following the rules agreed in the service level and/or scheme (SEPA Core messages must use this). Shared : transaction charges on the creditor side are to be borne by the creditor, transaction charges on the debtor side are to be borne by the debtor. Borne by creditor : all transaction charges are to be borne by the creditor. Borne by debtor : all transaction charges are to be borne by the debtor." -msgstr "Según el acuerdo de servicio: los costes de la transacción se aplicarán siguiendo las reglas acordadas en el nivel de servicio y/o en el esquema (las remesas SEPA Core deben usar esta opción). Compartidos: los costes de la transacción en la parte del acreedor están a cargo del acreedor, y los costes de la transacción del lado del deudor estarán a cargo del deudor. A cargo del acreedor: todos los costes de la transacción estarán a cargo del acreedor. A cargo del deudor: Todos los costes de la transacción estarán a cargo del deudor." +msgid "" +"Following service level : transaction charges are to be applied following " +"the rules agreed in the service level and/or scheme (SEPA Core messages must " +"use this). Shared : transaction charges on the creditor side are to be borne " +"by the creditor, transaction charges on the debtor side are to be borne by " +"the debtor. Borne by creditor : all transaction charges are to be borne by " +"the creditor. Borne by debtor : all transaction charges are to be borne by " +"the debtor." +msgstr "" +"Según el acuerdo de servicio: los costes de la transacción se aplicarán " +"siguiendo las reglas acordadas en el nivel de servicio y/o en el esquema " +"(las remesas SEPA Core deben usar esta opción). Compartidos: los costes de " +"la transacción en la parte del acreedor están a cargo del acreedor, y los " +"costes de la transacción del lado del deudor estarán a cargo del deudor. A " +"cargo del acreedor: todos los costes de la transacción estarán a cargo del " +"acreedor. A cargo del deudor: Todos los costes de la transacción estarán a " +"cargo del deudor." #. module: account_banking_sepa_direct_debit #: view:banking.export.sdd.wizard:account_banking_sepa_direct_debit.banking_export_sdd_wizard_view @@ -170,18 +308,48 @@ msgstr "Generar" msgid "ID" msgstr "ID" +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Identifier:" +msgstr "Identificador:" + +#. module: account_banking_sepa_direct_debit +#: help:payment.mode,original_creditor_identifier:0 +msgid "If not defined, Original Creditor Identifier from company will be used." +msgstr "" + #. module: account_banking_sepa_direct_debit #: help:account.banking.mandate,sepa_migrated:0 -msgid "If this field is not active, the mandate section of the next direct debit file that include this mandate will contain the 'Original Mandate Identification' and the 'Original Creditor Scheme Identification'. This is required in a few countries (Belgium for instance), but not in all countries. If this is not required in your country, you should keep this field always active." -msgstr "Si este campo no está marcado, la sección 'mandato' del próximo archivo de adeudo directo que lo incluya contendrá el valor de los campos 'Identificación del mandato original' y 'Identificación del esquema original del acreedor'. Esto se requiere en algunos países (Bélgica por ejemplo), pero no en todos ellos. Si no es un requisito en su país, este campo siempre debe estar marcado." +msgid "" +"If this field is not active, the mandate section of the next direct debit " +"file that include this mandate will contain the 'Original Mandate " +"Identification' and the 'Original Creditor Scheme Identification'. This is " +"required in a few countries (Belgium for instance), but not in all " +"countries. If this is not required in your country, you should keep this " +"field always active." +msgstr "" +"Si este campo no está marcado, la sección 'mandato' del próximo archivo de " +"adeudo directo que lo incluya contendrá el valor de los campos " +"'Identificación del mandato original' y 'Identificación del esquema original " +"del acreedor'. Esto se requiere en algunos países (Bélgica por ejemplo), " +"pero no en todos ellos. Si no es un requisito en su país, este campo siempre " +"debe estar marcado." #. module: account_banking_sepa_direct_debit #: help:banking.export.sdd.wizard,batch_booking:0 -msgid "If true, the bank statement will display only one credit line for all the direct debits of the SEPA file ; if false, the bank statement will display one credit line per direct debit of the SEPA file." -msgstr "Si está marcado, el extracto bancario mostrará sólo una línea del haber para todos los adeudos directos del archivo SEPA; si no está marcado, entonces el extracto bancario mostrará una línea por cada adeudo directo del archivo SEPA." +msgid "" +"If true, the bank statement will display only one credit line for all the " +"direct debits of the SEPA file ; if false, the bank statement will display " +"one credit line per direct debit of the SEPA file." +msgstr "" +"Si está marcado, el extracto bancario mostrará sólo una línea del haber para " +"todos los adeudos directos del archivo SEPA; si no está marcado, entonces el " +"extracto bancario mostrará una línea por cada adeudo directo del archivo " +"SEPA." #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/models/res_company.py:63 +#: code:addons/account_banking_sepa_direct_debit/models/payment_mode.py:42 +#: code:addons/account_banking_sepa_direct_debit/models/res_company.py:32 #, python-format msgid "Invalid SEPA Creditor Identifier." msgstr "Identificador de acreedor SEPA no válido." @@ -197,7 +365,12 @@ msgid "Last Updated on" msgstr "Última actualización en" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:105 +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Mandate Reference:" +msgstr "Referencia del mandato:" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:109 #, python-format msgid "Mandate update" msgstr "Actualizacion de mandato" @@ -210,8 +383,12 @@ msgstr "Migrado a SEPA" #. module: account_banking_sepa_direct_debit #: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:159 #, python-format -msgid "Missing SEPA Direct Debit mandate on the bank payment line with partner '%s' (reference '%s')." -msgstr "Falta el mandato de adeudo directo SEPA en la linea de pago bancario con la empresa '%s' (referencia '%s')." +msgid "" +"Missing SEPA Direct Debit mandate on the bank payment line with partner " +"'%s' (reference '%s')." +msgstr "" +"Falta el mandato de adeudo directo SEPA en la linea de pago bancario con la " +"empresa '%s' (referencia '%s')." #. module: account_banking_sepa_direct_debit #: field:banking.export.sdd.wizard,nb_transactions:0 @@ -221,10 +398,12 @@ msgstr "Nº de transacciones" #. module: account_banking_sepa_direct_debit #: view:account.banking.mandate:account_banking_sepa_direct_debit.sdd_mandate_search #: selection:account.banking.mandate,type:0 +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document msgid "One-Off" msgstr "Único" #. module: account_banking_sepa_direct_debit +#: field:payment.mode,original_creditor_identifier:0 #: field:res.company,original_creditor_identifier:0 msgid "Original Creditor Identifier" msgstr "Identificador del acreedor original" @@ -239,6 +418,11 @@ msgstr "Identificación del mandato original" msgid "Original Mandate Required (SEPA)" msgstr "Mandato original requerido (SEPA)" +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_payment_mode +msgid "Payment Mode" +msgstr "Modo de pago" + #. module: account_banking_sepa_direct_debit #: field:banking.export.sdd.wizard,payment_order_ids:0 msgid "Payment Orders" @@ -247,12 +431,24 @@ msgstr "Órdenes de pago" #. module: account_banking_sepa_direct_debit #: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:117 #, python-format -msgid "Payment Type Code '%s' is not supported. The only Payment Type Code supported for SEPA Direct Debit are 'pain.008.001.02', 'pain.008.001.03' and 'pain.008.001.04'." -msgstr "El código de tipo de pago '%s' no está soportado. Los únicos códigos de tipo de pago soportados para los adedudos directos SEPA son 'pain.008.001.02', 'pain.008.001.03' y 'pain.008.001.04'." +msgid "" +"Payment Type Code '%s' is not supported. The only Payment Type Code " +"supported for SEPA Direct Debit are 'pain.008.001.02', 'pain.008.001.03' and " +"'pain.008.001.04'." +msgstr "" +"El código de tipo de pago '%s' no está soportado. Los únicos códigos de tipo " +"de pago soportados para los adedudos directos SEPA son 'pain.008.001.02', " +"'pain.008.001.03' y 'pain.008.001.04'." + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Postal Code - City - Town:" +msgstr "Código postal - Población - Provincia:" #. module: account_banking_sepa_direct_debit #: view:account.banking.mandate:account_banking_sepa_direct_debit.sdd_mandate_search #: selection:account.banking.mandate,type:0 +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document msgid "Recurrent" msgstr "Recurrente" @@ -268,6 +464,7 @@ msgid "SDD Mandates" msgstr "Mandatos SDD" #. module: account_banking_sepa_direct_debit +#: field:payment.mode,sepa_creditor_identifier:0 #: field:res.company,sepa_creditor_identifier:0 msgid "SEPA Creditor Identifier" msgstr "Identificador de acreedor SEPA" @@ -288,6 +485,23 @@ msgstr "Generación del archivo XML de adeudo directo SEPA" msgid "Scheme" msgstr "Esquema" +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Sepa Business-To-Business Direct debit Mandate" +msgstr "Orden de domiciliación de adeudo directo SEPA B2B" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Sepa Direct Debit Mandate" +msgstr "Mandatos de adeudos directos SEPA" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:35 +#: model:ir.actions.report.xml,name:account_banking_sepa_direct_debit.report_sepa_direct_debit_mandate +#, python-format +msgid "Sepa Mandate" +msgstr "Mandato SEPA" + #. module: account_banking_sepa_direct_debit #: view:account.banking.mandate:account_banking_sepa_direct_debit.sdd_mandate_search #: view:account.banking.mandate:account_banking_sepa_direct_debit.sdd_mandate_tree @@ -322,40 +536,91 @@ msgstr "Tipo de secuencia establecida a 'Recurrente'" msgid "Shared" msgstr "Compartidos" +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Signature of the debtor:" +msgstr "Firma del deudor:" + #. module: account_banking_sepa_direct_debit #: field:banking.export.sdd.wizard,state:0 msgid "State" msgstr "Estado" +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Swift BIC (up to 8 or 11 characteres):" +msgstr "Swift BIC (puede contener 8 u 11 posiciones):" + #. module: account_banking_sepa_direct_debit #: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:166 #, python-format -msgid "The SEPA Direct Debit mandate with reference '%s' for partner '%s' has expired." -msgstr "El mandato de adeudo directo SEPA con referencia '%s' para la empresa '%s' ha expirado." +msgid "" +"The SEPA Direct Debit mandate with reference '%s' for partner '%s' has " +"expired." +msgstr "" +"El mandato de adeudo directo SEPA con referencia '%s' para la empresa '%s' " +"ha expirado." #. module: account_banking_sepa_direct_debit #: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:174 #, python-format -msgid "The mandate with reference '%s' for partner '%s' has type set to 'One-Off' and it has a last debit date set to '%s', so we can't use it." -msgstr "El mandato con referencia '%s' para la empresa '%s' tipo como 'Único', ya tiene como fecha de último cobro '%s', por lo que no se puede usar." +msgid "" +"The mandate with reference '%s' for partner '%s' has type set to 'One-Off' " +"and it has a last debit date set to '%s', so we can't use it." +msgstr "" +"El mandato con referencia '%s' para la empresa '%s' tipo como 'Único', ya " +"tiene como fecha de último cobro '%s', por lo que no se puede usar." #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:71 +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:75 #, python-format msgid "The recurrent mandate '%s' must have a sequence type." msgstr "El mandato periódico '%s' debe tener un tipo de secuencia." #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:80 +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:84 #, python-format -msgid "The recurrent mandate '%s' which is not marked as 'Migrated to SEPA' must have its recurrent sequence type set to 'First'." -msgstr "El mandato periódico '%s', que no está marcado como 'Migrado a SEPA', debe establecer su tipo de secuencia a 'Inicial'." +msgid "" +"The recurrent mandate '%s' which is not marked as 'Migrated to SEPA' must " +"have its recurrent sequence type set to 'First'." +msgstr "" +"El mandato periódico '%s', que no está marcado como 'Migrado a SEPA', debe " +"establecer su tipo de secuencia a 'Inicial'." #. module: account_banking_sepa_direct_debit #: help:account.banking.mandate,recurrent_sequence_type:0 -msgid "This field is only used for Recurrent mandates, not for One-Off mandates." +msgid "" +"This field is only used for Recurrent mandates, not for One-Off mandates." msgstr "Este campo se utiliza sólo para mandatos periódicos, no para únicos." +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "" +"This mandate is only intended for business-to-business transactions.\n" +" You are not entitled to a refund from your bank " +"after your account has\n" +" been debited, but you are entitled to request your " +"bank\n" +" not to debit your account up until the day on which " +"the payment is due." +msgstr "" +"Esta orden de domiciliación está prevista para operaciones exclusivamente " +"entre empresas y/o autónomos. El deudor no tiene derecho a que su entidad le " +"reembolse una vez que se haya realizado el cargo en cuenta, pero puede " +"solicitar a su entidad que no efectúe el adeudo en la cuenta hasta la fecha " +"debida. Podrá obtener información detallada del procedimiento en su entidad " +"financiera." + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "To be completed by the creditor" +msgstr "A cumplimentar por el acreedor" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "To be completed by the debtor" +msgstr "A cumplimentar por el deudor" + #. module: account_banking_sepa_direct_debit #: field:banking.export.sdd.wizard,total_amount:0 msgid "Total Amount" @@ -372,6 +637,11 @@ msgstr "Tipo" msgid "Type of Mandate" msgstr "Tipo de mandato" +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Type of payment:" +msgstr "Tipo de pago" + #. module: account_banking_sepa_direct_debit #: view:banking.export.sdd.wizard:account_banking_sepa_direct_debit.banking_export_sdd_wizard_view msgid "Validate" @@ -379,12 +649,31 @@ msgstr "Validar" #. module: account_banking_sepa_direct_debit #: help:account.banking.mandate,original_mandate_identification:0 -msgid "When the field 'Migrated to SEPA' is not active, this field will be used as the Original Mandate Identification in the Direct Debit file." -msgstr "Cuando el campo 'Migrado a SEPA' no está marcado, este campo se usa como identificación del mandato original en el archivo de adeudo directo." +msgid "" +"When the field 'Migrated to SEPA' is not active, this field will be used as " +"the Original Mandate Identification in the Direct Debit file." +msgstr "" +"Cuando el campo 'Migrado a SEPA' no está marcado, este campo se usa como " +"identificación del mandato original en el archivo de adeudo directo." #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:90 +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:94 #, python-format -msgid "You must set the 'Original Mandate Identification' on the recurrent mandate '%s' which is not marked as 'Migrated to SEPA'." -msgstr "Debe establecer el campo 'Identificación de mandato original en el mandato periódico '%s', que no está marcado como 'Migrado a SEPA'." +msgid "" +"You must set the 'Original Mandate Identification' on the recurrent mandate " +"'%s' which is not marked as 'Migrated to SEPA'." +msgstr "" +"Debe establecer el campo 'Identificación de mandato original en el mandato " +"periódico '%s', que no está marcado como 'Migrado a SEPA'." +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "" +"to send instructions to your bank to debit your account and (B) your bank " +"to\n" +" debit your account in accordance with the " +"instructions from" +msgstr "" +"a enviar instrucciones a la entidad del deudor para adeudar su cuenta y (B) " +"a la entidad para efectuar los adeudos en su cuenta siguiendo las " +"instrucciones del acreedor " From 417ef1e9654f6b5cea5fbfd9076e5897e3cee04e Mon Sep 17 00:00:00 2001 From: Sergio Incaser Date: Thu, 7 Apr 2016 16:24:02 +0200 Subject: [PATCH 077/118] account_banking_sepa_direct_debit: Report font size smallest --- .../views/report_sepa_direct_debit_mandate.xml | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/account_banking_sepa_direct_debit/views/report_sepa_direct_debit_mandate.xml b/account_banking_sepa_direct_debit/views/report_sepa_direct_debit_mandate.xml index 42705e28a..eb850815b 100644 --- a/account_banking_sepa_direct_debit/views/report_sepa_direct_debit_mandate.xml +++ b/account_banking_sepa_direct_debit/views/report_sepa_direct_debit_mandate.xml @@ -14,6 +14,9 @@ .panel-default{ border:2px solid; } + p{ + font-size: 8px; + }
@@ -27,7 +30,7 @@
- To be completed by the creditor + To be completed by the creditor
Mandate Reference:
Identifier:
@@ -44,7 +47,7 @@
-
+

By signing this mandate form, you authorise (A) to send instructions to your bank to debit your account and (B) your bank to @@ -52,7 +55,7 @@

-
+

This mandate is only intended for business-to-business transactions. @@ -71,7 +74,7 @@

- To be completed by the debtor + To be completed by the debtor
Debtor's Name:
Address of the Debtor:
@@ -98,7 +101,7 @@
-
+

ALL GAPS ARE MANDATORY. ONCE THIS MANDATE HAS BEEN SIGNED MUST BE SENT TO CREDITOR FOR STORAGE.

ALL GAPS ARE MANDATORY. ONCE THIS MANDATE HAS BEEN SIGNED MUST BE SENT TO CREDITOR FOR STORAGE. NEVERTHELESS, THE BANK OF DEBTOR REQUIRES DEBTOR’S AUTHORIZATION BEFORE DEBITING B2B DIRECT DEBITS IN THE ACCOUNT. From a99a1348a38d9bcbc129b7dbc12e47e7b5908e2f Mon Sep 17 00:00:00 2001 From: OCA Transbot Date: Sat, 9 Apr 2016 02:15:34 -0400 Subject: [PATCH 078/118] OCA Transbot updated translations from Transifex --- account_banking_sepa_direct_debit/i18n/en.po | 588 +++++++++ account_banking_sepa_direct_debit/i18n/es.po | 221 +--- account_banking_sepa_direct_debit/i18n/fr.po | 1155 +++++++--------- account_banking_sepa_direct_debit/i18n/nl.po | 1165 +++++++---------- .../i18n/pt_BR.po | 588 +++++++++ account_banking_sepa_direct_debit/i18n/sl.po | 589 +++++++++ 6 files changed, 2827 insertions(+), 1479 deletions(-) create mode 100644 account_banking_sepa_direct_debit/i18n/en.po create mode 100644 account_banking_sepa_direct_debit/i18n/pt_BR.po create mode 100644 account_banking_sepa_direct_debit/i18n/sl.po diff --git a/account_banking_sepa_direct_debit/i18n/en.po b/account_banking_sepa_direct_debit/i18n/en.po new file mode 100644 index 000000000..ee6d51576 --- /dev/null +++ b/account_banking_sepa_direct_debit/i18n/en.po @@ -0,0 +1,588 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_banking_sepa_direct_debit +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: bank-payment (8.0)\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-04-08 00:46+0000\n" +"PO-Revision-Date: 2016-04-07 16:04+0000\n" +"Last-Translator: OCA Transbot \n" +"Language-Team: English (http://www.transifex.com/oca/OCA-bank-payment-8-0/language/en/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: en\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: account_banking_sepa_direct_debit +#: model:ir.actions.act_window,help:account_banking_sepa_direct_debit.mandate_action +msgid "" +"

\n" +" Click to create a new SEPA Direct Debit Mandate.\n" +"

\n" +" A SEPA Direct Debit Mandate is a document signed by your customer that gives you the autorization to do one or several direct debits on his bank account.\n" +"

\n" +" " +msgstr "

\n Click to create a new SEPA Direct Debit Mandate.\n

\n A SEPA Direct Debit Mandate is a document signed by your customer that gives you the autorization to do one or several direct debits on his bank account.\n

\n " + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_account_banking_mandate +msgid "A generic banking mandate" +msgstr "A generic banking mandate" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "" +"ALL GAPS ARE MANDATORY. ONCE THIS MANDATE HAS BEEN SIGNED MUST BE SENT TO " +"CREDITOR FOR STORAGE." +msgstr "ALL GAPS ARE MANDATORY. ONCE THIS MANDATE HAS BEEN SIGNED MUST BE SENT TO CREDITOR FOR STORAGE." + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "" +"ALL GAPS ARE MANDATORY. ONCE THIS MANDATE HAS BEEN SIGNED MUST BE SENT TO CREDITOR FOR STORAGE.\n" +" NEVERTHELESS, THE BANK OF DEBTOR REQUIRES DEBTOR’S AUTHORIZATION BEFORE DEBITING B2B DIRECT DEBITS IN THE ACCOUNT.\n" +" THE DEBTOR WILL BE ABLE TO MANAGE THE MENTIONED AUTHORIZATION THROUGH THE MEANS PROVIDED BY HIS BANK." +msgstr "ALL GAPS ARE MANDATORY. ONCE THIS MANDATE HAS BEEN SIGNED MUST BE SENT TO CREDITOR FOR STORAGE.\n NEVERTHELESS, THE BANK OF DEBTOR REQUIRES DEBTOR’S AUTHORIZATION BEFORE DEBITING B2B DIRECT DEBITS IN THE ACCOUNT.\n THE DEBTOR WILL BE ABLE TO MANAGE THE MENTIONED AUTHORIZATION THROUGH THE MEANS PROVIDED BY HIS BANK." + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Account Number - IBAN:" +msgstr "Account Number - IBAN:" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Address of the Debtor:" +msgstr "Address of the Debtor:" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Address:" +msgstr "Address:" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "" +"As part of your rights, you are entitled to a refund from\n" +" your bank under the terms and conditions of your agreement\n" +" with your bank.\n" +" A refund must be claimed within 8 weeks starting from the date on which your account was debited." +msgstr "As part of your rights, you are entitled to a refund from\n your bank under the terms and conditions of your agreement\n with your bank.\n A refund must be claimed within 8 weeks starting from the date on which your account was debited." + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:116 +#, python-format +msgid "" +"As you changed the bank account attached to this mandate, the 'Sequence " +"Type' has been set back to 'First'." +msgstr "As you changed the bank account attached to this mandate, the 'Sequence Type' has been set back to 'First'." + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_bank_payment_line +msgid "Bank Payment Lines" +msgstr "Bank Payment Lines" + +#. module: account_banking_sepa_direct_debit +#: selection:account.banking.mandate,scheme:0 +msgid "Basic (CORE)" +msgstr "Basic (CORE)" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,batch_booking:0 +msgid "Batch Booking" +msgstr "Batch Booking" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd.wizard,charge_bearer:0 +msgid "Borne by Creditor" +msgstr "Borne by Creditor" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd.wizard,charge_bearer:0 +msgid "Borne by Debtor" +msgstr "Borne by Debtor" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "By signing this mandate form, you authorise (A)" +msgstr "By signing this mandate form, you authorise (A)" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd.wizard:account_banking_sepa_direct_debit.banking_export_sdd_wizard_view +msgid "Cancel" +msgstr "Cancel" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,charge_bearer:0 +msgid "Charge Bearer" +msgstr "Charge Bearer" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_res_company +msgid "Companies" +msgstr "Companies" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Country of the debtor:" +msgstr "Country of the debtor:" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Country:" +msgstr "Country:" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd.wizard,state:0 +msgid "Create" +msgstr "Create" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,create_uid:0 +msgid "Created by" +msgstr "Created by" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,create_date:0 +msgid "Created on" +msgstr "Created on" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Creditor's Name:" +msgstr "Creditor's Name:" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Date - Location:" +msgstr "Date - Location:" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Debtor's Name:" +msgstr "Debtor's Name:" + +#. module: account_banking_sepa_direct_debit +#: help:payment.mode,sepa_creditor_identifier:0 +msgid "" +"Enter the Creditor Identifier that has been attributed to your company to make SEPA Direct Debits. If not defined, SEPA Creditor Identifier from company will be used.\n" +"This identifier is composed of :\n" +"- your country ISO code (2 letters)\n" +"- a 2-digits checkum\n" +"- a 3-letters business code\n" +"- a country-specific identifier" +msgstr "Enter the Creditor Identifier that has been attributed to your company to make SEPA Direct Debits. If not defined, SEPA Creditor Identifier from company will be used.\nThis identifier is composed of :\n- your country ISO code (2 letters)\n- a 2-digits checkum\n- a 3-letters business code\n- a country-specific identifier" + +#. module: account_banking_sepa_direct_debit +#: help:res.company,sepa_creditor_identifier:0 +msgid "" +"Enter the Creditor Identifier that has been attributed to your company to make SEPA Direct Debits. This identifier is composed of :\n" +"- your country ISO code (2 letters)\n" +"- a 2-digits checkum\n" +"- a 3-letters business code\n" +"- a country-specific identifier" +msgstr "Enter the Creditor Identifier that has been attributed to your company to make SEPA Direct Debits. This identifier is composed of :\n- your country ISO code (2 letters)\n- a 2-digits checkum\n- a 3-letters business code\n- a country-specific identifier" + +#. module: account_banking_sepa_direct_debit +#: selection:account.banking.mandate,scheme:0 +msgid "Enterprise (B2B)" +msgstr "Enterprise (B2B)" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/payment_mode.py:42 +#: code:addons/account_banking_sepa_direct_debit/models/res_company.py:32 +#, python-format +msgid "Error" +msgstr "Error" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_banking_export_sdd_wizard +msgid "Export SEPA Direct Debit File" +msgstr "Export SEPA Direct Debit File" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,file:0 +msgid "File" +msgstr "File" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,filename:0 +msgid "Filename" +msgstr "Filename" + +#. module: account_banking_sepa_direct_debit +#: selection:account.banking.mandate,recurrent_sequence_type:0 +msgid "Final" +msgstr "Final" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd.wizard,state:0 +msgid "Finish" +msgstr "Finish" + +#. module: account_banking_sepa_direct_debit +#: selection:account.banking.mandate,recurrent_sequence_type:0 +msgid "First" +msgstr "First" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd.wizard,charge_bearer:0 +msgid "Following Service Level" +msgstr "Following Service Level" + +#. module: account_banking_sepa_direct_debit +#: help:banking.export.sdd.wizard,charge_bearer:0 +msgid "" +"Following service level : transaction charges are to be applied following " +"the rules agreed in the service level and/or scheme (SEPA Core messages must" +" use this). Shared : transaction charges on the creditor side are to be " +"borne by the creditor, transaction charges on the debtor side are to be " +"borne by the debtor. Borne by creditor : all transaction charges are to be " +"borne by the creditor. Borne by debtor : all transaction charges are to be " +"borne by the debtor." +msgstr "Following service level : transaction charges are to be applied following the rules agreed in the service level and/or scheme (SEPA Core messages must use this). Shared : transaction charges on the creditor side are to be borne by the creditor, transaction charges on the debtor side are to be borne by the debtor. Borne by creditor : all transaction charges are to be borne by the creditor. Borne by debtor : all transaction charges are to be borne by the debtor." + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd.wizard:account_banking_sepa_direct_debit.banking_export_sdd_wizard_view +msgid "Generate" +msgstr "Generate" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,id:0 +msgid "ID" +msgstr "ID" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Identifier:" +msgstr "Identifier:" + +#. module: account_banking_sepa_direct_debit +#: help:payment.mode,original_creditor_identifier:0 +msgid "" +"If not defined, Original Creditor Identifier from company will be used." +msgstr "If not defined, Original Creditor Identifier from company will be used." + +#. module: account_banking_sepa_direct_debit +#: help:account.banking.mandate,sepa_migrated:0 +msgid "" +"If this field is not active, the mandate section of the next direct debit " +"file that include this mandate will contain the 'Original Mandate " +"Identification' and the 'Original Creditor Scheme Identification'. This is " +"required in a few countries (Belgium for instance), but not in all " +"countries. If this is not required in your country, you should keep this " +"field always active." +msgstr "If this field is not active, the mandate section of the next direct debit file that include this mandate will contain the 'Original Mandate Identification' and the 'Original Creditor Scheme Identification'. This is required in a few countries (Belgium for instance), but not in all countries. If this is not required in your country, you should keep this field always active." + +#. module: account_banking_sepa_direct_debit +#: help:banking.export.sdd.wizard,batch_booking:0 +msgid "" +"If true, the bank statement will display only one credit line for all the " +"direct debits of the SEPA file ; if false, the bank statement will display " +"one credit line per direct debit of the SEPA file." +msgstr "If true, the bank statement will display only one credit line for all the direct debits of the SEPA file ; if false, the bank statement will display one credit line per direct debit of the SEPA file." + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/payment_mode.py:43 +#: code:addons/account_banking_sepa_direct_debit/models/res_company.py:33 +#, python-format +msgid "Invalid SEPA Creditor Identifier." +msgstr "Invalid SEPA Creditor Identifier." + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,write_uid:0 +msgid "Last Updated by" +msgstr "Last Updated by" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,write_date:0 +msgid "Last Updated on" +msgstr "Last Updated on" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Mandate Reference:" +msgstr "Mandate Reference:" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:115 +#, python-format +msgid "Mandate update" +msgstr "Mandate update" + +#. module: account_banking_sepa_direct_debit +#: field:account.banking.mandate,sepa_migrated:0 +msgid "Migrated to SEPA" +msgstr "Migrated to SEPA" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:159 +#, python-format +msgid "" +"Missing SEPA Direct Debit mandate on the bank payment line with partner '%s'" +" (reference '%s')." +msgstr "Missing SEPA Direct Debit mandate on the bank payment line with partner '%s' (reference '%s')." + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,nb_transactions:0 +msgid "Number of Transactions" +msgstr "Number of Transactions" + +#. module: account_banking_sepa_direct_debit +#: view:account.banking.mandate:account_banking_sepa_direct_debit.sdd_mandate_search +#: selection:account.banking.mandate,type:0 +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "One-Off" +msgstr "One-Off" + +#. module: account_banking_sepa_direct_debit +#: field:payment.mode,original_creditor_identifier:0 +#: field:res.company,original_creditor_identifier:0 +msgid "Original Creditor Identifier" +msgstr "Original Creditor Identifier" + +#. module: account_banking_sepa_direct_debit +#: field:account.banking.mandate,original_mandate_identification:0 +msgid "Original Mandate Identification" +msgstr "Original Mandate Identification" + +#. module: account_banking_sepa_direct_debit +#: model:res.groups,name:account_banking_sepa_direct_debit.group_original_mandate_required +msgid "Original Mandate Required (SEPA)" +msgstr "Original Mandate Required (SEPA)" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_payment_mode +msgid "Payment Mode" +msgstr "Payment Mode" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,payment_order_ids:0 +msgid "Payment Orders" +msgstr "Payment Orders" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:117 +#, python-format +msgid "" +"Payment Type Code '%s' is not supported. The only Payment Type Code " +"supported for SEPA Direct Debit are 'pain.008.001.02', 'pain.008.001.03' and" +" 'pain.008.001.04'." +msgstr "Payment Type Code '%s' is not supported. The only Payment Type Code supported for SEPA Direct Debit are 'pain.008.001.02', 'pain.008.001.03' and 'pain.008.001.04'." + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Postal Code - City - Town:" +msgstr "Postal Code - City - Town:" + +#. module: account_banking_sepa_direct_debit +#: view:account.banking.mandate:account_banking_sepa_direct_debit.sdd_mandate_search +#: selection:account.banking.mandate,type:0 +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Recurrent" +msgstr "Recurrent" + +#. module: account_banking_sepa_direct_debit +#: selection:account.banking.mandate,recurrent_sequence_type:0 +msgid "Recurring" +msgstr "Recurring" + +#. module: account_banking_sepa_direct_debit +#: view:res.partner:account_banking_sepa_direct_debit.sdd_mandate_partner_form +#: view:res.partner.bank:account_banking_sepa_direct_debit.sdd_mandate_partner_bank_tree +msgid "SDD Mandates" +msgstr "SDD Mandates" + +#. module: account_banking_sepa_direct_debit +#: field:payment.mode,sepa_creditor_identifier:0 +#: field:res.company,sepa_creditor_identifier:0 +msgid "SEPA Creditor Identifier" +msgstr "SEPA Creditor Identifier" + +#. module: account_banking_sepa_direct_debit +#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.mandate_action +msgid "SEPA Direct Debit Mandates" +msgstr "SEPA Direct Debit Mandates" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd.wizard:account_banking_sepa_direct_debit.banking_export_sdd_wizard_view +msgid "SEPA Direct Debit XML file generation" +msgstr "SEPA Direct Debit XML file generation" + +#. module: account_banking_sepa_direct_debit +#: view:account.banking.mandate:account_banking_sepa_direct_debit.sdd_mandate_search +#: field:account.banking.mandate,scheme:0 +msgid "Scheme" +msgstr "Scheme" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Sepa Business-To-Business Direct debit Mandate" +msgstr "Sepa Business-To-Business Direct debit Mandate" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Sepa Direct Debit Mandate" +msgstr "Sepa Direct Debit Mandate" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:35 +#: model:ir.actions.report.xml,name:account_banking_sepa_direct_debit.report_sepa_direct_debit_mandate +#, python-format +msgid "Sepa Mandate" +msgstr "Sepa Mandate" + +#. module: account_banking_sepa_direct_debit +#: view:account.banking.mandate:account_banking_sepa_direct_debit.sdd_mandate_search +#: view:account.banking.mandate:account_banking_sepa_direct_debit.sdd_mandate_tree +msgid "Sequence Type" +msgstr "Sequence Type" + +#. module: account_banking_sepa_direct_debit +#: field:account.banking.mandate,recurrent_sequence_type:0 +msgid "Sequence Type for Next Debit" +msgstr "Sequence Type for Next Debit" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_final +#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.recurrent_sequence_type_final +msgid "Sequence Type set to Final" +msgstr "Sequence Type set to Final" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_first +#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.recurrent_sequence_type_first +msgid "Sequence Type set to First" +msgstr "Sequence Type set to First" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_recurring +#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.recurrent_sequence_type_recurring +msgid "Sequence Type set to Recurring" +msgstr "Sequence Type set to Recurring" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd.wizard,charge_bearer:0 +msgid "Shared" +msgstr "Shared" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Signature of the debtor:" +msgstr "Signature of the debtor:" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,state:0 +msgid "State" +msgstr "State" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Swift BIC (up to 8 or 11 characteres):" +msgstr "Swift BIC (up to 8 or 11 characteres):" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:166 +#, python-format +msgid "" +"The SEPA Direct Debit mandate with reference '%s' for partner '%s' has " +"expired." +msgstr "The SEPA Direct Debit mandate with reference '%s' for partner '%s' has expired." + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:174 +#, python-format +msgid "" +"The mandate with reference '%s' for partner '%s' has type set to 'One-Off' " +"and it has a last debit date set to '%s', so we can't use it." +msgstr "The mandate with reference '%s' for partner '%s' has type set to 'One-Off' and it has a last debit date set to '%s', so we can't use it." + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:76 +#, python-format +msgid "The recurrent mandate '%s' must have a sequence type." +msgstr "The recurrent mandate '%s' must have a sequence type." + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:86 +#, python-format +msgid "" +"The recurrent mandate '%s' which is not marked as 'Migrated to SEPA' must " +"have its recurrent sequence type set to 'First'." +msgstr "The recurrent mandate '%s' which is not marked as 'Migrated to SEPA' must have its recurrent sequence type set to 'First'." + +#. module: account_banking_sepa_direct_debit +#: help:account.banking.mandate,recurrent_sequence_type:0 +msgid "" +"This field is only used for Recurrent mandates, not for One-Off mandates." +msgstr "This field is only used for Recurrent mandates, not for One-Off mandates." + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "" +"This mandate is only intended for business-to-business transactions.\n" +" You are not entitled to a refund from your bank after your account has\n" +" been debited, but you are entitled to request your bank\n" +" not to debit your account up until the day on which the payment is due." +msgstr "This mandate is only intended for business-to-business transactions.\n You are not entitled to a refund from your bank after your account has\n been debited, but you are entitled to request your bank\n not to debit your account up until the day on which the payment is due." + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "To be completed by the creditor" +msgstr "To be completed by the creditor" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "To be completed by the debtor" +msgstr "To be completed by the debtor" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,total_amount:0 +msgid "Total Amount" +msgstr "Total Amount" + +#. module: account_banking_sepa_direct_debit +#: view:account.banking.mandate:account_banking_sepa_direct_debit.sdd_mandate_search +#: view:account.banking.mandate:account_banking_sepa_direct_debit.sdd_mandate_tree +msgid "Type" +msgstr "Type" + +#. module: account_banking_sepa_direct_debit +#: field:account.banking.mandate,type:0 +msgid "Type of Mandate" +msgstr "Type of Mandate" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Type of payment:" +msgstr "Type of payment:" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd.wizard:account_banking_sepa_direct_debit.banking_export_sdd_wizard_view +msgid "Validate" +msgstr "Validate" + +#. module: account_banking_sepa_direct_debit +#: help:account.banking.mandate,original_mandate_identification:0 +msgid "" +"When the field 'Migrated to SEPA' is not active, this field will be used as " +"the Original Mandate Identification in the Direct Debit file." +msgstr "When the field 'Migrated to SEPA' is not active, this field will be used as the Original Mandate Identification in the Direct Debit file." + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:98 +#, python-format +msgid "" +"You must set the 'Original Mandate Identification' on the recurrent mandate " +"'%s' which is not marked as 'Migrated to SEPA'." +msgstr "You must set the 'Original Mandate Identification' on the recurrent mandate '%s' which is not marked as 'Migrated to SEPA'." + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "" +"to send instructions to your bank to debit your account and (B) your bank to\n" +" debit your account in accordance with the instructions from" +msgstr "to send instructions to your bank to debit your account and (B) your bank to\n debit your account in accordance with the instructions from" diff --git a/account_banking_sepa_direct_debit/i18n/es.po b/account_banking_sepa_direct_debit/i18n/es.po index ce10768cd..8f64295d1 100644 --- a/account_banking_sepa_direct_debit/i18n/es.po +++ b/account_banking_sepa_direct_debit/i18n/es.po @@ -1,20 +1,21 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: -# * account_banking_sepa_direct_debit -# +# * account_banking_sepa_direct_debit +# +# Translators: msgid "" msgstr "" -"Project-Id-Version: Odoo Server 8.0\n" +"Project-Id-Version: bank-payment (8.0)\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-04-05 20:32+0000\n" -"PO-Revision-Date: 2016-04-05 23:01+0100\n" -"Last-Translator: Sergio Teruel \n" -"Language-Team: \n" -"Language: es_ES\n" +"POT-Creation-Date: 2016-04-08 00:46+0000\n" +"PO-Revision-Date: 2016-04-07 16:04+0000\n" +"Last-Translator: OCA Transbot \n" +"Language-Team: Spanish (http://www.transifex.com/oca/OCA-bank-payment-8-0/language/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.5.4\n" +"Content-Transfer-Encoding: \n" +"Language: es\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" #. module: account_banking_sepa_direct_debit #: model:ir.actions.act_window,help:account_banking_sepa_direct_debit.mandate_action @@ -22,19 +23,10 @@ msgid "" "

\n" " Click to create a new SEPA Direct Debit Mandate.\n" "

\n" -" A SEPA Direct Debit Mandate is a document signed by your customer " -"that gives you the autorization to do one or several direct debits on his " -"bank account.\n" -"

\n" -" " -msgstr "" -"

\n" -" Pulse para crear un nuevo mandato bancario.\n" -"

\n" -" Un mandato bancario es un documento firmado por su cliente que le da " -"la autorización para hacer una o varias operaciones en su cuenta bancaria.\n" +" A SEPA Direct Debit Mandate is a document signed by your customer that gives you the autorization to do one or several direct debits on his bank account.\n" "

\n" " " +msgstr "

\n Pulse para crear un nuevo mandato bancario.\n

\n Un mandato bancario es un documento firmado por su cliente que le da la autorización para hacer una o varias operaciones en su cuenta bancaria.\n

\n " #. module: account_banking_sepa_direct_debit #: model:ir.model,name:account_banking_sepa_direct_debit.model_account_banking_mandate @@ -46,25 +38,15 @@ msgstr "Un mandato bancario genérico" msgid "" "ALL GAPS ARE MANDATORY. ONCE THIS MANDATE HAS BEEN SIGNED MUST BE SENT TO " "CREDITOR FOR STORAGE." -msgstr "" -"TODOS LOS CAMPOS HAN DE SER CUMPLIMENTADOS OBLIGATORIAMENTE. UNA VEZ FIRMADA " -"ESTA ORDEN DE DOMICILIACIÓN DEBE SER ENVIADA AL ACREEDOR PARA SU CUSTODIA." +msgstr "TODOS LOS CAMPOS HAN DE SER CUMPLIMENTADOS OBLIGATORIAMENTE. UNA VEZ FIRMADA ESTA ORDEN DE DOMICILIACIÓN DEBE SER ENVIADA AL ACREEDOR PARA SU CUSTODIA." #. module: account_banking_sepa_direct_debit #: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document msgid "" -"ALL GAPS ARE MANDATORY. ONCE THIS MANDATE HAS BEEN SIGNED MUST BE SENT TO " -"CREDITOR FOR STORAGE.\n" -" NEVERTHELESS, THE BANK OF DEBTOR REQUIRES DEBTOR’S " -"AUTHORIZATION BEFORE DEBITING B2B DIRECT DEBITS IN THE ACCOUNT.\n" -" THE DEBTOR WILL BE ABLE TO MANAGE THE MENTIONED " -"AUTHORIZATION THROUGH THE MEANS PROVIDED BY HIS BANK." -msgstr "" -"TODOS LOS CAMPOS HAN DE SER CUMPLIMENTADOS OBLIGATORIAMENTE. UNA VEZ FIRMADA " -"ESTA ORDEN DE DOMICILIACIÓN DEBE SER ENVIADA AL ACREEDOR PARA SU CUSTODIA.LA " -"ENTIDAD DE DEUDOR REQUIERE AUTORIZACIÓN DE ÉSTE PREVIA AL CARGO EN CUENTA DE " -"LOS ADEUDOS DIRECTOS B2B.EL DEUDOR PODRÁ GESTIONAR DICHA AUTORIZACIÓN CON " -"LOS MEDIOS QUE SU ENTIDAD PONGA A SU DISPOSICIÓN." +"ALL GAPS ARE MANDATORY. ONCE THIS MANDATE HAS BEEN SIGNED MUST BE SENT TO CREDITOR FOR STORAGE.\n" +" NEVERTHELESS, THE BANK OF DEBTOR REQUIRES DEBTOR’S AUTHORIZATION BEFORE DEBITING B2B DIRECT DEBITS IN THE ACCOUNT.\n" +" THE DEBTOR WILL BE ABLE TO MANAGE THE MENTIONED AUTHORIZATION THROUGH THE MEANS PROVIDED BY HIS BANK." +msgstr "TODOS LOS CAMPOS HAN DE SER CUMPLIMENTADOS OBLIGATORIAMENTE. UNA VEZ FIRMADA ESTA ORDEN DE DOMICILIACIÓN DEBE SER ENVIADA AL ACREEDOR PARA SU CUSTODIA.LA ENTIDAD DE DEUDOR REQUIERE AUTORIZACIÓN DE ÉSTE PREVIA AL CARGO EN CUENTA DE LOS ADEUDOS DIRECTOS B2B.EL DEUDOR PODRÁ GESTIONAR DICHA AUTORIZACIÓN CON LOS MEDIOS QUE SU ENTIDAD PONGA A SU DISPOSICIÓN." #. module: account_banking_sepa_direct_debit #: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document @@ -85,27 +67,18 @@ msgstr "Dirección:" #: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document msgid "" "As part of your rights, you are entitled to a refund from\n" -" your bank under the terms and conditions of your " -"agreement\n" +" your bank under the terms and conditions of your agreement\n" " with your bank.\n" -" A refund must be claimed within 8 weeks starting " -"from the date on which your account was debited." -msgstr "" -"Como parte de sus derechos, el deudor está legitimado al reembolso por su " -"entidad en los términos y condiciones del contrato suscrito con la misma. La " -"solicitud de reembolso deberá efectuarse dentro de las ocho semanas que " -"siguen a la fecha de adeudo en cuenta. Puede obtener información adicional " -"sobre sus derechos en su entidad financiera." +" A refund must be claimed within 8 weeks starting from the date on which your account was debited." +msgstr "Como parte de sus derechos, el deudor está legitimado al reembolso por su entidad en los términos y condiciones del contrato suscrito con la misma. La solicitud de reembolso deberá efectuarse dentro de las ocho semanas que siguen a la fecha de adeudo en cuenta. Puede obtener información adicional sobre sus derechos en su entidad financiera." #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:110 +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:116 #, python-format msgid "" "As you changed the bank account attached to this mandate, the 'Sequence " "Type' has been set back to 'First'." -msgstr "" -"Puesto que ha cambiado la cuenta bancaria relacionada con este mandato, el " -"'Tipo de secuencia' se ha vuelto a 'Inicial'." +msgstr "Puesto que ha cambiado la cuenta bancaria relacionada con este mandato, el 'Tipo de secuencia' se ha vuelto a 'Inicial'." #. module: account_banking_sepa_direct_debit #: model:ir.model,name:account_banking_sepa_direct_debit.model_bank_payment_line @@ -135,8 +108,7 @@ msgstr "A cargo del deudor" #. module: account_banking_sepa_direct_debit #: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document msgid "By signing this mandate form, you authorise (A)" -msgstr "" -"Mediante la firma de esta orden de domiciliación, el deudor autoriza (A) " +msgstr "Mediante la firma de esta orden de domiciliación, el deudor autoriza (A) " #. module: account_banking_sepa_direct_debit #: view:banking.export.sdd.wizard:account_banking_sepa_direct_debit.banking_export_sdd_wizard_view @@ -196,40 +168,23 @@ msgstr "Nombre del deudor:" #. module: account_banking_sepa_direct_debit #: help:payment.mode,sepa_creditor_identifier:0 msgid "" -"Enter the Creditor Identifier that has been attributed to your company to " -"make SEPA Direct Debits. If not defined, SEPA Creditor Identifier from " -"company will be used.\n" +"Enter the Creditor Identifier that has been attributed to your company to make SEPA Direct Debits. If not defined, SEPA Creditor Identifier from company will be used.\n" "This identifier is composed of :\n" "- your country ISO code (2 letters)\n" "- a 2-digits checkum\n" "- a 3-letters business code\n" "- a country-specific identifier" -msgstr "" -"Introduzca el identificador de acreedor que se le ha atribuido a su compañía " -"para realizar adeudos directos SEPA. Su banco suele poseer esta información. " -"Este identificador se compone de:\n" -"- el código ISO de 2 letras de su país\n" -"- dos dígitos de comprobación\n" -"- tres letras de código de negocio\n" -"- un identificador específico de país (en España, el NIF)" +msgstr "Introduzca el identificador de acreedor que se le ha atribuido a su compañía para realizar adeudos directos SEPA. Su banco suele poseer esta información. Este identificador se compone de:\n- el código ISO de 2 letras de su país\n- dos dígitos de comprobación\n- tres letras de código de negocio\n- un identificador específico de país (en España, el NIF)" #. module: account_banking_sepa_direct_debit #: help:res.company,sepa_creditor_identifier:0 msgid "" -"Enter the Creditor Identifier that has been attributed to your company to " -"make SEPA Direct Debits. This identifier is composed of :\n" +"Enter the Creditor Identifier that has been attributed to your company to make SEPA Direct Debits. This identifier is composed of :\n" "- your country ISO code (2 letters)\n" "- a 2-digits checkum\n" "- a 3-letters business code\n" "- a country-specific identifier" -msgstr "" -"Introduzca el identificador de acreedor que se le ha atribuido a su compañía " -"para realizar adeudos directos SEPA. Su banco suele poseer esta información. " -"Este identificador se compone de:\n" -"- el código ISO de 2 letras de su país\n" -"- dos dígitos de comprobación\n" -"- tres letras de código de negocio\n" -"- un identificador específico de país (en España, el NIF)" +msgstr "Introduzca el identificador de acreedor que se le ha atribuido a su compañía para realizar adeudos directos SEPA. Su banco suele poseer esta información. Este identificador se compone de:\n- el código ISO de 2 letras de su país\n- dos dígitos de comprobación\n- tres letras de código de negocio\n- un identificador específico de país (en España, el NIF)" #. module: account_banking_sepa_direct_debit #: selection:account.banking.mandate,scheme:0 @@ -237,8 +192,8 @@ msgid "Enterprise (B2B)" msgstr "Empresa (B2B)" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/models/payment_mode.py:41 -#: code:addons/account_banking_sepa_direct_debit/models/res_company.py:31 +#: code:addons/account_banking_sepa_direct_debit/models/payment_mode.py:42 +#: code:addons/account_banking_sepa_direct_debit/models/res_company.py:32 #, python-format msgid "Error" msgstr "Error" @@ -282,21 +237,13 @@ msgstr "Según el acuerdo de servicio" #: help:banking.export.sdd.wizard,charge_bearer:0 msgid "" "Following service level : transaction charges are to be applied following " -"the rules agreed in the service level and/or scheme (SEPA Core messages must " -"use this). Shared : transaction charges on the creditor side are to be borne " -"by the creditor, transaction charges on the debtor side are to be borne by " -"the debtor. Borne by creditor : all transaction charges are to be borne by " -"the creditor. Borne by debtor : all transaction charges are to be borne by " -"the debtor." -msgstr "" -"Según el acuerdo de servicio: los costes de la transacción se aplicarán " -"siguiendo las reglas acordadas en el nivel de servicio y/o en el esquema " -"(las remesas SEPA Core deben usar esta opción). Compartidos: los costes de " -"la transacción en la parte del acreedor están a cargo del acreedor, y los " -"costes de la transacción del lado del deudor estarán a cargo del deudor. A " -"cargo del acreedor: todos los costes de la transacción estarán a cargo del " -"acreedor. A cargo del deudor: Todos los costes de la transacción estarán a " -"cargo del deudor." +"the rules agreed in the service level and/or scheme (SEPA Core messages must" +" use this). Shared : transaction charges on the creditor side are to be " +"borne by the creditor, transaction charges on the debtor side are to be " +"borne by the debtor. Borne by creditor : all transaction charges are to be " +"borne by the creditor. Borne by debtor : all transaction charges are to be " +"borne by the debtor." +msgstr "Según el acuerdo de servicio: los costes de la transacción se aplicarán siguiendo las reglas acordadas en el nivel de servicio y/o en el esquema (las remesas SEPA Core deben usar esta opción). Compartidos: los costes de la transacción en la parte del acreedor están a cargo del acreedor, y los costes de la transacción del lado del deudor estarán a cargo del deudor. A cargo del acreedor: todos los costes de la transacción estarán a cargo del acreedor. A cargo del deudor: Todos los costes de la transacción estarán a cargo del deudor." #. module: account_banking_sepa_direct_debit #: view:banking.export.sdd.wizard:account_banking_sepa_direct_debit.banking_export_sdd_wizard_view @@ -315,7 +262,8 @@ msgstr "Identificador:" #. module: account_banking_sepa_direct_debit #: help:payment.mode,original_creditor_identifier:0 -msgid "If not defined, Original Creditor Identifier from company will be used." +msgid "" +"If not defined, Original Creditor Identifier from company will be used." msgstr "" #. module: account_banking_sepa_direct_debit @@ -327,13 +275,7 @@ msgid "" "required in a few countries (Belgium for instance), but not in all " "countries. If this is not required in your country, you should keep this " "field always active." -msgstr "" -"Si este campo no está marcado, la sección 'mandato' del próximo archivo de " -"adeudo directo que lo incluya contendrá el valor de los campos " -"'Identificación del mandato original' y 'Identificación del esquema original " -"del acreedor'. Esto se requiere en algunos países (Bélgica por ejemplo), " -"pero no en todos ellos. Si no es un requisito en su país, este campo siempre " -"debe estar marcado." +msgstr "Si este campo no está marcado, la sección 'mandato' del próximo archivo de adeudo directo que lo incluya contendrá el valor de los campos 'Identificación del mandato original' y 'Identificación del esquema original del acreedor'. Esto se requiere en algunos países (Bélgica por ejemplo), pero no en todos ellos. Si no es un requisito en su país, este campo siempre debe estar marcado." #. module: account_banking_sepa_direct_debit #: help:banking.export.sdd.wizard,batch_booking:0 @@ -341,15 +283,11 @@ msgid "" "If true, the bank statement will display only one credit line for all the " "direct debits of the SEPA file ; if false, the bank statement will display " "one credit line per direct debit of the SEPA file." -msgstr "" -"Si está marcado, el extracto bancario mostrará sólo una línea del haber para " -"todos los adeudos directos del archivo SEPA; si no está marcado, entonces el " -"extracto bancario mostrará una línea por cada adeudo directo del archivo " -"SEPA." +msgstr "Si está marcado, el extracto bancario mostrará sólo una línea del haber para todos los adeudos directos del archivo SEPA; si no está marcado, entonces el extracto bancario mostrará una línea por cada adeudo directo del archivo SEPA." #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/models/payment_mode.py:42 -#: code:addons/account_banking_sepa_direct_debit/models/res_company.py:32 +#: code:addons/account_banking_sepa_direct_debit/models/payment_mode.py:43 +#: code:addons/account_banking_sepa_direct_debit/models/res_company.py:33 #, python-format msgid "Invalid SEPA Creditor Identifier." msgstr "Identificador de acreedor SEPA no válido." @@ -370,7 +308,7 @@ msgid "Mandate Reference:" msgstr "Referencia del mandato:" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:109 +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:115 #, python-format msgid "Mandate update" msgstr "Actualizacion de mandato" @@ -384,11 +322,9 @@ msgstr "Migrado a SEPA" #: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:159 #, python-format msgid "" -"Missing SEPA Direct Debit mandate on the bank payment line with partner " -"'%s' (reference '%s')." -msgstr "" -"Falta el mandato de adeudo directo SEPA en la linea de pago bancario con la " -"empresa '%s' (referencia '%s')." +"Missing SEPA Direct Debit mandate on the bank payment line with partner '%s'" +" (reference '%s')." +msgstr "Falta el mandato de adeudo directo SEPA en la linea de pago bancario con la empresa '%s' (referencia '%s')." #. module: account_banking_sepa_direct_debit #: field:banking.export.sdd.wizard,nb_transactions:0 @@ -433,12 +369,9 @@ msgstr "Órdenes de pago" #, python-format msgid "" "Payment Type Code '%s' is not supported. The only Payment Type Code " -"supported for SEPA Direct Debit are 'pain.008.001.02', 'pain.008.001.03' and " -"'pain.008.001.04'." -msgstr "" -"El código de tipo de pago '%s' no está soportado. Los únicos códigos de tipo " -"de pago soportados para los adedudos directos SEPA son 'pain.008.001.02', " -"'pain.008.001.03' y 'pain.008.001.04'." +"supported for SEPA Direct Debit are 'pain.008.001.02', 'pain.008.001.03' and" +" 'pain.008.001.04'." +msgstr "El código de tipo de pago '%s' no está soportado. Los únicos códigos de tipo de pago soportados para los adedudos directos SEPA son 'pain.008.001.02', 'pain.008.001.03' y 'pain.008.001.04'." #. module: account_banking_sepa_direct_debit #: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document @@ -557,9 +490,7 @@ msgstr "Swift BIC (puede contener 8 u 11 posiciones):" msgid "" "The SEPA Direct Debit mandate with reference '%s' for partner '%s' has " "expired." -msgstr "" -"El mandato de adeudo directo SEPA con referencia '%s' para la empresa '%s' " -"ha expirado." +msgstr "El mandato de adeudo directo SEPA con referencia '%s' para la empresa '%s' ha expirado." #. module: account_banking_sepa_direct_debit #: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:174 @@ -567,25 +498,21 @@ msgstr "" msgid "" "The mandate with reference '%s' for partner '%s' has type set to 'One-Off' " "and it has a last debit date set to '%s', so we can't use it." -msgstr "" -"El mandato con referencia '%s' para la empresa '%s' tipo como 'Único', ya " -"tiene como fecha de último cobro '%s', por lo que no se puede usar." +msgstr "El mandato con referencia '%s' para la empresa '%s' tipo como 'Único', ya tiene como fecha de último cobro '%s', por lo que no se puede usar." #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:75 +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:76 #, python-format msgid "The recurrent mandate '%s' must have a sequence type." msgstr "El mandato periódico '%s' debe tener un tipo de secuencia." #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:84 +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:86 #, python-format msgid "" "The recurrent mandate '%s' which is not marked as 'Migrated to SEPA' must " "have its recurrent sequence type set to 'First'." -msgstr "" -"El mandato periódico '%s', que no está marcado como 'Migrado a SEPA', debe " -"establecer su tipo de secuencia a 'Inicial'." +msgstr "El mandato periódico '%s', que no está marcado como 'Migrado a SEPA', debe establecer su tipo de secuencia a 'Inicial'." #. module: account_banking_sepa_direct_debit #: help:account.banking.mandate,recurrent_sequence_type:0 @@ -597,19 +524,10 @@ msgstr "Este campo se utiliza sólo para mandatos periódicos, no para únicos." #: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document msgid "" "This mandate is only intended for business-to-business transactions.\n" -" You are not entitled to a refund from your bank " -"after your account has\n" -" been debited, but you are entitled to request your " -"bank\n" -" not to debit your account up until the day on which " -"the payment is due." -msgstr "" -"Esta orden de domiciliación está prevista para operaciones exclusivamente " -"entre empresas y/o autónomos. El deudor no tiene derecho a que su entidad le " -"reembolse una vez que se haya realizado el cargo en cuenta, pero puede " -"solicitar a su entidad que no efectúe el adeudo en la cuenta hasta la fecha " -"debida. Podrá obtener información detallada del procedimiento en su entidad " -"financiera." +" You are not entitled to a refund from your bank after your account has\n" +" been debited, but you are entitled to request your bank\n" +" not to debit your account up until the day on which the payment is due." +msgstr "Esta orden de domiciliación está prevista para operaciones exclusivamente entre empresas y/o autónomos. El deudor no tiene derecho a que su entidad le reembolse una vez que se haya realizado el cargo en cuenta, pero puede solicitar a su entidad que no efectúe el adeudo en la cuenta hasta la fecha debida. Podrá obtener información detallada del procedimiento en su entidad financiera." #. module: account_banking_sepa_direct_debit #: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document @@ -652,28 +570,19 @@ msgstr "Validar" msgid "" "When the field 'Migrated to SEPA' is not active, this field will be used as " "the Original Mandate Identification in the Direct Debit file." -msgstr "" -"Cuando el campo 'Migrado a SEPA' no está marcado, este campo se usa como " -"identificación del mandato original en el archivo de adeudo directo." +msgstr "Cuando el campo 'Migrado a SEPA' no está marcado, este campo se usa como identificación del mandato original en el archivo de adeudo directo." #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:94 +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:98 #, python-format msgid "" "You must set the 'Original Mandate Identification' on the recurrent mandate " "'%s' which is not marked as 'Migrated to SEPA'." -msgstr "" -"Debe establecer el campo 'Identificación de mandato original en el mandato " -"periódico '%s', que no está marcado como 'Migrado a SEPA'." +msgstr "Debe establecer el campo 'Identificación de mandato original en el mandato periódico '%s', que no está marcado como 'Migrado a SEPA'." #. module: account_banking_sepa_direct_debit #: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document msgid "" -"to send instructions to your bank to debit your account and (B) your bank " -"to\n" -" debit your account in accordance with the " -"instructions from" -msgstr "" -"a enviar instrucciones a la entidad del deudor para adeudar su cuenta y (B) " -"a la entidad para efectuar los adeudos en su cuenta siguiendo las " -"instrucciones del acreedor " +"to send instructions to your bank to debit your account and (B) your bank to\n" +" debit your account in accordance with the instructions from" +msgstr "a enviar instrucciones a la entidad del deudor para adeudar su cuenta y (B) a la entidad para efectuar los adeudos en su cuenta siguiendo las instrucciones del acreedor " diff --git a/account_banking_sepa_direct_debit/i18n/fr.po b/account_banking_sepa_direct_debit/i18n/fr.po index 3744da850..75cc33f0f 100644 --- a/account_banking_sepa_direct_debit/i18n/fr.po +++ b/account_banking_sepa_direct_debit/i18n/fr.po @@ -1,50 +1,220 @@ -# Translation of OpenERP Server. +# Translation of Odoo Server. # This file contains the translation of the following modules: -# * account_banking_sepa_direct_debit -# +# * account_banking_sepa_direct_debit +# +# Translators: msgid "" msgstr "" -"Project-Id-Version: OpenERP Server 7.0\n" +"Project-Id-Version: bank-payment (8.0)\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-12-23 22:24+0000\n" -"PO-Revision-Date: 2014-02-01 04:49+0000\n" -"Last-Translator: Alexis de Lattre \n" -"Language-Team: \n" +"POT-Creation-Date: 2016-04-08 00:46+0000\n" +"PO-Revision-Date: 2016-04-07 16:04+0000\n" +"Last-Translator: OCA Transbot \n" +"Language-Team: French (http://www.transifex.com/oca/OCA-bank-payment-8-0/language/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2014-05-31 06:02+0000\n" -"X-Generator: Launchpad (build 17031)\n" +"Content-Transfer-Encoding: \n" +"Language: fr\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" #. module: account_banking_sepa_direct_debit -#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.mandate_valid -msgid "SEPA Direct Debit Mandate Validated" -msgstr "Mandat de prélèvement SEPA validé" +#: model:ir.actions.act_window,help:account_banking_sepa_direct_debit.mandate_action +msgid "" +"

\n" +" Click to create a new SEPA Direct Debit Mandate.\n" +"

\n" +" A SEPA Direct Debit Mandate is a document signed by your customer that gives you the autorization to do one or several direct debits on his bank account.\n" +"

\n" +" " +msgstr "

\n Cliquez pour créer un mandat de prélèvement SEPA.\n

\n Un mandat de prélèvement SEPA est un document signé par votre client qui vous donne l'autorisation de réaliser un ou plusieurs prélèvements sur son compte bancaire.\n

\n " + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_account_banking_mandate +msgid "A generic banking mandate" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "" +"ALL GAPS ARE MANDATORY. ONCE THIS MANDATE HAS BEEN SIGNED MUST BE SENT TO " +"CREDITOR FOR STORAGE." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "" +"ALL GAPS ARE MANDATORY. ONCE THIS MANDATE HAS BEEN SIGNED MUST BE SENT TO CREDITOR FOR STORAGE.\n" +" NEVERTHELESS, THE BANK OF DEBTOR REQUIRES DEBTOR’S AUTHORIZATION BEFORE DEBITING B2B DIRECT DEBITS IN THE ACCOUNT.\n" +" THE DEBTOR WILL BE ABLE TO MANAGE THE MENTIONED AUTHORIZATION THROUGH THE MEANS PROVIDED BY HIS BANK." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Account Number - IBAN:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Address of the Debtor:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Address:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "" +"As part of your rights, you are entitled to a refund from\n" +" your bank under the terms and conditions of your agreement\n" +" with your bank.\n" +" A refund must be claimed within 8 weeks starting from the date on which your account was debited." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:116 +#, python-format +msgid "" +"As you changed the bank account attached to this mandate, the 'Sequence " +"Type' has been set back to 'First'." +msgstr "Etant donné que vous avez changé le compte bancaire associé à ce mandat, le 'Type de séquence' a été remis à 'First'." + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_bank_payment_line +msgid "Bank Payment Lines" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:account.banking.mandate,scheme:0 +msgid "Basic (CORE)" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,batch_booking:0 +msgid "Batch Booking" +msgstr "Crédit groupé" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd.wizard,charge_bearer:0 +msgid "Borne by Creditor" +msgstr "Supportés par le créancier" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd.wizard,charge_bearer:0 +msgid "Borne by Debtor" +msgstr "Supportés par le débiteur" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "By signing this mandate form, you authorise (A)" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd.wizard:account_banking_sepa_direct_debit.banking_export_sdd_wizard_view +msgid "Cancel" +msgstr "Annuler" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,charge_bearer:0 +msgid "Charge Bearer" +msgstr "Répartition des frais" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_res_company +msgid "Companies" +msgstr "Sociétés" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Country of the debtor:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Country:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd.wizard,state:0 +msgid "Create" +msgstr "Créer" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,create_uid:0 +msgid "Created by" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,create_date:0 +msgid "Created on" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Creditor's Name:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Date - Location:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Debtor's Name:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: help:payment.mode,sepa_creditor_identifier:0 +msgid "" +"Enter the Creditor Identifier that has been attributed to your company to make SEPA Direct Debits. If not defined, SEPA Creditor Identifier from company will be used.\n" +"This identifier is composed of :\n" +"- your country ISO code (2 letters)\n" +"- a 2-digits checkum\n" +"- a 3-letters business code\n" +"- a country-specific identifier" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: help:res.company,sepa_creditor_identifier:0 +msgid "" +"Enter the Creditor Identifier that has been attributed to your company to make SEPA Direct Debits. This identifier is composed of :\n" +"- your country ISO code (2 letters)\n" +"- a 2-digits checkum\n" +"- a 3-letters business code\n" +"- a country-specific identifier" +msgstr "Entrez l'Identifiant créancier qui a été attribué à votre société pour réaliser des prélèvements SEPA. Cet identifiant est composé de :\n- du code ISO de votre pays (2 lettres)\n- un code de contrôle à 2 chiffres\n- un code d'activité à 3 lettres\n- un identifiant national" + +#. module: account_banking_sepa_direct_debit +#: selection:account.banking.mandate,scheme:0 +msgid "Enterprise (B2B)" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/payment_mode.py:42 +#: code:addons/account_banking_sepa_direct_debit/models/res_company.py:32 +#, python-format +msgid "Error" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_banking_export_sdd_wizard +msgid "Export SEPA Direct Debit File" +msgstr "Export du fichier de prélèvement SEPA" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,file:0 +msgid "File" +msgstr "Fichier" #. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,filename:0 #: field:banking.export.sdd.wizard,filename:0 msgid "Filename" msgstr "Nom du fichier" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:200 -#, python-format -msgid "" -"The SEPA Direct Debit mandate with reference '%s' for partner '%s' has " -"expired." -msgstr "" -"Le mandat de prélèvement SEPA portant la référence '%s' pour le partenaire " -"'%s' a expiré." - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:219 -#, python-format -msgid "Cannot validate the mandate '%s' without a date of signature." -msgstr "Impossible de valider le mandat '%s' sans date de signature." - -#. module: account_banking_sepa_direct_debit -#: selection:sdd.mandate,recurrent_sequence_type:0 +#: selection:account.banking.mandate,recurrent_sequence_type:0 msgid "Final" msgstr "Final" @@ -54,359 +224,50 @@ msgid "Finish" msgstr "Finir" #. module: account_banking_sepa_direct_debit -#: view:res.partner:0 -#: view:res.partner.bank:0 -msgid "SDD Mandates" -msgstr "Mandats SEPA" - -#. module: account_banking_sepa_direct_debit -#: constraint:payment.line:0 -#: constraint:sdd.mandate:0 -msgid "Error msg in raise" -msgstr "Error msg in raise" - -#. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd,state:0 -msgid "Reconciled" -msgstr "Réconcilié" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,recurrent_sequence_type:0 -msgid "Sequence Type for Next Debit" -msgstr "Type de séquence pour le prochain prélèvement" - -#. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd,charge_bearer:0 -#: selection:banking.export.sdd.wizard,charge_bearer:0 -msgid "Borne by Creditor" -msgstr "Supportés par le créancier" - -#. module: account_banking_sepa_direct_debit -#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.sdd_mandate_action -#: model:ir.ui.menu,name:account_banking_sepa_direct_debit.sdd_mandate_menu -#: view:res.partner.bank:0 -#: field:res.partner.bank,sdd_mandate_ids:0 -msgid "SEPA Direct Debit Mandates" -msgstr "Mandats de prélèvement SEPA" - -#. module: account_banking_sepa_direct_debit -#: view:banking.export.sdd.wizard:0 -#: view:sdd.mandate:0 -msgid "Validate" -msgstr "Valider" - -#. module: account_banking_sepa_direct_debit -#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_recurring -#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.recurrent_sequence_type_recurring -msgid "Sequence Type set to Recurring" -msgstr "Type de séquence mis à Recurring" - -#. module: account_banking_sepa_direct_debit -#: view:banking.export.sdd.wizard:0 -msgid "Generate" -msgstr "Générer" - -#. module: account_banking_sepa_direct_debit -#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.mandate_cancel -msgid "SEPA Direct Debit Mandate Cancelled" -msgstr "Mandat de prélèvement SEPA annulé" - -#. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd,charge_bearer:0 -#: selection:banking.export.sdd.wizard,charge_bearer:0 -msgid "Borne by Debtor" -msgstr "Supportés par le débiteur" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:212 -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:218 -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:224 -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:232 -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:239 -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:245 -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:253 -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:395 -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:140 -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:192 -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:199 -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:209 -#, python-format -msgid "Error:" -msgstr "Erreur :" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,message_ids:0 -msgid "Messages" -msgstr "Messages" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,unique_mandate_reference:0 -msgid "Unique Mandate Reference" -msgstr "Référence unique de mandat" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -#: selection:sdd.mandate,state:0 -msgid "Cancelled" -msgstr "Annulé" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:141 -#, python-format -msgid "" -"Payment Type Code '%s' is not supported. The only Payment Type Code " -"supported for SEPA Direct Debit are 'pain.008.001.02', 'pain.008.001.03' and " -"'pain.008.001.04'." -msgstr "" -"Le code du Type de paiement '%s' n'est pas supporté. Les seuls codes de Type " -"de paiement supportés pour les prélèvements SEPA sont 'pain.008.001.02', " -"'pain.008.001.03' et 'pain.008.001.04'." - -#. module: account_banking_sepa_direct_debit -#: help:sdd.mandate,message_unread:0 -msgid "If checked new messages require your attention." -msgstr "If checked new messages require your attention." - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd.wizard,file_id:0 -msgid "SDD File" -msgstr "Fichier de prélèvement SEPA" - -#. module: account_banking_sepa_direct_debit -#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.mandate_expired -msgid "SEPA Direct Debit Mandate has Expired" -msgstr "Le mandat de prélèvement SEPA a expiré" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:246 -#, python-format -msgid "" -"The recurrent mandate '%s' which is not marked as 'Migrated to SEPA' must " -"have its recurrent sequence type set to 'First'." -msgstr "" -"Le mandat récurrent '%s' dont l'option 'Migré à SEPA' n'est pas activée doit " -"avec sa séquence mise à 'First'." - -#. module: account_banking_sepa_direct_debit -#: help:banking.export.sdd,charge_bearer:0 -#: help:banking.export.sdd.wizard,charge_bearer:0 -msgid "" -"Following service level : transaction charges are to be applied following " -"the rules agreed in the service level and/or scheme (SEPA Core messages must " -"use this). Shared : transaction charges on the creditor side are to be borne " -"by the creditor, transaction charges on the debtor side are to be borne by " -"the debtor. Borne by creditor : all transaction charges are to be borne by " -"the creditor. Borne by debtor : all transaction charges are to be borne by " -"the debtor." -msgstr "" -"Suivant le niveau de service : la répartition des frais bancaires suit les " -"règles pré-établies dans le schema ou dans le contrat avec la banque (les " -"messages SEPA Core doivent utiliser ce paramètre). Partagés : les frais " -"bancaires côté débiteur sont à la charge du débiteur, les frais bancaires " -"côté créancier sont à la charge du créancier. Supportés par le créancier : " -"tous les frais bancaires sont à la charge du créancier. Supportés par le " -"débiteur : tous les frais bancaires sont à la charge du débiteur." - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -msgid "Reference" -msgstr "Référence" - -#. module: account_banking_sepa_direct_debit -#: view:banking.export.sdd:0 -msgid "SEPA Direct Debit" -msgstr "Prélèvement SEPA" - -#. module: account_banking_sepa_direct_debit -#: view:banking.export.sdd.wizard:0 -msgid "SEPA Direct Debit XML file generation" -msgstr "Génération de fichiers de prélèvement SEPA XML" - -#. module: account_banking_sepa_direct_debit -#: help:sdd.mandate,message_summary:0 -msgid "" -"Holds the Chatter summary (number of messages, ...). This summary is " -"directly in html format in order to be inserted in kanban views." -msgstr "" -"Holds the Chatter summary (number of messages, ...). This summary is " -"directly in html format in order to be inserted in kanban views." - -#. module: account_banking_sepa_direct_debit -#: model:ir.model,name:account_banking_sepa_direct_debit.model_payment_line -msgid "Payment Line" -msgstr "Ligne de paiement" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,create_date:0 -msgid "Generation Date" -msgstr "Date de génération" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:396 -#, python-format -msgid "" -"The payment line with reference '%s' has the bank account '%s' which is not " -"attached to the mandate '%s' (this mandate is attached to the bank account " -"'%s')." -msgstr "" -"La ligne de paiement portant la référence '%s' est configurée avec le compte " -"bancaire '%s' qui n'est pas rattaché au mandat '%s' (ce mandat est rattaché " -"au compte bancaire '%s')." - -#. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd.wizard,state:0 -msgid "Create" -msgstr "Créer" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,nb_transactions:0 -#: field:banking.export.sdd.wizard,nb_transactions:0 -msgid "Number of Transactions" -msgstr "Nombre de transactions" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -#: selection:sdd.mandate,type:0 -msgid "One-Off" -msgstr "One-Off" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,state:0 -#: field:banking.export.sdd.wizard,state:0 -msgid "State" -msgstr "État" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:240 -#, python-format -msgid "The recurrent mandate '%s' must have a sequence type." -msgstr "Le mandat récurrent '%s' doit avoir un type de séquence." - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,message_follower_ids:0 -msgid "Followers" -msgstr "Followers" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,message_unread:0 -msgid "Unread Messages" -msgstr "Unread Messages" - -#. module: account_banking_sepa_direct_debit -#: view:banking.export.sdd:0 -#: field:banking.export.sdd,payment_order_ids:0 -#: field:banking.export.sdd.wizard,payment_order_ids:0 -msgid "Payment Orders" -msgstr "Ordres de paiement" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -msgid "Type" -msgstr "Type" - -#. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd,state:0 -msgid "Sent" -msgstr "Envoyé" - -#. module: account_banking_sepa_direct_debit -#: field:res.company,original_creditor_identifier:0 -msgid "Original Creditor Identifier" -msgstr "Ancien Identifiant Créancier" - -#. module: account_banking_sepa_direct_debit -#: selection:sdd.mandate,recurrent_sequence_type:0 -msgid "Recurring" -msgstr "Recurring" - -#. module: account_banking_sepa_direct_debit -#: help:res.company,sepa_creditor_identifier:0 -msgid "" -"Enter the Creditor Identifier that has been attributed to your company to " -"make SEPA Direct Debits. This identifier is composed of :\n" -"- your country ISO code (2 letters)\n" -"- a 2-digits checkum\n" -"- a 3-letters business code\n" -"- a country-specific identifier" -msgstr "" -"Entrez l'Identifiant créancier qui a été attribué à votre société pour " -"réaliser des prélèvements SEPA. Cet identifiant est composé de :\n" -"- du code ISO de votre pays (2 lettres)\n" -"- un code de contrôle à 2 chiffres\n" -"- un code d'activité à 3 lettres\n" -"- un identifiant national" - -#. module: account_banking_sepa_direct_debit -#: sql_constraint:sdd.mandate:0 -msgid "A Mandate with the same reference already exists for this company !" -msgstr "Un mandat avec la même référence existe déjà pour cette société !" - -#. module: account_banking_sepa_direct_debit -#: help:sdd.mandate,state:0 -msgid "" -"Only valid mandates can be used in a payment line. A cancelled mandate is a " -"mandate that has been cancelled by the customer. A one-off mandate expires " -"after its first use. A recurrent mandate expires after it's final use or if " -"it hasn't been used for 36 months." -msgstr "" -"Seuls des mandats valides peuvent être utilisés dans une ligne de paiement. " -"Un mandate annulé est un mandat qui a été annulé par le client. Un mandat " -"One-Off expire à l'issue de sa première utilisation. Un mandate récurrent " -"expire après sa dernière utilisation ou si il n'a pas été utilisé pendant 36 " -"mois." - -#. module: account_banking_sepa_direct_debit -#: help:sdd.mandate,recurrent_sequence_type:0 -msgid "" -"This field is only used for Recurrent mandates, not for One-Off mandates." -msgstr "" -"Ce champ n'est utilisé que pour les mandats récurrents, pas pour les mandats " -"One-Off." - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:213 -#, python-format -msgid "The date of signature of mandate '%s' is in the future !" -msgstr "La date de signature du mandat '%s' est dans le futur !" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -msgid "Signature Date" -msgstr "Date de signature" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,charge_bearer:0 -#: field:banking.export.sdd.wizard,charge_bearer:0 -msgid "Charge Bearer" -msgstr "Répartition des frais" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,partner_id:0 -msgid "Partner" -msgstr "Partenaire" - -#. module: account_banking_sepa_direct_debit -#: selection:sdd.mandate,recurrent_sequence_type:0 +#: selection:account.banking.mandate,recurrent_sequence_type:0 msgid "First" msgstr "First" #. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,signature_date:0 -msgid "Date of Signature of the Mandate" -msgstr "Date de signature du mandat" +#: selection:banking.export.sdd.wizard,charge_bearer:0 +msgid "Following Service Level" +msgstr "Suivant le niveau de service" #. module: account_banking_sepa_direct_debit -#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.mandate_cancel -msgid "Mandate Cancelled" -msgstr "Mandat annulé" +#: help:banking.export.sdd.wizard,charge_bearer:0 +msgid "" +"Following service level : transaction charges are to be applied following " +"the rules agreed in the service level and/or scheme (SEPA Core messages must" +" use this). Shared : transaction charges on the creditor side are to be " +"borne by the creditor, transaction charges on the debtor side are to be " +"borne by the debtor. Borne by creditor : all transaction charges are to be " +"borne by the creditor. Borne by debtor : all transaction charges are to be " +"borne by the debtor." +msgstr "Suivant le niveau de service : la répartition des frais bancaires suit les règles pré-établies dans le schema ou dans le contrat avec la banque (les messages SEPA Core doivent utiliser ce paramètre). Partagés : les frais bancaires côté débiteur sont à la charge du débiteur, les frais bancaires côté créancier sont à la charge du créancier. Supportés par le créancier : tous les frais bancaires sont à la charge du créancier. Supportés par le débiteur : tous les frais bancaires sont à la charge du débiteur." #. module: account_banking_sepa_direct_debit -#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.act_banking_export_sdd_payment_order -msgid "Generated SEPA Direct Debit Files" -msgstr "Fichiers de prélèvement SEPA générés" +#: view:banking.export.sdd.wizard:account_banking_sepa_direct_debit.banking_export_sdd_wizard_view +msgid "Generate" +msgstr "Générer" #. module: account_banking_sepa_direct_debit -#: help:sdd.mandate,sepa_migrated:0 +#: field:banking.export.sdd.wizard,id:0 +msgid "ID" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Identifier:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: help:payment.mode,original_creditor_identifier:0 +msgid "" +"If not defined, Original Creditor Identifier from company will be used." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: help:account.banking.mandate,sepa_migrated:0 msgid "" "If this field is not active, the mandate section of the next direct debit " "file that include this mandate will contain the 'Original Mandate " @@ -414,109 +275,176 @@ msgid "" "required in a few countries (Belgium for instance), but not in all " "countries. If this is not required in your country, you should keep this " "field always active." -msgstr "" -"Si cette option n'est pas activée, la section qui concerne le mandat dans le " -"prochain fichier de prélèvement qui incluera ce mandat contiendra les champs " -"'Original Mandate Identification' et 'Original Creditor Scheme " -"Identification'. Ces champs sont requis dans certains pays (en Belgique " -"notamment), mais pas dans tous les pays. Si ces champs ne sont pas requis " -"dans votre pays, vous devriez garder ce champ toujours actif." +msgstr "Si cette option n'est pas activée, la section qui concerne le mandat dans le prochain fichier de prélèvement qui incluera ce mandat contiendra les champs 'Original Mandate Identification' et 'Original Creditor Scheme Identification'. Ces champs sont requis dans certains pays (en Belgique notamment), mais pas dans tous les pays. Si ces champs ne sont pas requis dans votre pays, vous devriez garder ce champ toujours actif." #. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,company_id:0 -msgid "Company" -msgstr "Société" - -#. module: account_banking_sepa_direct_debit -#: model:ir.model,name:account_banking_sepa_direct_debit.model_banking_export_sdd_wizard -msgid "Export SEPA Direct Debit File" -msgstr "Export du fichier de prélèvement SEPA" - -#. module: account_banking_sepa_direct_debit -#: help:banking.export.sdd,batch_booking:0 #: help:banking.export.sdd.wizard,batch_booking:0 msgid "" "If true, the bank statement will display only one credit line for all the " "direct debits of the SEPA file ; if false, the bank statement will display " "one credit line per direct debit of the SEPA file." -msgstr "" -"Si activé, le relevé de compte ne fera apparaître qu'une ligne de crédit " -"pour tous les prélèvements du fichier SEPA ; si désactivé, le relevé de " -"banque fera apparaître une ligne de crédit pour chaque prélèvement du " -"fichier SEPA." +msgstr "Si activé, le relevé de compte ne fera apparaître qu'une ligne de crédit pour tous les prélèvements du fichier SEPA ; si désactivé, le relevé de banque fera apparaître une ligne de crédit pour chaque prélèvement du fichier SEPA." #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:225 +#: code:addons/account_banking_sepa_direct_debit/models/payment_mode.py:43 +#: code:addons/account_banking_sepa_direct_debit/models/res_company.py:33 #, python-format -msgid "" -"Cannot validate the mandate '%s' because it is not attached to a bank " -"account." +msgid "Invalid SEPA Creditor Identifier." +msgstr "Identifiant créancier SEPA invalide." + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,write_uid:0 +msgid "Last Updated by" msgstr "" -"Impossible de valider le mandat '%s' car il n'est pas rattaché à un compte " -"bancaire." #. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd,state:0 -#: view:sdd.mandate:0 -#: selection:sdd.mandate,state:0 -msgid "Draft" -msgstr "Brouillon" +#: field:banking.export.sdd.wizard,write_date:0 +msgid "Last Updated on" +msgstr "" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:290 +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Mandate Reference:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:115 #, python-format msgid "Mandate update" msgstr "Mise-à-jour du mandat" #. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd,charge_bearer:0 -#: selection:banking.export.sdd.wizard,charge_bearer:0 -msgid "Shared" -msgstr "Partagée" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,batch_booking:0 -#: field:banking.export.sdd.wizard,batch_booking:0 -msgid "Batch Booking" -msgstr "Crédit groupé" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,sepa_migrated:0 +#: field:account.banking.mandate,sepa_migrated:0 msgid "Migrated to SEPA" msgstr "Migré à SEPA" #. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,state:0 -msgid "Status" -msgstr "Statut" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,total_amount:0 -#: field:banking.export.sdd.wizard,total_amount:0 -msgid "Total Amount" -msgstr "Montant total" - -#. module: account_banking_sepa_direct_debit -#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.action_account_banking_sdd -#: model:ir.ui.menu,name:account_banking_sepa_direct_debit.menu_account_banking_sdd -msgid "SEPA Direct Debit Files" -msgstr "Fichiers de prélèvement SEPA" - -#. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd,charge_bearer:0 -#: selection:banking.export.sdd.wizard,charge_bearer:0 -msgid "Following Service Level" -msgstr "Suivant le niveau de service" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:233 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:159 #, python-format msgid "" -"The mandate '%s' can't have a date of last debit before the date of " -"signature." +"Missing SEPA Direct Debit mandate on the bank payment line with partner '%s'" +" (reference '%s')." msgstr "" -"Le mandat '%s' ne peut pas avoir une date de dernier débit antérieure à la " -"date de signature." + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,nb_transactions:0 +msgid "Number of Transactions" +msgstr "Nombre de transactions" + +#. module: account_banking_sepa_direct_debit +#: view:account.banking.mandate:account_banking_sepa_direct_debit.sdd_mandate_search +#: selection:account.banking.mandate,type:0 +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "One-Off" +msgstr "One-Off" + +#. module: account_banking_sepa_direct_debit +#: field:payment.mode,original_creditor_identifier:0 +#: field:res.company,original_creditor_identifier:0 +msgid "Original Creditor Identifier" +msgstr "Ancien Identifiant Créancier" + +#. module: account_banking_sepa_direct_debit +#: field:account.banking.mandate,original_mandate_identification:0 +msgid "Original Mandate Identification" +msgstr "Ancien Identifiant du Mandat" + +#. module: account_banking_sepa_direct_debit +#: model:res.groups,name:account_banking_sepa_direct_debit.group_original_mandate_required +msgid "Original Mandate Required (SEPA)" +msgstr "Ancien mandat requis (SEPA)" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_payment_mode +msgid "Payment Mode" +msgstr "Mode de paiement" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,payment_order_ids:0 +msgid "Payment Orders" +msgstr "Ordres de paiement" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:117 +#, python-format +msgid "" +"Payment Type Code '%s' is not supported. The only Payment Type Code " +"supported for SEPA Direct Debit are 'pain.008.001.02', 'pain.008.001.03' and" +" 'pain.008.001.04'." +msgstr "Le code du Type de paiement '%s' n'est pas supporté. Les seuls codes de Type de paiement supportés pour les prélèvements SEPA sont 'pain.008.001.02', 'pain.008.001.03' et 'pain.008.001.04'." + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Postal Code - City - Town:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:account.banking.mandate:account_banking_sepa_direct_debit.sdd_mandate_search +#: selection:account.banking.mandate,type:0 +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Recurrent" +msgstr "Récurrent" + +#. module: account_banking_sepa_direct_debit +#: selection:account.banking.mandate,recurrent_sequence_type:0 +msgid "Recurring" +msgstr "Recurring" + +#. module: account_banking_sepa_direct_debit +#: view:res.partner:account_banking_sepa_direct_debit.sdd_mandate_partner_form +#: view:res.partner.bank:account_banking_sepa_direct_debit.sdd_mandate_partner_bank_tree +msgid "SDD Mandates" +msgstr "Mandats SEPA" + +#. module: account_banking_sepa_direct_debit +#: field:payment.mode,sepa_creditor_identifier:0 +#: field:res.company,sepa_creditor_identifier:0 +msgid "SEPA Creditor Identifier" +msgstr "Identifiant créancier SEPA" + +#. module: account_banking_sepa_direct_debit +#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.mandate_action +msgid "SEPA Direct Debit Mandates" +msgstr "Mandats de prélèvement SEPA" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd.wizard:account_banking_sepa_direct_debit.banking_export_sdd_wizard_view +msgid "SEPA Direct Debit XML file generation" +msgstr "Génération de fichiers de prélèvement SEPA XML" + +#. module: account_banking_sepa_direct_debit +#: view:account.banking.mandate:account_banking_sepa_direct_debit.sdd_mandate_search +#: field:account.banking.mandate,scheme:0 +msgid "Scheme" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Sepa Business-To-Business Direct debit Mandate" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Sepa Direct Debit Mandate" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:35 +#: model:ir.actions.report.xml,name:account_banking_sepa_direct_debit.report_sepa_direct_debit_mandate +#, python-format +msgid "Sepa Mandate" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:account.banking.mandate:account_banking_sepa_direct_debit.sdd_mandate_search +#: view:account.banking.mandate:account_banking_sepa_direct_debit.sdd_mandate_tree +msgid "Sequence Type" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:account.banking.mandate,recurrent_sequence_type:0 +msgid "Sequence Type for Next Debit" +msgstr "Type de séquence pour le prochain prélèvement" #. module: account_banking_sepa_direct_debit #: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_final @@ -524,199 +452,6 @@ msgstr "" msgid "Sequence Type set to Final" msgstr "Type de Séquence mis à Final" -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,message_is_follower:0 -msgid "Is a Follower" -msgstr "Is a Follower" - -#. module: account_banking_sepa_direct_debit -#: help:sdd.mandate,original_mandate_identification:0 -msgid "" -"When the field 'Migrated to SEPA' is not active, this field will be used as " -"the Original Mandate Identification in the Direct Debit file." -msgstr "" -"Quand le champ 'Migré à SEPA' n'est pas activé, ce champ sera le 'Original " -"Mandate Identification' dans le fichier de prélèvement." - -#. module: account_banking_sepa_direct_debit -#: view:payment.order:0 -msgid "SDD Mandate" -msgstr "Mandat de prélèvement" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,original_mandate_identification:0 -msgid "Original Mandate Identification" -msgstr "Ancien Identifiant du Mandat" - -#. module: account_banking_sepa_direct_debit -#: model:ir.model,name:account_banking_sepa_direct_debit.model_res_company -msgid "Companies" -msgstr "Sociétés" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,message_summary:0 -msgid "Summary" -msgstr "Résumé" - -#. module: account_banking_sepa_direct_debit -#: model:res.groups,name:account_banking_sepa_direct_debit.group_original_mandate_required -msgid "Original Mandate Required (SEPA)" -msgstr "Ancien mandat requis (SEPA)" - -#. module: account_banking_sepa_direct_debit -#: field:account.invoice,sdd_mandate_id:0 -#: model:ir.model,name:account_banking_sepa_direct_debit.model_sdd_mandate -#: field:payment.line,sdd_mandate_id:0 -#: view:sdd.mandate:0 -msgid "SEPA Direct Debit Mandate" -msgstr "Mandat de prélèvement SEPA" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:193 -#, python-format -msgid "" -"Missing SEPA Direct Debit mandate on the payment line with partner '%s' and " -"Invoice ref '%s'." -msgstr "" -"Mandat de prélèvement SEPA manquant sur la ligne de paiement ayant pour " -"partenaire '%s' et pour référence de facture '%s'." - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:210 -#, python-format -msgid "" -"The mandate with reference '%s' for partner '%s' has type set to 'One-Off' " -"and it has a last debit date set to '%s', so we can't use it." -msgstr "" -"Le mandat portant la référence '%s' pour le partenaire '%s' est de type 'One-" -"Off' et il a une date de dernier débit au '%s', donc il n'est pas utilisable." - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,scan:0 -msgid "Scan of the Mandate" -msgstr "Scan du mandat" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,last_debit_date:0 -msgid "Date of the Last Debit" -msgstr "Date du dernier prélèvement" - -#. module: account_banking_sepa_direct_debit -#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.mandate_expired -msgid "Mandate Expired" -msgstr "Mandat expiré" - -#. module: account_banking_sepa_direct_debit -#: constraint:res.company:0 -msgid "Invalid SEPA Creditor Identifier." -msgstr "Identifiant créancier SEPA invalide." - -#. module: account_banking_sepa_direct_debit -#: model:ir.model,name:account_banking_sepa_direct_debit.model_res_partner_bank -msgid "Bank Accounts" -msgstr "Comptes bancaires" - -#. module: account_banking_sepa_direct_debit -#: model:ir.actions.act_window,help:account_banking_sepa_direct_debit.sdd_mandate_action -msgid "" -"

\n" -" Click to create a new SEPA Direct Debit Mandate.\n" -"

\n" -" A SEPA Direct Debit Mandate is a document signed by your customer " -"that gives you the autorization to do one or several direct debits on his " -"bank account.\n" -"

\n" -" " -msgstr "" -"

\n" -" Cliquez pour créer un mandat de prélèvement SEPA.\n" -"

\n" -" Un mandat de prélèvement SEPA est un document signé par votre client " -"qui vous donne l'autorisation de réaliser un ou plusieurs prélèvements sur " -"son compte bancaire.\n" -"

\n" -" " - -#. module: account_banking_sepa_direct_debit -#: view:banking.export.sdd:0 -msgid "General Information" -msgstr "Informations générales" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -#: selection:sdd.mandate,state:0 -msgid "Valid" -msgstr "Valide" - -#. module: account_banking_sepa_direct_debit -#: model:ir.model,name:account_banking_sepa_direct_debit.model_account_invoice -msgid "Invoice" -msgstr "Facture" - -#. module: account_banking_sepa_direct_debit -#: view:banking.export.sdd.wizard:0 -#: view:sdd.mandate:0 -msgid "Cancel" -msgstr "Annuler" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -#: field:sdd.mandate,payment_line_ids:0 -msgid "Related Payment Lines" -msgstr "Lignes de paiement associées" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -#: selection:sdd.mandate,type:0 -msgid "Recurrent" -msgstr "Récurrent" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,type:0 -msgid "Type of Mandate" -msgstr "Type de mandat" - -#. module: account_banking_sepa_direct_debit -#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.mandate_valid -msgid "Mandate Validated" -msgstr "Mandat validé" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,file:0 -msgid "SEPA File" -msgstr "Fichier SEPA" - -#. module: account_banking_sepa_direct_debit -#: field:res.company,sepa_creditor_identifier:0 -msgid "SEPA Creditor Identifier" -msgstr "Identifiant créancier SEPA" - -#. module: account_banking_sepa_direct_debit -#: model:ir.model,name:account_banking_sepa_direct_debit.model_banking_export_sdd -msgid "SEPA Direct Debit export" -msgstr "Export de prélèvement SEPA" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -#: selection:sdd.mandate,state:0 -msgid "Expired" -msgstr "Expiré" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,partner_bank_id:0 -msgid "Bank Account" -msgstr "Compte bancaire" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:254 -#, python-format -msgid "" -"You must set the 'Original Mandate Identification' on the recurrent mandate " -"'%s' which is not marked as 'Migrated to SEPA'." -msgstr "" -"Vous devez renseigner le champ 'Ancien identifiant du mandat' sur le mandat " -"récurrent '%s' qui n'est pas marqué comme étant 'Migré à SEPA'." - #. module: account_banking_sepa_direct_debit #: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_first #: model:mail.message.subtype,name:account_banking_sepa_direct_debit.recurrent_sequence_type_first @@ -724,26 +459,130 @@ msgid "Sequence Type set to First" msgstr "Type de Séquence mis à First" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:291 +#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_recurring +#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.recurrent_sequence_type_recurring +msgid "Sequence Type set to Recurring" +msgstr "Type de séquence mis à Recurring" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd.wizard,charge_bearer:0 +msgid "Shared" +msgstr "Partagée" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Signature of the debtor:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,state:0 +msgid "State" +msgstr "État" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Swift BIC (up to 8 or 11 characteres):" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:166 #, python-format msgid "" -"As you changed the bank account attached to this mandate, the 'Sequence " -"Type' has been set back to 'First'." +"The SEPA Direct Debit mandate with reference '%s' for partner '%s' has " +"expired." +msgstr "Le mandat de prélèvement SEPA portant la référence '%s' pour le partenaire '%s' a expiré." + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:174 +#, python-format +msgid "" +"The mandate with reference '%s' for partner '%s' has type set to 'One-Off' " +"and it has a last debit date set to '%s', so we can't use it." +msgstr "Le mandat portant la référence '%s' pour le partenaire '%s' est de type 'One-Off' et il a une date de dernier débit au '%s', donc il n'est pas utilisable." + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:76 +#, python-format +msgid "The recurrent mandate '%s' must have a sequence type." +msgstr "Le mandat récurrent '%s' doit avoir un type de séquence." + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:86 +#, python-format +msgid "" +"The recurrent mandate '%s' which is not marked as 'Migrated to SEPA' must " +"have its recurrent sequence type set to 'First'." +msgstr "Le mandat récurrent '%s' dont l'option 'Migré à SEPA' n'est pas activée doit avec sa séquence mise à 'First'." + +#. module: account_banking_sepa_direct_debit +#: help:account.banking.mandate,recurrent_sequence_type:0 +msgid "" +"This field is only used for Recurrent mandates, not for One-Off mandates." +msgstr "Ce champ n'est utilisé que pour les mandats récurrents, pas pour les mandats One-Off." + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "" +"This mandate is only intended for business-to-business transactions.\n" +" You are not entitled to a refund from your bank after your account has\n" +" been debited, but you are entitled to request your bank\n" +" not to debit your account up until the day on which the payment is due." msgstr "" -"Etant donné que vous avez changé le compte bancaire associé à ce mandat, le " -"'Type de séquence' a été remis à 'First'." #. module: account_banking_sepa_direct_debit -#: help:sdd.mandate,message_ids:0 -msgid "Messages and communication history" -msgstr "Messages and communication history" +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "To be completed by the creditor" +msgstr "" #. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -msgid "Search SEPA Direct Debit Mandates" -msgstr "Recherche dans les mandats de prélèvement SEPA" +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "To be completed by the debtor" +msgstr "" #. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd.wizard,file:0 -msgid "File" -msgstr "Fichier" +#: field:banking.export.sdd.wizard,total_amount:0 +msgid "Total Amount" +msgstr "Montant total" + +#. module: account_banking_sepa_direct_debit +#: view:account.banking.mandate:account_banking_sepa_direct_debit.sdd_mandate_search +#: view:account.banking.mandate:account_banking_sepa_direct_debit.sdd_mandate_tree +msgid "Type" +msgstr "Type" + +#. module: account_banking_sepa_direct_debit +#: field:account.banking.mandate,type:0 +msgid "Type of Mandate" +msgstr "Type de mandat" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Type of payment:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd.wizard:account_banking_sepa_direct_debit.banking_export_sdd_wizard_view +msgid "Validate" +msgstr "Valider" + +#. module: account_banking_sepa_direct_debit +#: help:account.banking.mandate,original_mandate_identification:0 +msgid "" +"When the field 'Migrated to SEPA' is not active, this field will be used as " +"the Original Mandate Identification in the Direct Debit file." +msgstr "Quand le champ 'Migré à SEPA' n'est pas activé, ce champ sera le 'Original Mandate Identification' dans le fichier de prélèvement." + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:98 +#, python-format +msgid "" +"You must set the 'Original Mandate Identification' on the recurrent mandate " +"'%s' which is not marked as 'Migrated to SEPA'." +msgstr "Vous devez renseigner le champ 'Ancien identifiant du mandat' sur le mandat récurrent '%s' qui n'est pas marqué comme étant 'Migré à SEPA'." + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "" +"to send instructions to your bank to debit your account and (B) your bank to\n" +" debit your account in accordance with the instructions from" +msgstr "" diff --git a/account_banking_sepa_direct_debit/i18n/nl.po b/account_banking_sepa_direct_debit/i18n/nl.po index 2c2ccc12f..8fb3b71df 100644 --- a/account_banking_sepa_direct_debit/i18n/nl.po +++ b/account_banking_sepa_direct_debit/i18n/nl.po @@ -1,52 +1,221 @@ -# Dutch translation for banking-addons -# Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 -# This file is distributed under the same license as the banking-addons package. -# FIRST AUTHOR , 2014. -# +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_banking_sepa_direct_debit +# +# Translators: +# FIRST AUTHOR , 2014 msgid "" msgstr "" -"Project-Id-Version: banking-addons\n" -"Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2013-12-23 22:24+0000\n" -"PO-Revision-Date: 2014-04-24 10:38+0000\n" -"Last-Translator: Erwin van der Ploeg (BAS Solutions) \n" -"Language-Team: Dutch \n" +"Project-Id-Version: bank-payment (8.0)\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-04-08 00:46+0000\n" +"PO-Revision-Date: 2016-04-07 16:04+0000\n" +"Last-Translator: OCA Transbot \n" +"Language-Team: Dutch (http://www.transifex.com/oca/OCA-bank-payment-8-0/language/nl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2014-05-31 06:02+0000\n" -"X-Generator: Launchpad (build 17031)\n" +"Content-Transfer-Encoding: \n" +"Language: nl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" #. module: account_banking_sepa_direct_debit -#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.mandate_valid -msgid "SEPA Direct Debit Mandate Validated" -msgstr "SEPA incasso machtiging bevestigd." +#: model:ir.actions.act_window,help:account_banking_sepa_direct_debit.mandate_action +msgid "" +"

\n" +" Click to create a new SEPA Direct Debit Mandate.\n" +"

\n" +" A SEPA Direct Debit Mandate is a document signed by your customer that gives you the autorization to do one or several direct debits on his bank account.\n" +"

\n" +" " +msgstr "

\n Klik voor het maken van een nieuwe SEPA incasso machtiging.\n

\n Een SEPA incasso machtiging is een document ondertekend door uw klant, welke u toestemming geeft om incasso's uit te voeren op zijn bankrekening.\n

\n " + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_account_banking_mandate +msgid "A generic banking mandate" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "" +"ALL GAPS ARE MANDATORY. ONCE THIS MANDATE HAS BEEN SIGNED MUST BE SENT TO " +"CREDITOR FOR STORAGE." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "" +"ALL GAPS ARE MANDATORY. ONCE THIS MANDATE HAS BEEN SIGNED MUST BE SENT TO CREDITOR FOR STORAGE.\n" +" NEVERTHELESS, THE BANK OF DEBTOR REQUIRES DEBTOR’S AUTHORIZATION BEFORE DEBITING B2B DIRECT DEBITS IN THE ACCOUNT.\n" +" THE DEBTOR WILL BE ABLE TO MANAGE THE MENTIONED AUTHORIZATION THROUGH THE MEANS PROVIDED BY HIS BANK." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Account Number - IBAN:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Address of the Debtor:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Address:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "" +"As part of your rights, you are entitled to a refund from\n" +" your bank under the terms and conditions of your agreement\n" +" with your bank.\n" +" A refund must be claimed within 8 weeks starting from the date on which your account was debited." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:116 +#, python-format +msgid "" +"As you changed the bank account attached to this mandate, the 'Sequence " +"Type' has been set back to 'First'." +msgstr "Omdat u de gekoppelde bankrekening heeft gewijzigd is de reeks terug gezet naar 'Eerste'." + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_bank_payment_line +msgid "Bank Payment Lines" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:account.banking.mandate,scheme:0 +msgid "Basic (CORE)" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,batch_booking:0 +msgid "Batch Booking" +msgstr "Bach verwerking" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd.wizard,charge_bearer:0 +msgid "Borne by Creditor" +msgstr "Op rekening van schuldeiser" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd.wizard,charge_bearer:0 +msgid "Borne by Debtor" +msgstr "Rekening van schuldenaar" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "By signing this mandate form, you authorise (A)" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd.wizard:account_banking_sepa_direct_debit.banking_export_sdd_wizard_view +msgid "Cancel" +msgstr "Annuleer" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,charge_bearer:0 +msgid "Charge Bearer" +msgstr "Kostenverdeling" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_res_company +msgid "Companies" +msgstr "Bedrijven" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Country of the debtor:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Country:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd.wizard,state:0 +msgid "Create" +msgstr "Aanmaken" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,create_uid:0 +msgid "Created by" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,create_date:0 +msgid "Created on" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Creditor's Name:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Date - Location:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Debtor's Name:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: help:payment.mode,sepa_creditor_identifier:0 +msgid "" +"Enter the Creditor Identifier that has been attributed to your company to make SEPA Direct Debits. If not defined, SEPA Creditor Identifier from company will be used.\n" +"This identifier is composed of :\n" +"- your country ISO code (2 letters)\n" +"- a 2-digits checkum\n" +"- a 3-letters business code\n" +"- a country-specific identifier" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: help:res.company,sepa_creditor_identifier:0 +msgid "" +"Enter the Creditor Identifier that has been attributed to your company to make SEPA Direct Debits. This identifier is composed of :\n" +"- your country ISO code (2 letters)\n" +"- a 2-digits checkum\n" +"- a 3-letters business code\n" +"- a country-specific identifier" +msgstr "Geef de Incassant-ID in, welke is toegewezen aan uw bedrijf om incasso's uit te voeren. De Incassant-ID is samengesteld uit:\n- uw ISO landcode (2 letters)\n- een 2 cijferig controlegetal\n- een 3 cijferig business code\n- een landspecifieke identifier" + +#. module: account_banking_sepa_direct_debit +#: selection:account.banking.mandate,scheme:0 +msgid "Enterprise (B2B)" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/payment_mode.py:42 +#: code:addons/account_banking_sepa_direct_debit/models/res_company.py:32 +#, python-format +msgid "Error" +msgstr "Fout" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_banking_export_sdd_wizard +msgid "Export SEPA Direct Debit File" +msgstr "Exporteer SEPA incasso bestand" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,file:0 +msgid "File" +msgstr "Bestand" #. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,filename:0 #: field:banking.export.sdd.wizard,filename:0 msgid "Filename" msgstr "Bestandsnaam" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:200 -#, python-format -msgid "" -"The SEPA Direct Debit mandate with reference '%s' for partner '%s' has " -"expired." -msgstr "" -"De SEPA incasso machtiging met referentie '%s' voor relatie '%s' is verlopen." - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:219 -#, python-format -msgid "Cannot validate the mandate '%s' without a date of signature." -msgstr "" -"Het is niet mogelijk de machtiging '%s' te bevestigen zonder een datum van " -"ondertekenen." - -#. module: account_banking_sepa_direct_debit -#: selection:sdd.mandate,recurrent_sequence_type:0 +#: selection:account.banking.mandate,recurrent_sequence_type:0 msgid "Final" msgstr "Definitief" @@ -56,361 +225,50 @@ msgid "Finish" msgstr "Gereed" #. module: account_banking_sepa_direct_debit -#: view:res.partner:0 -#: view:res.partner.bank:0 -msgid "SDD Mandates" -msgstr "SDD machteging" - -#. module: account_banking_sepa_direct_debit -#: constraint:payment.line:0 -#: constraint:sdd.mandate:0 -msgid "Error msg in raise" -msgstr "Fout bericht" - -#. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd,state:0 -msgid "Reconciled" -msgstr "Afgeletterd" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,recurrent_sequence_type:0 -msgid "Sequence Type for Next Debit" -msgstr "Reeks soort voor volgende incasso" - -#. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd,charge_bearer:0 -#: selection:banking.export.sdd.wizard,charge_bearer:0 -msgid "Borne by Creditor" -msgstr "Op rekening van schuldeiser" - -#. module: account_banking_sepa_direct_debit -#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.sdd_mandate_action -#: model:ir.ui.menu,name:account_banking_sepa_direct_debit.sdd_mandate_menu -#: view:res.partner.bank:0 -#: field:res.partner.bank,sdd_mandate_ids:0 -msgid "SEPA Direct Debit Mandates" -msgstr "SEPA incasso machtegingen" - -#. module: account_banking_sepa_direct_debit -#: view:banking.export.sdd.wizard:0 -#: view:sdd.mandate:0 -msgid "Validate" -msgstr "Bevestigen" - -#. module: account_banking_sepa_direct_debit -#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_recurring -#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.recurrent_sequence_type_recurring -msgid "Sequence Type set to Recurring" -msgstr "Reeks soort ingesteld op herhalend" - -#. module: account_banking_sepa_direct_debit -#: view:banking.export.sdd.wizard:0 -msgid "Generate" -msgstr "Genereer" - -#. module: account_banking_sepa_direct_debit -#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.mandate_cancel -msgid "SEPA Direct Debit Mandate Cancelled" -msgstr "SEPA incasso machtegingen geannuleerd" - -#. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd,charge_bearer:0 -#: selection:banking.export.sdd.wizard,charge_bearer:0 -msgid "Borne by Debtor" -msgstr "Rekening van schuldenaar" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:212 -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:218 -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:224 -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:232 -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:239 -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:245 -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:253 -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:395 -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:140 -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:192 -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:199 -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:209 -#, python-format -msgid "Error:" -msgstr "Fout:" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,message_ids:0 -msgid "Messages" -msgstr "Berichten" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,unique_mandate_reference:0 -msgid "Unique Mandate Reference" -msgstr "Unieke machtiging referentie" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -#: selection:sdd.mandate,state:0 -msgid "Cancelled" -msgstr "Geannuleerd" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:141 -#, python-format -msgid "" -"Payment Type Code '%s' is not supported. The only Payment Type Code " -"supported for SEPA Direct Debit are 'pain.008.001.02', 'pain.008.001.03' and " -"'pain.008.001.04'." -msgstr "" -"Betaal soort code '%s' wordt niet ondersteund. De enige betaalsoort code " -"ondersteund voor SEPA incasso's zijn 'pain.008.001.02', 'pain.008.001.03' en " -"'pain.008.001.04'." - -#. module: account_banking_sepa_direct_debit -#: help:sdd.mandate,message_unread:0 -msgid "If checked new messages require your attention." -msgstr "Indien aangevinkt zullen nieuwe berichten uw aandacht vragen." - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd.wizard,file_id:0 -msgid "SDD File" -msgstr "SDD bestand" - -#. module: account_banking_sepa_direct_debit -#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.mandate_expired -msgid "SEPA Direct Debit Mandate has Expired" -msgstr "SEPA Direct incasso machtiging is verlopen" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:246 -#, python-format -msgid "" -"The recurrent mandate '%s' which is not marked as 'Migrated to SEPA' must " -"have its recurrent sequence type set to 'First'." -msgstr "" -"Bij de herhalende machtiging '%s' welke niet is gemarkeerd als 'gemigreerd " -"naar SEPA' dient de reeks soort te worden ingesteld op 'Eerste'." - -#. module: account_banking_sepa_direct_debit -#: help:banking.export.sdd,charge_bearer:0 -#: help:banking.export.sdd.wizard,charge_bearer:0 -msgid "" -"Following service level : transaction charges are to be applied following " -"the rules agreed in the service level and/or scheme (SEPA Core messages must " -"use this). Shared : transaction charges on the creditor side are to be borne " -"by the creditor, transaction charges on the debtor side are to be borne by " -"the debtor. Borne by creditor : all transaction charges are to be borne by " -"the creditor. Borne by debtor : all transaction charges are to be borne by " -"the debtor." -msgstr "" -"Volg service level: Transactie kosten worden toegepast volgens de " -"afgesproken regels in het service level en/of schema (Voor SEPA berichten " -"deze gebruiken). Gedeeld : De transactiekosten aan de crediteur zijde zijn " -"voor de schuldenaar, transactiekosten aan de debiteur kant zijn voor de " -"schuldeiser. Op rekening van de schuldenaar: Alle transactie kosten zijn " -"voor rekening van de schuldenaar. Op rekening van de schuldeiser: Alle " -"transactie kosten zijn voor rekening van de schuldeiser." - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -msgid "Reference" -msgstr "Referentie" - -#. module: account_banking_sepa_direct_debit -#: view:banking.export.sdd:0 -msgid "SEPA Direct Debit" -msgstr "SEPA Incasso (Direct Debit)" - -#. module: account_banking_sepa_direct_debit -#: view:banking.export.sdd.wizard:0 -msgid "SEPA Direct Debit XML file generation" -msgstr "SEPA Incasso XML bestand aanmaken" - -#. module: account_banking_sepa_direct_debit -#: help:sdd.mandate,message_summary:0 -msgid "" -"Holds the Chatter summary (number of messages, ...). This summary is " -"directly in html format in order to be inserted in kanban views." -msgstr "" -"Bevat de samenvatting van de chatter (aantal berichten,...). Deze " -"samenvatting is direct in html formaat om zo in de kanban weergave te worden " -"ingevoegd." - -#. module: account_banking_sepa_direct_debit -#: model:ir.model,name:account_banking_sepa_direct_debit.model_payment_line -msgid "Payment Line" -msgstr "Betaalregel" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,create_date:0 -msgid "Generation Date" -msgstr "Aangemaakt op" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:396 -#, python-format -msgid "" -"The payment line with reference '%s' has the bank account '%s' which is not " -"attached to the mandate '%s' (this mandate is attached to the bank account " -"'%s')." -msgstr "" -"De betaalregel met referentie '%s' heeft het bankrekeningnummer '%s' welke " -"niet is gekoppeld aan de machtiging '%s' (deze machtiging is gekoppeld aan " -"bankrekening '%s')." - -#. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd.wizard,state:0 -msgid "Create" -msgstr "Aanmaken" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,nb_transactions:0 -#: field:banking.export.sdd.wizard,nb_transactions:0 -msgid "Number of Transactions" -msgstr "Aantal transacties" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -#: selection:sdd.mandate,type:0 -msgid "One-Off" -msgstr "Eenmalig" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,state:0 -#: field:banking.export.sdd.wizard,state:0 -msgid "State" -msgstr "Status" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:240 -#, python-format -msgid "The recurrent mandate '%s' must have a sequence type." -msgstr "De herhalende machtiging '%s' dient een reeks soort te hebben." - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,message_follower_ids:0 -msgid "Followers" -msgstr "Volgers" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,message_unread:0 -msgid "Unread Messages" -msgstr "Ongelezen berichten" - -#. module: account_banking_sepa_direct_debit -#: view:banking.export.sdd:0 -#: field:banking.export.sdd,payment_order_ids:0 -#: field:banking.export.sdd.wizard,payment_order_ids:0 -msgid "Payment Orders" -msgstr "Betaalopdrachten" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -msgid "Type" -msgstr "Soort" - -#. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd,state:0 -msgid "Sent" -msgstr "Verstuurd" - -#. module: account_banking_sepa_direct_debit -#: field:res.company,original_creditor_identifier:0 -msgid "Original Creditor Identifier" -msgstr "Originele Incassant-ID" - -#. module: account_banking_sepa_direct_debit -#: selection:sdd.mandate,recurrent_sequence_type:0 -msgid "Recurring" -msgstr "Terugkerend" - -#. module: account_banking_sepa_direct_debit -#: help:res.company,sepa_creditor_identifier:0 -msgid "" -"Enter the Creditor Identifier that has been attributed to your company to " -"make SEPA Direct Debits. This identifier is composed of :\n" -"- your country ISO code (2 letters)\n" -"- a 2-digits checkum\n" -"- a 3-letters business code\n" -"- a country-specific identifier" -msgstr "" -"Geef de Incassant-ID in, welke is toegewezen aan uw bedrijf om incasso's uit " -"te voeren. De Incassant-ID is samengesteld uit:\n" -"- uw ISO landcode (2 letters)\n" -"- een 2 cijferig controlegetal\n" -"- een 3 cijferig business code\n" -"- een landspecifieke identifier" - -#. module: account_banking_sepa_direct_debit -#: sql_constraint:sdd.mandate:0 -msgid "A Mandate with the same reference already exists for this company !" -msgstr "Een machtiging met dezelfde referentie bestaat al vooR dit bedrijf!" - -#. module: account_banking_sepa_direct_debit -#: help:sdd.mandate,state:0 -msgid "" -"Only valid mandates can be used in a payment line. A cancelled mandate is a " -"mandate that has been cancelled by the customer. A one-off mandate expires " -"after its first use. A recurrent mandate expires after it's final use or if " -"it hasn't been used for 36 months." -msgstr "" -"Alleen geldige machtigingen kunnen worden gebruikt op betaalregels. Een " -"geannuleerde machtiging is een machtiging welke is geannuleerd door de " -"klant. Een eenmalige machtiging verloopt na eenmalig gebruik. Een herhalende " -"machtiging verloopt na zijn laatste gebruik of als deze niet is gebruikt " -"voor 36 maanden." - -#. module: account_banking_sepa_direct_debit -#: help:sdd.mandate,recurrent_sequence_type:0 -msgid "" -"This field is only used for Recurrent mandates, not for One-Off mandates." -msgstr "" -"Dit veld wordt alleen gebruikt voor herhalende machtigingen, niet voor een " -"eenmalige machtiging." - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:213 -#, python-format -msgid "The date of signature of mandate '%s' is in the future !" -msgstr "" -"De datum van de handtekening van de machtiging '%s' is in de toekomst!" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -msgid "Signature Date" -msgstr "Handtekening datum" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,charge_bearer:0 -#: field:banking.export.sdd.wizard,charge_bearer:0 -msgid "Charge Bearer" -msgstr "Kostenverdeling" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,partner_id:0 -msgid "Partner" -msgstr "Relatie" - -#. module: account_banking_sepa_direct_debit -#: selection:sdd.mandate,recurrent_sequence_type:0 +#: selection:account.banking.mandate,recurrent_sequence_type:0 msgid "First" msgstr "Eerste" #. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,signature_date:0 -msgid "Date of Signature of the Mandate" -msgstr "Datum avn de handtekening van de machtiging" +#: selection:banking.export.sdd.wizard,charge_bearer:0 +msgid "Following Service Level" +msgstr "Volg service level" #. module: account_banking_sepa_direct_debit -#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.mandate_cancel -msgid "Mandate Cancelled" -msgstr "Machtiging geannuleerd" +#: help:banking.export.sdd.wizard,charge_bearer:0 +msgid "" +"Following service level : transaction charges are to be applied following " +"the rules agreed in the service level and/or scheme (SEPA Core messages must" +" use this). Shared : transaction charges on the creditor side are to be " +"borne by the creditor, transaction charges on the debtor side are to be " +"borne by the debtor. Borne by creditor : all transaction charges are to be " +"borne by the creditor. Borne by debtor : all transaction charges are to be " +"borne by the debtor." +msgstr "Volg service level: Transactie kosten worden toegepast volgens de afgesproken regels in het service level en/of schema (Voor SEPA berichten deze gebruiken). Gedeeld : De transactiekosten aan de crediteur zijde zijn voor de schuldenaar, transactiekosten aan de debiteur kant zijn voor de schuldeiser. Op rekening van de schuldenaar: Alle transactie kosten zijn voor rekening van de schuldenaar. Op rekening van de schuldeiser: Alle transactie kosten zijn voor rekening van de schuldeiser." #. module: account_banking_sepa_direct_debit -#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.act_banking_export_sdd_payment_order -msgid "Generated SEPA Direct Debit Files" -msgstr "Genereerde SEPA incasso bestanden" +#: view:banking.export.sdd.wizard:account_banking_sepa_direct_debit.banking_export_sdd_wizard_view +msgid "Generate" +msgstr "Genereer" #. module: account_banking_sepa_direct_debit -#: help:sdd.mandate,sepa_migrated:0 +#: field:banking.export.sdd.wizard,id:0 +msgid "ID" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Identifier:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: help:payment.mode,original_creditor_identifier:0 +msgid "" +"If not defined, Original Creditor Identifier from company will be used." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: help:account.banking.mandate,sepa_migrated:0 msgid "" "If this field is not active, the mandate section of the next direct debit " "file that include this mandate will contain the 'Original Mandate " @@ -418,108 +276,176 @@ msgid "" "required in a few countries (Belgium for instance), but not in all " "countries. If this is not required in your country, you should keep this " "field always active." -msgstr "" -"Indien niet aangevinkt, zal het machtiging gedeelte van het volgende incasso " -"bestand, dat deze machtiging bevat, de 'Originele machtiging identificatie' " -"en de 'Origineel schuldeiser identificatie' bevatten. Dit is verplicht in " -"een aantal landen (zoals bijvoorbeeld België), maar niet in alle landen. " -"Indien dit niet verplicht is in uw land, dient u dit veld altijd aangevinkt " -"te houden." +msgstr "Indien niet aangevinkt, zal het machtiging gedeelte van het volgende incasso bestand, dat deze machtiging bevat, de 'Originele machtiging identificatie' en de 'Origineel schuldeiser identificatie' bevatten. Dit is verplicht in een aantal landen (zoals bijvoorbeeld België), maar niet in alle landen. Indien dit niet verplicht is in uw land, dient u dit veld altijd aangevinkt te houden." #. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,company_id:0 -msgid "Company" -msgstr "Bedijf" - -#. module: account_banking_sepa_direct_debit -#: model:ir.model,name:account_banking_sepa_direct_debit.model_banking_export_sdd_wizard -msgid "Export SEPA Direct Debit File" -msgstr "Exporteer SEPA incasso bestand" - -#. module: account_banking_sepa_direct_debit -#: help:banking.export.sdd,batch_booking:0 #: help:banking.export.sdd.wizard,batch_booking:0 msgid "" "If true, the bank statement will display only one credit line for all the " "direct debits of the SEPA file ; if false, the bank statement will display " "one credit line per direct debit of the SEPA file." -msgstr "" -"Indien aangevinkt, zal het bankafschrift maar één credit regel weergeven " -"voor alle incasso's van het SEPA bestand. Indien niet aangevinkt wordt voor " -"iedere incasso een credit regel weergegeven op het bankafschrift." +msgstr "Indien aangevinkt, zal het bankafschrift maar één credit regel weergeven voor alle incasso's van het SEPA bestand. Indien niet aangevinkt wordt voor iedere incasso een credit regel weergegeven op het bankafschrift." #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:225 +#: code:addons/account_banking_sepa_direct_debit/models/payment_mode.py:43 +#: code:addons/account_banking_sepa_direct_debit/models/res_company.py:33 #, python-format -msgid "" -"Cannot validate the mandate '%s' because it is not attached to a bank " -"account." +msgid "Invalid SEPA Creditor Identifier." +msgstr "Ongeldige SEPA Incassant-ID." + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,write_uid:0 +msgid "Last Updated by" msgstr "" -"Kan de machtiging '%s' niet bevestigen omdat deze niet is gekoppeld aan een " -"bankrekening." #. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd,state:0 -#: view:sdd.mandate:0 -#: selection:sdd.mandate,state:0 -msgid "Draft" -msgstr "Concept" +#: field:banking.export.sdd.wizard,write_date:0 +msgid "Last Updated on" +msgstr "" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:290 +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Mandate Reference:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:115 #, python-format msgid "Mandate update" msgstr "Machtiging bijwerken" #. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd,charge_bearer:0 -#: selection:banking.export.sdd.wizard,charge_bearer:0 -msgid "Shared" -msgstr "Gedeeld" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,batch_booking:0 -#: field:banking.export.sdd.wizard,batch_booking:0 -msgid "Batch Booking" -msgstr "Bach verwerking" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,sepa_migrated:0 +#: field:account.banking.mandate,sepa_migrated:0 msgid "Migrated to SEPA" msgstr "Gemigreerd naar SEPa" #. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,state:0 -msgid "Status" -msgstr "Status" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,total_amount:0 -#: field:banking.export.sdd.wizard,total_amount:0 -msgid "Total Amount" -msgstr "Totaalbedrag" - -#. module: account_banking_sepa_direct_debit -#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.action_account_banking_sdd -#: model:ir.ui.menu,name:account_banking_sepa_direct_debit.menu_account_banking_sdd -msgid "SEPA Direct Debit Files" -msgstr "SEPA incasso bestanden" - -#. module: account_banking_sepa_direct_debit -#: selection:banking.export.sdd,charge_bearer:0 -#: selection:banking.export.sdd.wizard,charge_bearer:0 -msgid "Following Service Level" -msgstr "Volg service level" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:233 +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:159 #, python-format msgid "" -"The mandate '%s' can't have a date of last debit before the date of " -"signature." +"Missing SEPA Direct Debit mandate on the bank payment line with partner '%s'" +" (reference '%s')." msgstr "" -"De machtiging '%s' kan geen datum van laatste incasso hebben die eerder is " -"dan de datum van ondertekening." + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,nb_transactions:0 +msgid "Number of Transactions" +msgstr "Aantal transacties" + +#. module: account_banking_sepa_direct_debit +#: view:account.banking.mandate:account_banking_sepa_direct_debit.sdd_mandate_search +#: selection:account.banking.mandate,type:0 +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "One-Off" +msgstr "Eenmalig" + +#. module: account_banking_sepa_direct_debit +#: field:payment.mode,original_creditor_identifier:0 +#: field:res.company,original_creditor_identifier:0 +msgid "Original Creditor Identifier" +msgstr "Originele Incassant-ID" + +#. module: account_banking_sepa_direct_debit +#: field:account.banking.mandate,original_mandate_identification:0 +msgid "Original Mandate Identification" +msgstr "Originele machtiging indificatie" + +#. module: account_banking_sepa_direct_debit +#: model:res.groups,name:account_banking_sepa_direct_debit.group_original_mandate_required +msgid "Original Mandate Required (SEPA)" +msgstr "Originele machtiging benodigd (SEPA)" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_payment_mode +msgid "Payment Mode" +msgstr "Betaalwijze" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,payment_order_ids:0 +msgid "Payment Orders" +msgstr "Betaalopdrachten" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:117 +#, python-format +msgid "" +"Payment Type Code '%s' is not supported. The only Payment Type Code " +"supported for SEPA Direct Debit are 'pain.008.001.02', 'pain.008.001.03' and" +" 'pain.008.001.04'." +msgstr "Betaal soort code '%s' wordt niet ondersteund. De enige betaalsoort code ondersteund voor SEPA incasso's zijn 'pain.008.001.02', 'pain.008.001.03' en 'pain.008.001.04'." + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Postal Code - City - Town:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:account.banking.mandate:account_banking_sepa_direct_debit.sdd_mandate_search +#: selection:account.banking.mandate,type:0 +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Recurrent" +msgstr "Terugkerend" + +#. module: account_banking_sepa_direct_debit +#: selection:account.banking.mandate,recurrent_sequence_type:0 +msgid "Recurring" +msgstr "Terugkerend" + +#. module: account_banking_sepa_direct_debit +#: view:res.partner:account_banking_sepa_direct_debit.sdd_mandate_partner_form +#: view:res.partner.bank:account_banking_sepa_direct_debit.sdd_mandate_partner_bank_tree +msgid "SDD Mandates" +msgstr "SDD machteging" + +#. module: account_banking_sepa_direct_debit +#: field:payment.mode,sepa_creditor_identifier:0 +#: field:res.company,sepa_creditor_identifier:0 +msgid "SEPA Creditor Identifier" +msgstr "SEPA Incassant-ID" + +#. module: account_banking_sepa_direct_debit +#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.mandate_action +msgid "SEPA Direct Debit Mandates" +msgstr "SEPA incasso machtegingen" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd.wizard:account_banking_sepa_direct_debit.banking_export_sdd_wizard_view +msgid "SEPA Direct Debit XML file generation" +msgstr "SEPA Incasso XML bestand aanmaken" + +#. module: account_banking_sepa_direct_debit +#: view:account.banking.mandate:account_banking_sepa_direct_debit.sdd_mandate_search +#: field:account.banking.mandate,scheme:0 +msgid "Scheme" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Sepa Business-To-Business Direct debit Mandate" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Sepa Direct Debit Mandate" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:35 +#: model:ir.actions.report.xml,name:account_banking_sepa_direct_debit.report_sepa_direct_debit_mandate +#, python-format +msgid "Sepa Mandate" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:account.banking.mandate:account_banking_sepa_direct_debit.sdd_mandate_search +#: view:account.banking.mandate:account_banking_sepa_direct_debit.sdd_mandate_tree +msgid "Sequence Type" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:account.banking.mandate,recurrent_sequence_type:0 +msgid "Sequence Type for Next Debit" +msgstr "Reeks soort voor volgende incasso" #. module: account_banking_sepa_direct_debit #: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_final @@ -527,201 +453,6 @@ msgstr "" msgid "Sequence Type set to Final" msgstr "Reeks soort ingesteld op definitief" -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,message_is_follower:0 -msgid "Is a Follower" -msgstr "Is een volger" - -#. module: account_banking_sepa_direct_debit -#: help:sdd.mandate,original_mandate_identification:0 -msgid "" -"When the field 'Migrated to SEPA' is not active, this field will be used as " -"the Original Mandate Identification in the Direct Debit file." -msgstr "" -"Wanneer het veld 'gemigreerd naar SEPA' niet actief is, zal dit veld worden " -"gebruikt als de originele machtiging identificatie in het incasso bestand." - -#. module: account_banking_sepa_direct_debit -#: view:payment.order:0 -msgid "SDD Mandate" -msgstr "SDD machtiging" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,original_mandate_identification:0 -msgid "Original Mandate Identification" -msgstr "Originele machtiging indificatie" - -#. module: account_banking_sepa_direct_debit -#: model:ir.model,name:account_banking_sepa_direct_debit.model_res_company -msgid "Companies" -msgstr "Bedrijven" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,message_summary:0 -msgid "Summary" -msgstr "Samenvatting" - -#. module: account_banking_sepa_direct_debit -#: model:res.groups,name:account_banking_sepa_direct_debit.group_original_mandate_required -msgid "Original Mandate Required (SEPA)" -msgstr "Originele machtiging benodigd (SEPA)" - -#. module: account_banking_sepa_direct_debit -#: field:account.invoice,sdd_mandate_id:0 -#: model:ir.model,name:account_banking_sepa_direct_debit.model_sdd_mandate -#: field:payment.line,sdd_mandate_id:0 -#: view:sdd.mandate:0 -msgid "SEPA Direct Debit Mandate" -msgstr "SEPA incasso machtiging" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:193 -#, python-format -msgid "" -"Missing SEPA Direct Debit mandate on the payment line with partner '%s' and " -"Invoice ref '%s'." -msgstr "" -"Ontbrekende SEPA incasso machtiging op de betaalregel met relatie '%s' en " -"factuur referentie '%s'." - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:210 -#, python-format -msgid "" -"The mandate with reference '%s' for partner '%s' has type set to 'One-Off' " -"and it has a last debit date set to '%s', so we can't use it." -msgstr "" -"De machtiging referentie '%s' voor relatie %s' is ingesteld op 'eenmalig' en " -"de laatste incasso datum is ingesteld op '%s'. Zodoende kunnen we deze niet " -"gebruiken." - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,scan:0 -msgid "Scan of the Mandate" -msgstr "Scan van de machteging" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,last_debit_date:0 -msgid "Date of the Last Debit" -msgstr "Datum van laatste incasso" - -#. module: account_banking_sepa_direct_debit -#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.mandate_expired -msgid "Mandate Expired" -msgstr "Machtiging verlopen" - -#. module: account_banking_sepa_direct_debit -#: constraint:res.company:0 -msgid "Invalid SEPA Creditor Identifier." -msgstr "Ongeldige SEPA Incassant-ID." - -#. module: account_banking_sepa_direct_debit -#: model:ir.model,name:account_banking_sepa_direct_debit.model_res_partner_bank -msgid "Bank Accounts" -msgstr "Bankrekeningen" - -#. module: account_banking_sepa_direct_debit -#: model:ir.actions.act_window,help:account_banking_sepa_direct_debit.sdd_mandate_action -msgid "" -"

\n" -" Click to create a new SEPA Direct Debit Mandate.\n" -"

\n" -" A SEPA Direct Debit Mandate is a document signed by your customer " -"that gives you the autorization to do one or several direct debits on his " -"bank account.\n" -"

\n" -" " -msgstr "" -"

\n" -" Klik voor het maken van een nieuwe SEPA incasso machtiging.\n" -"

\n" -" Een SEPA incasso machtiging is een document ondertekend door uw " -"klant, welke u toestemming geeft om incasso's uit te voeren op zijn " -"bankrekening.\n" -"

\n" -" " - -#. module: account_banking_sepa_direct_debit -#: view:banking.export.sdd:0 -msgid "General Information" -msgstr "Algemene informatie" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -#: selection:sdd.mandate,state:0 -msgid "Valid" -msgstr "Geldig" - -#. module: account_banking_sepa_direct_debit -#: model:ir.model,name:account_banking_sepa_direct_debit.model_account_invoice -msgid "Invoice" -msgstr "Factuur" - -#. module: account_banking_sepa_direct_debit -#: view:banking.export.sdd.wizard:0 -#: view:sdd.mandate:0 -msgid "Cancel" -msgstr "Annuleer" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -#: field:sdd.mandate,payment_line_ids:0 -msgid "Related Payment Lines" -msgstr "Gerelateerde betaalregels" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -#: selection:sdd.mandate,type:0 -msgid "Recurrent" -msgstr "Terugkerend" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,type:0 -msgid "Type of Mandate" -msgstr "Soort machtiging" - -#. module: account_banking_sepa_direct_debit -#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.mandate_valid -msgid "Mandate Validated" -msgstr "Machtiging bevestigd" - -#. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd,file:0 -msgid "SEPA File" -msgstr "SEPA bestand" - -#. module: account_banking_sepa_direct_debit -#: field:res.company,sepa_creditor_identifier:0 -msgid "SEPA Creditor Identifier" -msgstr "SEPA Incassant-ID" - -#. module: account_banking_sepa_direct_debit -#: model:ir.model,name:account_banking_sepa_direct_debit.model_banking_export_sdd -msgid "SEPA Direct Debit export" -msgstr "SEPA incasso export" - -#. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -#: selection:sdd.mandate,state:0 -msgid "Expired" -msgstr "Verlopen" - -#. module: account_banking_sepa_direct_debit -#: field:sdd.mandate,partner_bank_id:0 -msgid "Bank Account" -msgstr "Bankrekening" - -#. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:254 -#, python-format -msgid "" -"You must set the 'Original Mandate Identification' on the recurrent mandate " -"'%s' which is not marked as 'Migrated to SEPA'." -msgstr "" -"U dient de 'Originele machtiging identificatie' in te stellen op de " -"herhalende machtiging '%s' welke niet is gemarkeerd als 'Gemigreerd naar " -"SEPA'" - #. module: account_banking_sepa_direct_debit #: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_first #: model:mail.message.subtype,name:account_banking_sepa_direct_debit.recurrent_sequence_type_first @@ -729,26 +460,130 @@ msgid "Sequence Type set to First" msgstr "Reeks ingesteld op eerste" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/account_banking_sdd.py:291 +#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_recurring +#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.recurrent_sequence_type_recurring +msgid "Sequence Type set to Recurring" +msgstr "Reeks soort ingesteld op herhalend" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd.wizard,charge_bearer:0 +msgid "Shared" +msgstr "Gedeeld" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Signature of the debtor:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,state:0 +msgid "State" +msgstr "Status" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Swift BIC (up to 8 or 11 characteres):" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:166 #, python-format msgid "" -"As you changed the bank account attached to this mandate, the 'Sequence " -"Type' has been set back to 'First'." +"The SEPA Direct Debit mandate with reference '%s' for partner '%s' has " +"expired." +msgstr "De SEPA incasso machtiging met referentie '%s' voor relatie '%s' is verlopen." + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:174 +#, python-format +msgid "" +"The mandate with reference '%s' for partner '%s' has type set to 'One-Off' " +"and it has a last debit date set to '%s', so we can't use it." +msgstr "De machtiging referentie '%s' voor relatie %s' is ingesteld op 'eenmalig' en de laatste incasso datum is ingesteld op '%s'. Zodoende kunnen we deze niet gebruiken." + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:76 +#, python-format +msgid "The recurrent mandate '%s' must have a sequence type." +msgstr "De herhalende machtiging '%s' dient een reeks soort te hebben." + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:86 +#, python-format +msgid "" +"The recurrent mandate '%s' which is not marked as 'Migrated to SEPA' must " +"have its recurrent sequence type set to 'First'." +msgstr "Bij de herhalende machtiging '%s' welke niet is gemarkeerd als 'gemigreerd naar SEPA' dient de reeks soort te worden ingesteld op 'Eerste'." + +#. module: account_banking_sepa_direct_debit +#: help:account.banking.mandate,recurrent_sequence_type:0 +msgid "" +"This field is only used for Recurrent mandates, not for One-Off mandates." +msgstr "Dit veld wordt alleen gebruikt voor herhalende machtigingen, niet voor een eenmalige machtiging." + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "" +"This mandate is only intended for business-to-business transactions.\n" +" You are not entitled to a refund from your bank after your account has\n" +" been debited, but you are entitled to request your bank\n" +" not to debit your account up until the day on which the payment is due." msgstr "" -"Omdat u de gekoppelde bankrekening heeft gewijzigd is de reeks terug gezet " -"naar 'Eerste'." #. module: account_banking_sepa_direct_debit -#: help:sdd.mandate,message_ids:0 -msgid "Messages and communication history" -msgstr "Berichten en communicatie historie" +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "To be completed by the creditor" +msgstr "" #. module: account_banking_sepa_direct_debit -#: view:sdd.mandate:0 -msgid "Search SEPA Direct Debit Mandates" -msgstr "Zoek SEPA incasso machtigingen" +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "To be completed by the debtor" +msgstr "" #. module: account_banking_sepa_direct_debit -#: field:banking.export.sdd.wizard,file:0 -msgid "File" -msgstr "Bestand" +#: field:banking.export.sdd.wizard,total_amount:0 +msgid "Total Amount" +msgstr "Totaalbedrag" + +#. module: account_banking_sepa_direct_debit +#: view:account.banking.mandate:account_banking_sepa_direct_debit.sdd_mandate_search +#: view:account.banking.mandate:account_banking_sepa_direct_debit.sdd_mandate_tree +msgid "Type" +msgstr "Soort" + +#. module: account_banking_sepa_direct_debit +#: field:account.banking.mandate,type:0 +msgid "Type of Mandate" +msgstr "Soort machtiging" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Type of payment:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd.wizard:account_banking_sepa_direct_debit.banking_export_sdd_wizard_view +msgid "Validate" +msgstr "Bevestigen" + +#. module: account_banking_sepa_direct_debit +#: help:account.banking.mandate,original_mandate_identification:0 +msgid "" +"When the field 'Migrated to SEPA' is not active, this field will be used as " +"the Original Mandate Identification in the Direct Debit file." +msgstr "Wanneer het veld 'gemigreerd naar SEPA' niet actief is, zal dit veld worden gebruikt als de originele machtiging identificatie in het incasso bestand." + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:98 +#, python-format +msgid "" +"You must set the 'Original Mandate Identification' on the recurrent mandate " +"'%s' which is not marked as 'Migrated to SEPA'." +msgstr "U dient de 'Originele machtiging identificatie' in te stellen op de herhalende machtiging '%s' welke niet is gemarkeerd als 'Gemigreerd naar SEPA'" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "" +"to send instructions to your bank to debit your account and (B) your bank to\n" +" debit your account in accordance with the instructions from" +msgstr "" diff --git a/account_banking_sepa_direct_debit/i18n/pt_BR.po b/account_banking_sepa_direct_debit/i18n/pt_BR.po new file mode 100644 index 000000000..44b004887 --- /dev/null +++ b/account_banking_sepa_direct_debit/i18n/pt_BR.po @@ -0,0 +1,588 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_banking_sepa_direct_debit +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: bank-payment (8.0)\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-04-08 00:46+0000\n" +"PO-Revision-Date: 2016-04-07 16:04+0000\n" +"Last-Translator: danimaribeiro \n" +"Language-Team: Portuguese (Brazil) (http://www.transifex.com/oca/OCA-bank-payment-8-0/language/pt_BR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: pt_BR\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#. module: account_banking_sepa_direct_debit +#: model:ir.actions.act_window,help:account_banking_sepa_direct_debit.mandate_action +msgid "" +"

\n" +" Click to create a new SEPA Direct Debit Mandate.\n" +"

\n" +" A SEPA Direct Debit Mandate is a document signed by your customer that gives you the autorization to do one or several direct debits on his bank account.\n" +"

\n" +" " +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_account_banking_mandate +msgid "A generic banking mandate" +msgstr "Uma ordem bancária genérica" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "" +"ALL GAPS ARE MANDATORY. ONCE THIS MANDATE HAS BEEN SIGNED MUST BE SENT TO " +"CREDITOR FOR STORAGE." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "" +"ALL GAPS ARE MANDATORY. ONCE THIS MANDATE HAS BEEN SIGNED MUST BE SENT TO CREDITOR FOR STORAGE.\n" +" NEVERTHELESS, THE BANK OF DEBTOR REQUIRES DEBTOR’S AUTHORIZATION BEFORE DEBITING B2B DIRECT DEBITS IN THE ACCOUNT.\n" +" THE DEBTOR WILL BE ABLE TO MANAGE THE MENTIONED AUTHORIZATION THROUGH THE MEANS PROVIDED BY HIS BANK." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Account Number - IBAN:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Address of the Debtor:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Address:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "" +"As part of your rights, you are entitled to a refund from\n" +" your bank under the terms and conditions of your agreement\n" +" with your bank.\n" +" A refund must be claimed within 8 weeks starting from the date on which your account was debited." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:116 +#, python-format +msgid "" +"As you changed the bank account attached to this mandate, the 'Sequence " +"Type' has been set back to 'First'." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_bank_payment_line +msgid "Bank Payment Lines" +msgstr "Linhas de pagamento bancária" + +#. module: account_banking_sepa_direct_debit +#: selection:account.banking.mandate,scheme:0 +msgid "Basic (CORE)" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,batch_booking:0 +msgid "Batch Booking" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd.wizard,charge_bearer:0 +msgid "Borne by Creditor" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd.wizard,charge_bearer:0 +msgid "Borne by Debtor" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "By signing this mandate form, you authorise (A)" +msgstr "Assinando este formulário de Ordem, você autoriza (A)" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd.wizard:account_banking_sepa_direct_debit.banking_export_sdd_wizard_view +msgid "Cancel" +msgstr "Cancelar" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,charge_bearer:0 +msgid "Charge Bearer" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_res_company +msgid "Companies" +msgstr "Empresas" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Country of the debtor:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Country:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd.wizard,state:0 +msgid "Create" +msgstr "Criar" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,create_uid:0 +msgid "Created by" +msgstr "Criado por" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,create_date:0 +msgid "Created on" +msgstr "Criado em" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Creditor's Name:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Date - Location:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Debtor's Name:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: help:payment.mode,sepa_creditor_identifier:0 +msgid "" +"Enter the Creditor Identifier that has been attributed to your company to make SEPA Direct Debits. If not defined, SEPA Creditor Identifier from company will be used.\n" +"This identifier is composed of :\n" +"- your country ISO code (2 letters)\n" +"- a 2-digits checkum\n" +"- a 3-letters business code\n" +"- a country-specific identifier" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: help:res.company,sepa_creditor_identifier:0 +msgid "" +"Enter the Creditor Identifier that has been attributed to your company to make SEPA Direct Debits. This identifier is composed of :\n" +"- your country ISO code (2 letters)\n" +"- a 2-digits checkum\n" +"- a 3-letters business code\n" +"- a country-specific identifier" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:account.banking.mandate,scheme:0 +msgid "Enterprise (B2B)" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/payment_mode.py:42 +#: code:addons/account_banking_sepa_direct_debit/models/res_company.py:32 +#, python-format +msgid "Error" +msgstr "Erro" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_banking_export_sdd_wizard +msgid "Export SEPA Direct Debit File" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,file:0 +msgid "File" +msgstr "Arquivo" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,filename:0 +msgid "Filename" +msgstr "Nome do arquivo" + +#. module: account_banking_sepa_direct_debit +#: selection:account.banking.mandate,recurrent_sequence_type:0 +msgid "Final" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd.wizard,state:0 +msgid "Finish" +msgstr "Finalizar" + +#. module: account_banking_sepa_direct_debit +#: selection:account.banking.mandate,recurrent_sequence_type:0 +msgid "First" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd.wizard,charge_bearer:0 +msgid "Following Service Level" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: help:banking.export.sdd.wizard,charge_bearer:0 +msgid "" +"Following service level : transaction charges are to be applied following " +"the rules agreed in the service level and/or scheme (SEPA Core messages must" +" use this). Shared : transaction charges on the creditor side are to be " +"borne by the creditor, transaction charges on the debtor side are to be " +"borne by the debtor. Borne by creditor : all transaction charges are to be " +"borne by the creditor. Borne by debtor : all transaction charges are to be " +"borne by the debtor." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd.wizard:account_banking_sepa_direct_debit.banking_export_sdd_wizard_view +msgid "Generate" +msgstr "Gerar" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,id:0 +msgid "ID" +msgstr "ID" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Identifier:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: help:payment.mode,original_creditor_identifier:0 +msgid "" +"If not defined, Original Creditor Identifier from company will be used." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: help:account.banking.mandate,sepa_migrated:0 +msgid "" +"If this field is not active, the mandate section of the next direct debit " +"file that include this mandate will contain the 'Original Mandate " +"Identification' and the 'Original Creditor Scheme Identification'. This is " +"required in a few countries (Belgium for instance), but not in all " +"countries. If this is not required in your country, you should keep this " +"field always active." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: help:banking.export.sdd.wizard,batch_booking:0 +msgid "" +"If true, the bank statement will display only one credit line for all the " +"direct debits of the SEPA file ; if false, the bank statement will display " +"one credit line per direct debit of the SEPA file." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/payment_mode.py:43 +#: code:addons/account_banking_sepa_direct_debit/models/res_company.py:33 +#, python-format +msgid "Invalid SEPA Creditor Identifier." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,write_uid:0 +msgid "Last Updated by" +msgstr "Última Atualização por" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,write_date:0 +msgid "Last Updated on" +msgstr "Última Atualização em" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Mandate Reference:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:115 +#, python-format +msgid "Mandate update" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:account.banking.mandate,sepa_migrated:0 +msgid "Migrated to SEPA" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:159 +#, python-format +msgid "" +"Missing SEPA Direct Debit mandate on the bank payment line with partner '%s'" +" (reference '%s')." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,nb_transactions:0 +msgid "Number of Transactions" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:account.banking.mandate:account_banking_sepa_direct_debit.sdd_mandate_search +#: selection:account.banking.mandate,type:0 +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "One-Off" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:payment.mode,original_creditor_identifier:0 +#: field:res.company,original_creditor_identifier:0 +msgid "Original Creditor Identifier" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:account.banking.mandate,original_mandate_identification:0 +msgid "Original Mandate Identification" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:res.groups,name:account_banking_sepa_direct_debit.group_original_mandate_required +msgid "Original Mandate Required (SEPA)" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_payment_mode +msgid "Payment Mode" +msgstr "Modo de Pagamento" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,payment_order_ids:0 +msgid "Payment Orders" +msgstr "Ordens de Pagamento" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:117 +#, python-format +msgid "" +"Payment Type Code '%s' is not supported. The only Payment Type Code " +"supported for SEPA Direct Debit are 'pain.008.001.02', 'pain.008.001.03' and" +" 'pain.008.001.04'." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Postal Code - City - Town:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:account.banking.mandate:account_banking_sepa_direct_debit.sdd_mandate_search +#: selection:account.banking.mandate,type:0 +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Recurrent" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:account.banking.mandate,recurrent_sequence_type:0 +msgid "Recurring" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:res.partner:account_banking_sepa_direct_debit.sdd_mandate_partner_form +#: view:res.partner.bank:account_banking_sepa_direct_debit.sdd_mandate_partner_bank_tree +msgid "SDD Mandates" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:payment.mode,sepa_creditor_identifier:0 +#: field:res.company,sepa_creditor_identifier:0 +msgid "SEPA Creditor Identifier" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.mandate_action +msgid "SEPA Direct Debit Mandates" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd.wizard:account_banking_sepa_direct_debit.banking_export_sdd_wizard_view +msgid "SEPA Direct Debit XML file generation" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:account.banking.mandate:account_banking_sepa_direct_debit.sdd_mandate_search +#: field:account.banking.mandate,scheme:0 +msgid "Scheme" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Sepa Business-To-Business Direct debit Mandate" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Sepa Direct Debit Mandate" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:35 +#: model:ir.actions.report.xml,name:account_banking_sepa_direct_debit.report_sepa_direct_debit_mandate +#, python-format +msgid "Sepa Mandate" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:account.banking.mandate:account_banking_sepa_direct_debit.sdd_mandate_search +#: view:account.banking.mandate:account_banking_sepa_direct_debit.sdd_mandate_tree +msgid "Sequence Type" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:account.banking.mandate,recurrent_sequence_type:0 +msgid "Sequence Type for Next Debit" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_final +#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.recurrent_sequence_type_final +msgid "Sequence Type set to Final" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_first +#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.recurrent_sequence_type_first +msgid "Sequence Type set to First" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_recurring +#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.recurrent_sequence_type_recurring +msgid "Sequence Type set to Recurring" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd.wizard,charge_bearer:0 +msgid "Shared" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Signature of the debtor:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,state:0 +msgid "State" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Swift BIC (up to 8 or 11 characteres):" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:166 +#, python-format +msgid "" +"The SEPA Direct Debit mandate with reference '%s' for partner '%s' has " +"expired." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:174 +#, python-format +msgid "" +"The mandate with reference '%s' for partner '%s' has type set to 'One-Off' " +"and it has a last debit date set to '%s', so we can't use it." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:76 +#, python-format +msgid "The recurrent mandate '%s' must have a sequence type." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:86 +#, python-format +msgid "" +"The recurrent mandate '%s' which is not marked as 'Migrated to SEPA' must " +"have its recurrent sequence type set to 'First'." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: help:account.banking.mandate,recurrent_sequence_type:0 +msgid "" +"This field is only used for Recurrent mandates, not for One-Off mandates." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "" +"This mandate is only intended for business-to-business transactions.\n" +" You are not entitled to a refund from your bank after your account has\n" +" been debited, but you are entitled to request your bank\n" +" not to debit your account up until the day on which the payment is due." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "To be completed by the creditor" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "To be completed by the debtor" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,total_amount:0 +msgid "Total Amount" +msgstr "Valor total" + +#. module: account_banking_sepa_direct_debit +#: view:account.banking.mandate:account_banking_sepa_direct_debit.sdd_mandate_search +#: view:account.banking.mandate:account_banking_sepa_direct_debit.sdd_mandate_tree +msgid "Type" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: field:account.banking.mandate,type:0 +msgid "Type of Mandate" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Type of payment:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd.wizard:account_banking_sepa_direct_debit.banking_export_sdd_wizard_view +msgid "Validate" +msgstr "Validar" + +#. module: account_banking_sepa_direct_debit +#: help:account.banking.mandate,original_mandate_identification:0 +msgid "" +"When the field 'Migrated to SEPA' is not active, this field will be used as " +"the Original Mandate Identification in the Direct Debit file." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:98 +#, python-format +msgid "" +"You must set the 'Original Mandate Identification' on the recurrent mandate " +"'%s' which is not marked as 'Migrated to SEPA'." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "" +"to send instructions to your bank to debit your account and (B) your bank to\n" +" debit your account in accordance with the instructions from" +msgstr "" diff --git a/account_banking_sepa_direct_debit/i18n/sl.po b/account_banking_sepa_direct_debit/i18n/sl.po new file mode 100644 index 000000000..4ce7d321a --- /dev/null +++ b/account_banking_sepa_direct_debit/i18n/sl.po @@ -0,0 +1,589 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_banking_sepa_direct_debit +# +# Translators: +# Matjaž Mozetič , 2016 +msgid "" +msgstr "" +"Project-Id-Version: bank-payment (8.0)\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-04-18 10:57+0000\n" +"PO-Revision-Date: 2016-04-22 06:53+0000\n" +"Last-Translator: Matjaž Mozetič \n" +"Language-Team: Slovenian (http://www.transifex.com/oca/OCA-bank-payment-8-0/language/sl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: sl\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n" + +#. module: account_banking_sepa_direct_debit +#: model:ir.actions.act_window,help:account_banking_sepa_direct_debit.mandate_action +msgid "" +"

\n" +" Click to create a new SEPA Direct Debit Mandate.\n" +"

\n" +" A SEPA Direct Debit Mandate is a document signed by your customer that gives you the autorization to do one or several direct debits on his bank account.\n" +"

\n" +" " +msgstr "

\n Ustvari nov SEPA mandat za direktno bremenitev.\n

\n SEPA mandat za direktno bremenitev je s strani kupca podpisan dokument, ki vas pooblašča za izvajanje ene ali več bremenitev njegovega bančnega računa.\n

\n " + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_account_banking_mandate +msgid "A generic banking mandate" +msgstr "Generični bančni mandat" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "" +"ALL GAPS ARE MANDATORY. ONCE THIS MANDATE HAS BEEN SIGNED MUST BE SENT TO " +"CREDITOR FOR STORAGE." +msgstr "VSE VRZELI SO OBVEZNE. PO PODPISU MANDATA, SE GA MORA POSLATI UPNIKU V HRANJENJE." + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "" +"ALL GAPS ARE MANDATORY. ONCE THIS MANDATE HAS BEEN SIGNED MUST BE SENT TO CREDITOR FOR STORAGE.\n" +" NEVERTHELESS, THE BANK OF DEBTOR REQUIRES DEBTOR’S AUTHORIZATION BEFORE DEBITING B2B DIRECT DEBITS IN THE ACCOUNT.\n" +" THE DEBTOR WILL BE ABLE TO MANAGE THE MENTIONED AUTHORIZATION THROUGH THE MEANS PROVIDED BY HIS BANK." +msgstr "VSE VRZELI SO OBVEZNE. PO PODPISU MANDATA, SE GA MORA POSLATI UPNIKU V HRANJENJE.\n KLJUB VSEMU, BANKA DOLŽNIKA ZAHTEVA DOLŽNIKOVO POOBLASTILO PRED NEPOSREDNO B2B OBREMENITVIJO RAČUNA.\n DOLŽNIK BI LAHKO UPRAVLJAL OMENJENO POOBLASTILO NA NAČIN, KI MU GA OMOGOČA NJEGOVA BANKA." + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Account Number - IBAN:" +msgstr "Številka računa - IBAN:" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Address of the Debtor:" +msgstr "Naslov dolžnika:" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Address:" +msgstr "Naslov:" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "" +"As part of your rights, you are entitled to a refund from\n" +" your bank under the terms and conditions of your agreement\n" +" with your bank.\n" +" A refund must be claimed within 8 weeks starting from the date on which your account was debited." +msgstr "V sklopu vaših pravic je dobropis/povračilo vaše banke\n v skladu s splošnimi pogoji vašega dogovora\n z banko.\n Povračilo je potrebno zahtevati v do 8 tednih od datuma, na katerega je bil vaš račun obremenjen." + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:116 +#, python-format +msgid "" +"As you changed the bank account attached to this mandate, the 'Sequence " +"Type' has been set back to 'First'." +msgstr "Ker ste spremenili bančni račun pripet temu mandatu, se je tip zaporedja vrnil v 'Prvi'." + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_bank_payment_line +msgid "Bank Payment Lines" +msgstr "Postavke bančnih plačil" + +#. module: account_banking_sepa_direct_debit +#: selection:account.banking.mandate,scheme:0 +msgid "Basic (CORE)" +msgstr "Osnovna (CORE)" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,batch_booking:0 +msgid "Batch Booking" +msgstr "Skupinska rezervacija" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd.wizard,charge_bearer:0 +msgid "Borne by Creditor" +msgstr "Nosi upnik" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd.wizard,charge_bearer:0 +msgid "Borne by Debtor" +msgstr "Nosi dolžnik" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "By signing this mandate form, you authorise (A)" +msgstr "S podpisom tega mandata vi pooblaščate (A)" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd.wizard:account_banking_sepa_direct_debit.banking_export_sdd_wizard_view +msgid "Cancel" +msgstr "Preklic" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,charge_bearer:0 +msgid "Charge Bearer" +msgstr "Sprememba nosilca" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_res_company +msgid "Companies" +msgstr "Družbe" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Country of the debtor:" +msgstr "Država dolžnika:" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Country:" +msgstr "Država:" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd.wizard,state:0 +msgid "Create" +msgstr "Ustvari" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,create_uid:0 +msgid "Created by" +msgstr "Ustvaril" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,create_date:0 +msgid "Created on" +msgstr "Ustvarjeno" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Creditor's Name:" +msgstr "Naziv upnika:" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Date - Location:" +msgstr "Datum - lokacija:" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Debtor's Name:" +msgstr "Naziv dolžnika:" + +#. module: account_banking_sepa_direct_debit +#: help:payment.mode,sepa_creditor_identifier:0 +msgid "" +"Enter the Creditor Identifier that has been attributed to your company to make SEPA Direct Debits. If not defined, SEPA Creditor Identifier from company will be used.\n" +"This identifier is composed of :\n" +"- your country ISO code (2 letters)\n" +"- a 2-digits checkum\n" +"- a 3-letters business code\n" +"- a country-specific identifier" +msgstr "Vnesi identifikator upnika, ki je bil dodeljen vaši družbi za izvajanje SEPA direktnih obremenitev. Če ni določen, se uporabi SEPA identifikator upnika iz nastavitev družbe.\nIdentifikator sestavljajo:\n- ISO koda vaše države (2 znaka)\n- 2-značna checkum koda\n- 3-značna poslovna koda\n- specifični identifikator glede na državo" + +#. module: account_banking_sepa_direct_debit +#: help:res.company,sepa_creditor_identifier:0 +msgid "" +"Enter the Creditor Identifier that has been attributed to your company to make SEPA Direct Debits. This identifier is composed of :\n" +"- your country ISO code (2 letters)\n" +"- a 2-digits checkum\n" +"- a 3-letters business code\n" +"- a country-specific identifier" +msgstr "Vnesi identifikator upnika, ki je bil dodeljen vaši družbi za izvajanje SEPA direktnih obremenitev. Identifikator sestavljajo:\n- ISO koda vaše države (2 znaka)\n- 2-značna checkum koda\n- 3-značna poslovna koda\n- specifični identifikator glede na državo" + +#. module: account_banking_sepa_direct_debit +#: selection:account.banking.mandate,scheme:0 +msgid "Enterprise (B2B)" +msgstr "Podjetje (B2B)" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/payment_mode.py:42 +#: code:addons/account_banking_sepa_direct_debit/models/res_company.py:32 +#, python-format +msgid "Error" +msgstr "Napaka" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_banking_export_sdd_wizard +msgid "Export SEPA Direct Debit File" +msgstr "Izvoz datoteke SEPA direktne obremenitve" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,file:0 +msgid "File" +msgstr "Datoteka" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,filename:0 +msgid "Filename" +msgstr "Naziv datoteke" + +#. module: account_banking_sepa_direct_debit +#: selection:account.banking.mandate,recurrent_sequence_type:0 +msgid "Final" +msgstr "Končna" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd.wizard,state:0 +msgid "Finish" +msgstr "Dokončaj" + +#. module: account_banking_sepa_direct_debit +#: selection:account.banking.mandate,recurrent_sequence_type:0 +msgid "First" +msgstr "Prva" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd.wizard,charge_bearer:0 +msgid "Following Service Level" +msgstr "Nivo sledenja" + +#. module: account_banking_sepa_direct_debit +#: help:banking.export.sdd.wizard,charge_bearer:0 +msgid "" +"Following service level : transaction charges are to be applied following " +"the rules agreed in the service level and/or scheme (SEPA Core messages must" +" use this). Shared : transaction charges on the creditor side are to be " +"borne by the creditor, transaction charges on the debtor side are to be " +"borne by the debtor. Borne by creditor : all transaction charges are to be " +"borne by the creditor. Borne by debtor : all transaction charges are to be " +"borne by the debtor." +msgstr "Nivo sledenja: stroške transakcije se dodeli glede na naslednja pravila v sporazumu o ravni storitev in/ali shemi (SEPA temeljna sporočila morajo to uporabljati). Deljeno: stroške transakcije na strani upnika nosi upnik sam, stroške na strani dolžnika pa dolžnik. Nosi upnik: vse stroške transakcije nosi upnik. Nosi dolžnik: vse stroške transakcije nosi dolžnik." + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd.wizard:account_banking_sepa_direct_debit.banking_export_sdd_wizard_view +msgid "Generate" +msgstr "Ustvari" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,id:0 +msgid "ID" +msgstr "ID" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Identifier:" +msgstr "Identifikator:" + +#. module: account_banking_sepa_direct_debit +#: help:payment.mode,original_creditor_identifier:0 +msgid "" +"If not defined, Original Creditor Identifier from company will be used." +msgstr "Če ni določeno, se uporabi izvorni identifikator upnika iz nastavitev družbe." + +#. module: account_banking_sepa_direct_debit +#: help:account.banking.mandate,sepa_migrated:0 +msgid "" +"If this field is not active, the mandate section of the next direct debit " +"file that include this mandate will contain the 'Original Mandate " +"Identification' and the 'Original Creditor Scheme Identification'. This is " +"required in a few countries (Belgium for instance), but not in all " +"countries. If this is not required in your country, you should keep this " +"field always active." +msgstr "Če je to polje neaktivno, bo odsek datoteke naslednje direktne obremenitve, ki vključuje ta mandat, vseboval 'Identifikator izvornega mandata' in 'Identifikator izvorne sheme upnika'. To se zahteva v nekaj državah (npr. Belgiji), a ne pri vseh državah. Če v vaši državi to ni zahtevano, naj bo to polje zmeraj aktivno." + +#. module: account_banking_sepa_direct_debit +#: help:banking.export.sdd.wizard,batch_booking:0 +msgid "" +"If true, the bank statement will display only one credit line for all the " +"direct debits of the SEPA file ; if false, the bank statement will display " +"one credit line per direct debit of the SEPA file." +msgstr "Če pravilno, bančni izpisek prikaže le eno postavko v dobro za vse direktne obremenitve v SEPA XML datoteki ; če napačno, bančni izpisek prikaže le eno postavko v dobro za vsako direktno obremenitev v SEPA datoteki." + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/payment_mode.py:43 +#: code:addons/account_banking_sepa_direct_debit/models/res_company.py:33 +#, python-format +msgid "Invalid SEPA Creditor Identifier." +msgstr "Neveljaven identifikator SEPA upnika." + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,write_uid:0 +msgid "Last Updated by" +msgstr "Zadnji posodobil" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,write_date:0 +msgid "Last Updated on" +msgstr "Zadnjič posodobljeno" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Mandate Reference:" +msgstr "Sklic mandata:" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:115 +#, python-format +msgid "Mandate update" +msgstr "Posodobitev mandata" + +#. module: account_banking_sepa_direct_debit +#: field:account.banking.mandate,sepa_migrated:0 +msgid "Migrated to SEPA" +msgstr "Preseljeno v SEPA" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:159 +#, python-format +msgid "" +"Missing SEPA Direct Debit mandate on the bank payment line with partner '%s'" +" (reference '%s')." +msgstr "Pri postavki bančnega plačila partnerja '%s' (sklic '%s') manjka SEPA direktna obremenitev." + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,nb_transactions:0 +msgid "Number of Transactions" +msgstr "Število transakcij" + +#. module: account_banking_sepa_direct_debit +#: view:account.banking.mandate:account_banking_sepa_direct_debit.sdd_mandate_search +#: selection:account.banking.mandate,type:0 +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "One-Off" +msgstr "Enkratna" + +#. module: account_banking_sepa_direct_debit +#: field:payment.mode,original_creditor_identifier:0 +#: field:res.company,original_creditor_identifier:0 +msgid "Original Creditor Identifier" +msgstr "Identifikator izvornega upnika" + +#. module: account_banking_sepa_direct_debit +#: field:account.banking.mandate,original_mandate_identification:0 +msgid "Original Mandate Identification" +msgstr "Identifikator izvornega mandata" + +#. module: account_banking_sepa_direct_debit +#: model:res.groups,name:account_banking_sepa_direct_debit.group_original_mandate_required +msgid "Original Mandate Required (SEPA)" +msgstr "Zahteva se izvorni mandat (SEPA)" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_payment_mode +msgid "Payment Mode" +msgstr "Metoda plačila" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,payment_order_ids:0 +msgid "Payment Orders" +msgstr "Plačilni nalogi" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:117 +#, python-format +msgid "" +"Payment Type Code '%s' is not supported. The only Payment Type Code " +"supported for SEPA Direct Debit are 'pain.008.001.02', 'pain.008.001.03' and" +" 'pain.008.001.04'." +msgstr "Koda tipa plačila '%s' ni podprta. Edine kode tipov plačil, ki so podprte za SEPA bremenilne transakcije, so 'pain.008.001.02', 'pain.008.001.03' in 'pain.008.001.04'." + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Postal Code - City - Town:" +msgstr "Poštna številka - Mesto - Kraj:" + +#. module: account_banking_sepa_direct_debit +#: view:account.banking.mandate:account_banking_sepa_direct_debit.sdd_mandate_search +#: selection:account.banking.mandate,type:0 +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Recurrent" +msgstr "Ponavljajoče se" + +#. module: account_banking_sepa_direct_debit +#: selection:account.banking.mandate,recurrent_sequence_type:0 +msgid "Recurring" +msgstr "Ponavljajoč" + +#. module: account_banking_sepa_direct_debit +#: view:res.partner:account_banking_sepa_direct_debit.sdd_mandate_partner_form +#: view:res.partner.bank:account_banking_sepa_direct_debit.sdd_mandate_partner_bank_tree +msgid "SDD Mandates" +msgstr "SDD mandati" + +#. module: account_banking_sepa_direct_debit +#: field:payment.mode,sepa_creditor_identifier:0 +#: field:res.company,sepa_creditor_identifier:0 +msgid "SEPA Creditor Identifier" +msgstr "Identifikator SEPA upnika" + +#. module: account_banking_sepa_direct_debit +#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.mandate_action +msgid "SEPA Direct Debit Mandates" +msgstr "SEPA mandat za direktno obremenitev" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd.wizard:account_banking_sepa_direct_debit.banking_export_sdd_wizard_view +msgid "SEPA Direct Debit XML file generation" +msgstr "Ustvarjanje XML datoteke SEPA direktne obremenitve" + +#. module: account_banking_sepa_direct_debit +#: view:account.banking.mandate:account_banking_sepa_direct_debit.sdd_mandate_search +#: field:account.banking.mandate,scheme:0 +msgid "Scheme" +msgstr "Shema" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Sepa Business-To-Business Direct debit Mandate" +msgstr "SEPA Business-To-Business mandat za direktno obremenitev" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Sepa Direct Debit Mandate" +msgstr "SEPA mandat za direktno obremenitev" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:35 +#: model:ir.actions.report.xml,name:account_banking_sepa_direct_debit.report_sepa_direct_debit_mandate +#, python-format +msgid "Sepa Mandate" +msgstr "SEPA mandat" + +#. module: account_banking_sepa_direct_debit +#: view:account.banking.mandate:account_banking_sepa_direct_debit.sdd_mandate_search +#: view:account.banking.mandate:account_banking_sepa_direct_debit.sdd_mandate_tree +msgid "Sequence Type" +msgstr "Tip zaporedja" + +#. module: account_banking_sepa_direct_debit +#: field:account.banking.mandate,recurrent_sequence_type:0 +msgid "Sequence Type for Next Debit" +msgstr "Tip zaporedja za naslednjo obremenitev" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_final +#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.recurrent_sequence_type_final +msgid "Sequence Type set to Final" +msgstr "Tip zaporedja nastavljen kot končni" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_first +#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.recurrent_sequence_type_first +msgid "Sequence Type set to First" +msgstr "Tip zaporedja nastavljen kot prvi" + +#. module: account_banking_sepa_direct_debit +#: model:mail.message.subtype,description:account_banking_sepa_direct_debit.recurrent_sequence_type_recurring +#: model:mail.message.subtype,name:account_banking_sepa_direct_debit.recurrent_sequence_type_recurring +msgid "Sequence Type set to Recurring" +msgstr "Tip zaporedja nastavljen kot ponavljajoči se" + +#. module: account_banking_sepa_direct_debit +#: selection:banking.export.sdd.wizard,charge_bearer:0 +msgid "Shared" +msgstr "V souporabi" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Signature of the debtor:" +msgstr "Podpis dolžnika:" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,state:0 +msgid "State" +msgstr "Stanje" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Swift BIC (up to 8 or 11 characteres):" +msgstr "Swift BIC (8 ali 11 znakov):" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:166 +#, python-format +msgid "" +"The SEPA Direct Debit mandate with reference '%s' for partner '%s' has " +"expired." +msgstr "SEPA mandat za direktno obremenitev s sklicem '%s' za partnerja '%s' je potekel." + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/wizard/export_sdd.py:174 +#, python-format +msgid "" +"The mandate with reference '%s' for partner '%s' has type set to 'One-Off' " +"and it has a last debit date set to '%s', so we can't use it." +msgstr "Pri mandatu s sklicem '%s' za partnerja '%s' je tip nastavljen na 'enkraten', zadnji datum obremenitve pa ima nastavljen na '%s', zato ga ne moremo uporabiti." + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:76 +#, python-format +msgid "The recurrent mandate '%s' must have a sequence type." +msgstr "Ponavljajoči se mandat '%s' mora vsebovati tip zaporedja." + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:86 +#, python-format +msgid "" +"The recurrent mandate '%s' which is not marked as 'Migrated to SEPA' must " +"have its recurrent sequence type set to 'First'." +msgstr "Ponavljajoči se mandat '%s', ki ni označen kot 'Preseljen v SEPA', mora imeti svoj ponavljajoči se tip zaporedja nastavljen kot 'Prvi'." + +#. module: account_banking_sepa_direct_debit +#: help:account.banking.mandate,recurrent_sequence_type:0 +msgid "" +"This field is only used for Recurrent mandates, not for One-Off mandates." +msgstr "To polje se uporablja le za ponavljajoče se mandate, ne pa za enkratne mandate." + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "" +"This mandate is only intended for business-to-business transactions.\n" +" You are not entitled to a refund from your bank after your account has\n" +" been debited, but you are entitled to request your bank\n" +" not to debit your account up until the day on which the payment is due." +msgstr "Ta mandat je mišljen le za transakcije med pravnimi osebami.\n Po obremenitvi vašega računa nimate pravice do povračila\n svoje banke,, lahko pa pri banki zahtevate, da se računa\n ne bremeni do dneva zapadlosti plačila." + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "To be completed by the creditor" +msgstr "Izpolniti mora upnik" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "To be completed by the debtor" +msgstr "Izpolniti mora dolžnik" + +#. module: account_banking_sepa_direct_debit +#: field:banking.export.sdd.wizard,total_amount:0 +msgid "Total Amount" +msgstr "Skupni znesek" + +#. module: account_banking_sepa_direct_debit +#: view:account.banking.mandate:account_banking_sepa_direct_debit.sdd_mandate_search +#: view:account.banking.mandate:account_banking_sepa_direct_debit.sdd_mandate_tree +msgid "Type" +msgstr "Tip" + +#. module: account_banking_sepa_direct_debit +#: field:account.banking.mandate,type:0 +msgid "Type of Mandate" +msgstr "Tip mandata" + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Type of payment:" +msgstr "Tip plačila:" + +#. module: account_banking_sepa_direct_debit +#: view:banking.export.sdd.wizard:account_banking_sepa_direct_debit.banking_export_sdd_wizard_view +msgid "Validate" +msgstr "Potrdi" + +#. module: account_banking_sepa_direct_debit +#: help:account.banking.mandate,original_mandate_identification:0 +msgid "" +"When the field 'Migrated to SEPA' is not active, this field will be used as " +"the Original Mandate Identification in the Direct Debit file." +msgstr "Kadar polje 'Preseljeno v SEPA' ni aktivno, se to polje uporabi za identifikator izvornega mandata v datoteki direktne obremenitve." + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:98 +#, python-format +msgid "" +"You must set the 'Original Mandate Identification' on the recurrent mandate " +"'%s' which is not marked as 'Migrated to SEPA'." +msgstr "Na ponavljajočem se mandatu '%s', ki ni označen kot 'Preseljen v SEPA' morate nastaviti 'Identifikacijo izvornega mandata'." + +#. module: account_banking_sepa_direct_debit +#: view:website:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "" +"to send instructions to your bank to debit your account and (B) your bank to\n" +" debit your account in accordance with the instructions from" +msgstr "za pošiljanje navodil svoji banki glede bremenitve vašega računa in (B) svoji banki\n naj bremeni vaš račun v skladu z navodili iz" From a6bc2e12b332009c794e6ed8c1ecf675a60ddb3e Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Sat, 30 Apr 2016 01:46:34 +0200 Subject: [PATCH 079/118] Start to port bank-payment to v9 (with a lot of improvements) during the Sorrento Code sprint 2016 Improvements include: - full re-organisation of modules and big re-organisation of the code - simplification of the code related to the fact that support for direct debit is now in t he base module, not added by an optional module account_direct_debit (module was removed) - new design of the wizard to select move lines to pay - support for non-SEPA file transfer- - support for German direct debit SEPA files (fixes bug #129) - remove workflow of payment.order This port to v9 is not finished... there is still a lot of work: - finish the code of account_payment_order/wizard/account_payment_line_create.py - port account_banking_payment_transfer and integrate it inside account_payment_order - fix bugs - clean-up code, remove dead code - test in several complex scenarios --- account_banking_sepa_direct_debit/__init__.py | 3 - .../__openerp__.py | 13 +- .../data/account_payment_method.xml | 15 + .../data/mandate_expire_cron.xml | 2 +- .../data/pain.008.003.02.xsd | 614 ++++++++++++++++++ .../data/payment_type_sdd.xml | 35 - .../demo/sepa_direct_debit_demo.xml | 14 +- .../models/__init__.py | 4 +- .../models/account_banking_mandate.py | 70 +- .../models/account_payment_method.py | 27 + ...ayment_mode.py => account_payment_mode.py} | 19 +- .../models/account_payment_order.py | 298 +++++++++ .../models/bank_payment_line.py | 2 +- .../models/common.py | 2 +- .../models/res_company.py | 11 +- .../original_mandate_required_security.xml | 17 - .../views/account_banking_mandate_view.xml | 74 +-- .../views/account_payment_mode.xml | 23 + .../views/payment_mode_view.xml | 24 - .../views/res_company_view.xml | 5 +- .../wizard/__init__.py | 23 - .../wizard/export_sdd.py | 394 ----------- .../wizard/export_sdd_view.xml | 36 - 23 files changed, 1022 insertions(+), 703 deletions(-) create mode 100644 account_banking_sepa_direct_debit/data/account_payment_method.xml create mode 100644 account_banking_sepa_direct_debit/data/pain.008.003.02.xsd delete mode 100644 account_banking_sepa_direct_debit/data/payment_type_sdd.xml create mode 100644 account_banking_sepa_direct_debit/models/account_payment_method.py rename account_banking_sepa_direct_debit/models/{payment_mode.py => account_payment_mode.py} (70%) create mode 100644 account_banking_sepa_direct_debit/models/account_payment_order.py delete mode 100644 account_banking_sepa_direct_debit/security/original_mandate_required_security.xml create mode 100644 account_banking_sepa_direct_debit/views/account_payment_mode.xml delete mode 100644 account_banking_sepa_direct_debit/views/payment_mode_view.xml delete mode 100644 account_banking_sepa_direct_debit/wizard/__init__.py delete mode 100644 account_banking_sepa_direct_debit/wizard/export_sdd.py delete mode 100644 account_banking_sepa_direct_debit/wizard/export_sdd_view.xml diff --git a/account_banking_sepa_direct_debit/__init__.py b/account_banking_sepa_direct_debit/__init__.py index b4a69d367..cde864bae 100644 --- a/account_banking_sepa_direct_debit/__init__.py +++ b/account_banking_sepa_direct_debit/__init__.py @@ -1,6 +1,3 @@ # -*- coding: utf-8 -*- -# © 2013 Akretion (www.akretion.com) -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from . import models -from . import wizard diff --git a/account_banking_sepa_direct_debit/__openerp__.py b/account_banking_sepa_direct_debit/__openerp__.py index 7f7de6752..4898c90d5 100644 --- a/account_banking_sepa_direct_debit/__openerp__.py +++ b/account_banking_sepa_direct_debit/__openerp__.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# © 2013-2015 Akretion (www.akretion.com) +# © 2013-2016 Akretion (www.akretion.com) # © 2014 Serv. Tecnol. Avanzados - Pedro M. Baeza # © 2016 Antiun Ingenieria S.L. - Antonio Espinosa # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). @@ -7,7 +7,7 @@ { 'name': 'Account Banking SEPA Direct Debit', 'summary': 'Create SEPA files for Direct Debit', - 'version': '8.0.0.5.0', + 'version': '9.0.1.0.0', 'license': 'AGPL-3', 'author': "Akretion, " "Serv. Tecnol. Avanzados - Pedro M. Baeza, " @@ -16,22 +16,19 @@ 'website': 'https://github.com/OCA/bank-payment', 'category': 'Banking addons', 'depends': [ - 'account_direct_debit', 'account_banking_pain_base', 'account_banking_mandate', ], 'data': [ 'views/account_banking_mandate_view.xml', 'views/res_company_view.xml', - 'views/payment_mode_view.xml', - 'wizard/export_sdd_view.xml', + 'views/account_payment_mode.xml', 'data/mandate_expire_cron.xml', - 'data/payment_type_sdd.xml', + 'data/account_payment_method.xml', 'data/report_paperformat.xml', 'reports/sepa_direct_debit_mandate.xml', 'views/report_sepa_direct_debit_mandate.xml', - 'security/original_mandate_required_security.xml', ], 'demo': ['demo/sepa_direct_debit_demo.xml'], - 'installable': False, + 'installable': True, } diff --git a/account_banking_sepa_direct_debit/data/account_payment_method.xml b/account_banking_sepa_direct_debit/data/account_payment_method.xml new file mode 100644 index 000000000..d2ef66bfd --- /dev/null +++ b/account_banking_sepa_direct_debit/data/account_payment_method.xml @@ -0,0 +1,15 @@ + + + + + + + SEPA Direct Debit for customers + sepa_direct_debit + inbound + pain.008.001.02 + + + + + diff --git a/account_banking_sepa_direct_debit/data/mandate_expire_cron.xml b/account_banking_sepa_direct_debit/data/mandate_expire_cron.xml index 48fe6fc63..fc411dacf 100644 --- a/account_banking_sepa_direct_debit/data/mandate_expire_cron.xml +++ b/account_banking_sepa_direct_debit/data/mandate_expire_cron.xml @@ -1,7 +1,7 @@ diff --git a/account_banking_sepa_direct_debit/data/pain.008.003.02.xsd b/account_banking_sepa_direct_debit/data/pain.008.003.02.xsd new file mode 100644 index 000000000..ed2dd930b --- /dev/null +++ b/account_banking_sepa_direct_debit/data/pain.008.003.02.xsd @@ -0,0 +1,614 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Mandatory if changes occur in ‘Mandate Identification’, otherwise not to be used. + + + + + Mandatory if changes occur in 'Creditor Scheme Identification', otherwise not to be used. + + + + + To be used only for changes of accounts within the same bank. + + + + + To use 'Identification’ under 'Other' under 'Financial Institution Identifier with code ‘SMNDA’ to indicate same mandate with new Debtor Agent. To be used with the ‘FRST’ indicator in the ‘Sequence Type’. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + If a Creditor Reference contains a check digit, the receiving bank is not required to validate this. +If the receiving bank validates the check digit and if this validation fails, the bank may continue its processing and send the transaction to the next party in the chain. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + It is recommended that all transactions within the same ‘Payment Information’ block have the same ‘Creditor Scheme Identification’. +This data element must be present at either ‘Payment Information’ or ‘Direct Debit +Transaction’ level. + + + + + + + + + + + It is recommended that this element be specified at ‘Payment Information’ level. + + + + + + This data element may be present either at ‘Payment Information’ or at ‘Direct Debit Transaction Information’ level. + + + + + + + + Mandatory if provided by the debtor in the mandate. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Mandatory if 'Amendment Indicator' is 'TRUE' +The reason code from the Rulebook is indicated using one of the following message subelements. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Either ‘BIC or BEI’ or one +occurrence of ‘Other’ is allowed. + + + + + Either ‘Date and Place of Birth’ or one occurrence of ‘Other’ is allowed + + + + + + + + + + Private Identification is used to identify either an organisation or a private +person. + + + + + + + + + ‘Name’ is limited to 70 characters in length. + + + + + + + + + + ‘Name’ is limited to 70 characters in length. + + + + + + + + + + + + + + + + If present the new’ Name’ must be specified under ‘Creditor’. ‘Name’ is limited to 70 characters in length. + + + + + + + + + + ‘Name’ is limited to 70 characters in length. + + + + + + + + + + + + + + + + + + If present and contains ‘true’, batch booking is requested. If present and contains ‘false’, booking per transaction is requested. If element is not present, pre-agreed customer-to-bank conditions apply. + + + + + + + + + + + + This data element may be present either at ‘Payment Information’ or at ‘Direct Debit Transaction Information’ level. + + + + + It is recommended that this element be specified at ‘Payment Information’ level. + + + + + It is recommended that all transactions within the same ‘Payment Information’ block have the same ‘Creditor Scheme Identification’. +This data element must be present at either ‘Payment Information’ or ‘Direct Debit +Transaction’ level. + + + + + + + + + + + + + + + + Only ‘B2B’, 'CORE' or 'COR1' is allowed. The mixing of different Local Instrument values is not allowed in the same message. + + + + + If 'Amendment Indicator' is 'true' and 'Original Debtor Agent' is set to 'SMNDA' this message element must indicate 'FRST' + + + + + Depending on the agreement between the Creditor and the Creditor Bank, ‘Category Purpose’ may be forwarded to the Debtor Bank. + + + + + + + + + + + + + + + + + Only one occurrence of ‘Other’ is allowed, and no other sub-elements are allowed. +Identification must be used with an identifier described in General Message Element Specifications, Chapter 1.5.2 of the Implementation Guide. +Scheme Name’ under ‘Other’ must specify ‘SEPA’ under ‘Proprietary + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Only codes from the ISO 20022 ExternalPurposeCode list are allowed. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + When present, the receiving bank is not obliged to validate the reference information. + + + + + + + + + + + + + + + + + + diff --git a/account_banking_sepa_direct_debit/data/payment_type_sdd.xml b/account_banking_sepa_direct_debit/data/payment_type_sdd.xml deleted file mode 100644 index a17b3b21c..000000000 --- a/account_banking_sepa_direct_debit/data/payment_type_sdd.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - SEPA Direct Debit v02 (recommended) - pain.008.001.02 - - - debit - - - - SEPA Direct Debit v03 - pain.008.001.03 - - - debit - - - - SEPA Direct Debit v04 - pain.008.001.04 - - - debit - - - - - diff --git a/account_banking_sepa_direct_debit/demo/sepa_direct_debit_demo.xml b/account_banking_sepa_direct_debit/demo/sepa_direct_debit_demo.xml index bcbeb7fb8..8c312cde5 100644 --- a/account_banking_sepa_direct_debit/demo/sepa_direct_debit_demo.xml +++ b/account_banking_sepa_direct_debit/demo/sepa_direct_debit_demo.xml @@ -3,13 +3,11 @@ - - SEPA Direct Debit La Banque Postale - - + + SEPA Direct Debit of customers - - + variable + @@ -18,7 +16,7 @@ - + sepa recurrent first @@ -27,7 +25,7 @@ - + sepa recurrent first diff --git a/account_banking_sepa_direct_debit/models/__init__.py b/account_banking_sepa_direct_debit/models/__init__.py index 93fb91cc8..5c9be9f71 100644 --- a/account_banking_sepa_direct_debit/models/__init__.py +++ b/account_banking_sepa_direct_debit/models/__init__.py @@ -3,4 +3,6 @@ from . import res_company from . import account_banking_mandate from . import bank_payment_line -from . import payment_mode +from . import account_payment_mode +from . import account_payment_method +from . import account_payment_order diff --git a/account_banking_sepa_direct_debit/models/account_banking_mandate.py b/account_banking_sepa_direct_debit/models/account_banking_mandate.py index ca2381204..2c065b4ef 100644 --- a/account_banking_sepa_direct_debit/models/account_banking_mandate.py +++ b/account_banking_sepa_direct_debit/models/account_banking_mandate.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# © 2013 Akretion - Alexis de Lattre +# © 2013-2016 Akretion - Alexis de Lattre # © 2014 Serv. Tecnol. Avanzados - Pedro M. Baeza # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). @@ -16,29 +16,13 @@ logger = logging.getLogger(__name__) class AccountBankingMandate(models.Model): """SEPA Direct Debit Mandate""" _inherit = 'account.banking.mandate' - _track = { - 'recurrent_sequence_type': { - 'account_banking_sepa_direct_debit.recurrent_sequence_type_first': - lambda self, cr, uid, obj, ctx=None: - obj['recurrent_sequence_type'] == 'first', - 'account_banking_sepa_direct_debit.' - 'recurrent_sequence_type_recurring': - lambda self, cr, uid, obj, ctx=None: - obj['recurrent_sequence_type'] == 'recurring', - 'account_banking_sepa_direct_debit.recurrent_sequence_type_final': - lambda self, cr, uid, obj, ctx=None: - obj['recurrent_sequence_type'] == 'final', - } - } format = fields.Selection( - selection_add=[('sepa', _('Sepa Mandate'))], - default='sepa', - ) + selection_add=[('sepa', 'Sepa Mandate')], default='sepa') type = fields.Selection([('recurrent', 'Recurrent'), ('oneoff', 'One-Off')], string='Type of Mandate', - track_visibility='always') + track_visibility='onchange') recurrent_sequence_type = fields.Selection( [('first', 'First'), ('recurring', 'Recurring'), @@ -46,24 +30,10 @@ class AccountBankingMandate(models.Model): string='Sequence Type for Next Debit', track_visibility='onchange', help="This field is only used for Recurrent mandates, not for " "One-Off mandates.", default="first") - sepa_migrated = fields.Boolean( - string='Migrated to SEPA', track_visibility='onchange', - help="If this field is not active, the mandate section of the next " - "direct debit file that include this mandate will contain the " - "'Original Mandate Identification' and the 'Original Creditor " - "Scheme Identification'. This is required in a few countries " - "(Belgium for instance), but not in all countries. If this is " - "not required in your country, you should keep this field always " - "active.", default=True) - original_mandate_identification = fields.Char( - string='Original Mandate Identification', track_visibility='onchange', - size=35, - help="When the field 'Migrated to SEPA' is not active, this field " - "will be used as the Original Mandate Identification in the " - "Direct Debit file.") - scheme = fields.Selection([('CORE', 'Basic (CORE)'), - ('B2B', 'Enterprise (B2B)')], - string='Scheme', default="CORE") + scheme = fields.Selection([ + ('CORE', 'Basic (CORE)'), + ('B2B', 'Enterprise (B2B)')], + string='Scheme', default="CORE", track_visibility='onchange') unique_mandate_reference = fields.Char(size=35) # cf ISO 20022 @api.multi @@ -76,30 +46,6 @@ class AccountBankingMandate(models.Model): _("The recurrent mandate '%s' must have a sequence type.") % mandate.unique_mandate_reference) - @api.multi - @api.constrains('type', 'recurrent_sequence_type', 'sepa_migrated') - def _check_migrated_to_sepa(self): - for mandate in self: - if (mandate.type == 'recurrent' and not mandate.sepa_migrated and - mandate.recurrent_sequence_type != 'first'): - raise exceptions.Warning( - _("The recurrent mandate '%s' which is not marked as " - "'Migrated to SEPA' must have its recurrent sequence " - "type set to 'First'.") - % mandate.unique_mandate_reference) - - @api.multi - @api.constrains('type', 'original_mandate_identification', 'sepa_migrated') - def _check_original_mandate_identification(self): - for mandate in self: - if (mandate.type == 'recurrent' and not mandate.sepa_migrated and - not mandate.original_mandate_identification): - raise exceptions.Warning( - _("You must set the 'Original Mandate Identification' on " - "the recurrent mandate '%s' which is not marked as " - "'Migrated to SEPA'.") - % mandate.unique_mandate_reference) - @api.multi @api.onchange('partner_bank_id') def mandate_partner_bank_change(self): @@ -137,5 +83,5 @@ class AccountBankingMandate(models.Model): 'The following SDD Mandate IDs has been set to expired: %s' % expired_mandates.ids) else: - logger.info('0 SDD Mandates must be set to Expired') + logger.info('0 SDD Mandates had to be set to Expired') return True diff --git a/account_banking_sepa_direct_debit/models/account_payment_method.py b/account_banking_sepa_direct_debit/models/account_payment_method.py new file mode 100644 index 000000000..5a9327b19 --- /dev/null +++ b/account_banking_sepa_direct_debit/models/account_payment_method.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +# © 2016 Akretion (Alexis de Lattre ) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from openerp import models, fields, api + + +class AccountPaymentMethod(models.Model): + _inherit = 'account.payment.method' + + pain_version = fields.Selection(selection_add=[ + ('pain.008.001.02', 'pain.008.001.02 (recommended)'), + ('pain.008.001.03', 'pain.008.001.03'), + ('pain.008.001.04', 'pain.008.001.04'), + ('pain.008.003.02', 'pain.008.003.02 (used in Germany)'), + ]) + + @api.multi + def get_xsd_file_path(self): + self.ensure_one() + if self.pain_version in [ + 'pain.008.001.02', 'pain.008.001.03', 'pain.008.001.04', + 'pain.008.003.02']: + path = 'account_banking_sepa_direct_debit/data/%s.xsd'\ + % self.pain_version + return path + return super(AccountPaymentMethod, self).get_xsd_file_path() diff --git a/account_banking_sepa_direct_debit/models/payment_mode.py b/account_banking_sepa_direct_debit/models/account_payment_mode.py similarity index 70% rename from account_banking_sepa_direct_debit/models/payment_mode.py rename to account_banking_sepa_direct_debit/models/account_payment_mode.py index f3c1ac1b6..0650736d0 100644 --- a/account_banking_sepa_direct_debit/models/payment_mode.py +++ b/account_banking_sepa_direct_debit/models/account_payment_mode.py @@ -2,12 +2,13 @@ # © 2016 Antiun Ingenieria S.L. - Antonio Espinosa # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from openerp import models, fields, api, exceptions, _ +from openerp import models, fields, api, _ from .common import is_sepa_creditor_identifier_valid +from openerp.exceptions import ValidationError -class PaymentMode(models.Model): - _inherit = 'payment.mode' +class AccountPaymentMode(models.Model): + _inherit = 'account.payment.mode' sepa_creditor_identifier = fields.Char( string='SEPA Creditor Identifier', size=35, @@ -19,13 +20,9 @@ class PaymentMode(models.Model): "- a 2-digits checkum\n" "- a 3-letters business code\n" "- a country-specific identifier") - original_creditor_identifier = fields.Char( - string='Original Creditor Identifier', size=70, - help="If not defined, Original Creditor Identifier from company " - "will be used.") def _sepa_type_get(self): - res = super(PaymentMode, self)._sepa_type_get() + res = super(AccountPaymentMode, self)._sepa_type_get() if not res: if self.type.code and self.type.code.startswith('pain.008'): res = 'sepa_direct_debit' @@ -38,6 +35,6 @@ class PaymentMode(models.Model): if payment_mode.sepa_creditor_identifier: if not is_sepa_creditor_identifier_valid( payment_mode.sepa_creditor_identifier): - raise exceptions.Warning( - _('Error'), - _("Invalid SEPA Creditor Identifier.")) + raise ValidationError( + _("The SEPA Creditor Identifier '%s' is invalid.") + % payment_mode.sepa_creditor_identifier) diff --git a/account_banking_sepa_direct_debit/models/account_payment_order.py b/account_banking_sepa_direct_debit/models/account_payment_order.py new file mode 100644 index 000000000..fdea2b052 --- /dev/null +++ b/account_banking_sepa_direct_debit/models/account_payment_order.py @@ -0,0 +1,298 @@ +# -*- coding: utf-8 -*- +# © 2016 Akretion (Alexis de Lattre ) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from openerp import models, fields, api, _ +from openerp.exceptions import UserError +from lxml import etree + + +class AccountPaymentOrder(models.Model): + _inherit = 'account.payment.order' + + def _get_previous_bank(self, payline): + previous_bank = False + older_lines = self.env['account.payment.line'].search([ + ('mandate_id', '=', payline.mandate_id.id), + ('partner_bank_id', '!=', payline.partner_bank_id.id)]) + if older_lines: + previous_date = False + previous_payline = False + for older_line in older_lines: + if hasattr(older_line.order_id, 'date_sent'): + older_line_date = older_line.order_id.date_sent + else: + older_line_date = older_line.order_id.date_done + if (older_line_date and + older_line_date > previous_date): + previous_date = older_line_date + previous_payline = older_line + if previous_payline: + previous_bank = previous_payline.partner_bank_id + return previous_bank + + @api.multi + def generate_payment_file(self): + """Creates the SEPA Direct Debit file. That's the important code !""" + self.ensure_one() + if ( + self.payment_mode_id.payment_method_id.code != + 'sepa_direct_debit'): + return super(AccountPaymentOrder, self).generate_payment_file() + pain_flavor = self.payment_mode_id.payment_method_id.pain_version + if pain_flavor == 'pain.008.001.02': + bic_xml_tag = 'BIC' + name_maxsize = 70 + root_xml_tag = 'CstmrDrctDbtInitn' + elif pain_flavor == 'pain.008.003.02': + bic_xml_tag = 'BIC' + name_maxsize = 70 + root_xml_tag = 'CstmrDrctDbtInitn' + elif pain_flavor == 'pain.008.001.03': + bic_xml_tag = 'BICFI' + name_maxsize = 140 + root_xml_tag = 'CstmrDrctDbtInitn' + elif pain_flavor == 'pain.008.001.04': + bic_xml_tag = 'BICFI' + name_maxsize = 140 + root_xml_tag = 'CstmrDrctDbtInitn' + else: + raise UserError( + _("Payment Type Code '%s' is not supported. The only " + "Payment Type Code supported for SEPA Direct Debit are " + "'pain.008.001.02', 'pain.008.001.03' and " + "'pain.008.001.04'.") % pain_flavor) + xsd_file = self.payment_mode_id.payment_method_id.get_xsd_file_path() + gen_args = { + 'bic_xml_tag': bic_xml_tag, + 'name_maxsize': name_maxsize, + 'convert_to_ascii': self.payment_mode_id.convert_to_ascii, + 'payment_method': 'DD', + 'file_prefix': 'sdd_', + 'pain_flavor': pain_flavor, + 'pain_xsd_file': xsd_file, + } + pain_ns = { + 'xsi': 'http://www.w3.org/2001/XMLSchema-instance', + None: 'urn:iso:std:iso:20022:tech:xsd:%s' % pain_flavor, + } + xml_root = etree.Element('Document', nsmap=pain_ns) + pain_root = etree.SubElement(xml_root, root_xml_tag) + # A. Group header + group_header_1_0, nb_of_transactions_1_6, control_sum_1_7 = \ + self.generate_group_header_block(pain_root, gen_args) + transactions_count_1_6 = 0 + amount_control_sum_1_7 = 0.0 + lines_per_group = {} + # key = (requested_date, priority, sequence type) + # value = list of lines as objects + for line in self.bank_line_ids: + transactions_count_1_6 += 1 + priority = line.priority + # The field line.date is the requested payment date + # taking into account the 'date_prefered' setting + # cf account_banking_payment_export/models/account_payment.py + # in the inherit of action_open() + if not line.mandate_id: + raise UserError( + _("Missing SEPA Direct Debit mandate on the " + "bank payment line with partner '%s' " + "(reference '%s').") + % (line.partner_id.name, line.name)) + scheme = line.mandate_id.scheme + if line.mandate_id.state != 'valid': + raise Warning( + _("The SEPA Direct Debit mandate with reference '%s' " + "for partner '%s' has expired.") + % (line.mandate_id.unique_mandate_reference, + line.mandate_id.partner_id.name)) + if line.mandate_id.type == 'oneoff': + seq_type = 'OOFF' + if line.mandate_id.last_debit_date: + raise Warning( + _("The mandate with reference '%s' for partner " + "'%s' has type set to 'One-Off' and it has a " + "last debit date set to '%s', so we can't use " + "it.") + % (line.mandate_id.unique_mandate_reference, + line.mandate_id.partner_id.name, + line.mandate_id.last_debit_date)) + elif line.mandate_id.type == 'recurrent': + seq_type_map = { + 'recurring': 'RCUR', + 'first': 'FRST', + 'final': 'FNAL', + } + seq_type_label = \ + line.mandate_id.recurrent_sequence_type + assert seq_type_label is not False + seq_type = seq_type_map[seq_type_label] + key = (line.date, priority, seq_type, scheme) + if key in lines_per_group: + lines_per_group[key].append(line) + else: + lines_per_group[key] = [line] + + for (requested_date, priority, sequence_type, scheme), lines in \ + lines_per_group.items(): + # B. Payment info + payment_info_2_0, nb_of_transactions_2_4, control_sum_2_5 = \ + self.generate_start_payment_info_block( + pain_root, + "self.name + '-' + " + "sequence_type + '-' + requested_date.replace('-', '') " + "+ '-' + priority", + priority, scheme, sequence_type, requested_date, { + 'self': self, + 'sequence_type': sequence_type, + 'priority': priority, + 'requested_date': requested_date, + }, gen_args) + + self.generate_party_block( + payment_info_2_0, 'Cdtr', 'B', + 'self.company_partner_bank_id.partner_id.name', + 'self.company_partner_bank_id.sanitized_acc_number', + 'self.company_partner_bank_id.bank_bic', + {'self': self}, gen_args) + charge_bearer_2_24 = etree.SubElement(payment_info_2_0, 'ChrgBr') + if self.sepa: + charge_bearer = 'SLEV' + else: + charge_bearer = self.charge_bearer + charge_bearer_2_24.text = charge_bearer + creditor_scheme_identification_2_27 = etree.SubElement( + payment_info_2_0, 'CdtrSchmeId') + self.generate_creditor_scheme_identification( + creditor_scheme_identification_2_27, + 'self.payment_mode_id.sepa_creditor_identifier or ' + 'self.company_id.sepa_creditor_identifier', + 'SEPA Creditor Identifier', {'self': self}, 'SEPA', gen_args) + transactions_count_2_4 = 0 + amount_control_sum_2_5 = 0.0 + for line in lines: + transactions_count_2_4 += 1 + # C. Direct Debit Transaction Info + dd_transaction_info_2_28 = etree.SubElement( + payment_info_2_0, 'DrctDbtTxInf') + payment_identification_2_29 = etree.SubElement( + dd_transaction_info_2_28, 'PmtId') + end2end_identification_2_31 = etree.SubElement( + payment_identification_2_29, 'EndToEndId') + end2end_identification_2_31.text = self._prepare_field( + 'End to End Identification', 'line.name', + {'line': line}, 35, gen_args=gen_args) + currency_name = self._prepare_field( + 'Currency Code', 'line.currency_id.name', + {'line': line}, 3, gen_args=gen_args) + instructed_amount_2_44 = etree.SubElement( + dd_transaction_info_2_28, 'InstdAmt', Ccy=currency_name) + instructed_amount_2_44.text = '%.2f' % line.amount_currency + amount_control_sum_1_7 += line.amount_currency + amount_control_sum_2_5 += line.amount_currency + dd_transaction_2_46 = etree.SubElement( + dd_transaction_info_2_28, 'DrctDbtTx') + mandate_related_info_2_47 = etree.SubElement( + dd_transaction_2_46, 'MndtRltdInf') + mandate_identification_2_48 = etree.SubElement( + mandate_related_info_2_47, 'MndtId') + mandate_identification_2_48.text = self._prepare_field( + 'Unique Mandate Reference', + 'line.mandate_id.unique_mandate_reference', + {'line': line}, 35, gen_args=gen_args) + mandate_signature_date_2_49 = etree.SubElement( + mandate_related_info_2_47, 'DtOfSgntr') + mandate_signature_date_2_49.text = self._prepare_field( + 'Mandate Signature Date', + 'line.mandate_id.signature_date', + {'line': line}, 10, gen_args=gen_args) + if sequence_type == 'FRST' and line.mandate_id.last_debit_date: + previous_bank = self._get_previous_bank(line) + if previous_bank: + amendment_indicator_2_50 = etree.SubElement( + mandate_related_info_2_47, 'AmdmntInd') + amendment_indicator_2_50.text = 'true' + amendment_info_details_2_51 = etree.SubElement( + mandate_related_info_2_47, 'AmdmntInfDtls') + if ( + previous_bank.bank_bic == + line.partner_bank_id.bank_bic): + ori_debtor_account_2_57 = etree.SubElement( + amendment_info_details_2_51, 'OrgnlDbtrAcct') + ori_debtor_account_id = etree.SubElement( + ori_debtor_account_2_57, 'Id') + ori_debtor_account_iban = etree.SubElement( + ori_debtor_account_id, 'IBAN') + ori_debtor_account_iban.text = self._validate_iban( + self._prepare_field( + 'Original Debtor Account', + 'previous_bank.sanitized_acc_number', + {'previous_bank': previous_bank}, + gen_args=gen_args)) + else: + ori_debtor_agent_2_58 = etree.SubElement( + amendment_info_details_2_51, 'OrgnlDbtrAgt') + ori_debtor_agent_institution = etree.SubElement( + ori_debtor_agent_2_58, 'FinInstnId') + ori_debtor_agent_bic = etree.SubElement( + ori_debtor_agent_institution, bic_xml_tag) + ori_debtor_agent_bic.text = self._prepare_field( + 'Original Debtor Agent', + 'previous_bank.bank_bic', + {'previous_bank': previous_bank}, + gen_args=gen_args) + ori_debtor_agent_other = etree.SubElement( + ori_debtor_agent_institution, 'Othr') + ori_debtor_agent_other_id = etree.SubElement( + ori_debtor_agent_other, 'Id') + ori_debtor_agent_other_id.text = 'SMNDA' + # SMNDA = Same Mandate New Debtor Agent + + self.generate_party_block( + dd_transaction_info_2_28, 'Dbtr', 'C', + 'line.partner_id.name', + 'line.partner_bank_id.sanitized_acc_number', + 'line.partner_bank_id.bank_bic', + {'line': line}, gen_args) + + self.generate_remittance_info_block( + dd_transaction_info_2_28, line, gen_args) + + nb_of_transactions_2_4.text = unicode(transactions_count_2_4) + control_sum_2_5.text = '%.2f' % amount_control_sum_2_5 + nb_of_transactions_1_6.text = unicode(transactions_count_1_6) + control_sum_1_7.text = '%.2f' % amount_control_sum_1_7 + + return self.finalize_sepa_file_creation( + xml_root, gen_args) + + @api.multi + def finalize_sepa_file_creation(self, xml_root, gen_args): + """Save the SEPA Direct Debit file: mark all payments in the file + as 'sent'. Write 'last debit date' on mandate and set oneoff + mandate to expired. + """ + abmo = self.env['account.banking.mandate'] + to_expire_mandates = abmo.browse([]) + first_mandates = abmo.browse([]) + all_mandates = abmo.browse([]) + for bline in self.bank_line_ids: + if bline.mandate_id in all_mandates: + continue + all_mandates += bline.mandate_id + if bline.mandate_id.type == 'oneoff': + to_expire_mandates += bline.mandate_id + elif bline.mandate_id.type == 'recurrent': + seq_type = bline.mandate_id.recurrent_sequence_type + if seq_type == 'final': + to_expire_mandates += bline.mandate_id + elif seq_type == 'first': + first_mandates += bline.mandate_id + all_mandates.write( + {'last_debit_date': fields.Date.context_today(self)}) + to_expire_mandates.write({'state': 'expired'}) + first_mandates.write({ + 'recurrent_sequence_type': 'recurring', + }) + return super(AccountPaymentOrder, self).finalize_sepa_file_creation( + xml_root, gen_args) diff --git a/account_banking_sepa_direct_debit/models/bank_payment_line.py b/account_banking_sepa_direct_debit/models/bank_payment_line.py index e28207ebc..5eb0b26b7 100644 --- a/account_banking_sepa_direct_debit/models/bank_payment_line.py +++ b/account_banking_sepa_direct_debit/models/bank_payment_line.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# © 2015 Akretion - Alexis de Lattre +# © 2015-2016 Akretion - Alexis de Lattre # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from openerp import models, api diff --git a/account_banking_sepa_direct_debit/models/common.py b/account_banking_sepa_direct_debit/models/common.py index dd507a4db..83f7bfa03 100644 --- a/account_banking_sepa_direct_debit/models/common.py +++ b/account_banking_sepa_direct_debit/models/common.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# © 2013 Akretion (www.akretion.com) +# © 2013-2016 Akretion (Alexis de Lattre ) # © 2014 Serv. Tecnol. Avanzados - Pedro M. Baeza # © 2016 Antiun Ingenieria S.L. - Antonio Espinosa # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). diff --git a/account_banking_sepa_direct_debit/models/res_company.py b/account_banking_sepa_direct_debit/models/res_company.py index c57dc8b04..ac58eb42f 100644 --- a/account_banking_sepa_direct_debit/models/res_company.py +++ b/account_banking_sepa_direct_debit/models/res_company.py @@ -1,11 +1,12 @@ # -*- coding: utf-8 -*- -# © 2013 Akretion (www.akretion.com) +# © 2013-2016 Akretion (Alexis de Lattre ) # © 2014 Serv. Tecnol. Avanzados - Pedro M. Baeza # © 2016 Antiun Ingenieria S.L. - Antonio Espinosa # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from openerp import models, fields, api, exceptions, _ +from openerp import models, fields, api, _ from .common import is_sepa_creditor_identifier_valid +from openerp.exceptions import ValidationError class ResCompany(models.Model): @@ -28,6 +29,6 @@ class ResCompany(models.Model): if company.sepa_creditor_identifier: if not is_sepa_creditor_identifier_valid( company.sepa_creditor_identifier): - raise exceptions.Warning( - _('Error'), - _("Invalid SEPA Creditor Identifier.")) + raise ValidationError( + _("The SEPA Creditor Identifier '%s' is invalid.") + % company.sepa_creditor_identifier) diff --git a/account_banking_sepa_direct_debit/security/original_mandate_required_security.xml b/account_banking_sepa_direct_debit/security/original_mandate_required_security.xml deleted file mode 100644 index e6a8570cf..000000000 --- a/account_banking_sepa_direct_debit/security/original_mandate_required_security.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - Original Mandate Required (SEPA) - - - - - diff --git a/account_banking_sepa_direct_debit/views/account_banking_mandate_view.xml b/account_banking_sepa_direct_debit/views/account_banking_mandate_view.xml index 667cedb54..7d8d73312 100644 --- a/account_banking_sepa_direct_debit/views/account_banking_mandate_view.xml +++ b/account_banking_sepa_direct_debit/views/account_banking_mandate_view.xml @@ -1,6 +1,6 @@ @@ -11,7 +11,7 @@ - + sdd.mandate.form account.banking.mandate @@ -25,14 +25,10 @@ - - - - - + sdd.mandate.tree account.banking.mandate @@ -45,7 +41,7 @@ - + sdd.mandate.search account.banking.mandate @@ -66,67 +62,5 @@ - - SEPA Direct Debit Mandates - account.banking.mandate - tree,form - -

- Click to create a new SEPA Direct Debit Mandate. -

- A SEPA Direct Debit Mandate is a document signed by your customer that gives you the autorization to do one or several direct debits on his bank account. -

-
-
- - - - - sdd.mandate.res.partner.bank.tree - res.partner.bank - - - - SDD Mandates - - - - - - sdd.mandate.partner.form - res.partner - - - - SDD Mandates - - - - - - Sequence Type set to First - account.banking.mandate - - Sequence Type set to First - - - - Sequence Type set to Recurring - account.banking.mandate - - Sequence Type set to Recurring - - - - Sequence Type set to Final - account.banking.mandate - - Sequence Type set to Final - -
diff --git a/account_banking_sepa_direct_debit/views/account_payment_mode.xml b/account_banking_sepa_direct_debit/views/account_payment_mode.xml new file mode 100644 index 000000000..5f41be2f3 --- /dev/null +++ b/account_banking_sepa_direct_debit/views/account_payment_mode.xml @@ -0,0 +1,23 @@ + + + + + + + Add SEPA identifiers on payment mode form + account.payment.mode + + + + + + + + + + + diff --git a/account_banking_sepa_direct_debit/views/payment_mode_view.xml b/account_banking_sepa_direct_debit/views/payment_mode_view.xml deleted file mode 100644 index 9bba891d6..000000000 --- a/account_banking_sepa_direct_debit/views/payment_mode_view.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - Add SEPA identifiers - payment.mode - - - - - - - - - - - - - diff --git a/account_banking_sepa_direct_debit/views/res_company_view.xml b/account_banking_sepa_direct_debit/views/res_company_view.xml index e4c9e0b93..6b4d544ca 100644 --- a/account_banking_sepa_direct_debit/views/res_company_view.xml +++ b/account_banking_sepa_direct_debit/views/res_company_view.xml @@ -1,20 +1,19 @@ - + sepa_direct_debit.res.company.form res.company - diff --git a/account_banking_sepa_direct_debit/wizard/__init__.py b/account_banking_sepa_direct_debit/wizard/__init__.py deleted file mode 100644 index 3830e36d9..000000000 --- a/account_banking_sepa_direct_debit/wizard/__init__.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- encoding: utf-8 -*- -############################################################################## -# -# SEPA Direct Debit module for OpenERP -# Copyright (C) 2013 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 . -# -############################################################################## - -from . import export_sdd diff --git a/account_banking_sepa_direct_debit/wizard/export_sdd.py b/account_banking_sepa_direct_debit/wizard/export_sdd.py deleted file mode 100644 index 9b4022d46..000000000 --- a/account_banking_sepa_direct_debit/wizard/export_sdd.py +++ /dev/null @@ -1,394 +0,0 @@ -# -*- encoding: utf-8 -*- -############################################################################## -# -# SEPA Direct Debit module for Odoo -# Copyright (C) 2013-2015 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 . -# -############################################################################## - - -from openerp import models, fields, api, _ -from openerp.exceptions import Warning -from openerp import workflow -from lxml import etree - - -class BankingExportSddWizard(models.TransientModel): - _name = 'banking.export.sdd.wizard' - _inherit = ['banking.export.pain'] - _description = 'Export SEPA Direct Debit File' - - state = fields.Selection([ - ('create', 'Create'), - ('finish', 'Finish'), - ], string='State', readonly=True, default='create') - batch_booking = fields.Boolean( - string='Batch Booking', - help="If true, the bank statement will display only one credit " - "line for all the direct debits of the SEPA file ; if false, " - "the bank statement will display one credit line per direct " - "debit of the SEPA file.") - charge_bearer = fields.Selection([ - ('SLEV', 'Following Service Level'), - ('SHAR', 'Shared'), - ('CRED', 'Borne by Creditor'), - ('DEBT', 'Borne by Debtor'), - ], string='Charge Bearer', required=True, default='SLEV', - help="Following service level : transaction charges are to be " - "applied following the rules agreed in the service level " - "and/or scheme (SEPA Core messages must use this). Shared : " - "transaction charges on the creditor side are to be borne " - "by the creditor, transaction charges on the debtor side are " - "to be borne by the debtor. Borne by creditor : all " - "transaction charges are to be borne by the creditor. Borne " - "by debtor : all transaction charges are to be borne by the debtor.") - nb_transactions = fields.Integer( - string='Number of Transactions', readonly=True) - total_amount = fields.Float(string='Total Amount', readonly=True) - file = fields.Binary(string="File", readonly=True) - filename = fields.Char(string="Filename", readonly=True) - payment_order_ids = fields.Many2many( - 'payment.order', 'wiz_sdd_payorders_rel', 'wizard_id', - 'payment_order_id', string='Payment Orders', readonly=True) - - @api.model - def create(self, vals): - payment_order_ids = self._context.get('active_ids', []) - vals.update({ - 'payment_order_ids': [[6, 0, payment_order_ids]], - }) - return super(BankingExportSddWizard, self).create(vals) - - def _get_previous_bank(self, payline): - previous_bank = False - older_lines = self.env['payment.line'].search([ - ('mandate_id', '=', payline.mandate_id.id), - ('bank_id', '!=', payline.bank_id.id)]) - if older_lines: - previous_date = False - previous_payline = False - for older_line in older_lines: - if hasattr(older_line.order_id, 'date_sent'): - older_line_date = older_line.order_id.date_sent - else: - older_line_date = older_line.order_id.date_done - if (older_line_date and - older_line_date > previous_date): - previous_date = older_line_date - previous_payline = older_line - if previous_payline: - previous_bank = previous_payline.bank_id - return previous_bank - - @api.multi - def create_sepa(self): - """Creates the SEPA Direct Debit file. That's the important code !""" - pain_flavor = self.payment_order_ids[0].mode.type.code - convert_to_ascii = \ - self.payment_order_ids[0].mode.convert_to_ascii - if pain_flavor == 'pain.008.001.02': - bic_xml_tag = 'BIC' - name_maxsize = 70 - root_xml_tag = 'CstmrDrctDbtInitn' - elif pain_flavor == 'pain.008.001.03': - bic_xml_tag = 'BICFI' - name_maxsize = 140 - root_xml_tag = 'CstmrDrctDbtInitn' - elif pain_flavor == 'pain.008.001.04': - bic_xml_tag = 'BICFI' - name_maxsize = 140 - root_xml_tag = 'CstmrDrctDbtInitn' - else: - raise Warning( - _("Payment Type Code '%s' is not supported. The only " - "Payment Type Code supported for SEPA Direct Debit are " - "'pain.008.001.02', 'pain.008.001.03' and " - "'pain.008.001.04'.") % pain_flavor) - gen_args = { - 'bic_xml_tag': bic_xml_tag, - 'name_maxsize': name_maxsize, - 'convert_to_ascii': convert_to_ascii, - 'payment_method': 'DD', - 'file_prefix': 'sdd_', - 'pain_flavor': pain_flavor, - 'pain_xsd_file': - 'account_banking_sepa_direct_debit/data/%s.xsd' % pain_flavor, - } - pain_ns = { - 'xsi': 'http://www.w3.org/2001/XMLSchema-instance', - None: 'urn:iso:std:iso:20022:tech:xsd:%s' % pain_flavor, - } - xml_root = etree.Element('Document', nsmap=pain_ns) - pain_root = etree.SubElement(xml_root, root_xml_tag) - # A. Group header - group_header_1_0, nb_of_transactions_1_6, control_sum_1_7 = \ - self.generate_group_header_block(pain_root, gen_args) - transactions_count_1_6 = 0 - total_amount = 0.0 - amount_control_sum_1_7 = 0.0 - lines_per_group = {} - # key = (requested_date, priority, sequence type) - # value = list of lines as objects - # Iterate on payment orders - for payment_order in self.payment_order_ids: - total_amount = total_amount + payment_order.total - # Iterate each payment lines - for line in payment_order.bank_line_ids: - transactions_count_1_6 += 1 - priority = line.priority - # The field line.date is the requested payment date - # taking into account the 'date_prefered' setting - # cf account_banking_payment_export/models/account_payment.py - # in the inherit of action_open() - if not line.mandate_id: - raise Warning( - _("Missing SEPA Direct Debit mandate on the " - "bank payment line with partner '%s' " - "(reference '%s').") - % (line.partner_id.name, line.name)) - scheme = line.mandate_id.scheme - if line.mandate_id.state != 'valid': - raise Warning( - _("The SEPA Direct Debit mandate with reference '%s' " - "for partner '%s' has expired.") - % (line.mandate_id.unique_mandate_reference, - line.mandate_id.partner_id.name)) - if line.mandate_id.type == 'oneoff': - seq_type = 'OOFF' - if line.mandate_id.last_debit_date: - raise Warning( - _("The mandate with reference '%s' for partner " - "'%s' has type set to 'One-Off' and it has a " - "last debit date set to '%s', so we can't use " - "it.") - % (line.mandate_id.unique_mandate_reference, - line.mandate_id.partner_id.name, - line.mandate_id.last_debit_date)) - elif line.mandate_id.type == 'recurrent': - seq_type_map = { - 'recurring': 'RCUR', - 'first': 'FRST', - 'final': 'FNAL', - } - seq_type_label = \ - line.mandate_id.recurrent_sequence_type - assert seq_type_label is not False - seq_type = seq_type_map[seq_type_label] - key = (line.date, priority, seq_type, scheme) - if key in lines_per_group: - lines_per_group[key].append(line) - else: - lines_per_group[key] = [line] - - for (requested_date, priority, sequence_type, scheme), lines in \ - lines_per_group.items(): - # B. Payment info - payment_info_2_0, nb_of_transactions_2_4, control_sum_2_5 = \ - self.generate_start_payment_info_block( - pain_root, - "self.payment_order_ids[0].reference + '-' + " - "sequence_type + '-' + requested_date.replace('-', '') " - "+ '-' + priority", - priority, scheme, sequence_type, requested_date, { - 'self': self, - 'sequence_type': sequence_type, - 'priority': priority, - 'requested_date': requested_date, - }, gen_args) - - self.generate_party_block( - payment_info_2_0, 'Cdtr', 'B', - 'self.payment_order_ids[0].mode.bank_id.partner_id.' - 'name', - 'self.payment_order_ids[0].mode.bank_id.acc_number', - 'self.payment_order_ids[0].mode.bank_id.bank.bic or ' - 'self.payment_order_ids[0].mode.bank_id.bank_bic', - {'self': self}, gen_args) - charge_bearer_2_24 = etree.SubElement(payment_info_2_0, 'ChrgBr') - charge_bearer_2_24.text = self.charge_bearer - creditor_scheme_identification_2_27 = etree.SubElement( - payment_info_2_0, 'CdtrSchmeId') - self.generate_creditor_scheme_identification( - creditor_scheme_identification_2_27, - 'self.payment_order_ids[0].mode.' - 'sepa_creditor_identifier or ' - 'self.payment_order_ids[0].company_id.' - 'sepa_creditor_identifier', - 'SEPA Creditor Identifier', {'self': self}, 'SEPA', gen_args) - transactions_count_2_4 = 0 - amount_control_sum_2_5 = 0.0 - for line in lines: - transactions_count_2_4 += 1 - # C. Direct Debit Transaction Info - dd_transaction_info_2_28 = etree.SubElement( - payment_info_2_0, 'DrctDbtTxInf') - payment_identification_2_29 = etree.SubElement( - dd_transaction_info_2_28, 'PmtId') - end2end_identification_2_31 = etree.SubElement( - payment_identification_2_29, 'EndToEndId') - end2end_identification_2_31.text = self._prepare_field( - 'End to End Identification', 'line.name', - {'line': line}, 35, gen_args=gen_args) - currency_name = self._prepare_field( - 'Currency Code', 'line.currency.name', - {'line': line}, 3, gen_args=gen_args) - instructed_amount_2_44 = etree.SubElement( - dd_transaction_info_2_28, 'InstdAmt', Ccy=currency_name) - instructed_amount_2_44.text = '%.2f' % line.amount_currency - amount_control_sum_1_7 += line.amount_currency - amount_control_sum_2_5 += line.amount_currency - dd_transaction_2_46 = etree.SubElement( - dd_transaction_info_2_28, 'DrctDbtTx') - mandate_related_info_2_47 = etree.SubElement( - dd_transaction_2_46, 'MndtRltdInf') - mandate_identification_2_48 = etree.SubElement( - mandate_related_info_2_47, 'MndtId') - mandate_identification_2_48.text = self._prepare_field( - 'Unique Mandate Reference', - 'line.mandate_id.unique_mandate_reference', - {'line': line}, 35, gen_args=gen_args) - mandate_signature_date_2_49 = etree.SubElement( - mandate_related_info_2_47, 'DtOfSgntr') - mandate_signature_date_2_49.text = self._prepare_field( - 'Mandate Signature Date', - 'line.mandate_id.signature_date', - {'line': line}, 10, gen_args=gen_args) - if sequence_type == 'FRST' and ( - line.mandate_id.last_debit_date or - not line.mandate_id.sepa_migrated): - previous_bank = self._get_previous_bank(line) - if previous_bank or not line.mandate_id.sepa_migrated: - amendment_indicator_2_50 = etree.SubElement( - mandate_related_info_2_47, 'AmdmntInd') - amendment_indicator_2_50.text = 'true' - amendment_info_details_2_51 = etree.SubElement( - mandate_related_info_2_47, 'AmdmntInfDtls') - if previous_bank: - if (previous_bank.bank.bic or - previous_bank.bank_bic) == \ - (line.bank_id.bank.bic or - line.bank_id.bank_bic): - ori_debtor_account_2_57 = etree.SubElement( - amendment_info_details_2_51, 'OrgnlDbtrAcct') - ori_debtor_account_id = etree.SubElement( - ori_debtor_account_2_57, 'Id') - ori_debtor_account_iban = etree.SubElement( - ori_debtor_account_id, 'IBAN') - ori_debtor_account_iban.text = self._validate_iban( - self._prepare_field( - 'Original Debtor Account', - 'previous_bank.acc_number', - {'previous_bank': previous_bank}, - gen_args=gen_args)) - else: - ori_debtor_agent_2_58 = etree.SubElement( - amendment_info_details_2_51, 'OrgnlDbtrAgt') - ori_debtor_agent_institution = etree.SubElement( - ori_debtor_agent_2_58, 'FinInstnId') - ori_debtor_agent_bic = etree.SubElement( - ori_debtor_agent_institution, bic_xml_tag) - ori_debtor_agent_bic.text = self._prepare_field( - 'Original Debtor Agent', - 'previous_bank.bank.bic or ' - 'previous_bank.bank_bic', - {'previous_bank': previous_bank}, - gen_args=gen_args) - ori_debtor_agent_other = etree.SubElement( - ori_debtor_agent_institution, 'Othr') - ori_debtor_agent_other_id = etree.SubElement( - ori_debtor_agent_other, 'Id') - ori_debtor_agent_other_id.text = 'SMNDA' - # SMNDA = Same Mandate New Debtor Agent - elif not line.mandate_id.sepa_migrated: - ori_mandate_identification_2_52 = etree.SubElement( - amendment_info_details_2_51, 'OrgnlMndtId') - ori_mandate_identification_2_52.text = \ - self._prepare_field( - 'Original Mandate Identification', - 'line.mandate_id.' - 'original_mandate_identification', - {'line': line}, - gen_args=gen_args) - ori_creditor_scheme_id_2_53 = etree.SubElement( - amendment_info_details_2_51, 'OrgnlCdtrSchmeId') - self.generate_creditor_scheme_identification( - ori_creditor_scheme_id_2_53, - 'self.payment_order_ids[0].mode.' - 'original_creditor_identifier or ' - 'self.payment_order_ids[0].company_id.' - 'original_creditor_identifier', - 'Original Creditor Identifier', - {'self': self}, 'SEPA', gen_args) - - self.generate_party_block( - dd_transaction_info_2_28, 'Dbtr', 'C', - 'line.partner_id.name', - 'line.bank_id.acc_number', - 'line.bank_id.bank.bic or ' - 'line.bank_id.bank_bic', - {'line': line}, gen_args) - - self.generate_remittance_info_block( - dd_transaction_info_2_28, line, gen_args) - - nb_of_transactions_2_4.text = unicode(transactions_count_2_4) - control_sum_2_5.text = '%.2f' % amount_control_sum_2_5 - nb_of_transactions_1_6.text = unicode(transactions_count_1_6) - control_sum_1_7.text = '%.2f' % amount_control_sum_1_7 - - return self.finalize_sepa_file_creation( - xml_root, total_amount, transactions_count_1_6, gen_args) - - @api.multi - def save_sepa(self): - """Save the SEPA Direct Debit file: mark all payments in the file - as 'sent'. Write 'last debit date' on mandate and set oneoff - mandate to expired. - """ - abmo = self.env['account.banking.mandate'] - for order in self.payment_order_ids: - workflow.trg_validate( - self._uid, 'payment.order', order.id, 'done', self._cr) - self.env['ir.attachment'].create({ - 'res_model': 'payment.order', - 'res_id': order.id, - 'name': self.filename, - 'datas': self.file, - }) - to_expire_mandates = abmo.browse([]) - first_mandates = abmo.browse([]) - all_mandates = abmo.browse([]) - for bline in order.bank_line_ids: - if bline.mandate_id in all_mandates: - continue - all_mandates += bline.mandate_id - if bline.mandate_id.type == 'oneoff': - to_expire_mandates += bline.mandate_id - elif bline.mandate_id.type == 'recurrent': - seq_type = bline.mandate_id.recurrent_sequence_type - if seq_type == 'final': - to_expire_mandates += bline.mandate_id - elif seq_type == 'first': - first_mandates += bline.mandate_id - all_mandates.write( - {'last_debit_date': fields.Date.context_today(self)}) - to_expire_mandates.write({'state': 'expired'}) - first_mandates.write({ - 'recurrent_sequence_type': 'recurring', - 'sepa_migrated': True, - }) - return True diff --git a/account_banking_sepa_direct_debit/wizard/export_sdd_view.xml b/account_banking_sepa_direct_debit/wizard/export_sdd_view.xml deleted file mode 100644 index 95117e270..000000000 --- a/account_banking_sepa_direct_debit/wizard/export_sdd_view.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - banking.export.sdd.wizard.view - banking.export.sdd.wizard - -
- - - - - - - - - - - -
-
- -
-
- -
-
From dc48391ecae0ccdb7325b7a3acf13a2c023500d5 Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Fri, 6 May 2016 01:16:20 +0200 Subject: [PATCH 080/118] Finalise the wizard of selection of move lines to pay Add button "Add to payment/debit order" on invoice form view Started to integrate payment transfer in account_payment_order (not finished at all though) Various fixes/changes/improvements/... --- account_banking_sepa_direct_debit/README.rst | 13 +++++-------- .../i18n/account_banking_sepa_direct_debit.pot | 5 ----- account_banking_sepa_direct_debit/i18n/fr.po | 5 ----- 3 files changed, 5 insertions(+), 18 deletions(-) diff --git a/account_banking_sepa_direct_debit/README.rst b/account_banking_sepa_direct_debit/README.rst index 04d40f4c3..4a2788e68 100644 --- a/account_banking_sepa_direct_debit/README.rst +++ b/account_banking_sepa_direct_debit/README.rst @@ -23,8 +23,9 @@ Installation ============ This module depends on : + * account_direct_debit -* account_banking_pain_base', +* account_banking_pain_base * account_banking_mandate This module is part of the OCA/bank-payment suite. @@ -39,11 +40,7 @@ To configure this module, you need to: Usage ===== -To use this module, you must select this payment mode on a direct debit order (Menu :Accounting > Payment > Direct Debit orders) - -For further information, please visit: - - * https://www.odoo.com/forum/help-1 +To use this module, you must select this payment mode on a direct debit order (Menu :Accounting > Payment > Debit Orders) Known issues / Roadmap ====================== @@ -56,7 +53,7 @@ Bug Tracker Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed feedback -`here `_. +`here `_. Credits ======= @@ -64,7 +61,7 @@ Credits Contributors ------------ -* Alexis de Lattre +* Alexis de Lattre * Pedro M. Baeza * Stéphane Bidoul * Alexandre Fayolle diff --git a/account_banking_sepa_direct_debit/i18n/account_banking_sepa_direct_debit.pot b/account_banking_sepa_direct_debit/i18n/account_banking_sepa_direct_debit.pot index a39fa750a..834613460 100644 --- a/account_banking_sepa_direct_debit/i18n/account_banking_sepa_direct_debit.pot +++ b/account_banking_sepa_direct_debit/i18n/account_banking_sepa_direct_debit.pot @@ -319,11 +319,6 @@ msgstr "" msgid "SEPA Direct Debit Files" msgstr "" -#. module: account_banking_sepa_direct_debit -#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.mandate_action -msgid "SEPA Direct Debit Mandates" -msgstr "" - #. module: account_banking_sepa_direct_debit #: view:banking.export.sdd.wizard:account_banking_sepa_direct_debit.banking_export_sdd_wizard_view msgid "SEPA Direct Debit XML file generation" diff --git a/account_banking_sepa_direct_debit/i18n/fr.po b/account_banking_sepa_direct_debit/i18n/fr.po index 75cc33f0f..df7158fa4 100644 --- a/account_banking_sepa_direct_debit/i18n/fr.po +++ b/account_banking_sepa_direct_debit/i18n/fr.po @@ -402,11 +402,6 @@ msgstr "Mandats SEPA" msgid "SEPA Creditor Identifier" msgstr "Identifiant créancier SEPA" -#. module: account_banking_sepa_direct_debit -#: model:ir.actions.act_window,name:account_banking_sepa_direct_debit.mandate_action -msgid "SEPA Direct Debit Mandates" -msgstr "Mandats de prélèvement SEPA" - #. module: account_banking_sepa_direct_debit #: view:banking.export.sdd.wizard:account_banking_sepa_direct_debit.banking_export_sdd_wizard_view msgid "SEPA Direct Debit XML file generation" From 8f78258579c18461c8342f90e5473064f0d6694c Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Fri, 6 May 2016 19:37:26 +0200 Subject: [PATCH 081/118] Update and re-enable demo data --- .../demo/sepa_direct_debit_demo.xml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/account_banking_sepa_direct_debit/demo/sepa_direct_debit_demo.xml b/account_banking_sepa_direct_debit/demo/sepa_direct_debit_demo.xml index 8c312cde5..4548d0cf4 100644 --- a/account_banking_sepa_direct_debit/demo/sepa_direct_debit_demo.xml +++ b/account_banking_sepa_direct_debit/demo/sepa_direct_debit_demo.xml @@ -15,6 +15,7 @@ FR78ZZZ424242
+ sepa @@ -24,6 +25,12 @@ valid + + + + + + sepa @@ -33,5 +40,10 @@ valid + + + + +
From cedb53305ed89e9669c49063d31b7cfeb4e11464 Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Sat, 7 May 2016 23:55:46 +0200 Subject: [PATCH 082/118] Add module account_banking_mandate_sale Add option 'mandate_required' on payment orders Autoselect first valid mandate on customer invoice that have a payment mode 'mandate_required' = True Add option on select move lines to pay wizard to allow selection of litigation moves (unchecked by default), in order to integrate the feature of the module account_payment_blocking --- account_banking_sepa_direct_debit/README.rst | 28 +++++++++++++------ .../demo/sepa_direct_debit_demo.xml | 1 + 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/account_banking_sepa_direct_debit/README.rst b/account_banking_sepa_direct_debit/README.rst index 4a2788e68..000b0263d 100644 --- a/account_banking_sepa_direct_debit/README.rst +++ b/account_banking_sepa_direct_debit/README.rst @@ -24,7 +24,6 @@ Installation This module depends on : -* account_direct_debit * account_banking_pain_base * account_banking_mandate @@ -33,14 +32,21 @@ This module is part of the OCA/bank-payment suite. Configuration ============= -To configure this module, you need to: - - * Create a payment mode and select an export type related to debit order ( eg. "SEPA direct debit ...") +Create a Payment Mode dedicated to SEPA Direct Debit and select the +Payment Method *SEPA Direct Debit for customers* (which is automatically +created upon module installation) and check that this payment method +uses the proper version of PAIN. Usage ===== -To use this module, you must select this payment mode on a direct debit order (Menu :Accounting > Payment > Debit Orders) +In the menu *Accounting > Payments > Debit Order*, create a new debit +order and select the Payment Mode dedicated to SEPA Direct Debit that +you created during the configuration step. + +.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas + :alt: Try me on Runbot + :target: https://runbot.odoo-community.org/runbot/173/9.0 Known issues / Roadmap ====================== @@ -50,10 +56,14 @@ Known issues / Roadmap Bug Tracker =========== -Bugs are tracked on `GitHub Issues `_. -In case of trouble, please check there if your issue has already been reported. -If you spotted it first, help us smashing it by providing a detailed and welcomed feedback -`here `_. +Bugs are tracked on `GitHub Issues +`_. In case of trouble, please +check there if your issue has already been reported. If you spotted it first, +help us smashing it by providing a detailed and welcomed `feedback +`_. Credits ======= diff --git a/account_banking_sepa_direct_debit/demo/sepa_direct_debit_demo.xml b/account_banking_sepa_direct_debit/demo/sepa_direct_debit_demo.xml index 4548d0cf4..fb72bb89f 100644 --- a/account_banking_sepa_direct_debit/demo/sepa_direct_debit_demo.xml +++ b/account_banking_sepa_direct_debit/demo/sepa_direct_debit_demo.xml @@ -9,6 +9,7 @@ variable + From b87ffb8c0b8139b7b1f5afd820da387f4e0c82fc Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Sun, 8 May 2016 00:11:26 +0200 Subject: [PATCH 083/118] Add _id suffix on M2O fields customer_payment_mode and supplier_payment_mode (Odoo did the same on all the M2O property fields of res.partner) --- .../demo/sepa_direct_debit_demo.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/account_banking_sepa_direct_debit/demo/sepa_direct_debit_demo.xml b/account_banking_sepa_direct_debit/demo/sepa_direct_debit_demo.xml index fb72bb89f..2eeca210b 100644 --- a/account_banking_sepa_direct_debit/demo/sepa_direct_debit_demo.xml +++ b/account_banking_sepa_direct_debit/demo/sepa_direct_debit_demo.xml @@ -27,7 +27,7 @@ - + @@ -42,7 +42,7 @@ - + From 218c2d2be6684d8df407208550745d9e314130e2 Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Mon, 9 May 2016 23:23:43 +0200 Subject: [PATCH 084/118] Add support for non-SEPA DD and CT without without IBANs --- .../models/account_payment_order.py | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/account_banking_sepa_direct_debit/models/account_payment_order.py b/account_banking_sepa_direct_debit/models/account_payment_order.py index fdea2b052..047ab1f12 100644 --- a/account_banking_sepa_direct_debit/models/account_payment_order.py +++ b/account_banking_sepa_direct_debit/models/account_payment_order.py @@ -151,10 +151,7 @@ class AccountPaymentOrder(models.Model): self.generate_party_block( payment_info_2_0, 'Cdtr', 'B', - 'self.company_partner_bank_id.partner_id.name', - 'self.company_partner_bank_id.sanitized_acc_number', - 'self.company_partner_bank_id.bank_bic', - {'self': self}, gen_args) + self.company_partner_bank_id, gen_args) charge_bearer_2_24 = etree.SubElement(payment_info_2_0, 'ChrgBr') if self.sepa: charge_bearer = 'SLEV' @@ -250,10 +247,7 @@ class AccountPaymentOrder(models.Model): self.generate_party_block( dd_transaction_info_2_28, 'Dbtr', 'C', - 'line.partner_id.name', - 'line.partner_bank_id.sanitized_acc_number', - 'line.partner_bank_id.bank_bic', - {'line': line}, gen_args) + line.partner_bank_id, gen_args) self.generate_remittance_info_block( dd_transaction_info_2_28, line, gen_args) From 1e4588b5b1c792f0eb161a34221b8dfd4cb9fcd4 Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Tue, 10 May 2016 23:16:31 +0200 Subject: [PATCH 085/118] Move fields mandate_required and export_ascii from payment mode to payment method Display chatter on payment orders Several small usability improvements --- .../data/account_payment_method.xml | 3 ++- .../demo/sepa_direct_debit_demo.xml | 1 - .../models/account_banking_mandate.py | 14 ++++++++++++++ .../models/account_payment_order.py | 5 +++-- .../views/account_banking_mandate_view.xml | 6 +++--- 5 files changed, 22 insertions(+), 7 deletions(-) diff --git a/account_banking_sepa_direct_debit/data/account_payment_method.xml b/account_banking_sepa_direct_debit/data/account_payment_method.xml index d2ef66bfd..ff1d28d66 100644 --- a/account_banking_sepa_direct_debit/data/account_payment_method.xml +++ b/account_banking_sepa_direct_debit/data/account_payment_method.xml @@ -1,12 +1,13 @@ - + SEPA Direct Debit for customers sepa_direct_debit inbound + pain.008.001.02 diff --git a/account_banking_sepa_direct_debit/demo/sepa_direct_debit_demo.xml b/account_banking_sepa_direct_debit/demo/sepa_direct_debit_demo.xml index 2eeca210b..a93f87b3f 100644 --- a/account_banking_sepa_direct_debit/demo/sepa_direct_debit_demo.xml +++ b/account_banking_sepa_direct_debit/demo/sepa_direct_debit_demo.xml @@ -9,7 +9,6 @@ variable - diff --git a/account_banking_sepa_direct_debit/models/account_banking_mandate.py b/account_banking_sepa_direct_debit/models/account_banking_mandate.py index 2c065b4ef..744903cb6 100644 --- a/account_banking_sepa_direct_debit/models/account_banking_mandate.py +++ b/account_banking_sepa_direct_debit/models/account_banking_mandate.py @@ -16,6 +16,7 @@ logger = logging.getLogger(__name__) class AccountBankingMandate(models.Model): """SEPA Direct Debit Mandate""" _inherit = 'account.banking.mandate' + _rec_name = 'display_name' format = fields.Selection( selection_add=[('sepa', 'Sepa Mandate')], default='sepa') @@ -35,6 +36,7 @@ class AccountBankingMandate(models.Model): ('B2B', 'Enterprise (B2B)')], string='Scheme', default="CORE", track_visibility='onchange') unique_mandate_reference = fields.Char(size=35) # cf ISO 20022 + display_name = fields.Char(compute='compute_display_name', store=True) @api.multi @api.constrains('type', 'recurrent_sequence_type') @@ -46,6 +48,18 @@ class AccountBankingMandate(models.Model): _("The recurrent mandate '%s' must have a sequence type.") % mandate.unique_mandate_reference) + @api.multi + @api.depends('unique_mandate_reference', 'recurrent_sequence_type') + def compute_display_name(self): + for mandate in self: + if mandate.format == 'sepa': + name = '%s (%s)' % ( + mandate.unique_mandate_reference, + mandate.recurrent_sequence_type) + else: + name = mandate.unique_mandate_reference + mandate.display_name = name + @api.multi @api.onchange('partner_bank_id') def mandate_partner_bank_change(self): diff --git a/account_banking_sepa_direct_debit/models/account_payment_order.py b/account_banking_sepa_direct_debit/models/account_payment_order.py index 047ab1f12..58aee5bf5 100644 --- a/account_banking_sepa_direct_debit/models/account_payment_order.py +++ b/account_banking_sepa_direct_debit/models/account_payment_order.py @@ -62,11 +62,12 @@ class AccountPaymentOrder(models.Model): "Payment Type Code supported for SEPA Direct Debit are " "'pain.008.001.02', 'pain.008.001.03' and " "'pain.008.001.04'.") % pain_flavor) - xsd_file = self.payment_mode_id.payment_method_id.get_xsd_file_path() + pay_method = self.payment_mode_id.payment_method_id + xsd_file = pay_method.get_xsd_file_path() gen_args = { 'bic_xml_tag': bic_xml_tag, 'name_maxsize': name_maxsize, - 'convert_to_ascii': self.payment_mode_id.convert_to_ascii, + 'convert_to_ascii': pay_method.convert_to_ascii, 'payment_method': 'DD', 'file_prefix': 'sdd_', 'pain_flavor': pain_flavor, diff --git a/account_banking_sepa_direct_debit/views/account_banking_mandate_view.xml b/account_banking_sepa_direct_debit/views/account_banking_mandate_view.xml index 7d8d73312..c27dcb175 100644 --- a/account_banking_sepa_direct_debit/views/account_banking_mandate_view.xml +++ b/account_banking_sepa_direct_debit/views/account_banking_mandate_view.xml @@ -17,13 +17,13 @@ + - @@ -34,8 +34,8 @@ - + From 9e1de8cdda389774f2bed83476f20427ebb03ef4 Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Tue, 10 May 2016 23:28:38 +0200 Subject: [PATCH 086/118] Avoid empty group in payment mode Code cleanup in views --- .../views/account_payment_mode.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/account_banking_sepa_direct_debit/views/account_payment_mode.xml b/account_banking_sepa_direct_debit/views/account_payment_mode.xml index 5f41be2f3..23eca685f 100644 --- a/account_banking_sepa_direct_debit/views/account_payment_mode.xml +++ b/account_banking_sepa_direct_debit/views/account_payment_mode.xml @@ -10,7 +10,7 @@ account.payment.mode - + - + Set SEPA Direct Debit Mandates to Expired @@ -18,7 +17,7 @@ - + - + diff --git a/account_banking_sepa_direct_debit/data/report_paperformat.xml b/account_banking_sepa_direct_debit/data/report_paperformat.xml index 631dc93f7..f6ce4c94e 100644 --- a/account_banking_sepa_direct_debit/data/report_paperformat.xml +++ b/account_banking_sepa_direct_debit/data/report_paperformat.xml @@ -1,6 +1,5 @@ - - + European A4 low margin for SEPA @@ -18,5 +17,4 @@ 80 - - + diff --git a/account_banking_sepa_direct_debit/demo/sepa_direct_debit_demo.xml b/account_banking_sepa_direct_debit/demo/sepa_direct_debit_demo.xml index a93f87b3f..05d7fa446 100644 --- a/account_banking_sepa_direct_debit/demo/sepa_direct_debit_demo.xml +++ b/account_banking_sepa_direct_debit/demo/sepa_direct_debit_demo.xml @@ -1,6 +1,6 @@ - + @@ -46,4 +46,4 @@ - + diff --git a/account_banking_sepa_direct_debit/migrations/8.0.0.2/post-migration.py b/account_banking_sepa_direct_debit/migrations/8.0.0.2/post-migration.py deleted file mode 100644 index dd759cac6..000000000 --- a/account_banking_sepa_direct_debit/migrations/8.0.0.2/post-migration.py +++ /dev/null @@ -1,50 +0,0 @@ -# -*- coding: utf-8 -*- -############################################################################## -# -# Copyright (C) 2015 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 . -# -############################################################################## - -from openerp import pooler, SUPERUSER_ID - - -def migrate(cr, version): - if not version: - return - - pool = pooler.get_pool(cr.dbname) - cr.execute(''' - SELECT - old_sepa.file, - rel.account_order_id AS payment_order_id, - payment_order.reference - FROM migration_banking_export_sdd old_sepa - LEFT JOIN migration_account_payment_order_sdd_rel rel - ON old_sepa.id=rel.banking_export_sepa_id - LEFT JOIN payment_order ON payment_order.id=rel.account_order_id - ''') - - for sepa_file in cr.dictfetchall(): - filename = 'sdd_%s.xml' % sepa_file['reference'].replace('/', '-') - pool['ir.attachment'].create( - cr, SUPERUSER_ID, { - 'name': filename, - 'res_id': sepa_file['payment_order_id'], - 'res_model': 'payment.order', - 'datas': str(sepa_file['file']), - }) - return diff --git a/account_banking_sepa_direct_debit/migrations/8.0.0.2/pre-migration.py b/account_banking_sepa_direct_debit/migrations/8.0.0.2/pre-migration.py deleted file mode 100644 index 42fa23b0a..000000000 --- a/account_banking_sepa_direct_debit/migrations/8.0.0.2/pre-migration.py +++ /dev/null @@ -1,32 +0,0 @@ -# -*- coding: utf-8 -*- -############################################################################## -# -# Copyright (C) 2015 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( - 'ALTER TABLE banking_export_sdd ' - 'RENAME TO migration_banking_export_sdd') - cr.execute( - 'ALTER TABLE account_payment_order_sdd_rel ' - 'RENAME TO migration_account_payment_order_sdd_rel') diff --git a/account_banking_sepa_direct_debit/migrations/8.0.0.5/post-migration.py b/account_banking_sepa_direct_debit/migrations/8.0.0.5/post-migration.py deleted file mode 100644 index 958a1af7d..000000000 --- a/account_banking_sepa_direct_debit/migrations/8.0.0.5/post-migration.py +++ /dev/null @@ -1,13 +0,0 @@ -# -*- coding: utf-8 -*- -# © 2016 Sergio Teruel -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - - -def migrate(cr, version): - if not version: - return - - cr.execute(''' - UPDATE account_banking_mandate SET format='sepa' - ''') - return diff --git a/account_banking_sepa_direct_debit/models/account_banking_mandate.py b/account_banking_sepa_direct_debit/models/account_banking_mandate.py index 744903cb6..daabb2d41 100644 --- a/account_banking_sepa_direct_debit/models/account_banking_mandate.py +++ b/account_banking_sepa_direct_debit/models/account_banking_mandate.py @@ -3,7 +3,7 @@ # © 2014 Serv. Tecnol. Avanzados - Pedro M. Baeza # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from openerp import models, fields, api, exceptions, _ +from odoo import models, fields, api, exceptions, _ from datetime import datetime from dateutil.relativedelta import relativedelta import logging diff --git a/account_banking_sepa_direct_debit/models/account_payment_method.py b/account_banking_sepa_direct_debit/models/account_payment_method.py index c6781cc4f..0249bba37 100644 --- a/account_banking_sepa_direct_debit/models/account_payment_method.py +++ b/account_banking_sepa_direct_debit/models/account_payment_method.py @@ -2,7 +2,7 @@ # © 2016 Akretion (Alexis de Lattre ) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from openerp import models, fields, api +from odoo import models, fields, api class AccountPaymentMethod(models.Model): diff --git a/account_banking_sepa_direct_debit/models/account_payment_mode.py b/account_banking_sepa_direct_debit/models/account_payment_mode.py index 0650736d0..2e13b9a39 100644 --- a/account_banking_sepa_direct_debit/models/account_payment_mode.py +++ b/account_banking_sepa_direct_debit/models/account_payment_mode.py @@ -2,9 +2,9 @@ # © 2016 Antiun Ingenieria S.L. - Antonio Espinosa # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from openerp import models, fields, api, _ +from odoo import models, fields, api, _ from .common import is_sepa_creditor_identifier_valid -from openerp.exceptions import ValidationError +from odoo.exceptions import ValidationError class AccountPaymentMode(models.Model): diff --git a/account_banking_sepa_direct_debit/models/account_payment_order.py b/account_banking_sepa_direct_debit/models/account_payment_order.py index e68abe27e..09bb5f201 100644 --- a/account_banking_sepa_direct_debit/models/account_payment_order.py +++ b/account_banking_sepa_direct_debit/models/account_payment_order.py @@ -2,8 +2,8 @@ # © 2016 Akretion (Alexis de Lattre ) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from openerp import models, fields, api, _ -from openerp.exceptions import UserError +from odoo import models, fields, api, _ +from odoo.exceptions import UserError from lxml import etree @@ -210,46 +210,24 @@ class AccountPaymentOrder(models.Model): 'line.mandate_id.signature_date', {'line': line}, 10, gen_args=gen_args) if sequence_type == 'FRST' and line.mandate_id.last_debit_date: - previous_bank = self._get_previous_bank(line) - if previous_bank: - amendment_indicator = etree.SubElement( - mandate_related_info, 'AmdmntInd') - amendment_indicator.text = 'true' - amendment_info_details = etree.SubElement( - mandate_related_info, 'AmdmntInfDtls') - if ( - previous_bank.bank_bic == - line.partner_bank_id.bank_bic): - ori_debtor_account = etree.SubElement( - amendment_info_details, 'OrgnlDbtrAcct') - ori_debtor_account_id = etree.SubElement( - ori_debtor_account, 'Id') - ori_debtor_account_iban = etree.SubElement( - ori_debtor_account_id, 'IBAN') - ori_debtor_account_iban.text = self._validate_iban( - self._prepare_field( - 'Original Debtor Account', - 'previous_bank.sanitized_acc_number', - {'previous_bank': previous_bank}, - gen_args=gen_args)) - else: - ori_debtor_agent = etree.SubElement( - amendment_info_details, 'OrgnlDbtrAgt') - ori_debtor_agent_institution = etree.SubElement( - ori_debtor_agent, 'FinInstnId') - ori_debtor_agent_bic = etree.SubElement( - ori_debtor_agent_institution, bic_xml_tag) - ori_debtor_agent_bic.text = self._prepare_field( - 'Original Debtor Agent', - 'previous_bank.bank_bic', - {'previous_bank': previous_bank}, - gen_args=gen_args) - ori_debtor_agent_other = etree.SubElement( - ori_debtor_agent_institution, 'Othr') - ori_debtor_agent_other_id = etree.SubElement( - ori_debtor_agent_other, 'Id') - ori_debtor_agent_other_id.text = 'SMNDA' - # SMNDA = Same Mandate New Debtor Agent + amendment_indicator = etree.SubElement( + mandate_related_info, 'AmdmntInd') + amendment_indicator.text = 'true' + amendment_info_details = etree.SubElement( + mandate_related_info, 'AmdmntInfDtls') + ori_debtor_account = etree.SubElement( + amendment_info_details, 'OrgnlDbtrAcct') + ori_debtor_account_id = etree.SubElement( + ori_debtor_account, 'Id') + ori_debtor_agent_other = etree.SubElement( + ori_debtor_account_id, 'Othr') + ori_debtor_agent_other_id = etree.SubElement( + ori_debtor_agent_other, 'Id') + ori_debtor_agent_other_id.text = 'SMNDA' + # Until 20/11/2016, SMNDA meant + # "Same Mandate New Debtor Agent" + # After 20/11/2016, SMNDA means + # "Same Mandate New Debtor Account" self.generate_party_block( dd_transaction_info, 'Dbtr', 'C', diff --git a/account_banking_sepa_direct_debit/models/bank_payment_line.py b/account_banking_sepa_direct_debit/models/bank_payment_line.py index 0321cf03d..b3076feb4 100644 --- a/account_banking_sepa_direct_debit/models/bank_payment_line.py +++ b/account_banking_sepa_direct_debit/models/bank_payment_line.py @@ -2,7 +2,7 @@ # © 2015-2016 Akretion - Alexis de Lattre # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from openerp import models, api +from odoo import models, api class BankPaymentLine(models.Model): diff --git a/account_banking_sepa_direct_debit/models/res_company.py b/account_banking_sepa_direct_debit/models/res_company.py index ac58eb42f..1ce9c3736 100644 --- a/account_banking_sepa_direct_debit/models/res_company.py +++ b/account_banking_sepa_direct_debit/models/res_company.py @@ -4,9 +4,9 @@ # © 2016 Antiun Ingenieria S.L. - Antonio Espinosa # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from openerp import models, fields, api, _ +from odoo import models, fields, api, _ from .common import is_sepa_creditor_identifier_valid -from openerp.exceptions import ValidationError +from odoo.exceptions import ValidationError class ResCompany(models.Model): @@ -19,8 +19,6 @@ class ResCompany(models.Model): "of :\n- your country ISO code (2 letters)\n- a 2-digits " "checkum\n- a 3-letters business code\n- a country-specific " "identifier") - original_creditor_identifier = fields.Char( - string='Original Creditor Identifier', size=70) @api.multi @api.constrains('sepa_creditor_identifier') diff --git a/account_banking_sepa_direct_debit/models/res_config.py b/account_banking_sepa_direct_debit/models/res_config.py index 229e9fae0..47c311e3b 100644 --- a/account_banking_sepa_direct_debit/models/res_config.py +++ b/account_banking_sepa_direct_debit/models/res_config.py @@ -2,7 +2,7 @@ # © 2016 Akretion (Alexis de Lattre ) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from openerp import models, fields +from odoo import models, fields class AccountConfigSettings(models.TransientModel): diff --git a/account_banking_sepa_direct_debit/post_install.py b/account_banking_sepa_direct_debit/post_install.py index 1fbd61793..1ef07020a 100644 --- a/account_banking_sepa_direct_debit/post_install.py +++ b/account_banking_sepa_direct_debit/post_install.py @@ -2,17 +2,18 @@ # © 2016 Akretion (Alexis de Lattre ) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from openerp import SUPERUSER_ID +from odoo import api, SUPERUSER_ID -def update_bank_journals(cr, pool): - ajo = pool['account.journal'] - journal_ids = ajo.search(cr, SUPERUSER_ID, [('type', '=', 'bank')]) - sdd_id = pool['ir.model.data'].xmlid_to_res_id( - cr, SUPERUSER_ID, - 'account_banking_sepa_direct_debit.sepa_direct_debit') - if sdd_id: - ajo.write(cr, SUPERUSER_ID, journal_ids, { - 'inbound_payment_method_ids': [(4, sdd_id)], - }) +def update_bank_journals(cr, registry): + with api.Environment.manage(): + env = api.Environment(cr, SUPERUSER_ID, {}) + ajo = env['account.journal'] + journals = ajo.search([('type', '=', 'bank')]) + sdd = env.ref( + 'account_banking_sepa_direct_debit.sepa_direct_debit') + if sdd: + journals.write({ + 'inbound_payment_method_ids': [(4, sdd.id)], + }) return diff --git a/account_banking_sepa_direct_debit/reports/sepa_direct_debit_mandate.xml b/account_banking_sepa_direct_debit/reports/sepa_direct_debit_mandate.xml index 1d6a9daa2..550d64227 100644 --- a/account_banking_sepa_direct_debit/reports/sepa_direct_debit_mandate.xml +++ b/account_banking_sepa_direct_debit/reports/sepa_direct_debit_mandate.xml @@ -1,21 +1,19 @@ - - + - - + - - - + + + - - + diff --git a/account_banking_sepa_direct_debit/tests/test_sdd.py b/account_banking_sepa_direct_debit/tests/test_sdd.py index c7df49b07..a61b0b27a 100644 --- a/account_banking_sepa_direct_debit/tests/test_sdd.py +++ b/account_banking_sepa_direct_debit/tests/test_sdd.py @@ -2,16 +2,17 @@ # © 2016 Akretion (Alexis de Lattre ) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from openerp.addons.account.tests.account_test_classes\ +from odoo.addons.account.tests.account_test_classes\ import AccountingTestCase -from openerp.tools import float_compare +from odoo.tools import float_compare import time from lxml import etree class TestSDD(AccountingTestCase): - def test_sdd(self): + def setUp(self): + super(TestSDD, self).setUp() self.company = self.env['res.company'] self.account_model = self.env['account.account'] self.move_model = self.env['account.move'] @@ -53,8 +54,13 @@ class TestSDD(AccountingTestCase): 'bank_account_link': 'fixed', 'fixed_journal_id': self.bank_journal.id, }) - eur_currency_id = self.env.ref('base.EUR').id - company.currency_id = eur_currency_id + self.eur_currency_id = self.env.ref('base.EUR').id + company.currency_id = self.eur_currency_id + # Trigger the recompute of account type on res.partner.bank + for bank_acc in self.partner_bank_model.search([]): + bank_acc.acc_number = bank_acc.acc_number + + def test_sdd(self): self.env.ref( 'account_banking_sepa_direct_debit.res_partner_2_mandate').\ recurrent_sequence_type = 'first' @@ -81,7 +87,8 @@ class TestSDD(AccountingTestCase): self.assertEquals(len(pay_lines), 1) agrolait_pay_line1 = pay_lines[0] accpre = self.env['decimal.precision'].precision_get('Account') - self.assertEquals(agrolait_pay_line1.currency_id.id, eur_currency_id) + self.assertEquals( + agrolait_pay_line1.currency_id.id, self.eur_currency_id) self.assertEquals( agrolait_pay_line1.mandate_id, invoice1.mandate_id) self.assertEquals( @@ -100,7 +107,8 @@ class TestSDD(AccountingTestCase): ('partner_id', '=', self.partner_agrolait.id)]) self.assertEquals(len(bank_lines), 1) agrolait_bank_line = bank_lines[0] - self.assertEquals(agrolait_bank_line.currency_id.id, eur_currency_id) + self.assertEquals( + agrolait_bank_line.currency_id.id, self.eur_currency_id) self.assertEquals(float_compare( agrolait_bank_line.amount_currency, 42.0, precision_digits=accpre), 0) @@ -163,5 +171,5 @@ class TestSDD(AccountingTestCase): 'name': 'Great service', 'account_id': self.account_revenue.id, }) - invoice.signal_workflow('invoice_open') + invoice.action_invoice_open() return invoice diff --git a/account_banking_sepa_direct_debit/views/account_banking_mandate_view.xml b/account_banking_sepa_direct_debit/views/account_banking_mandate_view.xml index c27dcb175..8bf7478e5 100644 --- a/account_banking_sepa_direct_debit/views/account_banking_mandate_view.xml +++ b/account_banking_sepa_direct_debit/views/account_banking_mandate_view.xml @@ -1,14 +1,12 @@ - - + @@ -62,5 +60,5 @@ - - + + diff --git a/account_banking_sepa_direct_debit/views/account_payment_mode.xml b/account_banking_sepa_direct_debit/views/account_payment_mode.xml index 23eca685f..b7b8faebb 100644 --- a/account_banking_sepa_direct_debit/views/account_payment_mode.xml +++ b/account_banking_sepa_direct_debit/views/account_payment_mode.xml @@ -2,8 +2,8 @@ - - + + Add SEPA identifiers on payment mode form @@ -19,5 +19,5 @@ - - + + diff --git a/account_banking_sepa_direct_debit/views/res_company_view.xml b/account_banking_sepa_direct_debit/views/res_company_view.xml deleted file mode 100644 index 6b4d544ca..000000000 --- a/account_banking_sepa_direct_debit/views/res_company_view.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - sepa_direct_debit.res.company.form - res.company - - - - - - - - - - diff --git a/account_banking_sepa_direct_debit/views/res_config.xml b/account_banking_sepa_direct_debit/views/res_config.xml index 8e37d7eab..94c8e3d77 100644 --- a/account_banking_sepa_direct_debit/views/res_config.xml +++ b/account_banking_sepa_direct_debit/views/res_config.xml @@ -1,21 +1,18 @@ - + sepa_direct_debit.account_config_settings.form account.config.settings - + -
-
-
-
+ + +
-
+
From 37f79aae8fec2802a0047325912adf5e9e60d4a4 Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Fri, 28 Oct 2016 16:21:03 +0200 Subject: [PATCH 112/118] Remove method which is not called anymore --- .../models/account_payment_order.py | 21 ------------------- 1 file changed, 21 deletions(-) diff --git a/account_banking_sepa_direct_debit/models/account_payment_order.py b/account_banking_sepa_direct_debit/models/account_payment_order.py index 09bb5f201..116c2e6db 100644 --- a/account_banking_sepa_direct_debit/models/account_payment_order.py +++ b/account_banking_sepa_direct_debit/models/account_payment_order.py @@ -10,27 +10,6 @@ from lxml import etree class AccountPaymentOrder(models.Model): _inherit = 'account.payment.order' - def _get_previous_bank(self, payline): - previous_bank = False - older_lines = self.env['account.payment.line'].search([ - ('mandate_id', '=', payline.mandate_id.id), - ('partner_bank_id', '!=', payline.partner_bank_id.id)]) - if older_lines: - previous_date = False - previous_payline = False - for older_line in older_lines: - if hasattr(older_line.order_id, 'date_sent'): - older_line_date = older_line.order_id.date_sent - else: - older_line_date = older_line.order_id.date_done - if (older_line_date and - older_line_date > previous_date): - previous_date = older_line_date - previous_payline = older_line - if previous_payline: - previous_bank = previous_payline.partner_bank_id - return previous_bank - @api.multi def generate_payment_file(self): """Creates the SEPA Direct Debit file. That's the important code !""" From d175f8f44411356c18f876c71e0bfa8ee90a6490 Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Sun, 2 Apr 2017 04:04:55 +0200 Subject: [PATCH 113/118] *: Change copyright and author after company merging --- account_banking_sepa_direct_debit/__manifest__.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/account_banking_sepa_direct_debit/__manifest__.py b/account_banking_sepa_direct_debit/__manifest__.py index 4b8611b5e..53191e3db 100644 --- a/account_banking_sepa_direct_debit/__manifest__.py +++ b/account_banking_sepa_direct_debit/__manifest__.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # © 2013-2016 Akretion (www.akretion.com) -# © 2014 Serv. Tecnol. Avanzados - Pedro M. Baeza -# © 2016 Antiun Ingenieria S.L. - Antonio Espinosa +# © 2014 Tecnativa - Pedro M. Baeza +# © 2016 Tecnativa - Antonio Espinosa # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). { @@ -11,7 +11,6 @@ 'license': 'AGPL-3', 'author': "Akretion, " "Tecnativa, " - "Antiun Ingeniería S.L., " "Odoo Community Association (OCA)", 'website': 'https://github.com/OCA/bank-payment', 'category': 'Banking addons', From f8b219c992d1cc5adfe1763601d548171a85f2bd Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Mon, 29 May 2017 18:07:40 +0200 Subject: [PATCH 114/118] Add support for ISO20022 "Category Purpose" Add local instrument 'INST' for SEPA Instant Credit Transfer --- .../models/account_payment_order.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/account_banking_sepa_direct_debit/models/account_payment_order.py b/account_banking_sepa_direct_debit/models/account_payment_order.py index 116c2e6db..3592437fe 100644 --- a/account_banking_sepa_direct_debit/models/account_payment_order.py +++ b/account_banking_sepa_direct_debit/models/account_payment_order.py @@ -68,6 +68,7 @@ class AccountPaymentOrder(models.Model): for line in self.bank_line_ids: transactions_count_a += 1 priority = line.priority + categ_purpose = line.category_purpose # The field line.date is the requested payment date # taking into account the 'date_prefered' setting # cf account_banking_payment_export/models/account_payment.py @@ -106,25 +107,27 @@ class AccountPaymentOrder(models.Model): line.mandate_id.recurrent_sequence_type assert seq_type_label is not False seq_type = seq_type_map[seq_type_label] - key = (line.date, priority, seq_type, scheme) + key = (line.date, priority, categ_purpose, seq_type, scheme) if key in lines_per_group: lines_per_group[key].append(line) else: lines_per_group[key] = [line] - for (requested_date, priority, sequence_type, scheme), lines in \ - lines_per_group.items(): + for (requested_date, priority, categ_purpose, sequence_type, scheme),\ + lines in lines_per_group.items(): # B. Payment info payment_info, nb_of_transactions_b, control_sum_b = \ self.generate_start_payment_info_block( pain_root, "self.name + '-' + " "sequence_type + '-' + requested_date.replace('-', '') " - "+ '-' + priority", - priority, scheme, sequence_type, requested_date, { + "+ '-' + priority + '-' + category_purpose", + priority, scheme, categ_purpose, + sequence_type, requested_date, { 'self': self, 'sequence_type': sequence_type, 'priority': priority, + 'category_purpose': categ_purpose or 'NOcateg', 'requested_date': requested_date, }, gen_args) From f3ec425a8e16cf88654ea578e4e6d332c7fbc886 Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Wed, 31 May 2017 12:31:08 +0200 Subject: [PATCH 115/118] FIX demo data: signature date of mandate was too old and was automatically expired --- .../demo/sepa_direct_debit_demo.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/account_banking_sepa_direct_debit/demo/sepa_direct_debit_demo.xml b/account_banking_sepa_direct_debit/demo/sepa_direct_debit_demo.xml index 05d7fa446..4c9f03885 100644 --- a/account_banking_sepa_direct_debit/demo/sepa_direct_debit_demo.xml +++ b/account_banking_sepa_direct_debit/demo/sepa_direct_debit_demo.xml @@ -21,7 +21,7 @@ sepa recurrent first - 2014-02-01 + valid From b90f8cc3e760d6dee8941b97180d077470730e9c Mon Sep 17 00:00:00 2001 From: OCA Transbot Date: Fri, 25 Nov 2016 20:04:32 -0500 Subject: [PATCH 116/118] OCA Transbot updated translations from Transifex --- account_banking_sepa_direct_debit/i18n/de.po | 366 +++++++++++++++++ account_banking_sepa_direct_debit/i18n/es.po | 125 +++--- account_banking_sepa_direct_debit/i18n/fr.po | 81 ++-- account_banking_sepa_direct_debit/i18n/hr.po | 370 ++++++++++++++++++ account_banking_sepa_direct_debit/i18n/nl.po | 88 ++--- .../i18n/pt_BR.po | 49 ++- account_banking_sepa_direct_debit/i18n/sl.po | 118 ++---- 7 files changed, 930 insertions(+), 267 deletions(-) create mode 100644 account_banking_sepa_direct_debit/i18n/de.po create mode 100644 account_banking_sepa_direct_debit/i18n/hr.po diff --git a/account_banking_sepa_direct_debit/i18n/de.po b/account_banking_sepa_direct_debit/i18n/de.po new file mode 100644 index 000000000..b97dbfc27 --- /dev/null +++ b/account_banking_sepa_direct_debit/i18n/de.po @@ -0,0 +1,366 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_banking_sepa_direct_debit +# +# Translators: +# Niki Waibel, 2016 +msgid "" +msgstr "" +"Project-Id-Version: bank-payment (10.0)\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-11-21 10:17+0000\n" +"PO-Revision-Date: 2016-11-01 20:31+0000\n" +"Last-Translator: Niki Waibel\n" +"Language-Team: German (http://www.transifex.com/oca/OCA-bank-payment-10-0/language/de/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: de\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Account Number - IBAN:" +msgstr "Kontonummer - IBAN:" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Address of the Debtor:" +msgstr "Adresse des Debitor:" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Address:" +msgstr "Adresse:" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Country of the debtor:" +msgstr "Land des Debitors:" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Country:" +msgstr "Land:" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Creditor's Name:" +msgstr "Name des Kreditors:" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Date - Location:" +msgstr "Datum - Ort:" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Debtor's Name:" +msgstr "Name des Debitors:" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Identifier:" +msgstr "Identifizierer:" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Mandate Reference:" +msgstr "Referenz des Mandanten:" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Postal Code - City - Town:" +msgstr "Postleitzahl - Stadt - Gemeinde:" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Signature of the debtor:" +msgstr "Unterschrift des Debitors:" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Swift BIC (up to 8 or 11 characteres):" +msgstr "Swift BIC (bis zu 8 oder 11 Stellen):" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Type of payment:" +msgstr "Art der Zahlung:" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Sepa Business-To-Business Direct debit Mandate" +msgstr "SEPA Geschäft-zu-Geschäft Lastschriftenmandat" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Sepa Direct Debit Mandate" +msgstr "SEPA Lastschrift Mandat" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_account_banking_mandate +msgid "A generic banking mandate" +msgstr "Ein generisches Bankmandat" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "" +"ALL GAPS ARE MANDATORY. ONCE THIS MANDATE HAS BEEN SIGNED MUST BE SENT TO " +"CREDITOR FOR STORAGE." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "" +"ALL GAPS ARE MANDATORY. ONCE THIS MANDATE HAS BEEN SIGNED MUST BE SENT TO CREDITOR FOR STORAGE.\n" +" NEVERTHELESS, THE BANK OF DEBTOR REQUIRES DEBTOR’S AUTHORIZATION BEFORE DEBITING B2B DIRECT DEBITS IN THE ACCOUNT.\n" +" THE DEBTOR WILL BE ABLE TO MANAGE THE MENTIONED AUTHORIZATION THROUGH THE MEANS PROVIDED BY HIS BANK." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "" +"As part of your rights, you are entitled to a refund from\n" +" your bank under the terms and conditions of your agreement\n" +" with your bank.\n" +" A refund must be claimed within 8 weeks starting from the date on which your account was debited." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:76 +#, python-format +msgid "" +"As you changed the bank account attached to this mandate, the 'Sequence " +"Type' has been set back to 'First'." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_bank_payment_line +msgid "Bank Payment Lines" +msgstr "Bankzahlungszeilen" + +#. module: account_banking_sepa_direct_debit +#: selection:account.banking.mandate,scheme:0 +msgid "Basic (CORE)" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "By signing this mandate form, you authorise (A)" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_res_company +msgid "Companies" +msgstr "Unternehmen" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model.fields,help:account_banking_sepa_direct_debit.field_account_payment_mode_sepa_creditor_identifier +msgid "" +"Enter the Creditor Identifier that has been attributed to your company to make SEPA Direct Debits. If not defined, SEPA Creditor Identifier from company will be used.\n" +"This identifier is composed of :\n" +"- your country ISO code (2 letters)\n" +"- a 2-digits checkum\n" +"- a 3-letters business code\n" +"- a country-specific identifier" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model.fields,help:account_banking_sepa_direct_debit.field_account_config_settings_sepa_creditor_identifier +#: model:ir.model.fields,help:account_banking_sepa_direct_debit.field_res_company_sepa_creditor_identifier +msgid "" +"Enter the Creditor Identifier that has been attributed to your company to make SEPA Direct Debits. This identifier is composed of :\n" +"- your country ISO code (2 letters)\n" +"- a 2-digits checkum\n" +"- a 3-letters business code\n" +"- a country-specific identifier" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:account.banking.mandate,scheme:0 +msgid "Enterprise (B2B)" +msgstr "Geschäftlich (B2B)" + +#. module: account_banking_sepa_direct_debit +#: selection:account.banking.mandate,recurrent_sequence_type:0 +msgid "Final" +msgstr "Endgültig" + +#. module: account_banking_sepa_direct_debit +#: selection:account.banking.mandate,recurrent_sequence_type:0 +msgid "First" +msgstr "Erstes" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:75 +#, python-format +msgid "Mandate update" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_payment_order.py:77 +#, python-format +msgid "" +"Missing SEPA Direct Debit mandate on the bank payment line with partner '%s'" +" (reference '%s')." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:account.banking.mandate,type:0 +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.view_mandate_search +msgid "One-Off" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_account_payment_method +msgid "Payment Methods" +msgstr "Zahlungsmethoden" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_account_payment_mode +msgid "Payment Modes" +msgstr "Zahlungsmodi" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_account_payment_order +msgid "Payment Order" +msgstr "Zahlungsauftrag" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_payment_order.py:41 +#, python-format +msgid "" +"Payment Type Code '%s' is not supported. The only Payment Type Code " +"supported for SEPA Direct Debit are 'pain.008.001.02', 'pain.008.001.03' and" +" 'pain.008.001.04'." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:account.banking.mandate,type:0 +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.view_mandate_search +msgid "Recurrent" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:account.banking.mandate,recurrent_sequence_type:0 +msgid "Recurring" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model.fields,field_description:account_banking_sepa_direct_debit.field_account_config_settings_sepa_creditor_identifier +#: model:ir.model.fields,field_description:account_banking_sepa_direct_debit.field_account_payment_mode_sepa_creditor_identifier +#: model:ir.model.fields,field_description:account_banking_sepa_direct_debit.field_res_company_sepa_creditor_identifier +msgid "SEPA Creditor Identifier" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:account.payment.mode,name:account_banking_sepa_direct_debit.payment_mode_inbound_sepa_dd1 +msgid "SEPA Direct Debit of customers" +msgstr "SEPA Lastschriften der Kunden" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model.fields,field_description:account_banking_sepa_direct_debit.field_account_banking_mandate_scheme +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.view_mandate_search +msgid "Scheme" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.actions.report.xml,name:account_banking_sepa_direct_debit.report_sepa_direct_debit_mandate +msgid "Sepa Mandate" +msgstr "Sepa Mandat" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.view_mandate_search +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.view_mandate_tree +msgid "Sequence Type" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model.fields,field_description:account_banking_sepa_direct_debit.field_account_banking_mandate_recurrent_sequence_type +msgid "Sequence Type for Next Debit" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_payment_mode.py:39 +#: code:addons/account_banking_sepa_direct_debit/models/res_company.py:31 +#, python-format +msgid "The SEPA Creditor Identifier '%s' is invalid." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_payment_order.py:84 +#, python-format +msgid "" +"The SEPA Direct Debit mandate with reference '%s' for partner '%s' has " +"expired." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_payment_order.py:92 +#, python-format +msgid "" +"The mandate with reference '%s' for partner '%s' has type set to 'One-Off' " +"and it has a last debit date set to '%s', so we can't use it." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:48 +#, python-format +msgid "The recurrent mandate '%s' must have a sequence type." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model.fields,help:account_banking_sepa_direct_debit.field_account_banking_mandate_recurrent_sequence_type +msgid "" +"This field is only used for Recurrent mandates, not for One-Off mandates." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "" +"This mandate is only intended for business-to-business transactions.\n" +" You are not entitled to a refund from your bank after your account has\n" +" been debited, but you are entitled to request your bank\n" +" not to debit your account up until the day on which the payment is due." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "To be completed by the creditor" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "To be completed by the debtor" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.view_mandate_search +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.view_mandate_tree +msgid "Type" +msgstr "Art" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model.fields,field_description:account_banking_sepa_direct_debit.field_account_banking_mandate_type +msgid "Type of Mandate" +msgstr "Art des Mandats" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.view_account_config_settings +msgid "Write the ICS of your company" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_account_config_settings +msgid "account.config.settings" +msgstr "account.config.settings" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "" +"to send instructions to your bank to debit your account and (B) your bank to\n" +" debit your account in accordance with the instructions from" +msgstr "" diff --git a/account_banking_sepa_direct_debit/i18n/es.po b/account_banking_sepa_direct_debit/i18n/es.po index ea0cf5aca..9cc0623fe 100644 --- a/account_banking_sepa_direct_debit/i18n/es.po +++ b/account_banking_sepa_direct_debit/i18n/es.po @@ -1,19 +1,23 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: -# * account_banking_sepa_direct_debit -# +# * account_banking_sepa_direct_debit +# +# Translators: +# OCA Transbot , 2016 +# Pedro M. Baeza , 2016 msgid "" msgstr "" -"Project-Id-Version: Odoo Server 9.0c\n" +"Project-Id-Version: bank-payment (10.0)\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-07-01 19:00+0000\n" -"PO-Revision-Date: 2016-07-01 19:00+0000\n" -"Last-Translator: <>\n" -"Language-Team: \n" +"POT-Creation-Date: 2017-06-01 01:24+0000\n" +"PO-Revision-Date: 2017-02-23 12:57+0000\n" +"Last-Translator: OCA Transbot \n" +"Language-Team: Spanish (http://www.transifex.com/oca/OCA-bank-payment-10-0/language/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" -"Plural-Forms: \n" +"Language: es\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" #. module: account_banking_sepa_direct_debit #: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document @@ -85,16 +89,6 @@ msgstr "Swift BIC (puede contener 8 u 11 posiciones):" msgid "Type of payment:" msgstr "Tipo de pago:" -#. module: account_banking_sepa_direct_debit -#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document -msgid "To be completed by the creditor" -msgstr "A cumplimentar por el acreedor" - -#. module: account_banking_sepa_direct_debit -#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document -msgid "To be completed by the debtor" -msgstr "A cumplimentar por el deudor" - #. module: account_banking_sepa_direct_debit #: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document msgid "Sepa Business-To-Business Direct debit Mandate" @@ -112,19 +106,23 @@ msgstr "Un mandato bancario genérico" #. module: account_banking_sepa_direct_debit #: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document -msgid "ALL GAPS ARE MANDATORY. ONCE THIS MANDATE HAS BEEN SIGNED MUST BE SENT TO CREDITOR FOR STORAGE." +msgid "" +"ALL GAPS ARE MANDATORY. ONCE THIS MANDATE HAS BEEN SIGNED MUST BE SENT TO " +"CREDITOR FOR STORAGE." msgstr "TODOS LOS CAMPOS HAN DE SER CUMPLIMENTADOS OBLIGATORIAMENTE. UNA VEZ FIRMADA ESTA ORDEN DE DOMICILIACIÓN DEBE SER ENVIADA AL ACREEDOR PARA SU CUSTODIA." #. module: account_banking_sepa_direct_debit #: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document -msgid "ALL GAPS ARE MANDATORY. ONCE THIS MANDATE HAS BEEN SIGNED MUST BE SENT TO CREDITOR FOR STORAGE.\n" +msgid "" +"ALL GAPS ARE MANDATORY. ONCE THIS MANDATE HAS BEEN SIGNED MUST BE SENT TO CREDITOR FOR STORAGE.\n" " NEVERTHELESS, THE BANK OF DEBTOR REQUIRES DEBTOR’S AUTHORIZATION BEFORE DEBITING B2B DIRECT DEBITS IN THE ACCOUNT.\n" " THE DEBTOR WILL BE ABLE TO MANAGE THE MENTIONED AUTHORIZATION THROUGH THE MEANS PROVIDED BY HIS BANK." msgstr "TODOS LOS CAMPOS HAN DE SER CUMPLIMENTADOS OBLIGATORIAMENTE. UNA VEZ FIRMADA ESTA ORDEN DE DOMICILIACIÓN DEBE SER ENVIADA AL ACREEDOR PARA SU CUSTODIA.LA ENTIDAD DE DEUDOR REQUIERE AUTORIZACIÓN DE ÉSTE PREVIA AL CARGO EN CUENTA DE LOS ADEUDOS DIRECTOS B2B.EL DEUDOR PODRÁ GESTIONAR DICHA AUTORIZACIÓN CON LOS MEDIOS QUE SU ENTIDAD PONGA A SU DISPOSICIÓN." #. module: account_banking_sepa_direct_debit #: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document -msgid "As part of your rights, you are entitled to a refund from\n" +msgid "" +"As part of your rights, you are entitled to a refund from\n" " your bank under the terms and conditions of your agreement\n" " with your bank.\n" " A refund must be claimed within 8 weeks starting from the date on which your account was debited." @@ -133,7 +131,9 @@ msgstr "Como parte de sus derechos, el deudor está legitimado al reembolso por #. module: account_banking_sepa_direct_debit #: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:76 #, python-format -msgid "As you changed the bank account attached to this mandate, the 'Sequence Type' has been set back to 'First'." +msgid "" +"As you changed the bank account attached to this mandate, the 'Sequence " +"Type' has been set back to 'First'." msgstr "Puesto que ha cambiado la cuenta bancaria relacionada con este mandato, el 'Tipo de secuencia' se ha vuelto a 'Inicial'." #. module: account_banking_sepa_direct_debit @@ -158,31 +158,25 @@ msgstr "Compañías" #. module: account_banking_sepa_direct_debit #: model:ir.model.fields,help:account_banking_sepa_direct_debit.field_account_payment_mode_sepa_creditor_identifier -msgid "Enter the Creditor Identifier that has been attributed to your company to make SEPA Direct Debits. If not defined, SEPA Creditor Identifier from company will be used.\n" +msgid "" +"Enter the Creditor Identifier that has been attributed to your company to make SEPA Direct Debits. If not defined, SEPA Creditor Identifier from company will be used.\n" "This identifier is composed of :\n" "- your country ISO code (2 letters)\n" "- a 2-digits checkum\n" "- a 3-letters business code\n" "- a country-specific identifier" -msgstr "Introduzca el identificador de acreedor que se le ha atribuido a su compañía para realizar adeudos directos SEPA. Su banco suele poseer esta información. Este identificador se compone de:\n" -"- el código ISO de 2 letras de su país\n" -"- dos dígitos de comprobación\n" -"- tres letras de código de negocio\n" -"- un identificador específico de país (en España, el NIF)" +msgstr "Introduzca el identificador de acreedor que se le ha atribuido a su compañía para realizar adeudos directos SEPA. Su banco suele poseer esta información. Este identificador se compone de:\n- el código ISO de 2 letras de su país\n- dos dígitos de comprobación\n- tres letras de código de negocio\n- un identificador específico de país (en España, el NIF)" #. module: account_banking_sepa_direct_debit #: model:ir.model.fields,help:account_banking_sepa_direct_debit.field_account_config_settings_sepa_creditor_identifier #: model:ir.model.fields,help:account_banking_sepa_direct_debit.field_res_company_sepa_creditor_identifier -msgid "Enter the Creditor Identifier that has been attributed to your company to make SEPA Direct Debits. This identifier is composed of :\n" +msgid "" +"Enter the Creditor Identifier that has been attributed to your company to make SEPA Direct Debits. This identifier is composed of :\n" "- your country ISO code (2 letters)\n" "- a 2-digits checkum\n" "- a 3-letters business code\n" "- a country-specific identifier" -msgstr "Introduzca el identificador de acreedor que se le ha atribuido a su compañía para realizar adeudos directos SEPA. Su banco suele poseer esta información. Este identificador se compone de:\n" -"- el código ISO de 2 letras de su país\n" -"- dos dígitos de comprobación\n" -"- tres letras de código de negocio\n" -"- un identificador específico de país (en España, el NIF)" +msgstr "Introduzca el identificador de acreedor que se le ha atribuido a su compañía para realizar adeudos directos SEPA. Su banco suele poseer esta información. Este identificador se compone de:\n- el código ISO de 2 letras de su país\n- dos dígitos de comprobación\n- tres letras de código de negocio\n- un identificador específico de país (en España, el NIF)" #. module: account_banking_sepa_direct_debit #: selection:account.banking.mandate,scheme:0 @@ -206,9 +200,11 @@ msgid "Mandate update" msgstr "Actualizacion de mandato" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/models/account_payment_order.py:98 +#: code:addons/account_banking_sepa_direct_debit/models/account_payment_order.py:78 #, python-format -msgid "Missing SEPA Direct Debit mandate on the bank payment line with partner '%s' (reference '%s')." +msgid "" +"Missing SEPA Direct Debit mandate on the bank payment line with partner '%s'" +" (reference '%s')." msgstr "Falta el mandato de adeudo directo SEPA en la linea de pago bancario de la empresa '%s' (referencia '%s')." #. module: account_banking_sepa_direct_debit @@ -218,11 +214,6 @@ msgstr "Falta el mandato de adeudo directo SEPA en la linea de pago bancario de msgid "One-Off" msgstr "Único" -#. module: account_banking_sepa_direct_debit -#: model:ir.model.fields,field_description:account_banking_sepa_direct_debit.field_res_company_original_creditor_identifier -msgid "Original Creditor Identifier" -msgstr "Identificador del acreedor original" - #. module: account_banking_sepa_direct_debit #: model:ir.model,name:account_banking_sepa_direct_debit.model_account_payment_method msgid "Payment Methods" @@ -239,9 +230,12 @@ msgid "Payment Order" msgstr "Orden de pago" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/models/account_payment_order.py:62 +#: code:addons/account_banking_sepa_direct_debit/models/account_payment_order.py:41 #, python-format -msgid "Payment Type Code '%s' is not supported. The only Payment Type Code supported for SEPA Direct Debit are 'pain.008.001.02', 'pain.008.001.03' and 'pain.008.001.04'." +msgid "" +"Payment Type Code '%s' is not supported. The only Payment Type Code " +"supported for SEPA Direct Debit are 'pain.008.001.02', 'pain.008.001.03' and" +" 'pain.008.001.04'." msgstr "El código de tipo de pago '%s' no está soportado. Los únicos códigos de tipo de pago soportados para los adedudos directos SEPA son 'pain.008.001.02', 'pain.008.001.03' y 'pain.008.001.04'." #. module: account_banking_sepa_direct_debit @@ -263,6 +257,16 @@ msgstr "Periódico" msgid "SEPA Creditor Identifier" msgstr "Identificador de acreedor SEPA" +#. module: account_banking_sepa_direct_debit +#: model:account.payment.method,name:account_banking_sepa_direct_debit.sepa_direct_debit +msgid "SEPA Direct Debit for customers" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:account.payment.mode,name:account_banking_sepa_direct_debit.payment_mode_inbound_sepa_dd1 +msgid "SEPA Direct Debit of customers" +msgstr "Adeudo directo SEPA de clientes" + #. module: account_banking_sepa_direct_debit #: model:ir.model.fields,field_description:account_banking_sepa_direct_debit.field_account_banking_mandate_scheme #: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.view_mandate_search @@ -287,21 +291,25 @@ msgstr "Tipo de secuencia para el próximo cobro" #. module: account_banking_sepa_direct_debit #: code:addons/account_banking_sepa_direct_debit/models/account_payment_mode.py:39 -#: code:addons/account_banking_sepa_direct_debit/models/res_company.py:33 +#: code:addons/account_banking_sepa_direct_debit/models/res_company.py:31 #, python-format msgid "The SEPA Creditor Identifier '%s' is invalid." -msgstr "Identificador de acreedor SEPA no válido." +msgstr "Identificador de acreedor SEPA '%s' no válido." #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/models/account_payment_order.py:105 +#: code:addons/account_banking_sepa_direct_debit/models/account_payment_order.py:85 #, python-format -msgid "The SEPA Direct Debit mandate with reference '%s' for partner '%s' has expired." +msgid "" +"The SEPA Direct Debit mandate with reference '%s' for partner '%s' has " +"expired." msgstr "El mandato de adeudo directo SEPA con referencia '%s' para la empresa '%s' ha expirado." #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/models/account_payment_order.py:113 +#: code:addons/account_banking_sepa_direct_debit/models/account_payment_order.py:93 #, python-format -msgid "The mandate with reference '%s' for partner '%s' has type set to 'One-Off' and it has a last debit date set to '%s', so we can't use it." +msgid "" +"The mandate with reference '%s' for partner '%s' has type set to 'One-Off' " +"and it has a last debit date set to '%s', so we can't use it." msgstr "El mandato con referencia '%s' para la empresa '%s' tipo como 'Único', ya tiene como fecha de último cobro '%s', por lo que no se puede usar." #. module: account_banking_sepa_direct_debit @@ -312,17 +320,29 @@ msgstr "El mandato periódico '%s' debe tener un tipo de secuencia." #. module: account_banking_sepa_direct_debit #: model:ir.model.fields,help:account_banking_sepa_direct_debit.field_account_banking_mandate_recurrent_sequence_type -msgid "This field is only used for Recurrent mandates, not for One-Off mandates." +msgid "" +"This field is only used for Recurrent mandates, not for One-Off mandates." msgstr "Este campo se utiliza sólo para mandatos periódicos, no para únicos." #. module: account_banking_sepa_direct_debit #: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document -msgid "This mandate is only intended for business-to-business transactions.\n" +msgid "" +"This mandate is only intended for business-to-business transactions.\n" " You are not entitled to a refund from your bank after your account has\n" " been debited, but you are entitled to request your bank\n" " not to debit your account up until the day on which the payment is due." msgstr "Esta orden de domiciliación está prevista para operaciones exclusivamente entre empresas y/o autónomos. El deudor no tiene derecho a que su entidad le reembolse una vez que se haya realizado el cargo en cuenta, pero puede solicitar a su entidad que no efectúe el adeudo en la cuenta hasta la fecha debida. Podrá obtener información detallada del procedimiento en su entidad financiera." +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "To be completed by the creditor" +msgstr "A cumplimentar por el acreedor" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "To be completed by the debtor" +msgstr "A cumplimentar por el deudor" + #. module: account_banking_sepa_direct_debit #: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.view_mandate_search #: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.view_mandate_tree @@ -346,6 +366,7 @@ msgstr "account.config.settings" #. module: account_banking_sepa_direct_debit #: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document -msgid "to send instructions to your bank to debit your account and (B) your bank to\n" +msgid "" +"to send instructions to your bank to debit your account and (B) your bank to\n" " debit your account in accordance with the instructions from" msgstr "a enviar instrucciones a la entidad del deudor para adeudar su cuenta y (B) a la entidad para efectuar los adeudos en su cuenta siguiendo las instrucciones del acreedor " diff --git a/account_banking_sepa_direct_debit/i18n/fr.po b/account_banking_sepa_direct_debit/i18n/fr.po index 5a1a73fa4..0563eb696 100644 --- a/account_banking_sepa_direct_debit/i18n/fr.po +++ b/account_banking_sepa_direct_debit/i18n/fr.po @@ -1,17 +1,17 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: # * account_banking_sepa_direct_debit -# +# # Translators: # OCA Transbot , 2016 msgid "" msgstr "" -"Project-Id-Version: Odoo Server 9.0c\n" +"Project-Id-Version: bank-payment (10.0)\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-07-01 19:28+0000\n" -"PO-Revision-Date: 2016-07-01 19:28+0000\n" -"Last-Translator: OCA Transbot , 2016\n" -"Language-Team: French (https://www.transifex.com/oca/teams/23907/fr/)\n" +"POT-Creation-Date: 2017-06-01 01:24+0000\n" +"PO-Revision-Date: 2017-02-23 12:57+0000\n" +"Last-Translator: OCA Transbot \n" +"Language-Team: French (http://www.transifex.com/oca/OCA-bank-payment-10-0/language/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" @@ -88,16 +88,6 @@ msgstr "" msgid "Type of payment:" msgstr "" -#. module: account_banking_sepa_direct_debit -#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document -msgid "To be completed by the creditor" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document -msgid "To be completed by the debtor" -msgstr "" - #. module: account_banking_sepa_direct_debit #: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document msgid "Sepa Business-To-Business Direct debit Mandate" @@ -143,9 +133,7 @@ msgstr "" msgid "" "As you changed the bank account attached to this mandate, the 'Sequence " "Type' has been set back to 'First'." -msgstr "" -"Etant donné que vous avez changé le compte bancaire associé à ce mandat, le " -"'Type de séquence' a été remis à 'First'." +msgstr "Etant donné que vous avez changé le compte bancaire associé à ce mandat, le 'Type de séquence' a été remis à 'First'." #. module: account_banking_sepa_direct_debit #: model:ir.model,name:account_banking_sepa_direct_debit.model_bank_payment_line @@ -187,12 +175,7 @@ msgid "" "- a 2-digits checkum\n" "- a 3-letters business code\n" "- a country-specific identifier" -msgstr "" -"Entrez l'Identifiant créancier qui a été attribué à votre société pour réaliser des prélèvements SEPA. Cet identifiant est composé de :\n" -"- du code ISO de votre pays (2 lettres)\n" -"- un code de contrôle à 2 chiffres\n" -"- un code d'activité à 3 lettres\n" -"- un identifiant national" +msgstr "Entrez l'Identifiant créancier qui a été attribué à votre société pour réaliser des prélèvements SEPA. Cet identifiant est composé de :\n- du code ISO de votre pays (2 lettres)\n- un code de contrôle à 2 chiffres\n- un code d'activité à 3 lettres\n- un identifiant national" #. module: account_banking_sepa_direct_debit #: selection:account.banking.mandate,scheme:0 @@ -216,7 +199,7 @@ msgid "Mandate update" msgstr "Mise-à-jour du mandat" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/models/account_payment_order.py:98 +#: code:addons/account_banking_sepa_direct_debit/models/account_payment_order.py:78 #, python-format msgid "" "Missing SEPA Direct Debit mandate on the bank payment line with partner '%s'" @@ -230,11 +213,6 @@ msgstr "" msgid "One-Off" msgstr "One-Off" -#. module: account_banking_sepa_direct_debit -#: model:ir.model.fields,field_description:account_banking_sepa_direct_debit.field_res_company_original_creditor_identifier -msgid "Original Creditor Identifier" -msgstr "Ancien Identifiant Créancier" - #. module: account_banking_sepa_direct_debit #: model:ir.model,name:account_banking_sepa_direct_debit.model_account_payment_method msgid "Payment Methods" @@ -251,16 +229,13 @@ msgid "Payment Order" msgstr "" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/models/account_payment_order.py:62 +#: code:addons/account_banking_sepa_direct_debit/models/account_payment_order.py:41 #, python-format msgid "" "Payment Type Code '%s' is not supported. The only Payment Type Code " "supported for SEPA Direct Debit are 'pain.008.001.02', 'pain.008.001.03' and" " 'pain.008.001.04'." -msgstr "" -"Le code du Type de paiement '%s' n'est pas supporté. Les seuls codes de Type" -" de paiement supportés pour les prélèvements SEPA sont 'pain.008.001.02', " -"'pain.008.001.03' et 'pain.008.001.04'." +msgstr "Le code du Type de paiement '%s' n'est pas supporté. Les seuls codes de Type de paiement supportés pour les prélèvements SEPA sont 'pain.008.001.02', 'pain.008.001.03' et 'pain.008.001.04'." #. module: account_banking_sepa_direct_debit #: selection:account.banking.mandate,type:0 @@ -281,6 +256,11 @@ msgstr "Recurring" msgid "SEPA Creditor Identifier" msgstr "Identifiant créancier SEPA" +#. module: account_banking_sepa_direct_debit +#: model:account.payment.method,name:account_banking_sepa_direct_debit.sepa_direct_debit +msgid "SEPA Direct Debit for customers" +msgstr "" + #. module: account_banking_sepa_direct_debit #: model:account.payment.mode,name:account_banking_sepa_direct_debit.payment_mode_inbound_sepa_dd1 msgid "SEPA Direct Debit of customers" @@ -310,31 +290,26 @@ msgstr "Type de séquence pour le prochain prélèvement" #. module: account_banking_sepa_direct_debit #: code:addons/account_banking_sepa_direct_debit/models/account_payment_mode.py:39 -#: code:addons/account_banking_sepa_direct_debit/models/res_company.py:33 +#: code:addons/account_banking_sepa_direct_debit/models/res_company.py:31 #, python-format msgid "The SEPA Creditor Identifier '%s' is invalid." msgstr "" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/models/account_payment_order.py:105 +#: code:addons/account_banking_sepa_direct_debit/models/account_payment_order.py:85 #, python-format msgid "" "The SEPA Direct Debit mandate with reference '%s' for partner '%s' has " "expired." -msgstr "" -"Le mandat de prélèvement SEPA portant la référence '%s' pour le partenaire " -"'%s' a expiré." +msgstr "Le mandat de prélèvement SEPA portant la référence '%s' pour le partenaire '%s' a expiré." #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/models/account_payment_order.py:113 +#: code:addons/account_banking_sepa_direct_debit/models/account_payment_order.py:93 #, python-format msgid "" "The mandate with reference '%s' for partner '%s' has type set to 'One-Off' " "and it has a last debit date set to '%s', so we can't use it." -msgstr "" -"Le mandat portant la référence '%s' pour le partenaire '%s' est de type " -"'One-Off' et il a une date de dernier débit au '%s', donc il n'est pas " -"utilisable." +msgstr "Le mandat portant la référence '%s' pour le partenaire '%s' est de type 'One-Off' et il a une date de dernier débit au '%s', donc il n'est pas utilisable." #. module: account_banking_sepa_direct_debit #: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:48 @@ -346,9 +321,7 @@ msgstr "Le mandat récurrent '%s' doit avoir un type de séquence." #: model:ir.model.fields,help:account_banking_sepa_direct_debit.field_account_banking_mandate_recurrent_sequence_type msgid "" "This field is only used for Recurrent mandates, not for One-Off mandates." -msgstr "" -"Ce champ n'est utilisé que pour les mandats récurrents, pas pour les mandats" -" One-Off." +msgstr "Ce champ n'est utilisé que pour les mandats récurrents, pas pour les mandats One-Off." #. module: account_banking_sepa_direct_debit #: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document @@ -359,6 +332,16 @@ msgid "" " not to debit your account up until the day on which the payment is due." msgstr "" +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "To be completed by the creditor" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "To be completed by the debtor" +msgstr "" + #. module: account_banking_sepa_direct_debit #: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.view_mandate_search #: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.view_mandate_tree diff --git a/account_banking_sepa_direct_debit/i18n/hr.po b/account_banking_sepa_direct_debit/i18n/hr.po new file mode 100644 index 000000000..70456cb6f --- /dev/null +++ b/account_banking_sepa_direct_debit/i18n/hr.po @@ -0,0 +1,370 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_banking_sepa_direct_debit +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: bank-payment (10.0)\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-06-03 00:10+0000\n" +"PO-Revision-Date: 2016-10-19 23:46+0000\n" +"Last-Translator: <>\n" +"Language-Team: Croatian (http://www.transifex.com/oca/OCA-bank-payment-10-0/language/hr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: hr\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Account Number - IBAN:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Address of the Debtor:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Address:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Country of the debtor:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Country:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Creditor's Name:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Date - Location:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Debtor's Name:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Identifier:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Mandate Reference:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Postal Code - City - Town:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Signature of the debtor:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Swift BIC (up to 8 or 11 characteres):" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Type of payment:" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Sepa Business-To-Business Direct debit Mandate" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "Sepa Direct Debit Mandate" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_account_banking_mandate +msgid "A generic banking mandate" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "" +"ALL GAPS ARE MANDATORY. ONCE THIS MANDATE HAS BEEN SIGNED MUST BE SENT TO " +"CREDITOR FOR STORAGE." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "" +"ALL GAPS ARE MANDATORY. ONCE THIS MANDATE HAS BEEN SIGNED MUST BE SENT TO CREDITOR FOR STORAGE.\n" +" NEVERTHELESS, THE BANK OF DEBTOR REQUIRES DEBTOR’S AUTHORIZATION BEFORE DEBITING B2B DIRECT DEBITS IN THE ACCOUNT.\n" +" THE DEBTOR WILL BE ABLE TO MANAGE THE MENTIONED AUTHORIZATION THROUGH THE MEANS PROVIDED BY HIS BANK." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "" +"As part of your rights, you are entitled to a refund from\n" +" your bank under the terms and conditions of your agreement\n" +" with your bank.\n" +" A refund must be claimed within 8 weeks starting from the date on which your account was debited." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:76 +#, python-format +msgid "" +"As you changed the bank account attached to this mandate, the 'Sequence " +"Type' has been set back to 'First'." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_bank_payment_line +msgid "Bank Payment Lines" +msgstr "Stavke izvoda" + +#. module: account_banking_sepa_direct_debit +#: selection:account.banking.mandate,scheme:0 +msgid "Basic (CORE)" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "By signing this mandate form, you authorise (A)" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_res_company +msgid "Companies" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model.fields,help:account_banking_sepa_direct_debit.field_account_payment_mode_sepa_creditor_identifier +msgid "" +"Enter the Creditor Identifier that has been attributed to your company to make SEPA Direct Debits. If not defined, SEPA Creditor Identifier from company will be used.\n" +"This identifier is composed of :\n" +"- your country ISO code (2 letters)\n" +"- a 2-digits checkum\n" +"- a 3-letters business code\n" +"- a country-specific identifier" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model.fields,help:account_banking_sepa_direct_debit.field_account_config_settings_sepa_creditor_identifier +#: model:ir.model.fields,help:account_banking_sepa_direct_debit.field_res_company_sepa_creditor_identifier +msgid "" +"Enter the Creditor Identifier that has been attributed to your company to make SEPA Direct Debits. This identifier is composed of :\n" +"- your country ISO code (2 letters)\n" +"- a 2-digits checkum\n" +"- a 3-letters business code\n" +"- a country-specific identifier" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:account.banking.mandate,scheme:0 +msgid "Enterprise (B2B)" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:account.banking.mandate,recurrent_sequence_type:0 +msgid "Final" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:account.banking.mandate,recurrent_sequence_type:0 +msgid "First" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:75 +#, python-format +msgid "Mandate update" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_payment_order.py:78 +#, python-format +msgid "" +"Missing SEPA Direct Debit mandate on the bank payment line with partner '%s'" +" (reference '%s')." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:account.banking.mandate,type:0 +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.view_mandate_search +msgid "One-Off" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_account_payment_method +msgid "Payment Methods" +msgstr "Metode plaćanja" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_account_payment_mode +msgid "Payment Modes" +msgstr "Modeli plaćanja" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_account_payment_order +msgid "Payment Order" +msgstr "Nalog za plaćanje" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_payment_order.py:41 +#, python-format +msgid "" +"Payment Type Code '%s' is not supported. The only Payment Type Code " +"supported for SEPA Direct Debit are 'pain.008.001.02', 'pain.008.001.03' and" +" 'pain.008.001.04'." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:account.banking.mandate,type:0 +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.view_mandate_search +msgid "Recurrent" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: selection:account.banking.mandate,recurrent_sequence_type:0 +msgid "Recurring" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model.fields,field_description:account_banking_sepa_direct_debit.field_account_config_settings_sepa_creditor_identifier +#: model:ir.model.fields,field_description:account_banking_sepa_direct_debit.field_account_payment_mode_sepa_creditor_identifier +#: model:ir.model.fields,field_description:account_banking_sepa_direct_debit.field_res_company_sepa_creditor_identifier +msgid "SEPA Creditor Identifier" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:account.payment.method,name:account_banking_sepa_direct_debit.sepa_direct_debit +msgid "SEPA Direct Debit for customers" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:account.payment.mode,name:account_banking_sepa_direct_debit.payment_mode_inbound_sepa_dd1 +msgid "SEPA Direct Debit of customers" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model.fields,field_description:account_banking_sepa_direct_debit.field_account_banking_mandate_scheme +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.view_mandate_search +msgid "Scheme" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.actions.report.xml,name:account_banking_sepa_direct_debit.report_sepa_direct_debit_mandate +msgid "Sepa Mandate" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.view_mandate_search +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.view_mandate_tree +msgid "Sequence Type" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model.fields,field_description:account_banking_sepa_direct_debit.field_account_banking_mandate_recurrent_sequence_type +msgid "Sequence Type for Next Debit" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_payment_mode.py:39 +#: code:addons/account_banking_sepa_direct_debit/models/res_company.py:31 +#, python-format +msgid "The SEPA Creditor Identifier '%s' is invalid." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_payment_order.py:85 +#, python-format +msgid "" +"The SEPA Direct Debit mandate with reference '%s' for partner '%s' has " +"expired." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_payment_order.py:93 +#, python-format +msgid "" +"The mandate with reference '%s' for partner '%s' has type set to 'One-Off' " +"and it has a last debit date set to '%s', so we can't use it." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:48 +#, python-format +msgid "The recurrent mandate '%s' must have a sequence type." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model.fields,help:account_banking_sepa_direct_debit.field_account_banking_mandate_recurrent_sequence_type +msgid "" +"This field is only used for Recurrent mandates, not for One-Off mandates." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "" +"This mandate is only intended for business-to-business transactions.\n" +" You are not entitled to a refund from your bank after your account has\n" +" been debited, but you are entitled to request your bank\n" +" not to debit your account up until the day on which the payment is due." +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "To be completed by the creditor" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "To be completed by the debtor" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.view_mandate_search +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.view_mandate_tree +msgid "Type" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model.fields,field_description:account_banking_sepa_direct_debit.field_account_banking_mandate_type +msgid "Type of Mandate" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.view_account_config_settings +msgid "Write the ICS of your company" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.model,name:account_banking_sepa_direct_debit.model_account_config_settings +msgid "account.config.settings" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "" +"to send instructions to your bank to debit your account and (B) your bank to\n" +" debit your account in accordance with the instructions from" +msgstr "" diff --git a/account_banking_sepa_direct_debit/i18n/nl.po b/account_banking_sepa_direct_debit/i18n/nl.po index 98862004b..c6f684fc3 100644 --- a/account_banking_sepa_direct_debit/i18n/nl.po +++ b/account_banking_sepa_direct_debit/i18n/nl.po @@ -3,15 +3,16 @@ # * account_banking_sepa_direct_debit # # Translators: +# Cas Vissers , 2017 # Erwin van der Ploeg , 2016 msgid "" msgstr "" -"Project-Id-Version: Odoo Server 9.0c\n" +"Project-Id-Version: bank-payment (10.0)\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-07-22 23:52+0000\n" -"PO-Revision-Date: 2016-07-22 23:52+0000\n" -"Last-Translator: Erwin van der Ploeg , 2016\n" -"Language-Team: Dutch (https://www.transifex.com/oca/teams/23907/nl/)\n" +"POT-Creation-Date: 2017-06-01 01:24+0000\n" +"PO-Revision-Date: 2017-04-12 08:26+0000\n" +"Last-Translator: Cas Vissers \n" +"Language-Team: Dutch (http://www.transifex.com/oca/OCA-bank-payment-10-0/language/nl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" @@ -108,9 +109,7 @@ msgstr "Een generiek bank mandaat" msgid "" "ALL GAPS ARE MANDATORY. ONCE THIS MANDATE HAS BEEN SIGNED MUST BE SENT TO " "CREDITOR FOR STORAGE." -msgstr "" -"ALL LEGE VELDEN ZIJN VERPLICHT. WANNEER ONDERTEKEND MOET DIT MANDAAT NAAR DE" -" CREDITEUR GESTUURD WORDEN VOOR ADMINISTRATIE/" +msgstr "ALL LEGE VELDEN ZIJN VERPLICHT. WANNEER ONDERTEKEND MOET DIT MANDAAT NAAR DE CREDITEUR GESTUURD WORDEN VOOR ADMINISTRATIE/" #. module: account_banking_sepa_direct_debit #: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document @@ -118,10 +117,7 @@ msgid "" "ALL GAPS ARE MANDATORY. ONCE THIS MANDATE HAS BEEN SIGNED MUST BE SENT TO CREDITOR FOR STORAGE.\n" " NEVERTHELESS, THE BANK OF DEBTOR REQUIRES DEBTOR’S AUTHORIZATION BEFORE DEBITING B2B DIRECT DEBITS IN THE ACCOUNT.\n" " THE DEBTOR WILL BE ABLE TO MANAGE THE MENTIONED AUTHORIZATION THROUGH THE MEANS PROVIDED BY HIS BANK." -msgstr "" -"ALL LEGE VELDEN ZIJN VERPLICHT. WANNEER ONDERTEKEND MOET DIT MANDAAT NAAR DE CREDITEUR GESTUURD WORDEN VOOR ADMINISTRATIE.\n" -" NIETTEMIN, DE BANK VAN DE DEBITEUR VERGT AUTHORISATIE VAN DE DEBITEUR VOOR HET DEBITEREN VAN B2B INCASSO'S VAN DE REKENING\n" -" DE DEBITEUR KAN DE AUTHORISATIE BEHEREN VIA DE MIDDELEN VERSCHAFT DOOR DE BANK." +msgstr "ALL LEGE VELDEN ZIJN VERPLICHT. WANNEER ONDERTEKEND MOET DIT MANDAAT NAAR DE CREDITEUR GESTUURD WORDEN VOOR ADMINISTRATIE.\n NIETTEMIN, DE BANK VAN DE DEBITEUR VERGT AUTHORISATIE VAN DE DEBITEUR VOOR HET DEBITEREN VAN B2B INCASSO'S VAN DE REKENING\n DE DEBITEUR KAN DE AUTHORISATIE BEHEREN VIA DE MIDDELEN VERSCHAFT DOOR DE BANK." #. module: account_banking_sepa_direct_debit #: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document @@ -130,9 +126,7 @@ msgid "" " your bank under the terms and conditions of your agreement\n" " with your bank.\n" " A refund must be claimed within 8 weeks starting from the date on which your account was debited." -msgstr "" -"Als onderdeel van uw rechten heeft u recht op een credit van uw bank onder de condities en voorwaarden van uw bank.\n" -"Een credit moet worden geclaimed binnen 8 dagen vanaf de datum waarop het bedrag is afgeschreven." +msgstr "Als onderdeel van uw rechten heeft u recht op een credit van uw bank onder de condities en voorwaarden van uw bank.\nEen credit moet worden geclaimed binnen 8 dagen vanaf de datum waarop het bedrag is afgeschreven." #. module: account_banking_sepa_direct_debit #: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:76 @@ -140,9 +134,7 @@ msgstr "" msgid "" "As you changed the bank account attached to this mandate, the 'Sequence " "Type' has been set back to 'First'." -msgstr "" -"Omdat u de gekoppelde bankrekening heeft gewijzigd is de reeks terug gezet " -"naar 'Eerste'." +msgstr "Omdat u de gekoppelde bankrekening heeft gewijzigd is de reeks terug gezet naar 'Eerste'." #. module: account_banking_sepa_direct_debit #: model:ir.model,name:account_banking_sepa_direct_debit.model_bank_payment_line @@ -173,12 +165,7 @@ msgid "" "- a 2-digits checkum\n" "- a 3-letters business code\n" "- a country-specific identifier" -msgstr "" -"Geef de Incassant-ID in, welke is toegewezen aan uw bedrijf om incasso's uit te voeren. De Incassant-ID is samengesteld uit:\n" -"- uw ISO landcode (2 letters)\n" -"- een 2 cijferig controlegetal\n" -"- een 3 cijferig business code\n" -"- een landspecifieke identifier" +msgstr "Geef de Incassant-ID in, welke is toegewezen aan uw bedrijf om incasso's uit te voeren. De Incassant-ID is samengesteld uit:\n- uw ISO landcode (2 letters)\n- een 2 cijferig controlegetal\n- een 3 cijferig business code\n- een landspecifieke identifier" #. module: account_banking_sepa_direct_debit #: model:ir.model.fields,help:account_banking_sepa_direct_debit.field_account_config_settings_sepa_creditor_identifier @@ -189,12 +176,7 @@ msgid "" "- a 2-digits checkum\n" "- a 3-letters business code\n" "- a country-specific identifier" -msgstr "" -"Geef de Incassant-ID in, welke is toegewezen aan uw bedrijf om incasso's uit te voeren. De Incassant-ID is samengesteld uit:\n" -"- uw ISO landcode (2 letters)\n" -"- een 2 cijferig controlegetal\n" -"- een 3 cijferig business code\n" -"- een landspecifieke identifier" +msgstr "Geef de Incassant-ID in, welke is toegewezen aan uw bedrijf om incasso's uit te voeren. De Incassant-ID is samengesteld uit:\n- uw ISO landcode (2 letters)\n- een 2 cijferig controlegetal\n- een 3 cijferig business code\n- een landspecifieke identifier" #. module: account_banking_sepa_direct_debit #: selection:account.banking.mandate,scheme:0 @@ -218,14 +200,12 @@ msgid "Mandate update" msgstr "Machtiging bijwerken" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/models/account_payment_order.py:98 +#: code:addons/account_banking_sepa_direct_debit/models/account_payment_order.py:78 #, python-format msgid "" "Missing SEPA Direct Debit mandate on the bank payment line with partner '%s'" " (reference '%s')." -msgstr "" -"Missende SEPA Incasso mandaten op betaalregel met klant '%s' (referentie " -"'%s')." +msgstr "Missende SEPA Incasso mandaten op betaalregel met klant '%s' (referentie '%s')." #. module: account_banking_sepa_direct_debit #: selection:account.banking.mandate,type:0 @@ -234,11 +214,6 @@ msgstr "" msgid "One-Off" msgstr "Eenmalig" -#. module: account_banking_sepa_direct_debit -#: model:ir.model.fields,field_description:account_banking_sepa_direct_debit.field_res_company_original_creditor_identifier -msgid "Original Creditor Identifier" -msgstr "Originele Incassant-ID" - #. module: account_banking_sepa_direct_debit #: model:ir.model,name:account_banking_sepa_direct_debit.model_account_payment_method msgid "Payment Methods" @@ -255,16 +230,13 @@ msgid "Payment Order" msgstr "Betalingsopdracht" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/models/account_payment_order.py:62 +#: code:addons/account_banking_sepa_direct_debit/models/account_payment_order.py:41 #, python-format msgid "" "Payment Type Code '%s' is not supported. The only Payment Type Code " "supported for SEPA Direct Debit are 'pain.008.001.02', 'pain.008.001.03' and" " 'pain.008.001.04'." -msgstr "" -"Betaal soort code '%s' wordt niet ondersteund. De enige betaalsoort code " -"ondersteund voor SEPA incasso's zijn 'pain.008.001.02', 'pain.008.001.03' en" -" 'pain.008.001.04'." +msgstr "Betaal soort code '%s' wordt niet ondersteund. De enige betaalsoort code ondersteund voor SEPA incasso's zijn 'pain.008.001.02', 'pain.008.001.03' en 'pain.008.001.04'." #. module: account_banking_sepa_direct_debit #: selection:account.banking.mandate,type:0 @@ -285,6 +257,11 @@ msgstr "Terugkerend" msgid "SEPA Creditor Identifier" msgstr "SEPA Incassant-ID" +#. module: account_banking_sepa_direct_debit +#: model:account.payment.method,name:account_banking_sepa_direct_debit.sepa_direct_debit +msgid "SEPA Direct Debit for customers" +msgstr "SEPA Automatische Incasso voor klanten" + #. module: account_banking_sepa_direct_debit #: model:account.payment.mode,name:account_banking_sepa_direct_debit.payment_mode_inbound_sepa_dd1 msgid "SEPA Direct Debit of customers" @@ -314,31 +291,26 @@ msgstr "Reeks soort voor volgende incasso" #. module: account_banking_sepa_direct_debit #: code:addons/account_banking_sepa_direct_debit/models/account_payment_mode.py:39 -#: code:addons/account_banking_sepa_direct_debit/models/res_company.py:33 +#: code:addons/account_banking_sepa_direct_debit/models/res_company.py:31 #, python-format msgid "The SEPA Creditor Identifier '%s' is invalid." msgstr "De SEPA Incassant-ID '%s' is ongeldig." #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/models/account_payment_order.py:105 +#: code:addons/account_banking_sepa_direct_debit/models/account_payment_order.py:85 #, python-format msgid "" "The SEPA Direct Debit mandate with reference '%s' for partner '%s' has " "expired." -msgstr "" -"De SEPA incasso machtiging met referentie '%s' voor relatie '%s' is " -"verlopen." +msgstr "De SEPA incasso machtiging met referentie '%s' voor relatie '%s' is verlopen." #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/models/account_payment_order.py:113 +#: code:addons/account_banking_sepa_direct_debit/models/account_payment_order.py:93 #, python-format msgid "" "The mandate with reference '%s' for partner '%s' has type set to 'One-Off' " "and it has a last debit date set to '%s', so we can't use it." -msgstr "" -"De machtiging referentie '%s' voor relatie %s' is ingesteld op 'eenmalig' en" -" de laatste incasso datum is ingesteld op '%s'. Zodoende kunnen we deze niet" -" gebruiken." +msgstr "De machtiging referentie '%s' voor relatie %s' is ingesteld op 'eenmalig' en de laatste incasso datum is ingesteld op '%s'. Zodoende kunnen we deze niet gebruiken." #. module: account_banking_sepa_direct_debit #: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:48 @@ -350,9 +322,7 @@ msgstr "De herhalende machtiging '%s' dient een reeks soort te hebben." #: model:ir.model.fields,help:account_banking_sepa_direct_debit.field_account_banking_mandate_recurrent_sequence_type msgid "" "This field is only used for Recurrent mandates, not for One-Off mandates." -msgstr "" -"Dit veld wordt alleen gebruikt voor herhalende machtigingen, niet voor een " -"eenmalige machtiging." +msgstr "Dit veld wordt alleen gebruikt voor herhalende machtigingen, niet voor een eenmalige machtiging." #. module: account_banking_sepa_direct_debit #: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document @@ -361,9 +331,7 @@ msgid "" " You are not entitled to a refund from your bank after your account has\n" " been debited, but you are entitled to request your bank\n" " not to debit your account up until the day on which the payment is due." -msgstr "" -"Deze mandaat is alleen bedoelt voor B2B transacties.\n" -"Het is niet toegestaan een credit te doen nadat het bedrag is afgeschreven, maar je kan een verzoek doen aan de bank om het bedrag niet af te schrijven totaan de vervaldatum." +msgstr "Deze mandaat is alleen bedoelt voor B2B transacties.\nHet is niet toegestaan een credit te doen nadat het bedrag is afgeschreven, maar je kan een verzoek doen aan de bank om het bedrag niet af te schrijven totaan de vervaldatum." #. module: account_banking_sepa_direct_debit #: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document diff --git a/account_banking_sepa_direct_debit/i18n/pt_BR.po b/account_banking_sepa_direct_debit/i18n/pt_BR.po index cb961c298..e6e0b358c 100644 --- a/account_banking_sepa_direct_debit/i18n/pt_BR.po +++ b/account_banking_sepa_direct_debit/i18n/pt_BR.po @@ -1,17 +1,17 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: # * account_banking_sepa_direct_debit -# +# # Translators: # OCA Transbot , 2016 msgid "" msgstr "" -"Project-Id-Version: Odoo Server 9.0c\n" +"Project-Id-Version: bank-payment (10.0)\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-07-01 19:28+0000\n" -"PO-Revision-Date: 2016-07-01 19:28+0000\n" -"Last-Translator: OCA Transbot , 2016\n" -"Language-Team: Portuguese (Brazil) (https://www.transifex.com/oca/teams/23907/pt_BR/)\n" +"POT-Creation-Date: 2016-11-21 10:17+0000\n" +"PO-Revision-Date: 2016-10-19 23:47+0000\n" +"Last-Translator: OCA Transbot \n" +"Language-Team: Portuguese (Brazil) (http://www.transifex.com/oca/OCA-bank-payment-10-0/language/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" @@ -88,16 +88,6 @@ msgstr "" msgid "Type of payment:" msgstr "" -#. module: account_banking_sepa_direct_debit -#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document -msgid "To be completed by the creditor" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document -msgid "To be completed by the debtor" -msgstr "" - #. module: account_banking_sepa_direct_debit #: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document msgid "Sepa Business-To-Business Direct debit Mandate" @@ -209,7 +199,7 @@ msgid "Mandate update" msgstr "" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/models/account_payment_order.py:98 +#: code:addons/account_banking_sepa_direct_debit/models/account_payment_order.py:77 #, python-format msgid "" "Missing SEPA Direct Debit mandate on the bank payment line with partner '%s'" @@ -223,11 +213,6 @@ msgstr "" msgid "One-Off" msgstr "" -#. module: account_banking_sepa_direct_debit -#: model:ir.model.fields,field_description:account_banking_sepa_direct_debit.field_res_company_original_creditor_identifier -msgid "Original Creditor Identifier" -msgstr "" - #. module: account_banking_sepa_direct_debit #: model:ir.model,name:account_banking_sepa_direct_debit.model_account_payment_method msgid "Payment Methods" @@ -241,10 +226,10 @@ msgstr "" #. module: account_banking_sepa_direct_debit #: model:ir.model,name:account_banking_sepa_direct_debit.model_account_payment_order msgid "Payment Order" -msgstr "" +msgstr "Ordem de Pagamento" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/models/account_payment_order.py:62 +#: code:addons/account_banking_sepa_direct_debit/models/account_payment_order.py:41 #, python-format msgid "" "Payment Type Code '%s' is not supported. The only Payment Type Code " @@ -300,13 +285,13 @@ msgstr "" #. module: account_banking_sepa_direct_debit #: code:addons/account_banking_sepa_direct_debit/models/account_payment_mode.py:39 -#: code:addons/account_banking_sepa_direct_debit/models/res_company.py:33 +#: code:addons/account_banking_sepa_direct_debit/models/res_company.py:31 #, python-format msgid "The SEPA Creditor Identifier '%s' is invalid." msgstr "" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/models/account_payment_order.py:105 +#: code:addons/account_banking_sepa_direct_debit/models/account_payment_order.py:84 #, python-format msgid "" "The SEPA Direct Debit mandate with reference '%s' for partner '%s' has " @@ -314,7 +299,7 @@ msgid "" msgstr "" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/models/account_payment_order.py:113 +#: code:addons/account_banking_sepa_direct_debit/models/account_payment_order.py:92 #, python-format msgid "" "The mandate with reference '%s' for partner '%s' has type set to 'One-Off' " @@ -342,6 +327,16 @@ msgid "" " not to debit your account up until the day on which the payment is due." msgstr "" +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "To be completed by the creditor" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "To be completed by the debtor" +msgstr "" + #. module: account_banking_sepa_direct_debit #: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.view_mandate_search #: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.view_mandate_tree diff --git a/account_banking_sepa_direct_debit/i18n/sl.po b/account_banking_sepa_direct_debit/i18n/sl.po index ff07b5f93..0341be139 100644 --- a/account_banking_sepa_direct_debit/i18n/sl.po +++ b/account_banking_sepa_direct_debit/i18n/sl.po @@ -1,17 +1,17 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: # * account_banking_sepa_direct_debit -# +# # Translators: # OCA Transbot , 2016 msgid "" msgstr "" -"Project-Id-Version: Odoo Server 9.0c\n" +"Project-Id-Version: bank-payment (10.0)\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-07-01 19:28+0000\n" -"PO-Revision-Date: 2016-07-01 19:28+0000\n" -"Last-Translator: OCA Transbot , 2016\n" -"Language-Team: Slovenian (https://www.transifex.com/oca/teams/23907/sl/)\n" +"POT-Creation-Date: 2017-06-01 01:24+0000\n" +"PO-Revision-Date: 2017-02-23 12:57+0000\n" +"Last-Translator: OCA Transbot \n" +"Language-Team: Slovenian (http://www.transifex.com/oca/OCA-bank-payment-10-0/language/sl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" @@ -88,16 +88,6 @@ msgstr "" msgid "Type of payment:" msgstr "" -#. module: account_banking_sepa_direct_debit -#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document -msgid "To be completed by the creditor" -msgstr "" - -#. module: account_banking_sepa_direct_debit -#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document -msgid "To be completed by the debtor" -msgstr "" - #. module: account_banking_sepa_direct_debit #: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document msgid "Sepa Business-To-Business Direct debit Mandate" @@ -118,9 +108,7 @@ msgstr "Generični bančni mandat" msgid "" "ALL GAPS ARE MANDATORY. ONCE THIS MANDATE HAS BEEN SIGNED MUST BE SENT TO " "CREDITOR FOR STORAGE." -msgstr "" -"VSE VRZELI SO OBVEZNE. PO PODPISU MANDATA, SE GA MORA POSLATI UPNIKU V " -"HRANJENJE." +msgstr "VSE VRZELI SO OBVEZNE. PO PODPISU MANDATA, SE GA MORA POSLATI UPNIKU V HRANJENJE." #. module: account_banking_sepa_direct_debit #: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document @@ -128,10 +116,7 @@ msgid "" "ALL GAPS ARE MANDATORY. ONCE THIS MANDATE HAS BEEN SIGNED MUST BE SENT TO CREDITOR FOR STORAGE.\n" " NEVERTHELESS, THE BANK OF DEBTOR REQUIRES DEBTOR’S AUTHORIZATION BEFORE DEBITING B2B DIRECT DEBITS IN THE ACCOUNT.\n" " THE DEBTOR WILL BE ABLE TO MANAGE THE MENTIONED AUTHORIZATION THROUGH THE MEANS PROVIDED BY HIS BANK." -msgstr "" -"VSE VRZELI SO OBVEZNE. PO PODPISU MANDATA, SE GA MORA POSLATI UPNIKU V HRANJENJE.\n" -" KLJUB VSEMU, BANKA DOLŽNIKA ZAHTEVA DOLŽNIKOVO POOBLASTILO PRED NEPOSREDNO B2B OBREMENITVIJO RAČUNA.\n" -" DOLŽNIK BI LAHKO UPRAVLJAL OMENJENO POOBLASTILO NA NAČIN, KI MU GA OMOGOČA NJEGOVA BANKA." +msgstr "VSE VRZELI SO OBVEZNE. PO PODPISU MANDATA, SE GA MORA POSLATI UPNIKU V HRANJENJE.\n KLJUB VSEMU, BANKA DOLŽNIKA ZAHTEVA DOLŽNIKOVO POOBLASTILO PRED NEPOSREDNO B2B OBREMENITVIJO RAČUNA.\n DOLŽNIK BI LAHKO UPRAVLJAL OMENJENO POOBLASTILO NA NAČIN, KI MU GA OMOGOČA NJEGOVA BANKA." #. module: account_banking_sepa_direct_debit #: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document @@ -140,11 +125,7 @@ msgid "" " your bank under the terms and conditions of your agreement\n" " with your bank.\n" " A refund must be claimed within 8 weeks starting from the date on which your account was debited." -msgstr "" -"V sklopu vaših pravic je dobropis/povračilo vaše banke\n" -" v skladu s splošnimi pogoji vašega dogovora\n" -" z banko.\n" -" Povračilo je potrebno zahtevati v do 8 tednih od datuma, na katerega je bil vaš račun obremenjen." +msgstr "V sklopu vaših pravic je dobropis/povračilo vaše banke\n v skladu s splošnimi pogoji vašega dogovora\n z banko.\n Povračilo je potrebno zahtevati v do 8 tednih od datuma, na katerega je bil vaš račun obremenjen." #. module: account_banking_sepa_direct_debit #: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:76 @@ -152,9 +133,7 @@ msgstr "" msgid "" "As you changed the bank account attached to this mandate, the 'Sequence " "Type' has been set back to 'First'." -msgstr "" -"Ker ste spremenili bančni račun pripet temu mandatu, se je tip zaporedja " -"vrnil v 'Prvi'." +msgstr "Ker ste spremenili bančni račun pripet temu mandatu, se je tip zaporedja vrnil v 'Prvi'." #. module: account_banking_sepa_direct_debit #: model:ir.model,name:account_banking_sepa_direct_debit.model_bank_payment_line @@ -185,13 +164,7 @@ msgid "" "- a 2-digits checkum\n" "- a 3-letters business code\n" "- a country-specific identifier" -msgstr "" -"Vnesi identifikator upnika, ki je bil dodeljen vaši družbi za izvajanje SEPA direktnih obremenitev. Če ni določen, se uporabi SEPA identifikator upnika iz nastavitev družbe.\n" -"Identifikator sestavljajo:\n" -"- ISO koda vaše države (2 znaka)\n" -"- 2-značna checkum koda\n" -"- 3-značna poslovna koda\n" -"- specifični identifikator glede na državo" +msgstr "Vnesi identifikator upnika, ki je bil dodeljen vaši družbi za izvajanje SEPA direktnih obremenitev. Če ni določen, se uporabi SEPA identifikator upnika iz nastavitev družbe.\nIdentifikator sestavljajo:\n- ISO koda vaše države (2 znaka)\n- 2-značna checkum koda\n- 3-značna poslovna koda\n- specifični identifikator glede na državo" #. module: account_banking_sepa_direct_debit #: model:ir.model.fields,help:account_banking_sepa_direct_debit.field_account_config_settings_sepa_creditor_identifier @@ -202,12 +175,7 @@ msgid "" "- a 2-digits checkum\n" "- a 3-letters business code\n" "- a country-specific identifier" -msgstr "" -"Vnesi identifikator upnika, ki je bil dodeljen vaši družbi za izvajanje SEPA direktnih obremenitev. Identifikator sestavljajo:\n" -"- ISO koda vaše države (2 znaka)\n" -"- 2-značna checkum koda\n" -"- 3-značna poslovna koda\n" -"- specifični identifikator glede na državo" +msgstr "Vnesi identifikator upnika, ki je bil dodeljen vaši družbi za izvajanje SEPA direktnih obremenitev. Identifikator sestavljajo:\n- ISO koda vaše države (2 znaka)\n- 2-značna checkum koda\n- 3-značna poslovna koda\n- specifični identifikator glede na državo" #. module: account_banking_sepa_direct_debit #: selection:account.banking.mandate,scheme:0 @@ -231,14 +199,12 @@ msgid "Mandate update" msgstr "Posodobitev mandata" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/models/account_payment_order.py:98 +#: code:addons/account_banking_sepa_direct_debit/models/account_payment_order.py:78 #, python-format msgid "" "Missing SEPA Direct Debit mandate on the bank payment line with partner '%s'" " (reference '%s')." -msgstr "" -"Pri postavki bančnega plačila partnerja '%s' (sklic '%s') manjka SEPA " -"direktna obremenitev." +msgstr "Pri postavki bančnega plačila partnerja '%s' (sklic '%s') manjka SEPA direktna obremenitev." #. module: account_banking_sepa_direct_debit #: selection:account.banking.mandate,type:0 @@ -247,11 +213,6 @@ msgstr "" msgid "One-Off" msgstr "Enkratna" -#. module: account_banking_sepa_direct_debit -#: model:ir.model.fields,field_description:account_banking_sepa_direct_debit.field_res_company_original_creditor_identifier -msgid "Original Creditor Identifier" -msgstr "Identifikator izvornega upnika" - #. module: account_banking_sepa_direct_debit #: model:ir.model,name:account_banking_sepa_direct_debit.model_account_payment_method msgid "Payment Methods" @@ -265,19 +226,16 @@ msgstr "" #. module: account_banking_sepa_direct_debit #: model:ir.model,name:account_banking_sepa_direct_debit.model_account_payment_order msgid "Payment Order" -msgstr "" +msgstr "Plačilni nalog" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/models/account_payment_order.py:62 +#: code:addons/account_banking_sepa_direct_debit/models/account_payment_order.py:41 #, python-format msgid "" "Payment Type Code '%s' is not supported. The only Payment Type Code " "supported for SEPA Direct Debit are 'pain.008.001.02', 'pain.008.001.03' and" " 'pain.008.001.04'." -msgstr "" -"Koda tipa plačila '%s' ni podprta. Edine kode tipov plačil, ki so podprte za" -" SEPA bremenilne transakcije, so 'pain.008.001.02', 'pain.008.001.03' in " -"'pain.008.001.04'." +msgstr "Koda tipa plačila '%s' ni podprta. Edine kode tipov plačil, ki so podprte za SEPA bremenilne transakcije, so 'pain.008.001.02', 'pain.008.001.03' in 'pain.008.001.04'." #. module: account_banking_sepa_direct_debit #: selection:account.banking.mandate,type:0 @@ -298,6 +256,11 @@ msgstr "Ponavljajoč" msgid "SEPA Creditor Identifier" msgstr "Identifikator SEPA upnika" +#. module: account_banking_sepa_direct_debit +#: model:account.payment.method,name:account_banking_sepa_direct_debit.sepa_direct_debit +msgid "SEPA Direct Debit for customers" +msgstr "" + #. module: account_banking_sepa_direct_debit #: model:account.payment.mode,name:account_banking_sepa_direct_debit.payment_mode_inbound_sepa_dd1 msgid "SEPA Direct Debit of customers" @@ -327,31 +290,26 @@ msgstr "Tip zaporedja za naslednjo obremenitev" #. module: account_banking_sepa_direct_debit #: code:addons/account_banking_sepa_direct_debit/models/account_payment_mode.py:39 -#: code:addons/account_banking_sepa_direct_debit/models/res_company.py:33 +#: code:addons/account_banking_sepa_direct_debit/models/res_company.py:31 #, python-format msgid "The SEPA Creditor Identifier '%s' is invalid." msgstr "" #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/models/account_payment_order.py:105 +#: code:addons/account_banking_sepa_direct_debit/models/account_payment_order.py:85 #, python-format msgid "" "The SEPA Direct Debit mandate with reference '%s' for partner '%s' has " "expired." -msgstr "" -"SEPA mandat za direktno obremenitev s sklicem '%s' za partnerja '%s' je " -"potekel." +msgstr "SEPA mandat za direktno obremenitev s sklicem '%s' za partnerja '%s' je potekel." #. module: account_banking_sepa_direct_debit -#: code:addons/account_banking_sepa_direct_debit/models/account_payment_order.py:113 +#: code:addons/account_banking_sepa_direct_debit/models/account_payment_order.py:93 #, python-format msgid "" "The mandate with reference '%s' for partner '%s' has type set to 'One-Off' " "and it has a last debit date set to '%s', so we can't use it." -msgstr "" -"Pri mandatu s sklicem '%s' za partnerja '%s' je tip nastavljen na " -"'enkraten', zadnji datum obremenitve pa ima nastavljen na '%s', zato ga ne " -"moremo uporabiti." +msgstr "Pri mandatu s sklicem '%s' za partnerja '%s' je tip nastavljen na 'enkraten', zadnji datum obremenitve pa ima nastavljen na '%s', zato ga ne moremo uporabiti." #. module: account_banking_sepa_direct_debit #: code:addons/account_banking_sepa_direct_debit/models/account_banking_mandate.py:48 @@ -363,9 +321,7 @@ msgstr "Ponavljajoči se mandat '%s' mora vsebovati tip zaporedja." #: model:ir.model.fields,help:account_banking_sepa_direct_debit.field_account_banking_mandate_recurrent_sequence_type msgid "" "This field is only used for Recurrent mandates, not for One-Off mandates." -msgstr "" -"To polje se uporablja le za ponavljajoče se mandate, ne pa za enkratne " -"mandate." +msgstr "To polje se uporablja le za ponavljajoče se mandate, ne pa za enkratne mandate." #. module: account_banking_sepa_direct_debit #: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document @@ -374,11 +330,17 @@ msgid "" " You are not entitled to a refund from your bank after your account has\n" " been debited, but you are entitled to request your bank\n" " not to debit your account up until the day on which the payment is due." +msgstr "Ta mandat je mišljen le za transakcije med pravnimi osebami.\n Po obremenitvi vašega računa nimate pravice do povračila\n svoje banke,, lahko pa pri banki zahtevate, da se računa\n ne bremeni do dneva zapadlosti plačila." + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "To be completed by the creditor" +msgstr "" + +#. module: account_banking_sepa_direct_debit +#: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.sepa_direct_debit_mandate_document +msgid "To be completed by the debtor" msgstr "" -"Ta mandat je mišljen le za transakcije med pravnimi osebami.\n" -" Po obremenitvi vašega računa nimate pravice do povračila\n" -" svoje banke,, lahko pa pri banki zahtevate, da se računa\n" -" ne bremeni do dneva zapadlosti plačila." #. module: account_banking_sepa_direct_debit #: model:ir.ui.view,arch_db:account_banking_sepa_direct_debit.view_mandate_search @@ -406,6 +368,4 @@ msgstr "" msgid "" "to send instructions to your bank to debit your account and (B) your bank to\n" " debit your account in accordance with the instructions from" -msgstr "" -"za pošiljanje navodil svoji banki glede bremenitve vašega računa in (B) svoji banki\n" -" naj bremeni vaš račun v skladu z navodili iz" +msgstr "za pošiljanje navodil svoji banki glede bremenitve vašega računa in (B) svoji banki\n naj bremeni vaš račun v skladu z navodili iz" From 5d312aa87cb66ed21701ac888b63858dabc40dd2 Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Fri, 18 Aug 2017 19:59:31 +0200 Subject: [PATCH 117/118] account_banking*: Show identifiers at payment mode level Now the visibility is controlled through a security group. --- account_banking_sepa_direct_debit/README.rst | 38 +++++++++++++++---- .../__manifest__.py | 8 ++-- .../models/account_payment_mode.py | 7 ---- .../views/account_payment_mode.xml | 9 ++--- 4 files changed, 38 insertions(+), 24 deletions(-) diff --git a/account_banking_sepa_direct_debit/README.rst b/account_banking_sepa_direct_debit/README.rst index 2f3e89b17..cfbba11be 100644 --- a/account_banking_sepa_direct_debit/README.rst +++ b/account_banking_sepa_direct_debit/README.rst @@ -33,10 +33,32 @@ This module is part of the OCA/bank-payment suite. Configuration ============= -Create a Payment Mode dedicated to SEPA Direct Debit and select the -Payment Method *SEPA Direct Debit for customers* (which is automatically -created upon module installation) and check that this payment method -uses the proper version of PAIN. +For setting the SEPA creditor identifier: + +#. Go to Accounting > Configuration > Settings. +#. On the field "SEPA Creditor Identifier" in the section *SEPA/PAIN*, you can + fill the corresponding identifier. + +If your country requires several identifiers (like Spain), you must: + +#. Go to *Accounting > Configuration > Settings*. +#. On the section *SEPA/PAIN*, check the mark "Multiple identifiers". +#. Now go to *Accounting > Configuration > Management > Payment Modes*. +#. Create a payment mode for your specific bank. +#. Fill the specific identifier on the field "SEPA Creditor Identifier". + +For defining a payment mode that uses SEPA direct debit: + +#. Go to *Accounting > Configuration > Management > Payment Modes*. +#. Create a record. +#. Select the Payment Method *SEPA Direct Debit for customers* (which is + automatically created upon module installation). +#. Check that this payment method uses the proper version of PAIN. +#. If not, go *Accounting > Configuration > Management > Payment Methods*. +#. Locate the "SEPA Direct Debit for customers" record and open it. +#. Change the "PAIN version" according your needs. +#. If you need to handle several PAIN versions, just duplicate the payment + method adjusting this field on each for having them. Usage ===== @@ -83,10 +105,12 @@ Maintainer .. image:: http://odoo-community.org/logo.png :alt: Odoo Community Association - :target: http://odoo-community.org + :target: https://odoo-community.org This module is maintained by the OCA. -OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. -To contribute to this module, please visit http://odoo-community.org. +To contribute to this module, please visit https://odoo-community.org. diff --git a/account_banking_sepa_direct_debit/__manifest__.py b/account_banking_sepa_direct_debit/__manifest__.py index 53191e3db..691592b72 100644 --- a/account_banking_sepa_direct_debit/__manifest__.py +++ b/account_banking_sepa_direct_debit/__manifest__.py @@ -1,13 +1,13 @@ # -*- coding: utf-8 -*- -# © 2013-2016 Akretion (www.akretion.com) -# © 2014 Tecnativa - Pedro M. Baeza -# © 2016 Tecnativa - Antonio Espinosa +# Copyright 2013-2016 Akretion (www.akretion.com) +# Copyright 2014-2017 Tecnativa - Pedro M. Baeza +# Copyright 2016 Tecnativa - Antonio Espinosa # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). { 'name': 'Account Banking SEPA Direct Debit', 'summary': 'Create SEPA files for Direct Debit', - 'version': '10.0.1.0.0', + 'version': '10.0.1.1.0', 'license': 'AGPL-3', 'author': "Akretion, " "Tecnativa, " diff --git a/account_banking_sepa_direct_debit/models/account_payment_mode.py b/account_banking_sepa_direct_debit/models/account_payment_mode.py index 2e13b9a39..3ef061eab 100644 --- a/account_banking_sepa_direct_debit/models/account_payment_mode.py +++ b/account_banking_sepa_direct_debit/models/account_payment_mode.py @@ -21,13 +21,6 @@ class AccountPaymentMode(models.Model): "- a 3-letters business code\n" "- a country-specific identifier") - def _sepa_type_get(self): - res = super(AccountPaymentMode, self)._sepa_type_get() - if not res: - if self.type.code and self.type.code.startswith('pain.008'): - res = 'sepa_direct_debit' - return res - @api.multi @api.constrains('sepa_creditor_identifier') def _check_sepa_creditor_identifier(self): diff --git a/account_banking_sepa_direct_debit/views/account_payment_mode.xml b/account_banking_sepa_direct_debit/views/account_payment_mode.xml index b7b8faebb..ac1301083 100644 --- a/account_banking_sepa_direct_debit/views/account_payment_mode.xml +++ b/account_banking_sepa_direct_debit/views/account_payment_mode.xml @@ -1,6 +1,6 @@ - @@ -11,10 +11,7 @@ - - + From c8303f304c2b095dddf08aa8d01257c342573aad Mon Sep 17 00:00:00 2001 From: etobella Date: Tue, 17 Oct 2017 16:12:16 +0200 Subject: [PATCH 118/118] [MIG] account_banking_sepa_direct_debit --- account_banking_sepa_direct_debit/README.rst | 16 +-- .../__manifest__.py | 4 +- .../data/account_payment_method.xml | 24 ++-- .../data/mandate_expire_cron.xml | 29 +++-- .../models/account_banking_mandate.py | 25 ++-- .../models/account_payment_method.py | 2 +- .../models/account_payment_mode.py | 2 +- .../models/account_payment_order.py | 8 +- .../models/bank_payment_line.py | 4 +- .../models/common.py | 4 +- .../models/res_company.py | 2 +- .../models/res_config.py | 6 +- .../post_install.py | 2 +- .../reports/sepa_direct_debit_mandate.xml | 2 +- .../tests/__init__.py | 1 + .../tests/test_mandate.py | 47 ++++++++ .../tests/test_sdd.py | 109 ++++++++++-------- .../views/account_banking_mandate_view.xml | 2 +- .../views/account_payment_mode.xml | 2 +- .../views/res_config.xml | 28 +++-- .../odoo/__init__.py | 1 + .../odoo/addons/__init__.py | 1 + .../addons/account_banking_sepa_direct_debit | 1 + .../setup.py | 6 + 24 files changed, 202 insertions(+), 126 deletions(-) create mode 100644 account_banking_sepa_direct_debit/tests/test_mandate.py create mode 100644 setup/account_banking_sepa_direct_debit/odoo/__init__.py create mode 100644 setup/account_banking_sepa_direct_debit/odoo/addons/__init__.py create mode 120000 setup/account_banking_sepa_direct_debit/odoo/addons/account_banking_sepa_direct_debit create mode 100644 setup/account_banking_sepa_direct_debit/setup.py diff --git a/account_banking_sepa_direct_debit/README.rst b/account_banking_sepa_direct_debit/README.rst index cfbba11be..cf6f64c0e 100644 --- a/account_banking_sepa_direct_debit/README.rst +++ b/account_banking_sepa_direct_debit/README.rst @@ -35,26 +35,26 @@ Configuration For setting the SEPA creditor identifier: -#. Go to Accounting > Configuration > Settings. +#. Go to Invoicing/Accounting > Configuration > Settings. #. On the field "SEPA Creditor Identifier" in the section *SEPA/PAIN*, you can fill the corresponding identifier. If your country requires several identifiers (like Spain), you must: -#. Go to *Accounting > Configuration > Settings*. +#. Go to *Invoicing/Accounting > Configuration > Settings*. #. On the section *SEPA/PAIN*, check the mark "Multiple identifiers". -#. Now go to *Accounting > Configuration > Management > Payment Modes*. +#. Now go to *Invoicing/Accounting > Configuration > Management > Payment Modes*. #. Create a payment mode for your specific bank. #. Fill the specific identifier on the field "SEPA Creditor Identifier". For defining a payment mode that uses SEPA direct debit: -#. Go to *Accounting > Configuration > Management > Payment Modes*. +#. Go to *Invoicing/Accounting > Configuration > Management > Payment Modes*. #. Create a record. #. Select the Payment Method *SEPA Direct Debit for customers* (which is automatically created upon module installation). #. Check that this payment method uses the proper version of PAIN. -#. If not, go *Accounting > Configuration > Management > Payment Methods*. +#. If not, go *Invoicing/Accounting > Configuration > Management > Payment Methods*. #. Locate the "SEPA Direct Debit for customers" record and open it. #. Change the "PAIN version" according your needs. #. If you need to handle several PAIN versions, just duplicate the payment @@ -63,13 +63,13 @@ For defining a payment mode that uses SEPA direct debit: Usage ===== -In the menu *Accounting > Payments > Debit Order*, create a new debit +In the menu *Invoicing/Accounting > Payments > Debit Order*, create a new debit order and select the Payment Mode dedicated to SEPA Direct Debit that you created during the configuration step. .. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas :alt: Try me on Runbot - :target: https://runbot.odoo-community.org/runbot/173/10.0 + :target: https://runbot.odoo-community.org/runbot/173/11.0 Known issues / Roadmap ====================== @@ -103,7 +103,7 @@ Contributors Maintainer ---------- -.. image:: http://odoo-community.org/logo.png +.. image:: https://odoo-community.org/logo.png :alt: Odoo Community Association :target: https://odoo-community.org diff --git a/account_banking_sepa_direct_debit/__manifest__.py b/account_banking_sepa_direct_debit/__manifest__.py index 691592b72..1dd145485 100644 --- a/account_banking_sepa_direct_debit/__manifest__.py +++ b/account_banking_sepa_direct_debit/__manifest__.py @@ -2,12 +2,12 @@ # Copyright 2013-2016 Akretion (www.akretion.com) # Copyright 2014-2017 Tecnativa - Pedro M. Baeza # Copyright 2016 Tecnativa - Antonio Espinosa -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). { 'name': 'Account Banking SEPA Direct Debit', 'summary': 'Create SEPA files for Direct Debit', - 'version': '10.0.1.1.0', + 'version': '11.0.1.0.0', 'license': 'AGPL-3', 'author': "Akretion, " "Tecnativa, " diff --git a/account_banking_sepa_direct_debit/data/account_payment_method.xml b/account_banking_sepa_direct_debit/data/account_payment_method.xml index fc72788cb..c81129d70 100644 --- a/account_banking_sepa_direct_debit/data/account_payment_method.xml +++ b/account_banking_sepa_direct_debit/data/account_payment_method.xml @@ -1,17 +1,11 @@ - - - - - - SEPA Direct Debit for customers - sepa_direct_debit - inbound - - - pain.008.001.02 - - - - + + + SEPA Direct Debit for customers + sepa_direct_debit + inbound + + + pain.008.001.02 + diff --git a/account_banking_sepa_direct_debit/data/mandate_expire_cron.xml b/account_banking_sepa_direct_debit/data/mandate_expire_cron.xml index 99f9acb6e..1f4496b61 100644 --- a/account_banking_sepa_direct_debit/data/mandate_expire_cron.xml +++ b/account_banking_sepa_direct_debit/data/mandate_expire_cron.xml @@ -2,22 +2,19 @@ - - - - Set SEPA Direct Debit Mandates to Expired - - - 1 - days - -1 - - - - - - + + + Set SEPA Direct Debit Mandates to Expired + + + code + model._sdd_mandate_set_state_to_expired() + 1 + days + -1 + + diff --git a/account_banking_sepa_direct_debit/models/account_banking_mandate.py b/account_banking_sepa_direct_debit/models/account_banking_mandate.py index daabb2d41..c45550bc1 100644 --- a/account_banking_sepa_direct_debit/models/account_banking_mandate.py +++ b/account_banking_sepa_direct_debit/models/account_banking_mandate.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # © 2013-2016 Akretion - Alexis de Lattre # © 2014 Serv. Tecnol. Avanzados - Pedro M. Baeza -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). from odoo import models, fields, api, exceptions, _ from datetime import datetime @@ -20,10 +20,11 @@ class AccountBankingMandate(models.Model): format = fields.Selection( selection_add=[('sepa', 'Sepa Mandate')], default='sepa') - type = fields.Selection([('recurrent', 'Recurrent'), - ('oneoff', 'One-Off')], - string='Type of Mandate', - track_visibility='onchange') + type = fields.Selection( + selection_add=[ + ('recurrent', 'Recurrent'), + ('oneoff', 'One-Off') + ]) recurrent_sequence_type = fields.Selection( [('first', 'First'), ('recurring', 'Recurring'), @@ -66,10 +67,12 @@ class AccountBankingMandate(models.Model): for mandate in self: super(AccountBankingMandate, self).mandate_partner_bank_change() res = {} - if (mandate.state == 'valid' and - mandate.partner_bank_id and - mandate.type == 'recurrent' and - mandate.recurrent_sequence_type != 'first'): + if ( + mandate.state == 'valid' and + mandate.partner_bank_id and + mandate.type == 'recurrent' and + mandate.recurrent_sequence_type != 'first' + ): mandate.recurrent_sequence_type = 'first' res['warning'] = { 'title': _('Mandate update'), @@ -82,8 +85,8 @@ class AccountBankingMandate(models.Model): @api.model def _sdd_mandate_set_state_to_expired(self): logger.info('Searching for SDD Mandates that must be set to Expired') - expire_limit_date = datetime.today() + \ - relativedelta(months=-NUMBER_OF_UNUSED_MONTHS_BEFORE_EXPIRY) + expire_limit_date = datetime.today() + relativedelta( + months=-NUMBER_OF_UNUSED_MONTHS_BEFORE_EXPIRY) expire_limit_date_str = expire_limit_date.strftime('%Y-%m-%d') expired_mandates = self.search( ['|', diff --git a/account_banking_sepa_direct_debit/models/account_payment_method.py b/account_banking_sepa_direct_debit/models/account_payment_method.py index 0249bba37..006f923c0 100644 --- a/account_banking_sepa_direct_debit/models/account_payment_method.py +++ b/account_banking_sepa_direct_debit/models/account_payment_method.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # © 2016 Akretion (Alexis de Lattre ) -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). from odoo import models, fields, api diff --git a/account_banking_sepa_direct_debit/models/account_payment_mode.py b/account_banking_sepa_direct_debit/models/account_payment_mode.py index 3ef061eab..083ea5582 100644 --- a/account_banking_sepa_direct_debit/models/account_payment_mode.py +++ b/account_banking_sepa_direct_debit/models/account_payment_mode.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # © 2016 Antiun Ingenieria S.L. - Antonio Espinosa -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). from odoo import models, fields, api, _ from .common import is_sepa_creditor_identifier_valid diff --git a/account_banking_sepa_direct_debit/models/account_payment_order.py b/account_banking_sepa_direct_debit/models/account_payment_order.py index 3592437fe..c759e8323 100644 --- a/account_banking_sepa_direct_debit/models/account_payment_order.py +++ b/account_banking_sepa_direct_debit/models/account_payment_order.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # © 2016 Akretion (Alexis de Lattre ) -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from odoo import models, fields, api, _ from odoo.exceptions import UserError @@ -114,7 +114,7 @@ class AccountPaymentOrder(models.Model): lines_per_group[key] = [line] for (requested_date, priority, categ_purpose, sequence_type, scheme),\ - lines in lines_per_group.items(): + lines in list(lines_per_group.items()): # B. Payment info payment_info, nb_of_transactions_b, control_sum_b = \ self.generate_start_payment_info_block( @@ -218,9 +218,9 @@ class AccountPaymentOrder(models.Model): self.generate_remittance_info_block( dd_transaction_info, line, gen_args) - nb_of_transactions_b.text = unicode(transactions_count_b) + nb_of_transactions_b.text = str(transactions_count_b) control_sum_b.text = '%.2f' % amount_control_sum_b - nb_of_transactions_a.text = unicode(transactions_count_a) + nb_of_transactions_a.text = str(transactions_count_a) control_sum_a.text = '%.2f' % amount_control_sum_a return self.finalize_sepa_file_creation( diff --git a/account_banking_sepa_direct_debit/models/bank_payment_line.py b/account_banking_sepa_direct_debit/models/bank_payment_line.py index b3076feb4..4c600e24c 100644 --- a/account_banking_sepa_direct_debit/models/bank_payment_line.py +++ b/account_banking_sepa_direct_debit/models/bank_payment_line.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # © 2015-2016 Akretion - Alexis de Lattre -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). from odoo import models, api @@ -19,5 +19,5 @@ class BankPaymentLine(models.Model): """ hashcode = super(BankPaymentLine, self).\ move_line_offsetting_account_hashcode() - hashcode += '-' + unicode(self.mandate_id.recurrent_sequence_type) + hashcode += '-' + str(self.mandate_id.recurrent_sequence_type) return hashcode diff --git a/account_banking_sepa_direct_debit/models/common.py b/account_banking_sepa_direct_debit/models/common.py index 33712f3b3..cf32c81c2 100644 --- a/account_banking_sepa_direct_debit/models/common.py +++ b/account_banking_sepa_direct_debit/models/common.py @@ -2,7 +2,7 @@ # © 2013-2016 Akretion (Alexis de Lattre ) # © 2014 Serv. Tecnol. Avanzados - Pedro M. Baeza # © 2016 Antiun Ingenieria S.L. - Antonio Espinosa -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). import logging @@ -15,7 +15,7 @@ def is_sepa_creditor_identifier_valid(sepa_creditor_identifier): or unicode @return: True if valid, False otherwise """ - if not isinstance(sepa_creditor_identifier, (str, unicode)): + if not isinstance(sepa_creditor_identifier, str): return False try: sci = str(sepa_creditor_identifier).lower() diff --git a/account_banking_sepa_direct_debit/models/res_company.py b/account_banking_sepa_direct_debit/models/res_company.py index 1ce9c3736..7edcde4a6 100644 --- a/account_banking_sepa_direct_debit/models/res_company.py +++ b/account_banking_sepa_direct_debit/models/res_company.py @@ -2,7 +2,7 @@ # © 2013-2016 Akretion (Alexis de Lattre ) # © 2014 Serv. Tecnol. Avanzados - Pedro M. Baeza # © 2016 Antiun Ingenieria S.L. - Antonio Espinosa -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). from odoo import models, fields, api, _ from .common import is_sepa_creditor_identifier_valid diff --git a/account_banking_sepa_direct_debit/models/res_config.py b/account_banking_sepa_direct_debit/models/res_config.py index 47c311e3b..531b9ccf8 100644 --- a/account_banking_sepa_direct_debit/models/res_config.py +++ b/account_banking_sepa_direct_debit/models/res_config.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- # © 2016 Akretion (Alexis de Lattre ) -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). from odoo import models, fields -class AccountConfigSettings(models.TransientModel): - _inherit = 'account.config.settings' +class ResConfigSettings(models.TransientModel): + _inherit = 'res.config.settings' sepa_creditor_identifier = fields.Char( related='company_id.sepa_creditor_identifier') diff --git a/account_banking_sepa_direct_debit/post_install.py b/account_banking_sepa_direct_debit/post_install.py index 1ef07020a..b357674f3 100644 --- a/account_banking_sepa_direct_debit/post_install.py +++ b/account_banking_sepa_direct_debit/post_install.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # © 2016 Akretion (Alexis de Lattre ) -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from odoo import api, SUPERUSER_ID diff --git a/account_banking_sepa_direct_debit/reports/sepa_direct_debit_mandate.xml b/account_banking_sepa_direct_debit/reports/sepa_direct_debit_mandate.xml index 550d64227..5f84a6d30 100644 --- a/account_banking_sepa_direct_debit/reports/sepa_direct_debit_mandate.xml +++ b/account_banking_sepa_direct_debit/reports/sepa_direct_debit_mandate.xml @@ -11,7 +11,7 @@ file="account_banking_sepa_direct_debit.sepa_direct_debit_mandate" /> - + diff --git a/account_banking_sepa_direct_debit/tests/__init__.py b/account_banking_sepa_direct_debit/tests/__init__.py index 27fbb4e38..6d038500f 100644 --- a/account_banking_sepa_direct_debit/tests/__init__.py +++ b/account_banking_sepa_direct_debit/tests/__init__.py @@ -1,3 +1,4 @@ # -*- coding: utf-8 -*- from . import test_sdd +from . import test_mandate diff --git a/account_banking_sepa_direct_debit/tests/test_mandate.py b/account_banking_sepa_direct_debit/tests/test_mandate.py new file mode 100644 index 000000000..3ff0b57e8 --- /dev/null +++ b/account_banking_sepa_direct_debit/tests/test_mandate.py @@ -0,0 +1,47 @@ +# -*- coding: utf-8 -*- +# © 2016 Akretion (Alexis de Lattre ) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo.tests.common import TransactionCase +from odoo.exceptions import ValidationError +from datetime import datetime +from dateutil.relativedelta import relativedelta + + +class TestMandate(TransactionCase): + def test_contrains(self): + with self.assertRaises(ValidationError): + self.mandate.recurrent_sequence_type = False + self.mandate.type = 'recurrent' + self.mandate._check_recurring_type() + + def test_onchange_bank(self): + self.mandate.write({ + 'type': 'recurrent', 'recurrent_sequence_type': 'recurring' + }) + self.mandate.validate() + self.mandate.partner_bank_id = self.env.ref( + 'account_payment_mode.res_partner_2_iban' + ) + self.mandate.mandate_partner_bank_change() + self.assertEqual(self.mandate.recurrent_sequence_type, 'first') + + def test_expire(self): + self.mandate.signature_date = datetime.now() + relativedelta( + months=-50) + self.mandate.validate() + self.assertEqual(self.mandate.state, 'valid') + self.env['account.banking.mandate']._sdd_mandate_set_state_to_expired() + self.assertEqual(self.mandate.state, 'expired') + + def setUp(self): + res = super(TestMandate, self).setUp() + self.partner = self.env.ref('base.res_partner_12') + bank_account = self.env.ref('account_payment_mode.res_partner_12_iban') + self.mandate = self.env['account.banking.mandate'].create({ + 'partner_bank_id': bank_account.id, + 'format': 'sepa', + 'type': 'oneoff', + 'signature_date': '2015-01-01', + }) + return res diff --git a/account_banking_sepa_direct_debit/tests/test_sdd.py b/account_banking_sepa_direct_debit/tests/test_sdd.py index a61b0b27a..92c324a9f 100644 --- a/account_banking_sepa_direct_debit/tests/test_sdd.py +++ b/account_banking_sepa_direct_debit/tests/test_sdd.py @@ -1,9 +1,9 @@ # -*- coding: utf-8 -*- # © 2016 Akretion (Alexis de Lattre ) -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -from odoo.addons.account.tests.account_test_classes\ - import AccountingTestCase +import base64 +from odoo.addons.account.tests.account_test_classes import AccountingTestCase from odoo.tools import float_compare import time from lxml import etree @@ -60,72 +60,91 @@ class TestSDD(AccountingTestCase): for bank_acc in self.partner_bank_model.search([]): bank_acc.acc_number = bank_acc.acc_number - def test_sdd(self): + def test_pain_001_02(self): + self.payment_mode.payment_method_id.pain_version = 'pain.008.001.02' + self.check_sdd() + + def test_pain_003_02(self): + self.payment_mode.payment_method_id.pain_version = 'pain.008.003.02' + self.check_sdd() + + def test_pain_001_03(self): + self.payment_mode.payment_method_id.pain_version = 'pain.008.001.03' + self.check_sdd() + + def test_pain_001_04(self): + self.payment_mode.payment_method_id.pain_version = 'pain.008.001.04' + self.check_sdd() + + def check_sdd(self): self.env.ref( - 'account_banking_sepa_direct_debit.res_partner_2_mandate').\ - recurrent_sequence_type = 'first' + 'account_banking_sepa_direct_debit.res_partner_2_mandate' + ).recurrent_sequence_type = 'first' invoice1 = self.create_invoice( self.partner_agrolait.id, 'account_banking_sepa_direct_debit.res_partner_2_mandate', 42.0) + self.env.ref( + 'account_banking_sepa_direct_debit.res_partner_12_mandate' + ).type = 'oneoff' invoice2 = self.create_invoice( self.partner_c2c.id, 'account_banking_sepa_direct_debit.res_partner_12_mandate', 11.0) for inv in [invoice1, invoice2]: action = inv.create_account_payment_line() - self.assertEquals(action['res_model'], 'account.payment.order') - self.payment_order = self.payment_order_model.browse(action['res_id']) - self.assertEquals( - self.payment_order.payment_type, 'inbound') - self.assertEquals( - self.payment_order.payment_mode_id, self.payment_mode) - self.assertEquals( - self.payment_order.journal_id, self.bank_journal) + self.assertEqual(action['res_model'], 'account.payment.order') + payment_order = self.payment_order_model.browse(action['res_id']) + self.assertEqual( + payment_order.payment_type, 'inbound') + self.assertEqual( + payment_order.payment_mode_id, self.payment_mode) + self.assertEqual( + payment_order.journal_id, self.bank_journal) # Check payment line pay_lines = self.payment_line_model.search([ ('partner_id', '=', self.partner_agrolait.id), - ('order_id', '=', self.payment_order.id)]) - self.assertEquals(len(pay_lines), 1) + ('order_id', '=', payment_order.id)]) + self.assertEqual(len(pay_lines), 1) agrolait_pay_line1 = pay_lines[0] accpre = self.env['decimal.precision'].precision_get('Account') - self.assertEquals( + self.assertEqual( agrolait_pay_line1.currency_id.id, self.eur_currency_id) - self.assertEquals( + self.assertEqual( agrolait_pay_line1.mandate_id, invoice1.mandate_id) - self.assertEquals( + self.assertEqual( agrolait_pay_line1.partner_bank_id, invoice1.mandate_id.partner_bank_id) - self.assertEquals(float_compare( + self.assertEqual(float_compare( agrolait_pay_line1.amount_currency, 42, precision_digits=accpre), 0) - self.assertEquals(agrolait_pay_line1.communication_type, 'normal') - self.assertEquals(agrolait_pay_line1.communication, invoice1.number) - self.payment_order.draft2open() - self.assertEquals(self.payment_order.state, 'open') - self.assertEquals(self.payment_order.sepa, True) + self.assertEqual(agrolait_pay_line1.communication_type, 'normal') + self.assertEqual(agrolait_pay_line1.communication, invoice1.number) + payment_order.draft2open() + self.assertEqual(payment_order.state, 'open') + self.assertEqual(payment_order.sepa, True) # Check bank payment line bank_lines = self.bank_line_model.search([ ('partner_id', '=', self.partner_agrolait.id)]) - self.assertEquals(len(bank_lines), 1) + self.assertEqual(len(bank_lines), 1) agrolait_bank_line = bank_lines[0] - self.assertEquals( + self.assertEqual( agrolait_bank_line.currency_id.id, self.eur_currency_id) - self.assertEquals(float_compare( + self.assertEqual(float_compare( agrolait_bank_line.amount_currency, 42.0, precision_digits=accpre), 0) - self.assertEquals(agrolait_bank_line.communication_type, 'normal') - self.assertEquals( + self.assertEqual(agrolait_bank_line.communication_type, 'normal') + self.assertEqual( agrolait_bank_line.communication, invoice1.number) - self.assertEquals( + self.assertEqual( agrolait_bank_line.mandate_id, invoice1.mandate_id) - self.assertEquals( + self.assertEqual( agrolait_bank_line.partner_bank_id, invoice1.mandate_id.partner_bank_id) - action = self.payment_order.open2generated() - self.assertEquals(self.payment_order.state, 'generated') - self.assertEquals(action['res_model'], 'ir.attachment') + action = payment_order.open2generated() + self.assertEqual(payment_order.state, 'generated') + self.assertEqual(action['res_model'], 'ir.attachment') attachment = self.attachment_model.browse(action['res_id']) - self.assertEquals(attachment.datas_fname[-4:], '.xml') - xml_file = attachment.datas.decode('base64') + self.assertEqual(attachment.datas_fname[-4:], '.xml') + xml_file = base64.b64decode(attachment.datas) xml_root = etree.fromstring(xml_file) # print "xml_file=", etree.tostring(xml_root, pretty_print=True) namespaces = xml_root.nsmap @@ -133,20 +152,20 @@ class TestSDD(AccountingTestCase): namespaces.pop(None) pay_method_xpath = xml_root.xpath( '//p:PmtInf/p:PmtMtd', namespaces=namespaces) - self.assertEquals(pay_method_xpath[0].text, 'DD') + self.assertEqual(pay_method_xpath[0].text, 'DD') sepa_xpath = xml_root.xpath( '//p:PmtInf/p:PmtTpInf/p:SvcLvl/p:Cd', namespaces=namespaces) - self.assertEquals(sepa_xpath[0].text, 'SEPA') + self.assertEqual(sepa_xpath[0].text, 'SEPA') debtor_acc_xpath = xml_root.xpath( '//p:PmtInf/p:CdtrAcct/p:Id/p:IBAN', namespaces=namespaces) - self.assertEquals( + self.assertEqual( debtor_acc_xpath[0].text, - self.payment_order.company_partner_bank_id.sanitized_acc_number) - self.payment_order.generated2uploaded() - self.assertEquals(self.payment_order.state, 'uploaded') + payment_order.company_partner_bank_id.sanitized_acc_number) + payment_order.generated2uploaded() + self.assertEqual(payment_order.state, 'uploaded') for inv in [invoice1, invoice2]: - self.assertEquals(inv.state, 'paid') - self.assertEquals(self.env.ref( + self.assertEqual(inv.state, 'paid') + self.assertEqual(self.env.ref( 'account_banking_sepa_direct_debit.res_partner_2_mandate'). recurrent_sequence_type, 'recurring') return diff --git a/account_banking_sepa_direct_debit/views/account_banking_mandate_view.xml b/account_banking_sepa_direct_debit/views/account_banking_mandate_view.xml index 8bf7478e5..78c4285b3 100644 --- a/account_banking_sepa_direct_debit/views/account_banking_mandate_view.xml +++ b/account_banking_sepa_direct_debit/views/account_banking_mandate_view.xml @@ -1,7 +1,7 @@ + License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). --> diff --git a/account_banking_sepa_direct_debit/views/res_config.xml b/account_banking_sepa_direct_debit/views/res_config.xml index 94c8e3d77..1a297a5f3 100644 --- a/account_banking_sepa_direct_debit/views/res_config.xml +++ b/account_banking_sepa_direct_debit/views/res_config.xml @@ -2,17 +2,23 @@ - - sepa_direct_debit.account_config_settings.form - account.config.settings - - - - - - - + + sepa_direct_debit.account_config_settings.form + + res.config.settings + + + +
+
+
+
+
diff --git a/setup/account_banking_sepa_direct_debit/odoo/__init__.py b/setup/account_banking_sepa_direct_debit/odoo/__init__.py new file mode 100644 index 000000000..de40ea7ca --- /dev/null +++ b/setup/account_banking_sepa_direct_debit/odoo/__init__.py @@ -0,0 +1 @@ +__import__('pkg_resources').declare_namespace(__name__) diff --git a/setup/account_banking_sepa_direct_debit/odoo/addons/__init__.py b/setup/account_banking_sepa_direct_debit/odoo/addons/__init__.py new file mode 100644 index 000000000..de40ea7ca --- /dev/null +++ b/setup/account_banking_sepa_direct_debit/odoo/addons/__init__.py @@ -0,0 +1 @@ +__import__('pkg_resources').declare_namespace(__name__) diff --git a/setup/account_banking_sepa_direct_debit/odoo/addons/account_banking_sepa_direct_debit b/setup/account_banking_sepa_direct_debit/odoo/addons/account_banking_sepa_direct_debit new file mode 120000 index 000000000..48dd50874 --- /dev/null +++ b/setup/account_banking_sepa_direct_debit/odoo/addons/account_banking_sepa_direct_debit @@ -0,0 +1 @@ +../../../../account_banking_sepa_direct_debit \ No newline at end of file diff --git a/setup/account_banking_sepa_direct_debit/setup.py b/setup/account_banking_sepa_direct_debit/setup.py new file mode 100644 index 000000000..999b290c8 --- /dev/null +++ b/setup/account_banking_sepa_direct_debit/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +) \ No newline at end of file