[META] Set structure

This commit is contained in:
Pieter J. Kersten
2010-01-26 21:55:24 +01:00
parent 09f126ad74
commit c85c8b9621
36 changed files with 2557 additions and 0 deletions

View File

@@ -0,0 +1,30 @@
# -*- encoding: utf-8 -*-
##############################################################################
#
# Copyright (C) 2009 EduSense BV (<http://www.edusense.nl>).
# All Rights Reserved
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsability of assessing all potential
# consequences resulting from its eventual inadequacies and bugs
# End users who are looking for a ready-to-use solution with commercial
# garantees and support are strongly adviced to contract EduSense BV
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
import wizard
import account_banking_nl_clieop
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@@ -0,0 +1,50 @@
##############################################################################
#
# Copyright (C) 2009 EduSense BV (<http://www.edusense.nl>).
# All Rights Reserved
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsability of assessing all potential
# consequences resulting from its eventual inadequacies and bugs
# End users who are looking for a ready-to-use solution with commercial
# garantees and support are strongly adviced to contract EduSense BV
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
{
'name': 'Account Banking NL ClieOp',
'version': '0.1',
'license': 'GPL-3',
'author': 'EduSense BV',
'website': 'http://www.edusense.nl',
'category': 'Account Banking',
'depends': ['account_banking'],
'init_xml': [],
'update_xml': [
#'security/ir.model.access.csv',
'account_banking_nl_clieop.xml',
'account_banking_export_wizard.xml',
'data/banking_export_clieop.xml',
],
'demo_xml': [],
'description': '''
Module to export payment orders in ClieOp format.
ClieOp format is used by Dutch banks to batch national bank transfers.
This module uses the account_banking logic.
''',
'active': False,
'installable': True,
}

View File

@@ -0,0 +1,63 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) EduSense BV <http://www.edusense.nl>
All rights reserved.
The licence is in the file __terp__.py
-->
<openerp>
<data>
<!-- Make new view on ClieOp3 Exports -->
<record id="view_banking_export_clieop_form" model="ir.ui.view">
<field name="name">account.banking.export.clieop.form</field>
<field name="model">banking.export.clieop</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Client Opdrachten Export">
<separator string="General Information" colspan="4" />
<field name="filetype" />
<field name="identification" />
<separator string="ClieOp Information" colspan="4" />
<field name="total_amount" />
<field name="check_no_accounts" />
<field name="no_transactions" />
<separator string="Processing Information" colspan="4" />
<field name="prefered_date" />
<field name="date_generated" />
<field name="testcode" />
<newline />
<field name="file" colspan="4" />
</form>
</field>
</record>
<record id="view_banking_export_clieop_tree" model="ir.ui.view">
<field name="name">account.banking.export.clieop.tree</field>
<field name="model">banking.export.clieop</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree string="Client Opdrachten Export">
<field name="filetype" />
<field name="identification" search="2"/>
<field name="prefered_date" search="2"/>
<field name="date_generated" />
</tree>
</field>
</record>
<record model="ir.actions.act_window" id="action_account_banking_clieops">
<field name="name">Generated ClieOp3 Files</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">banking.export.clieop</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
</record>
<!-- Add a menu item for it -->
<menuitem name="Generated ClieOp3 Files"
id="menu_action_account_banking_exported_clieop_files"
parent="account_banking.menu_finance_banking_actions"
action="action_account_banking_clieops"
sequence="12"
/>
</data>
</openerp>

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) EduSense BV <http://www.edusense.nl>
All rights reserved.
The licence is in the file __terp__.py
-->
<openerp>
<data>
<wizard id="wizard_account_banking_export_clieop"
string="Export ClieOp File"
model="payment.order"
name="account_banking_nl_clieop.banking_export_clieop"
/>
</data>
</openerp>

View File

@@ -0,0 +1,99 @@
##############################################################################
#
# Copyright (C) 2009 EduSense BV (<http://www.edusense.nl>).
# All Rights Reserved
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from osv import osv, fields
from datetime import date
from tools.translate import _
class payment_order(osv.osv):
'''
Attach export_clieop wizard to payment order and allow traceability
'''
_inherit = 'payment.order'
def get_wizard(self, type):
if type in ['CLIEOPPAY', 'CLIEOPINC', 'CLIEOPSAL']:
return self._module, 'wizard_account_banking_export_clieop'
return super(payment_order, self).get_wizard(type)
payment_order()
class clieop_export(osv.osv):
'''ClieOp3 Export'''
_name = 'banking.export.clieop'
_description = __doc__
_columns = {
'payment_order_ids':
fields.text('Payment Orders'),
'testcode':
fields.selection([('T', _('Yes')), ('P', _('No'))],
'Test Run', readonly=True),
'daynumber':
fields.integer('ClieOp Transaction nr of the Day', readonly=True),
'duplicates':
fields.integer('Number of Duplicates', readonly=True),
'prefered_date':
fields.date('Prefered Processing Date',readonly=True),
'no_transactions':
fields.integer('Number of Transactions', readonly=True),
'check_no_accounts':
fields.char('Check Number Accounts', size=5, readonly=True),
'total_amount':
fields.float('Total Amount', readonly=True),
'identification':
fields.char('Identification', size=6, readonly=True, select=True),
'filetype':
fields.selection([
('CREDBET', 'Payment Batch'),
('SALARIS', 'Salary Payment Batch'),
('INCASSO', 'Direct Debit Batch'),
], 'File Type', size=7, readonly=True, select=True),
'date_generated':
fields.datetime('Generation Date', readonly=True, select=True),
'file':
fields.binary('ClieOp File', readonly=True),
'state':
fields.selection([
('draft', 'Draft'),
('sent', 'Sent'),
('done', 'Reconciled'),
], 'State', readonly=True),
}
def _get_daynr(self, cursor, uid, ids, context):
'''
Return highest day number
'''
last = cursor.execute('SELECT max(daynumber) '
'FROM banking_export_clieop '
'WHERE date_generated = "%s"' %
date.today().strftime('%Y-%m-%d')
).fetchone()
if last:
return int(last) +1
return 1
_defaults = {
'date_generated': lambda *a: date.today().strftime('%Y-%m-%d'),
'duplicates': lambda *a: 1,
'state': lambda *a: 'draft',
'daynumber': _get_daynr,
}
clieop_export()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data noupdate="1">
<record model="payment.type" id="account_banking_nl_clieop.export_clieop_inc">
<field name="name">ClieOp3 Direct Debit Batch</field>
<field name="code">CLIEOPINC</field>
<field name="suitable_bank_types"></field>
</record>
<record model="payment.type" id="account_banking_nl_clieop.export_clieop_pay">
<field name="name">ClieOp3 Payment Batch</field>
<field name="code">CLIEOPPAY</field>
<field name="suitable_bank_types"></field>
</record>
<record model="payment.type" id="account_banking_nl_clieop.export_clieop_sal">
<field name="name">ClieOp3 Salary Payment Batch</field>
<field name="code">CLIEOPSAL</field>
<field name="suitable_bank_types"></field>
</record>
</data>
</openerp>

View File

