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