From b597176a96f108ba8582b6c8efb1dfdc2b16dae3 Mon Sep 17 00:00:00 2001 From: "Pieter J. Kersten" Date: Tue, 29 Jun 2010 16:58:52 +0200 Subject: [PATCH] [FIX] account_banking: fixed sloppy coding [FIX] account_banking: fixed error handling for Belgian IBAN convertor [FIX] account_banking: fixed straight copy for early IBAN adopters [IMP] account_banking: improved matching algorithm, handles split and combined payments as well [IMP] account_banking: better partner selection - now handles shared bank accounts [FIX] account_banking: default accounts can be overruled now [IMP] account_banking: extensions on memory model for bank transactions [IMP] account_banking: optional automatic creation of invoices for bank accounts [IMP] account_banking_xxx: translations update [IMP] account_banking_nl_clieop: better coding style [IMP] account_banking_nl_multibank: extended for memory model changes --- account_banking/__terp__.py | 5 - account_banking/account_banking.py | 410 ++++++---- account_banking/account_banking_view.xml | 46 +- account_banking/account_banking_workflow.xml | 14 + account_banking/data/account_banking_data.xml | 12 + account_banking/i18n/account_banking.pot | 283 ++++--- account_banking/i18n/da.po | 752 +++++++++++++++++ account_banking/i18n/en_US.po | 283 ++++--- account_banking/i18n/es.po | 752 +++++++++++++++++ account_banking/i18n/hr.po | 767 ++++++++++++++++++ account_banking/i18n/nl_NL.po | 594 +++++++++----- account_banking/i18n/ro.po | 764 +++++++++++++++++ account_banking/parsers/models.py | 78 ++ account_banking/sepa/__init__.py | 1 + account_banking/sepa/iban.py | 92 +++ account_banking/sepa/online.py | 28 +- account_banking/wizard/bank_import.py | 507 +++++++++--- account_banking/wizard/banktools.py | 49 +- account_banking_nl_clieop/wizard/clieop.py | 12 +- .../wizard/export_clieop.py | 589 +++++++------- account_banking_nl_multibank/multibank.py | 21 +- 21 files changed, 5078 insertions(+), 981 deletions(-) create mode 100644 account_banking/i18n/da.po create mode 100644 account_banking/i18n/es.po create mode 100644 account_banking/i18n/hr.po create mode 100644 account_banking/i18n/ro.po diff --git a/account_banking/__terp__.py b/account_banking/__terp__.py index 56ef55d26..d8d7a0944 100644 --- a/account_banking/__terp__.py +++ b/account_banking/__terp__.py @@ -76,17 +76,12 @@ - Drop-in input parser development. - MultiBank (NL) format transaction files available as account_banking_nl_multibank, - - (todo) MT940 (Swift) format transaction files, - - (todo) CODA (BE) format transaction files, - - (wish) SEPA Credits (ISO 200022) messages, * Extends payments for digital banking: + Adapted workflow in payments to reflect banking operations + Relies on account_payment mechanics to extend with export generators. - ClieOp3 (NL) payment and direct debit orders files available as account_banking_nl_clieop - - (wish) BTL91 (NL) payment orders files (no format description available), - - (wish) SEPA Direct Debits (ISO 200022) messages * Additional features for the import/export mechanism: + Automatic matching and creation of bank accounts, banks and partners, diff --git a/account_banking/account_banking.py b/account_banking/account_banking.py index 73e0c0caf..52e0934bd 100644 --- a/account_banking/account_banking.py +++ b/account_banking/account_banking.py @@ -55,6 +55,7 @@ Modifications are extensive: The import of statements matches the payments and reconciles them when needed, flagging them 'done'. When no export wizards are found, the default behavior is to flag the orders as 'sent', not as 'done'. + Rejected payments from the bank receive on import the status 'rejected'. ''' import time import sys @@ -64,6 +65,10 @@ from tools.translate import _ from wizard.banktools import get_or_create_bank import pooler +def warning(title, message): + '''Convenience routine''' + return {'warning': {'title': title, 'message': message}} + class account_banking_account_settings(osv.osv): '''Default Journal for Bank Account''' _name = 'account.banking.account.settings' @@ -93,6 +98,25 @@ class account_banking_account_settings(osv.osv): 'movements before confirming them.' ), ), + 'costs_account_id': fields.many2one( + 'account.account', 'Bank Costs Account', select=True, + help=('The account to use when the bank invoices its own costs. ' + 'Leave it blank to disable automatic invoice generation ' + 'on bank costs.' + ), + ), + 'invoice_journal_id': fields.many2one( + 'account.journal', 'Costs Journal', + help=('This is the journal used to create invoices for bank costs.' + ), + ), + 'bank_partner_id': fields.many2one( + 'res.partner', 'Bank Partner', + help=('The partner to use for bank costs. Banks are not partners ' + 'by default. You will most likely have to create one.' + ), + ), + #'multi_currency': fields.boolean( # 'Multi Currency Bank Account', required=True, # help=('Select this if your bank account is able to handle ' @@ -102,7 +126,7 @@ class account_banking_account_settings(osv.osv): #), } - def _default_company(self, cursor, uid, context={}): + def _default_company(self, cursor, uid, context=None): user = self.pool.get('res.users').browse(cursor, uid, uid, context=context) if user.company_id: return user.company_id.id @@ -125,12 +149,21 @@ class account_banking_imported_file(osv.osv): 'company_id': fields.many2one('res.company', 'Company', select=True, readonly=True ), - 'date': fields.datetime('Import Date', readonly=False, select=True), - 'format': fields.char('File Format', size=20, readonly=False), - 'file': fields.binary('Raw Data', readonly=False), - 'log': fields.text('Import Log', readonly=False), + 'date': fields.datetime('Import Date', readonly=True, select=True, + states={'draft': [('unfinished', False)]} + ), + 'format': fields.char('File Format', size=20, readonly=True, + states={'draft': [('unfinished', False)]} + ), + 'file': fields.binary('Raw Data', readonly=True, + states={'draft': [('unfinished', False)]} + ), + 'log': fields.text('Import Log', readonly=True, + states={'draft': [('unfinished', False)]} + ), 'user_id': fields.many2one('res.users', 'Responsible User', - readonly=False, select=True + readonly=True, select=True, + states={'draft': [('unfinished', False)]} ), 'state': fields.selection( [('unfinished', 'Unfinished'), @@ -200,7 +233,7 @@ class account_bank_statement(osv.osv): # 'currency': _currency, } - def _get_period(self, cursor, uid, date, context={}): + def _get_period(self, cursor, uid, date, context=None): ''' Find matching period for date, not meant for _defaults. ''' @@ -414,12 +447,12 @@ class account_bank_statement_line(osv.osv): _inherit = 'account.bank.statement.line' _description = 'Bank Transaction' - def _get_period(self, cursor, uid, context={}): + def _get_period(self, cursor, user, context=None): date = context.get('date', None) - periods = self.pool.get('account.period').find(cursor, uid, dt=date) + periods = self.pool.get('account.period').find(cursor, user, dt=date) return periods and periods[0] or False - def _seems_international(self, cursor, uid, context={}): + def _seems_international(self, cursor, user, context=None): ''' Some banks have seperate international banking modules which do not translate correctly into the national formats. Instead, they @@ -439,6 +472,17 @@ class account_bank_statement_line(osv.osv): # company's, its local, else international. # TODO: to be done + def _get_currency(self, cursor, user, context=None): + ''' + Get the default currency (required to allow other modules to function, + which assume currency to be a calculated field and thus optional) + Remark: this is only a fallback as the real default is in the journal, + which is inaccessible from within this method. + ''' + res_users_obj = self.pool.get('res.users') + return res_users_obj.browse(cursor, user, user, + context=context).company_id.currency_id.id + #def _reconcile_amount(self, cursor, user, ids, name, args, context=None): # ''' # Redefinition from the original: don't use the statements currency, but @@ -500,10 +544,11 @@ class account_bank_statement_line(osv.osv): _defaults = { 'period_id': _get_period, 'international': _seems_international, + 'currency': _get_currency, } def onchange_partner_id(self, cursor, uid, line_id, partner_id, type, - currency_id, context={} + currency_id, context=None ): ''' Find default accounts when encoding statements by hand @@ -532,70 +577,6 @@ class account_bank_statement_line(osv.osv): return result and {'value': result} or {} - def write(self, cursor, uid, ids, values, context={}): - # TODO: Not sure what to do with this, as it seems that most of - # this code is related to res_partner_bank and not to this class. - account_numbers = [] - bank_obj = self.pool.get('res.partner.bank') - statement_line_obj = self.pool.get('account.bank.statement.line') - - if 'partner_id' in values: - bank_account_ids = bank_obj.search(cursor, uid, - [('partner_id','=', values['partner_id'])] - ) - bank_accounts = bank_obj.browse(cursor, uid, bank_account_ids) - import_account_numbers = statement_line_obj.browse(cursor, uid, ids) - - for accno in bank_accounts: - # Allow acc_number and iban to co-exist (SEPA will unite the - # two, but - as seen now - in an uneven pace per country) - if accno.acc_number: - account_numbers.append(accno.acc_number) - if accno.iban: - account_numbers.append(accno.iban) - - if any([x for x in import_account_numbers if x.bank_accnumber in - account_numbers]): - for accno in import_account_numbers: - account_data = _get_account_data(accno.bank_accnumber) - if account_data: - bank_id = bank_obj.search(cursor, uid, [ - ('name', '=', account_data['bank_name']) - ]) - if not bank_id: - bank_id = bank_obj.create(cursor, uid, { - 'name': account_data['bank_name'], - 'bic': account_data['bic'], - 'active': 1, - }) - else: - bank_id = bank_id[0] - - bank_acc = bank_obj.create(cursor, uid, { - 'state': 'bank', - 'partner_id': values['partner_id'], - 'bank': bank_id, - 'acc_number': accno.bank_accnumber, - }) - - bank_iban = bank_obj.create(cursor, uid, { - 'state': 'iban', - 'partner_id': values['partner_id'], - 'bank': bank_id, - 'iban': account_data['iban'], - }) - - else: - bank_acc = bank_obj.create(cursor, uid, { - 'state': 'bank', - 'partner_id': values['partner_id'], - 'acc_number': accno.bank_accnumber, - }) - - return super(account_bank_statement_line, self).write( - cursor, uid, ids, values, context - ) - account_bank_statement_line() class payment_type(osv.osv): @@ -621,22 +602,23 @@ class payment_line(osv.osv): ''' Add extra export_state and date_done fields; make destination bank account mandatory, as it makes no sense to send payments into thin air. + Edit: Payments can be by cash too, which is prohibited by mandatory bank + accounts. ''' _inherit = 'payment.line' _columns = { # New fields - 'bank_id': fields.many2one('res.partner.bank', - 'Destination Bank account', - required=True - ), 'export_state': fields.selection([ ('draft', 'Draft'), ('open','Confirmed'), ('cancel','Cancelled'), ('sent', 'Sent'), + ('rejected', 'Rejected'), ('done','Done'), ], 'State', select=True ), + 'msg': fields.char('Message', size=255, required=False, readonly=True), + # Redefined fields: added states 'date_done': fields.datetime('Date Confirmed', select=True, readonly=True), @@ -644,6 +626,7 @@ class payment_line(osv.osv): 'Your Reference', size=64, required=True, states={ 'sent': [('readonly', True)], + 'rejected': [('readonly', True)], 'done': [('readonly', True)] }, ), @@ -655,6 +638,7 @@ class payment_line(osv.osv): ), states={ 'sent': [('readonly', True)], + 'rejected': [('readonly', True)], 'done': [('readonly', True)] }, ), @@ -663,6 +647,7 @@ class payment_line(osv.osv): help='The successor message of Communication.', states={ 'sent': [('readonly', True)], + 'rejected': [('readonly', True)], 'done': [('readonly', True)] }, ), @@ -676,6 +661,7 @@ class payment_line(osv.osv): ), states={ 'sent': [('readonly', True)], + 'rejected': [('readonly', True)], 'done': [('readonly', True)] }, ), @@ -685,6 +671,7 @@ class payment_line(osv.osv): help='Payment amount in the partner currency', states={ 'sent': [('readonly', True)], + 'rejected': [('readonly', True)], 'done': [('readonly', True)] }, ), @@ -692,6 +679,7 @@ class payment_line(osv.osv): 'res.currency', 'Partner Currency', required=True, states={ 'sent': [('readonly', True)], + 'rejected': [('readonly', True)], 'done': [('readonly', True)] }, ), @@ -699,6 +687,7 @@ class payment_line(osv.osv): 'res.partner.bank', 'Destination Bank account', states={ 'sent': [('readonly', True)], + 'rejected': [('readonly', True)], 'done': [('readonly', True)] }, ), @@ -707,6 +696,7 @@ class payment_line(osv.osv): ondelete='cascade', select=True, states={ 'sent': [('readonly', True)], + 'rejected': [('readonly', True)], 'done': [('readonly', True)] }, ), @@ -715,6 +705,7 @@ class payment_line(osv.osv): help='The Ordering Customer', states={ 'sent': [('readonly', True)], + 'rejected': [('readonly', True)], 'done': [('readonly', True)] }, ), @@ -725,6 +716,7 @@ class payment_line(osv.osv): ), states={ 'sent': [('readonly', True)], + 'rejected': [('readonly', True)], 'done': [('readonly', True)] }, ), @@ -734,6 +726,7 @@ class payment_line(osv.osv): ], 'Communication Type', required=True, states={ 'sent': [('readonly', True)], + 'rejected': [('readonly', True)], 'done': [('readonly', True)] }, ), @@ -741,12 +734,13 @@ class payment_line(osv.osv): _defaults = { 'export_state': lambda *a: 'draft', 'date_done': lambda *a: False, + 'msg': lambda *a: '', } payment_line() class payment_order(osv.osv): ''' - Enable extra state for payment exports + Enable extra states for payment exports ''' _inherit = 'payment.order' _columns = { @@ -754,6 +748,7 @@ class payment_order(osv.osv): 'Scheduled date if fixed', states={ 'sent': [('readonly', True)], + 'rejected': [('readonly', True)], 'done': [('readonly', True)] }, help='Select a date if you have chosen Preferred Date to be fixed.' @@ -762,6 +757,7 @@ class payment_order(osv.osv): 'Reference', size=128, required=True, states={ 'sent': [('readonly', True)], + 'rejected': [('readonly', True)], 'done': [('readonly', True)] }, ), @@ -769,6 +765,7 @@ class payment_order(osv.osv): 'payment.mode', 'Payment mode', select=True, required=True, states={ 'sent': [('readonly', True)], + 'rejected': [('readonly', True)], 'done': [('readonly', True)] }, help='Select the Payment Mode to be applied.' @@ -778,6 +775,7 @@ class payment_order(osv.osv): ('open','Confirmed'), ('cancel','Cancelled'), ('sent', 'Sent'), + ('rejected', 'Rejected'), ('done','Done'), ], 'State', select=True ), @@ -785,6 +783,7 @@ class payment_order(osv.osv): 'payment.line', 'order_id', 'Payment lines', states={ 'sent': [('readonly', True)], + 'rejected': [('readonly', True)], 'done': [('readonly', True)] }, ), @@ -792,6 +791,7 @@ class payment_order(osv.osv): 'res.users','User', required=True, states={ 'sent': [('readonly', True)], + 'rejected': [('readonly', True)], 'done': [('readonly', True)] }, ), @@ -802,6 +802,7 @@ class payment_order(osv.osv): ], "Preferred date", change_default=True, required=True, states={ 'sent': [('readonly', True)], + 'rejected': [('readonly', True)], 'done': [('readonly', True)] }, help=("Choose an option for the Payment Order:'Fixed' stands for a " @@ -812,33 +813,70 @@ class payment_order(osv.osv): ), } - def set_to_draft(self, cr, uid, ids, *args): + def _write_payment_lines(self, cursor, uid, ids, **kwargs): + ''' + ORM method for setting attributes of corresponding payment.line objects. + Note that while this is ORM compliant, it is also very ineffecient due + to the absence of filters on writes and hence the requirement to + filter on the client(=OpenERP server) side. + ''' + payment_line_obj = self.pool.get('payment.line') + line_ids = payment_line_obj.search( + cursor, uid, [ + ('order_id', 'in', ids) + ]) + payment_line_obj.write(cursor, uid, line_ids, kwargs) + + def set_to_draft(self, cursor, uid, ids, *args): + self._write_payment_lines(cursor, uid, ids, export_state='draft') + ''' cr.execute("UPDATE payment_line " "SET export_state = 'draft' " "WHERE order_id in (%s)" % ( ','.join(map(str, ids)) )) + ''' return super(payment_order, self).set_to_draft( cr, uid, ids, *args ) def action_sent(self, cr, uid, ids, *args): + self._write_payment_lines(cursor, uid, ids, export_state='sent') + ''' cr.execute("UPDATE payment_line " "SET export_state = 'sent' " "WHERE order_id in (%s)" % ( ','.join(map(str, ids)) )) + ''' + return True + + def action_rejected(self, cr, uid, ids, *args): + self._write_payment_lines(cursor, uid, ids, export_state='rejected') + ''' + cr.execute("UPDATE payment_line " + "SET export_state = 'rejected' " + "WHERE order_id in (%s)" % ( + ','.join(map(str, ids)) + )) + ''' return True def set_done(self, cr, uid, id, *args): ''' Extend standard transition to update children as well. ''' + self._write_payment_lines(cursor, uid, ids, + export_state='done', + date_done=time.strftime('%Y-%m-%d') + ) + ''' cr.execute("UPDATE payment_line " "SET export_state = 'done', date_done = '%s' " "WHERE order_id = %s" % ( time.strftime('%Y-%m-%d'), id )) + ''' return super(payment_order, self).set_done( cr, uid, id, *args ) @@ -859,6 +897,8 @@ class res_partner_bank(osv.osv): 4. Storage is uppercase, not lowercase 5. Presentation is formal IBAN 6. BBAN's are generated from IBAN when possible + 7. In the absence of online databanks, BBAN's are checked on format + using IBAN specs. ''' _inherit = 'res.partner.bank' _columns = { @@ -885,12 +925,14 @@ class res_partner_bank(osv.osv): def init(self, cursor): ''' Update existing iban accounts to comply to new regime + Note that usage of the ORM is not possible here, as the ORM cannot + search on values not provided by the client. ''' - cursor.execute('select id, acc_number, iban ' - 'from res_partner_bank ' - 'where ' - 'upper(iban) != iban or ' - 'acc_number is NULL' + cursor.execute('SELECT id, acc_number, iban ' + 'FROM res_partner_bank ' + 'WHERE ' + 'upper(iban) != iban OR ' + 'acc_number IS NULL' ) for id, acc_number, iban in cursor.fetchall(): new_iban = new_acc_number = False @@ -902,33 +944,39 @@ class res_partner_bank(osv.osv): elif iban != iban.upper(): new_iban = iban.upper if iban != new_iban or new_acc_number != acc_number: - cursor.execute("update res_partner_bank " - "set iban = '%s', acc_number = '%s' " - "where id = %s" % ( + cursor.execute("UPDATE res_partner_bank " + "SET iban = '%s', acc_number = '%s' " + "WHERE id = %s" % ( new_iban, new_acc_number, id )) - def create(self, cursor, uid, vals, context={}): + @staticmethod + def _correct_IBAN(vals): ''' - Create dual function IBAN account for SEPA countries + Routine to correct IBAN values and deduce localized values when valid. Note: No check on validity IBAN/Country ''' if 'iban' in vals and vals['iban']: iban = sepa.IBAN(vals['iban']) vals['iban'] = str(iban) vals['acc_number'] = iban.localized_BBAN - return self._founder.create(self, cursor, uid, vals, context) + return vals - def write(self, cursor, uid, ids, vals, context={}): + def create(self, cursor, uid, vals, context=None): ''' Create dual function IBAN account for SEPA countries - Note: No check on validity IBAN/Country ''' - if 'iban' in vals and vals['iban']: - iban = sepa.IBAN(vals['iban']) - vals['iban'] = str(iban) - vals['acc_number'] = iban.localized_BBAN - return self._founder.write(self, cursor, uid, ids, vals, context) + return self._founder.create(self, cursor, uid, + self._correct_IBAN(vals), context + ) + + def write(self, cursor, uid, ids, vals, context=None): + ''' + Create dual function IBAN account for SEPA countries + ''' + return self._founder.write(self, cursor, uid, ids, + self._correct_IBAN(vals), context + ) def search(self, cursor, uid, args, *rest, **kwargs): ''' @@ -1010,11 +1058,10 @@ class res_partner_bank(osv.osv): Check IBAN number ''' for bank_acc in self.browse(cursor, uid, ids): - if not bank_acc.iban: - continue - iban = sepa.IBAN(bank_acc.iban) - if not iban.valid: - return False + if bank_acc.iban: + iban = sepa.IBAN(bank_acc.iban) + if not iban.valid: + return False return True def get_bban_from_iban(self, cursor, uid, ids, context=None): @@ -1032,8 +1079,8 @@ class res_partner_bank(osv.osv): res[record_id] = False return res - def onchange_acc_number(self, cursor, uid, ids, acc_number, partner_id, - country_id, context={} + def onchange_acc_number(self, cursor, uid, ids, acc_number, + partner_id, country_id, context=None ): ''' Trigger to find IBAN. When found: @@ -1044,44 +1091,92 @@ class res_partner_bank(osv.osv): return {} values = {} - # Pre fill country based on partners address country_obj = self.pool.get('res.country') - partner_obj = self.pool.get('res.partner') - if (not country_id) and partner_id: - country = partner_obj.browse(cursor, uid, partner_id).country - country_ids = [country.id] - elif country_id: + country_ids = [] + + # Pre fill country based on available data. This is just a default + # which can be overridden by the user. + # 1. Use provided country_id (manually filled) + if country_id: country = country_obj.browse(cursor, uid, country_id) country_ids = [country_id] - else: - # Without country, there is no way to identify the right online - # interface to get IBAN accounts... - return {} + # 2. Use country_id of found bank accounts + # This can be usefull when there is no country set in the partners + # addresses, but there was a country set in the address for the bank + # account itself before this method was triggered. + elif ids and len(ids) == 1: + partner_bank_obj = self.pool.get('res.partner.bank') + partner_bank_id = partner_bank_obj.browse(cursor, uid, ids[0]) + if partner_bank_id.country_id: + country = partner_bank_id.country_id + country_ids = [country.id] + # 3. Use country_id of default address of partner + # The country_id of a bank account is a one time default on creation. + # It originates in the same address we are about to check, but + # modifications on that address afterwards are not transfered to the + # bank account, hence the additional check. + elif partner_id: + partner_obj = self.pool.get('res.partner') + country = partner_obj.browse(cursor, uid, partner_id).country + country_ids = [country.id] + # 4. Without any of the above, take the country from the company of + # the handling user + if not country_ids: + user = self.pool.get('res.users').browse(cursor, uid, uid) + if user.address_id and user.address_id.country_id: + country = user.address_id.country_id + country_ids = [country.id] + else: + # Ok, tried everything, give up and leave it to the user + return warning(_('Insufficient data'), + _('Insufficient data to select online ' + 'conversion database') + ) + result = {'value': values} # Complete data with online database when available if country.code in sepa.IBAN.countries: - info = sepa.online.account_info(country.code, acc_number) - if info: - iban_acc = sepa.IBAN(info.iban) - if iban_acc.valid: - values['acc_number'] = iban_acc.localized_BBAN - values['iban'] = unicode(iban_acc) - bank_id, country_id = get_or_create_bank( - self.pool, cursor, uid, - info.bic or iban_acc.BIC_searchkey, - code = info.code, name = info.bank - ) - values['country_id'] = country_id or \ - country_ids and country_ids[0] or \ - False - values['bank'] = bank_id or False + try: + info = sepa.online.account_info(country.code, acc_number) + if info: + iban_acc = sepa.IBAN(info.iban) + if iban_acc.valid: + values['acc_number'] = iban_acc.localized_BBAN + values['iban'] = unicode(iban_acc) + bank_id, country_id = get_or_create_bank( + self.pool, cursor, uid, + info.bic or iban_acc.BIC_searchkey, + code = info.code, name = info.bank + ) + values['country_id'] = country_id or \ + country_ids and country_ids[0] or \ + False + values['bank'] = bank_id or False + else: + info = None + if info is None: + result.update(warning( + _('Invalid data'), + _('The account number appears to be invalid for %(country)s') + % {'country': country.name} + )) + except NotImplementedError: + if country.code in sepa.IBAN.countries: + acc_number_fmt = sepa.BBAN(acc_number, country.code) + if acc_number_fmt.valid: + values['acc_number'] = str(acc_number_fmt) + else: + values['acc_number'] = acc_number + result.update(warning( + _('Invalid format'), + _('The account number has the wrong format for %(country)s') + % {'country': country.name} + )) else: - info = None - if not info: - values['acc_number'] = acc_number - return {'value': values} + values['acc_number'] = acc_number + return result - def onchange_iban(self, cursor, uid, ids, iban, context={}): + def onchange_iban(self, cursor, uid, ids, iban, context=None): ''' Trigger to verify IBAN. When valid: 1. Extract BBAN as local account @@ -1097,19 +1192,19 @@ class res_partner_bank(osv.osv): code=iban_acc.BIC_searchkey ) return { - 'value': { - 'acc_number': iban_acc.localized_BBAN, - 'iban': unicode(iban_acc), - 'country': country_id or False, - 'bank': bank_id or False, - } + 'value': dict( + acc_number = iban_acc.localized_BBAN, + iban = unicode(iban_acc), + country = country_id or False, + bank = bank_id or False, + ) } - raise osv.except_osv(_('Invalid IBAN account number!'), - _("The IBAN number doesn't seem to be correct") - ) + return warning(_('Invalid IBAN account number!'), + _("The IBAN number doesn't seem to be correct") + ) _constraints = [ - (check_iban, "The IBAN number doesn't seem to be correct", ["iban"]) + (check_iban, _("The IBAN number doesn't seem to be correct"), ["iban"]) ] res_partner_bank() @@ -1120,7 +1215,8 @@ class res_bank(osv.osv): online SWIFT database. Allow hand filled names to overrule SWIFT names. ''' _inherit = 'res.bank' - def onchange_bic(self, cursor, uid, ids, bic, name, context={}): + + def onchange_bic(self, cursor, uid, ids, bic, name, context=None): ''' Trigger to auto complete other fields. ''' @@ -1140,19 +1236,19 @@ class res_bank(osv.osv): country_id = False return { - 'value': { + 'value': dict( # Only the first eight positions of BIC are used for bank # transfers, so ditch the rest. - 'bic': info.bic[:8], - 'code': info.code, - 'street': address.street, - 'street2': + bic = info.bic[:8], + code = info.code, + street = address.street, + street2 = address.has_key('street2') and address.street2 or False, - 'zip': address.zip, - 'city': address.city, - 'country': country_id, - 'name': name and name or info.name, - } + zip = address.zip, + city = address.city, + country = country_id, + name = name and name or info.name, + ) } res_bank() diff --git a/account_banking/account_banking_view.xml b/account_banking/account_banking_view.xml index 5c808f62e..815cbf5b2 100644 --- a/account_banking/account_banking_view.xml +++ b/account_banking/account_banking_view.xml @@ -41,11 +41,15 @@
- + + + + + @@ -56,7 +60,7 @@ - + @@ -207,8 +211,7 @@ - account.bank.statement.form.banking-4 @@ -222,6 +225,33 @@ + + + account.bank.statement.form.banking-5 + + account.bank.statement + form + + + + + + + + account.bank.statement.form.banking-6 + + account.bank.statement + form + + + + + + + account.bank.statement.form.banking-4 @@ -235,7 +265,7 @@ - + account.payment.order.form.banking-1 @@ -271,7 +301,7 @@ form - + @@ -295,7 +325,7 @@ form - + @@ -306,7 +336,7 @@ form - + diff --git a/account_banking/account_banking_workflow.xml b/account_banking/account_banking_workflow.xml index d1a2b4a6f..eca49415b 100644 --- a/account_banking/account_banking_workflow.xml +++ b/account_banking/account_banking_workflow.xml @@ -14,12 +14,26 @@ write({'state':'sent'}) function + + + rejected + + action_rejected() +write({'state':'rejected'}) + function + done + + + + + rejected + diff --git a/account_banking/data/account_banking_data.xml b/account_banking/data/account_banking_data.xml index 547499be3..e17221a52 100644 --- a/account_banking/data/account_banking_data.xml +++ b/account_banking/data/account_banking_data.xml @@ -11,5 +11,17 @@ + + + country_id + + + + diff --git a/account_banking/i18n/account_banking.pot b/account_banking/i18n/account_banking.pot index 9aa54a441..292a8db4f 100644 --- a/account_banking/i18n/account_banking.pot +++ b/account_banking/i18n/account_banking.pot @@ -4,10 +4,10 @@ # msgid "" msgstr "" -"Project-Id-Version: OpenERP Server 5.0.7\n" +"Project-Id-Version: OpenERP Server 5.0.11\n" "Report-Msgid-Bugs-To: support@openerp.com\n" -"POT-Creation-Date: 2010-02-19 16:17:51+0000\n" -"PO-Revision-Date: 2010-02-19 16:17:51+0000\n" +"POT-Creation-Date: 2010-06-29 14:33:53+0000\n" +"PO-Revision-Date: 2010-06-29 14:33:53+0000\n" "Last-Translator: <>\n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -15,6 +15,12 @@ msgstr "" "Content-Transfer-Encoding: \n" "Plural-Forms: \n" +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "Number of bank costs invoices created" +msgstr "" + #. module: account_banking #: wizard_view:account_banking.banking_import,view_error:0 #: wizard_view:account_banking.banking_import,view_statements:0 @@ -32,6 +38,12 @@ msgstr "" msgid "Select the processing details:" msgstr "" +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "Invalid format" +msgstr "" + #. module: account_banking #: constraint:ir.actions.act_window:0 msgid "Invalid model name in the action definition." @@ -53,8 +65,14 @@ msgstr "" msgid "_Close" msgstr "" +#. module: account_banking +#: field:account.banking.account.settings,bank_partner_id:0 +msgid "Bank Partner" +msgstr "" + #. module: account_banking #: model:ir.model,name:account_banking.model_account_banking_account_settings +#: model:ir.model,name:account_banking.model_account_banking_bank_journal msgid "Default Journal for Bank Account" msgstr "" @@ -92,6 +110,11 @@ msgstr "" msgid "Bank account %(account_no)s was not found in the database" msgstr "" +#. module: account_banking +#: view:account.banking.account.settings:0 +msgid "Generation of Bank Costs Invoices" +msgstr "" + #. module: account_banking #: code:addons/account_banking/wizard/bank_import.py:0 #, python-format @@ -105,6 +128,18 @@ msgid "The expected balance (%.2f) is different '\n" " 'than the computed one. (%.2f)" msgstr "" +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "Unable to link transaction id %(trans)s (ref: %(ref)s) to invoice: '\n" +" '%(no_candidates)s candidates found; can't choose." +msgstr "" + +#. module: account_banking +#: field:account.banking.account.settings,invoice_journal_id:0 +msgid "Costs Journal" +msgstr "" + #. module: account_banking #: code:addons/account_banking/wizard/bank_import.py:0 #, python-format @@ -133,11 +168,24 @@ msgstr "" msgid "Unable to import parser %(parser)s. Parser class not found." msgstr "" +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "Insufficient data" +msgstr "" + #. module: account_banking #: selection:payment.line,export_state:0 msgid "Cancelled" msgstr "" +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "Insufficient data to select online '\n" +" 'conversion database" +msgstr "" + #. module: account_banking #: view:account.banking.imported.file:0 #: field:account.banking.imported.file,statement_ids:0 @@ -155,16 +203,6 @@ msgstr "" msgid "Unknown Bank" msgstr "" -#. module: account_banking -#: wizard_button:account_banking.banking_import,init,end:0 -msgid "_Cancel" -msgstr "" - -#. module: account_banking -#: selection:payment.line,export_state:0 -msgid "Draft" -msgstr "" - #. module: account_banking #: field:account.banking.imported.file,date:0 msgid "Import Date" @@ -220,10 +258,8 @@ msgid "Bank Transaction ID" msgstr "" #. module: account_banking -#: code:addons/account_banking/wizard/bank_import.py:0 -#, python-format -msgid "Unable to link transaction %(trans)s to invoice: '\n" -" '%(no_candidates)s candidates found; can't choose." +#: help:account.banking.account.settings,invoice_journal_id:0 +msgid "This is the journal used to create invoices for bank costs." msgstr "" #. module: account_banking @@ -237,6 +273,11 @@ msgstr "" msgid "Sent" msgstr "" +#. module: account_banking +#: help:account.banking.account.settings,costs_account_id:0 +msgid "The account to use when the bank invoices its own costs. Leave it blank to disable automatic invoice generation on bank costs." +msgstr "" + #. module: account_banking #: code:addons/account_banking/account_banking.py:0 #, python-format @@ -246,7 +287,17 @@ msgstr "" #. module: account_banking #: code:addons/account_banking/account_banking.py:0 #, python-format -msgid "The account entries lines are not in valid state." +msgid "Invalid data" +msgstr "" + +#. module: account_banking +#: model:res.partner.bank.type.field,name:account_banking.bank_normal_field_contry +msgid "country_id" +msgstr "" + +#. module: account_banking +#: selection:payment.line,export_state:0 +msgid "Rejected" msgstr "" #. module: account_banking @@ -268,12 +319,6 @@ msgid "The Transactions File to import. Please note that while it is perfectly s "To stay on the safe side, always load bank statements files using the same format." msgstr "" -#. module: account_banking -#: field:account.banking.imported.file,state:0 -#: field:payment.line,export_state:0 -msgid "State" -msgstr "" - #. module: account_banking #: code:addons/account_banking/sepa/bbantoiban.py:0 #, python-format @@ -290,6 +335,70 @@ msgstr "" msgid "Imported Bank Statements" msgstr "" +#. module: account_banking +#: wizard_button:account_banking.banking_import,init,end:0 +msgid "_Cancel" +msgstr "" + +#. module: account_banking +#: model:ir.module.module,description:account_banking.module_meta_information +msgid "\n" +" Module to do banking.\n" +"\n" +" Note: This module is depending on BeautifulSoup.\n" +"\n" +" This modules tries to combine all current banking import and export\n" +" schemes. Rationale for this is that it is quite common to have foreign\n" +" bank account numbers next to national bank account numbers. The current\n" +" approach, which hides the national banking interface schemes in the\n" +" l10n_xxx modules, makes it very difficult to use these simultanious.\n" +" A more banking oriented approach seems more logical and cleaner.\n" +"\n" +" Changes to default OpenERP:\n" +"\n" +" * Puts focus on the real life messaging with banks:\n" +" + Bank statement lines upgraded to independent bank transactions.\n" +" + Banking statements have no special accountancy meaning, they're just\n" +" message envelopes for a number of bank transactions.\n" +" + Bank statements can be either encoded by hand to reflect the document\n" +" version of Bank Statements, or created as an optional side effect of\n" +" importing Bank Transactions.\n" +"\n" +" * Preparations for SEPA:\n" +" + IBAN accounts are the standard in the SEPA countries\n" +" + local accounts are derived from SEPA (excluding Turkey) but are\n" +" considered to be identical to the corresponding SEPA account.\n" +" + Banks are identified with either Country + Bank code + Branch code or BIC\n" +" + Each bank can have its own pace in introducing SEPA into their\n" +" communication with their customers.\n" +" + National online databases can be used to convert BBAN's to IBAN's.\n" +" + The SWIFT database is consulted for bank information.\n" +"\n" +" * Adds dropin extensible import facility for bank communication in:\n" +" - Drop-in input parser development.\n" +" - MultiBank (NL) format transaction files available as\n" +" account_banking_nl_multibank,\n" +"\n" +" * Extends payments for digital banking:\n" +" + Adapted workflow in payments to reflect banking operations\n" +" + Relies on account_payment mechanics to extend with export generators.\n" +" - ClieOp3 (NL) payment and direct debit orders files available as\n" +" account_banking_nl_clieop\n" +"\n" +" * Additional features for the import/export mechanism:\n" +" + Automatic matching and creation of bank accounts, banks and partners,\n" +" during import of statements.\n" +" + Automatic matching with invoices and payments.\n" +" + Sound import mechanism, allowing multiple imports of the same\n" +" transactions repeated over multiple files.\n" +" + Journal configuration per bank account.\n" +" + Business logic and format parsing strictly separated to ease the\n" +" development of new parsers.\n" +" + No special configuration needed for the parsers, new parsers are\n" +" recognized and made available at server (re)start.\n" +" " +msgstr "" + #. module: account_banking #: wizard_view:account_banking.banking_import,init:0 #: wizard_view:account_banking.banking_import,view_error:0 @@ -315,10 +424,9 @@ msgid "More then one possible match found for partner with name %(name)s" msgstr "" #. module: account_banking -#: code:addons/account_banking/wizard/bank_import.py:0 -#, python-format -msgid "Statement for account %(bank_account)s uses different '\n" -" 'currency than the defined bank journal." +#: field:account.banking.imported.file,state:0 +#: field:payment.line,export_state:0 +msgid "State" msgstr "" #. module: account_banking @@ -327,11 +435,27 @@ msgstr "" msgid "ERROR!" msgstr "" +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "The account number has the wrong format for %(country)s" +msgstr "" + #. module: account_banking #: field:account.bank.statement.line,currency:0 msgid "Currency" msgstr "" +#. module: account_banking +#: field:account.banking.imported.file,file:0 +msgid "Raw Data" +msgstr "" + +#. module: account_banking +#: field:payment.line,msg:0 +msgid "Message" +msgstr "" + #. module: account_banking #: field:account.banking.account.settings,company_id:0 #: field:account.banking.imported.file,company_id:0 @@ -346,8 +470,9 @@ msgid "Log" msgstr "" #. module: account_banking -#: field:account.banking.imported.file,file:0 -msgid "Raw Data" +#: code:addons/account_banking/parsers/models.py:0 +#, python-format +msgid "Invalid value for transfer_type" msgstr "" #. module: account_banking @@ -391,6 +516,13 @@ msgstr "" msgid "Import Log" msgstr "" +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "Statement for account %(bank_account)s uses different '\n" +" 'currency than the defined bank journal." +msgstr "" + #. module: account_banking #: code:addons/account_banking/wizard/banktools.py:0 #, python-format @@ -518,11 +650,21 @@ msgstr "" msgid "Journal" msgstr "" +#. module: account_banking +#: field:account.banking.account.settings,costs_account_id:0 +msgid "Bank Costs Account" +msgstr "" + #. module: account_banking #: selection:account.banking.imported.file,state:0 msgid "Finished" msgstr "" +#. module: account_banking +#: selection:payment.line,export_state:0 +msgid "Draft" +msgstr "" + #. module: account_banking #: view:account.banking.account.settings:0 msgid "Bank Account Details" @@ -541,67 +683,9 @@ msgid "Number of transactions loaded" msgstr "" #. module: account_banking -#: model:ir.module.module,description:account_banking.module_meta_information -msgid "\n" -" Module to do banking.\n" -"\n" -" Note: This module is depending on BeautifulSoup.\n" -"\n" -" This modules tries to combine all current banking import and export\n" -" schemes. Rationale for this is that it is quite common to have foreign\n" -" bank account numbers next to national bank account numbers. The current\n" -" approach, which hides the national banking interface schemes in the\n" -" l10n_xxx modules, makes it very difficult to use these simultanious.\n" -" A more banking oriented approach seems more logical and cleaner.\n" -"\n" -" Changes to default OpenERP:\n" -"\n" -" * Puts focus on the real life messaging with banks:\n" -" + Bank statement lines upgraded to independent bank transactions.\n" -" + Banking statements have no special accountancy meaning, they're just\n" -" message envelopes for a number of bank transactions.\n" -" + Bank statements can be either encoded by hand to reflect the document\n" -" version of Bank Statements, or created as an optional side effect of\n" -" importing Bank Transactions.\n" -"\n" -" * Preparations for SEPA:\n" -" + IBAN accounts are the standard in the SEPA countries\n" -" + local accounts are derived from SEPA (excluding Turkey) but are\n" -" considered to be identical to the corresponding SEPA account.\n" -" + Banks are identified with either Country + Bank code + Branch code or BIC\n" -" + Each bank can have its own pace in introducing SEPA into their\n" -" communication with their customers.\n" -" + National online databases can be used to convert BBAN's to IBAN's.\n" -" + The SWIFT database is consulted for bank information.\n" -"\n" -" * Adds dropin extensible import facility for bank communication in:\n" -" - Drop-in input parser development.\n" -" - MultiBank (NL) format transaction files available as\n" -" account_banking_nl_multibank,\n" -" - (todo) MT940 (Swift) format transaction files,\n" -" - (todo) CODA (BE) format transaction files,\n" -" - (wish) SEPA Credits (ISO 200022) messages,\n" -"\n" -" * Extends payments for digital banking:\n" -" + Adapted workflow in payments to reflect banking operations\n" -" + Relies on account_payment mechanics to extend with export generators.\n" -" - ClieOp3 (NL) payment and direct debit orders files available as\n" -" account_banking_nl_clieop\n" -" - (wish) BTL91 (NL) payment orders files (no format description available),\n" -" - (wish) SEPA Direct Debits (ISO 200022) messages\n" -"\n" -" * Additional features for the import/export mechanism:\n" -" + Automatic matching and creation of bank accounts, banks and partners,\n" -" during import of statements.\n" -" + Automatic matching with invoices and payments.\n" -" + Sound import mechanism, allowing multiple imports of the same\n" -" transactions repeated over multiple files.\n" -" + Journal configuration per bank account.\n" -" + Business logic and format parsing strictly separated to ease the\n" -" development of new parsers.\n" -" + No special configuration needed for the parsers, new parsers are\n" -" recognized and made available at server (re)start.\n" -" " +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "The account number appears to be invalid for %(country)s" msgstr "" #. module: account_banking @@ -609,6 +693,23 @@ msgstr "" msgid "acc_number" msgstr "" +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "Number of transactions matched" +msgstr "" + +#. module: account_banking +#: help:account.banking.account.settings,bank_partner_id:0 +msgid "The partner to use for bank costs. Banks are not partners by default. You will most likely have to create one." +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "The account entries lines are not in valid state." +msgstr "" + #. module: account_banking #: model:ir.model,name:account_banking.model_account_banking_imported_file msgid "Imported Bank Statements File" diff --git a/account_banking/i18n/da.po b/account_banking/i18n/da.po new file mode 100644 index 000000000..67a806c2c --- /dev/null +++ b/account_banking/i18n/da.po @@ -0,0 +1,752 @@ +# 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: support@openerp.com\n" +"POT-Creation-Date: 2010-06-29 14:33:53+0000\n" +"PO-Revision-Date: 2010-02-06 14:36+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" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, fuzzy, python-format +msgid "Number of bank costs invoices created" +msgstr "Totalt antal transaktioner" + +#. module: account_banking +#: wizard_view:account_banking.banking_import,view_error:0 +#: wizard_view:account_banking.banking_import,view_statements:0 +msgid "Results:" +msgstr "Resultater:" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "Number of errors found" +msgstr "Antal fejl fundet" + +#. module: account_banking +#: wizard_view:account_banking.banking_import,init:0 +msgid "Select the processing details:" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "Invalid format" +msgstr "" + +#. module: account_banking +#: constraint:ir.actions.act_window:0 +msgid "Invalid model name in the action definition." +msgstr "" + +#. module: account_banking +#: field:payment.line,date_done:0 +msgid "Date Confirmed" +msgstr "Dato bekræftet" + +#. module: account_banking +#: wizard_button:account_banking.banking_import,view_statements,open_statements:0 +msgid "_View Statements" +msgstr "" + +#. module: account_banking +#: wizard_button:account_banking.banking_import,view_error,end:0 +#: wizard_button:account_banking.banking_import,view_statements,end:0 +msgid "_Close" +msgstr "_Luk" + +#. module: account_banking +#: field:account.banking.account.settings,bank_partner_id:0 +msgid "Bank Partner" +msgstr "" + +#. module: account_banking +#: model:ir.model,name:account_banking.model_account_banking_account_settings +#: model:ir.model,name:account_banking.model_account_banking_bank_journal +msgid "Default Journal for Bank Account" +msgstr "" + +#. module: account_banking +#: wizard_field:account_banking.banking_import,init,file:0 +msgid "Statements File" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/wizard/banktools.py:0 +#, python-format +msgid "" +"More than one bank account was found with the same number %(account_no)s" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "Total number of transactions" +msgstr "Totalt antal transaktioner" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "Account move line \"%s\" is not valid" +msgstr "" + +#. module: account_banking +#: help:account.banking.account.settings,default_debit_account_id:0 +msgid "" +"The account to use when an unexpected payment is received. This can be " +"needed when a customer pays in advance or when no matching invoice can be " +"found. Mind that you can correct movements before confirming them." +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/wizard/banktools.py:0 +#, python-format +msgid "Bank account %(account_no)s was not found in the database" +msgstr "" + +#. module: account_banking +#: view:account.banking.account.settings:0 +msgid "Generation of Bank Costs Invoices" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "Number of transactions skipped due to errors" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "" +"The expected balance (%.2f) is different '\n" +" 'than the computed one. (%.2f)" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "" +"Unable to link transaction id %(trans)s (ref: %(ref)s) to invoice: '\n" +" '%(no_candidates)s candidates found; can\'t choose." +msgstr "" + +#. module: account_banking +#: field:account.banking.account.settings,invoice_journal_id:0 +#, fuzzy +msgid "Costs Journal" +msgstr "Journal" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "Number of statements skipped due to errors" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "Invalid IBAN account number!" +msgstr "" + +#. module: account_banking +#: view:account.banking.account.settings:0 +msgid "Default Import Settings for Bank Account" +msgstr "" + +#. module: account_banking +#: help:account.banking.account.settings,default_credit_account_id:0 +msgid "" +"The account to use when an unexpected payment was signaled. This can happen " +"when a direct debit payment is cancelled by a customer, or when no matching " +"payment can be found. Mind that you can correct movements before confirming " +"them." +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "Unable to import parser %(parser)s. Parser class not found." +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "Insufficient data" +msgstr "" + +#. module: account_banking +#: selection:payment.line,export_state:0 +msgid "Cancelled" +msgstr "Annulleret" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "" +"Insufficient data to select online '\n" +" 'conversion database" +msgstr "" + +#. module: account_banking +#: view:account.banking.imported.file:0 +#: field:account.banking.imported.file,statement_ids:0 +msgid "Statements" +msgstr "" + +#. module: account_banking +#: field:account.banking.account.settings,default_debit_account_id:0 +msgid "Default debit account" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/wizard/banktools.py:0 +#, python-format +msgid "Unknown Bank" +msgstr "" + +#. module: account_banking +#: field:account.banking.imported.file,date:0 +msgid "Import Date" +msgstr "Importer dato" + +#. module: account_banking +#: selection:payment.line,export_state:0 +msgid "Confirmed" +msgstr "Bekræftet" + +#. module: account_banking +#: model:ir.actions.act_window,name:account_banking.action_account_banking_res_partner_banks +#: model:ir.ui.menu,name:account_banking.menu_action_account_banking_bank_accounts +msgid "Bank Accounts" +msgstr "" + +#. module: account_banking +#: view:account.banking.account.settings:0 +msgid "Default Accounts for Unknown Movements" +msgstr "" + +#. module: account_banking +#: view:account.bank.statement:0 +msgid "Confirm" +msgstr "Bekræft" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "" +"Statements found for account %(bank_account)s, '\n" +" 'but no default journal was defined." +msgstr "" + +#. module: account_banking +#: field:account.banking.account.settings,default_credit_account_id:0 +msgid "Default credit account" +msgstr "" + +#. module: account_banking +#: field:account.bank.statement.line,international:0 +msgid "International Transaction" +msgstr "International transaktion" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "Please verify that an account is defined in the journal." +msgstr "" + +#. module: account_banking +#: field:account.bank.statement.line,trans:0 +msgid "Bank Transaction ID" +msgstr "Bank transaktion ID" + +#. module: account_banking +#: help:account.banking.account.settings,invoice_journal_id:0 +msgid "This is the journal used to create invoices for bank costs." +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "Statement %(id)s known - skipped" +msgstr "" + +#. module: account_banking +#: selection:payment.line,export_state:0 +msgid "Sent" +msgstr "Sendt" + +#. module: account_banking +#: help:account.banking.account.settings,costs_account_id:0 +msgid "" +"The account to use when the bank invoices its own costs. Leave it blank to " +"disable automatic invoice generation on bank costs." +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "Error !" +msgstr "Fejl !" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "Invalid data" +msgstr "" + +#. module: account_banking +#: model:res.partner.bank.type.field,name:account_banking.bank_normal_field_contry +msgid "country_id" +msgstr "" + +#. module: account_banking +#: selection:payment.line,export_state:0 +msgid "Rejected" +msgstr "" + +#. module: account_banking +#: model:ir.actions.act_window,name:account_banking.action_account_banking_journals +#: model:ir.ui.menu,name:account_banking.menu_action_account_banking_bank_journals +msgid "Default Import Settings for Bank Accounts" +msgstr "" + +#. module: account_banking +#: model:ir.actions.wizard,name:account_banking.wizard_account_banking_import_file +#: model:ir.ui.menu,name:account_banking.menu_account_banking_import_wizard +msgid "Import Bank Statements File" +msgstr "" + +#. module: account_banking +#: help:account_banking.banking_import,init,file:0 +msgid "" +"The Transactions File to import. Please note that while it is perfectly safe " +"to reload the same file multiple times or to load in timeframe overlapping " +"statements files, there are formats that may introduce different sequencing, " +"which may create double entries.\n" +"\n" +"To stay on the safe side, always load bank statements files using the same " +"format." +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/sepa/bbantoiban.py:0 +#, python-format +msgid "This is a stub. Please implement your own code" +msgstr "" + +#. module: account_banking +#: constraint:ir.ui.view:0 +msgid "Invalid XML for View Architecture!" +msgstr "Ugyldig XML for View Architecture!" + +#. module: account_banking +#: view:account.banking.imported.file:0 +msgid "Imported Bank Statements" +msgstr "" + +#. module: account_banking +#: wizard_button:account_banking.banking_import,init,end:0 +msgid "_Cancel" +msgstr "_Annuller" + +#. module: account_banking +#: model:ir.module.module,description:account_banking.module_meta_information +msgid "" +"\n" +" Module to do banking.\n" +"\n" +" Note: This module is depending on BeautifulSoup.\n" +"\n" +" This modules tries to combine all current banking import and export\n" +" schemes. Rationale for this is that it is quite common to have foreign\n" +" bank account numbers next to national bank account numbers. The current\n" +" approach, which hides the national banking interface schemes in the\n" +" l10n_xxx modules, makes it very difficult to use these simultanious.\n" +" A more banking oriented approach seems more logical and cleaner.\n" +"\n" +" Changes to default OpenERP:\n" +"\n" +" * Puts focus on the real life messaging with banks:\n" +" + Bank statement lines upgraded to independent bank transactions.\n" +" + Banking statements have no special accountancy meaning, they're " +"just\n" +" message envelopes for a number of bank transactions.\n" +" + Bank statements can be either encoded by hand to reflect the " +"document\n" +" version of Bank Statements, or created as an optional side effect " +"of\n" +" importing Bank Transactions.\n" +"\n" +" * Preparations for SEPA:\n" +" + IBAN accounts are the standard in the SEPA countries\n" +" + local accounts are derived from SEPA (excluding Turkey) but are\n" +" considered to be identical to the corresponding SEPA account.\n" +" + Banks are identified with either Country + Bank code + Branch code " +"or BIC\n" +" + Each bank can have its own pace in introducing SEPA into their\n" +" communication with their customers.\n" +" + National online databases can be used to convert BBAN's to IBAN's.\n" +" + The SWIFT database is consulted for bank information.\n" +"\n" +" * Adds dropin extensible import facility for bank communication in:\n" +" - Drop-in input parser development.\n" +" - MultiBank (NL) format transaction files available as\n" +" account_banking_nl_multibank,\n" +"\n" +" * Extends payments for digital banking:\n" +" + Adapted workflow in payments to reflect banking operations\n" +" + Relies on account_payment mechanics to extend with export " +"generators.\n" +" - ClieOp3 (NL) payment and direct debit orders files available as\n" +" account_banking_nl_clieop\n" +"\n" +" * Additional features for the import/export mechanism:\n" +" + Automatic matching and creation of bank accounts, banks and " +"partners,\n" +" during import of statements.\n" +" + Automatic matching with invoices and payments.\n" +" + Sound import mechanism, allowing multiple imports of the same\n" +" transactions repeated over multiple files.\n" +" + Journal configuration per bank account.\n" +" + Business logic and format parsing strictly separated to ease the\n" +" development of new parsers.\n" +" + No special configuration needed for the parsers, new parsers are\n" +" recognized and made available at server (re)start.\n" +" " +msgstr "" + +#. module: account_banking +#: wizard_view:account_banking.banking_import,init:0 +#: wizard_view:account_banking.banking_import,view_error:0 +#: wizard_view:account_banking.banking_import,view_statements:0 +msgid "Import Bank Transactions File" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/wizard/banktools.py:0 +#, python-format +msgid "Account %(account_no)s is not owned by %(partner)s" +msgstr "" + +#. module: account_banking +#: wizard_button:account_banking.banking_import,init,import:0 +msgid "_Ok" +msgstr "_Ok" + +#. module: account_banking +#: code:addons/account_banking/wizard/banktools.py:0 +#, python-format +msgid "More then one possible match found for partner with name %(name)s" +msgstr "" + +#. module: account_banking +#: field:account.banking.imported.file,state:0 +#: field:payment.line,export_state:0 +msgid "State" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "ERROR!" +msgstr "FEJL!" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "The account number has the wrong format for %(country)s" +msgstr "" + +#. module: account_banking +#: field:account.bank.statement.line,currency:0 +msgid "Currency" +msgstr "" + +#. module: account_banking +#: field:account.banking.imported.file,file:0 +msgid "Raw Data" +msgstr "Rå data" + +#. module: account_banking +#: field:payment.line,msg:0 +msgid "Message" +msgstr "" + +#. module: account_banking +#: field:account.banking.account.settings,company_id:0 +#: field:account.banking.imported.file,company_id:0 +#: wizard_field:account_banking.banking_import,init,company:0 +msgid "Company" +msgstr "Virksomhed" + +#. module: account_banking +#: wizard_field:account_banking.banking_import,view_error,log:0 +#: wizard_field:account_banking.banking_import,view_statements,log:0 +msgid "Log" +msgstr "Log" + +#. module: account_banking +#: code:addons/account_banking/parsers/models.py:0 +#, python-format +msgid "Invalid value for transfer_type" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "Configration Error !" +msgstr "Konfigurationsfejl !" + +#. module: account_banking +#: model:ir.actions.act_window,name:account_banking.act_account_payment_account_bank_statement +msgid "Bank Statements File" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/parsers/models.py:0 +#, python-format +msgid "This is a stub. Please implement your own." +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/wizard/banktools.py:0 +#, python-format +msgid "No suitable period found for date %(date)s and company %(company_name)s" +msgstr "" + +#. module: account_banking +#: view:account.banking.imported.file:0 +#: model:ir.actions.act_window,name:account_banking.action_account_banking_imported_files +#: model:ir.ui.menu,name:account_banking.menu_action_account_banking_imported_files +msgid "Imported Bank Statements Files" +msgstr "" + +#. module: account_banking +#: field:account.bank.statement,banking_id:0 +msgid "Imported File" +msgstr "Importerede filer" + +#. module: account_banking +#: view:account.banking.imported.file:0 +#: field:account.banking.imported.file,log:0 +msgid "Import Log" +msgstr "Importer log" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "" +"Statement for account %(bank_account)s uses different '\n" +" 'currency than the defined bank journal." +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/wizard/banktools.py:0 +#, python-format +msgid "" +"Multiple overlapping periods for date %(date)s and company %(company_name)s" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "The imported statements appear to be invalid! Check your file." +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "Number of statements loaded" +msgstr "" + +#. module: account_banking +#: model:ir.ui.menu,name:account_banking.menu_finance_banking_actions +#: model:ir.ui.menu,name:account_banking.menu_finance_banking_settings +msgid "Banking" +msgstr "" + +#. module: account_banking +#: selection:account.banking.imported.file,state:0 +msgid "Error" +msgstr "Fejl" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "Total number of statements" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "Unable to reconcile entry \"%s\": %.2f" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/wizard/banktools.py:0 +#, python-format +msgid "" +"No suitable fiscal year found for date %(date)s and company %(company_name)s" +msgstr "" + +#. module: account_banking +#: view:account.banking.imported.file:0 +msgid "Import Details" +msgstr "" + +#. module: account_banking +#: field:account.bank.statement.line,period_id:0 +msgid "Period" +msgstr "Periode" + +#. module: account_banking +#: selection:payment.line,export_state:0 +msgid "Done" +msgstr "Udført" + +#. module: account_banking +#: view:payment.order:0 +msgid "Select Invoices to Pay" +msgstr "Vælg faktura til betaling" + +#. module: account_banking +#: field:account.banking.imported.file,user_id:0 +msgid "Responsible User" +msgstr "Ansvarlig bruger" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "The statement balance is incorrect !\n" +msgstr "" + +#. module: account_banking +#: constraint:ir.model:0 +msgid "" +"The Object name must start with x_ and not contain any special character !" +msgstr "" + +#. module: account_banking +#: selection:account.banking.imported.file,state:0 +msgid "Unfinished" +msgstr "Ikke afsluttet" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "Statements found for unknown account %(bank_account)s" +msgstr "" + +#. module: account_banking +#: model:ir.module.module,shortdesc:account_banking.module_meta_information +msgid "Account Banking" +msgstr "" + +#. module: account_banking +#: wizard_button:account_banking.banking_import,view_error,open_import:0 +msgid "_View Imported File" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "The IBAN number doesn't seem to be correct" +msgstr "" + +#. module: account_banking +#: field:account.banking.imported.file,format:0 +#: wizard_field:account_banking.banking_import,init,parser:0 +msgid "File Format" +msgstr "Filformat" + +#. module: account_banking +#: code:addons/account_banking/wizard/banktools.py:0 +#, python-format +msgid "" +"Multiple overlapping fiscal years found for date %(date)s and company %" +"(company_name)s" +msgstr "" + +#. module: account_banking +#: field:account.banking.account.settings,journal_id:0 +msgid "Journal" +msgstr "Journal" + +#. module: account_banking +#: field:account.banking.account.settings,costs_account_id:0 +#, fuzzy +msgid "Bank Costs Account" +msgstr "Bankkonto" + +#. module: account_banking +#: selection:account.banking.imported.file,state:0 +msgid "Finished" +msgstr "Afsluttet" + +#. module: account_banking +#: selection:payment.line,export_state:0 +msgid "Draft" +msgstr "Udkast" + +#. module: account_banking +#: view:account.banking.account.settings:0 +msgid "Bank Account Details" +msgstr "" + +#. module: account_banking +#: field:account.bank.statement.line,partner_bank_id:0 +#: field:account.banking.account.settings,partner_bank_id:0 +msgid "Bank Account" +msgstr "Bankkonto" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "Number of transactions loaded" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "The account number appears to be invalid for %(country)s" +msgstr "" + +#. module: account_banking +#: model:res.partner.bank.type.field,name:account_banking.bank_acc_number_field +msgid "acc_number" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, fuzzy, python-format +msgid "Number of transactions matched" +msgstr "Totalt antal transaktioner" + +#. module: account_banking +#: help:account.banking.account.settings,bank_partner_id:0 +msgid "" +"The partner to use for bank costs. Banks are not partners by default. You " +"will most likely have to create one." +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "The account entries lines are not in valid state." +msgstr "" + +#. module: account_banking +#: model:ir.model,name:account_banking.model_account_banking_imported_file +msgid "Imported Bank Statements File" +msgstr "" diff --git a/account_banking/i18n/en_US.po b/account_banking/i18n/en_US.po index a2b44866b..db6e6824b 100644 --- a/account_banking/i18n/en_US.po +++ b/account_banking/i18n/en_US.po @@ -4,10 +4,10 @@ # msgid "" msgstr "" -"Project-Id-Version: OpenERP Server 5.0.7\n" +"Project-Id-Version: OpenERP Server 5.0.11\n" "Report-Msgid-Bugs-To: support@openerp.com\n" -"POT-Creation-Date: 2010-02-19 16:17:51+0000\n" -"PO-Revision-Date: 2010-02-19 16:17:51+0000\n" +"POT-Creation-Date: 2010-06-29 14:33:53+0000\n" +"PO-Revision-Date: 2010-06-29 14:33:53+0000\n" "Last-Translator: <>\n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -15,6 +15,12 @@ msgstr "" "Content-Transfer-Encoding: \n" "Plural-Forms: \n" +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "Number of bank costs invoices created" +msgstr "" + #. module: account_banking #: wizard_view:account_banking.banking_import,view_error:0 #: wizard_view:account_banking.banking_import,view_statements:0 @@ -32,6 +38,12 @@ msgstr "" msgid "Select the processing details:" msgstr "" +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "Invalid format" +msgstr "" + #. module: account_banking #: constraint:ir.actions.act_window:0 msgid "Invalid model name in the action definition." @@ -53,8 +65,14 @@ msgstr "" msgid "_Close" msgstr "" +#. module: account_banking +#: field:account.banking.account.settings,bank_partner_id:0 +msgid "Bank Partner" +msgstr "" + #. module: account_banking #: model:ir.model,name:account_banking.model_account_banking_account_settings +#: model:ir.model,name:account_banking.model_account_banking_bank_journal msgid "Default Journal for Bank Account" msgstr "" @@ -92,6 +110,11 @@ msgstr "" msgid "Bank account %(account_no)s was not found in the database" msgstr "" +#. module: account_banking +#: view:account.banking.account.settings:0 +msgid "Generation of Bank Costs Invoices" +msgstr "" + #. module: account_banking #: code:addons/account_banking/wizard/bank_import.py:0 #, python-format @@ -105,6 +128,18 @@ msgid "The expected balance (%.2f) is different '\n" " 'than the computed one. (%.2f)" msgstr "" +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "Unable to link transaction id %(trans)s (ref: %(ref)s) to invoice: '\n" +" '%(no_candidates)s candidates found; can\'t choose." +msgstr "" + +#. module: account_banking +#: field:account.banking.account.settings,invoice_journal_id:0 +msgid "Costs Journal" +msgstr "" + #. module: account_banking #: code:addons/account_banking/wizard/bank_import.py:0 #, python-format @@ -133,11 +168,24 @@ msgstr "" msgid "Unable to import parser %(parser)s. Parser class not found." msgstr "" +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "Insufficient data" +msgstr "" + #. module: account_banking #: selection:payment.line,export_state:0 msgid "Cancelled" msgstr "" +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "Insufficient data to select online '\n" +" 'conversion database" +msgstr "" + #. module: account_banking #: view:account.banking.imported.file:0 #: field:account.banking.imported.file,statement_ids:0 @@ -155,16 +203,6 @@ msgstr "" msgid "Unknown Bank" msgstr "" -#. module: account_banking -#: wizard_button:account_banking.banking_import,init,end:0 -msgid "_Cancel" -msgstr "" - -#. module: account_banking -#: selection:payment.line,export_state:0 -msgid "Draft" -msgstr "" - #. module: account_banking #: field:account.banking.imported.file,date:0 msgid "Import Date" @@ -220,10 +258,8 @@ msgid "Bank Transaction ID" msgstr "" #. module: account_banking -#: code:addons/account_banking/wizard/bank_import.py:0 -#, python-format -msgid "Unable to link transaction %(trans)s to invoice: '\n" -" '%(no_candidates)s candidates found; can\'t choose." +#: help:account.banking.account.settings,invoice_journal_id:0 +msgid "This is the journal used to create invoices for bank costs." msgstr "" #. module: account_banking @@ -237,6 +273,11 @@ msgstr "" msgid "Sent" msgstr "" +#. module: account_banking +#: help:account.banking.account.settings,costs_account_id:0 +msgid "The account to use when the bank invoices its own costs. Leave it blank to disable automatic invoice generation on bank costs." +msgstr "" + #. module: account_banking #: code:addons/account_banking/account_banking.py:0 #, python-format @@ -246,7 +287,17 @@ msgstr "" #. module: account_banking #: code:addons/account_banking/account_banking.py:0 #, python-format -msgid "The account entries lines are not in valid state." +msgid "Invalid data" +msgstr "" + +#. module: account_banking +#: model:res.partner.bank.type.field,name:account_banking.bank_normal_field_contry +msgid "country_id" +msgstr "" + +#. module: account_banking +#: selection:payment.line,export_state:0 +msgid "Rejected" msgstr "" #. module: account_banking @@ -268,12 +319,6 @@ msgid "The Transactions File to import. Please note that while it is perfectly s "To stay on the safe side, always load bank statements files using the same format." msgstr "" -#. module: account_banking -#: field:account.banking.imported.file,state:0 -#: field:payment.line,export_state:0 -msgid "State" -msgstr "" - #. module: account_banking #: code:addons/account_banking/sepa/bbantoiban.py:0 #, python-format @@ -290,6 +335,70 @@ msgstr "" msgid "Imported Bank Statements" msgstr "" +#. module: account_banking +#: wizard_button:account_banking.banking_import,init,end:0 +msgid "_Cancel" +msgstr "" + +#. module: account_banking +#: model:ir.module.module,description:account_banking.module_meta_information +msgid "\n" +" Module to do banking.\n" +"\n" +" Note: This module is depending on BeautifulSoup.\n" +"\n" +" This modules tries to combine all current banking import and export\n" +" schemes. Rationale for this is that it is quite common to have foreign\n" +" bank account numbers next to national bank account numbers. The current\n" +" approach, which hides the national banking interface schemes in the\n" +" l10n_xxx modules, makes it very difficult to use these simultanious.\n" +" A more banking oriented approach seems more logical and cleaner.\n" +"\n" +" Changes to default OpenERP:\n" +"\n" +" * Puts focus on the real life messaging with banks:\n" +" + Bank statement lines upgraded to independent bank transactions.\n" +" + Banking statements have no special accountancy meaning, they're just\n" +" message envelopes for a number of bank transactions.\n" +" + Bank statements can be either encoded by hand to reflect the document\n" +" version of Bank Statements, or created as an optional side effect of\n" +" importing Bank Transactions.\n" +"\n" +" * Preparations for SEPA:\n" +" + IBAN accounts are the standard in the SEPA countries\n" +" + local accounts are derived from SEPA (excluding Turkey) but are\n" +" considered to be identical to the corresponding SEPA account.\n" +" + Banks are identified with either Country + Bank code + Branch code or BIC\n" +" + Each bank can have its own pace in introducing SEPA into their\n" +" communication with their customers.\n" +" + National online databases can be used to convert BBAN's to IBAN's.\n" +" + The SWIFT database is consulted for bank information.\n" +"\n" +" * Adds dropin extensible import facility for bank communication in:\n" +" - Drop-in input parser development.\n" +" - MultiBank (NL) format transaction files available as\n" +" account_banking_nl_multibank,\n" +"\n" +" * Extends payments for digital banking:\n" +" + Adapted workflow in payments to reflect banking operations\n" +" + Relies on account_payment mechanics to extend with export generators.\n" +" - ClieOp3 (NL) payment and direct debit orders files available as\n" +" account_banking_nl_clieop\n" +"\n" +" * Additional features for the import/export mechanism:\n" +" + Automatic matching and creation of bank accounts, banks and partners,\n" +" during import of statements.\n" +" + Automatic matching with invoices and payments.\n" +" + Sound import mechanism, allowing multiple imports of the same\n" +" transactions repeated over multiple files.\n" +" + Journal configuration per bank account.\n" +" + Business logic and format parsing strictly separated to ease the\n" +" development of new parsers.\n" +" + No special configuration needed for the parsers, new parsers are\n" +" recognized and made available at server (re)start.\n" +" " +msgstr "" + #. module: account_banking #: wizard_view:account_banking.banking_import,init:0 #: wizard_view:account_banking.banking_import,view_error:0 @@ -315,10 +424,9 @@ msgid "More then one possible match found for partner with name %(name)s" msgstr "" #. module: account_banking -#: code:addons/account_banking/wizard/bank_import.py:0 -#, python-format -msgid "Statement for account %(bank_account)s uses different '\n" -" 'currency than the defined bank journal." +#: field:account.banking.imported.file,state:0 +#: field:payment.line,export_state:0 +msgid "State" msgstr "" #. module: account_banking @@ -327,11 +435,27 @@ msgstr "" msgid "ERROR!" msgstr "" +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "The account number has the wrong format for %(country)s" +msgstr "" + #. module: account_banking #: field:account.bank.statement.line,currency:0 msgid "Currency" msgstr "" +#. module: account_banking +#: field:account.banking.imported.file,file:0 +msgid "Raw Data" +msgstr "" + +#. module: account_banking +#: field:payment.line,msg:0 +msgid "Message" +msgstr "" + #. module: account_banking #: field:account.banking.account.settings,company_id:0 #: field:account.banking.imported.file,company_id:0 @@ -346,8 +470,9 @@ msgid "Log" msgstr "" #. module: account_banking -#: field:account.banking.imported.file,file:0 -msgid "Raw Data" +#: code:addons/account_banking/parsers/models.py:0 +#, python-format +msgid "Invalid value for transfer_type" msgstr "" #. module: account_banking @@ -391,6 +516,13 @@ msgstr "" msgid "Import Log" msgstr "" +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "Statement for account %(bank_account)s uses different '\n" +" 'currency than the defined bank journal." +msgstr "" + #. module: account_banking #: code:addons/account_banking/wizard/banktools.py:0 #, python-format @@ -518,11 +650,21 @@ msgstr "" msgid "Journal" msgstr "" +#. module: account_banking +#: field:account.banking.account.settings,costs_account_id:0 +msgid "Bank Costs Account" +msgstr "" + #. module: account_banking #: selection:account.banking.imported.file,state:0 msgid "Finished" msgstr "" +#. module: account_banking +#: selection:payment.line,export_state:0 +msgid "Draft" +msgstr "" + #. module: account_banking #: view:account.banking.account.settings:0 msgid "Bank Account Details" @@ -541,67 +683,9 @@ msgid "Number of transactions loaded" msgstr "" #. module: account_banking -#: model:ir.module.module,description:account_banking.module_meta_information -msgid "\n" -" Module to do banking.\n" -"\n" -" Note: This module is depending on BeautifulSoup.\n" -"\n" -" This modules tries to combine all current banking import and export\n" -" schemes. Rationale for this is that it is quite common to have foreign\n" -" bank account numbers next to national bank account numbers. The current\n" -" approach, which hides the national banking interface schemes in the\n" -" l10n_xxx modules, makes it very difficult to use these simultanious.\n" -" A more banking oriented approach seems more logical and cleaner.\n" -"\n" -" Changes to default OpenERP:\n" -"\n" -" * Puts focus on the real life messaging with banks:\n" -" + Bank statement lines upgraded to independent bank transactions.\n" -" + Banking statements have no special accountancy meaning, they're just\n" -" message envelopes for a number of bank transactions.\n" -" + Bank statements can be either encoded by hand to reflect the document\n" -" version of Bank Statements, or created as an optional side effect of\n" -" importing Bank Transactions.\n" -"\n" -" * Preparations for SEPA:\n" -" + IBAN accounts are the standard in the SEPA countries\n" -" + local accounts are derived from SEPA (excluding Turkey) but are\n" -" considered to be identical to the corresponding SEPA account.\n" -" + Banks are identified with either Country + Bank code + Branch code or BIC\n" -" + Each bank can have its own pace in introducing SEPA into their\n" -" communication with their customers.\n" -" + National online databases can be used to convert BBAN's to IBAN's.\n" -" + The SWIFT database is consulted for bank information.\n" -"\n" -" * Adds dropin extensible import facility for bank communication in:\n" -" - Drop-in input parser development.\n" -" - MultiBank (NL) format transaction files available as\n" -" account_banking_nl_multibank,\n" -" - (todo) MT940 (Swift) format transaction files,\n" -" - (todo) CODA (BE) format transaction files,\n" -" - (wish) SEPA Credits (ISO 200022) messages,\n" -"\n" -" * Extends payments for digital banking:\n" -" + Adapted workflow in payments to reflect banking operations\n" -" + Relies on account_payment mechanics to extend with export generators.\n" -" - ClieOp3 (NL) payment and direct debit orders files available as\n" -" account_banking_nl_clieop\n" -" - (wish) BTL91 (NL) payment orders files (no format description available),\n" -" - (wish) SEPA Direct Debits (ISO 200022) messages\n" -"\n" -" * Additional features for the import/export mechanism:\n" -" + Automatic matching and creation of bank accounts, banks and partners,\n" -" during import of statements.\n" -" + Automatic matching with invoices and payments.\n" -" + Sound import mechanism, allowing multiple imports of the same\n" -" transactions repeated over multiple files.\n" -" + Journal configuration per bank account.\n" -" + Business logic and format parsing strictly separated to ease the\n" -" development of new parsers.\n" -" + No special configuration needed for the parsers, new parsers are\n" -" recognized and made available at server (re)start.\n" -" " +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "The account number appears to be invalid for %(country)s" msgstr "" #. module: account_banking @@ -609,6 +693,23 @@ msgstr "" msgid "acc_number" msgstr "" +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "Number of transactions matched" +msgstr "" + +#. module: account_banking +#: help:account.banking.account.settings,bank_partner_id:0 +msgid "The partner to use for bank costs. Banks are not partners by default. You will most likely have to create one." +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "The account entries lines are not in valid state." +msgstr "" + #. module: account_banking #: model:ir.model,name:account_banking.model_account_banking_imported_file msgid "Imported Bank Statements File" diff --git a/account_banking/i18n/es.po b/account_banking/i18n/es.po new file mode 100644 index 000000000..67a853de4 --- /dev/null +++ b/account_banking/i18n/es.po @@ -0,0 +1,752 @@ +# Spanish 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: support@openerp.com\n" +"POT-Creation-Date: 2010-06-29 14:33:53+0000\n" +"PO-Revision-Date: 2010-04-28 20:13+0000\n" +"Last-Translator: Antonio Maldonado \n" +"Language-Team: Spanish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, fuzzy, python-format +msgid "Number of bank costs invoices created" +msgstr "Número de transacciones cargadas" + +#. module: account_banking +#: wizard_view:account_banking.banking_import,view_error:0 +#: wizard_view:account_banking.banking_import,view_statements:0 +msgid "Results:" +msgstr "Resultados:" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "Number of errors found" +msgstr "Número de errores encontrados" + +#. module: account_banking +#: wizard_view:account_banking.banking_import,init:0 +msgid "Select the processing details:" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "Invalid format" +msgstr "" + +#. module: account_banking +#: constraint:ir.actions.act_window:0 +msgid "Invalid model name in the action definition." +msgstr "" + +#. module: account_banking +#: field:payment.line,date_done:0 +msgid "Date Confirmed" +msgstr "Fecha confirmada" + +#. module: account_banking +#: wizard_button:account_banking.banking_import,view_statements,open_statements:0 +msgid "_View Statements" +msgstr "_Ver declaraciones" + +#. module: account_banking +#: wizard_button:account_banking.banking_import,view_error,end:0 +#: wizard_button:account_banking.banking_import,view_statements,end:0 +msgid "_Close" +msgstr "_Cerrar" + +#. module: account_banking +#: field:account.banking.account.settings,bank_partner_id:0 +msgid "Bank Partner" +msgstr "" + +#. module: account_banking +#: model:ir.model,name:account_banking.model_account_banking_account_settings +#: model:ir.model,name:account_banking.model_account_banking_bank_journal +msgid "Default Journal for Bank Account" +msgstr "" + +#. module: account_banking +#: wizard_field:account_banking.banking_import,init,file:0 +msgid "Statements File" +msgstr "Archivo de declaraciones" + +#. module: account_banking +#: code:addons/account_banking/wizard/banktools.py:0 +#, python-format +msgid "" +"More than one bank account was found with the same number %(account_no)s" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "Total number of transactions" +msgstr "Número total de transacciones" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "Account move line \"%s\" is not valid" +msgstr "" + +#. module: account_banking +#: help:account.banking.account.settings,default_debit_account_id:0 +msgid "" +"The account to use when an unexpected payment is received. This can be " +"needed when a customer pays in advance or when no matching invoice can be " +"found. Mind that you can correct movements before confirming them." +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/wizard/banktools.py:0 +#, python-format +msgid "Bank account %(account_no)s was not found in the database" +msgstr "" + +#. module: account_banking +#: view:account.banking.account.settings:0 +msgid "Generation of Bank Costs Invoices" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "Number of transactions skipped due to errors" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "" +"The expected balance (%.2f) is different '\n" +" 'than the computed one. (%.2f)" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "" +"Unable to link transaction id %(trans)s (ref: %(ref)s) to invoice: '\n" +" '%(no_candidates)s candidates found; can\'t choose." +msgstr "" + +#. module: account_banking +#: field:account.banking.account.settings,invoice_journal_id:0 +#, fuzzy +msgid "Costs Journal" +msgstr "Diario" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "Number of statements skipped due to errors" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "Invalid IBAN account number!" +msgstr "" + +#. module: account_banking +#: view:account.banking.account.settings:0 +msgid "Default Import Settings for Bank Account" +msgstr "" + +#. module: account_banking +#: help:account.banking.account.settings,default_credit_account_id:0 +msgid "" +"The account to use when an unexpected payment was signaled. This can happen " +"when a direct debit payment is cancelled by a customer, or when no matching " +"payment can be found. Mind that you can correct movements before confirming " +"them." +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "Unable to import parser %(parser)s. Parser class not found." +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "Insufficient data" +msgstr "" + +#. module: account_banking +#: selection:payment.line,export_state:0 +msgid "Cancelled" +msgstr "Cancelado" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "" +"Insufficient data to select online '\n" +" 'conversion database" +msgstr "" + +#. module: account_banking +#: view:account.banking.imported.file:0 +#: field:account.banking.imported.file,statement_ids:0 +msgid "Statements" +msgstr "Declaraciones" + +#. module: account_banking +#: field:account.banking.account.settings,default_debit_account_id:0 +msgid "Default debit account" +msgstr "Cuenta de débito por omisión" + +#. module: account_banking +#: code:addons/account_banking/wizard/banktools.py:0 +#, python-format +msgid "Unknown Bank" +msgstr "Banco desconocido" + +#. module: account_banking +#: field:account.banking.imported.file,date:0 +msgid "Import Date" +msgstr "Fecha de importación" + +#. module: account_banking +#: selection:payment.line,export_state:0 +msgid "Confirmed" +msgstr "Confirmado" + +#. module: account_banking +#: model:ir.actions.act_window,name:account_banking.action_account_banking_res_partner_banks +#: model:ir.ui.menu,name:account_banking.menu_action_account_banking_bank_accounts +msgid "Bank Accounts" +msgstr "Cuentas de banco" + +#. module: account_banking +#: view:account.banking.account.settings:0 +msgid "Default Accounts for Unknown Movements" +msgstr "" + +#. module: account_banking +#: view:account.bank.statement:0 +msgid "Confirm" +msgstr "Confirmar" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "" +"Statements found for account %(bank_account)s, '\n" +" 'but no default journal was defined." +msgstr "" + +#. module: account_banking +#: field:account.banking.account.settings,default_credit_account_id:0 +msgid "Default credit account" +msgstr "" + +#. module: account_banking +#: field:account.bank.statement.line,international:0 +msgid "International Transaction" +msgstr "Transacción internacional" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "Please verify that an account is defined in the journal." +msgstr "" + +#. module: account_banking +#: field:account.bank.statement.line,trans:0 +msgid "Bank Transaction ID" +msgstr "Identificador de transacción del banco" + +#. module: account_banking +#: help:account.banking.account.settings,invoice_journal_id:0 +msgid "This is the journal used to create invoices for bank costs." +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "Statement %(id)s known - skipped" +msgstr "" + +#. module: account_banking +#: selection:payment.line,export_state:0 +msgid "Sent" +msgstr "Enviar" + +#. module: account_banking +#: help:account.banking.account.settings,costs_account_id:0 +msgid "" +"The account to use when the bank invoices its own costs. Leave it blank to " +"disable automatic invoice generation on bank costs." +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "Error !" +msgstr "Error !" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "Invalid data" +msgstr "" + +#. module: account_banking +#: model:res.partner.bank.type.field,name:account_banking.bank_normal_field_contry +msgid "country_id" +msgstr "" + +#. module: account_banking +#: selection:payment.line,export_state:0 +msgid "Rejected" +msgstr "" + +#. module: account_banking +#: model:ir.actions.act_window,name:account_banking.action_account_banking_journals +#: model:ir.ui.menu,name:account_banking.menu_action_account_banking_bank_journals +msgid "Default Import Settings for Bank Accounts" +msgstr "" + +#. module: account_banking +#: model:ir.actions.wizard,name:account_banking.wizard_account_banking_import_file +#: model:ir.ui.menu,name:account_banking.menu_account_banking_import_wizard +msgid "Import Bank Statements File" +msgstr "" + +#. module: account_banking +#: help:account_banking.banking_import,init,file:0 +msgid "" +"The Transactions File to import. Please note that while it is perfectly safe " +"to reload the same file multiple times or to load in timeframe overlapping " +"statements files, there are formats that may introduce different sequencing, " +"which may create double entries.\n" +"\n" +"To stay on the safe side, always load bank statements files using the same " +"format." +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/sepa/bbantoiban.py:0 +#, python-format +msgid "This is a stub. Please implement your own code" +msgstr "" + +#. module: account_banking +#: constraint:ir.ui.view:0 +msgid "Invalid XML for View Architecture!" +msgstr "" + +#. module: account_banking +#: view:account.banking.imported.file:0 +msgid "Imported Bank Statements" +msgstr "" + +#. module: account_banking +#: wizard_button:account_banking.banking_import,init,end:0 +msgid "_Cancel" +msgstr "_Cancelar" + +#. module: account_banking +#: model:ir.module.module,description:account_banking.module_meta_information +msgid "" +"\n" +" Module to do banking.\n" +"\n" +" Note: This module is depending on BeautifulSoup.\n" +"\n" +" This modules tries to combine all current banking import and export\n" +" schemes. Rationale for this is that it is quite common to have foreign\n" +" bank account numbers next to national bank account numbers. The current\n" +" approach, which hides the national banking interface schemes in the\n" +" l10n_xxx modules, makes it very difficult to use these simultanious.\n" +" A more banking oriented approach seems more logical and cleaner.\n" +"\n" +" Changes to default OpenERP:\n" +"\n" +" * Puts focus on the real life messaging with banks:\n" +" + Bank statement lines upgraded to independent bank transactions.\n" +" + Banking statements have no special accountancy meaning, they're " +"just\n" +" message envelopes for a number of bank transactions.\n" +" + Bank statements can be either encoded by hand to reflect the " +"document\n" +" version of Bank Statements, or created as an optional side effect " +"of\n" +" importing Bank Transactions.\n" +"\n" +" * Preparations for SEPA:\n" +" + IBAN accounts are the standard in the SEPA countries\n" +" + local accounts are derived from SEPA (excluding Turkey) but are\n" +" considered to be identical to the corresponding SEPA account.\n" +" + Banks are identified with either Country + Bank code + Branch code " +"or BIC\n" +" + Each bank can have its own pace in introducing SEPA into their\n" +" communication with their customers.\n" +" + National online databases can be used to convert BBAN's to IBAN's.\n" +" + The SWIFT database is consulted for bank information.\n" +"\n" +" * Adds dropin extensible import facility for bank communication in:\n" +" - Drop-in input parser development.\n" +" - MultiBank (NL) format transaction files available as\n" +" account_banking_nl_multibank,\n" +"\n" +" * Extends payments for digital banking:\n" +" + Adapted workflow in payments to reflect banking operations\n" +" + Relies on account_payment mechanics to extend with export " +"generators.\n" +" - ClieOp3 (NL) payment and direct debit orders files available as\n" +" account_banking_nl_clieop\n" +"\n" +" * Additional features for the import/export mechanism:\n" +" + Automatic matching and creation of bank accounts, banks and " +"partners,\n" +" during import of statements.\n" +" + Automatic matching with invoices and payments.\n" +" + Sound import mechanism, allowing multiple imports of the same\n" +" transactions repeated over multiple files.\n" +" + Journal configuration per bank account.\n" +" + Business logic and format parsing strictly separated to ease the\n" +" development of new parsers.\n" +" + No special configuration needed for the parsers, new parsers are\n" +" recognized and made available at server (re)start.\n" +" " +msgstr "" + +#. module: account_banking +#: wizard_view:account_banking.banking_import,init:0 +#: wizard_view:account_banking.banking_import,view_error:0 +#: wizard_view:account_banking.banking_import,view_statements:0 +msgid "Import Bank Transactions File" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/wizard/banktools.py:0 +#, python-format +msgid "Account %(account_no)s is not owned by %(partner)s" +msgstr "" + +#. module: account_banking +#: wizard_button:account_banking.banking_import,init,import:0 +msgid "_Ok" +msgstr "Aceptar" + +#. module: account_banking +#: code:addons/account_banking/wizard/banktools.py:0 +#, python-format +msgid "More then one possible match found for partner with name %(name)s" +msgstr "" + +#. module: account_banking +#: field:account.banking.imported.file,state:0 +#: field:payment.line,export_state:0 +msgid "State" +msgstr "Estado" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "ERROR!" +msgstr "ERROR!" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "The account number has the wrong format for %(country)s" +msgstr "" + +#. module: account_banking +#: field:account.bank.statement.line,currency:0 +msgid "Currency" +msgstr "Divisa" + +#. module: account_banking +#: field:account.banking.imported.file,file:0 +msgid "Raw Data" +msgstr "Datos en bruto" + +#. module: account_banking +#: field:payment.line,msg:0 +msgid "Message" +msgstr "" + +#. module: account_banking +#: field:account.banking.account.settings,company_id:0 +#: field:account.banking.imported.file,company_id:0 +#: wizard_field:account_banking.banking_import,init,company:0 +msgid "Company" +msgstr "Compañía" + +#. module: account_banking +#: wizard_field:account_banking.banking_import,view_error,log:0 +#: wizard_field:account_banking.banking_import,view_statements,log:0 +msgid "Log" +msgstr "Registro" + +#. module: account_banking +#: code:addons/account_banking/parsers/models.py:0 +#, python-format +msgid "Invalid value for transfer_type" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "Configration Error !" +msgstr "Error de configuración !" + +#. module: account_banking +#: model:ir.actions.act_window,name:account_banking.act_account_payment_account_bank_statement +msgid "Bank Statements File" +msgstr "Archivo de declaraciones bancarias" + +#. module: account_banking +#: code:addons/account_banking/parsers/models.py:0 +#, python-format +msgid "This is a stub. Please implement your own." +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/wizard/banktools.py:0 +#, python-format +msgid "No suitable period found for date %(date)s and company %(company_name)s" +msgstr "" + +#. module: account_banking +#: view:account.banking.imported.file:0 +#: model:ir.actions.act_window,name:account_banking.action_account_banking_imported_files +#: model:ir.ui.menu,name:account_banking.menu_action_account_banking_imported_files +msgid "Imported Bank Statements Files" +msgstr "" + +#. module: account_banking +#: field:account.bank.statement,banking_id:0 +msgid "Imported File" +msgstr "Archivo importado" + +#. module: account_banking +#: view:account.banking.imported.file:0 +#: field:account.banking.imported.file,log:0 +msgid "Import Log" +msgstr "Importar registro" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "" +"Statement for account %(bank_account)s uses different '\n" +" 'currency than the defined bank journal." +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/wizard/banktools.py:0 +#, python-format +msgid "" +"Multiple overlapping periods for date %(date)s and company %(company_name)s" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "The imported statements appear to be invalid! Check your file." +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "Number of statements loaded" +msgstr "Número de declaraciónes cargadas" + +#. module: account_banking +#: model:ir.ui.menu,name:account_banking.menu_finance_banking_actions +#: model:ir.ui.menu,name:account_banking.menu_finance_banking_settings +msgid "Banking" +msgstr "Bancario" + +#. module: account_banking +#: selection:account.banking.imported.file,state:0 +msgid "Error" +msgstr "Error" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "Total number of statements" +msgstr "Número total de declaraciones" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "Unable to reconcile entry \"%s\": %.2f" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/wizard/banktools.py:0 +#, python-format +msgid "" +"No suitable fiscal year found for date %(date)s and company %(company_name)s" +msgstr "" + +#. module: account_banking +#: view:account.banking.imported.file:0 +msgid "Import Details" +msgstr "Importar detalles" + +#. module: account_banking +#: field:account.bank.statement.line,period_id:0 +msgid "Period" +msgstr "Período" + +#. module: account_banking +#: selection:payment.line,export_state:0 +msgid "Done" +msgstr "Hecho" + +#. module: account_banking +#: view:payment.order:0 +msgid "Select Invoices to Pay" +msgstr "Seleccionar facturas a pagar" + +#. module: account_banking +#: field:account.banking.imported.file,user_id:0 +msgid "Responsible User" +msgstr "Usuario responsable" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "The statement balance is incorrect !\n" +msgstr "El balance de las declaraciones es incorrecto !\n" + +#. module: account_banking +#: constraint:ir.model:0 +msgid "" +"The Object name must start with x_ and not contain any special character !" +msgstr "" + +#. module: account_banking +#: selection:account.banking.imported.file,state:0 +msgid "Unfinished" +msgstr "Sin terminar" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "Statements found for unknown account %(bank_account)s" +msgstr "" + +#. module: account_banking +#: model:ir.module.module,shortdesc:account_banking.module_meta_information +msgid "Account Banking" +msgstr "Cuenta bancaria" + +#. module: account_banking +#: wizard_button:account_banking.banking_import,view_error,open_import:0 +msgid "_View Imported File" +msgstr "_Ver archiv importado" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "The IBAN number doesn't seem to be correct" +msgstr "" + +#. module: account_banking +#: field:account.banking.imported.file,format:0 +#: wizard_field:account_banking.banking_import,init,parser:0 +msgid "File Format" +msgstr "Formato de archivo" + +#. module: account_banking +#: code:addons/account_banking/wizard/banktools.py:0 +#, python-format +msgid "" +"Multiple overlapping fiscal years found for date %(date)s and company %" +"(company_name)s" +msgstr "" + +#. module: account_banking +#: field:account.banking.account.settings,journal_id:0 +msgid "Journal" +msgstr "Diario" + +#. module: account_banking +#: field:account.banking.account.settings,costs_account_id:0 +#, fuzzy +msgid "Bank Costs Account" +msgstr "Cuenta de banco" + +#. module: account_banking +#: selection:account.banking.imported.file,state:0 +msgid "Finished" +msgstr "Terminando" + +#. module: account_banking +#: selection:payment.line,export_state:0 +msgid "Draft" +msgstr "Borrador" + +#. module: account_banking +#: view:account.banking.account.settings:0 +msgid "Bank Account Details" +msgstr "Detalles de la cuenta bancaria" + +#. module: account_banking +#: field:account.bank.statement.line,partner_bank_id:0 +#: field:account.banking.account.settings,partner_bank_id:0 +msgid "Bank Account" +msgstr "Cuenta de banco" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "Number of transactions loaded" +msgstr "Número de transacciones cargadas" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "The account number appears to be invalid for %(country)s" +msgstr "" + +#. module: account_banking +#: model:res.partner.bank.type.field,name:account_banking.bank_acc_number_field +msgid "acc_number" +msgstr "acc_number" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, fuzzy, python-format +msgid "Number of transactions matched" +msgstr "Número de transacciones cargadas" + +#. module: account_banking +#: help:account.banking.account.settings,bank_partner_id:0 +msgid "" +"The partner to use for bank costs. Banks are not partners by default. You " +"will most likely have to create one." +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "The account entries lines are not in valid state." +msgstr "" + +#. module: account_banking +#: model:ir.model,name:account_banking.model_account_banking_imported_file +msgid "Imported Bank Statements File" +msgstr "" diff --git a/account_banking/i18n/hr.po b/account_banking/i18n/hr.po new file mode 100644 index 000000000..554f49afb --- /dev/null +++ b/account_banking/i18n/hr.po @@ -0,0 +1,767 @@ +# Croatian 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: support@openerp.com\n" +"POT-Creation-Date: 2010-06-29 14:33:53+0000\n" +"PO-Revision-Date: 2010-02-12 01:28+0000\n" +"Last-Translator: goranc \n" +"Language-Team: Croatian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, fuzzy, python-format +msgid "Number of bank costs invoices created" +msgstr "Broj učitanih transakcija" + +#. module: account_banking +#: wizard_view:account_banking.banking_import,view_error:0 +#: wizard_view:account_banking.banking_import,view_statements:0 +msgid "Results:" +msgstr "Rezultati:" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "Number of errors found" +msgstr "Broj pronađenih grešaka" + +#. module: account_banking +#: wizard_view:account_banking.banking_import,init:0 +msgid "Select the processing details:" +msgstr "Odaberite detalje obrade:" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "Invalid format" +msgstr "" + +#. module: account_banking +#: constraint:ir.actions.act_window:0 +msgid "Invalid model name in the action definition." +msgstr "Pogrešno ime modela u definiciji akcije." + +#. module: account_banking +#: field:payment.line,date_done:0 +msgid "Date Confirmed" +msgstr "Datum potvrđen" + +#. module: account_banking +#: wizard_button:account_banking.banking_import,view_statements,open_statements:0 +msgid "_View Statements" +msgstr "" + +#. module: account_banking +#: wizard_button:account_banking.banking_import,view_error,end:0 +#: wizard_button:account_banking.banking_import,view_statements,end:0 +msgid "_Close" +msgstr "_Zatvori" + +#. module: account_banking +#: field:account.banking.account.settings,bank_partner_id:0 +msgid "Bank Partner" +msgstr "" + +#. module: account_banking +#: model:ir.model,name:account_banking.model_account_banking_account_settings +#: model:ir.model,name:account_banking.model_account_banking_bank_journal +msgid "Default Journal for Bank Account" +msgstr "Predefinirana temeljnica za bankovni račun" + +#. module: account_banking +#: wizard_field:account_banking.banking_import,init,file:0 +msgid "Statements File" +msgstr "Datoteka sa stavkama" + +#. module: account_banking +#: code:addons/account_banking/wizard/banktools.py:0 +#, python-format +msgid "" +"More than one bank account was found with the same number %(account_no)s" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "Total number of transactions" +msgstr "Ukupan broj transakcija" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "Account move line \"%s\" is not valid" +msgstr "Redak prijenosa računa \"%s\" nije ispravan" + +#. module: account_banking +#: help:account.banking.account.settings,default_debit_account_id:0 +msgid "" +"The account to use when an unexpected payment is received. This can be " +"needed when a customer pays in advance or when no matching invoice can be " +"found. Mind that you can correct movements before confirming them." +msgstr "" +"Račun za upis primljene neočekivane uplate. To može biti potrebno kada " +"klijent plaća unaprijed, ili ako nema podudarne fakture. Omogućeno je " +"ispravljanje upisa prije potvrde." + +#. module: account_banking +#: code:addons/account_banking/wizard/banktools.py:0 +#, python-format +msgid "Bank account %(account_no)s was not found in the database" +msgstr "" + +#. module: account_banking +#: view:account.banking.account.settings:0 +msgid "Generation of Bank Costs Invoices" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "Number of transactions skipped due to errors" +msgstr "Broj transakcija preskočenih zbog pogreški" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "" +"The expected balance (%.2f) is different '\n" +" 'than the computed one. (%.2f)" +msgstr "" +"Očekivani saldo (%.2f) je različit '\n" +" 'od izračunatog. (%.2f)" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "" +"Unable to link transaction id %(trans)s (ref: %(ref)s) to invoice: '\n" +" '%(no_candidates)s candidates found; can\'t choose." +msgstr "" + +#. module: account_banking +#: field:account.banking.account.settings,invoice_journal_id:0 +#, fuzzy +msgid "Costs Journal" +msgstr "Temeljnica" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "Number of statements skipped due to errors" +msgstr "Broj stavki preskočenih zbog pogreški" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "Invalid IBAN account number!" +msgstr "" + +#. module: account_banking +#: view:account.banking.account.settings:0 +msgid "Default Import Settings for Bank Account" +msgstr "Predefinirane postavke za učitavanje podataka za bankovni račun" + +#. module: account_banking +#: help:account.banking.account.settings,default_credit_account_id:0 +msgid "" +"The account to use when an unexpected payment was signaled. This can happen " +"when a direct debit payment is cancelled by a customer, or when no matching " +"payment can be found. Mind that you can correct movements before confirming " +"them." +msgstr "" +"Račun za upis signalizirane neočekivane uplate. To se može dogoditi kada je " +"otkazana uplata izravnim zaduženjem od strane kupca, ili kada se ne može " +"pronaći podudarna uplata. Omogućeno je ispravljanje upisa prije potvrde." + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "Unable to import parser %(parser)s. Parser class not found." +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "Insufficient data" +msgstr "" + +#. module: account_banking +#: selection:payment.line,export_state:0 +msgid "Cancelled" +msgstr "Poništeno" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "" +"Insufficient data to select online '\n" +" 'conversion database" +msgstr "" + +#. module: account_banking +#: view:account.banking.imported.file:0 +#: field:account.banking.imported.file,statement_ids:0 +msgid "Statements" +msgstr "Izvodi" + +#. module: account_banking +#: field:account.banking.account.settings,default_debit_account_id:0 +msgid "Default debit account" +msgstr "Predefinirani račun terećenja" + +#. module: account_banking +#: code:addons/account_banking/wizard/banktools.py:0 +#, python-format +msgid "Unknown Bank" +msgstr "" + +#. module: account_banking +#: field:account.banking.imported.file,date:0 +msgid "Import Date" +msgstr "Datum učitavanja" + +#. module: account_banking +#: selection:payment.line,export_state:0 +msgid "Confirmed" +msgstr "Potvrđeno" + +#. module: account_banking +#: model:ir.actions.act_window,name:account_banking.action_account_banking_res_partner_banks +#: model:ir.ui.menu,name:account_banking.menu_action_account_banking_bank_accounts +msgid "Bank Accounts" +msgstr "" + +#. module: account_banking +#: view:account.banking.account.settings:0 +msgid "Default Accounts for Unknown Movements" +msgstr "Predefinirani računi za nedefinirane promete" + +#. module: account_banking +#: view:account.bank.statement:0 +msgid "Confirm" +msgstr "Potvrdi" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "" +"Statements found for account %(bank_account)s, '\n" +" 'but no default journal was defined." +msgstr "" + +#. module: account_banking +#: field:account.banking.account.settings,default_credit_account_id:0 +msgid "Default credit account" +msgstr "Predefinirani račun odobrenja" + +#. module: account_banking +#: field:account.bank.statement.line,international:0 +msgid "International Transaction" +msgstr "Međunaradni prijenos" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "Please verify that an account is defined in the journal." +msgstr "Molimo provjerite da je račun definiran u temeljnici" + +#. module: account_banking +#: field:account.bank.statement.line,trans:0 +msgid "Bank Transaction ID" +msgstr "Oznaka bankovne transakcije" + +#. module: account_banking +#: help:account.banking.account.settings,invoice_journal_id:0 +msgid "This is the journal used to create invoices for bank costs." +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "Statement %(id)s known - skipped" +msgstr "" + +#. module: account_banking +#: selection:payment.line,export_state:0 +msgid "Sent" +msgstr "Poslano" + +#. module: account_banking +#: help:account.banking.account.settings,costs_account_id:0 +msgid "" +"The account to use when the bank invoices its own costs. Leave it blank to " +"disable automatic invoice generation on bank costs." +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "Error !" +msgstr "Greška !" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "Invalid data" +msgstr "" + +#. module: account_banking +#: model:res.partner.bank.type.field,name:account_banking.bank_normal_field_contry +msgid "country_id" +msgstr "" + +#. module: account_banking +#: selection:payment.line,export_state:0 +msgid "Rejected" +msgstr "" + +#. module: account_banking +#: model:ir.actions.act_window,name:account_banking.action_account_banking_journals +#: model:ir.ui.menu,name:account_banking.menu_action_account_banking_bank_journals +msgid "Default Import Settings for Bank Accounts" +msgstr "Predefinirane postavke učitavanja za bankovne račune" + +#. module: account_banking +#: model:ir.actions.wizard,name:account_banking.wizard_account_banking_import_file +#: model:ir.ui.menu,name:account_banking.menu_account_banking_import_wizard +msgid "Import Bank Statements File" +msgstr "Učitaj datoteku izvoda banke" + +#. module: account_banking +#: help:account_banking.banking_import,init,file:0 +msgid "" +"The Transactions File to import. Please note that while it is perfectly safe " +"to reload the same file multiple times or to load in timeframe overlapping " +"statements files, there are formats that may introduce different sequencing, " +"which may create double entries.\n" +"\n" +"To stay on the safe side, always load bank statements files using the same " +"format." +msgstr "" +"Datoteka s transakcijama za učitavanje. Imajte na umu da je potpuno sigurno " +"ponovno učitavanje iste datoteke ili učitati datoteku izvoda koji se " +"vremenski preklapaju, ipak postoje formati datoteka koji mogu uzrokovati " +"različiti redoslijed, što može dovesti do dvostrukog unosa.\n" +"\n" +"Za sigurnost, uvijek učitati datoteke koristeći bankovni izvod istog formata." + +#. module: account_banking +#: code:addons/account_banking/sepa/bbantoiban.py:0 +#, python-format +msgid "This is a stub. Please implement your own code" +msgstr "" + +#. module: account_banking +#: constraint:ir.ui.view:0 +msgid "Invalid XML for View Architecture!" +msgstr "Neispravan XML za arhitekturu prikaza!" + +#. module: account_banking +#: view:account.banking.imported.file:0 +msgid "Imported Bank Statements" +msgstr "Učitani izvodi banke" + +#. module: account_banking +#: wizard_button:account_banking.banking_import,init,end:0 +msgid "_Cancel" +msgstr "_Odustani" + +#. module: account_banking +#: model:ir.module.module,description:account_banking.module_meta_information +msgid "" +"\n" +" Module to do banking.\n" +"\n" +" Note: This module is depending on BeautifulSoup.\n" +"\n" +" This modules tries to combine all current banking import and export\n" +" schemes. Rationale for this is that it is quite common to have foreign\n" +" bank account numbers next to national bank account numbers. The current\n" +" approach, which hides the national banking interface schemes in the\n" +" l10n_xxx modules, makes it very difficult to use these simultanious.\n" +" A more banking oriented approach seems more logical and cleaner.\n" +"\n" +" Changes to default OpenERP:\n" +"\n" +" * Puts focus on the real life messaging with banks:\n" +" + Bank statement lines upgraded to independent bank transactions.\n" +" + Banking statements have no special accountancy meaning, they're " +"just\n" +" message envelopes for a number of bank transactions.\n" +" + Bank statements can be either encoded by hand to reflect the " +"document\n" +" version of Bank Statements, or created as an optional side effect " +"of\n" +" importing Bank Transactions.\n" +"\n" +" * Preparations for SEPA:\n" +" + IBAN accounts are the standard in the SEPA countries\n" +" + local accounts are derived from SEPA (excluding Turkey) but are\n" +" considered to be identical to the corresponding SEPA account.\n" +" + Banks are identified with either Country + Bank code + Branch code " +"or BIC\n" +" + Each bank can have its own pace in introducing SEPA into their\n" +" communication with their customers.\n" +" + National online databases can be used to convert BBAN's to IBAN's.\n" +" + The SWIFT database is consulted for bank information.\n" +"\n" +" * Adds dropin extensible import facility for bank communication in:\n" +" - Drop-in input parser development.\n" +" - MultiBank (NL) format transaction files available as\n" +" account_banking_nl_multibank,\n" +"\n" +" * Extends payments for digital banking:\n" +" + Adapted workflow in payments to reflect banking operations\n" +" + Relies on account_payment mechanics to extend with export " +"generators.\n" +" - ClieOp3 (NL) payment and direct debit orders files available as\n" +" account_banking_nl_clieop\n" +"\n" +" * Additional features for the import/export mechanism:\n" +" + Automatic matching and creation of bank accounts, banks and " +"partners,\n" +" during import of statements.\n" +" + Automatic matching with invoices and payments.\n" +" + Sound import mechanism, allowing multiple imports of the same\n" +" transactions repeated over multiple files.\n" +" + Journal configuration per bank account.\n" +" + Business logic and format parsing strictly separated to ease the\n" +" development of new parsers.\n" +" + No special configuration needed for the parsers, new parsers are\n" +" recognized and made available at server (re)start.\n" +" " +msgstr "" + +#. module: account_banking +#: wizard_view:account_banking.banking_import,init:0 +#: wizard_view:account_banking.banking_import,view_error:0 +#: wizard_view:account_banking.banking_import,view_statements:0 +msgid "Import Bank Transactions File" +msgstr "Učitaj datoteku bankovnih transakcija" + +#. module: account_banking +#: code:addons/account_banking/wizard/banktools.py:0 +#, python-format +msgid "Account %(account_no)s is not owned by %(partner)s" +msgstr "" + +#. module: account_banking +#: wizard_button:account_banking.banking_import,init,import:0 +msgid "_Ok" +msgstr "_U redu" + +#. module: account_banking +#: code:addons/account_banking/wizard/banktools.py:0 +#, python-format +msgid "More then one possible match found for partner with name %(name)s" +msgstr "" + +#. module: account_banking +#: field:account.banking.imported.file,state:0 +#: field:payment.line,export_state:0 +msgid "State" +msgstr "Status" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "ERROR!" +msgstr "Greška!" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "The account number has the wrong format for %(country)s" +msgstr "" + +#. module: account_banking +#: field:account.bank.statement.line,currency:0 +msgid "Currency" +msgstr "" + +#. module: account_banking +#: field:account.banking.imported.file,file:0 +msgid "Raw Data" +msgstr "nepripremljeni podaci" + +#. module: account_banking +#: field:payment.line,msg:0 +msgid "Message" +msgstr "" + +#. module: account_banking +#: field:account.banking.account.settings,company_id:0 +#: field:account.banking.imported.file,company_id:0 +#: wizard_field:account_banking.banking_import,init,company:0 +msgid "Company" +msgstr "Tvrtka" + +#. module: account_banking +#: wizard_field:account_banking.banking_import,view_error,log:0 +#: wizard_field:account_banking.banking_import,view_statements,log:0 +msgid "Log" +msgstr "Dnevnik izmjena" + +#. module: account_banking +#: code:addons/account_banking/parsers/models.py:0 +#, python-format +msgid "Invalid value for transfer_type" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "Configration Error !" +msgstr "Konfiguracijska pogreška !" + +#. module: account_banking +#: model:ir.actions.act_window,name:account_banking.act_account_payment_account_bank_statement +msgid "Bank Statements File" +msgstr "Datoteka bankovnog izvoda" + +#. module: account_banking +#: code:addons/account_banking/parsers/models.py:0 +#, python-format +msgid "This is a stub. Please implement your own." +msgstr "Ovo je okvir. Izvedbu provedite sami." + +#. module: account_banking +#: code:addons/account_banking/wizard/banktools.py:0 +#, python-format +msgid "No suitable period found for date %(date)s and company %(company_name)s" +msgstr "" + +#. module: account_banking +#: view:account.banking.imported.file:0 +#: model:ir.actions.act_window,name:account_banking.action_account_banking_imported_files +#: model:ir.ui.menu,name:account_banking.menu_action_account_banking_imported_files +msgid "Imported Bank Statements Files" +msgstr "Učitana datoteka bankovnog izvoda" + +#. module: account_banking +#: field:account.bank.statement,banking_id:0 +msgid "Imported File" +msgstr "Učitana datoteka" + +#. module: account_banking +#: view:account.banking.imported.file:0 +#: field:account.banking.imported.file,log:0 +msgid "Import Log" +msgstr "Dnevnik učitavanja" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "" +"Statement for account %(bank_account)s uses different '\n" +" 'currency than the defined bank journal." +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/wizard/banktools.py:0 +#, python-format +msgid "" +"Multiple overlapping periods for date %(date)s and company %(company_name)s" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "The imported statements appear to be invalid! Check your file." +msgstr "Učitane stavke nisu korektne! Provjerite datoteku." + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "Number of statements loaded" +msgstr "Broj učitanih stavki" + +#. module: account_banking +#: model:ir.ui.menu,name:account_banking.menu_finance_banking_actions +#: model:ir.ui.menu,name:account_banking.menu_finance_banking_settings +msgid "Banking" +msgstr "Bankarstvo" + +#. module: account_banking +#: selection:account.banking.imported.file,state:0 +msgid "Error" +msgstr "Greška" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "Total number of statements" +msgstr "Ukupan broj stavki" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "Unable to reconcile entry \"%s\": %.2f" +msgstr "Nije moguće uskladiti stavku \"%s\".%.2f" + +#. module: account_banking +#: code:addons/account_banking/wizard/banktools.py:0 +#, python-format +msgid "" +"No suitable fiscal year found for date %(date)s and company %(company_name)s" +msgstr "" + +#. module: account_banking +#: view:account.banking.imported.file:0 +msgid "Import Details" +msgstr "Pregled učitanih stavki" + +#. module: account_banking +#: field:account.bank.statement.line,period_id:0 +msgid "Period" +msgstr "Razdoblje" + +#. module: account_banking +#: selection:payment.line,export_state:0 +msgid "Done" +msgstr "Završeno" + +#. module: account_banking +#: view:payment.order:0 +msgid "Select Invoices to Pay" +msgstr "Odaberite fakture za plaćanje" + +#. module: account_banking +#: field:account.banking.imported.file,user_id:0 +msgid "Responsible User" +msgstr "Odgovorni korisnik" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "The statement balance is incorrect !\n" +msgstr "Saldo izvoda je netočan !\n" + +#. module: account_banking +#: constraint:ir.model:0 +msgid "" +"The Object name must start with x_ and not contain any special character !" +msgstr "" +"Naziv objekta mora početi s x_ i ne smije sadržavati specijalne znakove !" + +#. module: account_banking +#: selection:account.banking.imported.file,state:0 +msgid "Unfinished" +msgstr "Nedovršeno" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "Statements found for unknown account %(bank_account)s" +msgstr "" + +#. module: account_banking +#: model:ir.module.module,shortdesc:account_banking.module_meta_information +msgid "Account Banking" +msgstr "Bankovni računi" + +#. module: account_banking +#: wizard_button:account_banking.banking_import,view_error,open_import:0 +msgid "_View Imported File" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "The IBAN number doesn't seem to be correct" +msgstr "" + +#. module: account_banking +#: field:account.banking.imported.file,format:0 +#: wizard_field:account_banking.banking_import,init,parser:0 +msgid "File Format" +msgstr "Format datoteke" + +#. module: account_banking +#: code:addons/account_banking/wizard/banktools.py:0 +#, python-format +msgid "" +"Multiple overlapping fiscal years found for date %(date)s and company %" +"(company_name)s" +msgstr "" + +#. module: account_banking +#: field:account.banking.account.settings,journal_id:0 +msgid "Journal" +msgstr "Temeljnica" + +#. module: account_banking +#: field:account.banking.account.settings,costs_account_id:0 +#, fuzzy +msgid "Bank Costs Account" +msgstr "Bankovni račun" + +#. module: account_banking +#: selection:account.banking.imported.file,state:0 +msgid "Finished" +msgstr "Završeno" + +#. module: account_banking +#: selection:payment.line,export_state:0 +msgid "Draft" +msgstr "Nedovršeno" + +#. module: account_banking +#: view:account.banking.account.settings:0 +msgid "Bank Account Details" +msgstr "Stavke bankovnih računa" + +#. module: account_banking +#: field:account.bank.statement.line,partner_bank_id:0 +#: field:account.banking.account.settings,partner_bank_id:0 +msgid "Bank Account" +msgstr "Bankovni račun" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "Number of transactions loaded" +msgstr "Broj učitanih transakcija" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "The account number appears to be invalid for %(country)s" +msgstr "" + +#. module: account_banking +#: model:res.partner.bank.type.field,name:account_banking.bank_acc_number_field +msgid "acc_number" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, fuzzy, python-format +msgid "Number of transactions matched" +msgstr "Broj učitanih transakcija" + +#. module: account_banking +#: help:account.banking.account.settings,bank_partner_id:0 +msgid "" +"The partner to use for bank costs. Banks are not partners by default. You " +"will most likely have to create one." +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "The account entries lines are not in valid state." +msgstr "Stavke ovog računa nisu u valjanom stanju." + +#. module: account_banking +#: model:ir.model,name:account_banking.model_account_banking_imported_file +msgid "Imported Bank Statements File" +msgstr "Učitane datoteke bankovnih izvoda" diff --git a/account_banking/i18n/nl_NL.po b/account_banking/i18n/nl_NL.po index 0e3c5e672..525d2b7c0 100644 --- a/account_banking/i18n/nl_NL.po +++ b/account_banking/i18n/nl_NL.po @@ -1,13 +1,13 @@ # Translation of OpenERP Server. # This file contains the translation of the following modules: -# * account_banking +# * account_banking # msgid "" msgstr "" -"Project-Id-Version: OpenERP Server 5.0.7\n" +"Project-Id-Version: OpenERP Server 5.0.11\n" "Report-Msgid-Bugs-To: support@openerp.com\n" -"POT-Creation-Date: 2010-01-08 15:18:44+0000\n" -"PO-Revision-Date: 2010-01-08 15:18:44+0000\n" +"POT-Creation-Date: 2010-06-09 10:17:04+0000\n" +"PO-Revision-Date: 2010-06-29 14:26:19+0000\n" "Last-Translator: <>\n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -16,7 +16,8 @@ msgstr "" "Plural-Forms: \n" #. module: account_banking -#: wizard_view:account_banking.banking_import,import:0 +#: wizard_view:account_banking.banking_import,view_error:0 +#: wizard_view:account_banking.banking_import,view_statements:0 msgid "Results:" msgstr "Resultaat:" @@ -31,28 +32,36 @@ msgstr "Aantal gevonden fouten" msgid "Select the processing details:" msgstr "Kies de verwerkings-details:" +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "Invalid format" +msgstr "Ongeldig formaat" + #. module: account_banking #: constraint:ir.actions.act_window:0 msgid "Invalid model name in the action definition." msgstr "Ongeldige naam in actie-definitie." -#. module: account_banking -#: wizard_button:account_banking.banking_import,import,open:0 -msgid "_Open Statement" -msgstr "_Open bankafschriften" - #. module: account_banking #: field:payment.line,date_done:0 msgid "Date Confirmed" msgstr "Bevestigingsdatum" #. module: account_banking -#: wizard_button:account_banking.banking_import,import,end:0 +#: wizard_button:account_banking.banking_import,view_statements,open_statements:0 +msgid "_View Statements" +msgstr "_Bekijk bankafschriften" + +#. module: account_banking +#: wizard_button:account_banking.banking_import,view_error,end:0 +#: wizard_button:account_banking.banking_import,view_statements,end:0 msgid "_Close" msgstr "_Sluit" #. module: account_banking #: model:ir.model,name:account_banking.model_account_banking_account_settings +#: model:ir.model,name:account_banking.model_account_banking_bank_journal msgid "Default Journal for Bank Account" msgstr "Standaard dagboek voor bankrekening" @@ -64,8 +73,11 @@ msgstr "Transactiebestand" #. module: account_banking #: code:addons/account_banking/wizard/banktools.py:0 #, python-format -msgid "More than one bank account was found with the same number %(account_no)s" -msgstr "Meer dan één bankrekening gevonden met hetzelfde rekeningnummer %(account_no)s" +msgid "" +"More than one bank account was found with the same number %(account_no)s" +msgstr "" +"Meer dan één bankrekening gevonden met hetzelfde rekeningnummer %(account_no)" +"s" #. module: account_banking #: code:addons/account_banking/wizard/bank_import.py:0 @@ -81,8 +93,15 @@ msgstr "Boekingsregel \"%s\" is onjuist." #. module: account_banking #: help:account.banking.account.settings,default_debit_account_id:0 -msgid "The account to use when an unexpected payment is received. This can be needed when a customer pays in advance or when no matching invoice can be found. Mind that you can correct movements before confirming them." -msgstr "De rekening waarop geboekt moet worden bij onverwachte betalingen. Dit kan nodig zijn als een klant vooruit betaalt of wanneer er geen overeenkomende factuur gevonden kan worden. Merk op dat u altijd boekingen kunt corrigeren voordat u deze bevestigt." +msgid "" +"The account to use when an unexpected payment is received. This can be " +"needed when a customer pays in advance or when no matching invoice can be " +"found. Mind that you can correct movements before confirming them." +msgstr "" +"De rekening waarop geboekt moet worden bij onverwachte betalingen. Dit kan " +"nodig zijn als een klant vooruit betaalt of wanneer er geen overeenkomende " +"factuur gevonden kan worden. Merk op dat u altijd boekingen kunt corrigeren " +"voordat u deze bevestigt." #. module: account_banking #: code:addons/account_banking/wizard/banktools.py:0 @@ -90,6 +109,18 @@ msgstr "De rekening waarop geboekt moet worden bij onverwachte betalingen. Dit k msgid "Bank account %(account_no)s was not found in the database" msgstr "Bankrekening %(account)s niet gevonden in de database" +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "" +"Unable to link transaction id %(trans)s (ref: %(ref)s) to invoice: '\n" +" '%(no_candidates)s candidates found; can\'t choose." +msgstr "" +"Niet in staat transactie id %(trans)s (ref: %(ref)s) aan factuur te " +"koppelen: \n" +" '%(no_candidates)s kandidaten gevonden; kan niet " +"kiezen." + #. module: account_banking #: code:addons/account_banking/wizard/bank_import.py:0 #, python-format @@ -99,23 +130,23 @@ msgstr "Aantal overgeslagen transacties als gevolg van fouten" #. module: account_banking #: code:addons/account_banking/account_banking.py:0 #, python-format -msgid "The expected balance (%.2f) is different '\n" +msgid "" +"The expected balance (%.2f) is different '\n" " 'than the computed one. (%.2f)" msgstr "Het verwachte saldo (%.2f) wijkt af van het berekende- (%.2f)." -#. module: account_banking -#: code:addons/account_banking/wizard/bank_import.py:0 -#, python-format -msgid "Statement for account %(bank_account)s uses different '\n" -" 'currency than the defined bank journal." -msgstr "Afschrift voor bankrekening %(account)s gebruik andere valuta dan opgegeven in het bankdagboek." - #. module: account_banking #: code:addons/account_banking/wizard/bank_import.py:0 #, python-format msgid "Number of statements skipped due to errors" msgstr "Aantal afschriften overgeslagen door fouten" +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "Invalid IBAN account number!" +msgstr "Ongeldig IBAN-rekeningnummer" + #. module: account_banking #: view:account.banking.account.settings:0 msgid "Default Import Settings for Bank Account" @@ -123,20 +154,45 @@ msgstr "Standaardinstellingen voor bankrekeningen" #. module: account_banking #: help:account.banking.account.settings,default_credit_account_id:0 -msgid "The account to use when an unexpected payment was signaled. This can happen when a direct debit payment is cancelled by a customer, or when no matching payment can be found. Mind that you can correct movements before confirming them." -msgstr "De te gebruiken rekening bij onverwachte betalingen. Dit kan voorkomen indien een incasso-opdracht door een klant is geannuleerd, of wanneer er geen overeenkomende betaling kan worden gevonden. Merk op dat u altijd boekingen kunt corrigeren voordat u deze bevestigt." +msgid "" +"The account to use when an unexpected payment was signaled. This can happen " +"when a direct debit payment is cancelled by a customer, or when no matching " +"payment can be found. Mind that you can correct movements before confirming " +"them." +msgstr "" +"De te gebruiken rekening bij onverwachte betalingen. Dit kan voorkomen " +"indien een incasso-opdracht door een klant is geannuleerd, of wanneer er " +"geen overeenkomende betaling kan worden gevonden. Merk op dat u altijd " +"boekingen kunt corrigeren voordat u deze bevestigt." #. module: account_banking #: code:addons/account_banking/wizard/bank_import.py:0 #, python-format msgid "Unable to import parser %(parser)s. Parser class not found." -msgstr "Niet in staat parser %(parser)s te importeren. Parser class niet gevonden." +msgstr "" +"Niet in staat parser %(parser)s te importeren. Parser class niet gevonden." + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "Insufficient data" +msgstr "Onvoldoende gegevens" #. module: account_banking #: selection:payment.line,export_state:0 msgid "Cancelled" msgstr "Geannuleerd" +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "" +"Insufficient data to select online '\n" +" 'conversion database" +msgstr "" +"Onvoldoende gegevens om on-line'\n" +" 'conversie-database te kiezen" + #. module: account_banking #: view:account.banking.imported.file:0 #: field:account.banking.imported.file,statement_ids:0 @@ -149,6 +205,20 @@ msgid "Default debit account" msgstr "Standaard debet-rekening" #. module: account_banking +#: code:addons/account_banking/wizard/banktools.py:0 +#, python-format +msgid "Unknown Bank" +msgstr "Onbekende bank" + +#. module: account_banking +#: wizard_button:account_banking.banking_import,init,end:0 +msgid "_Cancel" +msgstr "_Annuleer" + +#. module: account_banking +#: selection:payment.line,export_state:0 +msgid "Draft" +msgstr "Concept" #. module: account_banking #: field:account.banking.imported.file,date:0 @@ -160,6 +230,12 @@ msgstr "Importdatum" msgid "Confirmed" msgstr "Bevestigd" +#. module: account_banking +#: model:ir.actions.act_window,name:account_banking.action_account_banking_res_partner_banks +#: model:ir.ui.menu,name:account_banking.menu_action_account_banking_bank_accounts +msgid "Bank Accounts" +msgstr "Bankrekeningen" + #. module: account_banking #: view:account.banking.account.settings:0 msgid "Default Accounts for Unknown Movements" @@ -170,18 +246,21 @@ msgstr "Standaard rekeningen voor onverwachte mutaties" msgid "Confirm" msgstr "Bevestig" +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "" +"Statements found for account %(bank_account)s, '\n" +" 'but no default journal was defined." +msgstr "" +"Afschriften gevonden voor bankrekening %(bank_account)s, maar geen " +"gedefinieerd dagboek gevonden hiervoor." + #. module: account_banking #: field:account.banking.account.settings,default_credit_account_id:0 msgid "Default credit account" msgstr "Standaard credit-rekening" -#. module: account_banking -#: code:addons/account_banking/wizard/bank_import.py:0 -#, python-format -msgid "Statements found for account %(bank_account)s, '\n" -" 'but no default journal was defined." -msgstr "Afschriften gevonden voor bankrekening %(bank_account)s, maar geen gedefinieerd dagboek gevonden hiervoor." - #. module: account_banking #: field:account.bank.statement.line,international:0 msgid "International Transaction" @@ -218,8 +297,18 @@ msgstr "Fout !" #. module: account_banking #: code:addons/account_banking/account_banking.py:0 #, python-format -msgid "The account entries lines are not in valid state." -msgstr "De boekingsregels zijn niet geldig." +msgid "Invalid data" +msgstr "Ongeldige gegevens" + +#. module: account_banking +#: model:res.partner.bank.type.field,name:account_banking.bank_normal_field_contry +msgid "country_id" +msgstr "country_id" + +#. module: account_banking +#: selection:payment.line,export_state:0 +msgid "Rejected" +msgstr "Geweigerd" #. module: account_banking #: model:ir.actions.act_window,name:account_banking.action_account_banking_journals @@ -235,12 +324,34 @@ msgstr "Importeer bankafschrift bestand" #. module: account_banking #: help:account_banking.banking_import,init,file:0 -msgid "The Transactions File to import. Please note that while it is perfectly safe to reload the same file multiple times or to load in timeframe overlapping statements files, there are formats that may introduce different sequencing, which may create double entries.\n" +msgid "" +"The Transactions File to import. Please note that while it is perfectly safe " +"to reload the same file multiple times or to load in timeframe overlapping " +"statements files, there are formats that may introduce different sequencing, " +"which may create double entries.\n" "\n" -"To stay on the safe side, always load bank statements files using the same format." -msgstr "Het te importeren transactiebestand. Let alstublieft op: hoewel het zondermeer veilig is om hetzelfde bestand meerdere keren te importeren of om in tijd overlappende bestanden te importeren, zijn er formaten die een ander nummeringsschema introduceren, wat tot problemen kan leiden.\n" +"To stay on the safe side, always load bank statements files using the same " +"format." +msgstr "" +"Het te importeren transactiebestand. Let alstublieft op: hoewel het " +"zondermeer veilig is om hetzelfde bestand meerdere keren te importeren of om " +"in tijd overlappende bestanden te importeren, zijn er formaten die een ander " +"nummeringsschema introduceren, wat tot problemen kan leiden.\n" "\n" -"Om aan de veilige kant te blijven, importeer altijd transactiebestanden in hetzelfde formaat." +"Om aan de veilige kant te blijven, importeer altijd transactiebestanden in " +"hetzelfde formaat." + +#. module: account_banking +#: field:account.banking.imported.file,state:0 +#: field:payment.line,export_state:0 +msgid "State" +msgstr "Status" + +#. module: account_banking +#: code:addons/account_banking/sepa/bbantoiban.py:0 +#, python-format +msgid "This is a stub. Please implement your own code" +msgstr "Dit is een stub. Maak alstublieft uw eigen versie." #. module: account_banking #: constraint:ir.ui.view:0 @@ -253,8 +364,9 @@ msgid "Imported Bank Statements" msgstr "Geïmporteerde bankafschriften" #. module: account_banking -#: wizard_view:account_banking.banking_import,import:0 #: wizard_view:account_banking.banking_import,init:0 +#: wizard_view:account_banking.banking_import,view_error:0 +#: wizard_view:account_banking.banking_import,view_statements:0 msgid "Import Bank Transactions File" msgstr "Importeer banktransacties-bestand" @@ -276,23 +388,41 @@ msgid "More then one possible match found for partner with name %(name)s" msgstr "Meer dan één mogelijke match gevonden voor partner met naam %(name)s" #. module: account_banking -#: field:account.banking.imported.file,state:0 -#: field:payment.line,export_state:0 -msgid "State" -msgstr "Status" - +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "" +"Statement for account %(bank_account)s uses different '\n" +" 'currency than the defined bank journal." +msgstr "" +"Afschrift voor bankrekening %(bank_account)s gebruikt '\n" +" 'andere valuta dan opgegeven in het bankdagboek." #. module: account_banking -#: code:addons/account_banking/wizard/banktools.py:0 +#: code:addons/account_banking/wizard/bank_import.py:0 #, python-format -msgid "No suitable period found for date %(date)s" -msgstr "Geen geschikte periode gevonden voor datum %(date)s" +msgid "ERROR!" +msgstr "FOUT!" #. module: account_banking -#: code:addons/account_banking/wizard/banktools.py:0 +#: code:addons/account_banking/account_banking.py:0 #, python-format -msgid "Multiple overlapping periods for date %(date)s" -msgstr "Meerdere overlappende periodes gevonden voor datum %(date)s" +msgid "The account number has the wrong format for %(country)s" +msgstr "Het rekeningnummer heeft het verkeerde formaat voor %(country)s" + +#. module: account_banking +#: field:account.bank.statement.line,currency:0 +msgid "Currency" +msgstr "Valuta" + +#. module: account_banking +#: field:account.banking.imported.file,file:0 +msgid "Raw Data" +msgstr "Ruwe data" + +#. module: account_banking +#: field:payment.line,msg:0 +msgid "Message" +msgstr "Bericht" #. module: account_banking #: field:account.banking.account.settings,company_id:0 @@ -302,14 +432,16 @@ msgid "Company" msgstr "Bedrijf" #. module: account_banking -#: wizard_field:account_banking.banking_import,import,log:0 +#: wizard_field:account_banking.banking_import,view_error,log:0 +#: wizard_field:account_banking.banking_import,view_statements,log:0 msgid "Log" msgstr "Logboek" #. module: account_banking -#: field:account.banking.imported.file,file:0 -msgid "Raw Data" -msgstr "Ruwe data" +#: code:addons/account_banking/parsers/models.py:0 +#, python-format +msgid "Invalid value for transfer_type" +msgstr "Ongeldige waarde voor transfer_type" #. module: account_banking #: code:addons/account_banking/account_banking.py:0 @@ -317,120 +449,6 @@ msgstr "Ruwe data" msgid "Configration Error !" msgstr "Instellingsfout!" -#. module: account_banking -#: model:ir.module.module,description:account_banking.module_meta_information -msgid "\n" -" Module to do banking.\n" -"\n" -" This modules tries to combine all current banking import and export\n" -" schemes. Rationale for this is that it is quite common to have foreign\n" -" bank account numbers next to national bank account numbers. The current\n" -" approach, which hides the national banking interface schemes in the\n" -" l10n_xxx modules, makes it very difficult to use these simultanious.\n" -" A more banking oriented approach seems more logical and cleaner.\n" -"\n" -" Changes to default OpenERP:\n" -"\n" -" * Puts focus on the real life messaging with banks:\n" -" + Bank statement lines upgraded to independent bank transactions.\n" -" + Banking statements have no special accountancy meaning, they're just\n" -" message envelopes for a number of bank transactions.\n" -" + Bank statements can be either encoded by hand to reflect the document\n" -" version of Bank Statements, or created as an optional side effect of\n" -" importing Bank Transactions.\n" -"\n" -" * Preparations for SEPA:\n" -" + IBAN accounts are the standard in the SEPA countries\n" -" + local accounts are derived from SEPA (excluding Turkey) but are\n" -" considered to be identical to the corresponding SEPA account.\n" -" + Banks are identified with either Country + Bank code + Branch code or BIC\n" -" + Each bank can have its own pace in introducing SEPA into their\n" -" communication with their customers.\n" -" + National online databases can be used to convert BBAN's to IBAN's.\n" -"\n" -" * Adds dropin extensible import facility for bank communication in:\n" -" + MultiBank (NL) format transaction files,\n" -" - (todo) MT940 (Swift) format transaction files,\n" -" - (todo) CODA (BE) format transaction files,\n" -" - (wish) SEPA Credits (ISO 200022) messages,\n" -"\n" -" * Extends payments for digital banking:\n" -" + Adapted workflow in payments to reflect banking operations\n" -" + Relies on account_payment mechanics to extend with export generators.\n" -" - ClieOp3 (NL) payment and direct debit orders files available as\n" -" account_banking_nl_clieop\n" -" - (wish) BTL91 (NL) payment orders files (no format description available),\n" -" - (wish) SEPA Direct Debits (ISO 200022) messages\n" -"\n" -" * Additional features for the import/export mechanism:\n" -" + Automatic matching and creation of bank accounts, banks and partners,\n" -" during import of statements.\n" -" + Automatic matching with invoices and payments.\n" -" + Sound import mechanism, allowing multiple imports of the same\n" -" transactions repeated over multiple files.\n" -" + Journal configuration per bank account.\n" -" + Business logic and format parsing strictly separated to ease the\n" -" development of new parsers.\n" -" + No special configuration needed for the parsers, new parsers are\n" -" recognized and made available at server (re)start.\n" -" " -msgstr " Module voor bankzaken.\n" -"\n" -" Deze module probeert alle bestaande bankimport- en -exportschema's\n" -" te combineren. Ratio hierachter is dat het vrij gebruikelijk is om\n" -" buitenlandse bankrekeningen te hebben naast nationale-. De huidige\n" -" benadering waarbij nationale bankinterfaces ondergebracht worden in\n" -" de l10n_xxx modules, maakt het zeer lastig om deze naast elkaar te\n" -" gebruiken. Een meer bank-geöriënteerde benadering lijkt logischer en\n" -" 'schoner'.\n" -"\n" -" Wijzigingen op standaard OpenERP:\n" -"\n" -" * Legt focus op berichtuitwisseling met banken:\n" -" + Bankafschriftregels opgewaardeerd naar onafhankelijke banktransacties.\n" -" + Bankafschriften hebben geen speciale accountancy-betekenis, ze zijn\n" -" slechts enveloppen voor een reeks banktransacties.\n" -" + Bankafschriften kunnen hetzij met de hand worden ingevoerd als projectie\n" -" van de papieren versie, of gemaakt worden als neveneffect van het\n" -" importeren van banktransacties.\n" -"\n" -" * Voorbereidingen voor SEPA:\n" -" + IBAN bankrekeningen zijn de standaard in de SEPA-landen\n" -" + lokale bankrekeningen worden afgeleid van SEPA (uitgezonderd Turkije)\n" -" maar worden beschouwd als identiek aan de corresponderende IBAN-rekening.\n" -" + Banken worden geïdentificeerd met hetzij land + bankcode + branchcode of BIC\n" -" - Each bank can have its own pace in introducing SEPA into their\n" -" communication with their customers.\n" -" + Nationale online databases kunnen gebruikt worden om BBAN's naar IBAN's te\n" -" converteren.\n" -"\n" -" * Geeft dropin uitbreidbare importvoorzieningen voor bankcommunicatie in:\n" -" + MultiBank (NL) formaat transactiebestanden,\n" -" - (todo) MT940 (Swift) formaat transactiebestanden,\n" -" - (todo) CODA (BE) formaat transactiebestanden,\n" -" - (wish) SEPA Credits (ISO 200022) berichten,\n" -"\n" -" * Breidt betalingen uit voor digitaal bankieren:\n" -" + Werkstroom in betalingen aangepast voor bank-operaties\n" -" + Bouwt op account_payment mechanieken voor uitbreidingen met export generatoren.\n" -" - ClieOp3 (NL) betalings- en incasso-opdrachten beschikbaar in de\n" -" account_banking_nl_clieop module\n" -" - (wish) BTL91 (NL) batalingsopdrachten (geen formaatbeschrijving beschikbaar),\n" -" - (wish) SEPA Direct Debits (ISO 200022) berichten\n" -"\n" -" * Toegevoegde mogelijkheden voor het import/export mechanisme:\n" -" + Automatische koppeling en aanmaken van bankrekeningen, banken en relaties\n" -" tijdens het importeren van transacties.\n" -" + Automatisch koppelen met facturen en betalingen.\n" -" + Solide importmechanisme dat meerdere imports van dezelfde transacties over\n" -" over meerdere bestanden toestaat.\n" -" + Dagboek-instellingen per bankrekening.\n" -" + Business logica en bestands-parsing strikt gescheiden om de ontwikkeling\n" -" van nieuwe parsers te vergemakkelijken\n" -" + Geen speciale configuratie nodig voor de parsers, nieuwe parsers worden\n" -" herkend en beschikbaar gemaakt voor gebuikers bij server(her)start.\n" -" " - #. module: account_banking #: model:ir.actions.act_window,name:account_banking.act_account_payment_account_bank_statement msgid "Bank Statements File" @@ -442,6 +460,14 @@ msgstr "Bankafschrift bestand" msgid "This is a stub. Please implement your own." msgstr "Dit is een stub. Maak alstublieft uw eigen versie." +#. module: account_banking +#: code:addons/account_banking/wizard/banktools.py:0 +#, python-format +msgid "No suitable period found for date %(date)s and company %(company_name)s" +msgstr "" +"Geen geschikt boekjaar gevonden voor datum %(date)s en bedrijf %" +"(company_name)s" + #. module: account_banking #: view:account.banking.imported.file:0 #: model:ir.actions.act_window,name:account_banking.action_account_banking_imported_files @@ -449,6 +475,12 @@ msgstr "Dit is een stub. Maak alstublieft uw eigen versie." msgid "Imported Bank Statements Files" msgstr "Geïmporteerde bankafschrift bestanden" +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "The account number appears to be invalid for %(country)s" +msgstr "Het bankrekeningnummer blijkt ongeldig te zijn voor %(country)s" + #. module: account_banking #: field:account.bank.statement,banking_id:0 msgid "Imported File" @@ -460,6 +492,15 @@ msgstr "Geïmporteerd bestand" msgid "Import Log" msgstr "Import log" +#. module: account_banking +#: code:addons/account_banking/wizard/banktools.py:0 +#, python-format +msgid "" +"Multiple overlapping periods for date %(date)s and company %(company_name)s" +msgstr "" +"Meerdere overlappende periodes gevonden voor datum %(date)s en bedrijf %" +"(company_name)s" + #. module: account_banking #: code:addons/account_banking/wizard/bank_import.py:0 #, python-format @@ -483,12 +524,27 @@ msgstr "Bankzaken" msgid "Error" msgstr "Fout" +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "Total number of statements" +msgstr "Totaal aantal afschriften" + #. module: account_banking #: code:addons/account_banking/account_banking.py:0 #, python-format msgid "Unable to reconcile entry \"%s\": %.2f" msgstr "Niet in staat boeking af te letteren \"%s\": %.2f" +#. module: account_banking +#: code:addons/account_banking/wizard/banktools.py:0 +#, python-format +msgid "" +"No suitable fiscal year found for date %(date)s and company %(company_name)s" +msgstr "" +"Geen geschikt boekjaar gevonden voor datum %(date)s en bedrijf %" +"(company_name)s" + #. module: account_banking #: view:account.banking.imported.file:0 msgid "Import Details" @@ -522,8 +578,10 @@ msgstr "Het saldo op het afschrift is onjuist!\n" #. module: account_banking #: 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 !" +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 #: selection:account.banking.imported.file,state:0 @@ -542,10 +600,15 @@ msgid "Account Banking" msgstr "Account Banking" #. module: account_banking -#: code:addons/account_banking/wizard/bank_import.py:0 +#: wizard_button:account_banking.banking_import,view_error,open_import:0 +msgid "_View Imported File" +msgstr "_Bekijk geïmporteerd bestand" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 #, python-format -msgid "Total number of statements" -msgstr "Totaal aantal afschriften" +msgid "The IBAN number doesn't seem to be correct" +msgstr "Het IBAN-nummer lijkt niet correct te zijn" #. module: account_banking #: field:account.banking.imported.file,format:0 @@ -553,6 +616,16 @@ msgstr "Totaal aantal afschriften" msgid "File Format" msgstr "Bestandsformaat" +#. module: account_banking +#: code:addons/account_banking/wizard/banktools.py:0 +#, python-format +msgid "" +"Multiple overlapping fiscal years found for date %(date)s and company %" +"(company_name)s" +msgstr "" +"Meerdere overlappende boekjaren gevonden voor datum %(date)s en bedrijf %" +"(company_name)s" + #. module: account_banking #: field:account.banking.account.settings,journal_id:0 msgid "Journal" @@ -563,25 +636,11 @@ msgstr "Dagboek" msgid "Finished" msgstr "Gereed" -#. module: account_banking -#: code:addons/account_banking/wizard/banktools.py:0 -#, python-format -msgid "No suitable fiscal year found for company %(company_name)s" -msgstr "Geen geschikt boekjaar gevonden voor bedrijf %(company_name)s" - #. module: account_banking #: view:account.banking.account.settings:0 msgid "Bank Account Details" msgstr "Details bankrekening" -#. module: account_banking -#: code:addons/account_banking/wizard/bank_import.py:0 -#, python-format -msgid "Unable to link transaction %(trans)s to invoice: '\n" -" '%(no_candidates)s candidates found; can't choose." -msgstr "Niet in staat transactie %(trans)s aan factuur te koppelen: '\n" -" '%(no_candidates)s kandidaten gevonden; kan niet kiezen." - #. module: account_banking #: field:account.bank.statement.line,partner_bank_id:0 #: field:account.banking.account.settings,partner_bank_id:0 @@ -595,10 +654,163 @@ msgid "Number of transactions loaded" msgstr "Aantal geladen transacties" #. module: account_banking -#: code:addons/account_banking/wizard/banktools.py:0 +#: model:ir.module.module,description:account_banking.module_meta_information +msgid "" +"\n" +" Module to do banking.\n" +"\n" +" Note: This module is depending on BeautifulSoup.\n" +"\n" +" This modules tries to combine all current banking import and export\n" +" schemes. Rationale for this is that it is quite common to have foreign\n" +" bank account numbers next to national bank account numbers. The current\n" +" approach, which hides the national banking interface schemes in the\n" +" l10n_xxx modules, makes it very difficult to use these simultanious.\n" +" A more banking oriented approach seems more logical and cleaner.\n" +"\n" +" Changes to default OpenERP:\n" +"\n" +" * Puts focus on the real life messaging with banks:\n" +" + Bank statement lines upgraded to independent bank transactions.\n" +" + Banking statements have no special accountancy meaning, they're " +"just\n" +" message envelopes for a number of bank transactions.\n" +" + Bank statements can be either encoded by hand to reflect the " +"document\n" +" version of Bank Statements, or created as an optional side effect " +"of\n" +" importing Bank Transactions.\n" +"\n" +" * Preparations for SEPA:\n" +" + IBAN accounts are the standard in the SEPA countries\n" +" + local accounts are derived from SEPA (excluding Turkey) but are\n" +" considered to be identical to the corresponding SEPA account.\n" +" + Banks are identified with either Country + Bank code + Branch code " +"or BIC\n" +" + Each bank can have its own pace in introducing SEPA into their\n" +" communication with their customers.\n" +" + National online databases can be used to convert BBAN's to IBAN's.\n" +" + The SWIFT database is consulted for bank information.\n" +"\n" +" * Adds dropin extensible import facility for bank communication in:\n" +" - Drop-in input parser development.\n" +" - MultiBank (NL) format transaction files available as\n" +" account_banking_nl_multibank,\n" +" - (todo) MT940 (Swift) format transaction files,\n" +" - (todo) CODA (BE) format transaction files,\n" +" - (wish) SEPA Credits (ISO 200022) messages,\n" +"\n" +" * Extends payments for digital banking:\n" +" + Adapted workflow in payments to reflect banking operations\n" +" + Relies on account_payment mechanics to extend with export " +"generators.\n" +" - ClieOp3 (NL) payment and direct debit orders files available as\n" +" account_banking_nl_clieop\n" +" - (wish) BTL91 (NL) payment orders files (no format description " +"available),\n" +" - (wish) SEPA Direct Debits (ISO 200022) messages\n" +"\n" +" * Additional features for the import/export mechanism:\n" +" + Automatic matching and creation of bank accounts, banks and " +"partners,\n" +" during import of statements.\n" +" + Automatic matching with invoices and payments.\n" +" + Sound import mechanism, allowing multiple imports of the same\n" +" transactions repeated over multiple files.\n" +" + Journal configuration per bank account.\n" +" + Business logic and format parsing strictly separated to ease the\n" +" development of new parsers.\n" +" + No special configuration needed for the parsers, new parsers are\n" +" recognized and made available at server (re)start.\n" +" " +msgstr "" +" Module voor bankzaken.\n" +"\n" +" Waarschuwing: deze module is afhankelijk van BeautifulSoup.\n" +"\n" +" Deze module probeert alle bestaande bankimport- en -exportschema's\n" +" te combineren. Ratio hierachter is dat het vrij gebruikelijk is om\n" +" buitenlandse bankrekeningen te hebben naast nationale-. De huidige\n" +" benadering waarbij nationale bankinterfaces ondergebracht worden in\n" +" de l10n_xxx modules, maakt het zeer lastig om deze naast elkaar te\n" +" gebruiken. Een meer bank-geöriënteerde benadering lijkt logischer en\n" +" 'schoner'.\n" +"\n" +" Wijzigingen op standaard OpenERP:\n" +"\n" +" * Legt focus op berichtuitwisseling met banken:\n" +" + Bankafschriftregels opgewaardeerd naar onafhankelijke " +"banktransacties.\n" +" + Bankafschriften hebben geen speciale accountancy-betekenis, ze zijn\n" +" slechts enveloppen voor een reeks banktransacties.\n" +" + Bankafschriften kunnen hetzij met de hand worden ingevoerd als " +"projectie\n" +" van de papieren versie, of gemaakt worden als neveneffect van het\n" +" importeren van banktransacties.\n" +"\n" +" * Voorbereidingen voor SEPA:\n" +" + IBAN bankrekeningen zijn de standaard in de SEPA-landen\n" +" + lokale bankrekeningen worden afgeleid van SEPA (uitgezonderd " +"Turkije)\n" +" maar worden beschouwd als identiek aan de corresponderende IBAN-" +"rekening.\n" +" + Banken worden geïdentificeerd met hetzij land + bankcode + " +"branchcode of BIC\n" +" - Each bank can have its own pace in introducing SEPA into their\n" +" communication with their customers.\n" +" + Nationale online databases kunnen gebruikt worden om BBAN's naar " +"IBAN's te\n" +" converteren.\n" +"\n" +" * Geeft dropin uitbreidbare importvoorzieningen voor bankcommunicatie " +"in:\n" +" + MultiBank (NL) formaat transactiebestanden,\n" +" - (todo) MT940 (Swift) formaat transactiebestanden,\n" +" - (todo) CODA (BE) formaat transactiebestanden,\n" +" - (wish) SEPA Credits (ISO 200022) berichten,\n" +"\n" +" * Breidt betalingen uit voor digitaal bankieren:\n" +" + Werkstroom in betalingen aangepast voor bank-operaties\n" +" + Bouwt op account_payment mechanieken voor uitbreidingen met export " +"generatoren.\n" +" - ClieOp3 (NL) betalings- en incasso-opdrachten beschikbaar in de\n" +" account_banking_nl_clieop module\n" +" - (wish) BTL91 (NL) batalingsopdrachten,\n" +" - (wish) SEPA Direct Debits (ISO 200022) berichten\n" +"\n" +" * Toegevoegde mogelijkheden voor het import/export mechanisme:\n" +" + Automatische koppeling en aanmaken van bankrekeningen, banken en " +"relaties\n" +" tijdens het importeren van transacties.\n" +" + Automatisch koppelen met facturen en betalingen.\n" +" + Solide importmechanisme dat meerdere imports van dezelfde " +"transacties over\n" +" over meerdere bestanden toestaat.\n" +" + Dagboek-instellingen per bankrekening.\n" +" + Business logica en bestands-parsing strikt gescheiden om de " +"ontwikkeling\n" +" van nieuwe parsers te vergemakkelijken\n" +" + Geen speciale configuratie nodig voor de parsers, nieuwe parsers " +"worden\n" +" herkend en beschikbaar gemaakt voor gebuikers bij server(her)start.\n" +" " + +#. module: account_banking +#: model:res.partner.bank.type.field,name:account_banking.bank_acc_number_field +msgid "acc_number" +msgstr "acc_number" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 #, python-format -msgid "Multiple overlapping fiscal years found for date %(date)s" -msgstr "Meerdere overlappende boekjaren gevonden voor datum %(date)s" +msgid "Number of transactions matched" +msgstr "Aantal transacties herkend" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "The account entries lines are not in valid state." +msgstr "De boekingsregels zijn niet geldig." #. module: account_banking #: model:ir.model,name:account_banking.model_account_banking_imported_file diff --git a/account_banking/i18n/ro.po b/account_banking/i18n/ro.po new file mode 100644 index 000000000..76e235bf9 --- /dev/null +++ b/account_banking/i18n/ro.po @@ -0,0 +1,764 @@ +# Romanian 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: support@openerp.com\n" +"POT-Creation-Date: 2010-06-29 14:33:53+0000\n" +"PO-Revision-Date: 2010-05-24 22:26+0000\n" +"Last-Translator: Lavinia Loredana Bertia \n" +"Language-Team: Romanian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "Number of bank costs invoices created" +msgstr "" + +#. module: account_banking +#: wizard_view:account_banking.banking_import,view_error:0 +#: wizard_view:account_banking.banking_import,view_statements:0 +msgid "Results:" +msgstr "Resultate:" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "Number of errors found" +msgstr "Număr de erori găsite" + +#. module: account_banking +#: wizard_view:account_banking.banking_import,init:0 +msgid "Select the processing details:" +msgstr "Selectați detaliile de procesare:" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "Invalid format" +msgstr "" + +#. module: account_banking +#: constraint:ir.actions.act_window:0 +msgid "Invalid model name in the action definition." +msgstr "Nume invalid de model în definirea acțiunii" + +#. module: account_banking +#: field:payment.line,date_done:0 +msgid "Date Confirmed" +msgstr "Dată confirmată" + +#. module: account_banking +#: wizard_button:account_banking.banking_import,view_statements,open_statements:0 +msgid "_View Statements" +msgstr "_Vizualizează extrasurile de cont" + +#. module: account_banking +#: wizard_button:account_banking.banking_import,view_error,end:0 +#: wizard_button:account_banking.banking_import,view_statements,end:0 +msgid "_Close" +msgstr "_Închide" + +#. module: account_banking +#: field:account.banking.account.settings,bank_partner_id:0 +msgid "Bank Partner" +msgstr "" + +#. module: account_banking +#: model:ir.model,name:account_banking.model_account_banking_account_settings +#: model:ir.model,name:account_banking.model_account_banking_bank_journal +msgid "Default Journal for Bank Account" +msgstr "" + +#. module: account_banking +#: wizard_field:account_banking.banking_import,init,file:0 +msgid "Statements File" +msgstr "Fișier de extrasuri de cont" + +#. module: account_banking +#: code:addons/account_banking/wizard/banktools.py:0 +#, python-format +msgid "" +"More than one bank account was found with the same number %(account_no)s" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "Total number of transactions" +msgstr "Număr total de tranzacții" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "Account move line \"%s\" is not valid" +msgstr "înregistrarea contabilă \"%s\" nu este validă" + +#. module: account_banking +#: help:account.banking.account.settings,default_debit_account_id:0 +msgid "" +"The account to use when an unexpected payment is received. This can be " +"needed when a customer pays in advance or when no matching invoice can be " +"found. Mind that you can correct movements before confirming them." +msgstr "" +"Contul ce trebuie folosit când este primită o plată neașteptată. Acesta " +"poate fi necesitat când un client plătește în avans sau când nu este găsită " +"factura aferentă. Tranzacțiile pot fi corectate înainte de a fi confirmate." + +#. module: account_banking +#: code:addons/account_banking/wizard/banktools.py:0 +#, python-format +msgid "Bank account %(account_no)s was not found in the database" +msgstr "Contul bancar %(account_no)s nu a fost găsit în baza de date." + +#. module: account_banking +#: view:account.banking.account.settings:0 +msgid "Generation of Bank Costs Invoices" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "Number of transactions skipped due to errors" +msgstr "S-a sărit peste o serie de tranzacții din cauza unor erori." + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "" +"The expected balance (%.2f) is different '\n" +" 'than the computed one. (%.2f)" +msgstr "" +"Soldul preconizat (%.2f) este diferit '\n" +" ' de cel calculat. (%.2f)" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "" +"Unable to link transaction id %(trans)s (ref: %(ref)s) to invoice: '\n" +" '%(no_candidates)s candidates found; can\'t choose." +msgstr "" + +#. module: account_banking +#: field:account.banking.account.settings,invoice_journal_id:0 +msgid "Costs Journal" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "Number of statements skipped due to errors" +msgstr "S-a sărit peste o serie de extrasuri de cont din cauza unor erori" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "Invalid IBAN account number!" +msgstr "IBAN invalid!" + +#. module: account_banking +#: view:account.banking.account.settings:0 +msgid "Default Import Settings for Bank Account" +msgstr "Setări implicite de importare pentru Contul Bancar" + +#. module: account_banking +#: help:account.banking.account.settings,default_credit_account_id:0 +msgid "" +"The account to use when an unexpected payment was signaled. This can happen " +"when a direct debit payment is cancelled by a customer, or when no matching " +"payment can be found. Mind that you can correct movements before confirming " +"them." +msgstr "" +"Contul ce trebuie folosit când este semnalată o plată neașteptată. Aceasta " +"se poate întâmpla când un client anulează un debit direct, sau când nu este " +"găsită plata aferentă. Tranzacțiile pot fi modificate înainte de a fi " +"confirmate." + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "Unable to import parser %(parser)s. Parser class not found." +msgstr "" +"Nu se poate importa analizatorul %(parser)s. Categoria analizatorului nu a " +"fost găsită." + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "Insufficient data" +msgstr "" + +#. module: account_banking +#: selection:payment.line,export_state:0 +msgid "Cancelled" +msgstr "Anulat" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "" +"Insufficient data to select online '\n" +" 'conversion database" +msgstr "" + +#. module: account_banking +#: view:account.banking.imported.file:0 +#: field:account.banking.imported.file,statement_ids:0 +msgid "Statements" +msgstr "" + +#. module: account_banking +#: field:account.banking.account.settings,default_debit_account_id:0 +msgid "Default debit account" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/wizard/banktools.py:0 +#, python-format +msgid "Unknown Bank" +msgstr "Bancă necunoscută" + +#. module: account_banking +#: field:account.banking.imported.file,date:0 +msgid "Import Date" +msgstr "Importă data" + +#. module: account_banking +#: selection:payment.line,export_state:0 +msgid "Confirmed" +msgstr "Confirmat" + +#. module: account_banking +#: model:ir.actions.act_window,name:account_banking.action_account_banking_res_partner_banks +#: model:ir.ui.menu,name:account_banking.menu_action_account_banking_bank_accounts +msgid "Bank Accounts" +msgstr "Conturi bancare" + +#. module: account_banking +#: view:account.banking.account.settings:0 +msgid "Default Accounts for Unknown Movements" +msgstr "Conturi Implicite pentru Tranzacții Necunoscute" + +#. module: account_banking +#: view:account.bank.statement:0 +msgid "Confirm" +msgstr "Confirmă" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "" +"Statements found for account %(bank_account)s, '\n" +" 'but no default journal was defined." +msgstr "" +"Extrasuri de cont găsite pentru contul %(bank_account)s, '\n" +" ' dar s-a setat nici un jurnal implicit." + +#. module: account_banking +#: field:account.banking.account.settings,default_credit_account_id:0 +msgid "Default credit account" +msgstr "Cont de credit implicit" + +#. module: account_banking +#: field:account.bank.statement.line,international:0 +msgid "International Transaction" +msgstr "Tranzacție Internațională" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "Please verify that an account is defined in the journal." +msgstr "Verificaţi dacă acest cont este definit în jurnal." + +#. module: account_banking +#: field:account.bank.statement.line,trans:0 +msgid "Bank Transaction ID" +msgstr "ID-ul Tranzacției Bancare" + +#. module: account_banking +#: help:account.banking.account.settings,invoice_journal_id:0 +msgid "This is the journal used to create invoices for bank costs." +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "Statement %(id)s known - skipped" +msgstr "Extrasul %(id)s este recunoscut - s-a sărit peste el" + +#. module: account_banking +#: selection:payment.line,export_state:0 +msgid "Sent" +msgstr "S-a trimis" + +#. module: account_banking +#: help:account.banking.account.settings,costs_account_id:0 +msgid "" +"The account to use when the bank invoices its own costs. Leave it blank to " +"disable automatic invoice generation on bank costs." +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "Error !" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "Invalid data" +msgstr "" + +#. module: account_banking +#: model:res.partner.bank.type.field,name:account_banking.bank_normal_field_contry +msgid "country_id" +msgstr "" + +#. module: account_banking +#: selection:payment.line,export_state:0 +msgid "Rejected" +msgstr "" + +#. module: account_banking +#: model:ir.actions.act_window,name:account_banking.action_account_banking_journals +#: model:ir.ui.menu,name:account_banking.menu_action_account_banking_bank_journals +msgid "Default Import Settings for Bank Accounts" +msgstr "" + +#. module: account_banking +#: model:ir.actions.wizard,name:account_banking.wizard_account_banking_import_file +#: model:ir.ui.menu,name:account_banking.menu_account_banking_import_wizard +msgid "Import Bank Statements File" +msgstr "" + +#. module: account_banking +#: help:account_banking.banking_import,init,file:0 +msgid "" +"The Transactions File to import. Please note that while it is perfectly safe " +"to reload the same file multiple times or to load in timeframe overlapping " +"statements files, there are formats that may introduce different sequencing, " +"which may create double entries.\n" +"\n" +"To stay on the safe side, always load bank statements files using the same " +"format." +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/sepa/bbantoiban.py:0 +#, python-format +msgid "This is a stub. Please implement your own code" +msgstr "" + +#. module: account_banking +#: constraint:ir.ui.view:0 +msgid "Invalid XML for View Architecture!" +msgstr "" + +#. module: account_banking +#: view:account.banking.imported.file:0 +msgid "Imported Bank Statements" +msgstr "" + +#. module: account_banking +#: wizard_button:account_banking.banking_import,init,end:0 +msgid "_Cancel" +msgstr "_Anulează" + +#. module: account_banking +#: model:ir.module.module,description:account_banking.module_meta_information +msgid "" +"\n" +" Module to do banking.\n" +"\n" +" Note: This module is depending on BeautifulSoup.\n" +"\n" +" This modules tries to combine all current banking import and export\n" +" schemes. Rationale for this is that it is quite common to have foreign\n" +" bank account numbers next to national bank account numbers. The current\n" +" approach, which hides the national banking interface schemes in the\n" +" l10n_xxx modules, makes it very difficult to use these simultanious.\n" +" A more banking oriented approach seems more logical and cleaner.\n" +"\n" +" Changes to default OpenERP:\n" +"\n" +" * Puts focus on the real life messaging with banks:\n" +" + Bank statement lines upgraded to independent bank transactions.\n" +" + Banking statements have no special accountancy meaning, they're " +"just\n" +" message envelopes for a number of bank transactions.\n" +" + Bank statements can be either encoded by hand to reflect the " +"document\n" +" version of Bank Statements, or created as an optional side effect " +"of\n" +" importing Bank Transactions.\n" +"\n" +" * Preparations for SEPA:\n" +" + IBAN accounts are the standard in the SEPA countries\n" +" + local accounts are derived from SEPA (excluding Turkey) but are\n" +" considered to be identical to the corresponding SEPA account.\n" +" + Banks are identified with either Country + Bank code + Branch code " +"or BIC\n" +" + Each bank can have its own pace in introducing SEPA into their\n" +" communication with their customers.\n" +" + National online databases can be used to convert BBAN's to IBAN's.\n" +" + The SWIFT database is consulted for bank information.\n" +"\n" +" * Adds dropin extensible import facility for bank communication in:\n" +" - Drop-in input parser development.\n" +" - MultiBank (NL) format transaction files available as\n" +" account_banking_nl_multibank,\n" +"\n" +" * Extends payments for digital banking:\n" +" + Adapted workflow in payments to reflect banking operations\n" +" + Relies on account_payment mechanics to extend with export " +"generators.\n" +" - ClieOp3 (NL) payment and direct debit orders files available as\n" +" account_banking_nl_clieop\n" +"\n" +" * Additional features for the import/export mechanism:\n" +" + Automatic matching and creation of bank accounts, banks and " +"partners,\n" +" during import of statements.\n" +" + Automatic matching with invoices and payments.\n" +" + Sound import mechanism, allowing multiple imports of the same\n" +" transactions repeated over multiple files.\n" +" + Journal configuration per bank account.\n" +" + Business logic and format parsing strictly separated to ease the\n" +" development of new parsers.\n" +" + No special configuration needed for the parsers, new parsers are\n" +" recognized and made available at server (re)start.\n" +" " +msgstr "" + +#. module: account_banking +#: wizard_view:account_banking.banking_import,init:0 +#: wizard_view:account_banking.banking_import,view_error:0 +#: wizard_view:account_banking.banking_import,view_statements:0 +msgid "Import Bank Transactions File" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/wizard/banktools.py:0 +#, python-format +msgid "Account %(account_no)s is not owned by %(partner)s" +msgstr "" + +#. module: account_banking +#: wizard_button:account_banking.banking_import,init,import:0 +msgid "_Ok" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/wizard/banktools.py:0 +#, python-format +msgid "More then one possible match found for partner with name %(name)s" +msgstr "" + +#. module: account_banking +#: field:account.banking.imported.file,state:0 +#: field:payment.line,export_state:0 +msgid "State" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "ERROR!" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "The account number has the wrong format for %(country)s" +msgstr "" + +#. module: account_banking +#: field:account.bank.statement.line,currency:0 +msgid "Currency" +msgstr "" + +#. module: account_banking +#: field:account.banking.imported.file,file:0 +msgid "Raw Data" +msgstr "" + +#. module: account_banking +#: field:payment.line,msg:0 +msgid "Message" +msgstr "" + +#. module: account_banking +#: field:account.banking.account.settings,company_id:0 +#: field:account.banking.imported.file,company_id:0 +#: wizard_field:account_banking.banking_import,init,company:0 +msgid "Company" +msgstr "" + +#. module: account_banking +#: wizard_field:account_banking.banking_import,view_error,log:0 +#: wizard_field:account_banking.banking_import,view_statements,log:0 +msgid "Log" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/parsers/models.py:0 +#, python-format +msgid "Invalid value for transfer_type" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "Configration Error !" +msgstr "" + +#. module: account_banking +#: model:ir.actions.act_window,name:account_banking.act_account_payment_account_bank_statement +msgid "Bank Statements File" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/parsers/models.py:0 +#, python-format +msgid "This is a stub. Please implement your own." +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/wizard/banktools.py:0 +#, python-format +msgid "No suitable period found for date %(date)s and company %(company_name)s" +msgstr "" + +#. module: account_banking +#: view:account.banking.imported.file:0 +#: model:ir.actions.act_window,name:account_banking.action_account_banking_imported_files +#: model:ir.ui.menu,name:account_banking.menu_action_account_banking_imported_files +msgid "Imported Bank Statements Files" +msgstr "" + +#. module: account_banking +#: field:account.bank.statement,banking_id:0 +msgid "Imported File" +msgstr "" + +#. module: account_banking +#: view:account.banking.imported.file:0 +#: field:account.banking.imported.file,log:0 +msgid "Import Log" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "" +"Statement for account %(bank_account)s uses different '\n" +" 'currency than the defined bank journal." +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/wizard/banktools.py:0 +#, python-format +msgid "" +"Multiple overlapping periods for date %(date)s and company %(company_name)s" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "The imported statements appear to be invalid! Check your file." +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "Number of statements loaded" +msgstr "" + +#. module: account_banking +#: model:ir.ui.menu,name:account_banking.menu_finance_banking_actions +#: model:ir.ui.menu,name:account_banking.menu_finance_banking_settings +msgid "Banking" +msgstr "" + +#. module: account_banking +#: selection:account.banking.imported.file,state:0 +msgid "Error" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "Total number of statements" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "Unable to reconcile entry \"%s\": %.2f" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/wizard/banktools.py:0 +#, python-format +msgid "" +"No suitable fiscal year found for date %(date)s and company %(company_name)s" +msgstr "" + +#. module: account_banking +#: view:account.banking.imported.file:0 +msgid "Import Details" +msgstr "" + +#. module: account_banking +#: field:account.bank.statement.line,period_id:0 +msgid "Period" +msgstr "" + +#. module: account_banking +#: selection:payment.line,export_state:0 +msgid "Done" +msgstr "" + +#. module: account_banking +#: view:payment.order:0 +msgid "Select Invoices to Pay" +msgstr "" + +#. module: account_banking +#: field:account.banking.imported.file,user_id:0 +msgid "Responsible User" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "The statement balance is incorrect !\n" +msgstr "" + +#. module: account_banking +#: constraint:ir.model:0 +msgid "" +"The Object name must start with x_ and not contain any special character !" +msgstr "" + +#. module: account_banking +#: selection:account.banking.imported.file,state:0 +msgid "Unfinished" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "Statements found for unknown account %(bank_account)s" +msgstr "" + +#. module: account_banking +#: model:ir.module.module,shortdesc:account_banking.module_meta_information +msgid "Account Banking" +msgstr "" + +#. module: account_banking +#: wizard_button:account_banking.banking_import,view_error,open_import:0 +msgid "_View Imported File" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "The IBAN number doesn't seem to be correct" +msgstr "" + +#. module: account_banking +#: field:account.banking.imported.file,format:0 +#: wizard_field:account_banking.banking_import,init,parser:0 +msgid "File Format" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/wizard/banktools.py:0 +#, python-format +msgid "" +"Multiple overlapping fiscal years found for date %(date)s and company %" +"(company_name)s" +msgstr "" + +#. module: account_banking +#: field:account.banking.account.settings,journal_id:0 +msgid "Journal" +msgstr "" + +#. module: account_banking +#: field:account.banking.account.settings,costs_account_id:0 +#, fuzzy +msgid "Bank Costs Account" +msgstr "Conturi bancare" + +#. module: account_banking +#: selection:account.banking.imported.file,state:0 +msgid "Finished" +msgstr "" + +#. module: account_banking +#: selection:payment.line,export_state:0 +msgid "Draft" +msgstr "Schiță" + +#. module: account_banking +#: view:account.banking.account.settings:0 +msgid "Bank Account Details" +msgstr "" + +#. module: account_banking +#: field:account.bank.statement.line,partner_bank_id:0 +#: field:account.banking.account.settings,partner_bank_id:0 +msgid "Bank Account" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, python-format +msgid "Number of transactions loaded" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "The account number appears to be invalid for %(country)s" +msgstr "" + +#. module: account_banking +#: model:res.partner.bank.type.field,name:account_banking.bank_acc_number_field +msgid "acc_number" +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/wizard/bank_import.py:0 +#, fuzzy, python-format +msgid "Number of transactions matched" +msgstr "Număr total de tranzacții" + +#. module: account_banking +#: help:account.banking.account.settings,bank_partner_id:0 +msgid "" +"The partner to use for bank costs. Banks are not partners by default. You " +"will most likely have to create one." +msgstr "" + +#. module: account_banking +#: code:addons/account_banking/account_banking.py:0 +#, python-format +msgid "The account entries lines are not in valid state." +msgstr "" + +#. module: account_banking +#: model:ir.model,name:account_banking.model_account_banking_imported_file +msgid "Imported Bank Statements File" +msgstr "" diff --git a/account_banking/parsers/models.py b/account_banking/parsers/models.py index 968a054a9..3ed4511b7 100644 --- a/account_banking/parsers/models.py +++ b/account_banking/parsers/models.py @@ -71,6 +71,62 @@ class mem_bank_transaction(object): 'reference', 'message', 'statement_id', ] + # transfer_type's to be used by the business logic. + # Depending on the type your parser gives a transaction, different + # behavior can be triggered in the business logic. + # + # BANK_COSTS Automated credited costs by the bank. + # Used to generate an automated invoice from the bank + # Will be excluded from matching. + # BANK_TERMINAL A cash withdrawal from a bank terminal. + # Will be excluded from matching. + # CHECK A delayed payment. Can be used to trigger extra + # moves from temporary accounts. (Money away). + # TODO: No special treatment yet. + # Will be selected for matching. + # DIRECT_DEBIT Speaks for itself. When outgoing (credit) and + # matched, can signal the matched invoice triaged. + # Will be selected for matching. + # ORDER Order to the bank. Can work both ways. + # Will be selected for matching. + # PAYMENT_BATCH A payment batch. Can work in both directions. + # Incoming payment batch transactions can't be + # matched with payments, outgoing can. + # Will be selected for matching. + # PAYMENT_TERMINAL A payment with debit/credit card in a (web)shop + # Invoice numbers and other hard criteria are most + # likely missing. + # Will be selected for matching + # PERIODIC_ORDER An automated payment by the bank on your behalf. + # Always outgoing. + # Will be selected for matching. + # + # Perhaps more will follow. + # + # When writing parsers, map other types with similar meaning to these to + # prevent cluttering the API. For example: the Dutch ING Bank has a + # transfer type Post Office, meaning a cash withdrawal from one of their + # agencies. This can be mapped to BANK_TERMINAL without losing any + # significance for OpenERP. + + BANK_COSTS = 'BC' + BANK_TERMINAL = 'BT' + CHECK = 'CK' + DIRECT_DEBIT = 'DD' + ORDER = 'DO' + PAYMENT_BATCH = 'PB' + PAYMENT_TERMINAL = 'PT' + PERIODIC_ORDER = 'PO' + + types = [ + BANK_COSTS, BANK_TERMINAL, CHECK, DIRECT_DEBIT, ORDER, + PAYMENT_BATCH, PAYMENT_TERMINAL, PERIODIC_ORDER, + ] + type_map = { + # This can be a translation map of type versus bank type. Each key is + # the real transfer_type, each value is the mem_bank_transaction.type + } + def __init__(self, *args, **kwargs): super(mem_bank_transaction, self).__init__(*args, **kwargs) self.id = '' @@ -87,6 +143,28 @@ class mem_bank_transaction(object): self.message = '' self.statement_id = '' + def copy(self): + ''' + Return a copy of self + ''' + retval = mem_bank_transaction() + for attr in self.__slots__: + setattr(retval, attr, getattr(self, attr)) + return retval + + def _get_type(self): + if self.transfer_type in self.type_map: + return self.type_map[self.transfer_type] + return self.transfer_type + + def _set_type(self, value): + if value in self.types: + self.transfer_type = value + else: + raise ValueError, _('Invalid value for transfer_type') + + type = property(_get_type, _set_type) + def is_valid(self): ''' Heuristic check: at least id, execution_date, remote_account and diff --git a/account_banking/sepa/__init__.py b/account_banking/sepa/__init__.py index 93f2dc0fe..e2e843ef1 100644 --- a/account_banking/sepa/__init__.py +++ b/account_banking/sepa/__init__.py @@ -21,3 +21,4 @@ import iban import online IBAN = iban.IBAN +BBAN = iban.BBAN diff --git a/account_banking/sepa/iban.py b/account_banking/sepa/iban.py index 7f92f311a..6f982e0ed 100644 --- a/account_banking/sepa/iban.py +++ b/account_banking/sepa/iban.py @@ -421,6 +421,98 @@ class IBAN(str): ''' return self[4:] +class BBAN(object): + ''' + Class to reformat a local BBAN account number to IBAN specs. + Simple validation based on length of spec string elements and real data. + ''' + + @staticmethod + def _get_length(fmt, element): + ''' + Internal method to calculate the length of a parameter in a + formatted string + ''' + i = 0; max_i = len(fmt._iban) + while i < max_i: + if fmt._iban[i] == element: + next = i +1 + while next < max_i and fmt._iban[next] == element: + next += 1 + return next - i + i += 1 + return 0 + + def __init__(self, bban, countrycode): + ''' + Reformat and sanity check on BBAN format. + Note that this is not a fail safe check, it merely checks the format of + the BBAN following the IBAN specifications. + ''' + if countrycode.upper() in IBAN.countries: + self._fmt = IBAN.BBAN_formats[countrycode.upper()] + res = '' + i = 0; j = 0; max_i = len(self._fmt._bban); max_j = len(bban) + while i < max_i and j < max_j: + while bban[j] in ' \t' and j < max_j: + j += 1 + if self._fmt._bban[i] == '%': + i += 1 + parm = self._fmt._bban[i] + if parm == 'I': + _bban = IBAN(bban) + if _bban.valid: + self._bban = str(_bban) + else: + self._bban = None + # Valid, so nothing else to do + return + elif parm in 'ABCDPSTVWXZ': + _len = self._get_length(self._fmt, parm) + addon = bban[j:j+_len] + if len(addon) != _len: + # Note that many accounts in the IBAN standard + # are allowed to have leading zeros, so zfill + # to full spec length for visual validation. + # + # Note 2: this may look funny to some, as most + # local schemes strip leading zeros. It allows + # us however to present the user a visual feedback + # in order to catch simple user mistakes as + # missing digits. + if parm == 'A': + res += addon.zfill(_len) + else: + # Invalid, just drop the work and leave + return + else: + res += addon + j += _len + elif self._fmt._bban[i] in [bban[j], ' ', '/', '-', '.']: + res += self._fmt._bban[i] + if self._fmt._bban[i] == bban[j]: + j += 1 + elif self._fmt._bban[i].isalpha(): + res += self._fmt._bban[i] + i += 1 + if i == max_i: + self._bban = res + else: + self._bban = None + + def __str__(self): + '''String representation''' + return self._bban + + def __unicode__(self): + '''Unicode representation''' + return unicode(self._bban) + + @property + def valid(self): + '''Simple check if BBAN is in the right format''' + return self._bban and True or False + if __name__ == '__main__': import sys for arg in sys.argv[1:]: diff --git a/account_banking/sepa/online.py b/account_banking/sepa/online.py index 724337751..ed8582552 100644 --- a/account_banking/sepa/online.py +++ b/account_banking/sepa/online.py @@ -27,6 +27,7 @@ import urllib, urllib2 from BeautifulSoup import BeautifulSoup from account_banking.sepa import postalcode from account_banking.sepa.urlagent import URLAgent, SoupForm +from account_banking.sepa.iban import IBAN from account_banking.struct import struct __all__ = [ @@ -91,8 +92,10 @@ def get_iban_bic_BE(bank_acc): # Parse the results soup = BeautifulSoup(response) - result = struct() - result.iban = contents(soup, 'IBAN').replace(' ', '') + iban = contents(soup, 'IBAN') + if iban.lower().startswith('not a'): + return None + result = struct(iban=iban.replace(' ', '')) result.bic = contents(soup, 'BIC').replace(' ', '') result.bank = contents(soup, 'BankName') @@ -104,10 +107,19 @@ def get_iban_bic_BE(bank_acc): def BBAN_is_IBAN(bank_acc): ''' - Straight copy, valid for SEPA members who switched to SEPA from old + Intelligent copy, valid for SEPA members who switched to SEPA from old standards before SEPA actually started. ''' - return bank_acc + if isinstance(bank_acc, IBAN): + iban_acc = bank_acc + else: + iban_acc = IBAN(bank_acc) + return struct( + account = str(bank_acc), + country_id = iban_acc.countrycode, + code = iban_acc.BIC_searchkey + # Note: BIC can not be constructed here! + ) _account_info = { # TODO: Add more online data banks @@ -124,11 +136,15 @@ _account_info = { def account_info(iso, bank_acc): ''' - Consult the online database for this country or return None + Consult the online database for this country to obtain its + corresponding IBAN/BIC number and other info available. + Raise NotImplemented when no information service could be found. + Returns None when a service was found but something went wrong. + Returns a dictionary (struct) of information when found. ''' if iso in _account_info: return _account_info[iso](bank_acc) - return None + raise NotImplementedError() bic_re = re.compile("[^']+'([^']*)'.*") SWIFTlink = 'http://www.swift.com/bsl/freequery.do' diff --git a/account_banking/wizard/bank_import.py b/account_banking/wizard/bank_import.py index e373f3fc8..2ff9f8185 100644 --- a/account_banking/wizard/bank_import.py +++ b/account_banking/wizard/bank_import.py @@ -18,6 +18,11 @@ # along with this program. If not, see . # ############################################################################## +# Many thanks to our contributors +# +# Kaspars Vilkens (KNdati): lenghty discussions, bugreports and bugfixes +# Stefan Rijnhart (Therp): bugreport and bugfix +# ''' This module contains the business logic of the wizard account_banking_import. The parsing is done in the parser modules. Every parser module is required to @@ -26,6 +31,7 @@ use parser.models as a mean of communication with the business logic. import pooler import time import wizard +import netsvc import base64 from tools import config from tools.translate import _ @@ -34,6 +40,8 @@ from account_banking.parsers.convert import * from account_banking.struct import struct from banktools import * +bt = models.mem_bank_transaction + def parser_types(*args, **kwargs): '''Delay evaluation of parser types until start of wizard, to allow depending modules to initialize and add their parsers to the list @@ -57,7 +65,7 @@ class banking_import(wizard.interface): log = dict(string='Log', type='text', readonly=True) ) - banking_import_form = ''' + import_form = '''
@@ -66,7 +74,7 @@ class banking_import(wizard.interface): ''' - banking_import_fields = dict( + import_fields = dict( company = dict( string = 'Company', type = 'many2one', @@ -95,11 +103,14 @@ class banking_import(wizard.interface): def __init__(self, *args, **kwargs): super(banking_import, self).__init__(*args, **kwargs) self.__state = '' + self.__linked_invoices = {} + self.__linked_payments = {} def _fill_results(self, *args, **kwargs): return {'log': self._log} - def _get_move_info(self, cursor, uid, move_line): + def _get_move_info(self, cursor, uid, move_line, partner_bank_id=False, + partial=False): reconcile_obj = self.pool.get('account.bank.statement.reconcile') type_map = { 'out_invoice': 'customer', @@ -107,7 +118,9 @@ class banking_import(wizard.interface): 'out_refund': 'customer', 'in_refund': 'supplier', } - retval = struct(move_line=move_line) + retval = struct(move_line=move_line, partner_id=move_line.partner_id.id, + partner_bank_id=partner_bank_id + ) retval.reference = move_line.ref if move_line.invoice: retval.invoice = move_line.invoice @@ -115,12 +128,16 @@ class banking_import(wizard.interface): else: retval.type = 'general' move_line.reconcile_id = reconcile_obj.create( - cursor, uid, {'line_ids': [(6, 0, [move_line.id])]} + cursor, uid, { + partial and 'line_partial_ids' or 'line_ids': [ + (6, 0, [move_line.id]) + ] + } ) return retval def _link_payment(self, cursor, uid, trans, payment_lines, - partner_id, bank_account_id, log): + partner_ids, bank_account_ids, log): ''' Find the payment order belonging to this reference - if there is one This is the easiest part: when sending payments, the returned bank info @@ -137,18 +154,21 @@ class banking_import(wizard.interface): ] if len(candidates) == 1: candidate = candidates[0] - payment_line_obj = self.pool.get('payment.line') - payment_line_obj.write(cursor, uid, [candidate.id], { - 'export_state': 'done', - 'date_done': trans.effective_date.strftime('%Y-%m-%d')} - ) - - return self._get_move_info(cursor, uid, candidate.move_line_id) + # Check cache to prevent multiple matching of a single payment + if candidate.id not in self.__linked_payments: + self.__linked_payments[candidate.id] = True + payment_line_obj = self.pool.get('payment.line') + payment_line_obj.write(cursor, uid, [candidate.id], { + 'export_state': 'done', + 'date_done': trans.effective_date.strftime('%Y-%m-%d')} + ) + + return self._get_move_info(cursor, uid, candidate.move_line_id) return False def _link_invoice(self, cursor, uid, trans, move_lines, - partner_id, bank_account_id, log): + partner_ids, bank_account_ids, log): ''' Find the invoice belonging to this reference - if there is one Use the sales journal to check. @@ -179,49 +199,188 @@ class banking_import(wizard.interface): 2. The wrong match was made. Statements are encoded in draft. You will have the opportunity to manually correct the wrong assumptions. + + Return values: + move_info: the move_line information belonging to the matched + invoice + new_trans: the new transaction when the current one was split. + This can happen when multiple invoices were paid with a single + bank transaction. ''' - # First on partner - candidates = [x for x in move_lines if x.partner_id.id == partner_id] + def eyecatcher(invoice): + ''' + Return the eyecatcher for an invoice + ''' + return invoice.type.startswith('in_') and invoice.name or \ + invoice.number + + def has_id_match(invoice, ref, msg): + ''' + Aid for debugging - way more comprehensible than complex + comprehension filters ;-) + + Match on ID of invoice (reference, name or number, whatever + available and sensible) + ''' + if invoice.reference: + # Reference always comes first, as it is manually set for a + # reason. + iref = invoice.reference.upper() + if iref in ref or iref in msg: + return True + if invoice.type.startswith('in_'): + # Internal numbering, no likely match on number + if invoice.name: + iname = invoice.name.upper() + if iname in ref or iname in msg: + return True + elif invoice.type.startswith('out_'): + # External id's possible and likely + inum = invoice.number.upper() + if inum in ref or inum in msg: + return True + + return False + + def _cached(move_line): + '''Check if the move_line has been cached''' + return move_line.id in self.__linked_invoices + + def _cache(move_line, remaining=0.0): + '''Cache the move_line''' + self.__linked_invoices[move_line.id] = remaining + + def _remaining(move_line): + '''Return the remaining amount for a previously matched move_line + ''' + return self.__linked_invoices[move_line.id] + + def _sign(invoice): + '''Return the direction of an invoice''' + return {'in_invoice': -1, + 'in_refund': 1, + 'out_invoice': 1, + 'out_refund': -1 + }[invoice.type] + + digits = int(config['price_accuracy']) + partial = False + + # Search invoice on partner + if partner_ids: + candidates = [x for x in move_lines + if x.partner_id.id in partner_ids and + (not _cached(x) or _remaining(x)) + ] + else: + candidates = [] # Next on reference/invoice number. Mind that this uses the invoice # itself, as the move_line references have been fiddled with on invoice # creation. This also enables us to search for the invoice number in the # reference instead of the other way around, as most human interventions # *add* text. - if not candidates: + if len(candidates) > 1 or not candidates: ref = trans.reference.upper() msg = trans.message.upper() - candidates = [x for x in move_lines - if x.invoice.number.upper() in ref or - x.invoice.number.upper() in msg + # The manual usage of the sales journal creates moves that + # are not tied to invoices. Thanks to Stefan Rijnhart for + # reporting this. + candidates = [x for x in candidates or move_lines + if x.invoice and has_id_match(x.invoice, ref, msg) + and (not _cached(x) or _remaining(x)) ] - if len(candidates) > 1: + # Match on amount expected. Limit this kind of search to known + # partners. + if not candidates and partner_ids: + candidates = [x for x in move_lines + if round(abs(x.credit or x.debit), digits) == + round(abs(trans.transferred_amount), digits) and + (not _cached(x) or _remaining(x)) + ] + + move_line = False + if candidates and len(candidates) > 0: + # Now a possible selection of invoices has been found, check the + # amounts expected and received. + # # TODO: currency coercing - digits = int(config['price_accuracy']) - if trans.transferred_amount < 0: + if trans.transferred_amount > 0: func = lambda x, y=abs(trans.transferred_amount), z=digits:\ round(x.debit, z) == round(y, z) else: func = lambda x, y=abs(trans.transferred_amount), z=digits:\ round(x.credit, z) == round(y, z) - best = [x for x in move_lines if func(x)] - if len(best) != 1: + best = [x for x in candidates if func(x)] + if len(best) == 1: + # Exact match + move_line = best[0] + invoice = move_line.invoice + if _cached(move_line): + partial = True + expected = _remaining(move_line) + else: + _cache(move_line) + + elif len(candidates) > 1: + # Multiple matches log.append( - _('Unable to link transaction %(trans)s to invoice: ' + _('Unable to link transaction id %(trans)s (ref: %(ref)s) to invoice: ' '%(no_candidates)s candidates found; can\'t choose.') % { 'trans': trans.id, - 'no_candidates': len(best) + 'ref': trans.reference, + 'no_candidates': len(best) or len(candidates) }) - return False + move_line = False + partial = False - if len(candidates) == 1: - return self._get_move_info(cursor, uid, candidates[0]) + elif len(candidates) == 1: + # Mismatch in amounts + move_line = candidates[0] + invoice = move_line.invoice + expected = round(_sign(invoice) * invoice.amount_total, digits) + partial = True - return False + trans2 = None + if move_line and partial: + found = round(trans.transferred_amount, digits) + if abs(expected) > abs(found): + # Partial payment, reuse invoice + _cache(move_line, expected - found) + elif abs(expected) < abs(found): + # Possible combined payments, need to split transaction to + # verify + _cache(move_line) + trans2 = trans.copy() + trans2.transferred_amount -= expected + trans.transferred_amount = expected + trans.id += 'a' + trans2.id += 'b' + # NOTE: the following is debatable. By copying the + # eyecatcher of the invoice itself, we enhance the + # tracability of the invoices, but we degrade the + # tracability of the bank transactions. When debugging, it + # is wise to disable this line. + trans.reference = eyecatcher(move_line.invoice) + + if move_line: + account_ids = [ + x.id for x in bank_account_ids + if x.partner_id.id == move_line.partner_id.id + ] + return ( + self._get_move_info(cursor, uid, move_line, + account_ids and account_ids[0] or False, + partial = partial and not trans2 + ), + trans2 + ) + + return (False, False) def _link_canceled_debit(self, cursor, uid, trans, payment_lines, - partner_id, bank_account_id, log): + partner_ids, bank_account_ids, log): ''' Direct debit transfers can be canceled by the remote owner within a legaly defined time period. These 'payments' are most likely @@ -231,10 +390,78 @@ class banking_import(wizard.interface): # TODO: code _link_canceled_debit return False - def _banking_import_statements_file(self, cursor, uid, data, context): + def _link_costs(self, cursor, uid, trans, period_id, account_info, log): + ''' + Get or create a costs invoice for the bank and return it with + the payment as seen in the transaction (when not already done). + ''' + if not account_info.costs_account_id: + return [] + + digits = int(config['price_accuracy']) + amount = round(abs(trans.transferred_amount), digits) + + # search supplier invoice + invoice_obj = self.pool.get('account.invoice') + invoice_ids = invoice_obj.search(cursor, uid, [ + '&', + ('type', '=', 'in_invoice'), + ('partner_id', '=', account_info.bank_partner_id.id), + ('company_id', '=', account_info.company_id.id), + ('date_invoice', '=', date2str(trans.effective_date)), + ('reference', '=', trans.reference), + ('amount_total', '=', amount), + ] + ) + if invoice_ids and len(invoice_ids) == 1: + invoice = invoice_obj.browse(cursor, uid, invoice_ids) + elif not invoice_ids: + # create supplier invoice + partner_obj = self.pool.get('res.partner') + invoice_lines = [(0,0,dict( + amount = 1, + price_unit = amount, + name = trans.message or trans.reference, + account_id = account_info.costs_account_id.id + ))] + invoice_address_id = partner_obj.address_get( + cursor, uid, [account_info.bank_partner_id.id], ['invoice'] + ) + invoice_id = invoice_obj.create(cursor, uid, dict( + type = 'in_invoice', + company_id = account_info.company_id.id, + partner_id = account_info.bank_partner_id.id, + address_invoice_id = invoice_address_id['invoice'], + period_id = period_id, + journal_id = account_info.invoice_journal_id.id, + account_id = account_info.bank_partner_id.property_account_payable.id, + date_invoice = date2str(trans.effective_date), + reference_type = 'none', + reference = trans.reference, + name = trans.reference or trans.message, + check_total = amount, + invoice_line = invoice_lines, + )) + invoice = invoice_obj.browse(cursor, uid, invoice_id) + # Set number + invoice.action_number(cursor, uid, [invoice_id]) + # Create moves + invoice.action_move_create(cursor, uid, [invoice_id]) + # Create workflow + wf_service = netsvc.LocalService('workflow') + res = wf_service.trg_create(uid, 'account.invoice', invoice.id, + cursor) + # Move to state 'open' + wf_service.trg_validate(uid, 'account.invoice', invoice.id, + 'invoice_open', cursor) + + # return move_lines to mix with the rest + return [x for x in invoice.move_id.line_id if x.account_id.reconcile] + + def _import_statements_file(self, cursor, uid, data, context): ''' Import bank statements / bank transactions file. - This module/function represents the business logic, the parser modules + This method represents the business logic, the parser modules represent the decoding logic. ''' form = data['form'] @@ -285,19 +512,21 @@ class banking_import(wizard.interface): import_id = statement_file_obj.create(cursor, uid, dict( company_id = company.id, file = statements_file, - date = time.strftime('%Y-%m-%d'), - user_id = uid, - state = 'unfinished' + state = 'unfinished', + format = parser.name, )) # Results - no_stat_loaded = 0 - no_trans_loaded = 0 - no_stat_skipped = 0 - no_trans_skipped = 0 - no_trans_matched = 0 - no_errors = 0 - log = [] + results = struct( + stat_loaded_cnt = 0, + trans_loaded_cnt = 0, + stat_skipped_cnt = 0, + trans_skipped_cnt = 0, + trans_matched_cnt = 0, + bank_costs_invoice_cnt = 0, + error_cnt = 0, + log = [], + ) # Caching error_accounts = {} @@ -305,20 +534,15 @@ class banking_import(wizard.interface): imported_statement_ids = [] if statements: + # Get default defaults + def_pay_account_id = company.partner_id.property_account_payable.id + def_rec_account_id = company.partner_id.property_account_receivable.id + # Get interesting journals once - if company: - journal_ids = journal_obj.search(cursor, uid, [ - ('type', 'in', ('sale','purchase')), - ('company_id', '=', company.id), - ]) - else: - journal_ids = None - if not journal_ids: - journal_ids = journal_obj.search(cursor, uid, [ - ('type', 'in', ('sale','purchase')), - ('active', '=', True), - ('company_id', '=', False), - ]) + journal_ids = journal_obj.search(cursor, uid, [ + ('type', 'in', ('sale','purchase')), + ('company_id', '=', company.id), + ]) # Get all unreconciled moves predating the last statement in one big # swoop. Assumption: the statements in the file are sorted in ascending # order of date. @@ -351,8 +575,8 @@ class banking_import(wizard.interface): for statement in statements: if statement.local_account in error_accounts: # Don't repeat messages - no_stat_skipped += 1 - no_trans_skipped += len(statement.transactions) + results.stat_skipped_cnt += 1 + results.trans_skipped_cnt += len(statement.transactions) continue # Create fallback currency code @@ -367,24 +591,24 @@ class banking_import(wizard.interface): # Pull account info/currency account_info = get_company_bank_account( self.pool, cursor, uid, statement.local_account, - statement.local_currency, company, log + statement.local_currency, company, results.log ) if not account_info: - log.append( + results.log.append( _('Statements found for unknown account %(bank_account)s') % {'bank_account': statement.local_account} ) error_accounts[statement.local_account] = True - no_errors += 1 + results.error_cnt += 1 continue if 'journal_id' not in account_info: - log.append( + results.log.append( _('Statements found for account %(bank_account)s, ' 'but no default journal was defined.' ) % {'bank_account': statement.local_account} ) error_accounts[statement.local_account] = True - no_errors += 1 + results.error_cnt += 1 continue # Get required currency code @@ -402,13 +626,13 @@ class banking_import(wizard.interface): if statement.local_currency \ and account_info.currency_id.code != statement.local_currency: # TODO: convert currencies? - log.append( + results.log.append( _('Statement for account %(bank_account)s uses different ' 'currency than the defined bank journal.') % {'bank_account': statement.local_account} ) error_accounts[statement.local_account] = True - no_errors += 1 + results.error_cnt += 1 continue # Check existence of previous statement @@ -417,7 +641,7 @@ class banking_import(wizard.interface): ('date', '=', date2str(statement.date)), ]) if statement_ids: - log.append( + results.log.append( _('Statement %(id)s known - skipped') % { 'id': statement.id } @@ -440,66 +664,102 @@ class banking_import(wizard.interface): # move each line to the right period and try to match it with an # invoice or payment subno = 0 - for transaction in statement.transactions: + injected = False + i = 0 + max_trans = len(statement.transactions) + while i < max_trans: move_info = False + if injected: + transaction, injected = injected, False + else: + transaction = statement.transactions[i] # Keep a tracer for identification of order in a statement in case # of missing transaction ids. subno += 1 - # Link remote partner, import account when needed - partner_bank = get_bank_account( - self.pool, cursor, uid, transaction.remote_account, log, fail=True - ) - if partner_bank: - partner_id = partner_bank.partner_id.id - partner_bank_id = partner_bank.id - elif transaction.remote_owner: - partner_id = get_or_create_partner( - self.pool, cursor, uid, transaction.remote_owner, log - ) - if transaction.remote_account: - partner_bank_id = create_bank_account( - self.pool, cursor, uid, partner_id, - transaction.remote_account, transaction.remote_owner, - log - ) - else: - partner_id = False - partner_bank_id = False - # Link accounting period period_id = get_period(self.pool, cursor, uid, transaction.effective_date, company, - log) + results.log) if not period_id: - no_trans_skipped += 1 + results.trans_skipped_cnt += 1 continue + # Allow inclusion of generated bank invoices + if transaction.type == bt.BANK_COSTS: + lines = self._link_costs( + cursor, uid, transaction, period_id, account_info, + results.log + ) + results.bank_costs_invoice_cnt += bool(lines) + for line in lines: + if not [x for x in move_lines if x.id == line.id]: + move_lines.append(line) + partner_ids = [account_info.bank_partner_id.id] + partner_banks = [] + + else: + # Link remote partner, import account when needed + partner_banks = get_bank_accounts( + self.pool, cursor, uid, transaction.remote_account, + results.log, fail=True + ) + if partner_banks: + partner_ids = [x.partner_id.id for x in partner_banks] + elif transaction.remote_owner: + partner_id = get_or_create_partner( + self.pool, cursor, uid, transaction.remote_owner, + results.log + ) + if transaction.remote_account: + partner_bank_id = create_bank_account( + self.pool, cursor, uid, partner_id, + transaction.remote_account, + transaction.remote_owner, results.log + ) + partner_ids = [partner_id] + partner_banks = partner_bank_obj.browse( + cursor, uid, [partner_bank_id] + ) + else: + partner_ids = [] + partner_banks = [] + # Credit means payment... isn't it? if transaction.transferred_amount < 0 and payment_lines: # Link open payment - if any move_info = self._link_payment( cursor, uid, transaction, - payment_lines, partner_id, - partner_bank_id, log + payment_lines, partner_ids, + partner_banks, results.log ) - # Second guess, invoice + # Second guess, invoice -> may split transaction, so beware if not move_info: # Link invoice - if any - move_info = self._link_invoice( - cursor, uid, transaction, move_lines, partner_id, - partner_bank_id, log + move_info, injected = self._link_invoice( + cursor, uid, transaction, move_lines, partner_ids, + partner_banks, results.log ) if not move_info: + # Use the default settings, but allow individual partner + # settings to overrule this. Note that you need to change + # the internal type of these accounts to either 'payable' + # or 'receivable' to enable usage like this. if transaction.transferred_amount < 0: - account_id = account_info.default_credit_account_id + if len(partner_banks) == 1: + account_id = partner_banks[0].partner_id.property_account_payable + if len(partner_banks) != 1 or account_id.id == def_pay_account_id: + account_id = account_info.default_credit_account_id else: - account_id = account_info.default_debit_account_id + if len(partner_banks) == 1: + account_id = partner_banks[0].partner_id.property_account_receivable + if len(partner_banks) != 1 or account_id.id == def_rec_account_id: + account_id = account_info.default_debit_account_id else: account_id = move_info.move_line.account_id - no_trans_matched += 1 + results.trans_matched_cnt += 1 values = struct( name = '%s.%s' % (statement.id, transaction.id or subno), @@ -512,18 +772,25 @@ class banking_import(wizard.interface): period_id = period_id, currency = account_info.currency_id.id, ) - if partner_id: - values.partner_id = partner_id - if partner_bank_id: - values.partner_bank_id = partner_bank_id if move_info: values.type = move_info.type values.reconcile_id = move_info.move_line.reconcile_id + values.partner_id = move_info.partner_id + values.partner_bank_id = move_info.partner_bank_id + else: + values.partner_id = values.partner_bank_id = False + if not values.partner_id and partner_ids and len(partner_ids) == 1: + values.partner_id = partner_ids[0] + if not values.partner_bank_id and partner_banks and \ + len(partner_banks) == 1: + values.partner_bank_id = partner_banks[0].id statement_line_id = statement_line_obj.create(cursor, uid, values) - no_trans_loaded += 1 + results.trans_loaded_cnt += 1 + if not injected: + i += 1 - no_stat_loaded += 1 + results.stat_loaded_cnt += 1 if payment_lines: # As payments lines are treated as individual transactions, the @@ -546,23 +813,25 @@ class banking_import(wizard.interface): ) ) report = [ - '%s: %s' % (_('Total number of statements'), no_stat_skipped + no_stat_loaded), - '%s: %s' % (_('Total number of transactions'), no_trans_skipped + no_trans_loaded), - '%s: %s' % (_('Number of errors found'), no_errors), - '%s: %s' % (_('Number of statements skipped due to errors'), no_stat_skipped), - '%s: %s' % (_('Number of transactions skipped due to errors'), no_trans_skipped), - '%s: %s' % (_('Number of statements loaded'), no_stat_loaded), - '%s: %s' % (_('Number of transactions loaded'), no_trans_loaded), + '%s: %s' % (_('Total number of statements'), results.stat_skipped_cnt + results.stat_loaded_cnt), + '%s: %s' % (_('Total number of transactions'), results.trans_skipped_cnt + results.trans_loaded_cnt), + '%s: %s' % (_('Number of errors found'), results.error_cnt), + '%s: %s' % (_('Number of statements skipped due to errors'), results.stat_skipped_cnt), + '%s: %s' % (_('Number of transactions skipped due to errors'), results.trans_skipped_cnt), + '%s: %s' % (_('Number of statements loaded'), results.stat_loaded_cnt), + '%s: %s' % (_('Number of transactions loaded'), results.trans_loaded_cnt), + '%s: %s' % (_('Number of transactions matched'), results.trans_matched_cnt), + '%s: %s' % (_('Number of bank costs invoices created'), results.bank_costs_invoice_cnt), '', '%s:' % ('Error report'), '', ] - text_log = '\n'.join(report + log) - state = no_errors and 'error' or 'ready' + text_log = '\n'.join(report + results.log) + state = results.error_cnt and 'error' or 'ready' statement_file_obj.write(cursor, uid, import_id, dict( state = state, log = text_log, )) - if no_errors or not imported_statement_ids: + if results.error_cnt or not imported_statement_ids: self._nextstate = 'view_error' else: self._nextstate = 'view_statements' @@ -608,15 +877,15 @@ class banking_import(wizard.interface): 'actions' : [], 'result' : { 'type' : 'form', - 'arch' : banking_import_form, - 'fields': banking_import_fields, + 'arch' : import_form, + 'fields': import_fields, 'state': [('end', '_Cancel', 'gtk-cancel'), ('import', '_Ok', 'gtk-ok'), ] } }, 'import': { - 'actions': [_banking_import_statements_file], + 'actions': [_import_statements_file], 'result': { 'type': 'choice', 'next_state': _check_next_state, diff --git a/account_banking/wizard/banktools.py b/account_banking/wizard/banktools.py index e6f8ec34e..fc39e9610 100644 --- a/account_banking/wizard/banktools.py +++ b/account_banking/wizard/banktools.py @@ -29,7 +29,7 @@ from account_banking.struct import struct __all__ = [ 'get_period', - 'get_bank_account', + 'get_bank_accounts', 'get_or_create_partner', 'get_company_bank_account', 'create_bank_account', @@ -84,7 +84,7 @@ def get_period(pool, cursor, uid, date, company, log): return False return period_ids[0] -def get_bank_account(pool, cursor, uid, account_number, log, fail=False): +def get_bank_accounts(pool, cursor, uid, account_number, log, fail=False): ''' Get the bank account with account number account_number ''' @@ -107,13 +107,7 @@ def get_bank_account(pool, cursor, uid, account_number, log, fail=False): % dict(account_no=account_number) ) return False - elif len(bank_account_ids) != 1: - log.append( - _('More than one bank account was found with the same number %(account_no)s') - % dict(account_no=account_number) - ) - return False - return partner_bank_obj.browse(cursor, uid, bank_account_ids)[0] + return partner_bank_obj.browse(cursor, uid, bank_account_ids) def get_or_create_partner(pool, cursor, uid, name, log): ''' @@ -142,20 +136,26 @@ def get_company_bank_account(pool, cursor, uid, account_number, currency, for the requested currency. ''' results = struct() - bank_account = get_bank_account(pool, cursor, uid, account_number, log, - fail=True) - if not bank_account: + bank_accounts = get_bank_accounts(pool, cursor, uid, account_number, log, + fail=True) + if not bank_accounts: return False - if bank_account.partner_id.id != company.partner_id.id: + elif len(bank_accounts) != 1: + log.append( + _('More than one bank account was found with the same number %(account_no)s') + % dict(account_no = account_number) + ) + return False + if bank_accounts[0].partner_id.id != company.partner_id.id: log.append( _('Account %(account_no)s is not owned by %(partner)s') % dict(account_no = account_number, partner = company.partner_id.name, )) return False - results.account = bank_account + results.account = bank_accounts[0] bank_settings_obj = pool.get('account.banking.account.settings') - criteria = [('partner_bank_id', '=', bank_account.id)] + criteria = [('partner_bank_id', '=', bank_accounts[0].id)] # Find matching journal for currency journal_obj = pool.get('account.journal') @@ -174,14 +174,19 @@ def get_company_bank_account(pool, cursor, uid, account_number, currency, bank_settings_ids = bank_settings_obj.search(cursor, uid, criteria) if bank_settings_ids: settings = bank_settings_obj.browse(cursor, uid, bank_settings_ids)[0] + results.company_id = company results.journal_id = settings.journal_id # Take currency from settings or from company if settings.journal_id.currency.id: results.currency_id = settings.journal_id.currency else: results.currency_id = company.currency_id + # Rest just copy/paste from settings. Why am I doing this? results.default_debit_account_id = settings.default_debit_account_id results.default_credit_account_id = settings.default_credit_account_id + results.costs_account_id = settings.costs_account_id + results.invoice_journal_id = settings.invoice_journal_id + results.bank_partner_id = settings.bank_partner_id return results def get_or_create_bank(pool, cursor, uid, bic, online=False, code=None, @@ -326,4 +331,18 @@ def create_bank_account(pool, cursor, uid, partner_id, # Create bank account and return return pool.get('res.partner.bank').create(cursor, uid, values) +def get_or_create_bank_partner(): + ''' + Find the partner belonging to a bank. When not found, create one using the + available data. + ''' + pass + +def generate_supplier_invoice(): + ''' + Create an supplier invoice for a transaction from a bank. Used to create + invoices on the fly when parsing bank costs. + ''' + pass + # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/account_banking_nl_clieop/wizard/clieop.py b/account_banking_nl_clieop/wizard/clieop.py index 38b7a2cf3..617fb7874 100644 --- a/account_banking_nl_clieop/wizard/clieop.py +++ b/account_banking_nl_clieop/wizard/clieop.py @@ -50,10 +50,10 @@ class HeaderRecord(record.Record): #{{{ record.Filler('filler', 21), ] - def __init__(self, id='1', volgnr=1, duplicate=False): + def __init__(self, id='1', seqno=1, duplicate=False): super(HeaderRecord, self).__init__() self.sender_id = id - self.file_id = '%02d%02d' % (self.creation_date.day, volgnr) + self.file_id = '%02d%02d' % (self.creation_date.day, seqno) self.duplicatecode = duplicate and '2' or '1' #}}} @@ -382,7 +382,7 @@ class PaymentsBatch(Batch): '''Payment batch''' transactionclass = Payment -class SalarisBatch(Batch): +class SalaryBatch(Batch): '''Salary payment class''' transactionclass = SalaryPayment @@ -390,8 +390,8 @@ class ClieOpFile(object): '''The grand unifying class''' def __init__(self, identification='1', execution_date=None, name_sender='', accountno_sender='', - test=False, **kwargs): - self.header = HeaderRecord(id=identification,) + test=False, seqno=1, **kwargs): + self.header = HeaderRecord(id=identification, seqno=seqno) self.footer = FooterRecord() self.batches = [] self._execution_date = execution_date @@ -454,7 +454,7 @@ class PaymentsFile(ClieOpFile): class SalaryPaymentsFile(PaymentsFile): '''Salary Payments file''' - batchclass = SalarisBatch + batchclass = SalaryBatch orderclass = SalaryPaymentOrder # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/account_banking_nl_clieop/wizard/export_clieop.py b/account_banking_nl_clieop/wizard/export_clieop.py index 23c378962..4fbf376ba 100644 --- a/account_banking_nl_clieop/wizard/export_clieop.py +++ b/account_banking_nl_clieop/wizard/export_clieop.py @@ -28,7 +28,16 @@ from tools.translate import _ #import pdb; pdb.set_trace() import clieop -form = ''' +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) + +class wizard_banking_export_clieop(wizard.interface): + form = '''
@@ -40,60 +49,60 @@ 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.' - ), - }, -} + 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 = ''' + file_form = '''
@@ -107,256 +116,255 @@ file_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, - }, -} + 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 _check_orders(self, cursor, uid, data, context): + ''' + Check payment type for all orders. -def strfdate(arg, format='%Y-%m-%d'): - '''shortcut''' - return arg.strftime(format) + 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. + Also mind that rates for batches are way higher than those for + transactions. It pays to limit the number of batches. + ''' + form = data['form'] + today = date.today() + pool = pooler.get_pool(cursor.dbname) + payment_order_obj = pool.get('payment.order') -def _check_orders(self, cursor, uid, data, context): - ''' - Check payment type for all orders. + 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: - 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) + payment_type = payment_order.mode.type.code + if payment_type in runs: + runs[payment_type].append(payment_order) 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 + 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 - 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: - # Just once: create clieop file - our_account_owner = payment_order.mode.bank_id.owner_name \ - or payment_order.mode.bank_id.partner_id.name - our_account_nr = payment_order.mode.bank_id.acc_number - if not our_account_nr and payment_order.mode.bank_id.iban: - our_account_nr = sepa.IBAN( - payment_order.mode.bank_id.iban - ).localized_BBAN - if not our_account_nr: - raise wizard.except_wizard( - _('Error'), - _('Your bank account has to have a valid account number') - ) - clieopfile = {'CLIEOPPAY': clieop.PaymentsFile, - 'CLIEOPINC': clieop.DirectDebitFile, - 'CLIEOPSAL': clieop.SalaryPaymentsFile, - }[form['batchtype']]( - identification = form['reference'], - execution_date = form['execution_date'], - name_sender = our_account_owner, - accountno_sender = our_account_nr, - test = form['test'] - ) - - # As payment_orders can have multiple transactions, create a new batch - # for each payment_order - if form['fixed_message']: - messages = [form['fixed_message']] - else: - messages = [] - batch = clieopfile.batch( - messages = messages, - batch_id = payment_order.reference - ) - - for line in payment_order.line_ids: - kwargs = dict( - name = line.bank_id.owner_name or line.bank_id.partner_id.name, - amount = line.amount_currency, - reference = line.communication or None, - ) - if line.communication2: - kwargs['messages'] = [line.communication2] - other_account_nr = line.bank_id.acc_number - iban = sepa.IBAN(other_account_nr) - # Is this an IBAN account? - if iban.valid: - if iban.countrycode != 'NL': + 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 cannot send international bank transfers ' - 'through ClieOp3!') + _('You can\'t create ClieOp orders more than 30 days in advance.') ) - other_account_nr = iban.localized_BBAN - if form['batchtype'] == 'CLIEOPINC': - kwargs['accountno_beneficiary'] = our_account_nr - kwargs['accountno_payer'] = other_account_nr - else: - kwargs['accountno_beneficiary'] = other_account_nr - kwargs['accountno_payer'] = our_account_nr - transaction = batch.transaction(**kwargs) + # Sanity check: can't process in the past + form['execution_date'] = strfdate(max(execution_date, today)) - # Generate the specifics of this clieopfile - order = clieopfile.order - values = dict( - filetype = order.name_transactioncode, - identification = order.identification, - prefered_date = strfdate(order.preferred_execution_date), - total_amount = int(order.total_amount) / 100.0, - check_no_accounts = order.total_accountnos, - no_transactions = order.nr_posts, - testcode = order.testcode, - file = base64.encodestring(clieopfile.rawdata), - ) - form.update(values) - values['daynumber'] = int(clieopfile.header.file_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 + if len(runs) != 1: + raise wizard.except_wizard( + _('Error'), + _('You can only combine payment orders of the same type') + ) -def _cancel_clieop(self, cursor, uid, data, context): - ''' - Cancel the ClieOp: just drop the file - ''' - pool = pooler.get_pool(cursor.dbname) - pool.get('banking.export.clieop').unlink(cursor, uid, data['file_id']) - return {'state': 'end'} + form['batchtype'] = type = runs.keys()[0] + form['reference'] = runs[type][0].reference[-5:] + return form -def _save_clieop(self, cursor, uid, data, context): - ''' - Save the ClieOp: mark all payments in the file as 'sent'. - ''' - 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'} + 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: + # Just once: create clieop file + our_account_owner = payment_order.mode.bank_id.owner_name \ + or payment_order.mode.bank_id.partner_id.name + our_account_nr = payment_order.mode.bank_id.acc_number + if not our_account_nr and payment_order.mode.bank_id.iban: + our_account_nr = sepa.IBAN( + payment_order.mode.bank_id.iban + ).localized_BBAN + if not our_account_nr: + raise wizard.except_wizard( + _('Error'), + _('Your bank account has to have a valid account number') + ) + clieopfile = {'CLIEOPPAY': clieop.PaymentsFile, + 'CLIEOPINC': clieop.DirectDebitFile, + 'CLIEOPSAL': clieop.SalaryPaymentsFile, + }[form['batchtype']]( + identification = form['reference'], + execution_date = form['execution_date'], + name_sender = our_account_owner, + accountno_sender = our_account_nr, + test = form['test'] + ) + + # ClieOp3 files can contain multiple batches, but we put all + # orders into one single batch. Ratio behind this is that a + # batch costs more money than a single transaction, so it is + # cheaper to combine than it is to split. As we split out all + # reported errors afterwards, there is no additional gain in + # using multiple batches. + if form['fixed_message']: + messages = [form['fixed_message']] + else: + messages = [] + # The first payment order processed sets the reference of the + # batch. + batch = clieopfile.batch( + messages = messages, + batch_id = payment_order.reference + ) + + for line in payment_order.line_ids: + kwargs = dict( + name = line.bank_id.owner_name or line.bank_id.partner_id.name, + amount = line.amount_currency, + reference = line.communication or None, + ) + if line.communication2: + kwargs['messages'] = [line.communication2] + other_account_nr = line.bank_id.acc_number + iban = sepa.IBAN(other_account_nr) + # Is this an IBAN account? + if iban.valid: + if iban.countrycode != 'NL': + raise wizard.except_wizard( + _('Error'), + _('You cannot send international bank transfers ' + 'through ClieOp3!') + ) + other_account_nr = iban.localized_BBAN + if form['batchtype'] == 'CLIEOPINC': + kwargs['accountno_beneficiary'] = our_account_nr + kwargs['accountno_payer'] = other_account_nr + else: + kwargs['accountno_beneficiary'] = other_account_nr + kwargs['accountno_payer'] = our_account_nr + transaction = batch.transaction(**kwargs) + + # Generate the specifics of this clieopfile + order = clieopfile.order + values = dict( + filetype = order.name_transactioncode, + identification = order.identification, + prefered_date = strfdate(order.preferred_execution_date), + total_amount = int(order.total_amount) / 100.0, + check_no_accounts = order.total_accountnos, + no_transactions = order.nr_posts, + testcode = order.testcode, + file = base64.encodestring(clieopfile.rawdata), + ) + form.update(values) + values['daynumber'] = int(clieopfile.header.file_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): + ''' + Cancel the ClieOp: just drop the file + ''' + 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): + ''' + Save the ClieOp: mark all payments in the file as 'sent'. + ''' + 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], @@ -397,6 +405,7 @@ class wizard_banking_export_clieop(wizard.interface): }, } } + wizard_banking_export_clieop('account_banking_nl_clieop.banking_export_clieop') # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/account_banking_nl_multibank/multibank.py b/account_banking_nl_multibank/multibank.py index 645e273d4..e0e042661 100644 --- a/account_banking_nl_multibank/multibank.py +++ b/account_banking_nl_multibank/multibank.py @@ -34,6 +34,8 @@ import csv __all__ = ['parser'] +bt = models.mem_bank_transaction + class transaction_message(object): ''' A auxiliary class to validate and coerce read values @@ -90,6 +92,21 @@ class transaction(models.mem_bank_transaction): 'reference', 'message' ] + type_map = { + 'ACC': bt.ORDER, + 'BEA': bt.PAYMENT_TERMINAL, + 'BTL': bt.ORDER, + 'DIV': bt.ORDER, + 'IDB': bt.PAYMENT_TERMINAL, + 'INC': bt.DIRECT_DEBIT, + 'IOB': bt.ORDER, + 'KNT': bt.BANK_COSTS, + 'KST': bt.BANK_COSTS, + 'OPN': bt.BANK_TERMINAL, + 'OVS': bt.ORDER, + 'PRV': bt.BANK_COSTS, + } + def __init__(self, line, *args, **kwargs): ''' Initialize own dict with read values. @@ -107,7 +124,7 @@ class transaction(models.mem_bank_transaction): 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' or 'DIV'. + transfer_type set to 'KST' or 'KNT'. 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 @@ -123,7 +140,7 @@ class transaction(models.mem_bank_transaction): self.effective_date) and ( self.remote_account or self.transfer_type in [ - 'KST', 'PRV', 'BTL', 'BEA', 'OPN', 'DIV' + 'KST', 'PRV', 'BTL', 'BEA', 'OPN', 'KNT', ]) class statement(models.mem_bank_statement):