@@ -0,0 +1,335 @@
# Translation of OpenERP Server.
# This file contains the translation of the following modules:
# * account_banking_nl_clieop
#
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 5.0.7\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2010-01-08 15:36:23+0000\n"
"PO-Revision-Date: 2010-01-08 15:36:23+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_nl_clieop
#: constraint:ir.model:0
msgid "The Object name must start with x_ and not contain any special character !"
msgstr ""
#. module: account_banking_nl_clieop
#: selection:account_banking_nl_clieop.banking_export_clieop,init,batchtype:0
msgid "Direct Debits"
msgstr ""
#. module: account_banking_nl_clieop
#: selection:account_banking_nl_clieop.banking_export_clieop,create,testcode:0
#: code:addons/account_banking_nl_clieop/account_banking_clieop.py:0
#: code:addons/account_banking_nl_clieop/wizard/export_clieop.py:0
#: selection:banking.export.clieop,testcode:0
#, python-format
msgid "No"
msgstr ""
#. module: account_banking_nl_clieop
#: model:ir.module.module,shortdesc:account_banking_nl_clieop.module_meta_information
msgid "Account Banking NL ClieOp"
msgstr ""
#. module: account_banking_nl_clieop
#: wizard_field:account_banking_nl_clieop.banking_export_clieop,create,no_transactions:0
#: field:banking.export.clieop,no_transactions:0
msgid "Number of Transactions"
msgstr ""
#. module: account_banking_nl_clieop
#: model:ir.actions.wizard,name:account_banking_nl_clieop.wizard_account_banking_export_clieop
msgid "Export ClieOp File"
msgstr ""
#. module: account_banking_nl_clieop
#: wizard_field:account_banking_nl_clieop.banking_export_clieop,create,prefered_date:0
#: field:banking.export.clieop,prefered_date:0
msgid "Prefered Processing Date"
msgstr ""
#. module: account_banking_nl_clieop
#: model:payment.type,name:account_banking_nl_clieop.export_clieop_pay
msgid "ClieOp3 Payment Batch"
msgstr ""
#. module: account_banking_nl_clieop
#: field:banking.export.clieop,state:0
msgid "State"
msgstr ""
#. module: account_banking_nl_clieop
#: help:account_banking_nl_clieop.banking_export_clieop,init,test:0
msgid "Select this if you want your bank to run a test process rather then execute your orders for real."
msgstr ""
#. module: account_banking_nl_clieop
#: selection:banking.export.clieop,state:0
msgid "Draft"
msgstr ""
#. module: account_banking_nl_clieop
#: view:banking.export.clieop:0
msgid "Processing Information"
msgstr ""
#. module: account_banking_nl_clieop
#: help:account_banking_nl_clieop.banking_export_clieop,init,fixed_message:0
msgid "A fixed message to apply to all transactions in addition to the individual messages."
msgstr ""
#. module: account_banking_nl_clieop
#: wizard_field:account_banking_nl_clieop.banking_export_clieop,create,check_no_accounts:0
#: field:banking.export.clieop,check_no_accounts:0
msgid "Check Number Accounts"
msgstr ""
#. module: account_banking_nl_clieop
#: constraint:ir.actions.act_window:0
msgid "Invalid model name in the action definition."
msgstr ""
#. module: account_banking_nl_clieop
#: wizard_button:account_banking_nl_clieop.banking_export_clieop,create,save:0
msgid "Save"
msgstr ""
#. module: account_banking_nl_clieop
#: wizard_field:account_banking_nl_clieop.banking_export_clieop,init,batchtype:0
msgid "Type"
msgstr ""
#. module: account_banking_nl_clieop
#: selection:banking.export.clieop,state:0
msgid "Sent"
msgstr ""
#. module: account_banking_nl_clieop
#: wizard_field:account_banking_nl_clieop.banking_export_clieop,create,log:0
msgid "Log"
msgstr ""
#. module: account_banking_nl_clieop
#: view:banking.export.clieop:0
msgid "ClieOp Information"
msgstr ""
#. module: account_banking_nl_clieop
#: model:ir.model,name:account_banking_nl_clieop.model_banking_export_clieop
msgid "ClieOp3 Export"
msgstr ""
#. module: account_banking_nl_clieop
#: code:addons/account_banking_nl_clieop/wizard/export_clieop.py:0
#, python-format
msgid "You can only combine payment orders of the same type"
msgstr ""
#. module: account_banking_nl_clieop
#: selection:account_banking_nl_clieop.banking_export_clieop,create,filetype:0
#: selection:banking.export.clieop,filetype:0
msgid "Salary Payment Batch"
msgstr ""
#. module: account_banking_nl_clieop
#: selection:banking.export.clieop,state:0
msgid "Reconciled"
msgstr ""
#. module: account_banking_nl_clieop
#: wizard_view:account_banking_nl_clieop.banking_export_clieop,init:0
msgid "Reference for further communication"
msgstr ""
#. module: account_banking_nl_clieop
#: field:banking.export.clieop,duplicates:0
msgid "Number of Duplicates"
msgstr ""
#. module: account_banking_nl_clieop
#: help:account_banking_nl_clieop.banking_export_clieop,init,reference:0
msgid "The bank will use this reference in feedback communication to refer to this run. Only five characters are available."
msgstr ""
#. module: account_banking_nl_clieop
#: wizard_view:account_banking_nl_clieop.banking_export_clieop,init:0
msgid "Processing Details"
msgstr ""
#. module: account_banking_nl_clieop
#: model:payment.type,name:account_banking_nl_clieop.export_clieop_sal
msgid "ClieOp3 Salary Payment Batch"
msgstr ""
#. module: account_banking_nl_clieop
#: wizard_button:account_banking_nl_clieop.banking_export_clieop,init,create:0
msgid "Create"
msgstr ""
#. module: account_banking_nl_clieop
#: selection:account_banking_nl_clieop.banking_export_clieop,create,filetype:0
#: selection:banking.export.clieop,filetype:0
msgid "Direct Debit Batch"
msgstr ""
#. module: account_banking_nl_clieop
#: constraint:ir.ui.view:0
msgid "Invalid XML for View Architecture!"
msgstr ""
#. module: account_banking_nl_clieop
#: wizard_field:account_banking_nl_clieop.banking_export_clieop,create,file:0
#: field:banking.export.clieop,file:0
msgid "ClieOp File"
msgstr ""
#. module: account_banking_nl_clieop
#: code:addons/account_banking_nl_clieop/wizard/export_clieop.py:0
#, python-format
msgid "You can\'t create ClieOp orders more than 30 days in advance."
msgstr ""
#. module: account_banking_nl_clieop
#: wizard_field:account_banking_nl_clieop.banking_export_clieop,init,execution_date:0
msgid "Execution Date"
msgstr ""
#. module: account_banking_nl_clieop
#: wizard_field:account_banking_nl_clieop.banking_export_clieop,init,fixed_message:0
msgid "Fixed Message"
msgstr ""
#. module: account_banking_nl_clieop
#: wizard_field:account_banking_nl_clieop.banking_export_clieop,create,filetype:0
#: field:banking.export.clieop,filetype:0
msgid "File Type"
msgstr ""
#. module: account_banking_nl_clieop
#: model:payment.type,name:account_banking_nl_clieop.export_clieop_inc
msgid "ClieOp3 Direct Debit Batch"
msgstr ""
#. module: account_banking_nl_clieop
#: wizard_field:account_banking_nl_clieop.banking_export_clieop,create,testcode:0
#: wizard_field:account_banking_nl_clieop.banking_export_clieop,init,test:0
#: field:banking.export.clieop,testcode:0
msgid "Test Run"
msgstr ""
#. module: account_banking_nl_clieop
#: selection:account_banking_nl_clieop.banking_export_clieop,init,batchtype:0
msgid "Payments"
msgstr ""
#. module: account_banking_nl_clieop
#: code:addons/account_banking_nl_clieop/wizard/export_clieop.py:0
#, python-format
msgid "Error"
msgstr ""
#. module: account_banking_nl_clieop
#: selection:account_banking_nl_clieop.banking_export_clieop,init,batchtype:0
msgid "Salary Payments"
msgstr ""
#. module: account_banking_nl_clieop
#: wizard_view:account_banking_nl_clieop.banking_export_clieop,create:0
#: wizard_view:account_banking_nl_clieop.banking_export_clieop,init:0
#: view:banking.export.clieop:0
msgid "Client Opdrachten Export"
msgstr ""
#. module: account_banking_nl_clieop
#: wizard_view:account_banking_nl_clieop.banking_export_clieop,init:0
msgid "Additional message for all transactions"
msgstr ""
#. module: account_banking_nl_clieop
#: model:ir.actions.act_window,name:account_banking_nl_clieop.action_account_banking_clieops
#: model:ir.ui.menu,name:account_banking_nl_clieop.menu_action_account_banking_exported_clieop_files
msgid "Generated ClieOp3 Files"
msgstr ""
#. module: account_banking_nl_clieop
#: model:ir.module.module,description:account_banking_nl_clieop.module_meta_information
msgid "\n"
" Module to export payment orders in ClieOp format.\n"
"\n"
" ClieOp format is used by Dutch banks to batch national bank transfers.\n"
" This module uses the account_banking logic.\n"
" "
msgstr ""
#. module: account_banking_nl_clieop
#: wizard_field:account_banking_nl_clieop.banking_export_clieop,init,reference:0
msgid "Reference"
msgstr ""
#. module: account_banking_nl_clieop
#: help:account_banking_nl_clieop.banking_export_clieop,init,execution_date:0
msgid "This is the date the file should be processed by the bank. Don't choose a date beyond the nearest date in your payments. The latest allowed date is 30 days from now.\n"
"Please keep in mind that banks only execute on working days and typically use a delay of two days between execution date and effective transfer date."
msgstr ""
#. module: account_banking_nl_clieop
#: field:banking.export.clieop,payment_order_ids:0
msgid "Payment Orders"
msgstr ""
#. module: account_banking_nl_clieop
#: view:banking.export.clieop:0
msgid "General Information"
msgstr ""
#. module: account_banking_nl_clieop
#: wizard_field:account_banking_nl_clieop.banking_export_clieop,create,total_amount:0
#: field:banking.export.clieop,total_amount:0
msgid "Total Amount"
msgstr ""
#. module: account_banking_nl_clieop
#: field:banking.export.clieop,daynumber:0
msgid "ClieOp Transaction nr of the Day"
msgstr ""
#. module: account_banking_nl_clieop
#: wizard_button:account_banking_nl_clieop.banking_export_clieop,create,cancel:0
#: wizard_button:account_banking_nl_clieop.banking_export_clieop,init,end:0
msgid "Cancel"
msgstr ""
#. module: account_banking_nl_clieop
#: wizard_field:account_banking_nl_clieop.banking_export_clieop,create,identification:0
#: field:banking.export.clieop,identification:0
msgid "Identification"
msgstr ""
#. module: account_banking_nl_clieop
#: selection:account_banking_nl_clieop.banking_export_clieop,create,testcode:0
#: code:addons/account_banking_nl_clieop/account_banking_clieop.py:0
#: code:addons/account_banking_nl_clieop/wizard/export_clieop.py:0
#: selection:banking.export.clieop,testcode:0
#, python-format
msgid "Yes"
msgstr ""
#. module: account_banking_nl_clieop
#: selection:account_banking_nl_clieop.banking_export_clieop,create,filetype:0
#: selection:banking.export.clieop,filetype:0
msgid "Payment Batch"
msgstr ""
#. module: account_banking_nl_clieop
#: field:banking.export.clieop,date_generated:0
msgid "Generation Date"
msgstr ""

View File

