Merge lp:~therp-nl/banking-addons/6.0-interactive-matching-and-debit-orders into lp:banking-addons/6.0

Proposed by Stefan Rijnhart (Opener)
Status: Rejected
Rejected by: Stefan Rijnhart (Opener)
Proposed branch: lp:~therp-nl/banking-addons/6.0-interactive-matching-and-debit-orders
Merge into: lp:banking-addons/6.0
Diff against target: 8467 lines (+6473/-1265) (has conflicts)
52 files modified
account_banking/__init__.py (+1/-0)
account_banking/__openerp__.py (+11/-4)
account_banking/account_banking.py (+127/-13)
account_banking/account_banking_view.xml (+126/-4)
account_banking/account_banking_workflow.xml (+1/-2)
account_banking/banking_import_transaction.py (+1868/-0)
account_banking/i18n/nl.po (+1773/-0)
account_banking/i18n/nl_NL.po (+0/-905)
account_banking/migrations/0.1.81/post-set-statement-line-state.py (+33/-0)
account_banking/parsers/models.py (+24/-2)
account_banking/security/ir.model.access.csv (+2/-0)
account_banking/wizard/__init__.py (+1/-0)
account_banking/wizard/account_payment_order.py (+7/-1)
account_banking/wizard/bank_import.py (+96/-290)
account_banking/wizard/bank_import_view.xml (+41/-14)
account_banking/wizard/banking_transaction_wizard.py (+337/-0)
account_banking/wizard/banking_transaction_wizard.xml (+133/-0)
account_banking/wizard/banktools.py (+4/-5)
account_banking/workflow/account_invoice.xml (+18/-0)
account_banking_fi_patu/patu.py (+1/-1)
account_banking_nl_abnamro/abnamro.py (+9/-8)
account_banking_nl_clieop/__terp__.py (+1/-1)
account_banking_nl_clieop/data/banking_export_clieop.xml (+3/-0)
account_banking_nl_clieop/migrations/0.64/post-set-payment-order-type.py (+33/-0)
account_banking_nl_clieop/wizard/export_clieop.py (+4/-2)
account_banking_nl_girotel/girotel.py (+1/-1)
account_banking_nl_ing/__init__.py (+4/-0)
account_banking_nl_ing/__openerp__.py (+62/-0)
account_banking_nl_ing/__terp__.py (+58/-0)
account_banking_nl_ing/i18n/nl.po (+37/-0)
account_banking_nl_ing/ing.py (+230/-0)
account_banking_nl_multibank/multibank.py (+1/-1)
account_banking_nl_triodos/__openerp__.py (+1/-1)
account_banking_nl_triodos/triodos.py (+12/-10)
account_direct_debit/__init__.py (+1/-0)
account_direct_debit/__openerp__.py (+62/-0)
account_direct_debit/data/account_payment_term.xml (+16/-0)
account_direct_debit/i18n/nl.po (+210/-0)
account_direct_debit/model/__init__.py (+3/-0)
account_direct_debit/model/account_invoice.py (+143/-0)
account_direct_debit/model/account_move_line.py (+155/-0)
account_direct_debit/model/account_payment.py (+478/-0)
account_direct_debit/view/account_invoice.xml (+46/-0)
account_direct_debit/view/account_payment.xml (+84/-0)
account_direct_debit/workflow/account_invoice.xml (+27/-0)
account_direct_debit/workflow/account_payment.xml (+25/-0)
account_iban_preserve_domestic/__init__.py (+1/-0)
account_iban_preserve_domestic/__openerp__.py (+57/-0)
account_iban_preserve_domestic/res_partner_bank.py (+29/-0)
account_payment_shortcut/__init__.py (+1/-0)
account_payment_shortcut/__openerp__.py (+44/-0)
account_payment_shortcut/payment_order.py (+31/-0)
Text conflict in account_banking/wizard/bank_import.py
To merge this branch: bzr merge lp:~therp-nl/banking-addons/6.0-interactive-matching-and-debit-orders
Reviewer Review Type Date Requested Status
Banking Addons Core Editors Pending
Review via email: mp+88832@code.launchpad.net

Description of the change

Hi,

this merge request is for review and commenting. I suggest not to merge the branch with 6.0, but to use it as a starting point for the 6.1 branch of banking-addons.

Cheers,
Stefan.

To post a comment you must log in.
104. By Stefan Rijnhart (Opener)

[FIX] bug: attempt at manual match is ignored
[RFR] rearrange match wizard layout using tabs

105. By Stefan Rijnhart (Opener)

[ADD] Comment about the specific CSV format that can be downloaded from ING

106. By Stefan Rijnhart (Opener)

[FIX] splitting of transactions was not actually disabled yet

107. By Credativ (Dmitrijs Ledkovs, James Jesudason, Tristan Hill)

[ADD] UK HSBC module
[FIX] Period_id on vouchers
[FIX] Recompute statement end balance at the end of the import
[FIX] disable call to SWIFT lookup page that no longer exists
[FIX] Allow manual statement entry

108. By Stefan Rijnhart (Opener)

[FIX] Reconciling raises error when partial reconciliation is present
[FIX] Wrong sign in residual write-off in some cases

109. By Stefan Rijnhart (Opener)

[ADD] Module that allows preservation of the domestic account number
 for IBAN accounts in preparation of the upgrade to OpenERP 6.1

110. By Stefan Rijnhart (Opener)

[FIX] Partial unreconcile exception and logical error

111. By Stefan Rijnhart (Opener)

[FIX] Typo preventing wizard to show up in the gtk client

112. By Stefan Rijnhart (Opener)

[FIX] Typo prevents match wizard to start in GTK-client

Unmerged revisions

113. By Stefan Rijnhart (Opener)

[IMP] Support migration of V5.0 payment types and statement lines

112. By Stefan Rijnhart (Opener)

[FIX] Typo prevents match wizard to start in GTK-client

111. By Stefan Rijnhart (Opener)

[FIX] Typo preventing wizard to show up in the gtk client

110. By Stefan Rijnhart (Opener)

[FIX] Partial unreconcile exception and logical error

109. By Stefan Rijnhart (Opener)

[ADD] Module that allows preservation of the domestic account number
 for IBAN accounts in preparation of the upgrade to OpenERP 6.1

108. By Stefan Rijnhart (Opener)

[FIX] Reconciling raises error when partial reconciliation is present
[FIX] Wrong sign in residual write-off in some cases

107. By Credativ (Dmitrijs Ledkovs, James Jesudason, Tristan Hill)

[ADD] UK HSBC module
[FIX] Period_id on vouchers
[FIX] Recompute statement end balance at the end of the import
[FIX] disable call to SWIFT lookup page that no longer exists
[FIX] Allow manual statement entry

106. By Stefan Rijnhart (Opener)

[FIX] splitting of transactions was not actually disabled yet

105. By Stefan Rijnhart (Opener)

[ADD] Comment about the specific CSV format that can be downloaded from ING

104. By Stefan Rijnhart (Opener)

