From cb4843595013de8b680f8dfc07d624f4dd73e289 Mon Sep 17 00:00:00 2001
From: "Pieter J. Kersten"
Date: Wed, 30 Jun 2010 09:11:08 +0200
Subject: [PATCH] [MERGE] account_banking_fi_patu: added finish patu parser -
thanks to Sami Haahtinen [FIX] account_banking_nl_clieop: added forgotten
danish translation file.
---
account_banking_fi_patu/__init__.py | 30 +++
account_banking_fi_patu/__terp__.py | 42 ++++
account_banking_fi_patu/parser.py | 227 +++++++++++++++++
account_banking_fi_patu/patu.py | 139 +++++++++++
account_banking_nl_clieop/i18n/da.po | 348 +++++++++++++++++++++++++++
5 files changed, 786 insertions(+)
create mode 100644 account_banking_fi_patu/__init__.py
create mode 100644 account_banking_fi_patu/__terp__.py
create mode 100644 account_banking_fi_patu/parser.py
create mode 100644 account_banking_fi_patu/patu.py
create mode 100644 account_banking_nl_clieop/i18n/da.po
diff --git a/account_banking_fi_patu/__init__.py b/account_banking_fi_patu/__init__.py
new file mode 100644
index 000000000..4e06f1fd0
--- /dev/null
+++ b/account_banking_fi_patu/__init__.py
@@ -0,0 +1,30 @@
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+# Copyright (C) 2010 Sami Haahtinen ().
+# Copyright (C) 2009 EduSense BV ().
+# 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 .
+#
+##############################################################################
+import patu
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/account_banking_fi_patu/__terp__.py b/account_banking_fi_patu/__terp__.py
new file mode 100644
index 000000000..3ccd32595
--- /dev/null
+++ b/account_banking_fi_patu/__terp__.py
@@ -0,0 +1,42 @@
+##############################################################################
+#
+# Copyright (C) 2010 Sami Haahtinen ().
+# Copyright (C) 2009 EduSense BV ().
+# 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 .
+#
+##############################################################################
+{
+ 'name': 'Account Banking PATU module',
+ 'version': '0.1',
+ 'license': 'GPL-3',
+ 'author': 'Sami Haahtinen',
+ 'website': 'http://ressukka.net',
+ 'category': 'Account Banking',
+ 'depends': ['account_banking'],
+ 'description': '''
+ Module to import Finnish PATU format transation files.
+
+ This modules contains no logic, just an import filter for account_banking.
+ ''',
+ 'active': False,
+ 'installable': True,
+}
diff --git a/account_banking_fi_patu/parser.py b/account_banking_fi_patu/parser.py
new file mode 100644
index 000000000..d5754ba1c
--- /dev/null
+++ b/account_banking_fi_patu/parser.py
@@ -0,0 +1,227 @@
+#!/usr/bin/env python
+# encoding: utf-8
+"""Parser for PATU format files"""
+import re, datetime
+
+def fixchars(line):
+ """Fix the characters mangled in the input
+
+ :param line: Line to rewrite
+
+ :returns: string, fixed line
+ """
+ # Fix the umlauts int the input
+ line = line.replace("{", u"ä")
+ line = line.replace("}", u"ö")
+ # XXX: There are a whole bunch of these, adding them later
+ return line
+
+
+class PatuParser(object):
+ """Parse PATU lines in to structs"""
+
+ def __init__( self ):
+ """ Initialize PATU parser """
+
+ recparse = dict()
+ recparse["00"] = "T(?P00)(?P\d{3})" \
+ + "(?P\d{3})(?P\d{14})" \
+ + "(?P\d{3})(?P\d{6})" \
+ + "(?P\d{6})" \
+ + "(?P\d{6})(?P\d{4})" \
+ + "(?P.{17})(?P\d{6})" \
+ + "(?P.{19})" \
+ + "(?P\d{6})(?P.{3})" \
+ + "(?P.{30})"\
+ + "(?P\d{18})(?P.{35})" \
+ + "(?P.{40})(?P.{40})" \
+ + "(?P.{30})(?P.{30})"
+ recparse["10"] = "T(?P[18]0)(?P\d{3})" \
+ + "(?P\d{6})" \
+ + "(?P.{18})(?P\d{6})" \
+ + "(?P\d{6})" \
+ + "(?P\d{6})(?P\d)" \
+ + "(?P.{3})(?P.{35})" \
+ + "(?P.{19})(?P.)(?P.)" \
+ + "(?P.{35})(?P.)" \
+ + "(?P.{14})(?P.)" \
+ + "(?P.{20})" \
+ + "(?P.{8})(?P.)"
+ recparse["11"] = "T(?P[18]1)(?P\d{3})" \
+ + "(?P.{2})" \
+ + "(?:(?# Match specific info)" \
+ + "(?<=00)(?P.{35})+" \
+ + "|" \
+ + "(?<=01)(?P\d{8})" \
+ + "|" \
+ + "(?<=02)(?P.{10})\s(?P.{15})\s" \
+ + "(?P\d{6})" \
+ + "|" \
+ + "(?<=03)(?P.{19})\s(?P.{14})" \
+ + "|" \
+ + "(?<=04)(?P.{18})" \
+ + "|" \
+ + "(?<=05)(?P.{19})\s(?P.{3})\s" \
+ + "(?P.{11})(?P.{6})" \
+ + "|" \
+ + "(?<=06)(?P.{35})(?P.{35})" \
+ + "|" \
+ + "(?<=07)(?P.{35})" \
+ + "(?P.{35})?" \
+ + "(?P.{35})?" \
+ + "(?P.{35})?" \
+ + "(?P.{35})?" \
+ + "(?P.{35})?" \
+ + "(?P.{35})?" \
+ + "(?P.{35})?" \
+ + "(?P.{35})?" \
+ + "(?P.{35})?" \
+ + "(?P.{35})?" \
+ + "(?P.{35})?" \
+ + "|" \
+ + "(?<=08)(?P\d{3})\s(?P.{31})" \
+ + "|" \
+ + "(?<=09)(?P.{35})" \
+ + "|" \
+ + "(?<=11)(?P.{35})(?P.{35})" \
+ + "(?P.{35})(?P.{70})" \
+ + "(?P.{70})(?P.{35})" \
+ + "(?P.{70})" \
+ + ")"
+ recparse["40"] = "T(?P40)(?P\d{3})" \
+ + "(?P\d{6})(?P.{19})" \
+ + "(?P.{19})"
+ recparse["50"] = "T(?P50)(?P\d{3})" \
+ + "(?P\d)(?P\d{6})" \
+ + "(?P\d{8})(?P.{19})" \
+ + "(?P\d{8})(?P.{19})"
+ recparse["60"] = "T(?P60)(?P\d{3})" \
+ + "(?P.{3})(?P01)" \
+ + "(?P\d{6})-" \
+ + "(?P\d{6})" \
+ + "(?P.)(?P.{19})" \
+ + "(?P.)(?P\d{7})" \
+ + "(?P.)(?P.{19})" \
+ + "(?P.)(?P\d{7})" \
+ + "(?P.)(?P\d{7})" \
+ + "(?P.)(?P.{19})" \
+ + "(?P.)(?P.{35})" \
+ + "(?P\d{7})" \
+ + "(?P.)(?P.{35})" \
+ + "(?P\d{7})"
+ recparse["70"] = "T(?P70)(?P\d{3})" \
+ + "(?P\d{3})" \
+ + "(?P.{80})" \
+ + "(?P.{80})?" \
+ + "(?P.{80})?" \
+ + "(?P.{80})?" \
+ + "(?P.{80})?" \
+ + "(?P.{80})?"
+ for record in recparse:
+ recparse[record] = re.compile(recparse[record])
+ self.recparse = recparse
+
+
+ def parse_record(self, line):
+ """Docstring for parse_perus
+
+ :param line: description
+
+ :returns: description
+ """
+ line = fixchars(line)
+ for matcher in self.recparse:
+ matchobj = self.recparse[matcher].match(line)
+ if matchobj:
+ break
+ if not matchobj:
+ print " **** failed to match line '%s'" % (line)
+ return
+ # Strip strings
+ matchdict = matchobj.groupdict()
+
+ # Remove members set to None
+ for field in matchdict.keys():
+ if not matchdict[field]:
+ del matchdict[field]
+
+ matchkeys = set(matchdict.keys())
+ needstrip = set(["bankcontact1", "bankcontact2", "bankcontact3",
+ "customerid", "accountowner", "accountname", "refnr", "formnr",
+ "recipientname", "eventdesc", "recipientaccount", "message",
+ "principalinfo1", "bankinfo1", "bankinfo2", "bankinfo3",
+ "bankinfo4", "bankinfo5", "bankinfo6", "bankinfo7", "bankinfo8",
+ "bankinfo9", "bankinfo10", "bankinfo11", "bankinfo12",
+ "principalinfo2", "paymentdesc", "infoline1", "infoline2",
+ "infoline3", "infoline4", "infoline5", "infoline6",
+ "recipientname2", "recipientnameiban", "sendername"])
+ for field in matchkeys & needstrip:
+ matchdict[field] = matchdict[field].strip()
+ # Convert to int
+ needsint = set(["itemcount", "eventid", "record_len",
+ "depositcount", "withdrawcount"])
+ for field in matchkeys & needsint:
+ matchdict[field] = float(matchdict[field])
+ # Convert to float
+ needsfloat = set(["startingbalance", "accountlimit", "amount",
+ "destinationamount", "balance", "availablefunds", "depositsum",
+ "withdrawsum", "avgbalance", "avglimitbalance",
+ "permanentbalance"])
+ for field in matchkeys & needsfloat:
+ matchdict[field] = float(matchdict[field])
+ # convert sents to euros
+ needseur = set(["startingbalance", "accountlimit", "amount",
+ "destinationamount", "balance", "availablefunds", "depositsum",
+ "withdrawsum", "avgbalance", "permanentbalance"])
+ for field in matchkeys & needseur:
+ matchdict[field] = matchdict[field] / 100
+ # convert ibanswift to separate fields
+ if matchdict.has_key("ibanswift"):
+ matchdict["iban"], matchdict["swift"] = \
+ matchdict["ibanswift"].strip().split()
+
+ # Convert date fields
+ needdate = set(["startdate", "enddate", "creationdate", "balancedate",
+ "valuedate", "paymentdate", "recorddate", "perioddate"])
+ for field in matchkeys & needdate:
+ # Base all dates on the year 2000, since it's unlikely that this
+ # starndard will survive to see 2020 due to SEPA
+ datestring = matchdict[field]
+ if datestring == '000000':
+ matchdict[field] = None
+ continue
+
+ matchdict[field] = datetime.date(int("20" + datestring[0:2]),
+ int(datestring[2:4]), int(datestring[4:6]))
+ # convert time fields
+ needtime = set(["creationtime"])
+ for field in matchkeys & needtime:
+ timestring = matchdict[field]
+ matchdict[field] = datetime.time(int(timestring[0:2]),
+ int(timestring[2:4]))
+
+ return matchdict
+
+def parse_file(filename):
+ """Parse file with PATU format inside
+
+ :param filename: description
+
+ :returns: description
+ """
+ patufile = open(filename, "r")
+ parser = PatuParser()
+ for line in patufile:
+ parser.parse_record(line)
+
+def main():
+ """The main function, currently just calls a dummy filename
+
+ :returns: description
+ """
+ parse_file("myinput.nda")
+
+if __name__ == '__main__':
+ main()
+
+
diff --git a/account_banking_fi_patu/patu.py b/account_banking_fi_patu/patu.py
new file mode 100644
index 000000000..bb197edef
--- /dev/null
+++ b/account_banking_fi_patu/patu.py
@@ -0,0 +1,139 @@
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+# Copyright (C) 2010 Sami Haahtinen ().
+# Copyright (C) 2009 EduSense BV ().
+# 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 .
+#
+##############################################################################
+
+'''
+This parser implements the PATU format support. PATU format is a generic format
+used by finnish banks.
+'''
+from account_banking.parsers import models
+from tools.translate import _
+from account_banking_fi_patu.parser import PatuParser
+
+__all__ = ['parser']
+
+class transaction(models.mem_bank_transaction):
+ '''
+ Implementation of transaction communication class for account_banking.
+ '''
+ mapping = {
+ "remote_account": "recipientaccount",
+ "remote_currency": "currency",
+ "transferred_amount": "amount",
+ "execution_date": "recorddate",
+ "effective_date": "paymentdate",
+ "transfer_type": "eventtype",
+ "reference": "refnr",
+ "eventcode": "eventcode",
+ "message": "message"}
+ def __init__(self, record, *args, **kwargs):
+ '''
+ Initialize own dict with read values.
+ '''
+ super(transaction, self).__init__(*args, **kwargs)
+ for key in self.mapping:
+ try:
+ setattr(self, key, record[self.mapping[key]])
+ except KeyError:
+ pass
+
+ def is_valid(self):
+ '''
+ Override validity checks.
+ There are certain situations for PATU which can be validated as
+ invalid, but are normal.
+ If eventcode is 730, the transaction was initiated by the bank and
+ doesn't have a destination account.
+ '''
+ if self.eventcode and (self.eventcode == "720" or self.eventcode ==
+ "710"):
+ # Withdrawal from and deposit to the account
+ return (self.execution_date and self.transferred_amount and True) \
+ or False
+
+ if self.eventcode and self.eventcode == "730":
+ # The transaction is bank initiated, no remote account is present
+ return (self.execution_date and self.transferred_amount and True) \
+ or False
+
+ return super(transaction, self).is_valid()
+
+class statement(models.mem_bank_statement):
+ '''
+ Implementation of bank_statement communication class of account_banking
+ '''
+ def __init__(self, record, *args, **kwargs):
+ '''
+ Set decent start values based on first transaction read
+ '''
+ super(statement, self).__init__(*args, **kwargs)
+ self.id = record["statementnr"]
+ self.local_account = self.convert_bank_account(record["accountnr"])
+ self.date = record["creationdate"]
+ self.start_balance = record["startingbalance"]
+
+ def convert_bank_account(self, accountnr):
+ """Convert bank account number in to a abbreviated format used in
+ finland"""
+ bank = accountnr[:6]
+ account = accountnr[6:].lstrip("0")
+ return "%s-%s" % (bank, account)
+
+ def import_transaction(self, record):
+ '''
+ Import a transaction to the statement
+ '''
+ if record["recordid"] == "40":
+ self.end_balance = record["balance"]
+ elif record["recordid"] == "10" or record["recordid"] == "80":
+ # XXX: Sum up entries that have detailed records set for them. For
+ # now, ignore the parent entry
+ if record["receiptcode"] == "E":
+ return
+ self.transactions.append(transaction(record))
+
+class parser(models.parser):
+ code = 'FIPATU'
+ name = _('PATU statement sheet')
+ doc = _('''\
+PATU statement format defines one or more statements in each file. This parser
+will parse all statements in a file and import them to OpenERP
+''')
+
+ def parse(self, data):
+ result = []
+ stmnt = None
+ patuparser = PatuParser()
+ for line in data.splitlines():
+ # Skip empty (last) lines
+ if not line:
+ continue
+ record = patuparser.parse_record(line)
+ if record["recordid"] == "00":
+ # New statement
+ stmnt = statement(record)
+ result.append(stmnt)
+ else:
+ stmnt.import_transaction(record)
+ result.append(stmnt)
+ return result
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/account_banking_nl_clieop/i18n/da.po b/account_banking_nl_clieop/i18n/da.po
new file mode 100644
index 000000000..97db41c45
--- /dev/null
+++ b/account_banking_nl_clieop/i18n/da.po
@@ -0,0 +1,348 @@
+# Danish translation for account-banking
+# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010
+# This file is distributed under the same license as the account-banking package.
+# FIRST AUTHOR , 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: account-banking\n"
+"Report-Msgid-Bugs-To: FULL NAME \n"
+"POT-Creation-Date: 2010-01-08 15:36+0000\n"
+"PO-Revision-Date: 2010-02-06 14:41+0000\n"
+"Last-Translator: nanker \n"
+"Language-Team: Danish \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2010-06-09 10:04+0000\n"
+"X-Generator: Launchpad (build Unknown)\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 "Nej"
+
+#. 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 "Udkast"
+
+#. 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 "Gem"
+
+#. 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 "Sendt"
+
+#. 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 information"
+
+#. module: account_banking_nl_clieop
+#: model:ir.model,name:account_banking_nl_clieop.model_banking_export_clieop
+msgid "ClieOp3 Export"
+msgstr "ClieOp3 eksport"
+
+#. 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 "Opret"
+
+#. 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 "Filtype"
+
+#. 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 "Testkørsel"
+
+#. module: account_banking_nl_clieop
+#: selection:account_banking_nl_clieop.banking_export_clieop,init,batchtype:0
+msgid "Payments"
+msgstr "Betalinger"
+
+#. module: account_banking_nl_clieop
+#: code:addons/account_banking_nl_clieop/wizard/export_clieop.py:0
+#, python-format
+msgid "Error"
+msgstr "Fejl"
+
+#. module: account_banking_nl_clieop
+#: selection:account_banking_nl_clieop.banking_export_clieop,init,batchtype:0
+msgid "Salary Payments"
+msgstr "Lønudbetalinger"
+
+#. 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 "Reference"
+
+#. 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 "Betalingsordrer"
+
+#. module: account_banking_nl_clieop
+#: view:banking.export.clieop:0
+msgid "General Information"
+msgstr "Generel information"
+
+#. 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 "Totalt beløb"
+
+#. 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 "Annuller"
+
+#. 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 "Identifikation"
+
+#. 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 ""
+
+#. module: account_banking_nl_clieop
+#: field:banking.export.clieop,date_generated:0
+msgid "Generation Date"
+msgstr ""