@@ -0,0 +1,335 @@
# Translation of OpenERP Server.
# This file contains the translation of the following modules:
# * account_banking_nl_clieop
#
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 5.0.7\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2010-01-08 15:36:23+0000\n"
"PO-Revision-Date: 2010-01-08 15:36:23+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_nl_clieop
#: constraint:ir.model:0
msgid "The Object name must start with x_ and not contain any special character !"
msgstr ""
#. module: account_banking_nl_clieop
#: selection:account_banking_nl_clieop.banking_export_clieop,init,batchtype:0
msgid "Direct Debits"
msgstr ""
#. module: account_banking_nl_clieop
#: selection:account_banking_nl_clieop.banking_export_clieop,create,testcode:0
#: code:addons/account_banking_nl_clieop/account_banking_clieop.py:0
#: code:addons/account_banking_nl_clieop/wizard/export_clieop.py:0
#: selection:banking.export.clieop,testcode:0
#, python-format
msgid "No"
msgstr ""
#. module: account_banking_nl_clieop
#: model:ir.module.module,shortdesc:account_banking_nl_clieop.module_meta_information
msgid "Account Banking NL ClieOp"
msgstr ""
#. module: account_banking_nl_clieop
#: wizard_field:account_banking_nl_clieop.banking_export_clieop,create,no_transactions:0
#: field:banking.export.clieop,no_transactions:0
msgid "Number of Transactions"
msgstr ""
#. module: account_banking_nl_clieop
#: model:ir.actions.wizard,name:account_banking_nl_clieop.wizard_account_banking_export_clieop
msgid "Export ClieOp File"
msgstr ""
#. module: account_banking_nl_clieop
#: wizard_field:account_banking_nl_clieop.banking_export_clieop,create,prefered_date:0
#: field:banking.export.clieop,prefered_date:0
msgid "Prefered Processing Date"
msgstr ""
#. module: account_banking_nl_clieop
#: model:payment.type,name:account_banking_nl_clieop.export_clieop_pay
msgid "ClieOp3 Payment Batch"
msgstr ""
#. module: account_banking_nl_clieop
#: field:banking.export.clieop,state:0
msgid "State"
msgstr ""
#. module: account_banking_nl_clieop
#: help:account_banking_nl_clieop.banking_export_clieop,init,test:0
msgid "Select this if you want your bank to run a test process rather then execute your orders for real."
msgstr ""
#. module: account_banking_nl_clieop
#: selection:banking.export.clieop,state:0
msgid "Draft"
msgstr ""
#. module: account_banking_nl_clieop
#: view:banking.export.clieop:0
msgid "Processing Information"
msgstr ""
#. module: account_banking_nl_clieop
#: help:account_banking_nl_clieop.banking_export_clieop,init,fixed_message:0
msgid "A fixed message to apply to all transactions in addition to the individual messages."
msgstr ""
#. module: account_banking_nl_clieop
#: wizard_field:account_banking_nl_clieop.banking_export_clieop,create,check_no_accounts:0
#: field:banking.export.clieop,check_no_accounts:0
msgid "Check Number Accounts"
msgstr ""
#. module: account_banking_nl_clieop
#: constraint:ir.actions.act_window:0
msgid "Invalid model name in the action definition."
msgstr ""
#. module: account_banking_nl_clieop
#: wizard_button:account_banking_nl_clieop.banking_export_clieop,create,save:0
msgid "Save"
msgstr ""
#. module: account_banking_nl_clieop
#: wizard_field:account_banking_nl_clieop.banking_export_clieop,init,batchtype:0
msgid "Type"
msgstr ""
#. module: account_banking_nl_clieop
#: selection:banking.export.clieop,state:0
msgid "Sent"
msgstr ""
#. module: account_banking_nl_clieop
#: wizard_field:account_banking_nl_clieop.banking_export_clieop,create,log:0
msgid "Log"
msgstr ""
#. module: account_banking_nl_clieop
#: view:banking.export.clieop:0
msgid "ClieOp Information"
msgstr ""
#. module: account_banking_nl_clieop
#: model:ir.model,name:account_banking_nl_clieop.model_banking_export_clieop
msgid "ClieOp3 Export"
msgstr ""
#. module: account_banking_nl_clieop
#: code:addons/account_banking_nl_clieop/wizard/export_clieop.py:0
#, python-format
msgid "You can only combine payment orders of the same type"
msgstr ""
#. module: account_banking_nl_clieop
#: selection:account_banking_nl_clieop.banking_export_clieop,create,filetype:0
#: selection:banking.export.clieop,filetype:0
msgid "Salary Payment Batch"
msgstr ""
#. module: account_banking_nl_clieop
#: selection:banking.export.clieop,state:0
msgid "Reconciled"
msgstr ""
#. module: account_banking_nl_clieop
#: wizard_view:account_banking_nl_clieop.banking_export_clieop,init:0
msgid "Reference for further communication"
msgstr ""
#. module: account_banking_nl_clieop
#: field:banking.export.clieop,duplicates:0
msgid "Number of Duplicates"
msgstr ""
#. module: account_banking_nl_clieop
#: help:account_banking_nl_clieop.banking_export_clieop,init,reference:0
msgid "The bank will use this reference in feedback communication to refer to this run. Only five characters are available."
msgstr ""
#. module: account_banking_nl_clieop
#: wizard_view:account_banking_nl_clieop.banking_export_clieop,init:0
msgid "Processing Details"
msgstr ""
#. module: account_banking_nl_clieop
#: model:payment.type,name:account_banking_nl_clieop.export_clieop_sal
msgid "ClieOp3 Salary Payment Batch"
msgstr ""
#. module: account_banking_nl_clieop
#: wizard_button:account_banking_nl_clieop.banking_export_clieop,init,create:0
msgid "Create"
msgstr ""
#. module: account_banking_nl_clieop
#: selection:account_banking_nl_clieop.banking_export_clieop,create,filetype:0
#: selection:banking.export.clieop,filetype:0
msgid "Direct Debit Batch"
msgstr ""
#. module: account_banking_nl_clieop
#: constraint:ir.ui.view:0
msgid "Invalid XML for View Architecture!"
msgstr ""
#. module: account_banking_nl_clieop
#: wizard_field:account_banking_nl_clieop.banking_export_clieop,create,file:0
#: field:banking.export.clieop,file:0
msgid "ClieOp File"
msgstr ""
#. module: account_banking_nl_clieop
#: code:addons/account_banking_nl_clieop/wizard/export_clieop.py:0
#, python-format
msgid "You can\'t create ClieOp orders more than 30 days in advance."
msgstr ""
#. module: account_banking_nl_clieop
#: wizard_field:account_banking_nl_clieop.banking_export_clieop,init,execution_date:0
msgid "Execution Date"
msgstr ""
#. module: account_banking_nl_clieop
#: wizard_field:account_banking_nl_clieop.banking_export_clieop,init,fixed_message:0
msgid "Fixed Message"
msgstr ""
#. module: account_banking_nl_clieop
#: wizard_field:account_banking_nl_clieop.banking_export_clieop,create,filetype:0
#: field:banking.export.clieop,filetype:0
msgid "File Type"
msgstr ""
#. module: account_banking_nl_clieop
#: model:payment.type,name:account_banking_nl_clieop.export_clieop_inc
msgid "ClieOp3 Direct Debit Batch"
msgstr ""
#. module: account_banking_nl_clieop
#: wizard_field:account_banking_nl_clieop.banking_export_clieop,create,testcode:0
#: wizard_field:account_banking_nl_clieop.banking_export_clieop,init,test:0
#: field:banking.export.clieop,testcode:0
msgid "Test Run"
msgstr ""
#. module: account_banking_nl_clieop
#: selection:account_banking_nl_clieop.banking_export_clieop,init,batchtype:0
msgid "Payments"
msgstr ""
#. module: account_banking_nl_clieop
#: code:addons/account_banking_nl_clieop/wizard/export_clieop.py:0
#, python-format
msgid "Error"
msgstr ""
#. module: account_banking_nl_clieop
#: selection:account_banking_nl_clieop.banking_export_clieop,init,batchtype:0
msgid "Salary Payments"
msgstr ""
#. module: account_banking_nl_clieop
#: wizard_view:account_banking_nl_clieop.banking_export_clieop,create:0
#: wizard_view:account_banking_nl_clieop.banking_export_clieop,init:0
#: view:banking.export.clieop:0
msgid "Client Opdrachten Export"
msgstr ""
#. module: account_banking_nl_clieop
#: wizard_view:account_banking_nl_clieop.banking_export_clieop,init:0
msgid "Additional message for all transactions"
msgstr ""
#. module: account_banking_nl_clieop
#: model:ir.actions.act_window,name:account_banking_nl_clieop.action_account_banking_clieops
#: model:ir.ui.menu,name:account_banking_nl_clieop.menu_action_account_banking_exported_clieop_files
msgid "Generated ClieOp3 Files"
msgstr ""
#. module: account_banking_nl_clieop
#: model:ir.module.module,description:account_banking_nl_clieop.module_meta_information
msgid "\n"
" Module to export payment orders in ClieOp format.\n"
"\n"
" ClieOp format is used by Dutch banks to batch national bank transfers.\n"
" This module uses the account_banking logic.\n"
" "
msgstr ""
#. module: account_banking_nl_clieop
#: wizard_field:account_banking_nl_clieop.banking_export_clieop,init,reference:0
msgid "Reference"
msgstr ""
#. module: account_banking_nl_clieop
#: help:account_banking_nl_clieop.banking_export_clieop,init,execution_date:0
msgid "This is the date the file should be processed by the bank. Don't choose a date beyond the nearest date in your payments. The latest allowed date is 30 days from now.\n"
"Please keep in mind that banks only execute on working days and typically use a delay of two days between execution date and effective transfer date."
msgstr ""
#. module: account_banking_nl_clieop
#: field:banking.export.clieop,payment_order_ids:0
msgid "Payment Orders"
msgstr ""
#. module: account_banking_nl_clieop
#: view:banking.export.clieop:0
msgid "General Information"
msgstr ""
#. module: account_banking_nl_clieop
#: wizard_field:account_banking_nl_clieop.banking_export_clieop,create,total_amount:0
#: field:banking.export.clieop,total_amount:0
msgid "Total Amount"
msgstr ""
#. module: account_banking_nl_clieop
#: field:banking.export.clieop,daynumber:0
msgid "ClieOp Transaction nr of the Day"
msgstr ""
#. module: account_banking_nl_clieop
#: wizard_button:account_banking_nl_clieop.banking_export_clieop,create,cancel:0
#: wizard_button:account_banking_nl_clieop.banking_export_clieop,init,end:0
msgid "Cancel"
msgstr ""
#. module: account_banking_nl_clieop
#: wizard_field:account_banking_nl_clieop.banking_export_clieop,create,identification:0
#: field:banking.export.clieop,identification:0
msgid "Identification"
msgstr ""
#. module: account_banking_nl_clieop
#: selection:account_banking_nl_clieop.banking_export_clieop,create,testcode:0
#: code:addons/account_banking_nl_clieop/account_banking_clieop.py:0
#: code:addons/account_banking_nl_clieop/wizard/export_clieop.py:0
#: selection:banking.export.clieop,testcode:0
#, python-format
msgid "Yes"
msgstr ""
#. module: account_banking_nl_clieop
#: selection:account_banking_nl_clieop.banking_export_clieop,create,filetype:0
#: selection:banking.export.clieop,filetype:0
msgid "Payment Batch"
msgstr ""
#. module: account_banking_nl_clieop
#: field:banking.export.clieop,date_generated:0
msgid "Generation Date"
msgstr ""