[FIX] bug: attempt at manual match is ignored
[RFR] rearrange match wizard layout using tabs

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'account_banking/__init__.py'
2--- account_banking/__init__.py 2012-02-29 11:09:43 +0000
3+++ account_banking/__init__.py 2012-04-17 10:52:20 +0000
4@@ -27,6 +27,7 @@
5 import browse_record
6 import sepa
7 import record
8+import banking_import_transaction
9 import account_banking
10 import parsers
11 import wizard
12
13=== renamed file 'account_banking/__terp__.py' => 'account_banking/__openerp__.py'
14--- account_banking/__terp__.py 2011-07-21 11:30:59 +0000
15+++ account_banking/__openerp__.py 2012-04-17 10:52:20 +0000
16@@ -1,6 +1,11 @@
17 ##############################################################################
18 #
19 # Copyright (C) 2009 EduSense BV (<http://www.edusense.nl>).
20+# (C) 2011 Therp BV (<http://therp.nl>).
21+# (C) 2011 Smile (<http://smile.fr>).
22+#
23+# All other contributions are (C) by their respective contributors
24+#
25 # All Rights Reserved
26 #
27 # WARNING: This program as such is intended to be used by professional
28@@ -25,11 +30,11 @@
29 ##############################################################################
30 {
31 'name': 'Account Banking',
32- 'version': '0.1.62',
33+ 'version': '0.1.106',
34 'license': 'GPL-3',
35- 'author': 'EduSense BV',
36- 'website': 'http://www.edusense.nl',
37- 'category': 'Account Banking',
38+ 'author': 'Banking addons community',
39+ 'website': 'https://launchpad.net/banking-addons',
40+ 'category': 'Banking addons',
41 'depends': ['base', 'account', 'base_iban', 'account_payment'],
42 'init_xml': [],
43 'update_xml': [
44@@ -38,6 +43,8 @@
45 'wizard/bank_import_view.xml',
46 'account_banking_view.xml',
47 'account_banking_workflow.xml',
48+ 'wizard/banking_transaction_wizard.xml',
49+ 'workflow/account_invoice.xml',
50 ],
51 'demo_xml': [],
52 'description': '''
53
54=== modified file 'account_banking/account_banking.py'
55--- account_banking/account_banking.py 2012-02-10 13:33:01 +0000
56+++ account_banking/account_banking.py 2012-04-17 10:52:20 +0000
57@@ -170,6 +170,7 @@
58 'state': fields.selection(
59 [('unfinished', 'Unfinished'),
60 ('error', 'Error'),
61+ ('review', 'Review'),
62 ('ready', 'Finished'),
63 ], 'State', select=True, readonly=True
64 ),
65@@ -209,8 +210,16 @@
66 'Leave empty for manual processing'),
67 domain=[('osv_memory', '=', True)],
68 ),
69+ 'payment_order_type': fields.selection(
70+ [('payment', 'Payment'),('debit', 'Direct debit')],
71+ 'Payment order type', required=True,
72+ ),
73 }
74
75+ _defaults = {
76+ 'payment_order_type': lambda *a: 'payment',
77+ }
78+
79 payment_mode_type()
80
81 class payment_mode(osv.osv):
82@@ -445,7 +454,9 @@
83 """
84 if st_line.reconcile_id:
85 account_move_line_obj.write(cr, uid, [torec], {
86- 'reconcile_id': st_line.reconcile_id.id }, context=context)
87+ (st_line.reconcile_id.line_partial_ids and
88+ 'reconcile_partial_id' or 'reconcile_id'):
89+ st_line.reconcile_id.id }, context=context)
90 for move_line in (st_line.reconcile_id.line_id or []) + (
91 st_line.reconcile_id.line_partial_ids or []):
92 netsvc.LocalService("workflow").trg_trigger(
93@@ -565,10 +576,13 @@
94 res = {}
95 for st_line in self.browse(cr, uid, ids, context):
96 res[st_line.id] = False
97- for move_line in (st_line.reconcile_id and
98- (st_line.reconcile_id.line_id or []) +
99- (st_line.reconcile_id.line_partial_ids or []) or
100- []):
101+ for move_line in (
102+ st_line.reconcile_id and
103+ (st_line.reconcile_id.line_id or
104+ st_line.reconcile_id.line_partial_ids) or
105+ st_line.import_transaction_id and
106+ st_line.import_transaction_id.move_line_id and
107+ [st_line.import_transaction_id.move_line_id] or []):
108 if move_line.invoice:
109 res[st_line.id] = move_line.invoice.id
110 continue
111@@ -598,14 +612,14 @@
112 states={'draft':[('readonly', False)]},
113 ),
114 'period_id': fields.many2one('account.period', 'Period', required=True,
115- states={'confirm': [('readonly', True)]}),
116+ states={'confirmed': [('readonly', True)]}),
117 'currency': fields.many2one('res.currency', 'Currency', required=True,
118- states={'confirm': [('readonly', True)]}),
119+ states={'confirmed': [('readonly', True)]}),
120
121 # Not used yet, but usefull in the future.
122 'international': fields.boolean('International Transaction',
123 required=False,
124- states={'confirm': [('readonly', True)]},
125+ states={'confirmed': [('readonly', True)]},
126 ),
127 'reconcile_id': fields.many2one(
128 'account.move.reconcile', 'Reconciliation', readonly=True
129@@ -775,6 +789,45 @@
130
131 return res
132
133+ """
134+ Hooks for processing direct debit orders, such as implemented in
135+ account_direct_debit module.
136+ """
137+ def get_storno_account_id(self, cr, uid, payment_line_id, amount,
138+ currency_id, context=None):
139+ """
140+ Hook for verifying a match of the payment line with the amount.
141+ Return the account associated with the storno.
142+ Used in account_banking interactive mode
143+ :param payment_line_id: the single payment line id
144+ :param amount: the (signed) amount debited from the bank account
145+ :param currency: the bank account's currency *browse object*
146+ :return: an account if there is a full match, False otherwise
147+ :rtype: database id of an account.account resource.
148+ """
149+
150+ return False
151+
152+ def debit_storno(self, cr, uid, payment_line_id, amount,
153+ currency_id, storno_retry=True, context=None):
154+ """
155+ Hook for handling a canceled item of a direct debit order.
156+ Presumably called from a bank statement import routine.
157+
158+ Decide on the direction that the invoice's workflow needs to take.
159+ You may optionally return an incomplete reconcile for the caller
160+ to reconcile the now void payment.
161+
162+ :param payment_line_id: the single payment line id
163+ :param amount: the (negative) amount debited from the bank account
164+ :param currency: the bank account's currency *browse object*
165+ :param boolean storno_retry: whether the storno is considered fatal \
166+ or not.
167+ :return: an incomplete reconcile for the caller to fill
168+ :rtype: database id of an account.move.reconcile resource.
169+ """
170+
171+ return False
172
173 payment_line()
174
175@@ -809,7 +862,7 @@
176 'rejected': [('readonly', True)],
177 'done': [('readonly', True)]
178 },
179- help='Select the Payment Mode to be applied.'
180+ help='Select the Payment Mode to be applied.',
181 ),
182 'state': fields.selection([
183 ('draft', 'Draft'),
184@@ -852,8 +905,17 @@
185 "execution."
186 )
187 ),
188+ 'payment_order_type': fields.selection(
189+ [('payment', 'Payment'),('debit', 'Direct debit')],
190+ 'Payment order type', required=True,
191+ ),
192+ 'date_sent': fields.date('Send date', readonly=True),
193 }
194
195+ _defaults = {
196+ 'payment_order_type': lambda *a: 'payment',
197+ }
198+
199 def launch_wizard(self, cr, uid, ids, context=None):
200 """
201 Search for a wizard to launch according to the type.
202@@ -892,7 +954,9 @@
203 _('You can only combine payment orders of the same type')
204 )
205 # process manual payments
206- self.action_sent(cr, uid, ids, context)
207+ wf_service = netsvc.LocalService('workflow')
208+ for order_id in ids:
209+ wf_service.trg_validate(uid, 'payment.order', order_id, 'sent', cr)
210 return result
211
212 def _write_payment_lines(self, cursor, uid, ids, **kwargs):
213@@ -925,9 +989,8 @@
214 Set both self and payment lines to state 'sent'.
215 '''
216 self._write_payment_lines(cursor, uid, ids, export_state='sent')
217- wf_service = netsvc.LocalService('workflow')
218- for id in ids:
219- wf_service.trg_validate(uid, 'payment.order', id, 'sent', cursor)
220+ self.write(cursor, uid, ids, {'state':'sent',
221+ 'date_sent': time.strftime('%Y-%m-%d')})
222 return True
223
224 def action_rejected(self, cursor, uid, ids, *args):
225@@ -963,6 +1026,30 @@
226 return 'account_banking', 'wizard_account_banking_payment_manual'
227 return super(payment_order, self).get_wizard(type)
228
229+ """
230+ Hooks for processing direct debit orders, such as implemented in
231+ account_direct_debit module.
232+ """
233+ def debit_reconcile_transfer(
234+ self, cr, uid, payment_order_id, amount, currency, context=None):
235+ """
236+ Reconcile the payment order if the amount is correct. Return the
237+ id of the reconciliation.
238+ """
239+ raise osv.except_osv(
240+ _("Cannot reconcile"),
241+ _("Cannot reconcile debit order: "+
242+ "Not implemented."))
243+
244+ def debit_unreconcile_transfer(
245+ self, cr, uid, payment_order_id, reconcile_id, amount, currency,
246+ context=None):
247+ """ Unreconcile the payment_order if at all possible """
248+ raise osv.except_osv(
249+ _("Cannot unreconcile"),
250+ _("Cannot unreconcile debit order: "+
251+ "Not implemented."))
252+
253 payment_order()
254
255 class res_partner_bank(osv.osv):
256@@ -1363,6 +1450,16 @@
257 '''
258 _inherit = 'account.invoice'
259
260+ def test_undo_paid(self, cr, uid, ids, context=None):
261+ """
262+ Called from the workflow. Used to unset paid state on
263+ invoices that were paid with bank transfers which are being cancelled
264+ """
265+ for invoice in self.read(cr, uid, ids, ['reconciled'], context):
266+ if invoice['reconciled']:
267+ return False
268+ return True
269+
270 def _get_reference_type(self, cr, uid, context=None):
271 '''
272 Return the list of reference types
273@@ -1379,4 +1476,21 @@
274
275 invoice()
276
277+class account_move_line(osv.osv):
278+ _inherit = "account.move.line"
279+
280+ def get_balance(self, cr, uid, ids, context=None):
281+ """
282+ Return the balance of any set of move lines.
283+ Surely this exists somewhere in account base, but I missed it.
284+ """
285+ total = 0.0
286+ if not ids:
287+ total
288+ for line in self.read(
289+ cr, uid, ids, ['debit', 'credit'], context=context):
290+ total += (line['debit'] or 0.0) - (line['credit'] or 0.0)
291+ return total
292+account_move_line()
293+
294 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
295
296=== modified file 'account_banking/account_banking_view.xml'
297--- account_banking/account_banking_view.xml 2012-02-10 14:05:09 +0000
298+++ account_banking/account_banking_view.xml 2012-04-17 10:52:20 +0000
299@@ -176,10 +176,14 @@
300 <field name="name">account.bank.statement.form.banking-1</field>
301 <field name="inherit_id" ref="account.view_bank_statement_form" />
302 <field name="model">account.bank.statement</field>
303+ <field name="sequence" eval="60"/>
304 <field name="type">form</field>
305 <field name="arch" type="xml">
306 <data>
307 <field name="period_id" position="replace"/>
308+ <xpath expr="/form/notebook/page[@string='Transaction']/field/tree" position="attributes">
309+ <attribute name="colors">black:state == 'confirmed';darkmagenta:match_multi == True;grey:state=='draft';crimson:duplicate == True;</attribute>
310+ </xpath>
311 <xpath expr="/form/notebook/page[@string='Transaction']/field/tree/field[@name='name']" position="replace">
312 <field name="name" required="1"/>
313 </xpath>
314@@ -206,9 +210,14 @@
315 <field name="model">account.bank.statement</field>
316 <field name="type">form</field>
317 <field name="arch" type="xml">
318- <xpath expr="/form/notebook/page[@string='Transaction']/field/form/field[@name='ref']" position="after">
319- <field name="period_id"/>
320- </xpath>
321+ <data>
322+ <xpath expr="/form/notebook/page[@string='Transaction']/field/form/field[@name='ref']" position="after">
323+ <field name="period_id"/>
324+ <field name="match_type"/>
325+ <field name="match_multi"/>
326+ <field name="duplicate"/>
327+ </xpath>
328+ </data>
329 </field>
330 </record>
331
332@@ -253,9 +262,27 @@
333 <field name="arch" type="xml">
334 <data>
335 <xpath expr="/form/notebook/page/field[@name='line_ids']/tree/field[@name='partner_id']" position="after">
336+ <!-- TODO set partner_id when partner_bank_id changes -->
337 <field name="partner_bank_id"/>
338 </xpath>
339 <xpath expr="/form/notebook/page/field[@name='line_ids']/tree/field[@name='amount']" position="after">
340+ <field name="match_type"/>
341+ <field name="residual"/>
342+ <button name="match_wizard" states="draft"
343+ string="Match"
344+ icon="terp-gtk-jump-to-ltr"
345+ type="object"/>
346+ <field name="match_multi" invisible="1"/>
347+ <field name="duplicate" invisible="1"/>
348+ <field name="state"/>
349+ <button name="confirm" states="draft"
350+ string="Confirm transaction"
351+ icon="gtk-ok"
352+ type="object"/>
353+ <button name="cancel" states="confirmed"
354+ string="Cancel transaction"
355+ icon="gtk-cancel"
356+ type="object"/>
357 <field name="invoice_id"/>
358 <field name="reconcile_id"/>
359 </xpath>
360@@ -423,9 +450,104 @@
361 <field name="name" />
362 <field name="code" />
363 <field name="suitable_bank_types"/>
364+ <field name="payment_order_type"/>
365 <field name="ir_model_id"/>
366 </form>
367 </field>
368 </record>
369- </data>
370+
371+ <!-- fixes https://bugs.launchpad.net/openobject-addons/+bug/903156 for 6.0
372+ Note that 6.1 does not suffer from the problem
373+ -->
374+ <record id="account_payment.action_create_payment_order" model="ir.actions.act_window">
375+ <field name="view_id" ref="account_payment.view_create_payment_order"/>
376+ </record>
377+
378+
379+ <record model="ir.ui.view" id="view_bank_statement_line_tree">
380+ <field name="name">Bank statement line tree view</field>
381+ <field name="model">account.bank.statement.line</field>
382+ <field name="type">tree</field>
383+ <field name="arch" type="xml">
384+ <tree string="Statement lines" colors="black:state == 'confirmed';darkmagenta:match_multi == True;crimson:duplicate == True;grey:state=='draft';">
385+ <field name="sequence" readonly="1" invisible="1"/>
386+ <field name="date" groups="base.group_extended"/>
387+ <field name="name"/>
388+ <field name="ref"/>
389+ <field name="partner_id" on_change="onchange_partner_id(partner_id)"/>
390+ <!-- TODO set partner_id when partner_bank_id changes -->
391+ <field name="partner_bank_id"/>
392+ <field name="type" on_change="onchange_type(partner_id, type)"/>
393+ <!-- TODO note the references to parent from the statement form view -->
394+ <field domain="[('journal_id','=',parent.journal_id)]" name="account_id"/>
395+ <field name="analytic_account_id" groups="analytic.group_analytic_accounting" domain="[('company_id', '=', parent.company_id), ('type', '&lt;&gt;', 'view')]"/>
396+ <field name="amount"/>
397+ <field name="match_type"/>
398+ <field name="residual"/>
399+ <button name="match_wizard" states="draft"
400+ string="Match"
401+ icon="terp-gtk-jump-to-ltr"
402+ type="object"/>
403+ <field name="match_multi" invisible="1"/>
404+ <field name="duplicate" invisible="1"/>
405+ <field name="state"/>
406+ <button name="confirm" states="draft"
407+ string="Confirm transaction"
408+ icon="gtk-ok"
409+ type="object"/>
410+ <button name="cancel" states="confirmed"
411+ string="Cancel transaction"
412+ icon="gtk-cancel"
413+ type="object"/>
414+ <field name="invoice_id"/>
415+ <field name="reconcile_id"/>
416+ </tree>
417+ </field>
418+ </record>
419+
420+ <!-- search view for bank statement lines -->
421+ <record id="view_account_bank_statement_line_search" model="ir.ui.view">
422+ <field name="name">account.bank.statement.line.search</field>
423+ <field name="model">account.bank.statement.line</field>
424+ <field name="type">search</field>
425+ <field name="arch" type="xml">
426+ <search string="Search Bank Transactions ">
427+ <group>
428+ <filter string="Draft" domain="[('state','=','draft')]" icon="terp-camera_test"/>
429+ <filter string="Confirmed" domain="[('state','=','confirmed')]" icon="terp-dialog-close"/>
430+ <separator orientation="vertical"/>
431+ <field name="ref"/>
432+ <field name="type"/>
433+ <field name="period_id"/>
434+ </group>
435+ <newline/>
436+ <group>
437+ <field name="date"/>
438+ <field name="partner_id"/>
439+ <field name="partner_bank_id"/>
440+ <field name="account_id"/>
441+ </group>
442+ <newline/>
443+ <group expand="0" string="Group By...">
444+ <filter string="State" context="{'group_by': 'state'}" icon="terp-stock_effects-object-colorize"/>
445+ </group>
446+ </search>
447+ </field>
448+ </record>
449+
450+
451+ <!-- Add a shortcut menu for bank accounts -->
452+ <record model="ir.actions.act_window" id="action_bank_statement_line_tree">
453+ <field name="name">Bank Transactions</field>
454+ <field name="type">ir.actions.act_window</field>
455+ <field name="res_model">account.bank.statement.line</field>
456+ <field name="view_type">form</field>
457+ <field name="view_mode">tree,form</field>
458+ <field name="search_view_id" ref="view_account_bank_statement_line_search"/>
459+ </record>
460+ <menuitem string="Bank Transactions"
461+ action="action_bank_statement_line_tree"
462+ id="menu_bank_statement_line_tree"
463+ parent="account.menu_finance_bank_and_cash" sequence="8"/>
464+ </data>
465 </openerp>
466
467=== modified file 'account_banking/account_banking_workflow.xml'
468--- account_banking/account_banking_workflow.xml 2010-06-29 14:58:52 +0000
469+++ account_banking/account_banking_workflow.xml 2012-04-17 10:52:20 +0000
470@@ -10,8 +10,7 @@
471 <record id="act_sent" model="workflow.activity">
472 <field name="name">sent</field>
473 <field name="wkf_id" ref="account_payment.wkf_payment_order"/>
474- <field name="action">action_sent()
475-write({'state':'sent'})</field>
476+ <field name="action">action_sent()</field>
477 <field name="kind">function</field>
478 </record>
479 <!-- New activity for workflow payment order: rejected -->
480
481=== added file 'account_banking/banking_import_transaction.py'
482--- account_banking/banking_import_transaction.py 1970-01-01 00:00:00 +0000
483+++ account_banking/banking_import_transaction.py 2012-04-17 10:52:20 +0000
484@@ -0,0 +1,1868 @@
485+# -*- encoding: utf-8 -*-
486+##############################################################################
487+#
488+# Copyright (C) 2009 EduSense BV (<http://www.edusense.nl>).
489+# Contributions by Kaspars Vilkens (KNdati):
490+# lenghty discussions, bugreports and bugfixes
491+# Refractoring (C) 2011 Therp BV (<http://therp.nl>).
492+# (C) 2011 Smile (<http://smile.fr>).
493+#
494+# All Rights Reserved
495+#
496+# This program is free software: you can redistribute it and/or modify
497+# it under the terms of the GNU General Public License as published by
498+# the Free Software Foundation, either version 3 of the License, or
499+# (at your option) any later version.
500+#
501+# This program is distributed in the hope that it will be useful,
502+# but WITHOUT ANY WARRANTY; without even the implied warranty of
503+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
504+# GNU General Public License for more details.
505+#
506+# You should have received a copy of the GNU General Public License
507+# along with this program. If not, see <http://www.gnu.org/licenses/>.
508+#
509+##############################################################################
510+
511+from osv import osv, fields
512+import time
513+import netsvc
514+import base64
515+import datetime
516+from tools import config
517+from tools.translate import _
518+from parsers import models
519+from parsers.convert import *
520+# from account_banking.struct import struct
521+from account_banking import sepa
522+from wizard.banktools import *
523+import decimal_precision as dp
524+
525+bt = models.mem_bank_transaction
526+
527+class banking_import_transaction(osv.osv):
528+ """ orm representation of mem_bank_transaction() for interactive and posthoc
529+ configuration of reconciliation in the bank statement view.
530+
531+ Possible refractoring in OpenERP 6.1:
532+ merge with bank_statement_line, using sparse fields
533+
534+ """
535+ _name = 'banking.import.transaction'
536+ _description = 'Bank import transaction'
537+ _rec_name = 'transaction'
538+
539+ # This variable is used to match supplier invoices with an invoice date after
540+ # the real payment date. This can occur with online transactions (web shops).
541+ # TODO: Convert this to a proper configuration variable
542+ payment_window = datetime.timedelta(days=10)
543+
544+ def _match_costs(self, cr, uid, trans, period_id, account_info, log):
545+ '''
546+ Get or create a costs invoice for the bank and return it with
547+ the payment as seen in the transaction (when not already done).
548+ '''
549+ if not account_info.costs_account_id:
550+ return []
551+
552+ digits = dp.get_precision('Account')(cr)[1]
553+ amount = round(abs(trans.transferred_amount), digits)
554+ # Make sure to be able to pinpoint our costs invoice for later
555+ # matching
556+ reference = '%s.%s: %s' % (trans.statement, trans.transaction, trans.reference)
557+
558+ # search supplier invoice
559+ invoice_obj = self.pool.get('account.invoice')
560+ invoice_ids = invoice_obj.search(cr, uid, [
561+ '&',
562+ ('type', '=', 'in_invoice'),
563+ ('partner_id', '=', account_info.bank_partner_id.id),
564+ ('company_id', '=', account_info.company_id.id),
565+ ('date_invoice', '=', trans.effective_date),
566+ ('reference', '=', reference),
567+ ('amount_total', '=', amount),
568+ ]
569+ )
570+ if invoice_ids and len(invoice_ids) == 1:
571+ invoice = invoice_obj.browse(cr, uid, invoice_ids)[0]
572+ elif not invoice_ids:
573+ # create supplier invoice
574+ partner_obj = self.pool.get('res.partner')
575+ invoice_lines = [(0,0,dict(
576+ amount = 1,
577+ price_unit = amount,
578+ name = trans.message or trans.reference,
579+ account_id = account_info.costs_account_id.id
580+ ))]
581+ invoice_address_id = partner_obj.address_get(
582+ cr, uid, [account_info.bank_partner_id.id], ['invoice']
583+ )
584+ invoice_id = invoice_obj.create(cr, uid, dict(
585+ type = 'in_invoice',
586+ company_id = account_info.company_id.id,
587+ partner_id = account_info.bank_partner_id.id,
588+ address_invoice_id = invoice_address_id['invoice'],
589+ period_id = period_id,
590+ journal_id = account_info.invoice_journal_id.id,
591+ account_id = account_info.bank_partner_id.property_account_payable.id,
592+ date_invoice = trans.effective_date,
593+ reference_type = 'none',
594+ reference = reference,
595+ name = trans.reference or trans.message,
596+ check_total = amount,
597+ invoice_line = invoice_lines,
598+ ))
599+ invoice = invoice_obj.browse(cr, uid, invoice_id)
600+ # Create workflow
601+ invoice_obj.button_compute(cr, uid, [invoice_id],
602+ {'type': 'in_invoice'}, set_total=True)
603+ wf_service = netsvc.LocalService('workflow')
604+ # Move to state 'open'
605+ wf_service.trg_validate(uid, 'account.invoice', invoice.id,
606+ 'invoice_open', cr)
607+
608+ # return move_lines to mix with the rest
609+ return [x for x in invoice.move_id.line_id if x.account_id.reconcile]
610+
611+ def _match_debit_order(
612+ self, cr, uid, trans, log, context=None):
613+
614+ def is_zero(total):
615+ return self.pool.get('res.currency').is_zero(
616+ cr, uid, trans.statement_id.currency, total)
617+
618+ payment_order_obj = self.pool.get('payment.order')
619+ order_ids = payment_order_obj.search(
620+ cr, uid, [('payment_order_type', '=', 'debit'),
621+ ('state', '=', 'sent'),
622+ ('date_sent', '<=', str2date(trans.execution_date,
623+ '%Y-%m-%d'))
624+ ],
625+ limit=0, context=context)
626+ orders = payment_order_obj.browse(cr, uid, order_ids, context)
627+ candidates = [x for x in orders if
628+ is_zero(x.total - trans.transferred_amount)]
629+ if len(candidates) > 0:
630+ # retrieve the common account_id, if any
631+ account_id = False
632+ for line in candidates[0].line_ids[0].debit_move_line_id.move_id.line_id:
633+ if line.account_id.type == 'other':
634+ account_id = line.account_id.id
635+ break
636+ return dict(
637+ move_line_ids = False,
638+ match_type = 'payment_order',
639+ payment_order_ids = [x.id for x in candidates],
640+ account_id = account_id,
641+ partner_id = False,
642+ partner_bank_id = False,
643+ reference = False,
644+ type='general',
645+ )
646+ return False
647+
648+ def _match_invoice(self, cr, uid, trans, move_lines,
649+ partner_ids, bank_account_ids,
650+ log, linked_invoices,
651+ context=None):
652+ '''
653+ Find the invoice belonging to this reference - if there is one
654+ Use the sales journal to check.
655+
656+ Challenges we're facing:
657+ 1. The sending or receiving party is not necessarily the same as the
658+ partner the payment relates to.
659+ 2. References can be messed up during manual encoding and inexact
660+ matching can link the wrong invoices.
661+ 3. Amounts can or can not match the expected amount.
662+ 4. Multiple invoices can be paid in one transaction.
663+ .. There are countless more, but these we'll try to address.
664+
665+ Assumptions for matching:
666+ 1. There are no payments for invoices not sent. These are dealt with
667+ later on.
668+ 2. Debit amounts are either customer invoices or credited supplier
669+ invoices.
670+ 3. Credit amounts are either supplier invoices or credited customer
671+ invoices.
672+ 4. Payments are either below expected amount or only slightly above
673+ (abs).
674+ 5. Payments from partners that are matched, pay their own invoices.
675+
676+ Worst case scenario:
677+ 1. No match was made.
678+ No harm done. Proceed with manual matching as usual.
679+ 2. The wrong match was made.
680+ Statements are encoded in draft. You will have the opportunity to
681+ manually correct the wrong assumptions.
682+
683+ TODO: REVISE THIS DOC
684+ #Return values:
685+ # old_trans: this function can modify and rebrowse the modified
686+ # transaction.
687+ # move_info: the move_line information belonging to the matched
688+ # invoice
689+ # new_trans: the new transaction when the current one was split.
690+ # This can happen when multiple invoices were paid with a single
691+ # bank transaction.
692+ '''
693+
694+ def eyecatcher(invoice):
695+ '''
696+ Return the eyecatcher for an invoice
697+ '''
698+ return invoice.type.startswith('in_') and invoice.name or \
699+ invoice.number
700+
701+ def has_id_match(invoice, ref, msg):
702+ '''
703+ Aid for debugging - way more comprehensible than complex
704+ comprehension filters ;-)
705+
706+ Match on ID of invoice (reference, name or number, whatever
707+ available and sensible)
708+ '''
709+ if invoice.reference:
710+ # Reference always comes first, as it is manually set for a
711+ # reason.
712+ iref = invoice.reference.upper()
713+ if iref in ref or iref in msg:
714+ return True
715+ if invoice.type.startswith('in_'):
716+ # Internal numbering, no likely match on number
717+ if invoice.name:
718+ iname = invoice.name.upper()
719+ if iname in ref or iname in msg:
720+ return True
721+ elif invoice.type.startswith('out_'):
722+ # External id's possible and likely
723+ inum = invoice.number.upper()
724+ if inum in ref or inum in msg:
725+ return True
726+
727+ return False
728+
729+ def _cached(move_line):
730+ # Disabled, we allow for multiple matches in
731+ # the interactive wizard
732+ return False
733+
734+ '''Check if the move_line has been cached'''
735+ return move_line.id in linked_invoices
736+
737+ def _cache(move_line, remaining=0.0):
738+ '''Cache the move_line'''
739+ linked_invoices[move_line.id] = remaining
740+
741+ def _remaining(move_line):
742+ '''Return the remaining amount for a previously matched move_line
743+ '''
744+ return linked_invoices[move_line.id]
745+
746+ def _sign(invoice):
747+ '''Return the direction of an invoice'''
748+ return {'in_invoice': -1,
749+ 'in_refund': 1,
750+ 'out_invoice': 1,
751+ 'out_refund': -1
752+ }[invoice.type]
753+
754+ def is_zero(move_line, total):
755+ return self.pool.get('res.currency').is_zero(
756+ cr, uid, trans.statement_id.currency, total)
757+
758+ digits = dp.get_precision('Account')(cr)[1]
759+ partial = False
760+
761+ # Disabled splitting transactions for now
762+ # TODO allow splitting in the interactive wizard
763+ allow_splitting = False
764+
765+ # Search invoice on partner
766+ if partner_ids:
767+ candidates = [
768+ x for x in move_lines
769+ if x.partner_id.id in partner_ids and
770+ (str2date(x.date, '%Y-%m-%d') <=
771+ (str2date(trans.execution_date, '%Y-%m-%d') +
772+ self.payment_window))
773+ and (not _cached(x) or _remaining(x))
774+ ]
775+ else:
776+ candidates = []
777+
778+ # Next on reference/invoice number. Mind that this uses the invoice
779+ # itself, as the move_line references have been fiddled with on invoice
780+ # creation. This also enables us to search for the invoice number in the
781+ # reference instead of the other way around, as most human interventions
782+ # *add* text.
783+ if len(candidates) > 1 or not candidates:
784+ ref = trans.reference.upper()
785+ msg = trans.message.upper()
786+ # The manual usage of the sales journal creates moves that
787+ # are not tied to invoices. Thanks to Stefan Rijnhart for
788+ # reporting this.
789+ candidates = [
790+ x for x in candidates or move_lines
791+ if (x.invoice and has_id_match(x.invoice, ref, msg) and
792+ str2date(x.invoice.date_invoice, '%Y-%m-%d') <=
793+ (str2date(trans.execution_date, '%Y-%m-%d') +
794+ self.payment_window)
795+ and (not _cached(x) or _remaining(x)))
796+ ]
797+
798+ # Match on amount expected. Limit this kind of search to known
799+ # partners.
800+ if not candidates and partner_ids:
801+ candidates = [
802+ x for x in move_lines
803+ if (is_zero(x.move_id, ((x.debit or 0.0) - (x.credit or 0.0)) -
804+ trans.transferred_amount)
805+ and str2date(x.date, '%Y-%m-%d') <=
806+ (str2date(trans.execution_date, '%Y-%m-%d') +
807+ self.payment_window)
808+ and (not _cached(x) or _remaining(x)))
809+ ]
810+
811+ move_line = False
812+
813+ if candidates and len(candidates) > 0:
814+ # Now a possible selection of invoices has been found, check the
815+ # amounts expected and received.
816+ #
817+ # TODO: currency coercing
818+ best = [x for x in candidates
819+ if (is_zero(x.move_id, ((x.debit or 0.0) - (x.credit or 0.0)) -
820+ trans.transferred_amount)
821+ and str2date(x.date, '%Y-%m-%d') <=
822+ (str2date(trans.execution_date, '%Y-%m-%d') +
823+ self.payment_window))
824+ ]
825+ if len(best) == 1:
826+ # Exact match
827+ move_line = best[0]
828+ invoice = move_line.invoice
829+ if _cached(move_line):
830+ partial = True
831+ expected = _remaining(move_line)
832+ else:
833+ _cache(move_line)
834+
835+ elif len(candidates) > 1:
836+ # Before giving up, check cache for catching duplicate
837+ # transfers first
838+ paid = [x for x in move_lines
839+ if x.invoice and has_id_match(x.invoice, ref, msg)
840+ and str2date(x.invoice.date_invoice, '%Y-%m-%d')
841+ <= str2date(trans.execution_date, '%Y-%m-%d')
842+ and (_cached(x) and not _remaining(x))
843+ ]
844+ if paid:
845+ log.append(
846+ _('Unable to link transaction id %(trans)s '
847+ '(ref: %(ref)s) to invoice: '
848+ 'invoice %(invoice)s was already paid') % {
849+ 'trans': '%s.%s' % (trans.statement, trans.transaction),
850+ 'ref': trans.reference,
851+ 'invoice': eyecatcher(paid[0].invoice)
852+ })
853+ else:
854+ # Multiple matches
855+ # TODO select best bank account in this case
856+ return (trans, self._get_move_info(
857+ cr, uid, [x.id for x in candidates]),
858+ False)
859+ move_line = False
860+ partial = False
861+
862+ elif len(candidates) == 1:
863+ # Mismatch in amounts
864+ move_line = candidates[0]
865+ invoice = move_line.invoice
866+ expected = round(_sign(invoice) * invoice.residual, digits)
867+ partial = True
868+
869+ trans2 = None
870+ if move_line and partial:
871+ found = round(trans.transferred_amount, digits)
872+ if abs(expected) == abs(found):
873+ partial = False
874+ # Last partial payment will not flag invoice paid without
875+ # manual assistence
876+ # Stefan: disabled this here for the interactive method
877+ # Handled this with proper handling of partial reconciliation
878+ # and the workflow service
879+ # invoice_obj = self.pool.get('account.invoice')
880+ # invoice_obj.write(cr, uid, [invoice.id], {
881+ # 'state': 'paid'
882+ # })
883+ elif abs(expected) > abs(found):
884+ # Partial payment, reuse invoice
885+ _cache(move_line, expected - found)
886+ elif abs(expected) < abs(found) and allow_splitting:
887+ # Possible combined payments, need to split transaction to
888+ # verify
889+ _cache(move_line)
890+ trans2 = self.copy(
891+ cr, uid, trans.id,
892+ dict(
893+ transferred_amount = trans.transferred_amount - expected,
894+ transaction = trans.transaction + 'b',
895+ parent_id = trans.id,
896+ ), context=context)
897+ # update the current record
898+ self.write(cr, uid, trans.id, dict(
899+ transferred_amount = expected,
900+ transaction = trans.transaction + 'a',
901+ ), context)
902+ # rebrowse the current record after writing
903+ trans = self.browse(cr, uid, trans.id, context=context)
904+ if move_line:
905+ account_ids = [
906+ x.id for x in bank_account_ids
907+ if x.partner_id.id == move_line.partner_id.id
908+ ]
909+
910+ return (trans, self._get_move_info(
911+ cr, uid, [move_line.id],
912+ account_ids and account_ids[0] or False),
913+ trans2)
914+
915+ return trans, False, False
916+
917+ def _do_move_reconcile(
918+ self, cr, uid, move_line_ids, currency, amount, context=None):
919+ """
920+ Prepare a reconciliation for a bank transaction of the given
921+ amount. The caller MUST add the move line associated with the
922+ bank transaction to the returned reconciliation resource.
923+
924+ If adding the amount does not make the total add up,
925+ prepare a partial reconciliation. An existing reconciliation on
926+ the move lines will be taken into account.
927+
928+ :param move_line_ids: List of ids. This will usually be the move
929+ line of an associated invoice or payment, plus optionally the
930+ move line of a writeoff.
931+ :param currency: A res.currency *browse* object to perform math
932+ operations on the amounts.
933+ :param amount: the amount of the bank transaction. Amount < 0 in
934+ case of a credit move on the bank account.
935+ """
936+ move_line_obj = self.pool.get('account.move.line')
937+ reconcile_obj = self.pool.get('account.move.reconcile')
938+ is_zero = lambda amount: self.pool.get('res.currency').is_zero(
939+ cr, uid, currency, amount)
940+ move_lines = move_line_obj.browse(cr, uid, move_line_ids, context=context)
941+ reconcile = False
942+ for move_line in move_lines:
943+ if move_line.reconcile_id:
944+ raise osv.except_osv(
945+ _('Entry is already reconciled'),
946+ _("You cannot reconcile the bank transaction with this entry, " +
947+ "it is already reconciled")
948+ )
949+ if move_line.reconcile_partial_id:
950+ if reconcile and reconcile.id != move_line.reconcile_partial_id.id:
951+ raise osv.except_osv(
952+ _('Cannot reconcile'),
953+ _('Move lines are already partially reconciled, ' +
954+ 'but not with each other.'))
955+ reconcile = move_line.reconcile_partial_id
956+ line_ids = list(set(move_line_ids + (
957+ [x.id for x in reconcile and ( # reconcile.line_id or
958+ reconcile.line_partial_ids) or []])))
959+ if not reconcile:
960+ reconcile_id = reconcile_obj.create(
961+ cr, uid, {'type': 'auto' }, context=context)
962+ reconcile = reconcile_obj.browse(cr, uid, reconcile_id, context=context)
963+ full = is_zero(
964+ move_line_obj.get_balance(cr, uid, line_ids) - amount)
965+ # we should not have to check whether there is a surplus writeoff
966+ # as any surplus amount *should* have been split off in the matching routine
967+ if full:
968+ line_partial_ids = []
969+ else:
970+ line_partial_ids = line_ids[:]
971+ line_ids = []
972+ reconcile_obj.write(
973+ cr, uid, reconcile.id,
974+ { 'line_id': [(6, 0, line_ids)],
975+ 'line_partial_ids': [(6, 0, line_partial_ids)],
976+ }, context=context)
977+ return reconcile.id
978+
979+ def _do_move_unreconcile(self, cr, uid, move_line_ids, currency, context=None):
980+ """
981+ Undo a reconciliation, removing the given move line ids. If no
982+ meaningful (partial) reconciliation remains, delete it.
983+
984+ :param move_line_ids: List of ids. This will usually be the move
985+ line of an associated invoice or payment, plus optionally the
986+ move line of a writeoff.
987+ :param currency: A res.currency *browse* object to perform math
988+ operations on the amounts.
989+ """
990+
991+ move_line_obj = self.pool.get('account.move.line')
992+ reconcile_obj = self.pool.get('account.move.reconcile')
993+ is_zero = lambda amount: self.pool.get('res.currency').is_zero(
994+ cr, uid, currency, amount)
995+ move_lines = move_line_obj.browse(cr, uid, move_line_ids, context=context)
996+ reconcile = move_lines[0].reconcile_id or move_lines[0].reconcile_partial_id
997+ line_ids = [x.id for x in reconcile.line_id or reconcile.line_partial_ids]
998+ for move_line_id in move_line_ids:
999+ line_ids.remove(move_line_id)
1000+ if len(line_ids) > 1:
1001+ full = is_zero(move_line_obj.get_balance(cr, uid, line_ids))
1002+ if full:
1003+ line_partial_ids = []
1004+ else:
1005+ line_partial_ids = list(line_ids)
1006+ line_ids = []
1007+ reconcile_obj.write(
1008+ cr, uid, reconcile.id,
1009+ { 'line_partial_ids': [(6, 0, line_partial_ids)],
1010+ 'line_id': [(6, 0, line_ids)],
1011+ }, context=context)
1012+ else:
1013+ reconcile_obj.unlink(cr, uid, reconcile.id, context=context)
1014+ for move_line in move_lines:
1015+ if move_line.invoice:
1016+ # reopening the invoice
1017+ netsvc.LocalService('workflow').trg_validate(
1018+ uid, 'account.invoice', move_line.invoice.id, 'undo_paid', cr)
1019+ return True
1020+
1021+ def _reconcile_move(
1022+ self, cr, uid, transaction_id, context=None):
1023+ transaction = self.browse(cr, uid, transaction_id, context=context)
1024+ if not transaction.move_line_id:
1025+ if transaction.match_type == 'invoice':
1026+ raise osv.except_osv(
1027+ _("Cannot link transaction %s with invoice") %
1028+ transaction.statement_line_id.name,
1029+ (transaction.invoice_ids and
1030+ (_("Please select one of the matches in transaction %s.%s") or
1031+ _("No match found for transaction %s.%s")) % (
1032+ transaction.statement_line_id.statement_id.name,
1033+ transaction.statement_line_id.name
1034+ )))
1035+ else:
1036+ raise osv.except_osv(
1037+ _("Cannot link transaction %s with accounting entry") %
1038+ transaction.statement_line_id.name,
1039+ (transaction.move_line_ids and
1040+ (_("Please select one of the matches in transaction %s.%s") or
1041+ _("No match found for transaction %s.%s")) % (
1042+ transaction.statement_line_id.statement_id.name,
1043+ transaction.statement_line_id.name
1044+ )))
1045+ currency = transaction.statement_line_id.statement_id.currency
1046+ line_ids = [transaction.move_line_id.id]
1047+ if transaction.writeoff_move_line_id:
1048+ line_ids.append(transaction.writeoff_move_line_id.id)
1049+ reconcile_id = self._do_move_reconcile(
1050+ cr, uid, line_ids, currency,
1051+ transaction.transferred_amount, context=context)
1052+ return reconcile_id
1053+
1054+ def _reconcile_storno(
1055+ self, cr, uid, transaction_id, context=None):
1056+ """
1057+ Creation of the reconciliation has been delegated to
1058+ *a* direct debit module, to allow for various direct debit styles
1059+ """
1060+ payment_line_obj = self.pool.get('payment.line')
1061+ transaction = self.browse(cr, uid, transaction_id, context=context)
1062+ if not transaction.payment_line_id:
1063+ raise osv.except_osv(
1064+ _("Cannot link with storno"),
1065+ _("No direct debit order item"))
1066+ return payment_line_obj.debit_storno(
1067+ cr, uid,
1068+ transaction.payment_line_id.id,
1069+ transaction.statement_line_id.amount,
1070+ transaction.statement_line_id.currency,
1071+ transaction.storno_retry,
1072+ context=context)
1073+
1074+ def _reconcile_payment_order(
1075+ self, cr, uid, transaction_id, context=None):
1076+ """
1077+ Creation of the reconciliation has been delegated to
1078+ *a* direct debit module, to allow for various direct debit styles
1079+ """
1080+ payment_order_obj = self.pool.get('payment.order')
1081+ transaction = self.browse(cr, uid, transaction_id, context=context)
1082+ if not transaction.payment_order_id:
1083+ raise osv.except_osv(
1084+ _("Cannot reconcile"),
1085+ _("Cannot reconcile: no direct debit order"))
1086+ if transaction.payment_order_id.payment_order_type != 'debit':
1087+ raise osv.except_osv(
1088+ _("Cannot reconcile"),
1089+ _("Reconcile payment order not implemented"))
1090+ return payment_order_obj.debit_reconcile_transfer(
1091+ cr, uid,
1092+ transaction.payment_order_id.id,
1093+ transaction.statement_line_id.amount,
1094+ transaction.statement_line_id.currency,
1095+ context=context)
1096+
1097+ def _reconcile_payment(
1098+ self, cr, uid, transaction_id, context=None):
1099+ """
1100+ Do some housekeeping on the payment line
1101+ then pass on to _reconcile_move
1102+ """
1103+ transaction = self.browse(cr, uid, transaction_id, context=context)
1104+ payment_line_obj = self.pool.get('payment.line')
1105+ payment_line_obj.write(
1106+ cr, uid, transaction.payment_line_id.id, {
1107+ 'export_state': 'done',
1108+ 'date_done': transaction.effective_date,
1109+ }
1110+ )
1111+ return self._reconcile_move(cr, uid, transaction_id, context=context)
1112+
1113+ def _cancel_payment(
1114+ self, cr, uid, transaction_id, context=None):
1115+ raise osv.except_osv(
1116+ _("Cannot unreconcile"),
1117+ _("Cannot unreconcile: this operation is not yet supported for "
1118+ "match type 'payment'"))
1119+
1120+ def _cancel_payment_order(
1121+ self, cr, uid, transaction_id, context=None):
1122+ """
1123+ """
1124+ payment_order_obj = self.pool.get('payment.order')
1125+ transaction = self.browse(cr, uid, transaction_id, context=context)
1126+ if not transaction.payment_order_id:
1127+ raise osv.except_osv(
1128+ _("Cannot unreconcile"),
1129+ _("Cannot unreconcile: no direct debit order"))
1130+ if transaction.payment_order_id.payment_order_type != 'debit':
1131+ raise osv.except_osv(
1132+ _("Cannot unreconcile"),
1133+ _("Unreconcile payment order not implemented"))
1134+ return payment_order_obj.debit_unreconcile_transfer(
1135+ cr, uid, transaction.payment_order_id.id,
1136+ transaction.statement_line_id.reconcile_id.id,
1137+ transaction.statement_line_id.amount,
1138+ transaction.statement_line_id.currency)
1139+
1140+ def _cancel_move(
1141+ self, cr, uid, transaction_id, context=None):
1142+ """
1143+ Undo the reconciliation of a transaction with a move line
1144+ in the system: Retrieve the move line from the bank statement line's
1145+ move that is reconciled with the matching move line recorded
1146+ on the transaction. Do not actually remove the latter from the
1147+ reconciliation, as it may be further reconciled.
1148+ Unreconcile the bank statement move line and the optional
1149+ write-off move line
1150+ """
1151+ statement_line_obj = self.pool.get('account.bank.statement.line')
1152+ transaction = self.browse(cr, uid, transaction_id, context=context)
1153+ currency = transaction.statement_line_id.statement_id.currency
1154+ reconcile_id = (
1155+ transaction.move_line_id.reconcile_id and
1156+ transaction.move_line_id.reconcile_id.id or
1157+ transaction.move_line_id.reconcile_partial_id and
1158+ transaction.move_line_id.reconcile_partial_id.id
1159+ )
1160+ for line in transaction.statement_line_id.move_id.line_id:
1161+ line_reconcile = line.reconcile_id or line.reconcile_partial_id
1162+ if line_reconcile and line_reconcile.id == reconcile_id:
1163+ st_line_line = line
1164+ break
1165+ line_ids = [st_line_line.id]
1166+ # Add the write off line
1167+ if transaction.writeoff_move_line_id:
1168+ line_ids.append(transaction.writeoff_move_line_id.id)
1169+ self._do_move_unreconcile(
1170+ cr, uid, line_ids, currency, context=context)
1171+ statement_line_obj.write(
1172+ cr, uid, transaction.statement_line_id.id,
1173+ {'reconcile_id': False}, context=context)
1174+ return True
1175+
1176+ def _cancel_storno(
1177+ self, cr, uid, transaction_id, context=None):
1178+ """
1179+ TODO: delegate unreconciliation to the direct debit module,
1180+ to allow for various direct debit styles
1181+ """
1182+ payment_line_obj = self.pool.get('payment.line')
1183+ reconcile_obj = self.pool.get('account.move.reconcile')
1184+ transaction = self.browse(cr, uid, transaction_id, context=context)
1185+
1186+ if not transaction.payment_line_id:
1187+ raise osv.except_osv(
1188+ _("Cannot cancel link with storno"),
1189+ _("No direct debit order item"))
1190+ if not transaction.payment_line_id.storno:
1191+ raise osv.except_osv(
1192+ _("Cannot cancel link with storno"),
1193+ _("The direct debit order item is not marked for storno"))
1194+
1195+ journal = transaction.statement_line_id.statement_id.journal_id
1196+ if transaction.statement_line_id.amount >= 0:
1197+ account_id = journal.default_credit_account_id.id
1198+ else:
1199+ account_id = journal.default_debit_account_id.id
1200+ cancel_line = False
1201+ for line in transaction.statement_line_id.move_id.line_id:
1202+ if line.account_id.id != account_id:
1203+ cancel_line = line
1204+ break
1205+ if not cancel_line: # debug
1206+ raise osv.except_osv(
1207+ _("Cannot cancel link with storno"),
1208+ _("Line id not found"))
1209+ reconcile = cancel_line.reconcile_id or cancel_line.reconcile_partial_id
1210+ lines_reconcile = reconcile.line_id or reconcile.line_partial_ids
1211+ if len(lines_reconcile) < 3:
1212+ # delete the full reconciliation
1213+ reconcile_obj.unlink(cr, uid, reconcile.id, context)
1214+ else:
1215+ # we are left with a partial reconciliation
1216+ reconcile_obj.write(
1217+ cr, uid, reconcile.id,
1218+ {'line_partial_ids':
1219+ [(6, 0, [x.id for x in lines_reconcile if x.id != cancel_line.id])],
1220+ 'line_id': [(6, 0, [])],
1221+ }, context)
1222+ # redo the original payment line reconciliation with the invoice
1223+ payment_line_obj.write(
1224+ cr, uid, transaction.payment_line_id.id,
1225+ {'storno': False}, context)
1226+ payment_line_obj.debit_reconcile(
1227+ cr, uid, transaction.payment_line_id.id, context)
1228+
1229+ cancel_map = {
1230+ 'storno': _cancel_storno,
1231+ 'invoice': _cancel_move,
1232+ 'manual': _cancel_move,
1233+ 'move': _cancel_move,
1234+ 'payment_order': _cancel_payment_order,
1235+ 'payment': _cancel_payment,
1236+ }
1237+ def cancel(self, cr, uid, ids, context=None):
1238+ if ids and isinstance(ids, (int, float)):
1239+ ids = [ids]
1240+ move_obj = self.pool.get('account.move')
1241+ for transaction in self.browse(cr, uid, ids, context):
1242+ if not transaction.match_type:
1243+ continue
1244+ if transaction.match_type not in self.cancel_map:
1245+ raise osv.except_osv(
1246+ _("Cannot cancel type %s" % transaction.match_type),
1247+ _("No method found to cancel this type"))
1248+ self.cancel_map[transaction.match_type](
1249+ self, cr, uid, transaction.id, context)
1250+ # clear up the writeoff move
1251+ if transaction.writeoff_move_line_id:
1252+ move_obj.button_cancel(
1253+ cr, uid, [transaction.writeoff_move_line_id.move_id.id],
1254+ context=context)
1255+ move_obj.unlink(
1256+ cr, uid, [transaction.writeoff_move_line_id.move_id.id],
1257+ context=context)
1258+ return True
1259+
1260+ reconcile_map = {
1261+ 'storno': _reconcile_storno,
1262+ 'invoice': _reconcile_move,
1263+ 'manual': _reconcile_move,
1264+ 'payment_order': _reconcile_payment_order,
1265+ 'payment': _reconcile_payment,
1266+ 'move': _reconcile_move,
1267+ }
1268+ def reconcile(self, cr, uid, ids, context=None):
1269+ if ids and isinstance(ids, (int, float)):
1270+ ids = [ids]
1271+ for transaction in self.browse(cr, uid, ids, context):
1272+ if not transaction.match_type:
1273+ continue
1274+ if transaction.match_type not in self.reconcile_map:
1275+ raise osv.except_osv(
1276+ _("Cannot reconcile"),
1277+ _("Cannot reconcile type %s. No method found to " +
1278+ "reconcile this type") %
1279+ transaction.match_type
1280+ )
1281+ if (transaction.residual and transaction.writeoff_account_id):
1282+ if transaction.match_type not in ('invoice', 'move', 'manual'):
1283+ raise osv.except_osv(
1284+ _("Cannot reconcile"),
1285+ _("Bank transaction %s: write off not implemented for " +
1286+ "this match type.") %
1287+ transaction.statement_line_id.name
1288+ )
1289+ self._generate_writeoff_move(
1290+ cr, uid, transaction.id, context=context)
1291+ # run the method that is appropriate for this match type
1292+ reconcile_id = self.reconcile_map[transaction.match_type](
1293+ self, cr, uid, transaction.id, context)
1294+ self.pool.get('account.bank.statement.line').write(
1295+ cr, uid, transaction.statement_line_id.id,
1296+ {'reconcile_id': reconcile_id}, context=context)
1297+
1298+ # TODO
1299+ # update the statement line bank account reference
1300+ # as follows (from _match_invoice)
1301+
1302+ """
1303+ account_ids = [
1304+ x.id for x in bank_account_ids
1305+ if x.partner_id.id == move_line.partner_id.id
1306+ ][0]
1307+ """
1308+ return True
1309+
1310+
1311+ def _generate_writeoff_move(self, cr, uid, ids, context):
1312+ if ids and isinstance(ids, (int, float)):
1313+ ids = [ids]
1314+ move_line_obj = self.pool.get('account.move.line')
1315+ move_obj = self.pool.get('account.move')
1316+ for trans in self.browse(cr, uid, ids, context=context):
1317+ periods = self.pool.get('account.period').find(
1318+ cr, uid, trans.statement_line_id.date)
1319+ period_id = periods and periods[0] or False
1320+ move_id = move_obj.create(cr, uid, {
1321+ 'journal_id': trans.writeoff_journal_id.id,
1322+ 'period_id': period_id,
1323+ 'date': trans.statement_line_id.date,
1324+ 'name': '(write-off) %s' % (
1325+ trans.move_line_id.move_id.name or '')
1326+ }, context=context)
1327+ if trans.residual > 0:
1328+ writeoff_debit = trans.residual
1329+ writeoff_credit = False
1330+ else:
1331+ writeoff_debit = False
1332+ writeoff_credit = - trans.residual
1333+ vals = {
1334+ 'name': trans.statement_line_id.name,
1335+ 'date': trans.statement_line_id.date,
1336+ 'ref': trans.statement_line_id.ref,
1337+ 'move_id': move_id,
1338+ 'partner_id': (trans.statement_line_id.partner_id and
1339+ trans.statement_line_id.partner_id.id or False),
1340+ 'account_id': trans.statement_line_id.account_id.id,
1341+ 'credit': writeoff_debit,
1342+ 'debit': writeoff_credit,
1343+ 'journal_id': trans.writeoff_journal_id.id,
1344+ 'period_id': period_id,
1345+ 'currency_id': trans.statement_line_id.statement_id.currency.id,
1346+ }
1347+ move_line_id = move_line_obj.create(
1348+ cr, uid, vals, context=context)
1349+ self.write(
1350+ cr, uid, trans.id,
1351+ {'writeoff_move_line_id': move_line_id}, context=context)
1352+ vals.update({
1353+ 'account_id': trans.writeoff_account_id.id,
1354+ 'credit': writeoff_credit,
1355+ 'debit': writeoff_debit,
1356+ })
1357+ move_line_obj.create(
1358+ cr, uid, vals, context=context)
1359+ move_obj.post(
1360+ cr, uid, [move_id], context=context)
1361+
1362+ def _match_storno(
1363+ self, cr, uid, trans, log, context=None):
1364+ payment_line_obj = self.pool.get('payment.line')
1365+ line_ids = payment_line_obj.search(
1366+ cr, uid, [
1367+ ('order_id.payment_order_type', '=', 'debit'),
1368+ ('order_id.state', 'in', ['sent', 'done']),
1369+ ('communication', '=', trans.reference)
1370+ ], context=context)
1371+ # stornos MUST have an exact match
1372+ if len(line_ids) == 1:
1373+ account_id = payment_line_obj.get_storno_account_id(
1374+ cr, uid, line_ids[0], trans.transferred_amount,
1375+ trans.statement_id.currency, context=None)
1376+ if account_id:
1377+ return dict(
1378+ account_id = account_id,
1379+ match_type = 'storno',
1380+ payment_line_id = line_ids[0],
1381+ move_line_ids=False,
1382+ partner_id=False,
1383+ partner_bank_id=False,
1384+ reference=False,
1385+ type='customer',
1386+ )
1387+ # TODO log the reason why there is no result for transfers marked
1388+ # as storno
1389+ return False
1390+
1391+ def _match_payment(self, cr, uid, trans, payment_lines,
1392+ partner_ids, bank_account_ids, log, linked_payments):
1393+ '''
1394+ Find the payment order belonging to this reference - if there is one
1395+ This is the easiest part: when sending payments, the returned bank info
1396+ should be identical to ours.
1397+ This also means that we do not allow for multiple candidates.
1398+ '''
1399+ # TODO: Not sure what side effects are created when payments are done
1400+ # for credited customer invoices, which will be matched later on too.
1401+ digits = dp.get_precision('Account')(cr)[1]
1402+ candidates = [x for x in payment_lines
1403+ if x.communication == trans.reference
1404+ and round(x.amount, digits) == -round(trans.transferred_amount, digits)
1405+ and trans.remote_account in (x.bank_id.acc_number,
1406+ x.bank_id.iban)
1407+ ]
1408+ if len(candidates) == 1:
1409+ candidate = candidates[0]
1410+ # Check cache to prevent multiple matching of a single payment
1411+ if candidate.id not in linked_payments:
1412+ linked_payments[candidate.id] = True
1413+ move_info = self._get_move_info(cr, uid, [candidate.move_line_id.id])
1414+ move_info.update({
1415+ 'match_type': 'payment',
1416+ 'payment_line_id': candidate.id,
1417+ })
1418+ return move_info
1419+
1420+ return False
1421+
1422+ signal_duplicate_keys = [
1423+ # does not include float values
1424+ # such as transferred_amount
1425+ 'execution_date', 'local_account', 'remote_account',
1426+ 'remote_owner', 'reference', 'message',
1427+ ]
1428+
1429+ def create(self, cr, uid, vals, context=None):
1430+ res = super(banking_import_transaction, self).create(
1431+ cr, uid, vals, context)
1432+ if res:
1433+ me = self.browse(cr, uid, res, context)
1434+ search_vals = [(key, '=', me[key])
1435+ for key in self.signal_duplicate_keys]
1436+ ids = self.search(cr, uid, search_vals, context=context)
1437+ dupes = []
1438+ # Test for transferred_amount seperately
1439+ # due to float representation and rounding difficulties
1440+ for trans in self.browse(cr, uid, ids, context=context):
1441+ if self.pool.get('res.currency').is_zero(
1442+ cr, uid,
1443+ trans.statement_id.currency,
1444+ me['transferred_amount'] - trans.transferred_amount):
1445+ dupes.append(trans.id)
1446+ if len(dupes) < 1:
1447+ raise osv.except_osv(_('Cannot check for duplicate'),
1448+ _("Cannot check for duplicate. "
1449+ "I can't find myself."))
1450+ if len(dupes) > 1:
1451+ self.write(
1452+ cr, uid, res, {'duplicate': True}, context=context)
1453+ return res
1454+
1455+ def split_off(self, cr, uid, res_id, amount, context=None):
1456+ # todo. Inherit the duplicate marker from res_id
1457+ pass
1458+
1459+ def combine(self, cr, uid, ids, context=None):
1460+ # todo. Check equivalence of primary key
1461+ pass
1462+
1463+ def _get_move_info(self, cr, uid, move_line_ids, partner_bank_id=False,
1464+ partial=False, match_type = False):
1465+ type_map = {
1466+ 'out_invoice': 'customer',
1467+ 'in_invoice': 'supplier',
1468+ 'out_refund': 'customer',
1469+ 'in_refund': 'supplier',
1470+ }
1471+ retval = {'partner_id': False,
1472+ 'partner_bank_id': partner_bank_id,
1473+ 'reference': False,
1474+ 'type': 'general',
1475+ 'move_line_ids': move_line_ids,
1476+ 'match_type': match_type,
1477+ 'account_id': False,
1478+ }
1479+ move_lines = self.pool.get('account.move.line').browse(cr, uid, move_line_ids)
1480+ for move_line in move_lines:
1481+ if move_line.partner_id:
1482+ if retval['partner_id']:
1483+ if retval['partner_id'] != move_line.partner_id.id:
1484+ retval['partner_id'] = False
1485+ break
1486+ else:
1487+ retval['partner_id'] = move_line.partner_id.id
1488+ else:
1489+ if retval['partner_id']:
1490+ retval['partner_id'] = False
1491+ break
1492+ for move_line in move_lines:
1493+ if move_line.account_id:
1494+ if retval['account_id']:
1495+ if retval['account_id'] != move_line.account_id.id:
1496+ retval['account_id'] = False
1497+ break
1498+ else:
1499+ retval['account_id'] = move_line.account_id.id
1500+ else:
1501+ if retval['account_id']:
1502+ retval['account_id'] = False
1503+ break
1504+ for move_line in move_lines:
1505+ if move_line.invoice:
1506+ if retval['match_type']:
1507+ if retval['match_type'] != 'invoice':
1508+ retval['match_type'] = False
1509+ break
1510+ else:
1511+ retval['match_type'] = 'invoice'
1512+ else:
1513+ if retval['match_type']:
1514+ retval['match_type'] = False
1515+ break
1516+ if move_lines and not retval['match_type']:
1517+ retval['match_type'] = 'move'
1518+ if move_lines and len(move_lines) == 1:
1519+ retval['reference'] = move_lines[0].ref
1520+ if retval['match_type'] == 'invoice':
1521+ retval['invoice_ids'] = [x.invoice.id for x in move_lines]
1522+ retval['type'] = type_map[move_lines[0].invoice.type]
1523+ return retval
1524+
1525+ def match(self, cr, uid, ids, results=None, context=None):
1526+ if not ids:
1527+ return True
1528+
1529+ company_obj = self.pool.get('res.company')
1530+ partner_bank_obj = self.pool.get('res.partner.bank')
1531+ journal_obj = self.pool.get('account.journal')
1532+ move_line_obj = self.pool.get('account.move.line')
1533+ payment_line_obj = self.pool.get('payment.line')
1534+ statement_line_obj = self.pool.get('account.bank.statement.line')
1535+ statement_obj = self.pool.get('account.bank.statement')
1536+ payment_order_obj = self.pool.get('payment.order')
1537+ imported_statement_ids = []
1538+
1539+ # Results
1540+ if results is None:
1541+ results = dict(
1542+ trans_loaded_cnt = 0,
1543+ trans_skipped_cnt = 0,
1544+ trans_matched_cnt = 0,
1545+ bank_costs_invoice_cnt = 0,
1546+ error_cnt = 0,
1547+ log = [],
1548+ )
1549+
1550+ # Caching
1551+ error_accounts = {}
1552+ info = {}
1553+ linked_payments = {}
1554+ # TODO: harvest linked invoices from draft statement lines?
1555+ linked_invoices = {}
1556+ payment_lines = []
1557+
1558+ # Get all unreconciled sent payment lines in one big swoop.
1559+ # No filtering can be done, as empty dates carry value for C2B
1560+ # communication. Most likely there are much less sent payments
1561+ # than reconciled and open/draft payments.
1562+ # Strangely, payment_orders still do not have company_id
1563+ cr.execute("SELECT l.id FROM payment_order o, payment_line l "
1564+ "WHERE l.order_id = o.id AND "
1565+ "o.state = 'sent' AND "
1566+ "l.date_done IS NULL"
1567+ )
1568+ payment_line_ids = [x[0] for x in cr.fetchall()]
1569+ if payment_line_ids:
1570+ payment_lines = payment_line_obj.browse(cr, uid, payment_line_ids)
1571+
1572+ # Start the loop over the transactions requested to match
1573+ transactions = self.browse(cr, uid, ids, context)
1574+ # TODO: do we do injected transactions here?
1575+ injected = []
1576+ i = 0
1577+ max_trans = len(transactions)
1578+ while i < max_trans:
1579+ move_info = False
1580+ if injected:
1581+ # Force FIFO behavior
1582+ transaction = injected.pop(0)
1583+ else:
1584+ transaction = transactions[i]
1585+
1586+ if (transaction.statement_line_id and
1587+ transaction.statement_line_id.state == 'confirmed'):
1588+ raise osv.except_osv(
1589+ _("Cannot perform match"),
1590+ _("Cannot perform match on a confirmed transction"))
1591+
1592+ if transaction.local_account in error_accounts:
1593+ results['trans_skipped_cnt'] += 1
1594+ if not injected:
1595+ i += 1
1596+ continue
1597+
1598+ # TODO: optimize by ordering transactions per company,
1599+ # and perform the stanza below only once per company.
1600+ # In that case, take newest transaction date into account
1601+ # when retrieving move_line_ids below.
1602+ company = company_obj.browse(
1603+ cr, uid, transaction.company_id.id, context)
1604+ # Get default defaults
1605+ def_pay_account_id = company.partner_id.property_account_payable.id
1606+ def_rec_account_id = company.partner_id.property_account_receivable.id
1607+
1608+ # Get interesting journals once
1609+ # Added type 'general' to capture fund transfers
1610+ journal_ids = journal_obj.search(cr, uid, [
1611+ ('type', 'in', ('general', 'sale','purchase',
1612+ 'purchase_refund','sale_refund')),
1613+ ('company_id', '=', company.id),
1614+ ])
1615+ # Get all unreconciled moves
1616+ move_line_ids = move_line_obj.search(cr, uid, [
1617+ ('reconcile_id', '=', False),
1618+ ('journal_id', 'in', journal_ids),
1619+ ('account_id.reconcile', '=', True),
1620+ ('date', '<=', transaction.execution_date),
1621+ ])
1622+ if move_line_ids:
1623+ move_lines = move_line_obj.browse(cr, uid, move_line_ids)
1624+ else:
1625+ move_lines = []
1626+
1627+ # Create fallback currency code
1628+ currency_code = transaction.local_currency or company.currency_id.name
1629+
1630+ # Check cache for account info/currency
1631+ if transaction.local_account in info and \
1632+ currency_code in info[transaction.local_account]:
1633+ account_info = info[transaction.local_account][currency_code]
1634+ else:
1635+ # Pull account info/currency
1636+ account_info = get_company_bank_account(
1637+ self.pool, cr, uid, transaction.local_account,
1638+ transaction.local_currency, company, results['log']
1639+ )
1640+ if not account_info:
1641+ results['log'].append(
1642+ _('Transaction found for unknown account %(bank_account)s') %
1643+ {'bank_account': transaction.local_account}
1644+ )
1645+ error_accounts[transaction.local_account] = True
1646+ results['error_cnt'] += 1
1647+ if not injected:
1648+ i += 1
1649+ continue
1650+ if 'journal_id' not in account_info:
1651+ results['log'].append(
1652+ _('Transaction found for account %(bank_account)s, '
1653+ 'but no default journal was defined.'
1654+ ) % {'bank_account': transaction.local_account}
1655+ )
1656+ error_accounts[transaction.local_account] = True
1657+ results['error_cnt'] += 1
1658+ if not injected:
1659+ i += 1
1660+ continue
1661+
1662+ # Get required currency code
1663+ currency_code = account_info.currency_id.name
1664+
1665+ # Cache results
1666+ if not transaction.local_account in info:
1667+ info[transaction.local_account] = {
1668+ currency_code: account_info
1669+ }
1670+ else:
1671+ info[transaction.local_account][currency_code] = account_info
1672+
1673+ # Final check: no coercion of currencies!
1674+ if transaction.local_currency \
1675+ and account_info.currency_id.name != transaction.local_currency:
1676+ # TODO: convert currencies?
1677+ results['log'].append(
1678+ _('transaction %(statement_id)s.%(transaction_id)s for account %(bank_account)s'
1679+ ' uses different currency than the defined bank journal.'
1680+ ) % {
1681+ 'bank_account': transactions.local_account,
1682+ 'transaction_id': transaction.statement,
1683+ 'statement_id': transaction.transaction,
1684+ }
1685+ )
1686+ error_accounts[transaction.local_account] = True
1687+ results['error_cnt'] += 1
1688+ if not injected:
1689+ i += 1
1690+ continue
1691+
1692+ # Link accounting period
1693+ period_id = get_period(
1694+ self.pool, cr, uid,
1695+ str2date(transaction.effective_date,'%Y-%m-%d'), company,
1696+ results['log'])
1697+ if not period_id:
1698+ results['trans_skipped_cnt'] += 1
1699+ if not injected:
1700+ i += 1
1701+ continue
1702+
1703+ # When bank costs are part of transaction itself, split it.
1704+ if transaction.type != bt.BANK_COSTS and transaction.provision_costs:
1705+ # Create new transaction for bank costs
1706+ cost_id = self.copy(
1707+ cr, uid, transaction.id,
1708+ dict(
1709+ type = bt.BANK_COSTS,
1710+ transaction = '%s-prov' % transaction.transaction,
1711+ transferred_amount = transaction.provision_costs,
1712+ remote_currency = transaction.provision_costs_currency,
1713+ message = transaction.provision_costs_description,
1714+ parent_id = transaction.id,
1715+ ), context)
1716+
1717+ injected.append(self.browse(cr, uid, cost_id, context))
1718+
1719+ # Remove bank costs from current transaction
1720+ # Note that this requires that the transferred_amount
1721+ # includes the bank costs and that the costs itself are
1722+ # signed correctly.
1723+ self.write(
1724+ cr, uid, transaction.id,
1725+ dict(
1726+ transferred_amount =
1727+ transaction.transferred_amount - transaction.provision_costs,
1728+ provision_costs = False,
1729+ provision_costs_currency = False,
1730+ provision_costs_description = False,
1731+ ), context=context)
1732+ # rebrowse the current record after writing
1733+ transaction=self.browse(cr, uid, transaction.id, context=context)
1734+ # Match full direct debit orders
1735+ if transaction.type == bt.DIRECT_DEBIT:
1736+ move_info = self._match_debit_order(
1737+ cr, uid, transaction, results['log'], context)
1738+ if transaction.type == bt.STORNO:
1739+ move_info = self._match_storno(
1740+ cr, uid, transaction, results['log'], context)
1741+ # Allow inclusion of generated bank invoices
1742+ if transaction.type == bt.BANK_COSTS:
1743+ lines = self._match_costs(
1744+ cr, uid, transaction, period_id, account_info,
1745+ results['log']
1746+ )
1747+ results['bank_costs_invoice_cnt'] += bool(lines)
1748+ for line in lines:
1749+ if not [x for x in move_lines if x.id == line.id]:
1750+ move_lines.append(line)
1751+ partner_ids = [account_info.bank_partner_id.id]
1752+ partner_banks = []
1753+ else:
1754+ # Link remote partner, import account when needed
1755+ partner_banks = get_bank_accounts(
1756+ self.pool, cr, uid, transaction.remote_account,
1757+ results['log'], fail=True
1758+ )
1759+ if partner_banks:
1760+ partner_ids = [x.partner_id.id for x in partner_banks]
1761+ elif transaction.remote_owner:
1762+ iban = sepa.IBAN(transaction.remote_account)
1763+ if iban.valid:
1764+ country_code = iban.countrycode
1765+ elif transaction.remote_owner_country_code:
1766+ country_code = transaction.remote_owner_country_code
1767+ # fallback on the import parsers country code
1768+ elif transaction.bank_country_code:
1769+ country_code = transaction.bank_country_code
1770+ elif company.partner_id and company.partner_id.country:
1771+ country_code = company.partner_id.country.code
1772+ else:
1773+ country_code = None
1774+ partner_id = get_or_create_partner(
1775+ self.pool, cr, uid, transaction.remote_owner,
1776+ transaction.remote_owner_address,
1777+ transaction.remote_owner_postalcode,
1778+ transaction.remote_owner_city,
1779+ country_code, results['log']
1780+ )
1781+ if transaction.remote_account:
1782+ partner_bank_id = create_bank_account(
1783+ self.pool, cr, uid, partner_id,
1784+ transaction.remote_account,
1785+ transaction.remote_owner,
1786+ transaction.remote_owner_address,
1787+ transaction.remote_owner_city,
1788+ country_code, results['log']
1789+ )
1790+ partner_banks = partner_bank_obj.browse(
1791+ cr, uid, [partner_bank_id]
1792+ )
1793+ else:
1794+ partner_bank_id = None
1795+ partner_banks = []
1796+ partner_ids = [partner_id]
1797+ else:
1798+ partner_ids = []
1799+ partner_banks = []
1800+
1801+ # Credit means payment... isn't it?
1802+ if (not move_info
1803+ and transaction.transferred_amount < 0 and payment_lines):
1804+ # Link open payment - if any
1805+ move_info = self._match_payment(
1806+ cr, uid, transaction,
1807+ payment_lines, partner_ids,
1808+ partner_banks, results['log'], linked_payments,
1809+ )
1810+
1811+ # Second guess, invoice -> may split transaction, so beware
1812+ if not move_info:
1813+ # Link invoice - if any. Although bank costs are not an
1814+ # invoice, automatic invoicing on bank costs will create
1815+ # these, and invoice matching still has to be done.
1816+
1817+ transaction, move_info, remainder = self._match_invoice(
1818+ cr, uid, transaction, move_lines, partner_ids,
1819+ partner_banks, results['log'], linked_invoices,
1820+ context=context)
1821+ if remainder:
1822+ injected.append(self.browse(cr, uid, remainder, context))
1823+
1824+ account_id = move_info and move_info.get('account_id', False)
1825+ if not account_id:
1826+ # Use the default settings, but allow individual partner
1827+ # settings to overrule this. Note that you need to change
1828+ # the internal type of these accounts to either 'payable'
1829+ # or 'receivable' to enable usage like this.
1830+ if transaction.transferred_amount < 0:
1831+ if len(partner_banks) == 1:
1832+ account_id = (
1833+ partner_banks[0].partner_id.property_account_payable and
1834+ partner_banks[0].partner_id.property_account_payable.id)
1835+ if len(partner_banks) != 1 or not account_id or account_id == def_pay_account_id:
1836+ account_id = (account_info.default_credit_account_id and
1837+ account_info.default_credit_account_id.id)
1838+ else:
1839+ if len(partner_banks) == 1:
1840+ account_id = (
1841+ partner_banks[0].partner_id.property_account_receivable and
1842+ partner_banks[0].partner_id.property_account_receivable.id)
1843+ if len(partner_banks) != 1 or not account_id or account_id == def_rec_account_id:
1844+ account_id = (account_info.default_debit_account_id and
1845+ account_info.default_debit_account_id.id)
1846+ values = {}
1847+ self_values = {}
1848+ if move_info:
1849+ results['trans_matched_cnt'] += 1
1850+ self_values['match_type'] = move_info['match_type']
1851+ self_values['payment_line_id'] = move_info.get('payment_line_id', False)
1852+ self_values['move_line_ids'] = [(6, 0, move_info.get('move_line_ids') or [])]
1853+ self_values['invoice_ids'] = [(6, 0, move_info.get('invoice_ids') or [])]
1854+ self_values['payment_order_ids'] = [(6, 0, move_info.get('payment_order_ids') or [])]
1855+ self_values['payment_order_id'] = (move_info.get('payment_order_ids', False) and
1856+ len(move_info['payment_order_ids']) == 1 and
1857+ move_info['payment_order_ids'][0]
1858+ )
1859+ self_values['move_line_id'] = (move_info.get('move_line_ids', False) and
1860+ len(move_info['move_line_ids']) == 1 and
1861+ move_info['move_line_ids'][0]
1862+ )
1863+ if move_info['match_type'] == 'invoice':
1864+ self_values['invoice_id'] = (move_info.get('invoice_ids', False) and
1865+ len(move_info['invoice_ids']) == 1 and
1866+ move_info['invoice_ids'][0]
1867+ )
1868+ values['partner_id'] = move_info['partner_id']
1869+ values['partner_bank_id'] = move_info['partner_bank_id']
1870+ values['type'] = move_info['type']
1871+ # values['match_type'] = move_info['match_type']
1872+ else:
1873+ values['partner_id'] = values['partner_bank_id'] = False
1874+ if not values['partner_id'] and partner_ids and len(partner_ids) == 1:
1875+ values['partner_id'] = partner_ids[0]
1876+ if (not values['partner_bank_id'] and partner_banks and
1877+ len(partner_banks) == 1):
1878+ values['partner_bank_id'] = partner_banks[0].id
1879+ if not transaction.statement_line_id:
1880+ values.update(dict(
1881+ name = '%s.%s' % (transaction.statement, transaction.transaction),
1882+ date = transaction.effective_date,
1883+ amount = transaction.transferred_amount,
1884+ statement_id = transaction.statement_id.id,
1885+ note = transaction.message,
1886+ ref = transaction.reference,
1887+ period_id = period_id,
1888+ currency = account_info.currency_id.id,
1889+ account_id = account_id,
1890+ import_transaction_id = transaction.id,
1891+ ))
1892+ statement_line_id = statement_line_obj.create(cr, uid, values, context)
1893+ results['trans_loaded_cnt'] += 1
1894+ self_values['statement_line_id'] = statement_line_id
1895+ if transaction.statement_id.id not in imported_statement_ids:
1896+ imported_statement_ids.append(transaction.statement_id.id)
1897+ else:
1898+ statement_line_obj.write(
1899+ cr, uid, transaction.statement_line_id.id, values, context)
1900+ self.write(cr, uid, transaction.id, self_values, context)
1901+ if not injected:
1902+ i += 1
1903+
1904+ #recompute statement end_balance for validation
1905+ if imported_statement_ids:
1906+ statement_obj.button_dummy(
1907+ cr, uid, imported_statement_ids, context=context)
1908+
1909+ if payment_lines:
1910+ # As payments lines are treated as individual transactions, the
1911+ # batch as a whole is only marked as 'done' when all payment lines
1912+ # have been reconciled.
1913+ cr.execute(
1914+ "SELECT DISTINCT o.id "
1915+ "FROM payment_order o, payment_line l "
1916+ "WHERE o.state = 'sent' "
1917+ "AND o.id = l.order_id "
1918+ "AND o.id NOT IN ("
1919+ "SELECT DISTINCT order_id AS id "
1920+ "FROM payment_line "
1921+ "WHERE date_done IS NULL "
1922+ "AND id IN (%s)"
1923+ ")" % (','.join([str(x) for x in payment_line_ids]))
1924+ )
1925+ order_ids = [x[0] for x in cr.fetchall()]
1926+ if order_ids:
1927+ # Use workflow logics for the orders. Recode logic from
1928+ # account_payment, in order to increase efficiency.
1929+ payment_order_obj.set_done(cr, uid, order_ids,
1930+ {'state': 'done'}
1931+ )
1932+ wf_service = netsvc.LocalService('workflow')
1933+ for id in order_ids:
1934+ wf_service.trg_validate(
1935+ uid, 'payment.order', id, 'done', cr)
1936+
1937+ def _get_residual(self, cr, uid, ids, name, args, context=None):
1938+ """
1939+ Calculate the residual against the candidate reconciliation.
1940+ When
1941+
1942+ 55 debiteuren, 50 binnen: amount > 0, residual > 0
1943+ -55 crediteuren, -50 binnen: amount = -60 residual -55 - -50
1944+
1945+ - residual > 0 and transferred amount > 0, or
1946+ - residual < 0 and transferred amount < 0
1947+
1948+ the result is a partial reconciliation. In the other cases,
1949+ a new statement line can be split off.
1950+
1951+ We should give users the option to reconcile with writeoff
1952+ or partial reconciliation / new statement line
1953+ """
1954+
1955+ if not ids:
1956+ return {}
1957+ res = dict([(x, False) for x in ids])
1958+ move_line_obj = self.pool.get('account.move.line')
1959+ for transaction in self.browse(cr, uid, ids, context):
1960+ if (transaction.statement_line_id.state == 'draft'
1961+ and transaction.match_type in
1962+ [('invoice'), ('move'), ('manual')]
1963+ and transaction.move_line_id):
1964+ rec_moves = (
1965+ transaction.move_line_id.reconcile_id and
1966+ transaction.move_line_id.reconcile_id.line_id or
1967+ transaction.move_line_id.reconcile_partial_id and
1968+ transaction.move_line_id.reconcile_partial_id.line_partial_ids or
1969+ [transaction.move_line_id])
1970+ res[transaction.id] = (
1971+ move_line_obj.get_balance(cr, uid, [x.id for x in rec_moves])
1972+ - transaction.transferred_amount)
1973+ return res
1974+
1975+ def _get_match_multi(self, cr, uid, ids, name, args, context=None):
1976+ """
1977+ Indicate in the wizard that multiple matches have been found
1978+ and that the user has not yet made a choice between them.
1979+ """
1980+ if not ids:
1981+ return {}
1982+ res = dict([(x, False) for x in ids])
1983+ for transaction in self.browse(cr, uid, ids, context):
1984+ if transaction.match_type == 'move':
1985+ if transaction.move_line_ids and not transaction.move_line_id:
1986+ res[transaction.id] = True
1987+ elif transaction.match_type == 'invoice':
1988+ if transaction.invoice_ids and not transaction.invoice_id:
1989+ res[transaction.id] = True
1990+ elif transaction.match_type == 'payment_order':
1991+ if (transaction.payment_order_ids and not
1992+ transaction.payment_order_id):
1993+ res[transaction.id] = True
1994+ return res
1995+
1996+ def clear_and_write(self, cr, uid, ids, vals=None, context=None):
1997+ """
1998+ Write values in argument 'vals', but clear all match
1999+ related values first
2000+ """
2001+ write_vals = (dict([(x, False) for x in [
2002+ 'match_type',
2003+ 'move_line_id',
2004+ 'invoice_id',
2005+ 'manual_invoice_id',
2006+ 'manual_move_line_id',
2007+ 'payment_line_id',
2008+ ]] +
2009+ [(x, [(6, 0, [])]) for x in [
2010+ 'move_line_ids',
2011+ 'invoice_ids',
2012+ 'payment_order_ids',
2013+ ]]))
2014+ write_vals.update(vals or {})
2015+ return self.write(cr, uid, ids, write_vals, context=context)
2016+
2017+ column_map = {
2018+ # used in bank_import.py, converting non-osv transactions
2019+ 'statement_id': 'statement',
2020+ 'id': 'transaction'
2021+ }
2022+
2023+ _columns = {
2024+ # start mem_bank_transaction atributes
2025+ # see parsers/models.py
2026+ 'transaction': fields.char('transaction', size=16), # id
2027+ 'statement': fields.char('statement', size=16), # statement_id
2028+ 'type': fields.char('type', size=16),
2029+ 'reference': fields.char('reference', size=1024),
2030+ 'local_account': fields.char('local_account', size=24),
2031+ 'local_currency': fields.char('local_currency', size=16),
2032+ 'execution_date': fields.date('execution_date'),
2033+ 'effective_date': fields.date('effective_date'),
2034+ 'remote_account': fields.char('remote_account', size=24),
2035+ 'remote_currency': fields.char('remote_currency', size=16),
2036+ 'exchange_rate': fields.float('exchange_rate'),
2037+ 'transferred_amount': fields.float('transferred_amount'),
2038+ 'message': fields.char('message', size=1024),
2039+ 'remote_owner': fields.char('remote_owner', size=24),
2040+ 'remote_owner_address': fields.char('remote_owner_address', size=24),
2041+ 'remote_owner_city': fields.char('remote_owner_city', size=24),
2042+ 'remote_owner_postalcode': fields.char('remote_owner_postalcode', size=24),
2043+ 'remote_owner_country_code': fields.char('remote_owner_country_code', size=24),
2044+ 'remote_owner_custno': fields.char('remote_owner_custno', size=24),
2045+ 'remote_bank_bic': fields.char('remote_bank_bic', size=24),
2046+ 'remote_bank_bei': fields.char('remote_bank_bei', size=24),
2047+ 'remote_bank_ibei': fields.char('remote_bank_ibei', size=24),
2048+ 'remote_bank_eangl': fields.char('remote_bank_eangln', size=24),
2049+ 'remote_bank_chips_uid': fields.char('remote_bank_chips_uid', size=24),
2050+ 'remote_bank_duns': fields.char('remote_bank_duns', size=24),
2051+ 'remote_bank_tax_id': fields.char('remote_bank_tax_id', size=24),
2052+ 'provision_costs': fields.float('provision_costs', size=24),
2053+ 'provision_costs_currency': fields.char('provision_costs_currency', size=64),
2054+ 'provision_costs_description': fields.char('provision_costs_description', size=24),
2055+ 'error_message': fields.char('error_message', size=1024),
2056+ 'storno_retry': fields.boolean('storno_retry'),
2057+ # end of mem_bank_transaction_fields
2058+ 'bank_country_code': fields.char(
2059+ 'Bank country code', size=2,
2060+ help=("Fallback default country for new partner records, "
2061+ "as defined by the import parser"),
2062+ readonly=True,),
2063+ 'company_id': fields.many2one(
2064+ 'res.company', 'Company', required=True),
2065+ 'duplicate': fields.boolean('duplicate'),
2066+ 'statement_line_id': fields.many2one(
2067+ 'account.bank.statement.line', 'Statement line',
2068+ ondelete='CASCADE'),
2069+ 'statement_id': fields.many2one(
2070+ 'account.bank.statement', 'Statement'),
2071+ 'parent_id': fields.many2one(
2072+ 'banking.import.transaction', 'Split off from this transaction'),
2073+ # match fields
2074+ 'match_type': fields.selection(
2075+ [('manual', 'Manual'), ('move','Move'), ('invoice', 'Invoice'),
2076+ ('payment', 'Payment'), ('payment_order', 'Payment order'),
2077+ ('storno', 'Storno')],
2078+ 'Match type'),
2079+ 'match_multi': fields.function(
2080+ _get_match_multi, method=True, string='Multi match',
2081+ type='boolean'),
2082+ 'payment_order_ids': fields.many2many(
2083+ 'payment.order', 'banking_transaction_payment_order_rel',
2084+ 'order_id', 'transaction_id', 'Payment orders'),
2085+ 'payment_order_id': fields.many2one(
2086+ 'payment.order', 'Payment order to reconcile'),
2087+ 'move_line_ids': fields.many2many(
2088+ 'account.move.line', 'banking_transaction_move_line_rel',
2089+ 'move_line_id', 'transaction_id', 'Matching entries'),
2090+ 'move_line_id': fields.many2one(
2091+ 'account.move.line', 'Entry to reconcile'),
2092+ 'payment_line_id': fields.many2one('payment.line', 'Payment line'),
2093+ 'invoice_ids': fields.many2many(
2094+ 'account.invoice', 'banking_transaction_invoice_rel',
2095+ 'invoice_id', 'transaction_id', 'Matching invoices'),
2096+ 'invoice_id': fields.many2one(
2097+ 'account.invoice', 'Invoice to reconcile'),
2098+ 'payment_line_id': fields.many2one('payment.line', 'Payment line'),
2099+ 'residual': fields.function(
2100+ _get_residual, method=True, string='Residual', type='float'),
2101+ 'writeoff_account_id': fields.many2one(
2102+ 'account.account', 'Write-off account',
2103+ domain=[('type', '!=', 'view')]),
2104+ 'writeoff_journal_id': fields.many2one(
2105+ 'account.journal', 'Write-off journal'),
2106+ 'writeoff_move_line_id': fields.many2one(
2107+ 'account.move.line', 'Write off move line'),
2108+ }
2109+ _defaults = {
2110+ 'company_id': lambda s,cr,uid,c:
2111+ s.pool.get('res.company')._company_default_get(
2112+ cr, uid, 'bank.import.transaction', context=c),
2113+ }
2114+banking_import_transaction()
2115+
2116+class account_bank_statement_line(osv.osv):
2117+ _inherit = 'account.bank.statement.line'
2118+ _columns = {
2119+ 'import_transaction_id': fields.many2one(
2120+ 'banking.import.transaction',
2121+ 'Import transaction', readonly=True),
2122+ 'match_multi': fields.related(
2123+ 'import_transaction_id', 'match_multi', type='boolean',
2124+ string='Multi match', readonly=True),
2125+ 'residual': fields.related(
2126+ 'import_transaction_id', 'residual', type='float',
2127+ string='Residual'),
2128+ 'duplicate': fields.related(
2129+ 'import_transaction_id', 'duplicate', type='boolean',
2130+ string='Possible duplicate import', readonly=True),
2131+ 'match_type': fields.related(
2132+ 'import_transaction_id', 'match_type', type='selection',
2133+ selection=[('manual', 'Manual'), ('move','Move'),
2134+ ('invoice', 'Invoice'), ('payment', 'Payment'),
2135+ ('payment_order', 'Payment order'),
2136+ ('storno', 'Storno')],
2137+ string='Match type', readonly=True,),
2138+ 'residual': fields.related(
2139+ 'import_transaction_id', 'residual', type='float',
2140+ string='Residual', readonly=True,
2141+ ),
2142+ 'state': fields.selection(
2143+ [('draft', 'Draft'), ('confirmed', 'Confirmed')], 'State',
2144+ readonly=True, required=True),
2145+ 'move_id': fields.many2one(
2146+ 'account.move', 'Move', readonly=True,
2147+ help="The accounting move associated with this line"),
2148+ }
2149+
2150+ _defaults = {
2151+ 'state': 'draft',
2152+ }
2153+
2154+ def match_wizard(self, cr, uid, ids, context=None):
2155+ res = False
2156+ if ids:
2157+ if isinstance(ids, (int, float)):
2158+ ids = [ids]
2159+ if context is None:
2160+ context = {}
2161+ context['statement_line_id'] = ids[0]
2162+ wizard_obj = self.pool.get('banking.transaction.wizard')
2163+ res_id = wizard_obj.create(
2164+ cr, uid, {'statement_line_id': ids[0]}, context=context)
2165+ res = wizard_obj.create_act_window(cr, uid, res_id, context=context)
2166+ return res
2167+
2168+ def confirm(self, cr, uid, ids, context=None):
2169+ # TODO: a confirmed transaction should remove its reconciliation target
2170+ # from other transactions where it is one of multiple candidates or
2171+ # even the proposed reconciliation target.
2172+ statement_obj = self.pool.get('account.bank.statement')
2173+ obj_seq = self.pool.get('ir.sequence')
2174+ import_transaction_obj = self.pool.get('banking.import.transaction')
2175+
2176+ for st_line in self.browse(cr, uid, ids, context):
2177+ if st_line.state != 'draft':
2178+ continue
2179+ if st_line.duplicate:
2180+ raise osv.except_osv(
2181+ _('Bank transfer flagged as duplicate'),
2182+ _("You cannot confirm a bank transfer marked as a "
2183+ "duplicate (%s.%s)") %
2184+ (st_line.statement_id.name, st_line.name,))
2185+ if st_line.analytic_account_id:
2186+ if not st_line.statement_id.journal_id.analytic_journal_id:
2187+ raise osv.except_osv(
2188+ _('No Analytic Journal !'),
2189+ _("You have to define an analytic journal on the '%s' "
2190+ "journal!") % (st_line.statement_id.journal_id.name,))
2191+ if not st_line.amount:
2192+ continue
2193+ if st_line.import_transaction_id:
2194+ import_transaction_obj.reconcile(
2195+ cr, uid, st_line.import_transaction_id.id, context)
2196+
2197+ if not st_line.statement_id.name == '/':
2198+ st_number = st_line.statement_id.name
2199+ else:
2200+ if st_line.statement_id.journal_id.sequence_id:
2201+ c = {'fiscalyear_id':
2202+ st_line.statement_id.period_id.fiscalyear_id.id}
2203+ st_number = obj_seq.get_id(
2204+ cr, uid,
2205+ st_line.statement_id.journal_id.sequence_id.id,
2206+ context=c)
2207+ else:
2208+ st_number = obj_seq.get(cr, uid, 'account.bank.statement')
2209+ statement_obj.write(
2210+ cr, uid, [st_line.statement_id.id],
2211+ {'name': st_number}, context=context)
2212+
2213+ st_line_number = statement_obj.get_next_st_line_number(
2214+ cr, uid, st_number, st_line, context)
2215+ company_currency_id = st_line.statement_id.journal_id.company_id.currency_id.id
2216+ move_id = statement_obj.create_move_from_st_line(
2217+ cr, uid, st_line.id, company_currency_id,
2218+ st_line_number, context)
2219+ self.write(
2220+ cr, uid, st_line.id,
2221+ {'state': 'confirmed', 'move_id': move_id}, context)
2222+ return True
2223+
2224+ def cancel(self, cr, uid, ids, context=None):
2225+ if ids and isinstance(ids, (int, float)):
2226+ ids = [ids]
2227+ account_move_obj = self.pool.get('account.move')
2228+ import_transaction_obj = self.pool.get('banking.import.transaction')
2229+ transaction_cancel_ids = []
2230+ move_unlink_ids = []
2231+ set_draft_ids = []
2232+ # harvest ids for various actions
2233+ for st_line in self.browse(cr, uid, ids, context):
2234+ if st_line.state != 'confirmed':
2235+ continue
2236+ if st_line.statement_id.state != 'draft':
2237+ raise osv.except_osv(
2238+ _("Cannot cancel bank transaction"),
2239+ _("The bank statement that this transaction belongs to has "
2240+ "already been confirmed"))
2241+ if st_line.import_transaction_id:
2242+ transaction_cancel_ids.append(st_line.import_transaction_id.id)
2243+ if st_line.move_id:
2244+ move_unlink_ids.append(st_line.move_id.id)
2245+ else:
2246+ raise osv.except_osv(
2247+ _("Cannot cancel bank transaction"),
2248+ _("Cannot cancel this bank transaction. The information "
2249+ "needed to undo the accounting entries has not been "
2250+ "recorded"))
2251+ set_draft_ids.append(st_line.id)
2252+ # perform actions
2253+ import_transaction_obj.cancel(
2254+ cr, uid, transaction_cancel_ids, context=context)
2255+ account_move_obj.button_cancel(cr, uid, move_unlink_ids, context)
2256+ account_move_obj.unlink(cr, uid, move_unlink_ids, context)
2257+ self.write(
2258+ cr, uid, set_draft_ids, {'state': 'draft'}, context=context)
2259+ return True
2260+account_bank_statement_line()
2261+
2262+class account_bank_statement(osv.osv):
2263+ _inherit = 'account.bank.statement'
2264+
2265+ def _end_balance(self, cursor, user, ids, name, attr, context=None):
2266+ """
2267+ This method taken from account/account_bank_statement.py and
2268+ altered to take the statement line subflow into account
2269+ """
2270+
2271+ res_currency_obj = self.pool.get('res.currency')
2272+ res_users_obj = self.pool.get('res.users')
2273+ res = {}
2274+
2275+ company_currency_id = res_users_obj.browse(cursor, user, user,
2276+ context=context).company_id.currency_id.id
2277+
2278+ statements = self.browse(cursor, user, ids, context=context)
2279+ for statement in statements:
2280+ res[statement.id] = statement.balance_start
2281+ currency_id = statement.currency.id
2282+ for line in statement.move_line_ids:
2283+ if line.debit > 0:
2284+ if line.account_id.id == \
2285+ statement.journal_id.default_debit_account_id.id:
2286+ res[statement.id] += res_currency_obj.compute(cursor,
2287+ user, company_currency_id, currency_id,
2288+ line.debit, context=context)
2289+ else:
2290+ if line.account_id.id == \
2291+ statement.journal_id.default_credit_account_id.id:
2292+ res[statement.id] -= res_currency_obj.compute(cursor,
2293+ user, company_currency_id, currency_id,
2294+ line.credit, context=context)
2295+ if statement.state == 'draft':
2296+ for line in statement.line_ids:
2297+ ### start modifications banking-addons ###
2298+ # res[statement.id] += line.amount
2299+ if line.state == 'draft':
2300+ res[statement.id] += line.amount
2301+ ### end modifications banking-addons ###
2302+
2303+ for r in res:
2304+ res[r] = round(res[r], 2)
2305+ return res
2306+
2307+ def button_confirm_bank(self, cr, uid, ids, context=None):
2308+ """ Inject the statement line workflow here """
2309+ if context is None:
2310+ context = {}
2311+ line_obj = self.pool.get('account.bank.statement.line')
2312+ for st in self.browse(cr, uid, ids, context=context):
2313+ j_type = st.journal_id.type
2314+ if not self.check_status_condition(cr, uid, st.state, journal_type=j_type):
2315+ continue
2316+
2317+ self.balance_check(cr, uid, st.id, journal_type=j_type, context=context)
2318+ if (not st.journal_id.default_credit_account_id) \
2319+ or (not st.journal_id.default_debit_account_id):
2320+ raise osv.except_osv(_('Configuration Error !'),
2321+ _('Please verify that an account is defined in the journal.'))
2322+
2323+ # protect against misguided manual changes
2324+ for line in st.move_line_ids:
2325+ if line.state <> 'valid':
2326+ raise osv.except_osv(_('Error !'),
2327+ _('The account entries lines are not in valid state.'))
2328+
2329+ line_obj.confirm(cr, uid, [line.id for line in st.line_ids], context)
2330+ self.log(cr, uid, st.id, _('Statement %s is confirmed, journal '
2331+ 'items are created.') % (st.name,))
2332+ return self.write(cr, uid, ids, {'state':'confirm'}, context=context)
2333+
2334+ def button_cancel(self, cr, uid, ids, context=None):
2335+ """
2336+ Do nothing but write the state. Delegate all actions to the statement
2337+ line workflow instead.
2338+ """
2339+ self.write(cr, uid, ids, {'state':'draft'}, context=context)
2340+
2341+ _columns = {
2342+ # override this field *only* to replace the
2343+ # function method with the one from this module.
2344+ # Note that it is defined twice, both in
2345+ # account/account_bank_statement.py (without 'store') and
2346+ # account/account_cash_statement.py (with store=True)
2347+
2348+ 'balance_end': fields.function(
2349+ _end_balance, method=True, store=True, string='Balance'),
2350+ }
2351+
2352+account_bank_statement()
2353
2354=== added file 'account_banking/i18n/nl.po'
2355--- account_banking/i18n/nl.po 1970-01-01 00:00:00 +0000
2356+++ account_banking/i18n/nl.po 2012-04-17 10:52:20 +0000
2357@@ -0,0 +1,1773 @@
2358+# Translation of OpenERP Server.
2359+# This file contains the translation of the following modules:
2360+# * account_banking
2361+#
2362+msgid ""
2363+msgstr ""
2364+"Project-Id-Version: OpenERP Server 6.0.3\n"
2365+"Report-Msgid-Bugs-To: stefan@therp.nl\n"
2366+"POT-Creation-Date: 2011-12-26 08:06+0000\n"
2367+"PO-Revision-Date: 2011-12-26 08:06+0000\n"
2368+"Last-Translator: <stefan@therp.nl>\n"
2369+"Language-Team: \n"
2370+"MIME-Version: 1.0\n"
2371+"Content-Type: text/plain; charset=UTF-8\n"
2372+"Content-Transfer-Encoding: \n"
2373+"Plural-Forms: \n"
2374+
2375+#. module: account_banking
2376+#: field:account.bank.statement.line,reconcile_id:0
2377+msgid "Reconciliation"
2378+msgstr "Aflettering"
2379+
2380+#. module: account_banking
2381+#: view:banking.transaction.wizard:0
2382+msgid "Remove duplicate flag"
2383+msgstr "Verwijder kenmerk 'duplicaat'"
2384+
2385+#. module: account_banking
2386+#: field:banking.import.transaction,remote_bank_eangl:0
2387+msgid "remote_bank_eangln"
2388+msgstr "remote_bank_eangln"
2389+
2390+#. module: account_banking
2391+#: field:banking.transaction.wizard,move_line_ids:0
2392+msgid "Entry lines"
2393+msgstr "Boekingsregels"
2394+
2395+#. module: account_banking
2396+#: code:addons/account_banking/wizard/bank_import.py:310
2397+#, python-format
2398+msgid "Number of bank costs invoices created"
2399+msgstr "Aantal bankkosten-facturen aangemaakt"
2400+
2401+#. module: account_banking
2402+#: code:addons/account_banking/account_banking.py:1017
2403+#: code:addons/account_banking/banking_import_transaction.py:632
2404+#: code:addons/account_banking/banking_import_transaction.py:644
2405+#: code:addons/account_banking/banking_import_transaction.py:648
2406+#, python-format
2407+msgid "Cannot unreconcile"
2408+msgstr "Kan niet afletteren"
2409+
2410+#. module: account_banking
2411+#: selection:banking.import.line,transaction_type:0
2412+msgid "Unknown"
2413+msgstr "Onbekend"
2414+
2415+#. module: account_banking
2416+#: code:addons/account_banking/banking_import_transaction.py:950
2417+#, python-format
2418+msgid "Cannot check for duplicate. I can't find myself."
2419+msgstr "Kan niet controleren op duplicaten, ik kan de eigen mutatie niet terugvinden."
2420+
2421+#. module: account_banking
2422+#: code:addons/account_banking/wizard/bank_import.py:298
2423+#, python-format
2424+msgid "Number of errors found"
2425+msgstr "Aantal gevonden fouten"
2426+
2427+#. module: account_banking
2428+#: code:addons/account_banking/wizard/bank_import.py:229
2429+#, python-format
2430+msgid "Statement %(statement_id)s for account %(bank_account)s uses different currency than the defined bank journal."
2431+msgstr "Afschrift %(statement_id)s voor rekening %(bank_account)s gebruikt een andere valuta dan het ingestelde bankboek."
2432+
2433+#. module: account_banking
2434+#: view:account.bank.statement:0
2435+#: view:account.bank.statement.line:0
2436+msgid "Cancel transaction"
2437+msgstr "Transactie annuleren"
2438+
2439+#. module: account_banking
2440+#: view:account.banking.bank.import:0
2441+msgid "Select the processing details:"
2442+msgstr "Selecteer de verwerkingsdetails:"
2443+
2444+#. module: account_banking
2445+#: view:account.bank.statement.line:0
2446+msgid "Group By..."
2447+msgstr "Groepeer op..."
2448+
2449+#. module: account_banking
2450+#: code:addons/account_banking/wizard/bank_import.py:198
2451+#, python-format
2452+msgid "Statements found for unknown account %(bank_account)s"
2453+msgstr "Afschriften gevonden voor onbekende bankrekening %(bank_account)s"
2454+
2455+#. module: account_banking
2456+#: code:addons/account_banking/account_banking.py:1320
2457+#, python-format
2458+msgid "Invalid format"
2459+msgstr "Ongeldig formaat"
2460+
2461+#. module: account_banking
2462+#: field:banking.import.line,banking_import_id:0
2463+msgid "Bank import"
2464+msgstr "Bankimport"
2465+
2466+#. module: account_banking
2467+#: field:banking.import.line,statement_id:0
2468+#: field:banking.import.transaction,statement_id:0
2469+msgid "Statement"
2470+msgstr "Afschrift"
2471+
2472+#. module: account_banking
2473+#: view:account.bank.statement.line:0
2474+msgid "Statement lines"
2475+msgstr "Afschriftregels"
2476+
2477+#. module: account_banking
2478+#: code:addons/account_banking/banking_import_transaction.py:605
2479+#, python-format
2480+msgid "Reconcile payment order not implemented"
2481+msgstr "Afletteren betaalopdracht nog niet geïmplementeerd"
2482+
2483+#. module: account_banking
2484+#: selection:banking.import.line,type:0
2485+msgid "Supplier"
2486+msgstr "Leverancier"
2487+
2488+#. module: account_banking
2489+#: field:payment.line,date_done:0
2490+msgid "Date Confirmed"
2491+msgstr "Datum bevestigd"
2492+
2493+#. module: account_banking
2494+#: field:banking.import.transaction,remote_bank_bic:0
2495+msgid "remote_bank_bic"
2496+msgstr "remote_bank_bic"
2497+
2498+#. module: account_banking
2499+#: field:banking.transaction.wizard,manual_invoice_id:0
2500+msgid "Match this invoice"
2501+msgstr "Match deze factuur"
2502+
2503+#. module: account_banking
2504+#: field:banking.import.transaction,remote_bank_ibei:0
2505+msgid "remote_bank_ibei"
2506+msgstr "remote_bank_ibei"
2507+
2508+#. module: account_banking
2509+#: field:account.banking.account.settings,bank_partner_id:0
2510+msgid "Bank Partner"
2511+msgstr "Relatie bank"
2512+
2513+#. module: account_banking
2514+#: model:ir.model,name:account_banking.model_account_banking_account_settings
2515+msgid "Default Journal for Bank Account"
2516+msgstr "Standaard dagboek voor bankrekening"
2517+
2518+#. module: account_banking
2519+#: field:account.banking.bank.import,file:0
2520+msgid "Statements File"
2521+msgstr "Bankafschriftbestand"
2522+
2523+#. module: account_banking
2524+#: code:addons/account_banking/banking_import_transaction.py:601
2525+#, python-format
2526+msgid "Cannot reconcile: no direct debit order"
2527+msgstr "Kan niet afletteren: geen incasso-opdracht"
2528+
2529+#. module: account_banking
2530+#: code:addons/account_banking/account_banking.py:1321
2531+#, python-format
2532+msgid "The account number has the wrong format for %(country)s"
2533+msgstr "Het rekeningnummer heeft het verkeerde formaat voor %(country)s"
2534+
2535+#. module: account_banking
2536+#: field:account.banking.bank.import,import_id:0
2537+msgid "Import File"
2538+msgstr "Importbestand"
2539+
2540+#. module: account_banking
2541+#: field:banking.import.transaction,move_line_id:0
2542+msgid "Entry to reconcile"
2543+msgstr "Boeking voor afletteren"
2544+
2545+#. module: account_banking
2546+#: field:account.banking.account.settings,company_id:0
2547+#: field:account.banking.bank.import,company:0
2548+#: field:account.banking.imported.file,company_id:0
2549+#: field:banking.import.transaction,company_id:0
2550+msgid "Company"
2551+msgstr "Bedrijf"
2552+
2553+#. module: account_banking
2554+#: selection:account.bank.statement.line,match_type:0
2555+#: field:banking.import.line,payment_order_id:0
2556+#: selection:banking.import.transaction,match_type:0
2557+msgid "Payment order"
2558+msgstr "Betaalopdracht"
2559+
2560+#. module: account_banking
2561+#: field:banking.import.transaction,parent_id:0
2562+msgid "Split off from this transaction"
2563+msgstr "Afsplitsen"
2564+
2565+#. module: account_banking
2566+#: field:account.bank.statement.line,residual:0
2567+#: field:banking.import.transaction,residual:0
2568+#: field:banking.transaction.wizard,residual:0
2569+msgid "Residual"
2570+msgstr "Restbedrag"
2571+
2572+#. module: account_banking
2573+#: field:account.bank.statement.line,invoice_id:0
2574+msgid "Linked Invoice"
2575+msgstr "Gerelateerde factuur"
2576+
2577+#. module: account_banking
2578+#: code:addons/account_banking/wizard/banktools.py:107
2579+#, python-format
2580+msgid "Bank account %(account_no)s was not found in the database"
2581+msgstr "Bankrekening %(account_no)s niet gevonden in de database"
2582+
2583+#. module: account_banking
2584+#: selection:account.banking.bank.import,state:0
2585+msgid "init"
2586+msgstr "init"
2587+
2588+#. module: account_banking
2589+#: field:banking.import.transaction,transferred_amount:0
2590+msgid "transferred_amount"
2591+msgstr "transferred_amount"
2592+
2593+#. module: account_banking
2594+#: model:ir.actions.act_window,name:account_banking.action_bank_statement_line_tree
2595+#: model:ir.ui.menu,name:account_banking.menu_bank_statement_line_tree
2596+msgid "Bank Transactions"
2597+msgstr "Bankmutaties"
2598+
2599+#. module: account_banking
2600+#: code:addons/account_banking/banking_import_transaction.py:1676
2601+#, python-format
2602+msgid "You cannot confirm a bank transfer marked as a duplicate (%s.%s)"
2603+msgstr "Een bankmutatie gemarkeerd als duplicaat kan niet worden bevestigd (%s.%s)"
2604+
2605+#. module: account_banking
2606+#: field:banking.import.line,statement_line_id:0
2607+msgid "Resulting statement line"
2608+msgstr "Bankafschriftregel"
2609+
2610+#. module: account_banking
2611+#: field:banking.import.transaction,invoice_ids:0
2612+#: field:banking.transaction.wizard,invoice_ids:0
2613+msgid "Matching invoices"
2614+msgstr "Gematchte facturen"
2615+
2616+#. module: account_banking
2617+#: code:addons/account_banking/account_banking.py:1435
2618+#, python-format
2619+msgid "Free Reference"
2620+msgstr "Vrije referentie"
2621+
2622+#. module: account_banking
2623+#: field:banking.import.line,reconcile_id:0
2624+msgid "Reconciliaton"
2625+msgstr "Aflettering"
2626+
2627+#. module: account_banking
2628+#: field:banking.import.transaction,execution_date:0
2629+msgid "execution_date"
2630+msgstr "execution_date"
2631+
2632+#. module: account_banking
2633+#: field:banking.import.line,account_id:0
2634+msgid "Account"
2635+msgstr "Grootboekrekening"
2636+
2637+#. module: account_banking
2638+#: view:banking.transaction.wizard:0
2639+msgid "Current match"
2640+msgstr "Huidige match"
2641+
2642+#. module: account_banking
2643+#: field:account.banking.account.settings,invoice_journal_id:0
2644+msgid "Costs Journal"
2645+msgstr "Kostendagboek"
2646+
2647+#. module: account_banking
2648+#: field:banking.import.transaction,remote_currency:0
2649+msgid "remote_currency"
2650+msgstr "remote_currency"
2651+
2652+#. module: account_banking
2653+#: code:addons/account_banking/wizard/bank_import.py:300
2654+#, python-format
2655+msgid "Number of statements skipped due to errors"
2656+msgstr "Aantal afschriften overgeslagen door fouten"
2657+
2658+#. module: account_banking
2659+#: code:addons/account_banking/banking_import_transaction.py:949
2660+#, python-format
2661+msgid "Cannot check for duplicate"
2662+msgstr "Kan niet controleren op duplicaten"
2663+
2664+#. module: account_banking
2665+#: code:addons/account_banking/account_banking.py:1351
2666+#, python-format
2667+msgid "Invalid IBAN account number!"
2668+msgstr "Ongeldig IBAN-rekeningnummer"
2669+
2670+#. module: account_banking
2671+#: constraint:account.move.line:0
2672+msgid "You can not create move line on closed account."
2673+msgstr "U kunt geen boekingsregel creëren op een gesloten rekening"
2674+
2675+#. module: account_banking
2676+#: field:banking.import.line,note:0
2677+msgid "Notes"
2678+msgstr "Notities"
2679+
2680+#. module: account_banking
2681+#: selection:banking.import.line,transaction_type:0
2682+msgid "Canceled debit order"
2683+msgstr "Geannuleerde incasso-opdracht"
2684+
2685+#. module: account_banking
2686+#: field:banking.import.transaction,writeoff_journal_id:0
2687+#: field:banking.transaction.wizard,writeoff_journal_id:0
2688+msgid "Write-off journal"
2689+msgstr "Dagboek afschrijvingen"
2690+
2691+#. module: account_banking
2692+#: view:account.banking.account.settings:0
2693+msgid "Default Import Settings for Bank Account"
2694+msgstr "Standaardinstellingen bankrekening voor import"
2695+
2696+#. module: account_banking
2697+#: field:banking.import.line,amount:0
2698+#: field:banking.transaction.wizard,amount:0
2699+msgid "Amount"
2700+msgstr "Bedrag"
2701+
2702+#. module: account_banking
2703+#: code:addons/account_banking/banking_import_transaction.py:704
2704+#, python-format
2705+msgid "Line id not found"
2706+msgstr "Regel id niet gevonden"
2707+
2708+#. module: account_banking
2709+#: field:account.bank.statement.line,match_type:0
2710+#: field:banking.import.transaction,match_type:0
2711+#: field:banking.transaction.wizard,match_type:0
2712+msgid "Match type"
2713+msgstr "Matchtype"
2714+
2715+#. module: account_banking
2716+#: help:banking.import.transaction,bank_country_code:0
2717+msgid "Fallback default country for new partner records, as defined by the import parser"
2718+msgstr "Achtervang-standaardland voor nieuwe relaties, zoals ingegeven door de invoerparser"
2719+
2720+#. module: account_banking
2721+#: sql_constraint:account.move.line:0
2722+msgid "Wrong credit or debit value in accounting entry !"
2723+msgstr "Verkeerde debet of credit waarde in boekingsregel!"
2724+
2725+#. module: account_banking
2726+#: field:banking.import.transaction,remote_bank_chips_uid:0
2727+msgid "remote_bank_chips_uid"
2728+msgstr "remote_bank_chips_uid"
2729+
2730+#. module: account_banking
2731+#: field:banking.import.transaction,writeoff_account_id:0
2732+#: field:banking.transaction.wizard,writeoff_account_id:0
2733+msgid "Write-off account"
2734+msgstr "Grootboekrekening afschrijven"
2735+
2736+#. module: account_banking
2737+#: selection:payment.line,export_state:0
2738+msgid "Cancelled"
2739+msgstr "Geannuleerd"
2740+
2741+#. module: account_banking
2742+#: view:account.banking.bank.import:0
2743+#: view:account.banking.imported.file:0
2744+#: field:account.banking.imported.file,statement_ids:0
2745+msgid "Statements"
2746+msgstr "Afschriften"
2747+
2748+#. module: account_banking
2749+#: field:banking.transaction.wizard,payment_line_id:0
2750+msgid "Matching payment or storno"
2751+msgstr "Gevonden betaling of storno"
2752+
2753+#. module: account_banking
2754+#: code:addons/account_banking/wizard/bank_import.py:128
2755+#, python-format
2756+msgid "Unable to import parser %(parser)s. Parser class not found."
2757+msgstr "Niet in staat parser %(parser)s te importeren. Parser class niet gevonden."
2758+
2759+#. module: account_banking
2760+#: model:ir.model,name:account_banking.model_account_bank_statement_line
2761+msgid "Bank Statement Line"
2762+msgstr "Bankafschriftregel"
2763+
2764+#. module: account_banking
2765+#: field:account.bank.statement.line,duplicate:0
2766+msgid "Possible duplicate import"
2767+msgstr "Mogelijke dubbele import"
2768+
2769+#. module: account_banking
2770+#: field:banking.import.line,ref:0
2771+msgid "Reference"
2772+msgstr "Referentie"
2773+
2774+#. module: account_banking
2775+#: code:addons/account_banking/account_banking.py:444
2776+#, python-format
2777+msgid "Journal Item \"%s\" is not valid"
2778+msgstr "Journaalpost \"%s\" is niet geldig"
2779+
2780+#. module: account_banking
2781+#: field:account.banking.account.settings,default_debit_account_id:0
2782+msgid "Default debit account"
2783+msgstr "Standaard debetrekening"
2784+
2785+#. module: account_banking
2786+#: selection:account.bank.statement.line,match_type:0
2787+#: field:account.bank.statement.line,move_id:0
2788+#: selection:banking.import.transaction,match_type:0
2789+msgid "Move"
2790+msgstr "Boeking"
2791+
2792+#. module: account_banking
2793+#: code:addons/account_banking/wizard/banktools.py:307
2794+#: code:addons/account_banking/wizard/banktools.py:397
2795+#, python-format
2796+msgid "Unknown Bank"
2797+msgstr "Onbekende bank"
2798+
2799+#. module: account_banking
2800+#: selection:banking.import.line,transaction_type:0
2801+msgid "Invoice payment"
2802+msgstr "Factuurbetaling"
2803+
2804+#. module: account_banking
2805+#: code:addons/account_banking/banking_import_transaction.py:1673
2806+#, python-format
2807+msgid "Bank transfer flagged as duplicate"
2808+msgstr "Bankmutatie is gemarkeerd als duplicaat"
2809+
2810+#. module: account_banking
2811+#: field:banking.import.transaction,writeoff_move_line_id:0
2812+msgid "Write off move line"
2813+msgstr "Boekingsregel afschrijving"
2814+
2815+#. module: account_banking
2816+#: field:banking.transaction.wizard,duplicate:0
2817+msgid "Flagged as duplicate"
2818+msgstr "Duplicaat gesignaleerd"
2819+
2820+#. module: account_banking
2821+#: view:banking.transaction.wizard:0
2822+#: model:ir.model,name:account_banking.model_banking_transaction_wizard
2823+msgid "Match transaction"
2824+msgstr "Match deze mutatie"
2825+
2826+#. module: account_banking
2827+#: sql_constraint:payment.line:0
2828+msgid "The payment line name must be unique!"
2829+msgstr "De betaalregelnaam moet uniek zijn!"
2830+
2831+#. module: account_banking
2832+#: code:addons/account_banking/account_banking.py:1309
2833+#, python-format
2834+msgid "The account number appears to be invalid for %(country)s"
2835+msgstr "Het bankrekeningnummer lijkt ongeldig te zijn voor %(country)s"
2836+
2837+#. module: account_banking
2838+#: code:addons/account_banking/banking_import_transaction.py:633
2839+#, python-format
2840+msgid "Cannot unreconcile: this operation is not yet supported for match type 'payment'"
2841+msgstr "Kan niet afletteren: deze bewerking wordt noge niet ondersteund voor matches van het type 'betaling'"
2842+
2843+#. module: account_banking
2844+#: field:banking.import.line,partner_id:0
2845+msgid "Partner"
2846+msgstr "Relatie"
2847+
2848+#. module: account_banking
2849+#: field:account.banking.imported.file,date:0
2850+msgid "Import Date"
2851+msgstr "Importdatum"
2852+
2853+#. module: account_banking
2854+#: field:payment.mode.type,suitable_bank_types:0
2855+msgid "Suitable bank types"
2856+msgstr "Geschikte banktypen"
2857+
2858+#. module: account_banking
2859+#: view:banking.transaction.wizard:0
2860+msgid "Select"
2861+msgstr "Selecteer"
2862+
2863+#. module: account_banking
2864+#: model:ir.model,name:account_banking.model_account_banking_bank_import
2865+msgid "account.banking.bank.import"
2866+msgstr "account.banking.bank.import"
2867+
2868+#. module: account_banking
2869+#: field:banking.import.transaction,remote_bank_bei:0
2870+msgid "remote_bank_bei"
2871+msgstr "remote_bank_bei"
2872+
2873+#. module: account_banking
2874+#: selection:account.bank.statement.line,state:0
2875+#: selection:payment.line,export_state:0
2876+msgid "Confirmed"
2877+msgstr "Bevestigd"
2878+
2879+#. module: account_banking
2880+#: model:ir.actions.act_window,name:account_banking.action_account_banking_res_partner_banks
2881+#: model:ir.model,name:account_banking.model_res_partner_bank
2882+#: model:ir.ui.menu,name:account_banking.menu_action_account_banking_bank_accounts
2883+msgid "Bank Accounts"
2884+msgstr "Bankrekeningen"
2885+
2886+#. module: account_banking
2887+#: help:account.bank.statement.line,move_id:0
2888+msgid "The accounting move associated with this line"
2889+msgstr "Boeking nav. deze regel"
2890+
2891+#. module: account_banking
2892+#: view:account.banking.account.settings:0
2893+msgid "Default Accounts for Unknown Movements"
2894+msgstr "Standaard grootboekrekening voor onbekende boekingen"
2895+
2896+#. module: account_banking
2897+#: view:account.banking.bank.import:0
2898+msgid "Confirm"
2899+msgstr "Bevestig"
2900+
2901+#. module: account_banking
2902+#: field:account.banking.account.settings,default_credit_account_id:0
2903+msgid "Default credit account"
2904+msgstr "Standaard creditrekening"
2905+
2906+#. module: account_banking
2907+#: field:account.bank.statement.line,period_id:0
2908+#: field:banking.import.line,period_id:0
2909+msgid "Period"
2910+msgstr "Periode"
2911+
2912+#. module: account_banking
2913+#: field:banking.import.line,transaction_type:0
2914+msgid "Transaction type"
2915+msgstr "Mutatietype"
2916+
2917+#. module: account_banking
2918+#: field:account.bank.statement.line,state:0
2919+#: field:account.banking.bank.import,state:0
2920+#: field:account.banking.imported.file,state:0
2921+#: field:payment.line,export_state:0
2922+msgid "State"
2923+msgstr "Status"
2924+
2925+#. module: account_banking
2926+#: field:account.bank.statement.line,trans:0
2927+msgid "Bank Transaction ID"
2928+msgstr "Bankmutatie ID"
2929+
2930+#. module: account_banking
2931+#: model:ir.model,name:account_banking.model_payment_mode
2932+msgid "Payment Mode"
2933+msgstr "Betaalmodus"
2934+
2935+#. module: account_banking
2936+#: view:banking.transaction.wizard:0
2937+msgid "Match again"
2938+msgstr "Match nogmaals"
2939+
2940+#. module: account_banking
2941+#: help:account.banking.account.settings,invoice_journal_id:0
2942+msgid "This is the journal used to create invoices for bank costs."
2943+msgstr "Het dagboek om facturen aan te maken voor bankkosten."
2944+
2945+#. module: account_banking
2946+#: selection:banking.import.line,type:0
2947+msgid "General"
2948+msgstr "Algemeen"
2949+
2950+#. module: account_banking
2951+#: field:banking.import.line,type:0
2952+msgid "Type"
2953+msgstr "Type"
2954+
2955+#. module: account_banking
2956+#: code:addons/account_banking/wizard/bank_import.py:251
2957+#, python-format
2958+msgid "Statement %(id)s known - skipped"
2959+msgstr "Afschrift %(id)s al bekend - overgeslagen"
2960+
2961+#. module: account_banking
2962+#: view:banking.transaction.wizard:0
2963+msgid "If the amount exceeds the match, you must set a write-off account and journal for the residual of this reconciliation. If the amount is smaller than the match, this is optional. If you do not set a write-off account in this case, the result will be a partial reconciliation."
2964+msgstr "Als het bedrag van de mutatie de gevonden match overschrijdt, moet er een grootboekrekening en een dagboek worden opgegeven om het restbedrag van de aflettering af te schrijven. Dit is optioneel als het bedrag van de mutatie kleiner is dan de gevonden match. Als u in dit geval geen afschrijving mogelijk maakt, zal het systeem een gedeeltelijke aflettering aanmaken."
2965+
2966+#. module: account_banking
2967+#: field:banking.transaction.wizard,move_line_id:0
2968+msgid "Entry line"
2969+msgstr "Boekingsregel"
2970+
2971+#. module: account_banking
2972+#: selection:banking.import.line,transaction_type:0
2973+msgid "Payment from a payment order"
2974+msgstr "Betaling uit een betaalopdracht"
2975+
2976+#. module: account_banking
2977+#: code:addons/account_banking/banking_import_transaction.py:1732
2978+#: code:addons/account_banking/banking_import_transaction.py:1741
2979+#, python-format
2980+msgid "Cannot cancel bank transaction"
2981+msgstr "Kan de bankmutatie niet annuleren"
2982+
2983+#. module: account_banking
2984+#: code:addons/account_banking/account_banking.py:443
2985+#: code:addons/account_banking/banking_import_transaction.py:1818
2986+#, python-format
2987+msgid "Error !"
2988+msgstr "Fout !"
2989+
2990+#. module: account_banking
2991+#: code:addons/account_banking/account_banking.py:1308
2992+#, python-format
2993+msgid "Invalid data"
2994+msgstr "Ongeldige gegevens"
2995+
2996+#. module: account_banking
2997+#: code:addons/account_banking/banking_import_transaction.py:684
2998+#: code:addons/account_banking/banking_import_transaction.py:688
2999+#: code:addons/account_banking/banking_import_transaction.py:703
3000+#, python-format
3001+msgid "Cannot cancel link with storno"
3002+msgstr "Kan de relatie met de storno niet annuleren"
3003+
3004+#. module: account_banking
3005+#: selection:account.banking.bank.import,state:0
3006+msgid "review"
3007+msgstr "review"
3008+
3009+#. module: account_banking
3010+#: selection:payment.line,export_state:0
3011+msgid "Rejected"
3012+msgstr "Verworpen"
3013+
3014+#. module: account_banking
3015+#: model:ir.actions.act_window,name:account_banking.action_account_banking_journals
3016+#: model:ir.ui.menu,name:account_banking.menu_action_account_banking_bank_journals
3017+msgid "Default Import Settings for Bank Accounts"
3018+msgstr "Standaardinstellingen bankrekeningen voor import"
3019+
3020+#. module: account_banking
3021+#: model:ir.actions.act_window,name:account_banking.act_account_banking_import_wizard
3022+#: model:ir.actions.act_window,name:account_banking.wizard_account_banking_import_file
3023+#: model:ir.ui.menu,name:account_banking.menu_account_banking_import_wizard
3024+msgid "Import Bank Statements File"
3025+msgstr "Importeer bankafschriftbestand"
3026+
3027+#. module: account_banking
3028+#: help:account.banking.bank.import,file:0
3029+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"
3030+"\n"
3031+"To stay on the safe side, always load bank statements files using the same format."
3032+msgstr "Het bankafschriftbestand dat geïmporteerd dient te worden. De verschillende bankformaten gaan verschillend om met de situatie waarin hetzelfde bestand meerdere keren wordt geïmporteerd.\n"
3033+"\n"
3034+"Het is daarom in ieder geval aan te raden om de bankafschriften altijd in hetzelfde formaat te importeren."
3035+
3036+#. module: account_banking
3037+#: view:account.bank.statement:0
3038+#: view:account.bank.statement.line:0
3039+#: view:banking.transaction.wizard:0
3040+msgid "Match"
3041+msgstr "Match"
3042+
3043+#. module: account_banking
3044+#: field:banking.import.transaction,payment_line_id:0
3045+msgid "Payment line"
3046+msgstr "Betaling"
3047+
3048+#. module: account_banking
3049+#: field:banking.import.transaction,payment_order_id:0
3050+#: field:banking.transaction.wizard,payment_order_id:0
3051+msgid "Payment order to reconcile"
3052+msgstr "Betaalopdracht ter aflettering"
3053+
3054+#. module: account_banking
3055+#: code:addons/account_banking/banking_import_transaction.py:1742
3056+#, python-format
3057+msgid "Cannot cancel this bank transaction. The information needed to undo the accounting entries has not been recorded"
3058+msgstr "Kan de bankmutatie niet annuleren. De benodigde informatie om de boekingen teniet te doen is niet beschikbaar"
3059+
3060+#. module: account_banking
3061+#: view:banking.transaction.wizard:0
3062+msgid "Duplicate flag"
3063+msgstr "Duplicaatkenmerk"
3064+
3065+#. module: account_banking
3066+#: code:addons/account_banking/banking_import_transaction.py:461
3067+#, python-format
3068+msgid "Entry is already reconciled"
3069+msgstr "Boeking is al afgeletterd"
3070+
3071+#. module: account_banking
3072+#: view:account.banking.bank.import:0
3073+msgid "Transaction"
3074+msgstr "Mutatie"
3075+
3076+#. module: account_banking
3077+#: code:addons/account_banking/account_banking.py:1282
3078+#, python-format
3079+msgid "Insufficient data to select online conversion database"
3080+msgstr "Onvoldoende gegevens om een online conversiebestand te selecteren"
3081+
3082+#. module: account_banking
3083+#: field:account.banking.bank.import,statement_ids:0
3084+#: view:account.banking.imported.file:0
3085+msgid "Imported Bank Statements"
3086+msgstr "Geïmporteerde bankafschriften"
3087+
3088+#. module: account_banking
3089+#: selection:payment.mode.type,payment_order_type:0
3090+#: selection:payment.order,payment_order_type:0
3091+msgid "Direct debit"
3092+msgstr "Incasso-opdracht"
3093+
3094+#. module: account_banking
3095+#: model:ir.model,name:account_banking.model_banking_import_transaction
3096+msgid "Bank import transaction"
3097+msgstr "Geïmporteerde bankmutatie"
3098+
3099+#. module: account_banking
3100+#: model:ir.module.module,description:account_banking.module_meta_information
3101+msgid "\n"
3102+" Module to do banking.\n"
3103+"\n"
3104+" Note: This module is depending on BeautifulSoup.\n"
3105+"\n"
3106+" This modules tries to combine all current banking import and export\n"
3107+" schemes. Rationale for this is that it is quite common to have foreign\n"
3108+" bank account numbers next to national bank account numbers. The current\n"
3109+" approach, which hides the national banking interface schemes in the\n"
3110+" l10n_xxx modules, makes it very difficult to use these simultanious.\n"
3111+" A more banking oriented approach seems more logical and cleaner.\n"
3112+"\n"
3113+" Changes to default OpenERP:\n"
3114+"\n"
3115+" * Puts focus on the real life messaging with banks:\n"
3116+" + Bank statement lines upgraded to independent bank transactions.\n"
3117+" + Banking statements have no special accountancy meaning, they're just\n"
3118+" message envelopes for a number of bank transactions.\n"
3119+" + Bank statements can be either encoded by hand to reflect the document\n"
3120+" version of Bank Statements, or created as an optional side effect of\n"
3121+" importing Bank Transactions.\n"
3122+"\n"
3123+" * Preparations for SEPA:\n"
3124+" + IBAN accounts are the standard in the SEPA countries\n"
3125+" + local accounts are derived from SEPA (excluding Turkey) but are\n"
3126+" considered to be identical to the corresponding SEPA account.\n"
3127+" + Banks are identified with either Country + Bank code + Branch code or BIC\n"
3128+" + Each bank can have its own pace in introducing SEPA into their\n"
3129+" communication with their customers.\n"
3130+" + National online databases can be used to convert BBAN's to IBAN's.\n"
3131+" + The SWIFT database is consulted for bank information.\n"
3132+"\n"
3133+" * Adds dropin extensible import facility for bank communication in:\n"
3134+" - Drop-in input parser development.\n"
3135+" - MultiBank (NL) format transaction files available as\n"
3136+" account_banking_nl_multibank,\n"
3137+"\n"
3138+" * Extends payments for digital banking:\n"
3139+" + Adapted workflow in payments to reflect banking operations\n"
3140+" + Relies on account_payment mechanics to extend with export generators.\n"
3141+" - ClieOp3 (NL) payment and direct debit orders files available as\n"
3142+" account_banking_nl_clieop\n"
3143+"\n"
3144+" * Additional features for the import/export mechanism:\n"
3145+" + Automatic matching and creation of bank accounts, banks and partners,\n"
3146+" during import of statements.\n"
3147+" + Automatic matching with invoices and payments.\n"
3148+" + Sound import mechanism, allowing multiple imports of the same\n"
3149+" transactions repeated over multiple files.\n"
3150+" + Journal configuration per bank account.\n"
3151+" + Business logic and format parsing strictly separated to ease the\n"
3152+" development of new parsers.\n"
3153+" + No special configuration needed for the parsers, new parsers are\n"
3154+" recognized and made available at server (re)start.\n"
3155+" "
3156+msgstr "\n"
3157+" Module to do banking.\n"
3158+"\n"
3159+" Note: This module is depending on BeautifulSoup.\n"
3160+"\n"
3161+" This modules tries to combine all current banking import and export\n"
3162+" schemes. Rationale for this is that it is quite common to have foreign\n"
3163+" bank account numbers next to national bank account numbers. The current\n"
3164+" approach, which hides the national banking interface schemes in the\n"
3165+" l10n_xxx modules, makes it very difficult to use these simultanious.\n"
3166+" A more banking oriented approach seems more logical and cleaner.\n"
3167+"\n"
3168+" Changes to default OpenERP:\n"
3169+"\n"
3170+" * Puts focus on the real life messaging with banks:\n"
3171+" + Bank statement lines upgraded to independent bank transactions.\n"
3172+" + Banking statements have no special accountancy meaning, they're just\n"
3173+" message envelopes for a number of bank transactions.\n"
3174+" + Bank statements can be either encoded by hand to reflect the document\n"
3175+" version of Bank Statements, or created as an optional side effect of\n"
3176+" importing Bank Transactions.\n"
3177+"\n"
3178+" * Preparations for SEPA:\n"
3179+" + IBAN accounts are the standard in the SEPA countries\n"
3180+" + local accounts are derived from SEPA (excluding Turkey) but are\n"
3181+" considered to be identical to the corresponding SEPA account.\n"
3182+" + Banks are identified with either Country + Bank code + Branch code or BIC\n"
3183+" + Each bank can have its own pace in introducing SEPA into their\n"
3184+" communication with their customers.\n"
3185+" + National online databases can be used to convert BBAN's to IBAN's.\n"
3186+" + The SWIFT database is consulted for bank information.\n"
3187+"\n"
3188+" * Adds dropin extensible import facility for bank communication in:\n"
3189+" - Drop-in input parser development.\n"
3190+" - MultiBank (NL) format transaction files available as\n"
3191+" account_banking_nl_multibank,\n"
3192+"\n"
3193+" * Extends payments for digital banking:\n"
3194+" + Adapted workflow in payments to reflect banking operations\n"
3195+" + Relies on account_payment mechanics to extend with export generators.\n"
3196+" - ClieOp3 (NL) payment and direct debit orders files available as\n"
3197+" account_banking_nl_clieop\n"
3198+"\n"
3199+" * Additional features for the import/export mechanism:\n"
3200+" + Automatic matching and creation of bank accounts, banks and partners,\n"
3201+" during import of statements.\n"
3202+" + Automatic matching with invoices and payments.\n"
3203+" + Sound import mechanism, allowing multiple imports of the same\n"
3204+" transactions repeated over multiple files.\n"
3205+" + Journal configuration per bank account.\n"
3206+" + Business logic and format parsing strictly separated to ease the\n"
3207+" development of new parsers.\n"
3208+" + No special configuration needed for the parsers, new parsers are\n"
3209+" recognized and made available at server (re)start.\n"
3210+" "
3211+
3212+#. module: account_banking
3213+#: selection:account.banking.bank.import,state:0
3214+msgid "error"
3215+msgstr "error"
3216+
3217+#. module: account_banking
3218+#: selection:account.bank.statement.line,match_type:0
3219+#: selection:banking.import.transaction,match_type:0
3220+msgid "Manual"
3221+msgstr "Handmatig"
3222+
3223+#. module: account_banking
3224+#: code:addons/account_banking/banking_import_transaction.py:1733
3225+#, python-format
3226+msgid "The bank statement that this transaction belongs to has already been confirmed"
3227+msgstr "Het bankafschrift waar deze mutatie toe behoort is al bevestigd"
3228+
3229+#. module: account_banking
3230+#: code:addons/account_banking/wizard/bank_import.py:127
3231+#: code:addons/account_banking/wizard/bank_import.py:141
3232+#, python-format
3233+msgid "ERROR!"
3234+msgstr "FOUT!"
3235+
3236+#. module: account_banking
3237+#: view:account.bank.statement.line:0
3238+#: field:account.bank.statement.line,state:0
3239+#: field:account.banking.bank.import,state:0
3240+#: field:account.banking.imported.file,state:0
3241+#: field:payment.line,export_state:0
3242+msgid "State"
3243+msgstr "Staat"
3244+
3245+#. module: account_banking
3246+#: view:account.banking.bank.import:0
3247+msgid "Import Bank Transactions File"
3248+msgstr "Bankmutatiebestand import"
3249+
3250+#. module: account_banking
3251+#: view:payment.order:0
3252+msgid "Make Payments"
3253+msgstr "Maak betalingen"
3254+
3255+#. module: account_banking
3256+#: code:addons/account_banking/wizard/banktools.py:206
3257+#, python-format
3258+msgid "Account %(account_no)s is not owned by %(partner)s"
3259+msgstr "Rekening %(account_no)s is geen eigendom van %(partner)s"
3260+
3261+#. module: account_banking
3262+#: code:addons/account_banking/account_banking.py:1414
3263+#, python-format
3264+msgid "My reference"
3265+msgstr "Mijn referentie"
3266+
3267+#. module: account_banking
3268+#: field:banking.import.transaction,statement_line_id:0
3269+#: field:banking.transaction.wizard,statement_line_id:0
3270+msgid "Statement line"
3271+msgstr "Bankafschriftregel"
3272+
3273+#. module: account_banking
3274+#: field:banking.import.transaction,storno_retry:0
3275+msgid "storno_retry"
3276+msgstr "storno_retry"
3277+
3278+#. module: account_banking
3279+#: view:banking.transaction.wizard:0
3280+msgid "Residual write-off"
3281+msgstr "Afschrijven restbedrag"
3282+
3283+#. module: account_banking
3284+#: field:banking.import.transaction,effective_date:0
3285+msgid "effective_date"
3286+msgstr "effective_date"
3287+
3288+#. module: account_banking
3289+#: view:account.bank.statement.line:0
3290+msgid "Search Bank Transactions "
3291+msgstr "Zoek bankmutaties"
3292+
3293+#. module: account_banking
3294+#: code:addons/account_banking/wizard/banktools.py:179
3295+#, python-format
3296+msgid "More then one possible match found for partner with name %(name)s"
3297+msgstr "Meer dan één mogelijke match gevonden voor partner met naam %(name)s"
3298+
3299+#. module: account_banking
3300+#: field:payment.order,date_sent:0
3301+msgid "Send date"
3302+msgstr "Datum verstuurd"
3303+
3304+#. module: account_banking
3305+#: model:ir.model,name:account_banking.model_payment_mode_type
3306+msgid "Payment Mode Type"
3307+msgstr "Type betaalmodus"
3308+
3309+#. module: account_banking
3310+#: field:banking.import.transaction,remote_bank_tax_id:0
3311+msgid "remote_bank_tax_id"
3312+msgstr "remote_bank_tax_id"
3313+
3314+#. module: account_banking
3315+#: view:account.banking.bank.import:0
3316+#: field:account.banking.bank.import,line_ids:0
3317+msgid "Transactions"
3318+msgstr "Mutaties"
3319+
3320+#. module: account_banking
3321+#: field:account.bank.statement.line,currency:0
3322+#: field:banking.import.line,currency:0
3323+msgid "Currency"
3324+msgstr "Valuta"
3325+
3326+#. module: account_banking
3327+#: field:banking.import.transaction,bank_country_code:0
3328+msgid "Bank country code"
3329+msgstr "Bank country code"
3330+
3331+#. module: account_banking
3332+#: help:payment.mode.type,ir_model_id:0
3333+msgid "Select the Payment Wizard for payments of this type. Leave empty for manual processing"
3334+msgstr "Selecteer de wizard voor het verwerken van betalingen van dit type. Laat leeg voor handmatige verwerking."
3335+
3336+#. module: account_banking
3337+#: field:payment.line,msg:0
3338+msgid "Message"
3339+msgstr "Boodschap"
3340+
3341+#. module: account_banking
3342+#: field:banking.transaction.wizard,match_multi:0
3343+msgid "Multiple matches"
3344+msgstr "Meerdere matches"
3345+
3346+#. module: account_banking
3347+#: view:account.banking.bank.import:0
3348+#: field:account.banking.bank.import,log:0
3349+msgid "Log"
3350+msgstr "Log"
3351+
3352+#. module: account_banking
3353+#: code:addons/account_banking/banking_import_transaction.py:553
3354+#, python-format
3355+msgid "Cannot link transaction %s with accounting entry"
3356+msgstr "Kan mutatie %s niet koppelen aan een journaalboeking"
3357+
3358+#. module: account_banking
3359+#: code:addons/account_banking/banking_import_transaction.py:1177
3360+#, python-format
3361+msgid "transaction %(statement_id)s.%(transaction_id)s for account %(bank_account)s uses different currency than the defined bank journal."
3362+msgstr "Mutatie %(statement_id)s.%(transaction_id)s van bankrekening %(bank_account)s gebruikt een andere valuta dan het ingestelde bankboek."
3363+
3364+#. module: account_banking
3365+#: code:addons/account_banking/banking_import_transaction.py:580
3366+#, python-format
3367+msgid "Cannot link with storno"
3368+msgstr "Kan niet koppelen met een storno"
3369+
3370+#. module: account_banking
3371+#: code:addons/account_banking/banking_import_transaction.py:543
3372+#, python-format
3373+msgid "Cannot link transaction %s with invoice"
3374+msgstr "Kan mutatie %s niet koppelen aan een factuur"
3375+
3376+#. module: account_banking
3377+#: selection:account.banking.imported.file,state:0
3378+msgid "Review"
3379+msgstr "Herzien"
3380+
3381+#. module: account_banking
3382+#: field:banking.transaction.wizard,manual_move_line_id:0
3383+msgid "Or match this entry"
3384+msgstr "Of koppel deze boekingsregel"
3385+
3386+#. module: account_banking
3387+#: help:payment.mode.type,name:0
3388+msgid "Payment Type"
3389+msgstr "Betaaltype"
3390+
3391+#. module: account_banking
3392+#: code:addons/account_banking/account_banking.py:1281
3393+#, python-format
3394+msgid "Insufficient data"
3395+msgstr "Onvoldoende gegevens"
3396+
3397+#. module: account_banking
3398+#: field:account.banking.imported.file,file:0
3399+msgid "Raw Data"
3400+msgstr "Ruwe data"
3401+
3402+#. module: account_banking
3403+#: code:addons/account_banking/banking_import_transaction.py:1813
3404+#, python-format
3405+msgid "Please verify that an account is defined in the journal."
3406+msgstr "Er is een standaardrekening niet ingesteld op het dagboek."
3407+
3408+#. module: account_banking
3409+#: code:addons/account_banking/banking_import_transaction.py:649
3410+#, python-format
3411+msgid "Unreconcile payment order not implemented"
3412+msgstr "Unreconcile payment order not implemented"
3413+
3414+#. module: account_banking
3415+#: help:account.banking.account.settings,default_debit_account_id:0
3416+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."
3417+msgstr "De grootboekrekening waarop een onverwachte betaling kan worden geboekt, bijvoorbeeld in het geval van eeen klant die vooruitbetaalt of als er geen overeenkomende factuur kan worden gevonden in het systeem. Merk op dat er voor het bevestigen van de boekingen nog wijzigingen kunnen worden aangebracht."
3418+
3419+#. module: account_banking
3420+#: field:payment.mode.type,payment_order_type:0
3421+#: field:payment.order,payment_order_type:0
3422+msgid "Payment order type"
3423+msgstr "Type betaalopdracht"
3424+
3425+#. module: account_banking
3426+#: code:addons/account_banking/wizard/bank_import.py:296
3427+#, python-format
3428+msgid "Total number of transactions"
3429+msgstr "Totaal aantal transacties"
3430+
3431+#. module: account_banking
3432+#: field:banking.import.transaction,exchange_rate:0
3433+msgid "exchange_rate"
3434+msgstr "exchange_rate"
3435+
3436+#. module: account_banking
3437+#: field:banking.import.line,duplicate:0
3438+msgid "Duplicate"
3439+msgstr "Duplicaat"
3440+
3441+#. module: account_banking
3442+#: code:addons/account_banking/banking_import_transaction.py:1683
3443+#, python-format
3444+msgid "You have to define an analytic journal on the '%s' journal!"
3445+msgstr "Er moet een analytisch journaal worden ingesteld op het '%s' journaal!"
3446+
3447+#. module: account_banking
3448+#: code:addons/account_banking/banking_import_transaction.py:1812
3449+#, python-format
3450+msgid "Configuration Error !"
3451+msgstr "Configuratiefout !"
3452+
3453+#. module: account_banking
3454+#: selection:account.bank.statement.line,state:0
3455+#: selection:payment.line,export_state:0
3456+msgid "Draft"
3457+msgstr "Draft"
3458+
3459+#. module: account_banking
3460+#: view:banking.transaction.wizard:0
3461+msgid "Disable reconciliation"
3462+msgstr "Afletteren ongedaan maken"
3463+
3464+#. module: account_banking
3465+#: model:ir.actions.act_window,name:account_banking.act_account_payment_account_bank_statement
3466+msgid "Bank Statements File"
3467+msgstr "Bankafschriftbestand"
3468+
3469+#. module: account_banking
3470+#: code:addons/account_banking/parsers/models.py:368
3471+#, python-format
3472+msgid "This is a stub. Please implement your own."
3473+msgstr "Dit is een stub. Maak alstublieft uw eigen versie."
3474+
3475+#. module: account_banking
3476+#: field:banking.import.transaction,type:0
3477+msgid "type"
3478+msgstr "type"
3479+
3480+#. module: account_banking
3481+#: view:account.banking.bank.import:0
3482+msgid "Import"
3483+msgstr "Import"
3484+
3485+#. module: account_banking
3486+#: field:banking.import.transaction,message:0
3487+msgid "message"
3488+msgstr "message"
3489+
3490+#. module: account_banking
3491+#: view:account.bank.statement:0
3492+#: view:account.bank.statement.line:0
3493+msgid "Confirm transaction"
3494+msgstr "Bevestig mutatie"
3495+
3496+#. module: account_banking
3497+#: field:banking.import.transaction,provision_costs_currency:0
3498+msgid "provision_costs_currency"
3499+msgstr "provision_costs_currency"
3500+
3501+#. module: account_banking
3502+#: constraint:account.bank.statement.line:0
3503+msgid "The amount of the voucher must be the same amount as the one on the statement line"
3504+msgstr "Het bedrag van de bon moet hetzelfde zijn als die op de bankafschriftregel"
3505+
3506+#. module: account_banking
3507+#: view:banking.transaction.wizard:0
3508+msgid "This bank transfer was marked as a duplicate. You can either confirm that this is not the case, or remove the bank transfer from the system."
3509+msgstr "Deze bankatransactie is gemarkeerd als een duplicaat. U kunt de bankafschriftregel verwijderen uit het systeem als dit het geval is, anders kunt u het kenmerk 'duplicaat' hier verwijderen."
3510+
3511+#. module: account_banking
3512+#: view:account.banking.imported.file:0
3513+#: model:ir.actions.act_window,name:account_banking.action_account_banking_imported_files
3514+#: model:ir.ui.menu,name:account_banking.menu_action_account_banking_imported_files
3515+msgid "Imported Bank Statements Files"
3516+msgstr "Geïmporteerde bankafschriftbestanden"
3517+
3518+#. module: account_banking
3519+#: field:banking.import.line,invoice_ids:0
3520+msgid "unknown"
3521+msgstr "onbekend"
3522+
3523+#. module: account_banking
3524+#: field:banking.import.transaction,remote_bank_duns:0
3525+msgid "remote_bank_duns"
3526+msgstr "remote_bank_duns"
3527+
3528+#. module: account_banking
3529+#: field:banking.import.transaction,duplicate:0
3530+msgid "duplicate"
3531+msgstr "duplicaat"
3532+
3533+#. module: account_banking
3534+#: field:account.bank.statement,banking_id:0
3535+msgid "Imported File"
3536+msgstr "Geïmpoteerd bestand"
3537+
3538+#. module: account_banking
3539+#: selection:banking.import.line,transaction_type:0
3540+msgid "Aggregate payment order"
3541+msgstr "Verzamelde betaalopdracht"
3542+
3543+#. module: account_banking
3544+#: field:banking.import.transaction,remote_owner_custno:0
3545+msgid "remote_owner_custno"
3546+msgstr "remote_owner_custno"
3547+
3548+#. module: account_banking
3549+#: view:account.banking.imported.file:0
3550+#: field:account.banking.imported.file,log:0
3551+msgid "Import Log"
3552+msgstr "Impotlog"
3553+
3554+#. module: account_banking
3555+#: field:banking.import.line,date:0
3556+msgid "Date"
3557+msgstr "Datum"
3558+
3559+#. module: account_banking
3560+#: view:account.banking.account.settings:0
3561+msgid "Generation of Bank Costs Invoices"
3562+msgstr "Gegenereerde bankkostenfacturen"
3563+
3564+#. module: account_banking
3565+#: constraint:account.move.line:0
3566+msgid "Company must be same for its related account and period."
3567+msgstr "Bedrijf moet hetzelfde zijn voor de betreffende rekening en periode."
3568+
3569+#. module: account_banking
3570+#: field:banking.import.transaction,provision_costs:0
3571+msgid "provision_costs"
3572+msgstr "provision_costs"
3573+
3574+#. module: account_banking
3575+#: view:banking.transaction.wizard:0
3576+msgid "You can disable the reconciliation of this bank transfer"
3577+msgstr "U kunt het afletteren van de mutatie ongedaan maken"
3578+
3579+#. module: account_banking
3580+#: field:account.bank.statement.line,import_transaction_id:0
3581+#: field:banking.transaction.wizard,import_transaction_id:0
3582+msgid "Import transaction"
3583+msgstr "Geïmporteerde mutatie"
3584+
3585+#. module: account_banking
3586+#: code:addons/account_banking/wizard/banktools.py:60
3587+#, python-format
3588+msgid "No suitable fiscal year found for date %(date)s and company %(company_name)s"
3589+msgstr "Geen geschikt boekjaar gevonden voor datum %(date)s en bedrijf %(company_name)s"
3590+
3591+#. module: account_banking
3592+#: code:addons/account_banking/wizard/banking_transaction_wizard.py:153
3593+#, python-format
3594+msgid "No entry found for the selected invoice. \" +\n"
3595+" \"Try manual reconciliation."
3596+msgstr "Geen boeking gevonden voor de geselecteerde factuur. \" +\n"
3597+" \"Probeer handmatig af te letteren."
3598+
3599+#. module: account_banking
3600+#: field:banking.import.transaction,error_message:0
3601+msgid "error_message"
3602+msgstr "error_message"
3603+
3604+#. module: account_banking
3605+#: code:addons/account_banking/wizard/banktools.py:82
3606+#, python-format
3607+msgid "Multiple overlapping periods for date %(date)s and company %(company_name)s"
3608+msgstr "Meerdere overlappende periodes gevonden voor datum %(date)s en bedrijf %(company_name)s"
3609+
3610+#. module: account_banking
3611+#: code:addons/account_banking/wizard/bank_import.py:142
3612+#, python-format
3613+msgid "The imported statements appear to be invalid! Check your file."
3614+msgstr "De geïmporteerde afschriften lijken onjuist! Controleer uw bestand."
3615+
3616+#. module: account_banking
3617+#: code:addons/account_banking/wizard/bank_import.py:304
3618+#, python-format
3619+msgid "Number of statements loaded"
3620+msgstr "Aantal geladen afschriften"
3621+
3622+#. module: account_banking
3623+#: code:addons/account_banking/wizard/bank_import.py:302
3624+#, python-format
3625+msgid "Number of transactions skipped due to errors"
3626+msgstr "Aantal overgeslagen transacties als gevolg van fouten"
3627+
3628+#. module: account_banking
3629+#: code:addons/account_banking/banking_import_transaction.py:1822
3630+#, python-format
3631+msgid "Statement %s is confirmed, journal items are created."
3632+msgstr "Afschrift %s is bevestigd, journaalposten worden aangemaakt."
3633+
3634+#. module: account_banking
3635+#: field:banking.import.transaction,statement:0
3636+msgid "statement"
3637+msgstr "statement"
3638+
3639+#. module: account_banking
3640+#: model:ir.ui.menu,name:account_banking.menu_finance_banking_actions
3641+#: model:ir.ui.menu,name:account_banking.menu_finance_banking_settings
3642+msgid "Banking"
3643+msgstr "Bankieren"
3644+
3645+#. module: account_banking
3646+#: help:payment.mode,type:0
3647+msgid "Select the Payment Type for the Payment Mode."
3648+msgstr "Selecteer het type van de betaalmodus."
3649+
3650+#. module: account_banking
3651+#: view:banking.transaction.wizard:0
3652+msgid "You can let the system try to match this bank statement line again after you have made any changes in the database (for instance, add an invoice or a bank account)."
3653+msgstr "Laat de mutatie opnieuw matchen met de boekingen in het systeem nadat u de nodige wijzigingen in het systeem hebt aangebracht (bijvoorbeeld na het aanmaken van een factuur of het koppelen van een relatie aan een bepaalde bankrekening."
3654+
3655+#. module: account_banking
3656+#: help:payment.mode.type,code:0
3657+msgid "Specify the Code for Payment Type"
3658+msgstr "Geef de code op voor het betaaltype"
3659+
3660+#. module: account_banking
3661+#: selection:account.banking.imported.file,state:0
3662+msgid "Error"
3663+msgstr "Fout"
3664+
3665+#. module: account_banking
3666+#: field:payment.mode.type,ir_model_id:0
3667+msgid "Payment wizard"
3668+msgstr "Betaalwizard"
3669+
3670+#. module: account_banking
3671+#: view:banking.transaction.wizard:0
3672+msgid "Set write-off account"
3673+msgstr "Stel de grootboekrekening in ter afschrijving"
3674+
3675+#. module: account_banking
3676+#: code:addons/account_banking/wizard/banking_transaction_wizard.py:152
3677+#, python-format
3678+msgid "No entry found for the selected invoice"
3679+msgstr "Geen boeking gevonden voor de geselecteerde factuur"
3680+
3681+#. module: account_banking
3682+#: code:addons/account_banking/banking_import_transaction.py:358
3683+#, python-format
3684+msgid "Unable to link transaction id %(trans)s (ref: %(ref)s) to invoice: invoice %(invoice)s was already paid"
3685+msgstr "Kan de mutatie met id %(trans)s (referentie: %(ref)s) niet aan factuur %(invoice)s koppelen, deze is al betaald"
3686+
3687+#. module: account_banking
3688+#: code:addons/account_banking/banking_import_transaction.py:1090
3689+#, python-format
3690+msgid "Cannot perform match on a confirmed transction"
3691+msgstr "Kan geen match uitvoeren op een bevestigde mutatie"
3692+
3693+#. module: account_banking
3694+#: field:banking.import.transaction,invoice_id:0
3695+#: field:banking.transaction.wizard,invoice_id:0
3696+msgid "Invoice to reconcile"
3697+msgstr "Factuur ter aflettering"
3698+
3699+#. module: account_banking
3700+#: code:addons/account_banking/wizard/bank_import.py:294
3701+#, python-format
3702+msgid "Total number of statements"
3703+msgstr "Totaal aantal afschriften"
3704+
3705+#. module: account_banking
3706+#: field:banking.import.transaction,provision_costs_description:0
3707+msgid "provision_costs_description"
3708+msgstr "provision_costs_description"
3709+
3710+#. module: account_banking
3711+#: field:payment.mode.type,code:0
3712+msgid "Code"
3713+msgstr "Code"
3714+
3715+#. module: account_banking
3716+#: view:banking.transaction.wizard:0
3717+msgid "Manual match"
3718+msgstr "Handmatige match"
3719+
3720+#. module: account_banking
3721+#: code:addons/account_banking/account_banking.py:1018
3722+#, python-format
3723+msgid "Cannot unreconcile debit order: \"+\n"
3724+" \"Not implemented."
3725+msgstr "Kan aflettering van een incasso-opdracht niet ongedaa maken: \"+\n"
3726+" \"Niet geïmplementeerd."
3727+
3728+#. module: account_banking
3729+#: view:banking.transaction.wizard:0
3730+msgid "Multiple matches were found for this bank transfer. You must pick one of the matches or select a match manually below."
3731+msgstr "Meerdere overeenkomende boekingen zijn gevonden voor deze mutatie. U moet één van deze boekingen uitkiezen, of de mutatie handmatig matchen verderop in dit formulier."
3732+
3733+#. module: account_banking
3734+#: field:banking.transaction.wizard,payment_order_ids:0
3735+msgid "Matching payment orders"
3736+msgstr "Gekoppelde betaalopdrachten"
3737+
3738+#. module: account_banking
3739+#: view:account.banking.imported.file:0
3740+msgid "Import Details"
3741+msgstr "Importdetails"
3742+
3743+#. module: account_banking
3744+#: field:banking.import.transaction,local_account:0
3745+msgid "local_account"
3746+msgstr "local_account"
3747+
3748+#. module: account_banking
3749+#: field:account.bank.statement.line,international:0
3750+msgid "International Transaction"
3751+msgstr "Internationale mutatie"
3752+
3753+#. module: account_banking
3754+#: model:ir.model,name:account_banking.model_account_bank_statement
3755+msgid "Bank Statement"
3756+msgstr "Bankafschrift"
3757+
3758+#. module: account_banking
3759+#: field:banking.import.transaction,remote_owner_postalcode:0
3760+msgid "remote_owner_postalcode"
3761+msgstr "remote_owner_postalcode"
3762+
3763+#. module: account_banking
3764+#: view:banking.transaction.wizard:0
3765+#: selection:payment.line,export_state:0
3766+msgid "Done"
3767+msgstr "Gereed"
3768+
3769+#. module: account_banking
3770+#: selection:account.bank.statement.line,match_type:0
3771+#: selection:banking.import.transaction,match_type:0
3772+#: model:ir.model,name:account_banking.model_account_invoice
3773+msgid "Invoice"
3774+msgstr "Factuur"
3775+
3776+#. module: account_banking
3777+#: code:addons/account_banking/parsers/models.py:272
3778+#, python-format
3779+msgid "Invalid value for transfer_type"
3780+msgstr "Ongeldige waarde voor transfer_type"
3781+
3782+#. module: account_banking
3783+#: view:payment.order:0
3784+msgid "Select Invoices to Pay"
3785+msgstr "Kies te betalen facturen"
3786+
3787+#. module: account_banking
3788+#: view:account.banking.bank.import:0
3789+msgid "Cancel"
3790+msgstr "Annuleer"
3791+
3792+#. module: account_banking
3793+#: view:account.banking.bank.import:0
3794+msgid "Close"
3795+msgstr "Sluiten"
3796+
3797+#. module: account_banking
3798+#: field:banking.import.transaction,remote_owner_address:0
3799+msgid "remote_owner_address"
3800+msgstr "remote_owner_address"
3801+
3802+#. module: account_banking
3803+#: model:ir.model,name:account_banking.model_account_move_line
3804+msgid "Journal Items"
3805+msgstr "Boekingen"
3806+
3807+#. module: account_banking
3808+#: field:account.banking.imported.file,user_id:0
3809+msgid "Responsible User"
3810+msgstr "Verantwoordelijk gebruiker"
3811+
3812+#. module: account_banking
3813+#: code:addons/account_banking/banking_import_transaction.py:1680
3814+#, python-format
3815+msgid "No Analytic Journal !"
3816+msgstr "Geen analytisch dagboek !"
3817+
3818+#. module: account_banking
3819+#: selection:account.banking.imported.file,state:0
3820+msgid "Unfinished"
3821+msgstr "Niet gereed"
3822+
3823+#. module: account_banking
3824+#: code:addons/account_banking/wizard/banking_transaction_wizard.py:176
3825+#, python-format
3826+msgid "Cannot select for reconcilion"
3827+msgstr "Kan niet selecteren voor afletteren"
3828+
3829+#. module: account_banking
3830+#: code:addons/account_banking/banking_import_transaction.py:1089
3831+#, python-format
3832+msgid "Cannot perform match"
3833+msgstr "Kan de match niet uitvoeren"
3834+
3835+#. module: account_banking
3836+#: model:ir.model,name:account_banking.model_payment_order
3837+msgid "Payment Order"
3838+msgstr "Betalingsopdracht"
3839+
3840+#. module: account_banking
3841+#: model:ir.module.module,shortdesc:account_banking.module_meta_information
3842+msgid "Account Banking"
3843+msgstr "Account Banking"
3844+
3845+#. module: account_banking
3846+#: code:addons/account_banking/banking_import_transaction.py:781
3847+#, python-format
3848+msgid "Bank transaction %s: write off not implemented for \" +\n"
3849+" \"this match type."
3850+msgstr "Bankmutatie %s: afschrijven niet geïmplementeerd voor \" +\n"
3851+" \"dit matchtype."
3852+
3853+#. module: account_banking
3854+#: code:addons/account_banking/banking_import_transaction.py:645
3855+#, python-format
3856+msgid "Cannot unreconcile: no direct debit order"
3857+msgstr "Kan niet afletteren: geen incasso-opdracht"
3858+
3859+#. module: account_banking
3860+#: code:addons/account_banking/account_banking.py:1352
3861+#: code:addons/account_banking/account_banking.py:1356
3862+#: constraint:res.partner.bank:0
3863+#, python-format
3864+msgid "The IBAN number doesn't seem to be correct"
3865+msgstr "Het IBAN-nummer lijkt niet correct te zijn"
3866+
3867+#. module: account_banking
3868+#: selection:banking.import.line,transaction_type:0
3869+msgid "Bank costs"
3870+msgstr "Bankkosten"
3871+
3872+#. module: account_banking
3873+#: field:account.bank.statement.line,match_multi:0
3874+#: field:banking.import.transaction,match_multi:0
3875+msgid "Multi match"
3876+msgstr "Multimatch"
3877+
3878+#. module: account_banking
3879+#: field:banking.import.transaction,remote_owner_city:0
3880+msgid "remote_owner_city"
3881+msgstr "remote_owner_city"
3882+
3883+#. module: account_banking
3884+#: code:addons/account_banking/banking_import_transaction.py:1142
3885+#, python-format
3886+msgid "Transaction found for unknown account %(bank_account)s"
3887+msgstr "Mutatie gevonden voor onbekende bankrekening %(bank_account)s"
3888+
3889+#. module: account_banking
3890+#: selection:account.banking.bank.import,state:0
3891+msgid "ready"
3892+msgstr "ready"
3893+
3894+#. module: account_banking
3895+#: field:banking.import.transaction,move_line_ids:0
3896+msgid "Matching entries"
3897+msgstr "Overeenkomende boekingsregels"
3898+
3899+#. module: account_banking
3900+#: field:account.banking.bank.import,parser:0
3901+#: field:account.banking.imported.file,format:0
3902+msgid "File Format"
3903+msgstr "Bestandsformaat"
3904+
3905+#. module: account_banking
3906+#: code:addons/account_banking/account_banking.py:922
3907+#, python-format
3908+msgid "You can only combine payment orders of the same type"
3909+msgstr "Alleen betaalopdrachten van hetzelfde type kunnen worden gecombineerd"
3910+
3911+#. module: account_banking
3912+#: code:addons/account_banking/wizard/banktools.py:66
3913+#, python-format
3914+msgid "Multiple overlapping fiscal years found for date %(date)s and company %(company_name)s"
3915+msgstr "Meerdere overlappende boekjaren gevonden voor datum %(date)s en bedrijf %(company_name)s"
3916+
3917+#. module: account_banking
3918+#: field:account.banking.account.settings,journal_id:0
3919+msgid "Journal"
3920+msgstr "Dagboek"
3921+
3922+#. module: account_banking
3923+#: field:account.banking.account.settings,costs_account_id:0
3924+msgid "Bank Costs Account"
3925+msgstr "Grootboekrekening bankkosten"
3926+
3927+#. module: account_banking
3928+#: selection:account.banking.imported.file,state:0
3929+msgid "Finished"
3930+msgstr "Gereed"
3931+
3932+#. module: account_banking
3933+#: selection:payment.line,export_state:0
3934+msgid "Sent"
3935+msgstr "Verstuurd"
3936+
3937+#. module: account_banking
3938+#: model:ir.model,name:account_banking.model_payment_line
3939+msgid "Payment Line"
3940+msgstr "Betaalregel"
3941+
3942+#. module: account_banking
3943+#: view:account.banking.account.settings:0
3944+msgid "Bank Account Details"
3945+msgstr "Details bankrekening"
3946+
3947+#. module: account_banking
3948+#: field:banking.import.transaction,remote_owner_country_code:0
3949+msgid "remote_owner_country_code"
3950+msgstr "remote_owner_country_code"
3951+
3952+#. module: account_banking
3953+#: selection:account.bank.statement.line,match_type:0
3954+#: selection:banking.import.transaction,match_type:0
3955+#: selection:payment.mode.type,payment_order_type:0
3956+#: selection:payment.order,payment_order_type:0
3957+msgid "Payment"
3958+msgstr "Betaling"
3959+
3960+#. module: account_banking
3961+#: model:ir.model,name:account_banking.model_res_bank
3962+msgid "Bank"
3963+msgstr "Bank"
3964+
3965+#. module: account_banking
3966+#: selection:banking.import.line,type:0
3967+msgid "Customer"
3968+msgstr "Klant"
3969+
3970+#. module: account_banking
3971+#: code:addons/account_banking/account_banking.py:1008
3972+#: code:addons/account_banking/banking_import_transaction.py:468
3973+#: code:addons/account_banking/banking_import_transaction.py:600
3974+#: code:addons/account_banking/banking_import_transaction.py:604
3975+#: code:addons/account_banking/banking_import_transaction.py:772
3976+#: code:addons/account_banking/banking_import_transaction.py:780
3977+#, python-format
3978+msgid "Cannot reconcile"
3979+msgstr "Kan niet afletteren"
3980+
3981+#. module: account_banking
3982+#: field:banking.import.line,name:0
3983+#: field:banking.transaction.wizard,name:0
3984+#: field:payment.mode.type,name:0
3985+msgid "Name"
3986+msgstr "Naam"
3987+
3988+#. module: account_banking
3989+#: help:account.banking.account.settings,costs_account_id:0
3990+msgid "The account to use when the bank invoices its own costs. Leave it blank to disable automatic invoice generation on bank costs."
3991+msgstr "De grootboekrekening waarop facturen met bankkosten kunnen worden geboekt. Laat leeg om het genereren van dergelijke facturen uit te schakelen."
3992+
3993+#. module: account_banking
3994+#: code:addons/account_banking/wizard/bank_import.py:206
3995+#, python-format
3996+msgid "Statements found for account %(bank_account)s, but no default journal was defined."
3997+msgstr "Bankafschriften gevonden voor bankrekening %(bank_account)s, maar er is geen standaard dagboek ingesteld."
3998+
3999+#. module: account_banking
4000+#: code:addons/account_banking/wizard/bank_import.py:329
4001+#, python-format
4002+msgid "Review Bank Statements"
4003+msgstr "Inzage bankafschriften"
4004+
4005+#. module: account_banking
4006+#: field:account.bank.statement.line,partner_bank_id:0
4007+#: field:account.banking.account.settings,partner_bank_id:0
4008+#: field:banking.import.line,partner_bank_id:0
4009+msgid "Bank Account"
4010+msgstr "Bankrekening"
4011+
4012+#. module: account_banking
4013+#: code:addons/account_banking/wizard/bank_import.py:306
4014+#, python-format
4015+msgid "Number of transactions loaded"
4016+msgstr "Aantal geladen transacties"
4017+
4018+#. module: account_banking
4019+#: field:banking.import.transaction,payment_order_ids:0
4020+msgid "Payment orders"
4021+msgstr "Betaalopdrachten"
4022+
4023+#. module: account_banking
4024+#: view:banking.transaction.wizard:0
4025+msgid "System match"
4026+msgstr "Automatische match"
4027+
4028+#. module: account_banking
4029+#: code:addons/account_banking/banking_import_transaction.py:581
4030+#: code:addons/account_banking/banking_import_transaction.py:685
4031+#, python-format
4032+msgid "No direct debit order item"
4033+msgstr "Geen onderdeel van een incasso-opdracht"
4034+
4035+#. module: account_banking
4036+#: code:addons/account_banking/banking_import_transaction.py:689
4037+#, python-format
4038+msgid "The direct debit order item is not marked for storno"
4039+msgstr "Dit item uit de incasso-opdracht is niet gemarkeerd als storno"
4040+
4041+#. module: account_banking
4042+#: model:ir.model,name:account_banking.model_payment_order_create
4043+msgid "payment.order.create"
4044+msgstr "payment.order.create"
4045+
4046+#. module: account_banking
4047+#: code:addons/account_banking/account_banking.py:1009
4048+#, python-format
4049+msgid "Cannot reconcile debit order: \"+\n"
4050+" \"Not implemented."
4051+msgstr "Kan een incasso-opdracht niet afletteren: \"+\n"
4052+" \"Niet geïmplementeerd."
4053+
4054+#. module: account_banking
4055+#: field:banking.import.transaction,local_currency:0
4056+msgid "local_currency"
4057+msgstr "local_currency"
4058+
4059+#. module: account_banking
4060+#: field:banking.import.transaction,reference:0
4061+msgid "reference"
4062+msgstr "reference"
4063+
4064+#. module: account_banking
4065+#: model:res.partner.bank.type.field,name:account_banking.bank_acc_number_field
4066+msgid "acc_number"
4067+msgstr "rekeningnummer"
4068+
4069+#. module: account_banking
4070+#: field:payment.mode,type:0
4071+msgid "Payment type"
4072+msgstr "Betaaltype"
4073+
4074+#. module: account_banking
4075+#: code:addons/account_banking/wizard/bank_import.py:308
4076+#, python-format
4077+msgid "Number of transactions matched"
4078+msgstr "Aantal transacties herkend"
4079+
4080+#. module: account_banking
4081+#: field:banking.import.transaction,transaction:0
4082+msgid "transaction"
4083+msgstr "mutatie"
4084+
4085+#. module: account_banking
4086+#: code:addons/account_banking/wizard/banktools.py:200
4087+#, python-format
4088+msgid "More than one bank account was found with the same number %(account_no)s"
4089+msgstr "Meer dan één bankrekening gevonden met hetzelfde rekeningnummer %(account_no)s"
4090+
4091+#. module: account_banking
4092+#: field:banking.import.transaction,remote_account:0
4093+msgid "remote_account"
4094+msgstr "remote_account"
4095+
4096+#. module: account_banking
4097+#: model:ir.model,name:account_banking.model_banking_import_line
4098+msgid "Bank import lines"
4099+msgstr "Bankimportregels"
4100+
4101+#. module: account_banking
4102+#: help:account.banking.account.settings,bank_partner_id:0
4103+msgid "The partner to use for bank costs. Banks are not partners by default. You will most likely have to create one."
4104+msgstr "De relatie te gebruiken op facturen voor bankkosten. Waarschijnlijk moet u een nieuwe relatie aanmaken."
4105+
4106+#. module: account_banking
4107+#: help:account.banking.account.settings,default_credit_account_id:0
4108+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."
4109+msgstr "De grootboekrekening voor het boeken van een overwachte betaling. De rekening wordt gebruikt wanneer er geen bijbehorende boeking kan worden gevonden in het systeem. Merk op dat de boekingen nog kunnen worden aangepast vóór het bevestigen ervan."
4110+
4111+#. module: account_banking
4112+#: model:ir.model,name:account_banking.model_account_banking_imported_file
4113+msgid "Imported Bank Statements File"
4114+msgstr "Geïmporteerd bankafschriftbestand"
4115+
4116+#. module: account_banking
4117+#: field:banking.import.transaction,remote_owner:0
4118+msgid "remote_owner"
4119+msgstr "remote_owner"
4120+
4121+#. module: account_banking
4122+#: selection:account.bank.statement.line,match_type:0
4123+#: selection:banking.import.transaction,match_type:0
4124+msgid "Storno"
4125+msgstr "Storno"
4126+
4127+#. module: account_banking
4128+#: constraint:account.move.line:0
4129+msgid "You can not create move line on view account."
4130+msgstr "U kunt geen boekingsregel creëren op een zichtrekening"
4131
4132=== removed file 'account_banking/i18n/nl_NL.po'
4133--- account_banking/i18n/nl_NL.po 2011-02-15 09:05:56 +0000
4134+++ account_banking/i18n/nl_NL.po 1970-01-01 00:00:00 +0000
4135@@ -1,905 +0,0 @@
4136-# Translation of OpenERP Server.
4137-# This file contains the translation of the following modules:
4138-# * account_banking
4139-#
4140-msgid ""
4141-msgstr ""
4142-"Project-Id-Version: OpenERP Server 5.0.12\n"
4143-"Report-Msgid-Bugs-To: support@openerp.com\n"
4144-"POT-Creation-Date: 2011-02-12 13:17:22+0000\n"
4145-"PO-Revision-Date: 2010-07-16 14:58:26+0000\n"
4146-"Last-Translator: Piueter J. Kersten <p.j.kersten@edusense.nl>\n"
4147-"Language-Team: Dutch\n"
4148-"Language: \n"
4149-"MIME-Version: 1.0\n"
4150-"Content-Type: text/plain; charset=UTF-8\n"
4151-"Content-Transfer-Encoding: 8bit\n"
4152-"Plural-Forms: \n"
4153-
4154-#. module: account_banking
4155-#: code:addons/account_banking/wizard/bank_import.py:0
4156-#, python-format
4157-msgid "Number of bank costs invoices created"
4158-msgstr "Aantal bankkosten-facturen aangemaakt"
4159-
4160-#. module: account_banking
4161-#: wizard_view:account_banking.banking_import,view_error:0
4162-#: wizard_view:account_banking.banking_import,view_statements:0
4163-msgid "Results:"
4164-msgstr "Resultaat:"
4165-
4166-#. module: account_banking
4167-#: code:addons/account_banking/wizard/bank_import.py:0
4168-#, python-format
4169-msgid "Number of errors found"
4170-msgstr "Aantal gevonden fouten"
4171-
4172-#. module: account_banking
4173-#: wizard_view:account_banking.banking_import,init:0
4174-msgid "Select the processing details:"
4175-msgstr "Kies de verwerkings-details:"
4176-
4177-#. module: account_banking
4178-#: code:addons/account_banking/wizard/bank_import.py:0
4179-#, python-format
4180-msgid ""
4181-"Unable to link transaction id %(trans)s (ref: %(ref)s) to invoice: '\n"
4182-" '%(no_candidates)s candidates found; can\'t choose."
4183-msgstr ""
4184-"Niet in staat transactie id %(trans)s (ref: %(ref)s) aan factuur te "
4185-"koppelen: '\n"
4186-" '%(no_candidates)s kandidaten gevonden; kan niet "
4187-"kiezen."
4188-
4189-#. module: account_banking
4190-#: model:ir.model,name:account_banking.model_account_banking_settings
4191-msgid "Settings for the account_banking module"
4192-msgstr "Instellingen voor de account_banking module"
4193-
4194-#. module: account_banking
4195-#: constraint:ir.actions.act_window:0
4196-msgid "Invalid model name in the action definition."
4197-msgstr "Ongeldige naam in actie-definitie."
4198-
4199-#. module: account_banking
4200-#: field:payment.line,date_done:0
4201-msgid "Date Confirmed"
4202-msgstr "Bevestigingsdatum"
4203-
4204-#. module: account_banking
4205-#: wizard_button:account_banking.banking_import,view_statements,open_statements:0
4206-msgid "_View Statements"
4207-msgstr "_Bekijk bankafschriften"
4208-
4209-#. module: account_banking
4210-#: wizard_button:account_banking.banking_import,view_error,end:0
4211-#: wizard_button:account_banking.banking_import,view_statements,end:0
4212-msgid "_Close"
4213-msgstr "_Sluit"
4214-
4215-#. module: account_banking
4216-#: field:account.banking.account.settings,bank_partner_id:0
4217-msgid "Bank Partner"
4218-msgstr "Bank-relatie"
4219-
4220-#. module: account_banking
4221-#: model:ir.model,name:account_banking.model_account_banking_account_settings
4222-msgid "Default Journal for Bank Account"
4223-msgstr "Standaard dagboek voor bankrekening"
4224-
4225-#. module: account_banking
4226-#: wizard_field:account_banking.banking_import,init,file:0
4227-msgid "Statements File"
4228-msgstr "Transactiebestand"
4229-
4230-#. module: account_banking
4231-#: code:addons/account_banking/wizard/banktools.py:0
4232-#, python-format
4233-msgid ""
4234-"More than one bank account was found with the same number %(account_no)s"
4235-msgstr ""
4236-"Meer dan één bankrekening gevonden met hetzelfde rekeningnummer "
4237-"%(account_no)s"
4238-
4239-#. module: account_banking
4240-#: code:addons/account_banking/wizard/bank_import.py:0
4241-#, python-format
4242-msgid "Total number of transactions"
4243-msgstr "Totaal aantal transacties"
4244-
4245-#. module: account_banking
4246-#: code:addons/account_banking/account_banking.py:0
4247-#, python-format
4248-msgid "Account move line \"%s\" is not valid"
4249-msgstr "Boekingsregel \"%s\" is onjuist."
4250-
4251-#. module: account_banking
4252-#: help:account.banking.account.settings,default_debit_account_id:0
4253-msgid ""
4254-"The account to use when an unexpected payment is received. This can be "
4255-"needed when a customer pays in advance or when no matching invoice can be "
4256-"found. Mind that you can correct movements before confirming them."
4257-msgstr ""
4258-"De rekening waarop geboekt moet worden bij onverwachte betalingen. Dit kan "
4259-"nodig zijn als een klant vooruit betaalt of wanneer er geen overeenkomende "
4260-"factuur gevonden kan worden. Merk op dat u altijd boekingen kunt corrigeren "
4261-"voordat u deze bevestigt."
4262-
4263-#. module: account_banking
4264-#: code:addons/account_banking/wizard/banktools.py:0
4265-#, python-format
4266-msgid "Bank account %(account_no)s was not found in the database"
4267-msgstr "Bankrekening %(account_no)s niet gevonden in de database"
4268-
4269-#. module: account_banking
4270-#: view:account.banking.account.settings:0
4271-msgid "Generation of Bank Costs Invoices"
4272-msgstr "Aanmaken van bankkosten-facturen"
4273-
4274-#. module: account_banking
4275-#: code:addons/account_banking/wizard/bank_import.py:0
4276-#, python-format
4277-msgid "Number of transactions skipped due to errors"
4278-msgstr "Aantal overgeslagen transacties als gevolg van fouten"
4279-
4280-#. module: account_banking
4281-#: code:addons/account_banking/account_banking.py:0
4282-#, python-format
4283-msgid "Free Reference"
4284-msgstr "Vrije referentie"
4285-
4286-#. module: account_banking
4287-#: code:addons/account_banking/account_banking.py:0
4288-#, python-format
4289-msgid ""
4290-"The expected balance (%.2f) is different '\n"
4291-" 'than the computed one. (%.2f)"
4292-msgstr "Het verwachte saldo (%.2f) wijkt af van het berekende- (%.2f)."
4293-
4294-#. module: account_banking
4295-#: code:addons/account_banking/account_banking.py:0
4296-#, python-format
4297-msgid "Structured Reference"
4298-msgstr "Acceptgiro"
4299-
4300-#. module: account_banking
4301-#: field:account.banking.account.settings,invoice_journal_id:0
4302-msgid "Costs Journal"
4303-msgstr "Dagboek bankkosten"
4304-
4305-#. module: account_banking
4306-#: code:addons/account_banking/wizard/bank_import.py:0
4307-#, python-format
4308-msgid "Number of statements skipped due to errors"
4309-msgstr "Aantal afschriften overgeslagen door fouten"
4310-
4311-#. module: account_banking
4312-#: code:addons/account_banking/account_banking.py:0
4313-#, python-format
4314-msgid "Invalid IBAN account number!"
4315-msgstr "Ongeldig IBAN-rekeningnummer"
4316-
4317-#. module: account_banking
4318-#: view:account.banking.account.settings:0
4319-msgid "Default Import Settings for Bank Account"
4320-msgstr "Standaardinstellingen voor bankrekeningen"
4321-
4322-#. module: account_banking
4323-#: help:account.banking.account.settings,default_credit_account_id:0
4324-msgid ""
4325-"The account to use when an unexpected payment was signaled. This can happen "
4326-"when a direct debit payment is cancelled by a customer, or when no matching "
4327-"payment can be found. Mind that you can correct movements before confirming "
4328-"them."
4329-msgstr ""
4330-"De te gebruiken rekening bij onverwachte betalingen. Dit kan voorkomen "
4331-"indien een incasso-opdracht door een klant is geannuleerd, of wanneer er "
4332-"geen overeenkomende betaling kan worden gevonden. Merk op dat u altijd "
4333-"boekingen kunt corrigeren voordat u deze bevestigt."
4334-
4335-#. module: account_banking
4336-#: code:addons/account_banking/wizard/bank_import.py:0
4337-#, python-format
4338-msgid "Unable to import parser %(parser)s. Parser class not found."
4339-msgstr ""
4340-"Niet in staat parser %(parser)s te importeren. Parser class niet gevonden."
4341-
4342-#. module: account_banking
4343-#: field:account.banking.imported.file,file:0
4344-msgid "Raw Data"
4345-msgstr "Ruwe data"
4346-
4347-#. module: account_banking
4348-#: selection:payment.line,export_state:0
4349-msgid "Cancelled"
4350-msgstr "Geannuleerd"
4351-
4352-#. module: account_banking
4353-#: code:addons/account_banking/account_banking.py:0
4354-#, python-format
4355-msgid ""
4356-"Insufficient data to select online '\n"
4357-" 'conversion database"
4358-msgstr ""
4359-"Onvoldoende gegevens om on-line'\n"
4360-" 'conversie-database te kiezen"
4361-
4362-#. module: account_banking
4363-#: view:account.banking.imported.file:0
4364-#: field:account.banking.imported.file,statement_ids:0
4365-msgid "Statements"
4366-msgstr "Afschriften"
4367-
4368-#. module: account_banking
4369-#: field:account.banking.account.settings,default_debit_account_id:0
4370-msgid "Default debit account"
4371-msgstr "Standaard debet-rekening"
4372-
4373-#. module: account_banking
4374-#: code:addons/account_banking/wizard/banktools.py:0
4375-#, python-format
4376-msgid "Unknown Bank"
4377-msgstr "Onbekende bank"
4378-
4379-#. module: account_banking
4380-#: wizard_button:account_banking.banking_import,init,end:0
4381-msgid "_Cancel"
4382-msgstr "_Annuleer"
4383-
4384-#. module: account_banking
4385-#: code:addons/account_banking/account_banking.py:0
4386-#, python-format
4387-msgid "Invalid format"
4388-msgstr "Ongeldig formaat"
4389-
4390-#. module: account_banking
4391-#: field:account.banking.imported.file,date:0
4392-msgid "Import Date"
4393-msgstr "Importdatum"
4394-
4395-#. module: account_banking
4396-#: selection:payment.line,export_state:0
4397-msgid "Confirmed"
4398-msgstr "Bevestigd"
4399-
4400-#. module: account_banking
4401-#: model:ir.actions.act_window,name:account_banking.action_account_banking_res_partner_banks
4402-#: model:ir.ui.menu,name:account_banking.menu_action_account_banking_bank_accounts
4403-msgid "Bank Accounts"
4404-msgstr "Bankrekeningen"
4405-
4406-#. module: account_banking
4407-#: view:account.banking.account.settings:0
4408-msgid "Default Accounts for Unknown Movements"
4409-msgstr "Standaard rekeningen voor onverwachte mutaties"
4410-
4411-#. module: account_banking
4412-#: view:account.bank.statement:0
4413-msgid "Confirm"
4414-msgstr "Bevestig"
4415-
4416-#. module: account_banking
4417-#: code:addons/account_banking/wizard/bank_import.py:0
4418-#, python-format
4419-msgid ""
4420-"Statements found for account %(bank_account)s, '\n"
4421-" 'but no default journal was defined."
4422-msgstr ""
4423-"Afschriften gevonden voor bankrekening %(bank_account)s, maar geen "
4424-"gedefinieerd dagboek gevonden hiervoor."
4425-
4426-#. module: account_banking
4427-#: field:account.banking.account.settings,default_credit_account_id:0
4428-msgid "Default credit account"
4429-msgstr "Standaard credit-rekening"
4430-
4431-#. module: account_banking
4432-#: field:account.bank.statement.line,international:0
4433-msgid "International Transaction"
4434-msgstr "Internationale transactie"
4435-
4436-#. module: account_banking
4437-#: code:addons/account_banking/account_banking.py:0
4438-#, python-format
4439-msgid "Please verify that an account is defined in the journal."
4440-msgstr "Controleer alstublieft of een rekening is opgegeven in het journaal"
4441-
4442-#. module: account_banking
4443-#: field:account.bank.statement.line,trans:0
4444-msgid "Bank Transaction ID"
4445-msgstr "Transactie ID bank"
4446-
4447-#. module: account_banking
4448-#: help:account.banking.account.settings,invoice_journal_id:0
4449-msgid "This is the journal used to create invoices for bank costs."
4450-msgstr ""
4451-"Dit is het dagboek dat gebruikt wordt bij het aanmaken van bankkosten-"
4452-"facturen."
4453-
4454-#. module: account_banking
4455-#: code:addons/account_banking/wizard/bank_import.py:0
4456-#, python-format
4457-msgid "Statement %(id)s known - skipped"
4458-msgstr "Afschrift %(id)s al bekend - overgeslagen"
4459-
4460-#. module: account_banking
4461-#: selection:payment.line,export_state:0
4462-msgid "Sent"
4463-msgstr "Verzonden"
4464-
4465-#. module: account_banking
4466-#: help:account.banking.account.settings,costs_account_id:0
4467-msgid ""
4468-"The account to use when the bank invoices its own costs. Leave it blank to "
4469-"disable automatic invoice generation on bank costs."
4470-msgstr ""
4471-"De te gebruiken grootboekrekening wanneer de bank zijn kosten incasseert. "
4472-"Laat leeg om het automatisch aanmaken van facturen voor bankkosten uit te "
4473-"zetten."
4474-
4475-#. module: account_banking
4476-#: code:addons/account_banking/account_banking.py:0
4477-#, python-format
4478-msgid "Error !"
4479-msgstr "Fout !"
4480-
4481-#. module: account_banking
4482-#: code:addons/account_banking/account_banking.py:0
4483-#, python-format
4484-msgid "Invalid data"
4485-msgstr "Ongeldige gegevens"
4486-
4487-#. module: account_banking
4488-#: model:res.partner.bank.type.field,name:account_banking.bank_normal_field_contry
4489-msgid "country_id"
4490-msgstr "Landcode"
4491-
4492-#. module: account_banking
4493-#: selection:payment.line,export_state:0
4494-msgid "Rejected"
4495-msgstr "Geweigerd"
4496-
4497-#. module: account_banking
4498-#: model:ir.actions.act_window,name:account_banking.action_account_banking_journals
4499-#: model:ir.ui.menu,name:account_banking.menu_action_account_banking_bank_journals
4500-msgid "Default Import Settings for Bank Accounts"
4501-msgstr "Standaardinstellingen voor bankrekeningen"
4502-
4503-#. module: account_banking
4504-#: model:ir.actions.wizard,name:account_banking.wizard_account_banking_import_file
4505-#: model:ir.ui.menu,name:account_banking.menu_account_banking_import_wizard
4506-msgid "Import Bank Statements File"
4507-msgstr "Importeer bankafschrift bestand"
4508-
4509-#. module: account_banking
4510-#: help:account_banking.banking_import,init,file:0
4511-msgid ""
4512-"The Transactions File to import. Please note that while it is perfectly safe "
4513-"to reload the same file multiple times or to load in timeframe overlapping "
4514-"statements files, there are formats that may introduce different sequencing, "
4515-"which may create double entries.\n"
4516-"\n"
4517-"To stay on the safe side, always load bank statements files using the same "
4518-"format."
4519-msgstr ""
4520-"Het te importeren transactiebestand. Let alstublieft op: hoewel het "
4521-"zondermeer veilig is om hetzelfde bestand meerdere keren te importeren of om "
4522-"in tijd overlappende bestanden te importeren, zijn er formaten die een ander "
4523-"nummeringsschema introduceren, wat tot problemen kan leiden.\n"
4524-"\n"
4525-"Om aan de veilige kant te blijven, importeer altijd transactiebestanden in "
4526-"hetzelfde formaat."
4527-
4528-#. module: account_banking
4529-#: model:payment.type,name:account_banking.manual_bank_tranfer
4530-msgid "Manual Bank Transfer"
4531-msgstr ""
4532-
4533-#. module: account_banking
4534-#: code:addons/account_banking/sepa/bbantoiban.py:0
4535-#, python-format
4536-msgid "This is a stub. Please implement your own code"
4537-msgstr "Dit is een stub. Maak alstublieft uw eigen versie."
4538-
4539-#. module: account_banking
4540-#: constraint:ir.ui.view:0
4541-msgid "Invalid XML for View Architecture!"
4542-msgstr "Ongeldige XML voor overzicht"
4543-
4544-#. module: account_banking
4545-#: view:account.banking.imported.file:0
4546-msgid "Imported Bank Statements"
4547-msgstr "Geïmporteerde bankafschriften"
4548-
4549-#. module: account_banking
4550-#: model:ir.module.module,description:account_banking.module_meta_information
4551-msgid ""
4552-"\n"
4553-" Module to do banking.\n"
4554-"\n"
4555-" Note: This module is depending on BeautifulSoup.\n"
4556-"\n"
4557-" This modules tries to combine all current banking import and export\n"
4558-" schemes. Rationale for this is that it is quite common to have foreign\n"
4559-" bank account numbers next to national bank account numbers. The current\n"
4560-" approach, which hides the national banking interface schemes in the\n"
4561-" l10n_xxx modules, makes it very difficult to use these simultanious.\n"
4562-" A more banking oriented approach seems more logical and cleaner.\n"
4563-"\n"
4564-" Changes to default OpenERP:\n"
4565-"\n"
4566-" * Puts focus on the real life messaging with banks:\n"
4567-" + Bank statement lines upgraded to independent bank transactions.\n"
4568-" + Banking statements have no special accountancy meaning, they're "
4569-"just\n"
4570-" message envelopes for a number of bank transactions.\n"
4571-" + Bank statements can be either encoded by hand to reflect the "
4572-"document\n"
4573-" version of Bank Statements, or created as an optional side effect "
4574-"of\n"
4575-" importing Bank Transactions.\n"
4576-"\n"
4577-" * Preparations for SEPA:\n"
4578-" + IBAN accounts are the standard in the SEPA countries\n"
4579-" + local accounts are derived from SEPA (excluding Turkey) but are\n"
4580-" considered to be identical to the corresponding SEPA account.\n"
4581-" + Banks are identified with either Country + Bank code + Branch code "
4582-"or BIC\n"
4583-" + Each bank can have its own pace in introducing SEPA into their\n"
4584-" communication with their customers.\n"
4585-" + National online databases can be used to convert BBAN's to IBAN's.\n"
4586-" + The SWIFT database is consulted for bank information.\n"
4587-"\n"
4588-" * Adds dropin extensible import facility for bank communication in:\n"
4589-" - Drop-in input parser development.\n"
4590-" - MultiBank (NL) format transaction files available as\n"
4591-" account_banking_nl_multibank,\n"
4592-"\n"
4593-" * Extends payments for digital banking:\n"
4594-" + Adapted workflow in payments to reflect banking operations\n"
4595-" + Relies on account_payment mechanics to extend with export "
4596-"generators.\n"
4597-" - ClieOp3 (NL) payment and direct debit orders files available as\n"
4598-" account_banking_nl_clieop\n"
4599-"\n"
4600-" * Additional features for the import/export mechanism:\n"
4601-" + Automatic matching and creation of bank accounts, banks and "
4602-"partners,\n"
4603-" during import of statements.\n"
4604-" + Automatic matching with invoices and payments.\n"
4605-" + Sound import mechanism, allowing multiple imports of the same\n"
4606-" transactions repeated over multiple files.\n"
4607-" + Journal configuration per bank account.\n"
4608-" + Business logic and format parsing strictly separated to ease the\n"
4609-" development of new parsers.\n"
4610-" + No special configuration needed for the parsers, new parsers are\n"
4611-" recognized and made available at server (re)start.\n"
4612-" "
4613-msgstr ""
4614-" Module voor bankzaken.\n"
4615-"\n"
4616-" Waarschuwing: deze module is afhankelijk van BeautifulSoup.\n"
4617-"\n"
4618-" Deze module probeert alle bestaande bankimport- en -exportschema's\n"
4619-" te combineren. Ratio hierachter is dat het vrij gebruikelijk is om\n"
4620-" buitenlandse bankrekeningen te hebben naast nationale-. De huidige\n"
4621-" benadering waarbij nationale bankinterfaces ondergebracht worden in\n"
4622-" de l10n_xxx modules, maakt het zeer lastig om deze naast elkaar te\n"
4623-" gebruiken. Een meer bank-geöriënteerde benadering lijkt logischer en\n"
4624-" 'schoner'.\n"
4625-"\n"
4626-" Wijzigingen op standaard OpenERP:\n"
4627-"\n"
4628-" * Legt focus op berichtuitwisseling met banken:\n"
4629-" + Bankafschriftregels opgewaardeerd naar onafhankelijke "
4630-"banktransacties.\n"
4631-" + Bankafschriften hebben geen speciale accountancy-betekenis, ze zijn\n"
4632-" slechts enveloppen voor een reeks banktransacties.\n"
4633-" + Bankafschriften kunnen hetzij met de hand worden ingevoerd als "
4634-"projectie\n"
4635-" van de papieren versie, of gemaakt worden als neveneffect van het\n"
4636-" importeren van banktransacties.\n"
4637-"\n"
4638-" * Voorbereidingen voor SEPA:\n"
4639-" + IBAN bankrekeningen zijn de standaard in de SEPA-landen\n"
4640-" + lokale bankrekeningen worden afgeleid van SEPA (uitgezonderd "
4641-"Turkije)\n"
4642-" maar worden beschouwd als identiek aan de corresponderende IBAN-"
4643-"rekening.\n"
4644-" + Banken worden geïdentificeerd met hetzij land + bankcode + "
4645-"branchcode of BIC\n"
4646-" + Elke bank kan in zijn eigen tempo SEPA invoeren in diens \n"
4647-" communicatie met de klant.\n"
4648-" + Nationale online databases kunnen gebruikt worden om BBAN's naar\n"
4649-" IBAN's te converteren.\n"
4650-"\n"
4651-" * Geeft dropin uitbreidbare importvoorzieningen voor bankcommunicatie "
4652-"in:\n"
4653-" + MultiBank (NL) formaat transactiebestanden,\n"
4654-"\n"
4655-" * Breidt betalingen uit voor digitaal bankieren:\n"
4656-" + Werkstroom in betalingen aangepast voor bank-operaties\n"
4657-" + Bouwt op account_payment mechanieken voor uitbreidingen met export "
4658-"generatoren.\n"
4659-" - ClieOp3 (NL) betalings- en incasso-opdrachten beschikbaar in de\n"
4660-" account_banking_nl_clieop module\n"
4661-"\n"
4662-" * Toegevoegde mogelijkheden voor het import/export mechanisme:\n"
4663-" + Automatische koppeling en aanmaken van bankrekeningen, banken en "
4664-"relaties\n"
4665-" tijdens het importeren van transacties.\n"
4666-" + Automatisch koppelen met facturen en betalingen.\n"
4667-" + Solide importmechanisme dat meerdere imports van dezelfde "
4668-"transacties over\n"
4669-" over meerdere bestanden toestaat.\n"
4670-" + Dagboek-instellingen per bankrekening.\n"
4671-" + Business logica en bestands-parsing strikt gescheiden om de "
4672-"ontwikkeling\n"
4673-" van nieuwe parsers te vergemakkelijken\n"
4674-" + Geen speciale configuratie nodig voor de parsers, nieuwe parsers "
4675-"worden\n"
4676-" herkend en beschikbaar gemaakt voor gebuikers bij server(her)start.\n"
4677-" "
4678-
4679-#. module: account_banking
4680-#: wizard_view:account_banking.banking_import,init:0
4681-#: wizard_view:account_banking.banking_import,view_error:0
4682-#: wizard_view:account_banking.banking_import,view_statements:0
4683-msgid "Import Bank Transactions File"
4684-msgstr "Importeer banktransacties-bestand"
4685-
4686-#. module: account_banking
4687-#: code:addons/account_banking/wizard/banktools.py:0
4688-#, python-format
4689-msgid "Account %(account_no)s is not owned by %(partner)s"
4690-msgstr "Rekening %(account_no)s is geen eigendom van %(partner)s"
4691-
4692-#. module: account_banking
4693-#: wizard_button:account_banking.banking_import,init,import:0
4694-msgid "_Ok"
4695-msgstr "_Ok"
4696-
4697-#. module: account_banking
4698-#: code:addons/account_banking/wizard/bank_import.py:0
4699-#, python-format
4700-msgid "Candidates: %(candidates)s"
4701-msgstr "Kandidaten: %(candidate)s"
4702-
4703-#. module: account_banking
4704-#: code:addons/account_banking/wizard/banktools.py:0
4705-#, python-format
4706-msgid "More then one possible match found for partner with name %(name)s"
4707-msgstr "Meer dan één mogelijke match gevonden voor partner met naam %(name)s"
4708-
4709-#. module: account_banking
4710-#: field:account.banking.imported.file,state:0
4711-#: field:payment.line,export_state:0
4712-msgid "State"
4713-msgstr "Status"
4714-
4715-#. module: account_banking
4716-#: code:addons/account_banking/wizard/bank_import.py:0
4717-#, python-format
4718-msgid "ERROR!"
4719-msgstr "FOUT!"
4720-
4721-#. module: account_banking
4722-#: code:addons/account_banking/wizard/bank_import.py:0
4723-#, python-format
4724-msgid ""
4725-"Unable to link transaction id %(trans)s '\n"
4726-" '(ref: %(ref)s) to invoice: '\n"
4727-" 'invoice %(invoice)s was already paid"
4728-msgstr ""
4729-"Niet in staat transactie id %(trans)s '\n"
4730-" '(ref: %(ref)s) met factuur te koppelen: '\n"
4731-" 'factuur %(invoice)s was al betaald"
4732-
4733-#. module: account_banking
4734-#: code:addons/account_banking/account_banking.py:0
4735-#, python-format
4736-msgid "The account number has the wrong format for %(country)s"
4737-msgstr "Het rekeningnummer heeft het verkeerde formaat voor %(country)s"
4738-
4739-#. module: account_banking
4740-#: field:account.bank.statement.line,currency:0
4741-msgid "Currency"
4742-msgstr "Valuta"
4743-
4744-#. module: account_banking
4745-#: field:payment.line,msg:0
4746-msgid "Message"
4747-msgstr "Bericht"
4748-
4749-#. module: account_banking
4750-#: field:account.banking.account.settings,company_id:0
4751-#: field:account.banking.imported.file,company_id:0
4752-#: wizard_field:account_banking.banking_import,init,company:0
4753-msgid "Company"
4754-msgstr "Bedrijf"
4755-
4756-#. module: account_banking
4757-#: wizard_field:account_banking.banking_import,view_error,log:0
4758-#: wizard_field:account_banking.banking_import,view_statements,log:0
4759-msgid "Log"
4760-msgstr "Logboek"
4761-
4762-#. module: account_banking
4763-#: code:addons/account_banking/parsers/models.py:0
4764-#, python-format
4765-msgid "Invalid value for transfer_type"
4766-msgstr "Ongeldige waarde voor transfer_type"
4767-
4768-#. module: account_banking
4769-#: code:addons/account_banking/account_banking.py:0
4770-#, python-format
4771-msgid "Insufficient data"
4772-msgstr "Onvoldoende gegevens"
4773-
4774-#. module: account_banking
4775-#: code:addons/account_banking/account_banking.py:0
4776-#, python-format
4777-msgid "Configration Error !"
4778-msgstr "Instellingsfout!"
4779-
4780-#. module: account_banking
4781-#: model:ir.actions.act_window,name:account_banking.act_account_payment_account_bank_statement
4782-msgid "Bank Statements File"
4783-msgstr "Bankafschrift bestand"
4784-
4785-#. module: account_banking
4786-#: code:addons/account_banking/parsers/models.py:0
4787-#, python-format
4788-msgid "This is a stub. Please implement your own."
4789-msgstr "Dit is een stub. Maak alstublieft uw eigen versie."
4790-
4791-#. module: account_banking
4792-#: code:addons/account_banking/wizard/banktools.py:0
4793-#, python-format
4794-msgid "No suitable period found for date %(date)s and company %(company_name)s"
4795-msgstr ""
4796-"Geen geschikt boekjaar gevonden voor datum %(date)s en bedrijf "
4797-"%(company_name)s"
4798-
4799-#. module: account_banking
4800-#: view:account.banking.imported.file:0
4801-#: model:ir.actions.act_window,name:account_banking.action_account_banking_imported_files
4802-#: model:ir.ui.menu,name:account_banking.menu_action_account_banking_imported_files
4803-msgid "Imported Bank Statements Files"
4804-msgstr "Geïmporteerde bankafschrift bestanden"
4805-
4806-#. module: account_banking
4807-#: model:ir.actions.wizard,name:account_banking.wizard_account_banking_payment_manual
4808-msgid "Manual Bank Payment"
4809-msgstr "Handmatige betaling via bank"
4810-
4811-#. module: account_banking
4812-#: field:account.bank.statement,banking_id:0
4813-msgid "Imported File"
4814-msgstr "Geïmporteerd bestand"
4815-
4816-#. module: account_banking
4817-#: view:account.banking.imported.file:0
4818-#: field:account.banking.imported.file,log:0
4819-msgid "Import Log"
4820-msgstr "Import log"
4821-
4822-#. module: account_banking
4823-#: code:addons/account_banking/wizard/banktools.py:0
4824-#, python-format
4825-msgid ""
4826-"Multiple overlapping periods for date %(date)s and company %(company_name)s"
4827-msgstr ""
4828-"Meerdere overlappende periodes gevonden voor datum %(date)s en bedrijf "
4829-"%(company_name)s"
4830-
4831-#. module: account_banking
4832-#: code:addons/account_banking/wizard/bank_import.py:0
4833-#, python-format
4834-msgid "The imported statements appear to be invalid! Check your file."
4835-msgstr "De geïmporteerde afschriften lijken onjuist! Controleer uw bestand."
4836-
4837-#. module: account_banking
4838-#: code:addons/account_banking/wizard/bank_import.py:0
4839-#, python-format
4840-msgid "Number of statements loaded"
4841-msgstr "Aantal geladen afschriften"
4842-
4843-#. module: account_banking
4844-#: model:ir.ui.menu,name:account_banking.menu_finance_banking_actions
4845-#: model:ir.ui.menu,name:account_banking.menu_finance_banking_settings
4846-msgid "Banking"
4847-msgstr "Bankzaken"
4848-
4849-#. module: account_banking
4850-#: selection:account.banking.imported.file,state:0
4851-msgid "Error"
4852-msgstr "Fout"
4853-
4854-#. module: account_banking
4855-#: code:addons/account_banking/wizard/bank_import.py:0
4856-#, python-format
4857-msgid "Total number of statements"
4858-msgstr "Totaal aantal afschriften"
4859-
4860-#. module: account_banking
4861-#: code:addons/account_banking/account_banking.py:0
4862-#, python-format
4863-msgid "Unable to reconcile entry \"%s\": %.2f"
4864-msgstr "Niet in staat boeking af te letteren \"%s\": %.2f"
4865-
4866-#. module: account_banking
4867-#: code:addons/account_banking/wizard/banktools.py:0
4868-#, python-format
4869-msgid ""
4870-"No suitable fiscal year found for date %(date)s and company %(company_name)s"
4871-msgstr ""
4872-"Geen geschikt boekjaar gevonden voor datum %(date)s en bedrijf "
4873-"%(company_name)s"
4874-
4875-#. module: account_banking
4876-#: view:account.banking.imported.file:0
4877-msgid "Import Details"
4878-msgstr "Details import"
4879-
4880-#. module: account_banking
4881-#: field:account.bank.statement.line,period_id:0
4882-msgid "Period"
4883-msgstr "Periode"
4884-
4885-#. module: account_banking
4886-#: selection:payment.line,export_state:0
4887-msgid "Done"
4888-msgstr "Verwerkt"
4889-
4890-#. module: account_banking
4891-#: view:payment.order:0
4892-msgid "Select Invoices to Pay"
4893-msgstr "Kies te betalen facturen"
4894-
4895-#. module: account_banking
4896-#: field:account.banking.imported.file,user_id:0
4897-msgid "Responsible User"
4898-msgstr "Verantwoordelijke gebruiker"
4899-
4900-#. module: account_banking
4901-#: code:addons/account_banking/account_banking.py:0
4902-#, python-format
4903-msgid "The statement balance is incorrect !\n"
4904-msgstr "Het saldo van het afschrift klopt niet !"
4905-
4906-#. module: account_banking
4907-#: constraint:ir.model:0
4908-msgid ""
4909-"The Object name must start with x_ and not contain any special character !"
4910-msgstr ""
4911-"De objectnaam moet beginnen met x_ en mag geen speciale karakters bevatten !"
4912-
4913-#. module: account_banking
4914-#: selection:account.banking.imported.file,state:0
4915-msgid "Unfinished"
4916-msgstr "Onvoltooid"
4917-
4918-#. module: account_banking
4919-#: code:addons/account_banking/wizard/bank_import.py:0
4920-#, python-format
4921-msgid "Statements found for unknown account %(bank_account)s"
4922-msgstr "Afschriften gevonden voor onbekende bankrekening %(bank_account)s"
4923-
4924-#. module: account_banking
4925-#: model:ir.module.module,shortdesc:account_banking.module_meta_information
4926-msgid "Account Banking"
4927-msgstr "Account Banking"
4928-
4929-#. module: account_banking
4930-#: wizard_button:account_banking.banking_import,view_error,open_import:0
4931-msgid "_View Imported File"
4932-msgstr "_Bekijk geïmporteerd bestand"
4933-
4934-#. module: account_banking
4935-#: code:addons/account_banking/account_banking.py:0
4936-#, python-format
4937-msgid "The IBAN number doesn't seem to be correct"
4938-msgstr "Het IBAN-nummer lijkt niet correct te zijn"
4939-
4940-#. module: account_banking
4941-#: field:account.banking.imported.file,format:0
4942-#: wizard_field:account_banking.banking_import,init,parser:0
4943-msgid "File Format"
4944-msgstr "Bestandsformaat"
4945-
4946-#. module: account_banking
4947-#: code:addons/account_banking/wizard/banktools.py:0
4948-#, python-format
4949-msgid ""
4950-"Multiple overlapping fiscal years found for date %(date)s and company "
4951-"%(company_name)s"
4952-msgstr ""
4953-"Meerdere overlappende boekjaren gevonden voor datum %(date)s en bedrijf "
4954-"%(company_name)s"
4955-
4956-#. module: account_banking
4957-#: field:account.banking.account.settings,journal_id:0
4958-msgid "Journal"
4959-msgstr "Dagboek"
4960-
4961-#. module: account_banking
4962-#: field:account.banking.account.settings,costs_account_id:0
4963-msgid "Bank Costs Account"
4964-msgstr "Bankkosten-rekening"
4965-
4966-#. module: account_banking
4967-#: selection:account.banking.imported.file,state:0
4968-msgid "Finished"
4969-msgstr "Gereed"
4970-
4971-#. module: account_banking
4972-#: selection:payment.line,export_state:0
4973-msgid "Draft"
4974-msgstr "Concept"
4975-
4976-#. module: account_banking
4977-#: view:account.banking.account.settings:0
4978-msgid "Bank Account Details"
4979-msgstr "Details bankrekening"
4980-
4981-#. module: account_banking
4982-#: field:account.bank.statement.line,partner_bank_id:0
4983-#: field:account.banking.account.settings,partner_bank_id:0
4984-msgid "Bank Account"
4985-msgstr "Bankrekening"
4986-
4987-#. module: account_banking
4988-#: code:addons/account_banking/wizard/bank_import.py:0
4989-#, python-format
4990-msgid "Number of transactions loaded"
4991-msgstr "Aantal geladen transacties"
4992-
4993-#. module: account_banking
4994-#: code:addons/account_banking/account_banking.py:0
4995-#, python-format
4996-msgid "The account number appears to be invalid for %(country)s"
4997-msgstr "Het bankrekeningnummer blijkt ongeldig te zijn voor %(country)s"
4998-
4999-#. module: account_banking
5000-#: model:res.partner.bank.type.field,name:account_banking.bank_acc_number_field
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches