[FIX] Add back __unported__ to prevent deletions after PR.

This commit is contained in:
Ronald Portier (Therp BV)
2015-04-02 16:35:46 +02:00
parent ee0d52e3d9
commit 5fe35db5b4
92 changed files with 30403 additions and 0 deletions

View File

@@ -0,0 +1,36 @@
# -*- encoding: utf-8 -*-
##############################################################################
#
# Copyright (C) 2009 EduSense BV (<http://www.edusense.nl>).
# All Rights Reserved
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsability of assessing all potential
# consequences resulting from its eventual inadequacies and bugs
# End users who are looking for a ready-to-use solution with commercial
# garantees and support are strongly adviced to contract EduSense BV
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
import sepa
import record
import banking_import_transaction
import account_banking
import parsers
import wizard
import res_partner
import res_bank
import res_partner_bank

View File

@@ -0,0 +1,105 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright (C) 2009 EduSense BV (<http://www.edusense.nl>).
# (C) 2011 Therp BV (<http://therp.nl>).
# (C) 2011 Smile (<http://smile.fr>).
#
# All other contributions are (C) by their respective contributors
#
# All Rights Reserved
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
{
'name': 'Account Banking',
'version': '0.4',
'license': 'AGPL-3',
'author': 'Banking addons community',
'website': 'https://launchpad.net/banking-addons',
'category': 'Banking addons',
'depends': [
'account_voucher',
],
'data': [
'security/ir.model.access.csv',
'data/account_banking_data.xml',
'wizard/bank_import_view.xml',
'account_banking_view.xml',
'wizard/banking_transaction_wizard.xml',
'wizard/link_partner.xml',
'workflow/account_invoice.xml',
],
'js': [
'static/src/js/account_banking.js',
],
'description': '''
Module to do banking.
This modules tries to combine all current banking import and export
schemes. Rationale for this is that it is quite common to have foreign
bank account numbers next to national bank account numbers. The current
approach, which hides the national banking interface schemes in the
l10n_xxx modules, makes it very difficult to use these simultanious.
A more banking oriented approach seems more logical and cleaner.
Changes to default OpenERP:
* Puts focus on the real life messaging with banks:
+ Bank statement lines upgraded to independent bank transactions.
+ Banking statements have no special accountancy meaning, they're just
message envelopes for a number of bank transactions.
+ Bank statements can be either encoded by hand to reflect the document
version of Bank Statements, or created as an optional side effect of
importing Bank Transactions.
* Preparations for SEPA:
+ IBAN accounts are the standard in the SEPA countries
+ local accounts are derived from SEPA (excluding Turkey) but are
considered to be identical to the corresponding SEPA account.
+ Banks are identified with either Country + Bank code + Branch code or
BIC
+ Each bank can have its own pace in introducing SEPA into their
communication with their customers.
+ National online databases can be used to convert BBAN's to IBAN's.
+ The SWIFT database is consulted for bank information.
* Adds dropin extensible import facility for bank communication in:
- Drop-in input parser development.
- MultiBank (NL) format transaction files available as
account_banking_nl_multibank,
* 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
* Additional features for the import/export mechanism:
+ Automatic matching and creation of bank accounts, banks and partners,
during import of statements.
+ Automatic matching with invoices and payments.
+ Sound import mechanism, allowing multiple imports of the same
transactions repeated over multiple files.
+ Journal configuration per bank account.
+ Business logic and format parsing strictly separated to ease the
development of new parsers.
+ No special configuration needed for the parsers, new parsers are
recognized and made available at server (re)start.
''',
'installable': False,
'auto_install': False,
}

View File

@@ -0,0 +1,683 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright (C) 2009 EduSense BV (<http://www.edusense.nl>).
# (C) 2011 - 2013 Therp BV (<http://therp.nl>).
#
# All other contributions are (C) by their respective contributors
#
# All Rights Reserved
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
'''
This module shows resemblance to both account_bankimport/bankimport.py,
account/account_bank_statement.py and account_payment(_export). All hail to
the makers. account_bankimport is only referenced for their ideas and the
framework of the filters, which they in their turn seem to have derived
from account_coda.
Modifications are extensive:
1. In relation to account/account_bank_statement.py:
account.bank.statement is effectively stripped from its account.period
association, while account.bank.statement.line is extended with the same
association, thereby reflecting real world usage of bank.statement as a
list of bank transactions and bank.statement.line as a bank transaction.
2. In relation to account/account_bankimport:
All filter objects and extensions to res.company are removed. Instead a
flexible auto-loading and auto-browsing plugin structure is created,
whereby business logic and encoding logic are strictly separated.
Both parsers and business logic are rewritten from scratch.
The association of account.journal with res.company is replaced by an
association of account.journal with res.partner.bank, thereby allowing
multiple bank accounts per company and one journal per bank account.
The imported bank statement file does not result in a single 'bank
statement', but in a list of bank statements by definition of whatever the
bank sees as a statement. Every imported bank statement contains at least
one bank transaction, which is a modded account.bank.statement.line.
3. In relation to account_payment:
An additional state was inserted between 'open' and 'done', to reflect a
exported bank orders file which was not reported back through statements.
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'.
'''
from openerp.osv import orm, fields
from openerp.osv.osv import except_osv
from openerp.tools.translate import _
from openerp import netsvc
from openerp.addons.decimal_precision import decimal_precision as dp
class account_banking_account_settings(orm.Model):
'''Default Journal for Bank Account'''
_name = 'account.banking.account.settings'
_description = __doc__
_columns = {
'company_id': fields.many2one('res.company', 'Company', select=True,
required=True),
'partner_bank_id': fields.many2one('res.partner.bank', 'Bank Account',
select=True, required=True),
'journal_id': fields.many2one('account.journal', 'Journal',
required=True),
'partner_id': fields.related(
'company_id', 'partner_id',
type='many2one', relation='res.partner',
string='Partner'),
'default_credit_account_id': fields.many2one(
'account.account', 'Default credit account', select=True,
help=('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.'
),
required=True
),
'default_debit_account_id': fields.many2one(
'account.account', 'Default debit account',
select=True, required=True,
help=('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.'
),
),
'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.'
),
),
}
def _default_company(self, cr, uid, context=None):
"""
Return the user's company or the first company found
in the database
"""
user = self.pool.get('res.users').read(
cr, uid, uid, ['company_id'], context=context)
if user['company_id']:
return user['company_id'][0]
return self.pool.get('res.company').search(
cr, uid, [('parent_id', '=', False)])[0]
def _default_partner_id(self, cr, uid, context=None, company_id=False):
if not company_id:
company_id = self._default_company(cr, uid, context=context)
return self.pool.get('res.company').read(
cr, uid, company_id, ['partner_id'],
context=context)['partner_id'][0]
def _default_journal(self, cr, uid, context=None, company_id=False):
if not company_id:
company_id = self._default_company(cr, uid, context=context)
journal_ids = self.pool.get('account.journal').search(
cr, uid, [('type', '=', 'bank'), ('company_id', '=', company_id)])
return journal_ids and journal_ids[0] or False
def _default_partner_bank_id(
self, cr, uid, context=None, company_id=False):
if not company_id:
company_id = self._default_company(cr, uid, context=context)
partner_id = self.pool.get('res.company').read(
cr, uid, company_id, ['partner_id'],
context=context)['partner_id'][0]
bank_ids = self.pool.get('res.partner.bank').search(
cr, uid, [('partner_id', '=', partner_id)], context=context)
return bank_ids and bank_ids[0] or False
def _default_debit_account_id(
self, cr, uid, context=None, company_id=False):
localcontext = context and context.copy() or {}
localcontext['force_company'] = (
company_id or self._default_company(cr, uid, context=context))
account_def = self.pool.get('ir.property').get(
cr, uid, 'property_account_receivable',
'res.partner', context=localcontext)
return account_def and account_def.id or False
def _default_credit_account_id(
self, cr, uid, context=None, company_id=False):
localcontext = context and context.copy() or {}
localcontext['force_company'] = (
company_id or self._default_company(cr, uid, context=context))
account_def = self.pool.get('ir.property').get(
cr, uid, 'property_account_payable',
'res.partner', context=localcontext)
return account_def and account_def.id or False
def find(self, cr, uid, journal_id, partner_bank_id=False, context=None):
domain = [('journal_id', '=', journal_id)]
if partner_bank_id:
domain.append(('partner_bank_id', '=', partner_bank_id))
return self.search(cr, uid, domain, context=context)
def onchange_partner_bank_id(
self, cr, uid, ids, partner_bank_id, context=None):
values = {}
if partner_bank_id:
bank = self.pool.get('res.partner.bank').read(
cr, uid, partner_bank_id, ['journal_id'], context=context)
if bank['journal_id']:
values['journal_id'] = bank['journal_id'][0]
return {'value': values}
def onchange_company_id(
self, cr, uid, ids, company_id=False, context=None):
if not company_id:
return {}
result = {
'partner_id': self._default_partner_id(
cr, uid, company_id=company_id, context=context),
'journal_id': self._default_journal(
cr, uid, company_id=company_id, context=context),
'default_debit_account_id': self._default_debit_account_id(
cr, uid, company_id=company_id, context=context),
'default_credit_account_id': self._default_credit_account_id(
cr, uid, company_id=company_id, context=context),
}
return {'value': result}
_defaults = {
'company_id': _default_company,
'partner_id': _default_partner_id,
'journal_id': _default_journal,
'default_debit_account_id': _default_debit_account_id,
'default_credit_account_id': _default_credit_account_id,
'partner_bank_id': _default_partner_bank_id,
}
account_banking_account_settings()
class account_banking_imported_file(orm.Model):
'''Imported Bank Statements File'''
_name = 'account.banking.imported.file'
_description = __doc__
_rec_name = 'date'
_columns = {
'company_id': fields.many2one(
'res.company',
'Company',
select=True,
readonly=True,
),
'date': fields.datetime(
'Import Date',
readonly=True,
select=True,
states={'draft': [('readonly', False)]},
),
'format': fields.char(
'File Format',
size=20,
readonly=True,
states={'draft': [('readonly', False)]},
),
'file': fields.binary(
'Raw Data',
readonly=True,
states={'draft': [('readonly', False)]},
),
'file_name': fields.char('File name', size=256),
'log': fields.text(
'Import Log',
readonly=True,
states={'draft': [('readonly', False)]},
),
'user_id': fields.many2one(
'res.users',
'Responsible User',
readonly=True,
select=True,
states={'draft': [('readonly', False)]},
),
'state': fields.selection(
[
('unfinished', 'Unfinished'),
('error', 'Error'),
('review', 'Review'),
('ready', 'Finished'),
],
'State',
select=True,
readonly=True,
),
'statement_ids': fields.one2many(
'account.bank.statement',
'banking_id',
'Statements',
readonly=False,
),
}
_defaults = {
'date': fields.date.context_today,
'user_id': lambda self, cr, uid, context: uid,
}
account_banking_imported_file()
class account_bank_statement(orm.Model):
'''
Implement changes to this model for the following features:
* bank statement lines have their own period_id, derived from
their effective date. The period and date are propagated to
the move lines created from each statement line
* bank statement lines have their own state. When a statement
is confirmed, all lines are confirmed too. When a statement
is reopened, lines remain confirmed until reopened individually.
* upon confirmation of a statement line, the move line is
created and reconciled according to the matched entry(/ies)
'''
_inherit = 'account.bank.statement'
_columns = {
'period_id': fields.many2one(
'account.period',
'Period',
required=False,
readonly=True,
),
'banking_id': fields.many2one(
'account.banking.imported.file',
'Imported File',
readonly=True,
),
}
_defaults = {
'period_id': False,
}
def _check_company_id(self, cr, uid, ids, context=None):
"""
Adapt this constraint method from the account module to reflect the
move of period_id to the statement line: also check the periods of the
lines. Update the statement period if it does not have one yet.
Don't call super, because its check is integrated below and
it will break if a statement does not have any lines yet and
therefore may not have a period.
"""
for statement in self.browse(cr, uid, ids, context=context):
if (statement.period_id and
statement.company_id != statement.period_id.company_id):
return False
for line in statement.line_ids:
if (line.period_id and
statement.company_id != line.period_id.company_id):
return False
if not statement.period_id:
statement.write({'period_id': line.period_id.id})
statement.refresh()
return True
# Redefine the constraint, or it still refer to the original method
_constraints = [
(_check_company_id,
'The journal and period chosen have to belong to the same company.',
['journal_id', 'period_id']),
]
def _get_period(self, cr, uid, date=False, context=None):
"""
Used in statement line's _defaults, so it is always triggered
on installation or module upgrade even if there are no records
without a value. For that reason, we need
to be tolerant and allow for the situation in which no period
exists for the current date (i.e. when no date is specified).
Cannot be used directly as a defaults method due to lp:1296229
"""
local_ctx = dict(context or {}, account_period_prefer_normal=True)
try:
return self.pool.get('account.period').find(
cr, uid, dt=date, context=local_ctx)[0]
except except_osv:
if date:
raise
return False
def _prepare_move(
self, cr, uid, st_line, st_line_number, context=None):
"""
Add the statement line's period to the move, overwriting
the period on the statement
"""
res = super(account_bank_statement, self)._prepare_move(
cr, uid, st_line, st_line_number, context=context)
if context and context.get('period_id'):
res['period_id'] = context['period_id']
return res
def _prepare_move_line_vals(
self, cr, uid, st_line, move_id, debit, credit, currency_id=False,
amount_currency=False, account_id=False, analytic_id=False,
partner_id=False, context=None):
"""
Add the statement line's period to the move lines, overwriting
the period on the statement
"""
res = super(account_bank_statement, self)._prepare_move_line_vals(
cr, uid, st_line, move_id, debit, credit, currency_id=currency_id,
amount_currency=amount_currency, account_id=account_id,
analytic_id=analytic_id, partner_id=partner_id, context=context)
if context and context.get('period_id'):
res['period_id'] = context['period_id']
return res
def create_move_from_st_line(self, cr, uid, st_line_id,
company_currency_id, st_line_number,
context=None):
if context is None:
context = {}
account_move_obj = self.pool.get('account.move')
account_move_line_obj = self.pool.get('account.move.line')
account_bank_statement_line_obj = self.pool.get(
'account.bank.statement.line')
st_line = account_bank_statement_line_obj.browse(
cr, uid, st_line_id, context=context)
# Take period from statement line and write to context
# this will be picked up by the _prepare_move* methods
period_id = self._get_period(
cr, uid, date=st_line.date, context=context)
localctx = context.copy()
localctx['period_id'] = period_id
# Write date & period on the voucher, delegate to account_voucher's
# override of this method. Then post the related move and return.
if st_line.voucher_id:
voucher_pool = self.pool.get('account.voucher')
voucher_pool.write(
cr, uid, [st_line.voucher_id.id], {
'date': st_line.date,
'period_id': period_id,
}, context=context)
res = super(account_bank_statement, self).create_move_from_st_line(
cr, uid, st_line_id, company_currency_id, st_line_number,
context=localctx)
st_line.refresh()
if st_line.voucher_id:
if not st_line.voucher_id.journal_id.entry_posted:
account_move_obj.post(
cr, uid, [st_line.voucher_id.move_id.id], context={})
else:
# Write stored reconcile_id and pay invoices through workflow
if st_line.reconcile_id:
move_ids = [move.id for move in st_line.move_ids]
torec = account_move_line_obj.search(
cr, uid, [
('move_id', 'in', move_ids),
('account_id', '=', st_line.account_id.id)],
context=context)
account_move_line_obj.write(cr, uid, torec, {
(st_line.reconcile_id.line_partial_ids
and 'reconcile_partial_id'
or 'reconcile_id'): st_line.reconcile_id.id
}, context=context)
for move_line in (st_line.reconcile_id.line_id or []) + (
st_line.reconcile_id.line_partial_ids or []):
netsvc.LocalService("workflow").trg_trigger(
uid, 'account.move.line', move_line.id, cr)
return res
def button_confirm_bank(self, cr, uid, ids, context=None):
"""
Assign journal sequence to statements without a name
"""
if context is None:
context = {}
obj_seq = self.pool.get('ir.sequence')
if ids and isinstance(ids, (int, long)):
ids = [ids]
noname_ids = self.search(
cr, uid, [('id', 'in', ids), ('name', '=', '/')],
context=context)
for st in self.browse(cr, uid, noname_ids, context=context):
if st.journal_id.sequence_id:
period_id = self._get_period(
cr, uid, date=st.date, context=context)
year = self.pool.get('account.period').browse(
cr, uid, period_id, context=context).fiscalyear_id.id
c = {'fiscalyear_id': year}
st_number = obj_seq.get_id(
cr, uid, st.journal_id.sequence_id.id, context=c)
self.write(
cr, uid, ids, {'name': st_number}, context=context)
return super(account_bank_statement, self).button_confirm_bank(
cr, uid, ids, context)
class account_voucher(orm.Model):
_inherit = 'account.voucher'
def _get_period(self, cr, uid, context=None):
if context is None:
context = {}
if not context.get('period_id') and context.get('move_line_ids'):
move_line = self.pool.get('account.move.line').browse(
cr, uid, context.get('move_line_ids')[0], context=context)
return move_line.period_id.id
return super(account_voucher, self)._get_period(cr, uid, context)
class account_bank_statement_line(orm.Model):
'''
Extension on basic class:
1. Extra links to account.period and res.partner.bank for tracing and
matching.
2. Extra 'trans' field to carry the transaction id of the bank.
3. Readonly states for most fields except when in draft.
'''
_inherit = 'account.bank.statement.line'
_description = 'Bank Transaction'
def _get_period(self, cr, uid, date=False, context=None):
return self.pool['account.bank.statement']._get_period(
cr, uid, date=date, context=context)
def _get_period_context(self, cr, uid, context=None):
"""
Workaround for lp:1296229, context is passed positionally
"""
return self._get_period(cr, uid, context=context)
def _get_currency(self, cr, uid, 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(
cr, uid, uid, context=context).company_id.currency_id.id
def _get_invoice_id(self, cr, uid, ids, name, args, context=None):
res = {}
for st_line in self.browse(cr, uid, ids, context):
res[st_line.id] = False
for move_line in (
st_line.reconcile_id and
(st_line.reconcile_id.line_id or
st_line.reconcile_id.line_partial_ids) or
st_line.import_transaction_id and
st_line.import_transaction_id.move_line_id and
[st_line.import_transaction_id.move_line_id] or []):
if move_line.invoice:
res[st_line.id] = move_line.invoice.id
continue
return res
_columns = {
# Redefines. Todo: refactor away to view attrs
'amount': fields.float(
'Amount',
readonly=True,
digits_compute=dp.get_precision('Account'),
states={'draft': [('readonly', False)]},
),
'ref': fields.char(
'Ref.',
size=32,
readonly=True,
states={'draft': [('readonly', False)]},
),
'name': fields.char(
'Name',
size=64,
required=False,
readonly=True,
states={'draft': [('readonly', False)]},
),
'date': fields.date(
'Date',
required=True,
readonly=True,
states={'draft': [('readonly', False)]},
),
# New columns
'trans': fields.char(
'Bank Transaction ID',
size=15,
required=False,
readonly=True,
states={'draft': [('readonly', False)]},
),
'partner_bank_id': fields.many2one(
'res.partner.bank',
'Bank Account',
required=False,
readonly=True,
states={'draft': [('readonly', False)]},
),
'period_id': fields.many2one(
'account.period',
'Period',
required=True,
states={'confirmed': [('readonly', True)]},
),
'currency': fields.many2one(
'res.currency',
'Currency',
required=True,
states={'confirmed': [('readonly', True)]},
),
'reconcile_id': fields.many2one(
'account.move.reconcile',
'Reconciliation',
readonly=True,
),
'invoice_id': fields.function(
_get_invoice_id,
method=True,
string='Linked Invoice',
type='many2one',
relation='account.invoice',
),
}
_defaults = {
'period_id': _get_period_context,
'currency': _get_currency,
}
class invoice(orm.Model):
'''
Create other reference types as well.
Descendant classes can extend this function to add more reference
types, ie.
def _get_reference_type(self, cr, uid, context=None):
return super(my_class, self)._get_reference_type(cr, uid,
context=context) + [('my_ref', _('My reference')]
Don't forget to redefine the column "reference_type" as below or
your method will never be triggered.
TODO: move 'structured' part to account_banking_payment module
where it belongs
'''
_inherit = 'account.invoice'
def test_undo_paid(self, cr, uid, ids, context=None):
"""
Called from the workflow. Used to unset paid state on
invoices that were paid with bank transfers which are being cancelled
"""
for invoice in self.read(cr, uid, ids, ['reconciled'], context):
if invoice['reconciled']:
return False
return True
def _get_reference_type(self, cr, uid, context=None):
'''
Return the list of reference types
'''
return [('none', _('Free Reference')),
('structured', _('Structured Reference')),
]
_columns = {
'reference_type': fields.selection(_get_reference_type,
'Reference Type', required=True
)
}
class account_move_line(orm.Model):
_inherit = "account.move.line"
def get_balance(self, cr, uid, ids, context=None):
"""
Return the balance of any set of move lines.
Not to be confused with the 'balance' field on this model, which
returns the account balance that the move line applies to.
"""
total = 0.0
if not ids:
return total
for line in self.read(
cr, uid, ids, ['debit', 'credit'], context=context):
total += (line['debit'] or 0.0) - (line['credit'] or 0.0)
return total

View File

@@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data noupdate="1">
<record model="res.partner" id="partner_demo1">
<field name="name">Tiny S.p.r.l</field>
</record>
<record model="res.partner.bank" id="partner_bank1">
<field name="acc_number">301915554082</field>
<field name="state">bank</field>
<field name="partner_id" ref="partner_demo1"></field>
</record>
<record model="res.partner" id="partner_demo2">
<field name="name">The-design Company</field>
</record>
<record model="res.partner.bank" id="partner_bank2">
<field name="acc_number">050000000017</field>
<field name="state">iban</field>
<field name="partner_id" ref="partner_demo2"></field>
</record>
<!-- <record model="res.partner.bank" id="partner_agrolait">
<field name="acc_number">301915554082</field>
<field name="partner_id" ref="base.res_partner_agrolait"/>
</record>
<record model="res.partner.bank" id="res_partner_10">
<field name="acc_number">050000000017</field>
<field name="partner_id" ref="base.res_partner_10"/>
</record>-->
</data>
</openerp>

View File

@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<!-- Unset readonly state of country_id for ordinary account.
Leaving it will make it impossible to use bank accounts with
addresses outside the companies country.
Ratio: one can have bank accounts in foreign banks. Foreign
addresses not automatically involve international banking.
-->
<record id="base.bank_normal_field_contry" model="res.partner.bank.type.field">
<field name="name">country_id</field>
<field name="bank_type_id" ref="base.bank_normal"/>
<field eval="False" name="required"/>
<field eval="False" name="readonly"/>
</record>
</data>
</openerp>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,759 @@
# 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 <EMAIL@ADDRESS>, 2010.
#
msgid ""
msgstr ""
"Project-Id-Version: account-banking\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2010-07-16 14:58:26+0000\n"
"PO-Revision-Date: 2010-02-06 14:36+0000\n"
"Last-Translator: nanker <Unknown>\n"
"Language-Team: Danish <da@li.org>\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/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
#: 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
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
#: 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
#: field:account.banking.imported.file,file:0
msgid "Raw Data"
msgstr "Rå data"
#. 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
#: wizard_button:account_banking.banking_import,init,end:0
msgid "_Cancel"
msgstr "_Annuller"
#. module: account_banking
#: selection:payment.line,export_state:0
msgid "Draft"
msgstr "Udkast"
#. 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"
msgstr " 'but no default journal was defined."
#. 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
#: 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/wizard/bank_import.py:0
#, python-format
msgid ""
"Unable to link transaction id %(trans)s '\n"
" '(ref: %(ref)s) to invoice: '\n"
" 'invoice %(invoice)s was already paid"
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: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 "Insufficient data"
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/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
#: 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 ""
#. module: account_banking
#: code:addons/account_banking/wizard/bank_import.py:0
#, python-format
msgid ""
"Statement %(statement_id)s for account %(bank_account)s' \n"
" ' uses different currency than the defined bank "
"journal."
msgstr ""

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,774 @@
# 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 <EMAIL@ADDRESS>, 2010.
#
msgid ""
msgstr ""
"Project-Id-Version: account-banking\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2010-07-16 14:58:26+0000\n"
"PO-Revision-Date: 2010-02-12 01:28+0000\n"
"Last-Translator: goranc <goranc@gmail.com>\n"
"Language-Team: Croatian <hr@li.org>\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/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
#: 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
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
#: 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
#: field:account.banking.imported.file,file:0
msgid "Raw Data"
msgstr "nepripremljeni podaci"
#. 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
#: wizard_button:account_banking.banking_import,init,end:0
msgid "_Cancel"
msgstr "_Odustani"
#. module: account_banking
#: selection:payment.line,export_state:0
msgid "Draft"
msgstr "Nedovršeno"
#. 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"
msgstr " 'but no default journal was defined."
#. 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
#: 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/wizard/bank_import.py:0
#, python-format
msgid ""
"Unable to link transaction id %(trans)s '\n"
" '(ref: %(ref)s) to invoice: '\n"
" 'invoice %(invoice)s was already paid"
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: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 "Insufficient data"
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/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
#: 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"
#. module: account_banking
#: code:addons/account_banking/wizard/bank_import.py:0
#, python-format
msgid ""
"Statement %(statement_id)s for account %(bank_account)s' \n"
" ' uses different currency than the defined bank "
"journal."
msgstr ""

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,773 @@
# 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 <EMAIL@ADDRESS>, 2010.
#
msgid ""
msgstr ""
"Project-Id-Version: account-banking\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2010-07-16 14:58:26+0000\n"
"PO-Revision-Date: 2010-05-24 22:26+0000\n"
"Last-Translator: Lavinia Loredana Bertia <Unknown>\n"
"Language-Team: Romanian <ro@li.org>\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/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
#: 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
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
#: 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
#: field:account.banking.imported.file,file:0
msgid "Raw 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
#: wizard_button:account_banking.banking_import,init,end:0
msgid "_Cancel"
msgstr "_Anulează"
#. module: account_banking
#: selection:payment.line,export_state:0
msgid "Draft"
msgstr "Schiță"
#. 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
#, fuzzy, python-format
msgid "Statements found for account %(bank_account)s, '\n"
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
#: 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/wizard/bank_import.py:0
#, python-format
msgid ""
"Unable to link transaction id %(trans)s '\n"
" '(ref: %(ref)s) to invoice: '\n"
" 'invoice %(invoice)s was already paid"
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: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 "Insufficient data"
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/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
#: 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 ""
#. module: account_banking
#: code:addons/account_banking/wizard/bank_import.py:0
#, fuzzy, python-format
msgid ""
"Statement %(statement_id)s for account %(bank_account)s' \n"
" ' uses different currency than the defined bank "
"journal."
msgstr ""
"Extrasuri de cont găsite pentru contul %(bank_account)s, '\n"
" ' dar s-a setat nici un jurnal implicit."

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,766 @@
# Turkish 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 <EMAIL@ADDRESS>, 2010.
#
msgid ""
msgstr ""
"Project-Id-Version: account-banking\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2010-07-16 14:58+0000\n"
"PO-Revision-Date: 2010-10-10 11:17+0000\n"
"Last-Translator: Engin BAHADIR <Unknown>\n"
"Language-Team: Turkish <tr@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2010-10-11 12:32+0000\n"
"X-Generator: Launchpad (build Unknown)\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 "Sonuçlar:"
#. module: account_banking
#: code:addons/account_banking/wizard/bank_import.py:0
#, python-format
msgid "Number of errors found"
msgstr "Bulunan hataların sayısı"
#. module: account_banking
#: wizard_view:account_banking.banking_import,init:0
msgid "Select the processing details:"
msgstr "İşlem ayrıntılarını seçin:"
#. 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
#: code:addons/account_banking/account_banking.py:0
#, python-format
msgid "Invalid format"
msgstr "Geçersiz biçim"
#. 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 ""
#. 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 "_Kapat"
#. 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
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 ""
"%(account_no)s ile aynı numaraya sahip birden fazla banka hesabı bulundu"
#. module: account_banking
#: code:addons/account_banking/wizard/bank_import.py:0
#, python-format
msgid "Total number of transactions"
msgstr "Toplam işlem sayısı"
#. 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
#: 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 ""
#. module: account_banking
#: code:addons/account_banking/account_banking.py:0
#, python-format
msgid "Invalid IBAN account number!"
msgstr "Geçersiz IBAN hesap numarası"
#. 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
#: field:account.banking.imported.file,file:0
msgid "Raw Data"
msgstr ""
#. module: account_banking
#: selection:payment.line,export_state:0
msgid "Cancelled"
msgstr "İptal Edildi"
#. 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 "Bilinmeyen Banka"
#. module: account_banking
#: wizard_button:account_banking.banking_import,init,end:0
msgid "_Cancel"
msgstr "_iptal"
#. module: account_banking
#: selection:payment.line,export_state:0
msgid "Draft"
msgstr "Taslak"
#. module: account_banking
#: field:account.banking.imported.file,date:0
msgid "Import Date"
msgstr ""
#. module: account_banking
#: selection:payment.line,export_state:0
msgid "Confirmed"
msgstr "Onaylandı"
#. 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 "Banka Hesapları"
#. 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 "Onayla"
#. 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 "Varsayılan kredi hesabı"
#. module: account_banking
#: field:account.bank.statement.line,international:0
msgid "International Transaction"
msgstr "Uluslararası İşlem"
#. 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 ""
#. 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 "Gönderildi"
#. 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 "Hata !"
#. module: account_banking
#: code:addons/account_banking/account_banking.py:0
#, python-format
msgid "Invalid data"
msgstr "Geçersiz veri"
#. 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 "Reddedildi"
#. 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 "Görüntüleme Yapısı için Geçersiz XML!"
#. module: account_banking
#: view:account.banking.imported.file:0
msgid "Imported Bank Statements"
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
#: 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 "_Tamam"
#. 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 "HATA!"
#. module: account_banking
#: code:addons/account_banking/wizard/bank_import.py:0
#, python-format
msgid ""
"Unable to link transaction id %(trans)s '\n"
" '(ref: %(ref)s) to invoice: '\n"
" 'invoice %(invoice)s was already paid"
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 "Para Birimi"
#. module: account_banking
#: field:payment.line,msg:0
msgid "Message"
msgstr "İleti"
#. 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 "Firma"
#. 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 "Kayıt"
#. 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 "Insufficient data"
msgstr "Yetersiz veri"
#. 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/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 "Yüklü beyanların sayısı"
#. 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 "Hata"
#. module: account_banking
#: code:addons/account_banking/wizard/bank_import.py:0
#, python-format
msgid "Total number of statements"
msgstr "Beyanların toplam sayısı"
#. module: account_banking
#: code:addons/account_banking/account_banking.py:0
#, python-format
msgid "Unable to reconcile entry \"%s\": %.2f"
msgstr "\"%s\": %.2f girdisi bağdaştırılamadı"
#. 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 ""
"%(company_name)s şirketi ve %(date)s tarihi için uygun mali yıl bulunamadı"
#. 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 "Dönem"
#. module: account_banking
#: selection:payment.line,export_state:0
msgid "Done"
msgstr "Tamamlandı"
#. module: account_banking
#: view:payment.order:0
msgid "Select Invoices to Pay"
msgstr "Ödeme için Faturaları Seç"
#. 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 "Beyan dengesi doğru değil\n"
#. module: account_banking
#: constraint:ir.model:0
msgid ""
"The Object name must start with x_ and not contain any special character !"
msgstr "Nesne adı x_ ile başlamalı ve özel karakter içermemelidir!"
#. 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 "IBAN numarası yanlış gibi gözüküyor"
#. module: account_banking
#: field:account.banking.imported.file,format:0
#: wizard_field:account_banking.banking_import,init,parser:0
msgid "File Format"
msgstr "Dosya Biçimi"
#. 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 ""
"%(company_name)s şireketi ve %(date)s tarihine ait eşleşen birçok mali yıl "
"bulundu"
#. 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
msgid "Bank Costs Account"
msgstr ""
#. module: account_banking
#: selection:account.banking.imported.file,state:0
msgid "Finished"
msgstr "Tamamlandı"
#. module: account_banking
#: view:account.banking.account.settings:0
msgid "Bank Account Details"
msgstr "Banka Hesabı Ayrıntıları"
#. 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 "Banka Hesabı"
#. 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
#, python-format
msgid "Number of transactions matched"
msgstr "Eşleşen işlem sayısı"
#. 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 ""
#. module: account_banking
#: code:addons/account_banking/wizard/bank_import.py:0
#, python-format
msgid ""
"Statement %(statement_id)s for account %(bank_account)s' \n"
" ' uses different currency than the defined bank "
"journal."
msgstr ""

View File

@@ -0,0 +1,34 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright (C) 2011 Therp BV (<http://therp.nl>)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
""" r81: introduction of bank statement line state
"""
__name__ = ("account.bank.statement.line:: set new field 'state' to "
"confirmed for all statement lines belonging to confirmed "
"statements")
def migrate(cr, version):
cr.execute("UPDATE account_bank_statement_line as sl "
" SET state = 'confirmed'"
" FROM account_bank_statement as s "
" WHERE sl.statement_id = s.id "
" AND s.state = 'confirm' "
)

View File

@@ -0,0 +1,34 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright (C) 2013 Therp BV (<http://therp.nl>).
# All Rights Reserved
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
def migrate(cr, version):
if not version:
return
# workflow state moved to another, new module
cr.execute(
"""
UPDATE ir_model_data
SET module = 'account_banking_payment'
WHERE name = 'trans_done_sent'
AND module = 'account_direct_debit'
""")

View File

@@ -0,0 +1,32 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright (C) 2014 Therp BV (<http://therp.nl>).
# All Rights Reserved
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
def migrate(cr, version):
if not version:
return
# Rename value date column
cr.execute(
"""
ALTER TABLE banking_import_transaction
RENAME COLUMN effective_date TO value_date
""")

View File

@@ -0,0 +1,46 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright (C) 2014 Akretion (http://www.akretion.com/)
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
def table_exists(cr, table):
""" Check whether a certain table or view exists """
cr.execute(
'SELECT count(relname) FROM pg_class WHERE relname = %s',
(table,))
return cr.fetchone()[0] == 1
def migrate(cr, version):
"""
Migration script for semantic changes in account_banking_payment_export.
Putting the same script in this module for users migrating from 6.1,
before the export module was refactored out.
"""
if not version or not table_exists(cr, 'payment_line'):
return
cr.execute(
"UPDATE payment_line SET communication = communication2, "
"communication2 = null "
"FROM payment_order "
"WHERE payment_line.order_id = payment_order.id "
"AND payment_order.state in ('draft', 'open') "
"AND payment_line.state = 'normal' "
"AND communication2 is not null")

View File

@@ -0,0 +1,209 @@
# -*- encoding: utf-8 -*-
##############################################################################
#
# Copyright (C) 2009 EduSense BV (<http://www.edusense.nl>).
# All Rights Reserved
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
__all__ = [
'Field', 'Filler', 'DateField', 'NumberField', 'RightAlignedField',
'RecordType', 'Record', 'asciify'
]
__doc__ = '''Ease working with fixed length records in files'''
from datetime import datetime, date
# Correct python2.4 issues
try:
datetime.strptime
def strpdate(str, format):
return datetime.strptime(str, format).date()
except AttributeError:
import time
def strpdate(str, format):
tm = time.strptime(str, format)
return date(tm.tm_year, tm.tm_mon, tm.tm_mday)
import unicodedata
class Field(object):
'''Base Field class - fixed length left aligned string field in a record'''
def __init__(self, name, length=1, fillchar=' ', cast=str):
self.name = name.replace(' ', '_')
self.length = length
self.fillchar = fillchar
self.cast = cast
def format(self, value):
value = self.cast(value)
if len(value) > self.length:
return value[:self.length]
return value.ljust(self.length, self.fillchar)
def take(self, buffer):
offset = hasattr(self, 'offset') and self.offset or 0
return self.cast(buffer[offset:offset + self.length].rstrip(
self.fillchar)
)
def __repr__(self):
return '%s "%s"' % (self.__class__.__name__, self.name)
class Filler(Field):
'''Constant value field'''
def __init__(self, name, length=1, value=' '):
super(Filler, self).__init__(name, length, cast=str)
self.value = str(value)
def take(self, buffer):
return self.format(buffer)
def format(self, value):
return super(Filler, self).format(
self.value * (self.length / len(self.value) + 1)
)
class DateField(Field):
'''Variable date field'''
def __init__(self, name, format='%Y-%m-%d', auto=False, cast=str):
length = len(date.today().strftime(format))
super(DateField, self).__init__(name, length, cast=cast)
self.dateformat = format
self.auto = auto
def format(self, value):
if isinstance(value, (str, unicode)) and \
len(value.strip()) == self.length:
value = strpdate(value, self.dateformat)
elif not isinstance(value, (datetime, date)):
value = date.today()
return value.strftime(self.dateformat)
def take(self, buffer):
value = super(DateField, self).take(buffer)
if value:
return strpdate(value, self.dateformat)
return self.auto and date.today() or None
class RightAlignedField(Field):
'''Deviation of Field: right aligned'''
def format(self, value):
if len(value) > self.length:
return value[-self.length:]
return value.rjust(self.length, self.fillchar)
def take(self, buffer):
offset = hasattr(self, 'offset') and self.offset or 0
return self.cast(buffer[offset:offset + self.length].lstrip(
self.fillchar)
)
class NumberField(RightAlignedField):
'''Deviation of Field: left zero filled'''
def __init__(self, *args, **kwargs):
kwargs['fillchar'] = '0'
super(NumberField, self).__init__(*args, **kwargs)
def format(self, value):
return super(NumberField, self).format(self.cast(value or ''))
class RecordType(object):
fields = []
def __init__(self, fields=[]):
if fields:
self.fields = fields
offset = 0
for field in self.fields:
field.offset = offset
offset += field.length
def __len__(self):
return reduce(lambda x, y: x + y.length, self.fields, 0)
def __contains__(self, key):
return any(lambda x, y=key: x.name == y, self.fields)
def __getitem__(self, key):
for field in self.fields:
if field.name == key:
return field
raise KeyError('No such field: %s' % key)
def format(self, buffer):
result = []
for field in self.fields:
result.append(field.format(field.take(buffer)))
return ''.join(result)
def take(self, buffer):
return dict(zip([x.name for x in self.fields],
[x.take(buffer) for x in self.fields]
))
class Record(object):
_recordtype = None
def __init__(self, recordtype=None, value=''):
if hasattr(self, '_fields') and self._fields:
self._recordtype = RecordType(self._fields)
if not self._recordtype and not recordtype:
raise ValueError('No recordtype specified')
if not self._recordtype:
self._recordtype = recordtype()
self._length = len(self._recordtype)
self._value = value.ljust(self._length)[:self._length]
def __len__(self):
return self._length
def __setattr__(self, attr, value):
if attr.startswith('_'):
super(Record, self).__setattr__(attr, value)
else:
field = self._recordtype[attr]
self._value = (
self._value[:field.offset] +
field.format(value) +
self._value[field.offset + field.length:]
)
def __getattr__(self, attr):
if attr.startswith('_'):
return super(Record, self).__getattr__(attr)
field = self._recordtype[attr]
return field.take(self._value)
def __str__(self):
return self._recordtype.format(self._value)
def __unicode__(self):
return unicode(self.cast(self))
def asciify(str):
return unicodedata.normalize('NFKD', str).encode('ascii', 'ignore')

View File

@@ -0,0 +1,72 @@
# -*- encoding: utf-8 -*-
##############################################################################
#
# Copyright (C) 2013 Therp BV (<http://therp.nl>).
#
# All Rights Reserved
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from openerp.osv import orm
class ResPartner(orm.Model):
_inherit = 'res.partner'
def def_journal_account_bank(
self, cr, uid, ids, get_property_account, context=None):
"""
Returns the property journal account for the given partners ids.
:param get_property_account: method of this object that takes
a partner browse record and returns a field name of type many2one.
"""
if not ids:
return {}
res = dict([(res_id, False) for res_id in ids])
for partner in self.browse(cr, uid, ids, context=context):
property_account = get_property_account(partner)
if partner[property_account]:
res[partner.id] = partner[property_account].id
return res
def get_property_account_decrease(self, partner):
if partner.customer and not partner.supplier:
return 'property_account_receivable'
return 'property_account_payable'
def get_property_account_increase(self, partner):
if partner.supplier and not partner.customer:
return 'property_account_payable'
return 'property_account_receivable'
def def_journal_account_bank_decr(
self, cr, uid, ids, context=None):
"""
Return the default journal account to be used for this partner
in the case of bank transactions that decrease the balance.
"""
return self.def_journal_account_bank(
cr, uid, ids, self.get_property_account_decrease, context=context)
def def_journal_account_bank_incr(
self, cr, uid, ids, context=None):
"""
Return the default journal account to be used for this partner
in the case of bank transactions that increase the balance.
"""
return self.def_journal_account_bank(
cr, uid, ids, self.get_property_account_increase, context=context)

View File

@@ -0,0 +1,92 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright (C) 2009 EduSense BV (<http://www.edusense.nl>).
# (C) 2011 - 2014 Therp BV (<http://therp.nl>).
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from openerp.osv import orm
from openerp.addons.account_banking import sepa
class ResPartnerBank(orm.Model):
_inherit = 'res.partner.bank'
def online_account_info(
self, cr, uid, country_code, acc_number, context=None):
"""
API hook for legacy online lookup of account info,
to be removed in OpenERP 8.0.
"""
return False
def search(self, cr, uid, args, *rest, **kwargs):
"""
Disregard spaces when comparing IBANs.
"""
def is_term(arg):
'''Flag an arg as term or otherwise'''
return isinstance(arg, (list, tuple)) and len(arg) == 3
def extended_filter_term(term):
'''
Extend the search criteria in term when appropriate.
'''
result = [term]
extra_terms = []
if term[0].lower() == 'acc_number' and term[1] in ('=', '=='):
iban = sepa.IBAN(term[2])
if iban.valid:
# Disregard spaces when comparing IBANs
cr.execute(
"""
SELECT id FROM res_partner_bank
WHERE replace(acc_number, ' ', '') = %s
""", (term[2].replace(' ', ''),))
ids = [row[0] for row in cr.fetchall()]
result = [('id', 'in', ids)]
for extra_term in extra_terms:
result = ['|'] + result + [extra_term]
return result
def extended_search_expression(args):
'''
Extend the search expression in args when appropriate.
The expression itself is in reverse polish notation, so recursion
is not needed.
'''
if not args:
return []
result = []
if is_term(args[0]) and len(args) > 1:
# Classic filter, implicit '&'
result += ['&']
for arg in args:
if is_term(arg):
result += extended_filter_term(arg)
else:
result += arg
return result
# Extend search filter
newargs = extended_search_expression(args)
# Original search
return super(ResPartnerBank, self).search(
cr, uid, newargs, *rest, **kwargs)

View File

@@ -0,0 +1,23 @@
# -*- encoding: utf-8 -*-
##############################################################################
#
# Copyright (C) 2009 EduSense BV (<http://www.edusense.nl>).
# All Rights Reserved
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
import iban
IBAN = iban.IBAN
BBAN = iban.BBAN

View File

@@ -0,0 +1,534 @@
# -*- encoding: utf-8 -*-
##############################################################################
#
# Copyright (C) 2009 EduSense BV (<http://www.edusense.nl>).
# All Rights Reserved
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
# The information about SEPA account numbers in this module are collected
# from ISO 13616-1, which can be found at SWIFT's website:
# http://www.swift.com/solutions/messaging/information_products/bic_downloads_documents/pdfs/IBAN_Registry.pdf
#
# This module uses both SEPA and IBAN as seemingly interchangeble terms.
# However, a SEPA account is a bank account in the SEPA zone, which is
# represented by a IBAN number, which is build up from a ISO-693-1 two letter
# country code, two check digits and a BBAN number, representing the
# local/national accounting scheme.
#
# With the exception of Turkey, all countries use the full local adressing
# scheme in the IBAN numbers, making it possible to deduce the BBAN from the
# IBAN. As Turkey uses an additional code in the local scheme which is not
# part of the BBAN, for accounts located in Turkeys banks it is not possible
# to use the BBAN to reconstruct the local account.
#
# WARNING:
# This module contains seemingly enough info to create IBAN's from BBAN's.
# Although many BBAN/IBAN conversions seem algorithmic, there is enough
# deviation to take the warning from SEPA seriously: this is the domain of the
# account owning banks. Don't use it, unless you are prepared to loose your
# money. It is for heuristic validation purposes only.
__all__ = ['IBAN', 'BBAN']
def modulo_97_base10(abuffer):
'''
Calculate the modulo 97 value of a string in base10
'''
checksum = int(abuffer[0])
for digit in abuffer[1:]:
checksum *= 10
checksum += int(digit)
checksum %= 97
return checksum
def base36_to_base10str(abuffer):
'''
Convert a base36 string value to a string of base10 digits.
'''
result = ''
for digit in abuffer:
if digit.isalpha():
result += str(ord(digit) - 55)
else:
result += digit
return result
class BBANFormat(object):
'''
A BBANFormat is an auxilliary class for IBAN. It represents the composition
of a BBAN number from the different elements in order to translate a
IBAN number to a localized number. The reverse route, transforming a local
account to a SEPA account, is the sole responsibility of the banks.
'''
def __init__(self, ibanfmt, bbanfmt='%A', nolz=False):
'''
Specify the structure of the SEPA account in relation to the local
account. The XXZZ prefix that all SEPA accounts have is not part of
the structure in BBANFormat.
ibanfmt: string of identifiers from position 5 (start = 1):
A = Account position
N = Account digit
B = Bank code digit
C = Branch code digit
V = Account check digit
W = Bank code check digit
X = Additional check digit (some countries check everything)
P = Account prefix digit
The combination of N and A can be used to encode minimum length
leading-zero-stripped account numbers.
Example: (NL) 'CCCCAAAAAAAAAA'
will convert 'INGB0001234567' into
bankcode 'INGB' and account '0001234567'
bbanfmt: string of placeholders for the local bank account
%C: bank code
%B: branch code
%I: IBAN number (complete)
%T: account type
%P: account prefix
%A: account number. This will include the 'N' placeholder
positions in the ibanfmt.
%V, %W, %X: check digits (separate meanings)
%Z: IBAN check digits (only Poland uses these)
%%: %
anything else: literal copy
Example: (AT): '%A BLZ %C'
nolz: boolean indicating stripping of leading zeroes in the account
number. Defaults to False
'''
self._iban = ibanfmt
self._bban = bbanfmt
self._nolz = nolz
def __extract__(self, spec, value):
'''Extract the value based on the spec'''
i = self._iban.find(spec)
if i < 0:
return ''
result = ''
j = len(self._iban)
while i < j and self._iban[i] == spec:
result += value[i+4]
i += 1
return self._nolz and result.lstrip('0') or result
def bankcode(self, iban):
'''Return the bankcode'''
return self.__extract__('B', iban)
def branchcode(self, iban):
'''Return the branch code'''
return self.__extract__('C', iban)
def account(self, iban):
'''Return the account number'''
if self._iban.find('N') >= 0:
prefix = self.__extract__('N', iban).lstrip('0')
else:
prefix = ''
return prefix + self.__extract__('A', iban)
def BBAN(self, iban):
'''
Format the BBAN part of the IBAN in iban following the local
addressing scheme. We need the full IBAN in order to be able to use
the IBAN check digits in it, as Poland needs.
'''
res = ''
i = 0
while i < len(self._bban):
if self._bban[i] == '%':
i += 1
parm = self._bban[i]
if parm == 'I':
res += unicode(iban)
elif parm in 'BCDPTVWX':
res += self.__extract__(parm, iban)
elif parm == 'A':
res += self.account(iban)
elif parm == 'S':
res += iban
elif parm == 'Z':
# IBAN check digits (Poland)
res += iban[2:4]
elif parm == '%':
res += '%'
else:
res += self._bban[i]
i += 1
return res
class IBAN(str):
'''
A IBAN string represents a SEPA bank account number. This class provides
the interpretation and some validation of such strings.
Mind that, although there is sufficient reason to comment on the chosen
approach, we are talking about a transition period of at max. 1 year. Good
is good enough.
'''
BBAN_formats = {
'AL': BBANFormat('CCBBBBVAAAAAAAAAAAAAAAAAA', '%B%A'),
'AD': BBANFormat('CCCCBBBBAAAAAAAAAAAA', '%A'),
'AT': BBANFormat('BBBBBAAAAAAAAAAA', '%A BLZ %B'),
'BE': BBANFormat('CCCAAAAAAAVV', '%C-%A-%V'),
'BA': BBANFormat('BBBCCCAAAAAAAA', '%I'),
'BG': BBANFormat('BBBBCCCCAAAAAAAAAA', '%I'),
'CH': BBANFormat('CCCCCAAAAAAAAAAAAV', '%C %A', nolz=True),
'CS': BBANFormat('BBBAAAAAAAAAAAAAVV', '%B-%A-%V'),
'CY': BBANFormat('BBBCCCCCAAAAAAAAAAAAAAAA', '%B%C%A'),
'CZ': BBANFormat('BBBBPPPPPPAAAAAAAAAA', '%B-%P/%A'),
'DE': BBANFormat('BBBBBBBBAAAAAAAAAAV', '%A BLZ %B'),
'DK': BBANFormat('CCCCAAAAAAAAAV', '%C %A%V'),
'EE': BBANFormat('BBCCAAAAAAAAAAAV', '%A%V'),
'ES': BBANFormat('BBBBCCCCWVAAAAAAAAAA', '%B%C%W%V%A'),
'FI': BBANFormat('CCCCTTAAAAAAAV', '%C%T-%A%V', nolz=True),
'FR': BBANFormat('BBBBBCCCCCAAAAAAAAAAAVV', '%B %C %A %V'),
'FO': BBANFormat('BBBBAAAAAAAAAV', '%B %A%V'),
# Great Brittain uses a special display for the branch code, which we
# can't honor using the current system. If this appears to be a
# problem, we can come up with something later.
'GB': BBANFormat('BBBBCCCCCCAAAAAAAAV', '%C %A'),
'GI': BBANFormat('BBBBAAAAAAAAAAAAAAA', '%A'),
'GL': BBANFormat('CCCCAAAAAAAAAV', '%C %A%V'),
'GR': BBANFormat('BBBCCCCAAAAAAAAAAAAAAAA', '%B-%C-%A', nolz=True),
'HR': BBANFormat('BBBBBBBAAAAAAAAAA', '%B-%A'),
'HU': BBANFormat('BBBCCCCXAAAAAAAAAAAAAAAV', '%B%C%X %A%V'),
'IE': BBANFormat('BBBBCCCCCCAAAAAAAA', '%C %A'),
'IL': BBANFormat('BBBCCCAAAAAAAAAAAAA', '%C%A'),
# Iceland uses an extra identification number, split in two on
# display. Coded here as %P%V.
'IS': BBANFormat('CCCCTTAAAAAAPPPPPPVVVV', '%C-%T-%A-%P-%V'),
'IT': BBANFormat('WBBBBBCCCCCAAAAAAAAAAAA', '%W/%B/%C/%A'),
'LV': BBANFormat('BBBBAAAAAAAAAAAAA', '%I'),
'LI': BBANFormat('CCCCCAAAAAAAAAAAA', '%C %A', nolz=True),
'LT': BBANFormat('BBBBBAAAAAAAAAAA', '%I'),
'LU': BBANFormat('BBBAAAAAAAAAAAAA', '%I'),
'MC': BBANFormat('BBBBBCCCCCAAAAAAAAAAAVV', '%B %C %A %V'),
'ME': BBANFormat('CCCAAAAAAAAAAAAAVV', '%C-%A-%V'),
'MK': BBANFormat('BBBAAAAAAAAAAVV', '%B-%A-%V', nolz=True),
'MT': BBANFormat('BBBBCCCCCAAAAAAAAAAAAAAAAAA', '%A', nolz=True),
# Mauritius has an aditional bank identifier, a reserved part and the
# currency as part of the IBAN encoding. As there is no representation
# given for the local account in ISO 13616-1 we assume IBAN, which
# circumvents the BBAN display problem.
'MU': BBANFormat('BBBBBBCCAAAAAAAAAAAAVVVWWW', '%I'),
# Netherlands has two different local account schemes: one with and
# one without check digit (9-scheme and 7-scheme). Luckily most Dutch
# financial services can keep the two apart without telling, so leave
# that. Also leave the leading zero issue, as most banks are already
# converting their local account numbers to BBAN format.
'NL': BBANFormat('BBBBAAAAAAAAAA', '%A'),
# Norway seems to split the account number in two on display. For now
# we leave that. If this appears to be a problem, we can fix it later.
'NO': BBANFormat('CCCCAAAAAV', '%C.%A%V'),
'PL': BBANFormat('CCCCCCCCAAAAAAAAAAAAAAAA', '%Z%C %A'),
'PT': BBANFormat('BBBBCCCCAAAAAAAAAAAVV', '%B.%C.%A.%V'),
'RO': BBANFormat('BBBBAAAAAAAAAAAAAAAA', '%A'),
'SA': BBANFormat('BBAAAAAAAAAAAAAAAA', '%B%A'),
'SE': BBANFormat('CCCAAAAAAAAAAAAAAAAV', '%A'),
'SI': BBANFormat('CCCCCAAAAAAAAVV', '%C-%A%V', ),
# Slovakia uses two different format for local display. We stick with
# their formal BBAN specs
'SK': BBANFormat('BBBBPPPPPPAAAAAAAAAAAA', '%B%P%A'),
# San Marino: No information for display of BBAN, so stick with IBAN
'SM': BBANFormat('WBBBBBCCCCCCAAAAAAAAAAAAV', '%I'),
'TN': BBANFormat('BBCCCAAAAAAAAAAAAAVV', '%B %C %A %V'),
# Turkey has insufficient information in the IBAN number to regenerate
# the BBAN: the branch code for local addressing is missing (5n).
'TR': BBANFormat('BBBBBWAAAAAAAAAAAAAAAA', '%B%C%A'),
}
countries = BBAN_formats.keys()
unknown_BBAN_format = BBANFormat('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', '%I')
def __new__(cls, arg, **kwargs):
'''
All letters should be uppercase and acceptable. As str is an
in 'C' implemented class, this can't be done in __init__.
'''
init = ''
if arg:
for item in arg.upper():
if item.isalnum():
init += item
elif item not in ' \t.-':
raise ValueError('Invalid chars found in IBAN number')
return str.__new__(cls, init)
def __init__(self, *args, **kwargs):
'''
Sanity check: don't offer extensions unless the base is sound.
'''
super(IBAN, self).__init__()
if self.countrycode not in self.countries:
self.BBAN_format = self.unknown_BBAN_format
else:
self.BBAN_format = self.BBAN_formats[self.countrycode]
@classmethod
def create(cls, BIC=None, countrycode=None, BBAN=None, bankcode=None,
branchcode=None, account=None):
'''
Create a IBAN number from a BBAN and a country code. Optionaly create
a BBAN from BBAN components before generation.
Incomplete: can only work with valid BBAN now.
'''
if BIC:
if not bankcode:
bankcode = BIC[:4]
if not countrycode:
countrycode = BIC[4:6]
else:
if countrycode:
countrycode = countrycode.upper()
else:
raise ValueError('Either BIC or countrycode is required')
if countrycode not in cls.countries:
raise ValueError('%s is not a SEPA country' % countrycode)
format = cls.BBAN_formats[countrycode]
if BBAN:
if len(BBAN) == len(format._iban):
ibanno = cls(countrycode + '00' + BBAN)
return cls(countrycode + ibanno.checksum + BBAN)
raise ValueError('Insufficient data to generate IBAN')
@property
def valid(self):
'''
Check if the string + check digits deliver a valid checksum
'''
_buffer = self[4:] + self[:4]
return (
self.countrycode in self.countries
and int(base36_to_base10str(_buffer)) % 97 == 1
)
def __repr__(self):
'''
Formal representation is in chops of four characters, devided by a
space.
'''
parts = []
for i in range(0, len(self), 4):
parts.append(self[i:i+4])
return ' '.join(parts)
def __unicode__(self):
'''
Return unicode representation of self
'''
return u'%r' % self
@property
def checksum(self):
'''
Generate a new checksum for an otherwise correct layed out BBAN in a
IBAN string.
NOTE: This is the responsability of the banks. No guaranties whatsoever
that this delivers usable IBAN accounts. Mind your money!
'''
_buffer = self[4:] + self[:2] + '00'
_buffer = base36_to_base10str(_buffer)
return '%.2d' % (98 - modulo_97_base10(_buffer))
@property
def checkdigits(self):
'''
Return the digits which form the checksum in the IBAN string
'''
return self[2:4]
@property
def countrycode(self):
'''
Return the ISO country code
'''
return self[:2]
@property
def bankcode(self):
'''
Return the bank code
'''
return self.BBAN_format.bankcode(self)
@property
def BIC_searchkey(self):
'''
BIC's, or Bank Identification Numbers, are composed of the bank
code, followed by the country code, followed by the localization
code, followed by an optional department number.
The bank code seems to be world wide unique. Knowing this,
one can use the country + bankcode info from BIC to narrow a
search for the bank itself.
Note that some countries use one single localization code for
all bank transactions in that country, while others do not. This
makes it impossible to use an algorithmic approach for generating
the full BIC.
'''
return self.bankcode[:4] + self.countrycode
@property
def branchcode(self):
'''
Return the branch code
'''
return self.BBAN_format.branchcode(self)
@property
def localized_BBAN(self):
'''
Localized format of local or Basic Bank Account Number, aka BBAN
'''
if self.countrycode == 'TR':
# The Turkish BBAN requires information that is not in the
# IBAN number.
return False
return self.BBAN_format.BBAN(self)
@property
def BBAN(self):
'''
Return full encoded BBAN, which is for all countries the IBAN string
after the ISO-639 code and the two check digits.
'''
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.
'''
self._bban = None
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
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:]:
iban = IBAN(arg)
print('IBAN:', iban)
print('country code:', iban.countrycode)
print('bank code:', iban.bankcode)
print('branch code:', iban.branchcode)
print('BBAN:', iban.BBAN)
print('localized BBAN:', iban.localized_BBAN)
print('check digits:', iban.checkdigits)
print('checksum:', iban.checksum)

View File

@@ -0,0 +1,187 @@
# -*- encoding: utf-8 -*-
##############################################################################
#
# Copyright (C) 2009 EduSense BV (<http://www.edusense.nl>).
# All Rights Reserved
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
'''
This module provides a utility class to extract postal codes from address
strings.
'''
import re
__all__ = ['split', 'get', 'PostalCode']
class PostalCode(object):
'''
The PostalCode class is a wrapper around PostCodeFormat and an internal
database of postalcode formats. It provides the class methods split() and
get(), both of which must be called with the two character iso country
code as first parameter.
'''
class PostalCodeFormat(object):
'''
Utility class of PostalCode.
Allows finding and splitting of postalcode in strings
'''
def __init__(self, format):
'''
Create regexp patterns for matching
'''
# Sort formats on length, longest first
formats = [(len(x), x) for x in format.split('|')]
formats = [x[1] for x in sorted(formats, lambda x, y: -cmp(x, y))]
self.res = [re.compile(x.replace('#', '\\d').replace('@', '[A-Z]'))
for x in formats
]
def get(self, str_):
'''
Return the postal code from the string str_
'''
for re_ in self.res:
retval = re_.findall(str_)
if retval:
break
return retval and retval[0] or ''
def split(self, str_):
'''
Split str_ into (postalcode, remainder)
'''
for re_ in self.res:
pos = re_.search(str_)
if pos:
break
if pos:
return (pos.group(), str_[pos.end():])
return ('', str_)
_formats = {
'AF': '', 'AX': '', 'AL': '', 'DZ': '#####', 'AS': '', 'AD': 'AD###',
'AO': '', 'AI': '', 'AQ': '', 'AG': '', 'AR': '@####@@@',
'AM': '######', 'AW': '', 'AU': '####', 'AT': '####', 'AZ': 'AZ ####',
'BS': '', 'BH': '####|###', 'BD': '####', 'BB': 'BB#####',
'BY': '######', 'BE': '####', 'BZ': '', 'BJ': '', 'BM': '@@ ##',
'BT': '', 'BO': '', 'BA': '#####', 'BW': '', 'BV': '',
'BR': '#####-###', 'IO': '', 'BN': '@@####', 'BG': '####', 'BF': '',
'BI': '', 'KH': '#####', 'CM': '', 'CA': '@#@ #@#', 'CV': '####',
'KY': '', 'CF': '', 'TD': '', 'CL': '#######', 'CN': '######',
'CX': '####', 'CC': '', 'CO': '', 'KM': '', 'CG': '', 'CD': '',
'CK': '', 'CR': '####', 'CI': '', 'HR': 'HR-#####', 'CU': 'CP #####',
'CY': '####', 'CZ': '### ##', 'DK': '####', 'DJ': '', 'DM': '',
'DO': '#####', 'EC': '@####@', 'EG': '#####', 'SV': 'CP ####',
'GQ': '', 'ER': '', 'EE': '#####', 'ET': '####', 'FK': '',
'FO': 'FO-###', 'FJ': '', 'FI': 'FI-#####', 'FR': '#####',
'GF': '#####', 'PF': '#####', 'TF': '', 'GA': '', 'GM': '',
'GE': '####', 'DE': '#####', 'GH': '', 'GI': '', 'GR': '### ##',
'GL': '####', 'GD': '', 'GP': '#####', 'GU': '969##', 'GT': '#####',
'GG': '@# #@@|@## #@@|@@# #@@|@@## #@@|@#@ #@@|@@#@ #@@|GIR0AA',
'GN': '', 'GW': '####', 'GY': '', 'HT': 'HT####', 'HM': '', 'VA': '',
'HN': '@@####', 'HK': '', 'HU': '####', 'IS': '###', 'IN': '######',
'ID': '#####', 'IR': '##########', 'IQ': '#####', 'IE': '',
'IM': '@# #@@|@## #@@|@@# #@@|@@## #@@|@#@ #@@|@@#@ #@@|GIR0AA',
'IL': '#####', 'IT': '####', 'JM': '', 'JP': '###-####',
'JE': '@# #@@|@## #@@|@@# #@@|@@## #@@|@#@ #@@|@@#@ #@@|GIR0AA',
'JO': '#####', 'KZ': '######', 'KE': '#####', 'KI': '',
'KP': '###-###',
'KR': 'SEOUL ###-###', 'KW': '#####', 'KG': '######', 'LA': '#####',
'LV': 'LV-####', 'LB': '#### ####|####', 'LS': '###', 'LR': '####',
'LY': '', 'LI': '####', 'LT': 'LT-#####', 'LU': '####', 'MO': '',
'MK': '####', 'MG': '###', 'MW': '', 'MY': '#####', 'MV': '#####',
'ML': '', 'MT': '@@@ ###|@@@ ##', 'MH': '', 'MQ': '#####', 'MR': '',
'MU': '', 'YT': '#####', 'MX': '#####', 'FM': '#####', 'MD': 'MD-####',
'MC': '#####', 'MN': '######', 'ME': '#####', 'MS': '', 'MA': '#####',
'MZ': '####', 'MM': '#####', 'NA': '', 'NR': '', 'NP': '#####',
'NL': '#### @@', 'AN': '', 'NC': '#####', 'NZ': '####',
'NI': '###-###-#', 'NE': '####', 'NG': '######', 'NU': '', 'NF': '',
'MP': '', 'NO': '####', 'OM': '###', 'PK': '#####', 'PW': '96940',
'PS': '', 'PA': '', 'PG': '###', 'PY': '####', 'PE': '', 'PH': '####',
'PN': '', 'PL': '##-###', 'PT': '####-###', 'PR': '#####-####',
'QA': '', 'RE': '#####', 'RO': '######', 'RU': '######', 'RW': '',
'BL': '### ###', 'SH': 'STHL 1ZZ', 'KN': '', 'LC': '', 'MF': '### ###',
'PM': '', 'VC': '', 'WS': '', 'SM': '4789#', 'ST': '', 'SA': '#####',
'SN': '#####', 'RS': '######', 'SC': '', 'SL': '', 'SG': '######',
'SK': '### ##', 'SI': 'SI- ####', 'SB': '', 'SO': '@@ #####',
'ZA': '####', 'GS': '', 'ES': '#####', 'LK': '#####', 'SD': '#####',
'SR': '', 'SJ': '', 'SZ': '@###', 'SE': 'SE-### ##', 'CH': '####',
'SY': '', 'TW': '#####', 'TJ': '######', 'TZ': '', 'TH': '#####',
'TL': '', 'TG': '', 'TK': '', 'TO': '', 'TT': '', 'TN': '####',
'TR': '#####', 'TM': '######', 'TC': 'TKCA 1ZZ', 'TV': '', 'UG': '',
'UA': '#####', 'AE': '',
'GB': '@# #@@|@## #@@|@@# #@@|@@## #@@|@#@ #@@|@@#@ #@@|GIR0AA',
'US': '#####-####', 'UM': '', 'UY': '#####', 'UZ': '######', 'VU': '',
'VE': '####', 'VN': '######', 'VG': '', 'VI': '', 'WF': '', 'EH': '',
'YE': '', 'ZM': '#####', 'ZW': ''
}
for iso, formatstr in _formats.iteritems():
_formats[iso] = PostalCodeFormat(formatstr)
@classmethod
def split(cls, str_, iso=''):
'''
Split string <str_> in (postalcode, remainder) following the specs of
country <iso>.
Returns iso, postal code and the remaining part of <str_>.
When iso is filled but postal code remains empty, no postal code could
be found according to the rules of iso.
When iso is empty but postal code is not, a proximity match was
made where multiple hits gave similar results. A postal code is
likely, but a unique iso code could not be identified.
When neither iso or postal code are filled, no proximity match could
be made.
'''
if iso in cls._formats:
return (iso,) + tuple(cls._formats[iso].split(str_))
# Find optimum (= max length postalcode) when iso code is unknown
all = {}
max_l = 0
for key in cls._formats.iterkeys():
i, p, c = cls.split(str_, key)
l = len(p)
if l > max_l:
max_l = l
if l in all:
all[l].append((i, p, c))
else:
all[l] = [(i, p, c)]
if max_l > 0:
if len(all[max_l]) > 1:
return ('',) + all[max_l][0][1:]
return all[max_l][0]
return ('', '', str_)
@classmethod
def get(cls, iso, str_):
'''
Extracts the postal code from str_ following the specs of country
<iso>.
'''
if iso in cls._formats:
return cls._formats[iso].get(str_)
return ''
get = PostalCode.get
split = PostalCode.split

View File

@@ -0,0 +1,57 @@
# -*- encoding: utf-8 -*-
##############################################################################
#
# Copyright (C) 2009 EduSense BV (<http://www.edusense.nl>).
# All Rights Reserved
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
'''
Define a struct class which behaves like a dict, but allows using
object.attr alongside object['attr'].
'''
__all__ = ['struct']
class struct(dict):
'''
Ease working with dicts. Allow dict.key alongside dict['key']
'''
def __setattr__(self, item, value):
self.__setitem__(item, value)
def __getattr__(self, item):
return self.__getitem__(item)
def show(self, indent=0, align=False, ralign=False):
'''
PrettyPrint method. Aligns keys right (ralign) or left (align).
'''
if align or ralign:
width = 0
for key in self.iterkeys():
width = max(width, len(key))
alignment = ''
if not ralign:
alignment = '-'
fmt = '%*.*s%%%s%d.%ds: %%s' % (
indent, indent, '', alignment, width, width
)
else:
fmt = '%*.*s%%s: %%s' % (indent, indent, '')
for item in self.iteritems():
print(fmt % item)

View File

@@ -0,0 +1,24 @@
# -*- encoding: utf-8 -*-
##############################################################################
#
# Copyright (C) 2009 EduSense BV (<http://www.edusense.nl>).
# All Rights Reserved
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from . import bank_import
from . import banking_transaction_wizard
from . import link_partner

View File

@@ -0,0 +1,338 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright (C) 2009 EduSense BV (<http://www.edusense.nl>).
# All Rights Reserved
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from openerp.tools.translate import _
from openerp.addons.account_banking import sepa
from openerp.addons.account_banking.struct import struct
__all__ = [
'get_period',
'get_bank_accounts',
'get_partner',
'get_country_id',
'get_company_bank_account',
'create_bank_account',
]
def get_period(pool, cr, uid, date, company, log=None):
'''
Wrapper over account_period.find() to log exceptions of
missing periods instead of raising.
'''
context = {'account_period_prefer_normal': True}
if company:
context['company_id'] = company.id
try:
period_ids = pool.get('account.period').find(
cr, uid, dt=date, context=context)
except Exception as e:
if log is None:
raise
else:
log.append(e)
return False
return period_ids[0]
def get_bank_accounts(pool, cr, uid, account_number, log, fail=False):
'''
Get the bank account with account number account_number
'''
# No need to search for nothing
if not account_number:
return []
partner_bank_obj = pool.get('res.partner.bank')
bank_account_ids = partner_bank_obj.search(cr, uid, [
('acc_number', '=', account_number)
])
if not bank_account_ids:
if not fail:
log.append(
_('Bank account %(account_no)s was not found in the database')
% dict(account_no=account_number)
)
return []
return partner_bank_obj.browse(cr, uid, bank_account_ids)
def _has_attr(obj, attr):
# Needed for dangling addresses and a weird exception scheme in
# OpenERP's orm.
try:
return bool(getattr(obj, attr))
except KeyError:
return False
def get_partner(pool, cr, uid, name, address, postal_code, city,
country_id, log, context=None):
'''
Get the partner belonging to the account holders name <name>
If multiple partners are found with the same name, select the first and
add a warning to the import log.
TODO: revive the search by lines from the address argument
'''
partner_obj = pool.get('res.partner')
partner_ids = partner_obj.search(
cr, uid, [
'|', ('is_company', '=', True), ('parent_id', '=', False),
('name', 'ilike', name),
], context=context)
if not partner_ids:
# Try brute search on address and then match reverse
criteria = []
if country_id:
criteria.append(('country_id', '=', country_id))
if city:
criteria.append(('city', 'ilike', city))
if postal_code:
criteria.append(('zip', 'ilike', postal_code))
partner_search_ids = partner_obj.search(
cr, uid, criteria, context=context)
if (not partner_search_ids and country_id):
# Try again with country_id = False
criteria[0] = ('country_id', '=', False)
partner_search_ids = partner_obj.search(
cr, uid, criteria, context=context)
key = name.lower()
partners = []
for partner in partner_obj.read(
cr, uid, partner_search_ids, ['name', 'commercial_partner_id'],
context=context):
if (len(partner['name']) > 3 and partner['name'].lower() in key):
partners.append(partner)
partners.sort(key=lambda x: len(x['name']), reverse=True)
partner_ids = [x['commercial_partner_id'][0] for x in partners]
if len(partner_ids) > 1:
log.append(
_('More than one possible match found for partner with '
'name %(name)s') % {'name': name})
return partner_ids and partner_ids[0] or False
def get_company_bank_account(pool, cr, uid, account_number, currency,
company, log):
'''
Get the matching bank account for this company. Currency is the ISO code
for the requested currency.
'''
results = struct()
bank_accounts = get_bank_accounts(pool, cr, uid, account_number, log,
fail=True)
if not bank_accounts:
return False
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_accounts[0]
bank_settings_obj = pool.get('account.banking.account.settings')
criteria = [('partner_bank_id', '=', bank_accounts[0].id)]
# Find matching journal for currency
journal_obj = pool.get('account.journal')
journal_ids = journal_obj.search(cr, uid, [
('type', '=', 'bank'),
('currency.name', '=', currency or company.currency_id.name)
])
if currency == company.currency_id.name:
journal_ids_no_curr = journal_obj.search(cr, uid, [
('type', '=', 'bank'), ('currency', '=', False)
])
journal_ids.extend(journal_ids_no_curr)
if journal_ids:
criteria.append(('journal_id', 'in', journal_ids))
# Find bank account settings
bank_settings_ids = bank_settings_obj.search(cr, uid, criteria)
if bank_settings_ids:
settings = bank_settings_obj.browse(cr, 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, cr, uid, bic, online=False, code=None,
name=None, context=None):
'''
Find or create the bank with the provided BIC code.
When online, the SWIFT database will be consulted in order to
provide for missing information.
'''
# UPDATE: Free SWIFT databases are since 2/22/2010 hidden behind an
# image challenge/response interface.
bank_obj = pool.get('res.bank')
# Self generated key?
if len(bic) < 8:
# search key
bank_ids = bank_obj.search(
cr, uid, [
('bic', '=', bic[:6])
])
if not bank_ids:
bank_ids = bank_obj.search(
cr, uid, [
('bic', 'ilike', bic + '%')
])
else:
bank_ids = bank_obj.search(
cr, uid, [
('bic', '=', bic)
])
if bank_ids and len(bank_ids) == 1:
banks = bank_obj.browse(cr, uid, bank_ids)
return banks[0].id, banks[0].country.id
country_obj = pool.get('res.country')
country_ids = country_obj.search(
cr, uid, [('code', '=', bic[4:6])]
)
country_id = country_ids and country_ids[0] or False
bank_id = False
if online:
info, address = bank_obj.online_bank_info(
cr, uid, bic, context=context
)
if info:
bank_id = bank_obj.create(cr, uid, dict(
code=info.code,
name=info.name,
street=address.street,
street2=address.street2,
zip=address.zip,
city=address.city,
country=country_id,
bic=info.bic[:8],
))
else:
info = struct(name=name, code=code)
if not online or not bank_id:
bank_id = bank_obj.create(cr, uid, dict(
code=info.code or 'UNKNOW', # FIXME: Typo?
name=info.name or _('Unknown Bank'),
country=country_id,
bic=bic,
))
return bank_id, country_id
def get_country_id(pool, cr, uid, transaction, context=None):
"""
Derive a country id from the info on the transaction.
:param transaction: browse record of a transaction
:returns: res.country id or False
"""
country_code = False
iban = sepa.IBAN(transaction.remote_account)
if iban.valid:
country_code = iban.countrycode
elif transaction.remote_owner_country_code:
country_code = transaction.remote_owner_country_code
# fallback on the import parsers country code
elif transaction.bank_country_code:
country_code = transaction.bank_country_code
if country_code:
country_ids = pool.get('res.country').search(
cr, uid, [('code', '=', country_code.upper())],
context=context)
country_id = country_ids and country_ids[0] or False
if not country_id:
company = transaction.statement_line_id.company_id
if company.partner_id.country:
country_id = company.partner_id.country.id
return country_id
def create_bank_account(pool, cr, uid, partner_id,
account_number, holder_name, address, city,
country_id, bic=False,
context=None):
'''
Create a matching bank account with this holder for this partner.
'''
values = struct(
partner_id=partner_id,
owner_name=holder_name,
country_id=country_id,
)
# Are we dealing with IBAN?
iban = sepa.IBAN(account_number)
if iban.valid:
# Take as much info as possible from IBAN
values.state = 'iban'
values.acc_number = str(iban)
else:
# No, try to convert to IBAN
values.state = 'bank'
values.acc_number = account_number
if country_id:
country_code = pool.get('res.country').read(
cr, uid, country_id, ['code'], context=context)['code']
if country_code in sepa.IBAN.countries:
account_info = pool['res.partner.bank'].online_account_info(
cr, uid, country_code, values.acc_number, context=context)
if account_info:
values.acc_number = iban = account_info.iban
values.state = 'iban'
bic = account_info.bic
if bic:
values.bank = get_or_create_bank(pool, cr, uid, bic)[0]
values.bank_bic = bic
# Create bank account and return
return pool.get('res.partner.bank').create(
cr, uid, values, context=context)

View File

@@ -0,0 +1,208 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright (C) 2013 Therp BV (<http://therp.nl>).
# All Rights Reserved
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from openerp.osv import orm, fields
from openerp.tools.translate import _
from openerp.addons.account_banking.wizard import banktools
import ast
class link_partner(orm.TransientModel):
_name = 'banking.link_partner'
_description = 'Link partner'
_columns = {
'name': fields.char(
'Create partner with name', size=128, required=True),
'supplier': fields.boolean('Supplier'),
'customer': fields.boolean('Customer'),
'partner_id': fields.many2one(
'res.partner', 'or link existing partner',
domain=['|', ('is_company', '=', True),
('parent_id', '=', False)],
),
'statement_line_id': fields.many2one(
'account.bank.statement.line',
'Statement line', required=True),
'amount': fields.related(
'statement_line_id', 'amount', type='float',
string="Amount", readonly=True),
'ref': fields.related(
'statement_line_id', 'ref', type='char', size=32,
string="Reference", readonly=True),
'message': fields.related(
'statement_line_id', 'import_transaction_id', 'message',
type='char', size=1024,
string="Message", readonly=True),
'remote_account': fields.char(
'Account number', size=24, readonly=True),
# Partner values
'street': fields.char('Street', size=128),
'street2': fields.char('Street2', size=128),
'zip': fields.char('Zip', change_default=True, size=24),
'city': fields.char('City', size=128),
'state_id': fields.many2one("res.country.state", 'State'),
'country_id': fields.many2one('res.country', 'Country'),
'email': fields.char('Email', size=240),
'phone': fields.char('Phone', size=64),
'fax': fields.char('Fax', size=64),
'mobile': fields.char('Mobile', size=64),
'is_company': fields.boolean('Is a Company'),
}
_defaults = {
'is_company': True,
}
def create(self, cr, uid, vals, context=None):
"""
Get default values from the transaction data
on the statement line
"""
if vals and vals.get('statement_line_id'):
statement_line_obj = self.pool.get('account.bank.statement.line')
statement_line = statement_line_obj.browse(
cr, uid, vals['statement_line_id'], context=context)
transaction = statement_line.import_transaction_id
if statement_line.partner_bank_id:
raise orm.except_orm(
_('Error'),
_('Statement line is already linked to a bank account '))
if not(transaction
and transaction.remote_account):
raise orm.except_orm(
_('Error'),
_('No transaction data on statement line'))
if 'supplier' not in vals and statement_line.amount < 0:
vals['supplier'] = True
if 'customer' not in vals and statement_line.amount > 0:
vals['customer'] = True
address_list = []
try:
address_list = ast.literal_eval(
transaction.remote_owner_address or [])
except ValueError:
pass
if address_list and not vals.get('street'):
vals['street'] = address_list.pop(0)
if address_list and not vals.get('street2'):
vals['street2'] = address_list.pop(0)
if transaction.remote_owner_postalcode and not vals.get('zip'):
vals['zip'] = transaction.remote_owner_postalcode
if transaction.remote_owner_city and not vals.get('city'):
vals['city'] = transaction.remote_owner_city
if not vals.get('country_id'):
vals['country_id'] = banktools.get_country_id(
self.pool, cr, uid, transaction, context=context)
if not vals.get('name'):
vals['name'] = transaction.remote_owner
if not vals['name']:
vals['name'] = '/'
if not vals.get('remote_account'):
vals['remote_account'] = transaction.remote_account
return super(link_partner, self).create(
cr, uid, vals, context=context)
def update_partner_values(self, cr, uid, wizard, values, context=None):
"""
Updates the new partner values with the values from the wizard
:param wizard: read record of wizard (with load='_classic_write')
:param values: the dictionary of partner values that will be updated
"""
for field in ['is_company',
'name',
'street',
'street2',
'zip',
'city',
'country_id',
'state_id',
'phone',
'fax',
'mobile',
'email'
]:
if wizard[field]:
values[field] = wizard[field]
return True
def link_partner(self, cr, uid, ids, context=None):
statement_line_obj = self.pool.get(
'account.bank.statement.line')
wiz = self.browse(cr, uid, ids[0], context=context)
if wiz.partner_id:
partner_id = wiz.partner_id.id
else:
wiz_read = self.read(
cr, uid, ids[0], context=context, load='_classic_write')
partner_vals = {
'type': 'default',
}
self.update_partner_values(
cr, uid, wiz_read, partner_vals, context=context)
partner_id = self.pool.get('res.partner').create(
cr, uid, partner_vals, context=context)
partner_bank_id = banktools.create_bank_account(
self.pool, cr, uid, partner_id,
wiz.remote_account, wiz.name,
wiz.street, wiz.city,
wiz.country_id and wiz.country_id.id or False,
bic=wiz.statement_line_id.import_transaction_id.remote_bank_bic,
context=context)
statement_line_ids = statement_line_obj.search(
cr, uid,
[('import_transaction_id.remote_account', '=', wiz.remote_account),
('partner_bank_id', '=', False),
('state', '=', 'draft')], context=context)
statement_line_obj.write(
cr, uid, statement_line_ids,
{'partner_bank_id': partner_bank_id,
'partner_id': partner_id}, context=context)
return {'type': 'ir.actions.act_window_close'}
def create_act_window(self, cr, uid, ids, nodestroy=True, context=None):
"""
Return a popup window for this model
"""
if isinstance(ids, (int, long)):
ids = [ids]
return {
'name': self._description,
'view_type': 'form',
'view_mode': 'form',
'res_model': self._name,
'domain': [],
'context': context,
'type': 'ir.actions.act_window',
'target': 'new',
'res_id': ids[0],
'nodestroy': nodestroy,
}

View File

@@ -0,0 +1,61 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<record model="ir.ui.view" id="link_partner_view">
<field name="name">Link partner wizard view</field>
<field name="type">form</field>
<field name="model">banking.link_partner</field>
<field name="arch" type="xml">
<form string="Link partner" version="7.0" >
<group colspan="4" col="6" string="Transaction data">
<field name="ref" />
<field name="amount" />
<field name="remote_account" />
<field name="message" colspan="6"/>
</group>
<group colspan="4" col="4" string="Create or link partner">
<field name="name"
attrs="{'readonly': [('partner_id', '!=', False)]}" />
<field name="partner_id"/>
</group>
<group colspan="2">
<field name="is_company" />
</group>
<group colspan="4"
string="Address"
attrs="{'invisible': [('partner_id', '!=', False)]}"
col="4">
<group colspan="2" col="2">
<field name="street"/>
<field name="street2"/>
<field name="zip"/>
<field name="city"/>
<field name="country_id"/>
<field name="state_id"/>
</group>
<group colspan="2" col="2">
<field name="phone"/>
<field name="fax"/>
<field name="mobile"/>
<field name="email" widget="email"/>
</group>
</group>
<footer>
<button string="Create partner"
name="link_partner" type="object"
class="oe_highlight"
attrs="{'invisible': [('partner_id', '!=', False)]}"
/>
<button string="Link existing partner"
class="oe_highlight"
name="link_partner" type="object"
attrs="{'invisible': [('partner_id', '==', False)]}"
/>
or
<button class="oe_link" string="Cancel" special="cancel" />
</footer>
</form>
</field>
</record>
</data>
</openerp>

View File

@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<!--
Transition to reopening the invoice, triggered by
cancelling a bank transaction with which the invoice
was paid.
the existing workflow contains a similar step
but without the test on being reconciled
-->
<record id="paid_to_open" model="workflow.transition">
<field name="act_from" ref="account.act_paid"/>
<field name="act_to" ref="account.act_open_test"/>
<field name="condition">test_undo_paid()</field>
<field name="signal">undo_paid</field>
</record>
</data>
</openerp>