View File

@@ -0,0 +1,341 @@
# Translation of OpenERP Server.
# This file contains the translation of the following modules:
# * account_banking_nl_clieop
#
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 5.0.7\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2010-01-07 22:22:23+0000\n"
"PO-Revision-Date: 2010-01-07 22:22:23+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_nl_clieop
#: constraint:ir.model:0
msgid "The Object name must start with x_ and not contain any special character !"
msgstr "De objectnaam moet beginnen met x_ en mag geen speciale karakters bevatten !"
#. module: account_banking_nl_clieop
#: selection:account_banking_nl_clieop.banking_export_clieop,init,batchtype:0
msgid "Direct Debits"
msgstr "Incasso-batch"
#. module: account_banking_nl_clieop
#: selection:account_banking_nl_clieop.banking_export_clieop,create,testcode:0
#: code:addons/account_banking_nl_clieop/account_banking_clieop.py:0
#: code:addons/account_banking_nl_clieop/wizard/export_clieop.py:0
#: selection:banking.export.clieop,testcode:0
#, python-format
msgid "No"
msgstr "Nee"
#. module: account_banking_nl_clieop
#: model:ir.module.module,shortdesc:account_banking_nl_clieop.module_meta_information
msgid "Account Banking NL ClieOp"
msgstr "Account Banking NL ClieOp"
#. module: account_banking_nl_clieop
#: wizard_field:account_banking_nl_clieop.banking_export_clieop,create,no_transactions:0
#: field:banking.export.clieop,no_transactions:0
msgid "Number of Transactions"
msgstr "Aantal transacties"
#. module: account_banking_nl_clieop
#: model:ir.actions.wizard,name:account_banking_nl_clieop.wizard_account_banking_export_clieop
msgid "Export ClieOp File"
msgstr "Exporteer ClieOp-bestand"
#. module: account_banking_nl_clieop
#: wizard_field:account_banking_nl_clieop.banking_export_clieop,create,prefered_date:0
#: field:banking.export.clieop,prefered_date:0
msgid "Prefered Processing Date"
msgstr "Gewenste verwerkingsdatum"
#. module: account_banking_nl_clieop
#: model:payment.type,name:account_banking_nl_clieop.export_clieop_pay
msgid "ClieOp3 Payment Batch"
msgstr "ClieOp3 betalingsbatch"
#. module: account_banking_nl_clieop
#: field:banking.export.clieop,state:0
msgid "State"
msgstr "Status"
#. module: account_banking_nl_clieop
#: help:account_banking_nl_clieop.banking_export_clieop,init,test:0
msgid "Select this if you want your bank to run a test process rather then execute your orders for real."
msgstr "Kies dit als u wilt dat de bank een testrun draait in plaats van uw opdrachten te verwerken."
#. module: account_banking_nl_clieop
#: selection:banking.export.clieop,state:0
msgid "Draft"
msgstr "Concept"
#. module: account_banking_nl_clieop
#: view:banking.export.clieop:0
msgid "Processing Information"
msgstr "Verwerkingsinformatie"
#. module: account_banking_nl_clieop
#: help:account_banking_nl_clieop.banking_export_clieop,init,fixed_message:0
msgid "A fixed message to apply to all transactions in addition to the individual messages."
msgstr "Een vast bericht om toe te voegen aan alle transacties in toevoeging op de individuele berichten."
#. module: account_banking_nl_clieop
#: wizard_field:account_banking_nl_clieop.banking_export_clieop,create,check_no_accounts:0
#: field:banking.export.clieop,check_no_accounts:0
msgid "Check Number Accounts"
msgstr "Controlegetal rekeningen"
#. module: account_banking_nl_clieop
#: constraint:ir.actions.act_window:0
msgid "Invalid model name in the action definition."
msgstr "Ongeldige naam in actie-definitie."
#. module: account_banking_nl_clieop
#: wizard_button:account_banking_nl_clieop.banking_export_clieop,create,save:0
msgid "Save"
msgstr "Opskaan"
#. module: account_banking_nl_clieop
#: wizard_field:account_banking_nl_clieop.banking_export_clieop,init,batchtype:0
msgid "Type"
msgstr "Soort"
#. module: account_banking_nl_clieop
#: selection:banking.export.clieop,state:0
msgid "Sent"
msgstr "Verzonden"
#. module: account_banking_nl_clieop
#: wizard_field:account_banking_nl_clieop.banking_export_clieop,create,log:0
msgid "Log"
msgstr "Log"
#. module: account_banking_nl_clieop
#: view:banking.export.clieop:0
msgid "ClieOp Information"
msgstr "ClieOp-informatie"
#. module: account_banking_nl_clieop
#: model:ir.model,name:account_banking_nl_clieop.model_banking_export_clieop
msgid "ClieOp3 Export"
msgstr "ClieOp3-export"
#. module: account_banking_nl_clieop
#: code:addons/account_banking_nl_clieop/wizard/export_clieop.py:0
#, python-format
msgid "You can only combine payment orders of the same type"
msgstr "U kunt alleen betalingsopdrachten van dezelfde soort combineren"
#. module: account_banking_nl_clieop
#: selection:account_banking_nl_clieop.banking_export_clieop,create,filetype:0
#: selection:banking.export.clieop,filetype:0
msgid "Salary Payment Batch"
msgstr "Salarisbetalingsbatch"
#. module: account_banking_nl_clieop
#: selection:banking.export.clieop,state:0
msgid "Reconciled"
msgstr "Afgeletterd"
#. module: account_banking_nl_clieop
#: wizard_view:account_banking_nl_clieop.banking_export_clieop,init:0
msgid "Reference for further communication"
msgstr "Referentie voor verdere communicatie"
#. module: account_banking_nl_clieop
#: field:banking.export.clieop,duplicates:0
msgid "Number of Duplicates"
msgstr "Aantal duplicaten"
#. module: account_banking_nl_clieop
#: help:account_banking_nl_clieop.banking_export_clieop,init,reference:0
msgid "The bank will use this reference in feedback communication to refer to this run. Only five characters are available."
msgstr "De bank zal dit gebruiken in terugkoppelingsberichten om te referen aan deze verwerking. Slechts vijf tekens zijn beschikbaar."
#. module: account_banking_nl_clieop
#: wizard_view:account_banking_nl_clieop.banking_export_clieop,init:0
msgid "Processing Details"
msgstr "Verwerkingsdetails"
#. module: account_banking_nl_clieop
#: model:payment.type,name:account_banking_nl_clieop.export_clieop_sal
msgid "ClieOp3 Salary Payment Batch"
msgstr "ClieOp3 salarisverwerking"
#. module: account_banking_nl_clieop
#: wizard_button:account_banking_nl_clieop.banking_export_clieop,init,create:0
msgid "Create"
msgstr "Maak"
#. module: account_banking_nl_clieop
#: selection:account_banking_nl_clieop.banking_export_clieop,create,filetype:0
#: selection:banking.export.clieop,filetype:0
msgid "Direct Debit Batch"
msgstr "Incassobatch"
#. module: account_banking_nl_clieop
#: constraint:ir.ui.view:0
msgid "Invalid XML for View Architecture!"
msgstr "Ongeldige XML voor overzicht"
#. module: account_banking_nl_clieop
#: wizard_field:account_banking_nl_clieop.banking_export_clieop,create,file:0
#: field:banking.export.clieop,file:0
msgid "ClieOp File"
msgstr "ClieOp-bestand"
#. module: account_banking_nl_clieop
#: code:addons/account_banking_nl_clieop/wizard/export_clieop.py:0
#, python-format
msgid "You can\'t create ClieOp orders more than 30 days in advance."
msgstr "U kunt geen ClieOp opdrachten aanmaken voor meer dan 30 dagen vooruit."
#. module: account_banking_nl_clieop
#: wizard_field:account_banking_nl_clieop.banking_export_clieop,init,execution_date:0
msgid "Execution Date"
msgstr "Uitvoeringsdatum"
#. module: account_banking_nl_clieop
#: wizard_field:account_banking_nl_clieop.banking_export_clieop,init,fixed_message:0
msgid "Fixed Message"
msgstr ""
#. module: account_banking_nl_clieop
#: wizard_field:account_banking_nl_clieop.banking_export_clieop,create,filetype:0
#: field:banking.export.clieop,filetype:0
msgid "File Type"
msgstr "Bestandsformaat"
#. module: account_banking_nl_clieop
#: model:payment.type,name:account_banking_nl_clieop.export_clieop_inc
msgid "ClieOp3 Direct Debit Batch"
msgstr "ClieOp3 incassoverwerking"
#. module: account_banking_nl_clieop
#: wizard_field:account_banking_nl_clieop.banking_export_clieop,create,testcode:0
#: wizard_field:account_banking_nl_clieop.banking_export_clieop,init,test:0
#: field:banking.export.clieop,testcode:0
msgid "Test Run"
msgstr "Testverwerking"
#. module: account_banking_nl_clieop
#: selection:account_banking_nl_clieop.banking_export_clieop,init,batchtype:0
msgid "Payments"
msgstr "Betalingen"
#. module: account_banking_nl_clieop
#: code:addons/account_banking_nl_clieop/wizard/export_clieop.py:0
#, python-format
msgid "Error"
msgstr "Fout"
#. module: account_banking_nl_clieop
#: selection:account_banking_nl_clieop.banking_export_clieop,init,batchtype:0
msgid "Salary Payments"
msgstr "Salarisbetalingen"
#. module: account_banking_nl_clieop
#: wizard_view:account_banking_nl_clieop.banking_export_clieop,create:0
#: wizard_view:account_banking_nl_clieop.banking_export_clieop,init:0
#: view:banking.export.clieop:0
msgid "Client Opdrachten Export"
msgstr "Client Opdrachten Export"
#. module: account_banking_nl_clieop
#: wizard_view:account_banking_nl_clieop.banking_export_clieop,init:0
msgid "Additional message for all transactions"
msgstr "Toegevoegd bericht voor alle transacties"
#. module: account_banking_nl_clieop
#: model:ir.actions.act_window,name:account_banking_nl_clieop.action_account_banking_clieops
#: model:ir.ui.menu,name:account_banking_nl_clieop.menu_action_account_banking_exported_clieop_files
msgid "Generated ClieOp3 Files"
msgstr "Gegenereerde ClieOp3-bestanden"
#. module: account_banking_nl_clieop
#: model:ir.module.module,description:account_banking_nl_clieop.module_meta_information
msgid "\n"
" Module to export payment orders in ClieOp format.\n"
"\n"
" ClieOp format is used by Dutch banks to batch national bank transfers.\n"
" This module uses the account_banking logic.\n"
" "
msgstr "\n"
" Module voor het exporteren van betalingsopdrachten in ClieOp-formaat.\n"
"\n"
" ClieOp-formaat wordt gebruikt door Nederlandse banks voor batchverwerking van national banktransacties.\n"
" Deze module gebruikt de account_banking logica.\n"
" "
#. module: account_banking_nl_clieop
#: wizard_field:account_banking_nl_clieop.banking_export_clieop,init,reference:0
msgid "Reference"
msgstr "Referentie"
#. module: account_banking_nl_clieop
#: help:account_banking_nl_clieop.banking_export_clieop,init,execution_date:0
msgid "This is the date the file should be processed by the bank. Don't choose a date beyond the nearest date in your payments. The latest allowed date is 30 days from now.\n"
"Please keep in mind that banks only execute on working days and typically use a delay of two days between execution date and effective transfer date."
msgstr "Dit is de datum dat het bestand verwerkt dient te worden door de bank. Kies geen datum verder dan 30 dagen vooruit.\n"
"Onthoud dat veel banken in alleen verwerken op werkdagen en dat er doorgaans twee dagen vertraging zit tussen verwerkingsdatum en effectieve datum.\n"
#. module: account_banking_nl_clieop
#: field:banking.export.clieop,payment_order_ids:0
msgid "Payment Orders"
msgstr "Betalingsopdrachten"
#. module: account_banking_nl_clieop
#: view:banking.export.clieop:0
msgid "General Information"
msgstr "Algemene informatie"
#. module: account_banking_nl_clieop
#: wizard_field:account_banking_nl_clieop.banking_export_clieop,create,total_amount:0
#: field:banking.export.clieop,total_amount:0
msgid "Total Amount"
msgstr "Totaalbedrag"
#. module: account_banking_nl_clieop
#: field:banking.export.clieop,daynumber:0
msgid "ClieOp Transaction nr of the Day"
msgstr "ClieOp dagtransactienummer"
#. module: account_banking_nl_clieop
#: wizard_button:account_banking_nl_clieop.banking_export_clieop,create,cancel:0
#: wizard_button:account_banking_nl_clieop.banking_export_clieop,init,end:0
msgid "Cancel"
msgstr "Annuleren"
#. module: account_banking_nl_clieop
#: wizard_field:account_banking_nl_clieop.banking_export_clieop,create,identification:0
#: field:banking.export.clieop,identification:0
msgid "Identification"
msgstr "Identificatie"
#. module: account_banking_nl_clieop
#: selection:account_banking_nl_clieop.banking_export_clieop,create,testcode:0
#: code:addons/account_banking_nl_clieop/account_banking_clieop.py:0
#: code:addons/account_banking_nl_clieop/wizard/export_clieop.py:0
#: selection:banking.export.clieop,testcode:0
#, python-format
msgid "Yes"
msgstr "Ja"
#. module: account_banking_nl_clieop
#: selection:account_banking_nl_clieop.banking_export_clieop,create,filetype:0
#: selection:banking.export.clieop,filetype:0
msgid "Payment Batch"
msgstr "Betalingsbatch"
#. module: account_banking_nl_clieop
#: field:banking.export.clieop,date_generated:0
msgid "Generation Date"
msgstr "Aanmaakdatum"

View File

@@ -0,0 +1,23 @@
# -*- encoding: utf-8 -*-
##############################################################################
#
# Copyright (C) 2009 EduSense BV (<http://www.edusense.nl>).
# All Rights Reserved
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
import export_clieop
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@@ -0,0 +1,460 @@
# -*- encoding: utf-8 -*-
##############################################################################
#
# Copyright (C) 2009 EduSense BV (<http://www.edusense.nl>).
# All Rights Reserved
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from account_banking import record
__all__ = ['IncassoBatch', 'BetalingsBatch', 'Incasso', 'Betaling',
'IncassoFile', 'BetalingsFile', 'SalarisFile',
'SalarisbetalingsOpdracht', 'BetalingsOpdracht', 'IncassoOpdracht',
'OpdrachtenFile',
]
def elfproef(s):
'''
Dutch elfproef for validating 9-long local bank account numbers.
'''
r = 0
l = len(s)
for i,c in enumerate(s):
r += (l-i) * int(c)
return (r % 11) == 0
class HeaderRecord(record.Record): #{{{
'''ClieOp3 header record'''
_fields = [
record.Filler('recordcode', 4, '0001'),
record.Filler('variantcode', 1, 'A'),
record.DateField('aanmaakdatum', '%d%m%y', auto=True),
record.Filler('bestandsnaam', 8, 'CLIEOP03'),
record.Field('inzender_id', 5),
record.Field('bestands_id', 4),
record.Field('duplicaatcode', 1),
record.Filler('filler', 21),
]
def __init__(self, id='1', volgnr=1, duplicate=False):
super(HeaderRecord, self).__init__()
self.inzender_id = id
self.bestands_id = '%02d%02d' % (self.aanmaakdatum.day, volgnr)
self.duplicaatcode = duplicate and '2' or '1'
#}}}
class FooterRecord(record.Record):
'''ClieOp3 footer record'''
_fields = [
record.Filler('recordcode', 4, '9999'),
record.Filler('variantcode', 1, 'A'),
record.Filler('filler', 45),
]
class BatchHeaderRecord(record.Record):
'''Header record preceding new batches'''
_fields = [
record.Filler('recordcode', 4, '0010'),
record.Field('variantcode', 1),
record.Field('transactiegroep', 2),
record.NumberField('rekeningnr_opdrachtgever', 10),
record.NumberField('batchvolgnummer', 4),
record.Filler('aanlevermuntsoort', 3, 'EUR'),
record.Field('batch_id', 16),
record.Filler('filler', 10),
]
class BatchFooterRecord(record.Record):
'''Closing record for batches'''
_fields = [
record.Filler('recordcode', 4, '9990'),
record.Filler('variantcode', 1, 'A'),
record.NumberField('totaalbedrag', 18),
record.NumberField('totaal_rekeningnummers', 10),
record.NumberField('aantal_posten', 7),
record.Filler('filler', 10),
]
class VasteOmschrijvingRecord(record.Record):
'''Fixed message'''
_fields = [
record.Filler('recordcode', 4, '0020'),
record.Filler('variantcode', 1, 'A'),
record.Field('vaste_omschrijving', 32),
record.Filler('filler', 13),
]
class OpdrachtgeverRecord(record.Record):
'''Ordering party'''
_fields = [
record.Filler('recordcode', 4, '0030'),
record.Filler('variantcode', 1, 'B'),
record.Field('NAWcode', 1),
record.DateField('gewenste_verwerkingsdatum', '%d%m%y', auto=True),
record.Field('naam_opdrachtgever', 35),
record.Field('testcode', 1),
record.Filler('filler', 2),
]
class TransactieRecord(record.Record):
'''Transaction'''
_fields = [
record.Filler('recordcode', 4, '0100'),
record.Filler('variantcode', 1, 'A'),
record.NumberField('transactiesoort', 4),
record.NumberField('bedrag', 12),
record.NumberField('rekeningnr_betaler', 10),
record.NumberField('rekeningnr_begunstigde', 10),
record.Filler('filler', 9),
]
class NaamBetalerRecord(record.Record):
'''Name payer'''
_fields = [
record.Filler('recordcode', 4, '0110'),
record.Filler('variantcode', 1, 'B'),
record.Field('naam', 35),
record.Filler('filler', 10),
]
class BetalingskenmerkRecord(record.Record):
'''Payment reference'''
_fields = [
record.Filler('recordcode', 4, '0150'),
record.Filler('variantcode', 1, 'A'),
record.Field('betalingskenmerk', 16),
record.Filler('filler', 29),
]
class OmschrijvingRecord(record.Record):
'''Description'''
_fields = [
record.Filler('recordcode', 4, '0160'),
record.Filler('variantcode', 1, 'B'),
record.Field('omschrijving', 32),
record.Filler('filler', 13),
]
class NaamBegunstigdeRecord(record.Record):
'''Name receiving party'''
_fields = [
record.Filler('recordcode', 4, '0170'),
record.Filler('variantcode', 1, 'B'),
record.Field('naam', 35),
record.Filler('filler', 10),
]
class OpdrachtRecord(record.Record):
'''Order details'''
_fields = [
record.Filler('recordcode', 6, 'KAE092'),
record.Field('naam_transactiecode', 18),
record.NumberField('totaalbedrag', 13),
record.Field('rekeningnr_opdrachtgever', 10),
record.NumberField('totaal_rekeningnummers', 5),
record.NumberField('aantal_posten', 6),
record.Field('identificatie', 6),
record.DateField('gewenste_verwerkingsdatum', '%y%m%d'),
record.Field('batch_medium', 18),
record.Filler('muntsoort', 3, 'EUR'),
record.Field('testcode', 1),
]
def __init__(self, *args, **kwargs):
super(OpdrachtRecord, self).__init__(*args, **kwargs)
self.batch_medium = 'DATACOM'
self.naam_transactiecode = self._transactiecode
class SalarisbetalingsOpdracht(OpdrachtRecord):
'''Salary payment batch record'''
_transactiecode = 'SALARIS'
class BetalingsOpdracht(OpdrachtRecord):
'''Payment batch record'''
_transactiecode = 'CREDBET'
class IncassoOpdracht(OpdrachtRecord):
'''Direct debit payments batch record'''
_transactiecode = 'INCASSO'
class Optional(object):
'''Auxilliary class to handle optional records'''
def __init__(self, klass, max=1):
self._klass = klass
self._max = max
self._guts = []
def __setattr__(self, attr, value):
'''Check for number of records'''
if attr[0] == '_':
super(Optional, self).__setattr__(attr, value)
else:
if self._guts and len(self._guts) > self._max:
raise ValueError, 'Only %d lines are allowed' % self._max
newitem = self._klass()
setattr(newitem, attr, value)
self._guts.append(newitem)
def __getattr__(self, attr):
'''Only return if used'''
if attr[0] == '_':
return super(Optional, self).__getattr__(attr)
return [getattr(x, attr) for x in self._guts]
def __iter__(self):
'''Make sure to adapt'''
return self._guts.__iter__()
class OpdrachtenFile(object):
'''A payment orders file'''
def __init__(self, *args, **kwargs):
self.opdrachten = []
@property
def rawdata(self):
'''
Return a writeable file content object
'''
return '\r\n'.join(self.opdrachten)
class Transactie(object):
'''Generic transaction class'''
def __init__(self, soort=0, naam=None, referentie=None, omschrijvingen=[],
rekeningnr_begunstigde=None, rekeningnr_betaler=None,
bedrag=0
):
self.transactie = TransactieRecord()
self.betalingskenmerk = Optional(BetalingskenmerkRecord)
self.omschrijving = Optional(OmschrijvingRecord, 4)
self.transactie.transactiesoort = soort
self.transactie.rekeningnr_begunstigde = rekeningnr_begunstigde
self.transactie.rekeningnr_betaler = rekeningnr_betaler
self.transactie.bedrag = int(bedrag * 100)
if referentie:
self.betalingskenmerk.betalingskenmerk = referentie
for oms in omschrijvingen:
self.omschrijving.omschrijving = oms
self.naam.naam = naam
class Incasso(Transactie):
'''Direct Debit Payment transaction'''
def __init__(self, *args, **kwargs):
reknr = kwargs['rekeningnr_betaler']
kwargs['soort'] = len(reknr.lstrip('0')) <= 7 and 1002 or 1001
self.naam = NaamBetalerRecord()
super(Incasso, self).__init__(*args, **kwargs)
@property
def rawdata(self):
'''
Return self as writeable file content object
'''
items = [str(self.transactie)]
if self.naam:
items.append(str(self.naam))
for kenmerk in self.betalingskenmerk:
items.append(str(kenmerk))
for omschrijving in self.omschrijving:
items.append(str(omschrijving))
return '\r\n'.join(items)
class Betaling(Transactie):
'''Payment transaction'''
def __init__(self, *args, **kwargs):
reknr = kwargs['rekeningnr_begunstigde']
if len(reknr.lstrip('0')) > 7:
if not elfproef(reknr):
raise ValueError, '%s is not a valid bank account' % reknr
kwargs['soort'] = 5
self.naam = NaamBegunstigdeRecord()
super(Betaling, self).__init__(*args, **kwargs)
@property
def rawdata(self):
'''
Return self as writeable file content object
'''
items = [str(self.transactie)]
for kenmerk in self.betalingskenmerk:
items.append(str(kenmerk))
if self.naam:
items.append(str(self.naam))
for omschrijving in self.omschrijving:
items.append(str(omschrijving))
return '\r\n'.join(items)
class SalarisBetaling(Betaling):
'''Salary Payment transaction'''
def __init__(self, *args, **kwargs):
reknr = kwargs['rekeningnr_begunstigde']
kwargs['soort'] = len(reknr.lstrip('0')) <= 7 and 3 or 8
super(SalarisBetaling, self).__init__(*args, **kwargs)
class Batch(object):
'''Generic batch class'''
transactieclass = None
def __init__(self, opdrachtgever, rekeningnr, verwerkingsdatum=None,
test=True, omschrijvingen=[], transactiegroep=None,
batchvolgnummer=1, batch_id=''
):
self.header = BatchHeaderRecord()
self.vaste_omschrijving = Optional(VasteOmschrijvingRecord, 4)
self.opdrachtgever = OpdrachtgeverRecord()
self.footer = BatchFooterRecord()
self.header.variantcode = batch_id and 'C' or 'B'
self.header.transactiegroep = transactiegroep
self.header.batchvolgnummer = batchvolgnummer
self.header.batch_id = batch_id
self.header.rekeningnr_opdrachtgever = rekeningnr
self.opdrachtgever.naam_opdrachtgever = opdrachtgever
self.opdrachtgever.gewenste_verwerkingsdatum = verwerkingsdatum
self.opdrachtgever.NAWcode = 1
self.opdrachtgever.testcode = test and 'T' or 'P'
self.transacties = []
for omschrijving in omschrijvingen:
self.vaste_omschrijving.omschrijving = omschrijving
@property
def aantal_posten(self):
'''nr of posts'''
return len(self.transacties)
@property
def totaalbedrag(self):
'''total amount transferred'''
return reduce(lambda x,y: x + int(y.transactie.bedrag),
self.transacties, 0
)
@property
def totaal_rekeningnummers(self):
'''check number on account numbers'''
return reduce(lambda x,y:
x + int(y.transactie.rekeningnr_betaler) + \
int(y.transactie.rekeningnr_begunstigde),
self.transacties, 0
)
@property
def rawdata(self):
'''
Return self as writeable file content object
'''
self.footer.aantal_posten = self.aantal_posten
self.footer.totaalbedrag = self.totaalbedrag
self.footer.totaal_rekeningnummers = self.totaal_rekeningnummers
lines = [str(self.header)]
for oms in self.vaste_omschrijving:
lines.append(str(oms))
lines += [
str(self.opdrachtgever),
'\r\n'.join([x.rawdata for x in self.transacties]),
str(self.footer)
]
return '\r\n'.join(lines)
def transactie(self, *args, **kwargs):
'''generic factory method'''
retval = self.transactieclass(*args, **kwargs)
self.transacties.append(retval)
return retval
class IncassoBatch(Batch):
'''Direct Debig Payment batch'''
transactieclass = Incasso
class BetalingsBatch(Batch):
'''Payment batch'''
transactieclass = Betaling
class SalarisBatch(Batch):
'''Salary payment class'''
transactieclass = SalarisBetaling
class ClieOpFile(object):
'''The grand unifying class'''
def __init__(self, identificatie='1', uitvoeringsdatum=None,
naam_opdrachtgever='', rekeningnr_opdrachtgever='',
test=False, **kwargs):
self.header = HeaderRecord(id=identificatie,)
self.footer = FooterRecord()
self.batches = []
self._uitvoeringsdatum = uitvoeringsdatum
self._identificatie = identificatie
self._naam_opdrachtgever = naam_opdrachtgever
self._reknr_opdrachtgever = rekeningnr_opdrachtgever
self._test = test
@property
def rawdata(self):
'''Return self as writeable file content object'''
return '\r\n'.join(
[str(self.header)] +
[x.rawdata for x in self.batches] +
[str(self.footer)]
)
def batch(self, *args, **kwargs):
'''Create batch'''
kwargs['transactiegroep'] = self.transactiegroep
kwargs['batchvolgnummer'] = len(self.batches) +1
kwargs['verwerkingsdatum'] = self._uitvoeringsdatum
kwargs['test'] = self._test
args = (self._naam_opdrachtgever, self._reknr_opdrachtgever)
retval = self.batchclass(*args, **kwargs)
self.batches.append(retval)
return retval
@property
def opdracht(self):
'''Produce an order to go with the file'''
totaal_rekeningnummers = 0
totaalbedrag = 0
aantal_posten = 0
for batch in self.batches:
totaal_rekeningnummers += batch.totaal_rekeningnummers
totaalbedrag += batch.totaalbedrag
aantal_posten += batch.aantal_posten
retval = self.opdrachtclass()
retval.identificatie = self._identificatie
retval.rekeningnr_opdrachtgever = self._reknr_opdrachtgever
retval.gewenste_verwerkingsdatum = self._uitvoeringsdatum
retval.testcode = self._test and 'T' or 'P'
retval.totaalbedrag = totaalbedrag
retval.aantal_posten = aantal_posten
retval.totaal_rekeningnummers = totaal_rekeningnummers
return retval
class IncassoFile(ClieOpFile):
'''Direct Debit Payments file'''
transactiegroep = '10'
batchclass = IncassoBatch
opdrachtclass = IncassoOpdracht
class BetalingsFile(ClieOpFile):
'''Payments file'''
transactiegroep = '00'
batchclass = BetalingsBatch
opdrachtclass = BetalingsOpdracht
class SalarisFile(BetalingsFile):
'''Salary Payments file'''
batchclass = SalarisBatch
opdrachtclass = SalarisbetalingsOpdracht
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@@ -0,0 +1,373 @@
# -*- encoding: utf-8 -*-
##############################################################################
#
# Copyright (C) 2009 EduSense BV (<http://www.edusense.nl>).
# All Rights Reserved
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
import wizard
import pooler
import base64
#from osv import osv
from tools.translate import _
from datetime import datetime, date, timedelta
#import pdb; pdb.set_trace()
import clieop
form = '''<?xml version="1.0"?>
<form string="Client Opdrachten Export">
<separator colspan="4" string="Processing Details" />
<field name="batchtype" />
<field name="execution_date" />
<field name="test" />
<separator colspan="4" string="Reference for further communication" />
<field name="reference" colspan="2" />
<separator colspan="4" string="Additional message for all transactions" />
<field name="fixed_message" />
</form>'''
fields = {
'reference' : {
'string': 'Reference',
'type': 'char',
'size': 5,
'required': False,
'help': ('The bank will use this reference in feedback communication '
'to refer to this run. Only five characters are available.'
)
},
'batchtype': {
'string': 'Type',
'type': 'selection',
'selection': [
('CLIEOPPAY', 'Payments'),
('CLIEOPSAL', 'Salary Payments'),
('CLIEOPINC', 'Direct Debits'),
],
'readonly': True,
},
'execution_date': {
'string': 'Execution Date',
'type': 'date',
'required': False,
'help': ('This is the date the file should be processed by the bank. '
'Don\'t choose a date beyond the nearest date in your '
'payments. The latest allowed date is 30 days from now.\n'
'Please keep in mind that banks only execute on working days '
'and typically use a delay of two days between execution date '
'and effective transfer date.'
),
},
'test': {
'string': 'Test Run',
'type': 'boolean',
'required': True,
'default': True,
'help': ('Select this if you want your bank to run a test process '
'rather then execute your orders for real.'
)
},
'fixed_message': {
'string': 'Fixed Message',
'type': 'char',
'size': 32,
'required': False,
'default': '',
'help': ('A fixed message to apply to all transactions in addition to '
'the individual messages.'
),
},
}
file_form = '''<?xml version="1.0"?>
<form string="Client Opdrachten Export">
<field name="filetype" />
<field name="identification" />
<field name="total_amount" />
<field name="check_no_accounts" />
<field name="no_transactions" />
<field name="prefered_date" />
<field name="testcode" />
<field name="file" />
<field name="log" colspan="4" nolabel="1" />
</form>'''
file_fields = {
'testcode': {
'string': 'Test Run',
'type': 'selection',
'selection': [('T', _('Yes')), ('P', _('No'))],
'required': False,
'readonly': True,
},
'prefered_date': {
'string': 'Prefered Processing Date',
'type': 'date',
'required': False,
'readonly': True,
},
'no_transactions': {
'string': 'Number of Transactions',
'type': 'int',
'required': False,
'readonly': True,
},
'check_no_accounts': {
'string': 'Check Number Accounts',
'type': 'char',
'size': 5,
'required': False,
'readonly': True,
},
'total_amount': {
'string': 'Total Amount',
'type': 'float',
'required': False,
'readonly': True,
},
'identification': {
'string': 'Identification',
'type': 'char',
'size': 6,
'required': False,
'readonly': True,
},
'filetype': {
'string': 'File Type',
'type': 'selection',
'selection': [
('CREDBET', 'Payment Batch'),
('SALARIS', 'Salary Payment Batch'),
('INCASSO', 'Direct Debit Batch'),
],
'required': False,
'readonly': True,
},
'file': {
'string': 'ClieOp File',
'type': 'binary',
'required': False,
'readonly': True,
},
'log': {
'string': 'Log',
'type': 'text',
'readonly': True,
},
}
def strpdate(arg, format='%Y-%m-%d'):
'''shortcut'''
return datetime.strptime(arg, format).date()
def strfdate(arg, format='%Y-%m-%d'):
'''shortcut'''
return arg.strftime(format)
def _check_orders(self, cursor, uid, data, context):
'''
Check payment type for all orders.
Combine orders into one. All parameters harvested by the wizard
will apply to all orders. This will in effect create one super
batch for ClieOp, instead of creating individual parameterized
batches. As only large companies are likely to need the individual
settings per batch, this will do for now.
'''
form = data['form']
today = date.today()
pool = pooler.get_pool(cursor.dbname)
payment_order_obj = pool.get('payment.order')
runs = {}
# Only orders of same type can be combined
payment_orders = payment_order_obj.browse(cursor, uid, data['ids'])
for payment_order in payment_orders:
payment_type = payment_order.mode.type.code
if payment_type in runs:
runs[payment_type].append(payment_order)
else:
runs[payment_type] = [payment_order]
if payment_order.date_prefered == 'fixed':
if payment_order.date_planned:
execution_date = strpdate(payment_order.date_planned)
else:
execution_date = today
elif payment_order.date_prefered == 'now':
execution_date = today
elif payment_order.date_prefered == 'due':
# Max processing date is 30 days past now, so limiting beyond that
# will catch too early payments
max_date = execution_date = today + timedelta(days=31)
for line in payment_order.line_ids:
if line.move_line_id.date_maturity:
date_maturity = strpdate(line.move_line_id.date_maturity)
if date_maturity < execution_date:
execution_date = date_maturity
else:
execution_date = today
if execution_date and execution_date >= max_date:
raise wizard.except_wizard(
_('Error'),
_('You can\'t create ClieOp orders more than 30 days in advance.')
)
# Sanity check: can't process in the past
form['execution_date'] = strfdate(max(execution_date, today))
if len(runs) != 1:
raise wizard.except_wizard(
_('Error'),
_('You can only combine payment orders of the same type')
)
form['batchtype'] = type = runs.keys()[0]
form['reference'] = runs[type][0].reference[-5:]
return form
def _create_clieop(self, cursor, uid, data, context):
'''
Wizard to actually create the ClieOp3 file
'''
pool = pooler.get_pool(cursor.dbname)
payment_order_obj = pool.get('payment.order')
form = data['form']
clieopfile = None
payment_orders = payment_order_obj.browse(cursor, uid, data['ids'])
for payment_order in payment_orders:
if not clieopfile:
our_account_owner = payment_order.mode.bank_id.owner_name
our_account_nr = payment_order.mode.bank_id.acc_number
clieopfile = {'CLIEOPPAY': clieop.BetalingsFile,
'CLIEOPINC': clieop.IncassoFile,
'CLIEOPSAL': clieop.SalarisFile,
}[form['batchtype']](
identificatie = form['reference'],
uitvoeringsdatum = form['execution_date'],
naam_opdrachtgever = our_account_owner,
rekeningnr_opdrachtgever = our_account_nr,
test = form['test']
)
if form['fixed_message']:
omschrijvingen = [form['fixed_message']]
else:
omschrijvingen = []
batch = clieopfile.batch(
#our_account_owner,
#our_account_nr,
#verwerkingsdatum = strpdate(form['execution_date']),
#test = form['test'],
omschrijvingen = omschrijvingen,
batch_id = payment_order.reference
)
for line in payment_order.line_ids:
kwargs = dict(
naam = line.bank_id.owner_name,
bedrag = line.amount_currency,
referentie = line.communication or None,
)
if line.communication2:
kwargs['omschrijvingen'] = [line.communication2]
if form['batchtype'] in ['CLIEOPPAY', 'CLIEOPSAL']:
kwargs['rekeningnr_begunstigde'] = line.bank_id.acc_number
kwargs['rekeningnr_betaler'] = our_account_nr
else:
kwargs['rekeningnr_begunstigde'] = our_account_nr
kwargs['rekeningnr_betaler'] = line.bank_id.acc_number
transaction = batch.transactie(**kwargs)
opdracht = clieopfile.opdracht
values = dict(
filetype = opdracht.naam_transactiecode,
identification = opdracht.identificatie,
prefered_date = strfdate(opdracht.gewenste_verwerkingsdatum),
total_amount = int(opdracht.totaalbedrag) / 100.0,
check_no_accounts = opdracht.totaal_rekeningnummers,
no_transactions = opdracht.aantal_posten,
testcode = opdracht.testcode,
file = base64.encodestring(clieopfile.rawdata),
)
form.update(values)
values['daynumber'] = int(clieopfile.header.bestands_id[2:])
values['payment_order_ids'] = ','.join(map(str, data['ids']))
data['file_id'] = pool.get('banking.export.clieop').create(cursor, uid, values)
data['clieop'] = clieopfile
form['log'] = ''
return form
def _cancel_clieop(self, cursor, uid, data, context):
pool = pooler.get_pool(cursor.dbname)
pool.get('banking.export.clieop').unlink(cursor, uid, data['file_id'])
return {'state': 'end'}
def _save_clieop(self, cursor, uid, data, context):
pool = pooler.get_pool(cursor.dbname)
clieop_obj = pool.get('banking.export.clieop')
payment_order_obj = pool.get('payment.order')
clieop_file = clieop_obj.write(
cursor, uid, data['file_id'], {'state':'sent'}
)
payment_order_obj.write(cursor, uid, data['ids'], {'state': 'sent'})
return {'state': 'end'}
class wizard_banking_export_clieop(wizard.interface):
states = {
'init': {
'actions': [_check_orders],
'result': {
'type': 'form',
'arch': form,
'fields' : fields,
'state': [
('end', 'Cancel', 'gtk-cancel'),
('create', 'Create', 'gtk-ok'),
]
}
},
'create': {
'actions': [_create_clieop],
'result': {
'type': 'form',
'arch': file_form,
'fields': file_fields,
'state': [
('cancel', 'Cancel', 'gtk-cancel'),
('save', 'Save', 'gtk-save'),
]
},
},
'cancel': {
'actions': [_cancel_clieop],
'result': {
'type': 'state',
'state': 'end'
}
},
'save': {
'actions': [_save_clieop],
'result': {
'type': 'state',
'state': 'end'
},
}
}
wizard_banking_export_clieop('account_banking_nl_clieop.banking_export_clieop')
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@@ -0,0 +1,29 @@
# -*- encoding: utf-8 -*-
##############################################################################
#
# Copyright (C) 2009 EduSense BV (<http://www.edusense.nl>).
# All Rights Reserved
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsability of assessing all potential
# consequences resulting from its eventual inadequacies and bugs
# End users who are looking for a ready-to-use solution with commercial
# garantees and support are strongly adviced to contract EduSense BV
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
import multibank
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@@ -0,0 +1,46 @@
##############################################################################
#
# Copyright (C) 2009 EduSense BV (<http://www.edusense.nl>).
# All Rights Reserved
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsability of assessing all potential
# consequences resulting from its eventual inadequacies and bugs
# End users who are looking for a ready-to-use solution with commercial
# garantees and support are strongly adviced to contract EduSense BV
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
{
'name': 'Account Banking',
'version': '0.1',
'license': 'GPL-3',
'author': 'EduSense BV',
'website': 'http://www.edusense.nl',
'category': 'Account Banking',
'depends': ['account_banking'],
'init_xml': [],
'update_xml': [
#'security/ir.model.access.csv',
],
'demo_xml': [],
'description': '''
Module to import Dutch Multibank format transation files.
This modules contains no logic, just an import filter for account_banking.
''',
'active': False,
'installable': True,
}

View File

@@ -0,0 +1,48 @@
# Translation of OpenERP Server.
# This file contains the translation of the following modules:
# * account_banking_nl_multibank
#
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 5.0.7\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2010-01-08 15:50:45+0000\n"
"PO-Revision-Date: 2010-01-08 15:50:45+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_nl_multibank
#: code:addons/account_banking_nl_multibank/multibank.py:0
#, python-format
msgid "''\\n"
"The Dutch Banking Tools format is basicly a MS Excel CSV format.\n"
"There are two sub formats: MS Excel format and MS-Excel 2004 format.\n"
"Both formats are covered with this parser. All transactions are tied\n"
"to Bank Statements.\n"
"''"
msgstr ""
#. module: account_banking_nl_multibank
#: model:ir.module.module,shortdesc:account_banking_nl_multibank.module_meta_information
msgid "Account Banking"
msgstr ""
#. module: account_banking_nl_multibank
#: model:ir.module.module,description:account_banking_nl_multibank.module_meta_information
msgid "\n"
" Module to import Dutch Multibank format transation files.\n"
"\n"
" This modules contains no logic, just an import filter for account_banking.\n"
" "
msgstr ""
#. module: account_banking_nl_multibank
#: code:addons/account_banking_nl_multibank/multibank.py:0
#, python-format
msgid "Dutch Banking Tools"
msgstr ""

View File

@@ -0,0 +1,48 @@
# Translation of OpenERP Server.
# This file contains the translation of the following modules:
# * account_banking_nl_multibank
#
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 5.0.7\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2010-01-08 15:50:45+0000\n"
"PO-Revision-Date: 2010-01-08 15:50:45+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_nl_multibank
#: code:addons/account_banking_nl_multibank/multibank.py:0
#, python-format
msgid "''\\n"
"The Dutch Banking Tools format is basicly a MS Excel CSV format.\n"
"There are two sub formats: MS Excel format and MS-Excel 2004 format.\n"
"Both formats are covered with this parser. All transactions are tied\n"
"to Bank Statements.\n"
"''"
msgstr ""
#. module: account_banking_nl_multibank
#: model:ir.module.module,shortdesc:account_banking_nl_multibank.module_meta_information
msgid "Account Banking"
msgstr ""
#. module: account_banking_nl_multibank
#: model:ir.module.module,description:account_banking_nl_multibank.module_meta_information
msgid "\n"
" Module to import Dutch Multibank format transation files.\n"
"\n"
" This modules contains no logic, just an import filter for account_banking.\n"
" "
msgstr ""
#. module: account_banking_nl_multibank
#: code:addons/account_banking_nl_multibank/multibank.py:0
#, python-format
msgid "Dutch Banking Tools"
msgstr ""

View File

@@ -0,0 +1,56 @@
# Translation of OpenERP Server.
# This file contains the translation of the following modules:
# * account_banking_nl_multibank
#
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 5.0.7\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2010-01-08 14:52:29+0000\n"
"PO-Revision-Date: 2010-01-08 14:52:29+0000\n"
"Last-Translator: <p.j.kersten@edusense.nl>\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_nl_multibank
#: code:addons/account_banking_nl_multibank/multibank.py:0
#, python-format
msgid "''\\n"
"The Dutch Banking Tools format is basicly a MS Excel CSV format.\n"
"There are two sub formats: MS Excel format and MS-Excel 2004 format.\n"
"Both formats are covered with this parser. All transactions are tied\n"
"to Bank Statements.\n"
"''"
msgstr "''\\n"
"Het Nederlands MultiBank-formaat is in essentie een MS-Excel CSV-bestand.\n"
"Er zijn twee varianten: MS-Excel en MS-Excel 2004. Beide formaten worden\n"
"door deze parser herkend. Alle transacties zijn gebonden aan bankafschriften.\n"
""
#. module: account_banking_nl_multibank
#: model:ir.module.module,shortdesc:account_banking_nl_multibank.module_meta_information
msgid "Account Banking"
msgstr "Account Banking"
#. module: account_banking_nl_multibank
#: model:ir.module.module,description:account_banking_nl_multibank.module_meta_information
msgid "\n"
" Module to import Dutch Multibank format transation files.\n"
"\n"
" This modules contains no logic, just an import filter for account_banking.\n"
" "
msgstr "\n"
" Module voor het importeren van Nederlandse MultiBank-formaat transatiebestanden.\n"
"\n"
" Deze module bevat geen logica, maar slechts het importfilter voor account_banking.\n"
" "
#. module: account_banking_nl_multibank
#: code:addons/account_banking_nl_multibank/multibank.py:0
#, python-format
msgid "Dutch Banking Tools"
msgstr "Nederlands MultiBank-formaat"

View File

@@ -0,0 +1,184 @@
# -*- encoding: utf-8 -*-
##############################################################################
#
# Copyright (C) 2009 EduSense BV (<http://www.edusense.nl>).
# All Rights Reserved
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
'''
This parser follows the Dutch Banking Tools specifications which are
empirically recreated in this module.
Dutch Banking Tools uses the concept of 'Afschrift' or Bank Statement.
Every transaction is bound to a Bank Statement. As such, this module generates
Bank Statements along with Bank Transactions.
'''
from account_banking.parsers import models
from account_banking.parsers.convert import str2date
from tools.translate import _
import csv
__all__ = ['parser']
class transaction_message(object):
'''
A auxiliary class to validate and coerce read values
'''
attrnames = [
'date', 'local_account', 'remote_account', 'remote_owner', 'u1', 'u2',
'u3', 'local_currency', 'start_balance', 'remote_currency',
'transferred_amount', 'execution_date', 'effective_date', 'nr1',
'transfer_type', 'nr2', 'reference', 'message', 'statement_id'
]
@staticmethod
def clean_account(accountno):
'''
There seems to be some SEPA movement in data: account numbers
get prefixed by zeroes as in BBAN. Convert those to 'old' local
account numbers
Edit: All account number now follow the BBAN scheme. As SNS Bank,
from which this module was re-engineered, follows the Dutch
Banking Tools regulations, it is considered to be used by all banks
in the Netherlands which comply to it. If not, please notify us.
'''
if len(accountno) == 10: # Invalid: longest number is 9
accountno = accountno[1:]
# 9-scheme or 7-scheme?
stripped = accountno.lstrip('0')
if len(stripped) <= 7:
accountno = stripped
return accountno
def __init__(self, values):
'''
Initialize own dict with attributes and coerce values to right type
'''
self.__dict__.update(dict(zip(self.attrnames, values)))
#self.local_account = self.clean_account(self.local_account)
#self.remote_account = self.clean_account(self.remote_account)
self.start_balance = float(self.start_balance)
self.transferred_amount = float(self.transferred_amount)
self.execution_date = str2date(self.execution_date, '%d-%m-%Y')
self.effective_date = str2date(self.effective_date, '%d-%m-%Y')
class transaction(models.mem_bank_transaction):
'''
Implementation of transaction communication class for account_banking.
'''
attrnames = ['remote_account', 'remote_currency', 'transferred_amount',
'execution_date', 'effective_date', 'transfer_type',
'reference', 'message'
]
def __init__(self, line, *args, **kwargs):
'''
Initialize own dict with read values.
'''
super(transaction, self).__init__(*args, **kwargs)
for attr in self.attrnames:
setattr(self, attr, getattr(line, attr))
def is_valid(self):
'''
There are a few situations that can be signaled as 'invalid' but are
valid nontheless:
1. Transfers from one account to another under the same account holder
get not always a remote_account and remote_owner. They have their
transfer_type set to 'PRV'.
2. Invoices from the bank itself are communicated through statements.
These too have no remote_account and no remote_owner. They have a
transfer_type set to 'KST'.
3. Transfers sent through the 'International Transfers' system get
their feedback rerouted through a statement, which is not designed to
hold the extra fields needed. These transfers have their transfer_type
set to 'BTL'.
4. Cash payments with debit cards are not seen as a transfer between
accounts, but as a cash withdrawal. These withdrawals have their
transfer_type set to 'BEA'.
5. Cash withdrawals from banks are too not seen as a transfer between
two accounts - the cash exits the banking system. These withdrawals
have their transfer_type set to 'OPN'.
'''
return (self.transferred_amount and self.execution_date and
self.effective_date) and (
self.remote_account or
self.transfer_type in [
'KST', 'PRV', 'BTL', 'BEA', 'OPN'
])
class statement(models.mem_bank_statement):
'''
Implementation of bank_statement communication class of account_banking
'''
def __init__(self, msg, *args, **kwargs):
'''
Set decent start values based on first transaction read
'''
super(statement, self).__init__(*args, **kwargs)
self.id = msg.statement_id
self.local_account = msg.local_account
self.date = str2date(msg.date, '%d-%m-%Y')
self.start_balance = self.end_balance = msg.start_balance
self.import_transaction(msg)
def import_transaction(self, msg):
'''
Import a transaction and keep some house holding in the mean time.
'''
trans = transaction(msg)
self.end_balance += trans.transferred_amount
self.transactions.append(trans)
class parser(models.parser):
code = 'NLBT'
name = _('Dutch Banking Tools')
doc = _('''\
The Dutch Banking Tools format is basicly a MS Excel CSV format.
There are two sub formats: MS Excel format and MS-Excel 2004 format.
Both formats are covered with this parser. All transactions are tied
to Bank Statements.
''')
def parse(self, data):
result = []
stmnt = None
dialect = csv.excel()
dialect.quotechar = '"'
dialect.delimiter = ';'
lines = data.split('\n')
# Probe first record to find out which format we are parsing.
if lines and lines[0].count(',') > lines[0].count(';'):
dialect.delimiter = ','
dialect.quotechar = "'"
for line in csv.reader(lines, dialect=dialect):
# Skip empty (last) lines
if not line:
continue
msg = transaction_message(line)
if stmnt and stmnt.id != msg.statement_id:
result.append(stmnt)
stmnt = None
if not stmnt:
stmnt = statement(msg)
else:
stmnt.import_transaction(msg)
result.append(stmnt)
return result
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: