Merge lp:~openerp-community/openobject-addons/trunk-addons-community into lp:openobject-addons/extra-trunk

Proposed by Grzegorz Grzelak (OpenGLOBE.pl)
Status: Rejected
Rejected by: Xavier (Open ERP)
Proposed branch: lp:~openerp-community/openobject-addons/trunk-addons-community
Merge into: lp:openobject-addons/extra-trunk
Diff against target: 75514 lines (has conflicts)
Conflict adding file account_banking.  Moved existing file to account_banking.moved.
Conflict adding file account_banking_nl_clieop.  Moved existing file to account_banking_nl_clieop.moved.
Conflict adding file account_banking_nl_multibank.  Moved existing file to account_banking_nl_multibank.moved.
Conflict adding file l10n_chart_pl.  Moved existing file to l10n_chart_pl.moved.
Conflict adding file l10n_chart_ro.  Moved existing file to l10n_chart_ro.moved.
Conflict adding file printjob.  Moved existing file to printjob.moved.
Conflict adding file zarafa.  Moved existing file to zarafa.moved.
To merge this branch: bzr merge lp:~openerp-community/openobject-addons/trunk-addons-community
Reviewer Review Type Date Requested Status
OpenERP Core Team Pending
Review via email: mp+15162@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Grzegorz Grzelak (OpenGLOBE.pl) (grzegorz-og.pl) wrote :

It is my first proposal. I have reviewed l10n_chart_pl from trunk.
It contains now correct character coding, correct chart hierarchy, some account modification. There is no functional improvement but it can count on polish users acceptance (current l10n_chart_pl cannot). I placed the module here because am not yet Commiter. Please advice me if I should do something different to have this file in extra-addons.

129. By Niels Huylebroeck

[IMP] Using False instead of 0 to store the false condition.

130. By Niels Huylebroeck

[ADD] Project work entry module.

This module brings in another menu entry under Project -> Tasks.
It opens a small osv_memory wizard which allows you to select a project from the currently running projects.
Once selected it gives you an empty form of the project.task.work model with an extra filter on task_id
which filters on the project and task state = open.

131. By Naresh(OpenERP)

[IMP]:html report

132. By Hugo santos <hugo@hugo-desktop>

Made changes in report_contract: now you can print the report in 5.0.6 version of openerp-server, also you can add the services that the company offers in the company configuration

133. By Albert Cervera i Areny - http://www.NaN-tic.com

printjob: Set 'client' as default action for reports not in 'ir.actions.report.xml'. Otherwise workflows cannot be printed and give an error.

134. By Corentin POUHET-BRUNERIE <copou@dom>

[IMP] Add conditions on old values

135. By Franck BRET

product_brand is a module for managing Brand within product module

136. By Corentin POUHET-BRUNERIE <email address hidden>

[IMP]
1. Domain on old values accept polish notation
2. Add trigger on unlink method
3. Correct write_object_and_check_rules method
4. Update french translation
5. Correct run_now method for operator 'Is Changing'

137. By www.mgazelle.com

Initial version of a new office management module

138. By Corentin Pouhet-Brunerie <copou@dom>

[IMP] Add anti-recursion system

139. By Corentin Pouhet-Brunerie <copou@dom>

[FIX] Correct bug on context.copy()

140. By Niels Huylebroeck

[IMP] Updated description of project_work_entry module
[IMP] 'project_id' in wizard is now filled from context if it's available

141. By Jordi Esteve (www.zikzakmedia.com)

[FIX] report_contract: Fixed wrong files with collisions, added missing report_contract/report/contract.sxw

142. By Corentin Pouhet-Brunerie <copou@dom>

[FIX] Check if 'rules' exist in context before assignment

143. By Niels Huylebroeck

Fixed project_work_entry module so it's no longer dependent (or broken)

144. By Niels Huylebroeck

project_work_entry:
* now project form view has a button to call the wizard.
* the wizard should auto fill the field if context['project_id'] is filled.
 * bug https://bugs.launchpad.net/openobject-client/+bug/487649 however prevents this on windows

145. By Albert Cervera i Areny - http://www.NaN-tic.com

printjob: Added missing import for translations.

146. By Albert Cervera i Areny - http://www.NaN-tic.com

[FIX] printjob: Identation error could lead to returning None to the client.

147. By Franck BRET

[product_brand], form view added + small changes

148. By Franck BRET

merge

149. By Jordi Esteve (www.zikzakmedia.com)

[ADD] New module mrp_dimensions (dimensional variables (measurements) to production

150. By Corentin POUHET-BRUNERIE <email address hidden>

[FIX] context['active-object_ids'] is now a copy of ids in write and unlink methods

151. By Corentin POUHET-BRUNERIE <email address hidden>

[IMP] Remove unused imports

152. By Albert Cervera i Areny - http://www.NaN-tic.com

[IMP] printjob: Added wizard to update the list of printers with printers available in the CUPS server.

153. By Albert Cervera i Areny - http://www.NaN-tic.com

[IMP] printjob:
- Added new action to open CUPS administration interface.
- Added status field which shows current CUPS printer status.

154. By Albert Cervera i Areny - http://www.NaN-tic.com

[IMP] printjob: Updated Catalan and Spanish translations.

155. By Albert Cervera i Areny - http://www.NaN-tic.com

[IMP] printjob: Avoid two process to be started at the same time.

156. By Albert Cervera i Areny - http://www.NaN-tic.com

[FIX] printjob: Change translation files so OpenERP does not crash when loading them.

157. By Albert Cervera i Areny - http://www.NaN-tic.com

[FIX] printjob: Change translation files so OpenERP does not crash when loading them (now it really fixes it).

158. By Albert Cervera i Areny - http://www.NaN-tic.com

[FIX] printjob: Re-added 'import thread' which I mistakenly removed in a previous commit.

159. By Albert Cervera i Areny - http://www.NaN-tic.com

[FIX] account_customer_ref: Added dependency with 'sale' module.

160. By Albert Cervera i Areny - http://www.NaN-tic.com

[FIX] printjob: Use a specific python library to access CUPS instead of executing and paring commands.

161. By Albert Cervera i Areny - http://www.NaN-tic.com

[FIX] printjob: Do not crash if CUPS server is not available.

162. By Albert Cervera i Areny - http://www.NaN-tic.com

[FIX] printjob: Return empty dict if there's an error contacting CUPS server.

163. By Wei "oldrev" Li

Fixed the path problem

164. By Kristof Boden (Cogetix)

[ADD] module multi_company_category

165. By Pieter J. Kersten <email address hidden>

Added banking framework and two reference implementations

166. By Corentin Pouhet-Brunerie <copou@dom>

[FIX] Copy the context in the run method

167. By Albert Cervera i Areny - http://www.NaN-tic.com

[FIX] printjob: When an exception ocurred executing a report and printjob module was installed, the exception wasn't properly sent to the client and it would wait forever. Now the behaviour is the expected and advanced users can query exception information in the printjob queue.

168. By Nicolas DS

[ADD] Module Mailing, manage and send emailings

169. By Nicolas DS

[FIX] Mailing: Removing debug print

170. By Hugo santos <hugo@hugo-desktop>

[FIX] Fixed some errors in mrp_dimensions

171. By Corentin Pouhet-Brunerie <copou@dom>

[IMP] Add fields.function trigger

172. By Wei "oldrev" Li

relatorio_report updated

173. By Wei "oldrev" Li

merge changes

174. By Wei "oldrev" Li

added the RMB upper utility

175. By Wei "oldrev" Li

relatorio reporting engine was removed

176. By Corentin Pouhet-Brunerie <copou@dom>

[IMP] Add fields.function trigger

177. By Corentin Pouhet-Brunerie <copou@dom>

[IMP] Add demo data

178. By Nicolas DS

[FIX] Mailing, handle partner without email address

179. By Jan Verlaan

[FIX] Refunds where booked in some cases on wrong GL account. (BTW te vorderen instead of BTW te betalen with a negative amount)

180. By leooviedo

[fix] weight calculation on mrp_dimensions

181. By leooviedo

[fix] weight calculation on mrp_dimensions

182. By Corentin Pouhet-Brunerie <copou@dom>

[IMP] Add the operator 'Exists'

183. By Corentin Pouhet-Brunerie <copou@dom>

[IMP] Update French translations

184. By leooviedo

[fix] weight calculation on mrp_dimensions

185. By Jan Verlaan

[FIX] Tax calculation for Import and Export within and outside the EU corrected

186. By Hugo Santos <hugo@ubuntu>

[ADD] Addon to connect openERP with a spree online shop. Also added product_variants_ting wich is necesary to install Spree connector.

187. By leooviedo

[fix] weight calculation on mrp_dimensions

188. By leooviedo

[fix] weight calculation on mrp_dimensions

189. By leooviedo

[fix] weight calculation on mrp_dimensions

190. By leooviedo

[fix] weight calculation on mrp_dimensions

191. By leooviedo

[fix] weight calculation on mrp_dimensions

192. By Numerigraphe - Lionel Sausin <email address hidden>

[MERGE]
[ADD] add sale_partner_category
[FIX] account_export_ebp
[IMP] sale_weight: store function field

193. By Numerigraphe - Lionel Sausin <email address hidden>

[MERGE] new module account_partner_category

194. By Numerigraphe - Lionel Sausin <email address hidden>

[MERGE]

195. By Numerigraphe - Lionel Sausin <email address hidden>

[MERGE]

196. By Numerigraphe - Lionel Sausin <email address hidden>

[MERGE]

197. By Numerigraphe - Lionel Sausin <email address hidden>

[MERGE]

198. By Olivier Laurent (Open ERP)

[FIX] fixed 'invalid syntax' error: unbalanced parenthesis

199. By Olivier Laurent (Open ERP)

[REM] removed pyc files

200. By Jordi Esteve (www.zikzakmedia.com)

[IMP] mrp_dimensions: Added Catalan translation, improved Spanish translation

201. By Raphaël Valyi - http://www.akretion.com

[FIX] sale_simple_pos; stock_invoice_on_picking: fixed translation _ function import that was previously using a begnin yet ineffective xpath method

202. By Raphaël Valyi - http://www.akretion.com

[IMP] added French translation, though for some reason it's not applied...

203. By Raphaël Valyi - http://www.akretion.com

[merge]

Revision history for this message
Xavier (Open ERP) (xmo-deactivatedaccount) wrote :

You're proposing a merge of all of addons-community into addons. That's definitely not a good idea.

Revision history for this message
Raphaël Valyi - http://www.akretion.com (rvalyi) wrote :

Guys,

please notice we found the "bzr join" command that allow to merge an
individual module into some addon/extra addon branch without loosing the
commit historic. We used it yesterday to inject the generic "stock_rma"
module we built into stable extra addons 5.0 (we are yet to present it). May
be that the solution (or part if it, using some intermediary branch, I'm not
sure), to move individual modules from a branch to an other

On Fri, Mar 5, 2010 at 7:03 AM, Xavier (Open ERP) <email address hidden> wrote:

> You're proposing a merge of all of addons-community into addons. That's
> definitely not a good idea.
> --
>
> https://code.launchpad.net/~openerp-community/openobject-addons/trunk-addons-community/+merge/15162
> Your team OpenERP Commiters is subscribed to branch
> lp:openobject-addons/extra-trunk.
>

Revision history for this message
Xavier (Open ERP) (xmo-deactivatedaccount) wrote :

> please notice we found the "bzr join" command that allow to merge an
individual module into some addon/extra addon branch without loosing the
commit historic.

First, I'm not sure it applies to this case, which looks like wrong-target merge proposal rather than a join case (though there's another merge proposal I refused earlier to which that could have applied)

Second, and this is a much bigger issue, the other side of `bzr join` (namely `bzr split`) does *not* perform history filtering. Let's say we `bzr split account` out of `plugins`, what bazaar does is not create a new repository and import specifically account-touching revisions into it (while removing the directory from `addons`), it clones `addons`, removes everything except `account` from it (via bzr rm) and renames `/addons` to `/`...

So that means the nice new `account` you get has all of `addons`'s history (including e.g. the changes performed to `sale`).

`bzr join` can probably be used to import an addon created in a separate, independent repository, but *not* to move an addon from one repo to another one, since `bzr split` doesn't work.

Revision history for this message
Raphaël Valyi - http://www.akretion.com (rvalyi) wrote :

Yeah, that's what I thought too. Or it could probably be used, but some only
if we find some extra filtering tool to clean the historic first. new bzr
format have the "bzr view" feature that, from what I understood can filter
historic per folder (could be very useful in general when investigating how
 module changes since say you put in prod), may bet that could be used as a
filter, I don't know. What is sure is that loosing module historic would
suck, that's too much useful to do a bzr annotate if you find some
regression at some place to find out why it has been done (provided it's
cross referenced with a bugreport) for instance.

On Fri, Mar 5, 2010 at 11:19 AM, Xavier (Open ERP) <email address hidden> wrote:

> > please notice we found the "bzr join" command that allow to merge an
> individual module into some addon/extra addon branch without loosing the
> commit historic.
>
> First, I'm not sure it applies to this case, which looks like wrong-target
> merge proposal rather than a join case (though there's another merge
> proposal I refused earlier to which that could have applied)
>
> Second, and this is a much bigger issue, the other side of `bzr join`
> (namely `bzr split`) does *not* perform history filtering. Let's say we `bzr
> split account` out of `plugins`, what bazaar does is not create a new
> repository and import specifically account-touching revisions into it (while
> removing the directory from `addons`), it clones `addons`, removes
> everything except `account` from it (via bzr rm) and renames `/addons` to
> `/`...
>
> So that means the nice new `account` you get has all of `addons`'s history
> (including e.g. the changes performed to `sale`).
>
> `bzr join` can probably be used to import an addon created in a separate,
> independent repository, but *not* to move an addon from one repo to another
> one, since `bzr split` doesn't work.
> --
>
> https://code.launchpad.net/~openerp-community/openobject-addons/trunk-addons-community/+merge/15162
> Your team OpenERP Commiters is subscribed to branch
> lp:openobject-addons/extra-trunk.
>

Revision history for this message
Xavier (Open ERP) (xmo-deactivatedaccount) wrote :

> but some only if we find some extra filtering tool to clean the historic first

I'd rather check if fastexport/fastimport can filter the tree, that would probably be a more interesting investigation.

Unmerged revisions

381. By Alexis de Lattre

[FIX] Small bug.

380. By Alexis de Lattre

Don't modifiy invoice_state any more : we write 'none' instead of 'loan' (data migration required)
Remove unused views
Move views related to stock to stock_view.xml

379. By Alexis de Lattre

Update contraint on sale order line.
Update coding style.

378. By Alexis de Lattre

Larger fields on warehouse form view.

377. By Alexis de Lattre

Enhance the code ; the generation of the return picking is now inheritable. The return stock move is now linked to the out stock move (move_dest_id)
Small update to coding style.
Loan IN and OUT are now regular M2O fields and not properties (warning : it requires data migration).

376. By Serpent Consulting Services

MASS Editing :Added security access

375. By esamyn

[UPDATE] website

374. By Serpent Consulting Services

[MIGRATE] business, base_xml_sample : Made modules intallable and compatible to 6.1

373. By Serpent Consulting Services

[IMP] base_partner_security : Added field restricted on partner form

372. By Serpent Consulting Services

[MIGRATE] backup_syste, base_partner_security, crm_task : Made modules intallable and compatible to 6.1

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== added directory 'account_bankimport'
=== added file 'account_bankimport/__init__.py'
--- account_bankimport/__init__.py 1970-01-01 00:00:00 +0000
+++ account_bankimport/__init__.py 2010-03-04 01:53:21 +0000
@@ -0,0 +1,37 @@
1##############################################################################
2#
3# Copyright (c) 2004-2006 TINY SPRL. (http://tiny.be) and Eddy Boer
4# All Rights Reserved.
5# Fabien Pinckaers <fp@tiny.Be>
6# Eddy Boer <tinyerp@EdbO.xs4all.nl>
7#
8# WARNING: This program as such is intended to be used by professional
9# programmers who take the whole responsability of assessing all potential
10# consequences resulting from its eventual inadequacies and bugs
11# End users who are looking for a ready-to-use solution with commercial
12# garantees and support are strongly adviced to contract a Free Software
13# Service Company
14#
15# This program is Free Software; you can redistribute it and/or
16# modify it under the terms of the GNU General Public License
17# as published by the Free Software Foundation; either version 2
18# of the License, or (at your option) any later version.
19#
20# This program is distributed in the hope that it will be useful,
21# but WITHOUT ANY WARRANTY; without even the implied warranty of
22# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23# GNU General Public License for more details.
24#
25# You should have received a copy of the GNU General Public License
26# along with this program; if not, write to the Free Software
27# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
28#
29##############################################################################
30# I used the code of account_coda as base for this module. The module does
31# exactly the same thing as account_coda. The difference is the file-layout.
32#
33# This module can import .asc-files (BRI-layout).
34#
35
36import bankimport
37import wizard
0\ No newline at end of file38\ No newline at end of file
139
=== added file 'account_bankimport/__terp__.py'
--- account_bankimport/__terp__.py 1970-01-01 00:00:00 +0000
+++ account_bankimport/__terp__.py 2010-03-04 01:53:21 +0000
@@ -0,0 +1,52 @@
1##############################################################################
2#
3# Copyright (c) 2004-2006 TINY SPRL. (http://tiny.be) and Eddy Boer
4# All Rights Reserved.
5# Fabien Pinckaers <fp@tiny.Be>
6# Eddy Boer <tinyerp@EdbO.xs4all.nl>
7# Jan Verlaan <informatie@veritos.nl>
8#
9# WARNING: This program as such is intended to be used by professional
10# programmers who take the whole responsability of assessing all potential
11# consequences resulting from its eventual inadequacies and bugs
12# End users who are looking for a ready-to-use solution with commercial
13# garantees and support are strongly adviced to contract a Free Software
14# Service Company
15#
16# This program is Free Software; you can redistribute it and/or
17# modify it under the terms of the GNU General Public License
18# as published by the Free Software Foundation; either version 2
19# of the License, or (at your option) any later version.
20#
21# This program is distributed in the hope that it will be useful,
22# but WITHOUT ANY WARRANTY; without even the implied warranty of
23# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24# GNU General Public License for more details.
25#
26# You should have received a copy of the GNU General Public License
27# along with this program; if not, write to the Free Software
28# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
29#
30##############################################################################
31# I used the code of account_coda as base for this module. The module does
32# exactly the same thing as account_coda. The difference is the file-layout.
33#
34# This module can import .asc-files (BRI-layout).
35# 06-10-2009 jverlaan added MT940 filter for Postbank and ING
36#
37
38{
39 "name":"Account Bankimport",
40 "version":"0.0.2",
41 "author":"Tiny / Eddy Boer",
42 "category":"Account Bankimport",
43 "depends":["base", "account","account_report","base_iban"],
44 "init_xml":[],
45 "update_xml" : [
46 "security/ir.model.access.csv",
47 "bankimport_wizard.xml",
48 "bankimport_view.xml",
49 ],
50 "active":False,
51 "installable":True,
52}
053
=== added file 'account_bankimport/bankimport.py'
--- account_bankimport/bankimport.py 1970-01-01 00:00:00 +0000
+++ account_bankimport/bankimport.py 2010-03-04 01:53:21 +0000
@@ -0,0 +1,238 @@
1##############################################################################
2#
3# Copyright (c) 2004-2006 TINY SPRL. (http://tiny.be) and Eddy Boer
4# All Rights Reserved.
5# Fabien Pinckaers <fp@tiny.Be>
6# Eddy Boer <tinyerp@EdbO.xs4all.nl>
7#
8# WARNING: This program as such is intended to be used by professional
9# programmers who take the whole responsability of assessing all potential
10# consequences resulting from its eventual inadequacies and bugs
11# End users who are looking for a ready-to-use solution with commercial
12# garantees and support are strongly adviced to contract a Free Software
13# Service Company
14#
15# This program is Free Software; you can redistribute it and/or
16# modify it under the terms of the GNU General Public License
17# as published by the Free Software Foundation; either version 2
18# of the License, or (at your option) any later version.
19#
20# This program is distributed in the hope that it will be useful,
21# but WITHOUT ANY WARRANTY; without even the implied warranty of
22# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23# GNU General Public License for more details.
24#
25# You should have received a copy of the GNU General Public License
26# along with this program; if not, write to the Free Software
27# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
28#
29##############################################################################
30# I used the code of account_coda as base for this module. The module does
31# exactly the same thing as account_coda. The difference is the file-layout.
32#
33# This module can import .asc-files (BRI-layout).
34#
35
36import time
37from osv import osv,fields
38
39import urllib, urllib2, sgmllib
40from BeautifulSoup import BeautifulSoup, SoupStrainer
41import re, string
42
43def _opschonen(name):
44 p = name.split('>')
45 n = p[2].split('<')
46 return n[0]
47
48def _get_bank_data(bank_acc):
49
50 p = {}
51
52 urldata = {'number':bank_acc,'method':'POST'}
53
54 data = urllib.urlencode(urldata)
55 link = "http://www.ibannl.org/iban_check.php"
56
57 req = urllib2.Request(link, data)
58 f = urllib2.urlopen(req)
59 s = f.read()
60
61 soup = BeautifulSoup(''.join(s))
62 test = soup.findAll('td')
63
64 bank_id = 0
65
66 if len(test) > 1 :
67 p['iban'] = _opschonen(str(test[1]))
68 p['bic'] = _opschonen(str(test[3]))
69 p['bank_name'] = _opschonen(str(test[5]))
70
71
72 return p
73
74 else:
75 return False
76
77
78
79
80
81
82class account_bankimport_filters(osv.osv):
83 _name = "account.bankimport.filters"
84 _description = "Define the filters, which is related to the file"
85 _columns = {
86 'filter' : fields.char('Filtername', size=64, required=True),
87 'name' : fields.char('Filename', size=128, required=True),
88 }
89account_bankimport_filters()
90
91# Save data for each company
92class res_company(osv.osv):
93 _inherit = 'res.company'
94 _columns = {
95 'bank_journalid' : fields.many2one('account.journal', 'Bank Journal', required=True),
96 'def_payable' : fields.many2one('account.account', 'Default Payable Account', required=True, domain=[('type','=','payable')]),
97 'def_receivable' : fields.many2one('account.account', 'Default Receivable Account', required=True, domain=[('type','=','receivable')]),
98 'filters': fields.many2one('account.bankimport.filters', 'Filter', required=True),
99 'bank_file' : fields.char('File Location', size=128, required=True),
100 }
101res_company()
102
103class account_bankimport(osv.osv):
104 _name = "account.bankimport"
105 _description = "import Bank statements-file for an Account"
106 _columns = {
107 'name': fields.char('Name', size=64),
108 'file': fields.binary('bankimport file', readonly=True),
109 'statement_id': fields.many2one('account.bank.statement','Generated Bank Statement', select=True,readonly=True),
110 'note': fields.text('Import log', readonly=True),
111 'journal_id': fields.many2one('account.journal','Bank Journal', readonly=True,select=True),
112 'date': fields.date('Import Date', readonly=True,select=True),
113 'user_id': fields.many2one('res.users','User', readonly=True, select=True),
114 }
115 _defaults = {
116 'date': lambda *a: time.strftime('%Y-%m-%d'),
117 'user_id': lambda self,cr,uid,context: uid,
118 }
119account_bankimport()
120
121class account_bank_statement(osv.osv):
122 _inherit = "account.bank.statement"
123 _columns = {
124 'bankimport_id':fields.many2one('account.bankimport','bankimport'),
125 'state': fields.selection([('draft', 'Draft'),('draft_import', 'Draft Imported'),('confirm', 'Confirm')],
126 'State', required=True,
127 states={'confirm': [('readonly', True)]}, readonly="1"),
128 }
129
130
131account_bank_statement()
132
133class bank_statement_line(osv.osv):
134 _inherit = "account.bank.statement.line"
135 _columns = {
136 'bank_accnumber':fields.char('Bank account importfile', size=64, required=False),
137 'amount': fields.float('Amount', states={'draft_import': [('readonly', True)]} ),
138 'ref': fields.char('Ref.', size=32, states={'draft_import': [('readonly', True)]} ),
139 'name': fields.char('Name', size=64, required=True, states={'draft_import': [('readonly', True)]} ),
140 'date': fields.date('Date', required=True, states={'draft_import': [('readonly', True)]} ),
141
142
143 }
144
145 def onchange_partner_id(self, cursor, user, line_id, partner_id, type, currency_id,
146 context={}):
147 if not partner_id:
148 return {}
149 res_currency_obj = self.pool.get('res.currency')
150 res_users_obj = self.pool.get('res.users')
151
152 company_currency_id = res_users_obj.browse(cursor, user, user,
153 context=context).company_id.currency_id.id
154
155 if not currency_id:
156 currency_id = company_currency_id
157
158 part = self.pool.get('res.partner').browse(cursor, user, partner_id,
159 context=context)
160 if part.supplier == 1 and part.customer == 0:
161 account_id = part.property_account_payable.id
162 type = 'supplier'
163 elif part.supplier == 0 and part.customer == 1:
164 account_id = part.property_account_receivable.id
165 type = 'customer'
166 else:
167 account_id = 0
168 type = 'general'
169
170 return {'value': {'type': type , 'account_id': account_id}}
171
172
173 def write(self, cr, uid, ids, vals, context={}):
174 acc_numbers = []
175
176 if 'partner_id' in vals:
177 db_data = self.pool.get('res.partner.bank').search(cr,uid, [('partner_id','=', vals['partner_id']) ] )
178 acc_nums = self.pool.get('res.partner.bank').browse(cr,uid, db_data )
179
180 import_acc = self.pool.get('account.bank.statement.line').browse(cr,uid, ids )
181
182 for num in acc_nums:
183 if num.acc_number:
184 acc_numbers.append(num.acc_number)
185 else:
186 acc_numbers.append(num.iban)
187
188 found_acc = False
189 for x in import_acc:
190 if x.bank_accnumber in acc_numbers:
191 found_acc = True
192
193 if not found_acc:
194 for x in import_acc:
195 p = _get_bank_data(x.bank_accnumber)
196
197 if p:
198 # test if the bank exists
199 bank_id = self.pool.get('res.bank').search(cr,uid,[('name','=',p['bank_name'])])
200 if not bank_id:
201 bank_id = pool.get('res.bank').create(cr,uid,{
202 'name' : p['bank_name'],
203 'bic' : p['bic'],
204 'active' : 1,
205 })
206 else:
207 bank_id = bank_id[0]
208
209
210 bank_acc = self.pool.get('res.partner.bank').create(cr,uid,{
211 'state' : 'bank',
212 'partner_id': vals['partner_id'],
213 'bank' : bank_id,
214 'acc_number' : x.bank_accnumber,
215 })
216
217 bank_iban = self.pool.get('res.partner.bank').create(cr,uid,{
218 'state' : 'iban',
219 'partner_id': vals['partner_id'],
220 'bank' : bank_id,
221 'iban' : p['iban'],
222 })
223
224
225 else:
226 bank_acc = self.pool.get('res.partner.bank').create(cr,uid,{
227 'state' : 'bank',
228 'partner_id': vals['partner_id'],
229 'acc_number' : x.bank_accnumber,
230 })
231
232
233
234 return super(bank_statement_line, self).write(cr, uid, ids, vals, context)
235
236
237
238bank_statement_line()
0239
=== added file 'account_bankimport/bankimport_data.xml'
--- account_bankimport/bankimport_data.xml 1970-01-01 00:00:00 +0000
+++ account_bankimport/bankimport_data.xml 2010-03-04 01:53:21 +0000
@@ -0,0 +1,16 @@
1<?xml version="1.0" encoding="utf-8"?>
2<openerp>
3<data>
4
5 <record model="res.partner.bank" id="base.res_partner_agrolait">
6 <field name="acc_number">301915554082</field>
7 <field name="partner_id" ref="base.res_partner_agrolait"/>
8 </record>
9
10 <record model="res.partner.bank" id="base.res_partner_10">
11 <field name="acc_number">050000000017</field>
12 <field name="partner_id" ref="base.res_partner_10"/>
13 </record>
14
15</data>
16</openerp>
017
=== added file 'account_bankimport/bankimport_demo.xml'
--- account_bankimport/bankimport_demo.xml 1970-01-01 00:00:00 +0000
+++ account_bankimport/bankimport_demo.xml 2010-03-04 01:53:21 +0000
@@ -0,0 +1,32 @@
1<?xml version="1.0" encoding="utf-8"?>
2<openerp>
3<data noupdate="1">
4 <record model="res.partner" id="partner_demo1">
5 <field name="name">Tiny S.p.r.l</field>
6 </record>
7 <record model="res.partner.bank" id="partner_bank1">
8 <field name="acc_number">301915554082</field>
9 <field name="state">bank</field>
10 <field name="partner_id" ref="partner_demo1"></field>
11 </record>
12
13 <record model="res.partner" id="partner_demo2">
14 <field name="name">The-design Company</field>
15 </record>
16 <record model="res.partner.bank" id="partner_bank2">
17 <field name="acc_number">050000000017</field>
18 <field name="state">iban</field>
19 <field name="partner_id" ref="partner_demo2"></field>
20 </record>
21
22<!-- <record model="res.partner.bank" id="partner_agrolait">
23 <field name="acc_number">301915554082</field>
24 <field name="partner_id" ref="base.res_partner_agrolait"/>
25 </record>
26
27 <record model="res.partner.bank" id="res_partner_10">
28 <field name="acc_number">050000000017</field>
29 <field name="partner_id" ref="base.res_partner_10"/>
30 </record>-->
31</data>
32</openerp>
033
=== added file 'account_bankimport/bankimport_view.xml'
--- account_bankimport/bankimport_view.xml 1970-01-01 00:00:00 +0000
+++ account_bankimport/bankimport_view.xml 2010-03-04 01:53:21 +0000
@@ -0,0 +1,119 @@
1<?xml version="1.0" encoding="utf-8"?>
2<openerp>
3<data>
4
5 <record model="ir.ui.view" id="view_company_for_bankimport">
6 <field name="name">res.company.form</field>
7 <field name="model">res.company</field>
8 <field name="inherit_id" ref="base.view_company_form"/>
9 <field name="type">form</field>
10 <field name="arch" type="xml">
11 <field name="currency_id" position="after">
12 <separator string="Import Bank Statements" colspan="4"/>
13 <field name="bank_journalid" />
14 <field name="def_payable" />
15 <field name="def_receivable" />
16 <field name="filters" />
17 <field name="bank_file" />
18 </field>
19 </field>
20 </record>
21
22 <record model="ir.ui.view" id="view_account_bankimport_form">
23 <field name="name">account.bankimport.form</field>
24 <field name="model">account.bankimport</field>
25 <field name="type">form</field>
26 <field name="arch" type="xml">
27 <form string="Import bank statements">
28 <field name="name" />
29 <field name="journal_id" />
30 <field name="date" />
31 <field name="user_id" />
32 <field name="statement_id"/>
33 <field name="file"/>
34 <field name="note" colspan="4"/>
35 </form>
36 </field>
37 </record>
38
39
40 <record model="ir.ui.view" id="view_account_bankimport_tree">
41 <field name="name">account.bankimport.tree</field>
42 <field name="model">account.bankimport</field>
43 <field name="type">tree</field>
44 <field name="arch" type="xml">
45 <tree string="Import bank statements">
46 <field name="journal_id" />
47 <field name="date" />
48 <field name="user_id" />
49 </tree>
50 </field>
51 </record>
52
53 <record model="ir.actions.act_window" id="action_account_bankimport">
54 <field name="name">Import bank statements</field>
55 <field name="type">ir.actions.act_window</field>
56 <field name="res_model">account.bankimport</field>
57 <field name="view_type">form</field>
58 <field name="view_mode">tree,form</field>
59 </record>
60
61 <menuitem name="Financial Management/Reporting/Bankimport Statements" id="menu_action_account_bankimport" action="action_account_bankimport" sequence="12" />
62
63 <menuitem name="Financial Management/Periodical Processing/Import Bank Statements" action="wizard_account_bankimport" type="wizard" id="menu_account_bankimport_wizard" sequence="15"/>
64
65 <act_window name="Import Bank Statements"
66 domain="[('statement_id', '=', active_id)]"
67 res_model="account.bankimport"
68 src_model="account.bank.statement"
69 view_type="form"
70 view_mode="tree,form"
71 id="act_account_payment_account_bank_statement"/>
72
73
74<!-- View for adding / changing filters -->
75
76
77
78 <record model="ir.ui.view" id="view_account_bankimport_filters_form">
79 <field name="name">account.bankimport.filters.form</field>
80 <field name="model">account.bankimport.filters</field>
81 <field name="type">form</field>
82 <field name="arch" type="xml">
83 <form string="Define import filters">
84 <field name="filter" />
85 <field name="name" />
86 </form>
87 </field>
88 </record>
89
90
91 <record model="ir.ui.view" id="view_account_bankimport_filters_tree">
92 <field name="name">account.bankimport.filters.tree</field>
93 <field name="model">account.bankimport.filters</field>
94 <field name="type">tree</field>
95 <field name="arch" type="xml">
96 <tree string="Import filters">
97 <field name="filter" />
98 <field name="name" />
99 </tree>
100 </field>
101 </record>
102
103 <record model="ir.actions.act_window" id="action_account_bankimport_filters_tree">
104 <field name="name">Define bankimport filters</field>
105 <field name="res_model">account.bankimport.filters</field>
106 <field name="view_type">form</field>
107 <field name="view_mode">tree,form</field>
108 </record>
109<!--
110 <menuitem name="Financial Management/Reporting/Bankimport Statements" id="menu_account_bankimport" action="action_bank_statement_tree" sequence="12"/>
111-->
112 <menuitem action="action_account_bankimport_filters_tree" id="menu_action_account_bankimport_filters_tree" parent="base.menu_users"/>
113
114
115<!-- **** END ***** -->
116
117
118 </data>
119</openerp>
0120
=== added file 'account_bankimport/bankimport_wizard.xml'
--- account_bankimport/bankimport_wizard.xml 1970-01-01 00:00:00 +0000
+++ account_bankimport/bankimport_wizard.xml 2010-03-04 01:53:21 +0000
@@ -0,0 +1,13 @@
1<?xml version="1.0" encoding="utf-8"?>
2<openerp>
3 <data>
4
5 <wizard
6 string="Import Bank statements file"
7 model="account.bank.statement"
8 name="account.bank_import"
9 id="wizard_account_bankimport"
10 />
11
12 </data>
13</openerp>
014
=== added directory 'account_bankimport/security'
=== added file 'account_bankimport/security/ir.model.access.csv'
--- account_bankimport/security/ir.model.access.csv 1970-01-01 00:00:00 +0000
+++ account_bankimport/security/ir.model.access.csv 2010-03-04 01:53:21 +0000
@@ -0,0 +1,3 @@
1"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
2"access_account_bankimport","account.bankimport","model_account_bankimport","account.group_account_manager",1,1,1,1
3"access_account_bankimport_filters","account.bankimport.filters","model_account_bankimport_filters","account.group_account_manager",1,1,1,1
04
=== added file 'account_bankimport/usage_of_account_bankimport.pdf'
1Binary files account_bankimport/usage_of_account_bankimport.pdf 1970-01-01 00:00:00 +0000 and account_bankimport/usage_of_account_bankimport.pdf 2010-03-04 01:53:21 +0000 differ5Binary files account_bankimport/usage_of_account_bankimport.pdf 1970-01-01 00:00:00 +0000 and account_bankimport/usage_of_account_bankimport.pdf 2010-03-04 01:53:21 +0000 differ
=== added directory 'account_bankimport/wizard'
=== added file 'account_bankimport/wizard/__init__.py'
--- account_bankimport/wizard/__init__.py 1970-01-01 00:00:00 +0000
+++ account_bankimport/wizard/__init__.py 2010-03-04 01:53:21 +0000
@@ -0,0 +1,35 @@
1##############################################################################
2#
3# Copyright (c) 2004-2006 TINY SPRL. (http://tiny.be) and Eddy Boer
4# All Rights Reserved.
5# Fabien Pinckaers <fp@tiny.Be>
6# Eddy Boer <tinyerp@EdbO.xs4all.nl>
7#
8# WARNING: This program as such is intended to be used by professional
9# programmers who take the whole responsability of assessing all potential
10# consequences resulting from its eventual inadequacies and bugs
11# End users who are looking for a ready-to-use solution with commercial
12# garantees and support are strongly adviced to contract a Free Software
13# Service Company
14#
15# This program is Free Software; you can redistribute it and/or
16# modify it under the terms of the GNU General Public License
17# as published by the Free Software Foundation; either version 2
18# of the License, or (at your option) any later version.
19#
20# This program is distributed in the hope that it will be useful,
21# but WITHOUT ANY WARRANTY; without even the implied warranty of
22# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23# GNU General Public License for more details.
24#
25# You should have received a copy of the GNU General Public License
26# along with this program; if not, write to the Free Software
27# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
28#
29##############################################################################
30# I used the code of account_coda as base for this module. The module does
31# exactly the same thing as account_coda. The difference is the file-layout.
32#
33# This module can import .asc-files (BRI-layout).
34#
35import bank_import
036
=== added file 'account_bankimport/wizard/bank_import.py'
--- account_bankimport/wizard/bank_import.py 1970-01-01 00:00:00 +0000
+++ account_bankimport/wizard/bank_import.py 2010-03-04 01:53:21 +0000
@@ -0,0 +1,333 @@
1##############################################################################
2#
3# Copyright (c) 2004-2006 TINY SPRL. (http://tiny.be) and Eddy Boer
4# All Rights Reserved.
5# Fabien Pinckaers <fp@tiny.Be>
6# Eddy Boer <tinyerp@EdbO.xs4all.nl>
7#
8# WARNING: This program as such is intended to be used by professional
9# programmers who take the whole responsability of assessing all potential
10# consequences resulting from its eventual inadequacies and bugs
11# End users who are looking for a ready-to-use solution with commercial
12# garantees and support are strongly adviced to contract a Free Software
13# Service Company
14#
15# This program is Free Software; you can redistribute it and/or
16# modify it under the terms of the GNU General Public License
17# as published by the Free Software Foundation; either version 2
18# of the License, or (at your option) any later version.
19#
20# This program is distributed in the hope that it will be useful,
21# but WITHOUT ANY WARRANTY; without even the implied warranty of
22# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23# GNU General Public License for more details.
24#
25# You should have received a copy of the GNU General Public License
26# along with this program; if not, write to the Free Software
27# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
28#
29##############################################################################
30# I used the code of account_coda as base for this module. The module does
31# exactly the same thing as account_coda. The difference is the file-layout.
32#
33# This module can import .asc-files (BRI-layout).
34#
35import pooler
36import time
37import datetime
38import wizard
39import netsvc
40import base64
41from osv import fields, osv
42
43result_form = """<?xml version="1.0"?>
44<form string="Import ASC Statement">
45<separator colspan="4" string="Results :" />
46 <field name="note" colspan="4" nolabel="1" width="500"/>
47</form>
48"""
49
50result_fields = {
51
52 'note' : {'string':'Log','type':'text'}
53
54}
55
56def _bank_import(self, cr, uid, data, context):
57
58 pool = pooler.get_pool(cr.dbname)
59
60 # setting variables
61 line_name = 0
62 str_log = ""
63 err_log = ""
64 str_log1 = ""
65 st_line_name = line_name
66
67 bank_statement={}
68 bank_statement_lines={}
69 bank_statements=[]
70
71 ########################
72 # building the header. #
73 ########################
74 # First we get the company_id from the user.
75 user_data = pool.get('res.users').browse(cr, uid, uid, context)
76
77 # No we get the company data (journals and the file to read)
78 company_data = pool.get('res.company').browse(cr, uid, user_data.company_id.id, context)
79
80 # create the base
81 bankfile = company_data.bank_file
82 def_pay_acc = company_data.def_payable.id
83 def_rec_acc = company_data.def_receivable.id
84
85 # get todays date and get the period. The todays date will also be used for the Date-field
86 today_date = datetime.date.today()
87 periodDate = today_date.strftime('%Y-%m-%d')
88 period_id = pool.get('account.period').search(cr,uid,[('date_start','<=',periodDate),('date_stop','>=',periodDate)])
89
90 # getting the start data of the balance. We need this from the database
91 # get the latest bank statement from the database (highest id
92 cr.execute('select max(id) from account_bank_statement',)
93 bal_id = cr.fetchone()[0]
94 bal_prev = pool.get('account.bank.statement').browse(cr,uid,bal_id,context)
95
96 if not bal_prev:
97 # switch to 0
98 bal_start = 0
99 else :
100 # use the balance_end_real as the start_balance for the new statement
101 bal_start = bal_prev.balance_end_real
102
103 # fill the bankstatement
104 bank_statement["bank_statement_line"]={}
105 bank_statement['date'] = today_date.strftime('%d/%m/%Y')
106 bank_statement['journal_id']=company_data.bank_journalid.id
107 bank_statement['period_id'] = period_id[0]
108 bank_statement['def_pay_acc'] = def_pay_acc
109 bank_statement['def_rec_acc'] = def_rec_acc
110 bank_statement['state']='draft'
111 bank_statement["balance_start"]= bal_start
112 # Because the company is linked to a Partner, we can get also the
113 # acc_number. We can even use it to verify if the right bankstatements
114 # were be imported (acc_numbers should be equal).
115 acc_number_id = pool.get('res.partner.bank').search(cr, uid, [('partner_id','=',company_data.partner_id.id)])
116
117 # check if we got a bank / iban number
118 if len(acc_number_id) > 0:
119 bank_statement["acc_number"] = []
120 # create a list of numbers
121 for acc in acc_number_id:
122 acc_number = pool.get('res.partner.bank').browse(cr,uid,acc)
123
124 if acc_number.acc_number :
125 bank_statement["acc_number"].append(acc_number.acc_number.lower())
126 else :
127 bank_statement["acc_number"].append(acc_number.iban.lower())
128
129 else :
130 raise wizard.except_wizard('ERROR !', 'We got no bank / iban number.')
131 # str_log1 = "We got no bank / iban number!"
132 # return {'note':str_log1 ,'journal_id':0 , 'asc':0,'statment_id':0}
133
134 # We use the company name and not the partner name
135 bank_statement["acc_holder"] = company_data.name
136
137 # setting the end value of the balance
138 bal_end = bal_start
139
140 bank_statement['bal_start'] = bal_start
141 bank_statement['bal_end'] = bal_end
142
143 # based on the filter we parse the document
144 filterObject = 'account.bankimport.filter.' + str(company_data.filters)
145
146 bank_data = pooler.get_pool(cr.dbname).get( filterObject )
147
148 exec "from filters import " + company_data.filters.name + " as parser"
149 #__import__( company_data.filters.name )
150
151
152 # opening the file speficied as bank_file and read the data
153 try:
154 bf = open(bankfile, 'r')
155
156 try:
157 mydata = bf.read()
158 recordlist = mydata.split('\n') # bf.readlines()
159 recordlist.pop()
160 data = parser.get_data(self,cr,uid,recordlist,bank_statement) # parse the data through the filter
161 finally:
162 bf.close()
163 except IOError:
164 raise
165
166
167 bank_statements.append(bank_statement)
168 bkst_list=[]
169 bk_st_id=0
170
171 nb_err=0
172 err_log=''
173 str_log=''
174 std_log=''
175 str_log1 = str_log1 + " Bank Statements were Imported : "
176 str_not=''
177 str_not1=''
178
179 period = []
180
181
182 # check if we have new bank statement lines.
183 if len(data) >= 1:
184 p_bank_state = []
185 p_state_line = {}
186
187 # move each line to the right period
188 for line in data:
189 periodDate = time.strftime('%Y-%m-%d', time.strptime(line['date'], '%d/%m/%y') )
190
191 # get the period
192 periodD = pool.get('account.period').search(cr,uid,[('date_start','<=',periodDate),('date_stop','>=',periodDate)])[0]
193
194 # check if the period already exists in the dictonairy
195 if periodD in p_state_line:
196 w = p_state_line[periodD] # fill the array with existing data
197 else:
198 w = []
199
200 w.append(line)
201 p_state_line[periodD] = w
202 if periodD not in period:
203 period.append(periodD)
204
205 # sort the periods
206 period.sort()
207
208 # set the start balance
209 bal_start = float(bank_statement['balance_start'])
210
211 # we have now a dictionary of statement lines based on the period, so we can create the bankstatements now
212 for li in period:
213 lines = p_state_line[li]
214 total = 0.0
215
216 # calculate the ending balance
217 for lin in lines:
218 total += float(lin['amount'])
219 bal_end += total
220
221 try:
222 bk_st_id = pool.get('account.bank.statement').create(cr,uid,{
223 'journal_id': bank_statement['journal_id'],
224 'date':today_date.strftime('%Y-%m-%d'),
225 'period_id':li,
226 'balance_start': bal_start,
227 'balance_end_real': bal_end,
228 'state':'draft',
229 })
230
231 for line in lines:
232 str_not1="Partner name : %s\nPartner Account Number : %s\nCommunication : %s\nValue Date : %s\nEntry Date : %s\n" %(line["contry_name"],line["cntry_number"],line["free_comm"],line["val_date"],line["entry_date"][0])
233
234 id=pool.get('account.bank.statement.line').create(cr,uid,{
235 'name':line['name'],
236 'date': time.strftime('%Y-%m-%d', time.strptime(line['date'], '%d/%m/%y') ),
237 'amount': line['amount'],
238 'partner_id':line['partner_id'] or 0,
239 'account_id':line['account_id'],
240 'statement_id': bk_st_id,
241 'note':str_not1,
242 'ref':line['ref'],
243 'bank_accnumber':line['partner_acc_number'],
244 'type':line['type'],
245 })
246 cr.commit()
247
248 str_not= "\n \n Account Number: %s \n Account Holder Name: %s " %(bank_statement["acc_number"],bank_statement["acc_holder"])
249 std_log = std_log + "\nDate : %s, Starting Balance : %.2f , Ending Balance : %.2f "\
250 %(bank_statement['date'], bal_start, bal_end)
251 bkst_list.append(bk_st_id)
252
253 # move ending balance to the start balance
254 bal_start = bal_end
255
256 except osv.except_osv, e:
257 cr.rollback()
258
259 except osv.except_osv, e:
260 cr.rollback()
261 nb_err+=1
262 err_log= err_log +'\n Application Error : ' + str(e)
263 raise # REMOVEME
264
265 except Exception, e:
266 cr.rollback()
267 nb_err+=1
268 err_log= err_log +'\n System Error : '+str(e)
269 raise # REMOVEME
270
271 except :
272 cr.rollback()
273 nb_err+=1
274 err_log= err_log +'\n Unknown Error'
275 raise
276 err_log= err_log + '\n\nNumbers of statements : '+ str(len([bkst_list]))
277 err_log= err_log + '\nNumber of error :'+ str(nb_err) +'\n'
278
279
280 pool.get('account.bankimport').create(cr, uid,{
281 'file': base64.encodestring(mydata),
282 'statement_id':bk_st_id,
283 'note':str(str_log1) + str(str_not) + str(std_log+err_log),
284 'journal_id':company_data.bank_journalid.id,
285 'date':time.strftime("%Y-%m-%d"),
286 'user_id':uid,
287 })
288 else:
289 raise wizard.except_wizard('WARNING !', 'No new records found, nothing imported.')
290 # close the file
291 bf.close()
292# return {}
293
294 return {'note':str_log1 + std_log + err_log ,'journal_id': company_data.bank_journalid.id, 'asc': company_data.bank_file,'statment_id':bkst_list}
295
296
297class bank_import(wizard.interface):
298 def _action_open_window(self, cr, uid, data, context):
299 form=data['form']
300 return {
301 'domain':"[('id','in',(%s,))]"%(",".join(map(str,form['statment_id']))),
302 'name': 'Statement',
303 'view_type': 'form',
304 'view_mode': 'form,tree',
305 'res_model': 'account.bank.statement',
306 'view_id': False,
307 'type': 'ir.actions.act_window',
308 'res_id':form['statment_id'],
309 }
310 states = {
311 'init' : {
312 'actions' : [_bank_import],
313 'result' : {'type' : 'form',
314 'arch' : result_form,
315 'fields' : result_fields,
316 'state' : [('end', '_Close', 'gtk-close'),('open', '_Open Statement','gtk-ok')]}
317 },
318
319 'extraction' : {
320 'actions' : [_bank_import],
321 'result' : {'type' : 'form',
322 'arch' : result_form,
323 'fields' : result_fields,
324 'state' : [('end', '_Close', 'gtk-close'),('open', '_Open Statement','gtk-ok')]}
325 },
326 'open': {
327 'actions': [],
328 'result': {'type': 'action', 'action': _action_open_window, 'state': 'end'}
329
330 },
331
332 }
333bank_import("account.bank_import")
0334
=== added directory 'account_bankimport/wizard/filters'
=== added file 'account_bankimport/wizard/filters/__init__.py'
--- account_bankimport/wizard/filters/__init__.py 1970-01-01 00:00:00 +0000
+++ account_bankimport/wizard/filters/__init__.py 2010-03-04 01:53:21 +0000
@@ -0,0 +1,36 @@
1##############################################################################
2#
3# Copyright (c) 2004-2006 TINY SPRL. (http://tiny.be) and Eddy Boer
4# All Rights Reserved.
5# Fabien Pinckaers <fp@tiny.Be>
6# Eddy Boer <tinyerp@EdbO.xs4all.nl>
7#
8# WARNING: This program as such is intended to be used by professional
9# programmers who take the whole responsability of assessing all potential
10# consequences resulting from its eventual inadequacies and bugs
11# End users who are looking for a ready-to-use solution with commercial
12# garantees and support are strongly adviced to contract a Free Software
13# Service Company
14#
15# This program is Free Software; you can redistribute it and/or
16# modify it under the terms of the GNU General Public License
17# as published by the Free Software Foundation; either version 2
18# of the License, or (at your option) any later version.
19#
20# This program is distributed in the hope that it will be useful,
21# but WITHOUT ANY WARRANTY; without even the implied warranty of
22# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23# GNU General Public License for more details.
24#
25# You should have received a copy of the GNU General Public License
26# along with this program; if not, write to the Free Software
27# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
28#
29##############################################################################
30# I used the code of account_coda as base for this module. The module does
31# exactly the same thing as account_coda. The difference is the file-layout.
32#
33# This module can import .asc-files (BRI-layout).
34#
35
36#import
0\ No newline at end of file37\ No newline at end of file
138
=== added file 'account_bankimport/wizard/filters/asc.py'
--- account_bankimport/wizard/filters/asc.py 1970-01-01 00:00:00 +0000
+++ account_bankimport/wizard/filters/asc.py 2010-03-04 01:53:21 +0000
@@ -0,0 +1,186 @@
1##############################################################################
2#
3# Copyright (c) 2004-2006 TINY SPRL. (http://tiny.be) and Eddy Boer
4# All Rights Reserved.
5# Fabien Pinckaers <fp@tiny.Be>
6# Eddy Boer <tinyerp@EdbO.xs4all.nl>
7#
8# WARNING: This program as such is intended to be used by professional
9# programmers who take the whole responsability of assessing all potential
10# consequences resulting from its eventual inadequacies and bugs
11# End users who are looking for a ready-to-use solution with commercial
12# garantees and support are strongly adviced to contract a Free Software
13# Service Company
14#
15# This program is Free Software; you can redistribute it and/or
16# modify it under the terms of the GNU General Public License
17# as published by the Free Software Foundation; either version 2
18# of the License, or (at your option) any later version.
19#
20# This program is distributed in the hope that it will be useful,
21# but WITHOUT ANY WARRANTY; without even the implied warranty of
22# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23# GNU General Public License for more details.
24#
25# You should have received a copy of the GNU General Public License
26# along with this program; if not, write to the Free Software
27# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
28#
29##############################################################################
30# I used the code of account_coda as base for this module. The module does
31# exactly the same thing as account_coda. The difference is the file-layout.
32#
33# This filter imports .asc-files (BRI-layout).
34#
35
36from osv import fields, osv
37import time
38import pooler
39import conversion
40import string
41
42def get_data(self, cr, uid, bankData, bank_statement):
43
44 pool = pooler.get_pool(cr.dbname)
45
46 bal_end = bank_statement['bal_end']
47 bank_statement_lines={}
48 bank_statements=[]
49 line_name = 0
50 st_line_name = line_name
51 code4 = 0
52
53 # parse every line in the file and get the right data
54 for line in bankData:
55 if len(line) <= 23: # the end of the file has an empty line
56 pass
57 else:
58 # check if bankaccount in the file matches with the bankaccount of the database
59 bankaccount = line[0:10]
60 # Look if we can match our number with a number in the list
61 if bankaccount.lower() in bank_statement["acc_number"]:
62 # look for the recordtype
63 # 2 is the baserecord. We can also have 3 and 4. These are followrecords.
64 if line[23] == '2' and code4 == 0:
65 st_line_name = line_name
66 st_line = {}
67 st_line['statement_id']=0
68 st_line['name'] = line[48:72]
69 st_line['date'] = conversion.str2date(line[87:93]) # boekingsdatum
70 st_line_amt = conversion.list2float(line[73:86])
71
72 if line[86] == "D":
73 st_line_amt = - st_line_amt
74 st_line['account_id'] = bank_statement['def_pay_acc']
75 else:
76 st_line['account_id'] = bank_statement['def_rec_acc']
77
78 st_line['entry_date']=time.strftime('%Y-%m-%d',time.strptime(conversion.str2date(line[87:93]),"%d/%m/%y")),
79 st_line['val_date']=time.strftime('%Y-%m-%d',time.strptime(conversion.str2date(line[93:99]),"%d/%m/%y")),
80
81 st_line['partner_id']=0
82 st_line['amount'] = st_line_amt
83 st_line['type'] = 'general'
84
85 st_line_partner_acc = str(line[38:48]).strip()
86 if st_line_partner_acc[:1] == '0':
87 st_line_partner_acc = st_line_partner_acc[1::]
88
89 st_line['partner_acc_number'] = st_line_partner_acc
90
91 cntry_number=st_line_partner_acc
92 contry_name=line[48:72]
93 bank_ids = pool.get('res.partner.bank').search(cr,uid,[('acc_number','=',st_line_partner_acc)])
94
95 if bank_ids:
96 bank = pool.get('res.partner.bank').browse(cr,uid,bank_ids[0],context={})
97 st_line['cntry_number']=cntry_number
98 st_line['contry_name']=contry_name
99
100 if st_line and bank.partner_id:
101 st_line['partner_id']=bank.partner_id.id
102
103 # Create a check if we don't already imported this statement
104 # We make an unique check in the database with
105 # partner, date and amount
106 check_ids = pool.get('account.bank.statement.line').search(cr,uid,[('amount','=',st_line_amt), ('date','=',st_line['entry_date']),('partner_id','=',bank.partner_id.id)])
107
108
109 # check if the partner is a supplier or customer
110 # if both, we don't add a account due to credit invoices
111 partner = pool.get('res.partner').browse(cr,uid,bank.partner_id,context={})
112
113 st_line['type']='general'
114
115 if bank.partner_id.supplier == True and bank.partner_id.customer == False:
116 st_line['account_id']= bank.partner_id.property_account_receivable.id
117 st_line['type']='supplier'
118
119 elif bank.partner_id.customer == True and bank.partner_id.supplier == False :
120 st_line['account_id']= bank.partner_id.property_account_payable.id
121 st_line['type']='customer'
122
123 #if st_line['amount'] < 0 :
124 # st_line['account_id']= bank.partner_id.property_account_payable.id
125 #else :
126 # st_line['account_id']= bank.partner_id.property_account_receivable.id
127
128 else:
129 st_line['cntry_number']=cntry_number
130 st_line['contry_name']=contry_name
131
132 # Create a check if we don't already imported this statement
133 # We make an unique check in the database with
134 # name, date and amount
135 check_ids = pool.get('account.bank.statement.line').search(cr,uid,[('amount','=',st_line_amt), ('date','=',st_line['entry_date']), ('name','=',contry_name)])
136
137 st_line['free_comm']= ''
138 st_line['ref']=''
139
140 elif line[23] == '3' and code4 == 0 : # get some information about the transaction
141 st_line['free_comm']=line[56:119]
142 refe = line[56:119].split(' ')
143 stri = ''
144 for t in refe:
145 if t.strip():
146 stri = stri + ' ' + ''.join(t.strip())
147
148 st_line['ref']=stri
149 code4 = int(line[120])
150 if not check_ids:
151 line_name += 1
152 st_line_name = line_name
153
154 elif line[23] == '4': # get some more information about the transaction
155 st_line['free_comm'] = st_line['free_comm'] + "\n" + line[24:119]
156 code4 = code4 - 1
157
158 if not check_ids:
159 bank_statement_lines[line_name]=st_line
160 # bank_statements.append(st_line)
161
162
163 # end if
164 # end for
165
166
167
168 # delete latest row from the list because its an empty row
169 if len(bank_statement_lines) >= 1:
170 del bank_statement_lines[ line_name ] # delete latest row from the list
171 for test in bank_statement_lines:
172 bank_statements.append(bank_statement_lines[test])
173
174 # count the end balance
175# for value in bank_statement_lines:
176# line=bank_statement_lines[value]
177# bal_end += line['amount']
178
179# bank_statement["balance_end_real"]= bal_end
180# bank_statement["bank_statement_line"]=bank_statement_lines
181
182 return bank_statements
183
184
185 #end for
186#select distinct b.partner_id, p.ref from res_partner_bank b, res_partner p where b.bank='51' and b.partner_id = p.id
0187
=== added file 'account_bankimport/wizard/filters/coda.py'
--- account_bankimport/wizard/filters/coda.py 1970-01-01 00:00:00 +0000
+++ account_bankimport/wizard/filters/coda.py 2010-03-04 01:53:21 +0000
@@ -0,0 +1,150 @@
1##############################################################################
2#
3# Copyright (c) 2004-2006 TINY SPRL. (http://tiny.be) and Eddy Boer
4# All Rights Reserved.
5# Fabien Pinckaers <fp@tiny.Be>
6# Eddy Boer <tinyerp@EdbO.xs4all.nl>
7#
8# WARNING: This program as such is intended to be used by professional
9# programmers who take the whole responsability of assessing all potential
10# consequences resulting from its eventual inadequacies and bugs
11# End users who are looking for a ready-to-use solution with commercial
12# garantees and support are strongly adviced to contract a Free Software
13# Service Company
14#
15# This program is Free Software; you can redistribute it and/or
16# modify it under the terms of the GNU General Public License
17# as published by the Free Software Foundation; either version 2
18# of the License, or (at your option) any later version.
19#
20# This program is distributed in the hope that it will be useful,
21# but WITHOUT ANY WARRANTY; without even the implied warranty of
22# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23# GNU General Public License for more details.
24#
25# You should have received a copy of the GNU General Public License
26# along with this program; if not, write to the Free Software
27# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
28#
29##############################################################################
30# I used the code of account_coda as base for this module. The module does
31# exactly the same thing as account_coda. The difference is the file-layout.
32#
33# This filter imports .coda-files (CODA-layout).
34#
35
36
37from osv import fields, osv
38import time
39import pooler
40import conversion
41
42
43def get_data(self, cr, uid, bankData, bank_statement):
44 pool = pooler.get_pool(cr.dbname)
45
46 bal_end = bank_statement['bal_end']
47 bank_statement_lines={}
48 bank_statements=[]
49 line_name = 0
50 str_log = ""
51 err_log = ""
52 str_log1 = ""
53 st_line_name = line_name
54
55 # parse every line in the file and get the right data
56 for line in bankData:
57 if line[0] == '0':
58 # header data
59# bank_statement={}
60# bank_statement_lines={}
61 bank_statement["bank_statement_line"]={}
62 #bank_statement['date'] = conversion.str2date(line[5:11])
63 #period_id = pool.get('account.period').search(cr,uid,[('date_start','<=',time.strftime("%y/%m/%d",time.strptime(bank_statement['date'],"%d/%m/%y"))),('date_stop','>=',time.strftime("%y/%m/%d",time.strptime(bank_statement['date'],"%d/%m/%y")))])
64 #period_id = pool.get('account.period').search(cr,uid,[('date_start','<=',time.strftime('%Y-%m-%d',time.strptime(bank_statement['date'],"%y/%m/%d"))),('date_stop','>=',time.strftime('%Y-%m-%d',time.strptime(bank_statement['date'],"%y/%m/%d")))])
65 #bank_statement['period_id'] = period_id[0]
66 #bank_statement['state']='draft'
67 elif line[0] == '1':
68 # old balance data
69 bal_start = conversion.list2float(line[43:58])
70 if line[42] == '1':
71 bal_start = - bal_start
72 bank_statement["balance_start"]= bal_start
73 bank_statement["acc_number"]=line[5:17]
74 bank_statement["acc_holder"]=line[64:90]
75
76 elif line[0]=='2':
77 # movement data record 2
78 if line[1]=='1':
79 # movement data record 2.1
80 st_line = {}
81 st_line['statement_id']=0
82 st_line['name'] = line[2:10]
83 st_line['date'] = conversion.str2date(line[115:121])
84 st_line_amt = conversion.list2float(line[32:47])
85
86 if line[61]=='1':
87 st_line['ref']=(line[65:77])
88 st_line['free_comm']=''
89 else:
90 st_line['free_comm']=line[62:115]
91 st_line['ref']=''
92
93 st_line['val_date']=time.strftime('%Y-%m-%d',time.strptime(conversion.str2date(line[47:53]),"%y/%m/%d")),
94 st_line['entry_date']=time.strftime('%Y-%m-%d',time.strptime(conversion.str2date(line[115:121]),"%y/%m/%d")),
95 st_line['partner_id']=0
96 if line[31] == '1':
97 st_line_amt = - st_line_amt
98 st_line['account_id'] = bank_statement['def_pay_acc']
99 else:
100 st_line['account_id'] = bank_statement['def_rec_acc']
101 st_line['amount'] = st_line_amt
102 bank_statement_lines[st_line['name']]=st_line
103 bank_statement["bank_statement_line"]=bank_statement_lines
104
105 elif line[1] == '3':
106 # movement data record 3.1
107 st_line_name = line[2:10]
108 st_line_partner_acc = str(line[10:47]).strip()
109 cntry_number=line[10:47]
110 contry_name=line[47:125]
111 #bank_ids = pool.get('res.partner.bank').search(cr,uid,[('number','=',st_line_partner_acc)])
112 bank_ids = pool.get('res.partner.bank').search(cr,uid,[('acc_number','=',st_line_partner_acc)])
113 if bank_ids:
114 bank = pool.get('res.partner.bank').browse(cr,uid,bank_ids[0],context={})
115 line=bank_statement_lines[st_line_name]
116 line['cntry_number']=cntry_number
117 line['contry_name']=contry_name
118
119 if line and bank.partner_id:
120 line['partner_id']=bank.partner_id.id
121 if line['amount'] < 0 :
122 line['account_id']=bank.partner_id.property_account_payable.id
123 else :
124 line['account_id']=bank.partner_id.property_account_receivable.id
125
126 bank_statement_lines[st_line_name]=line
127 else:
128 line=bank_statement_lines[st_line_name]
129 line['cntry_number']=cntry_number
130 line['contry_name']=contry_name
131 bank_statement_lines[st_line_name]=line
132
133
134 bank_statement["bank_statement_line"]=bank_statement_lines
135 elif line[0]=='3':
136 pass
137 elif line[0]=='8':
138 # new balance record
139 bal_end = conversion.list2float(line[42:57])
140 if line[41] == '1':
141 bal_end = - bal_end
142 bank_statement["balance_end_real"]= bal_end
143
144 elif line[0]=='9':
145 # footer record
146 pass
147 #bank_statements.append(bank_statement)
148 #end for
149 return bank_statement
150
0151
=== added file 'account_bankimport/wizard/filters/conversion.py'
--- account_bankimport/wizard/filters/conversion.py 1970-01-01 00:00:00 +0000
+++ account_bankimport/wizard/filters/conversion.py 2010-03-04 01:53:21 +0000
@@ -0,0 +1,20 @@
1import time
2
3def str2date(date_str):
4 return time.strftime("%y/%m/%d",time.strptime(date_str,"%d%m%y"))
5
6def str2float(str):
7 try:
8 return float(str)
9 except:
10 return 0.0
11
12def list2float(lst):
13 try:
14 return str2float((lambda s : s[:-2] + '.' + s[-2:])(lst))
15 except:
16 return 0.0
17
18def list2str(lst):
19 return str(lst).strip('[]').replace(',','').replace('\'','')
20
021
=== added file 'account_bankimport/wizard/filters/mt940.py'
--- account_bankimport/wizard/filters/mt940.py 1970-01-01 00:00:00 +0000
+++ account_bankimport/wizard/filters/mt940.py 2010-03-04 01:53:21 +0000
@@ -0,0 +1,173 @@
1##############################################################################
2#
3# Copyright (c) 2004-2006 TINY SPRL. (http://tiny.be) and Peter Dapper
4# All Rights Reserved.
5# Peter Dapper <verkoop@of-is.nl>
6#
7# WARNING: This program as such is intended to be used by professional
8# programmers who take the whole responsability of assessing all potential
9# consequences resulting from its eventual inadequacies and bugs
10# End users who are looking for a ready-to-use solution with commercial
11# garantees and support are strongly adviced to contract a Free Software
12# Service Company
13#
14# This program is Free Software; you can redistribute it and/or
15# modify it under the terms of the GNU General Public License
16# as published by the Free Software Foundation; either version 2
17# of the License, or (at your option) any later version.
18#
19# This program is distributed in the hope that it will be useful,
20# but WITHOUT ANY WARRANTY; without even the implied warranty of
21# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22# GNU General Public License for more details.
23#
24# You should have received a copy of the GNU General Public License
25# along with this program; if not, write to the Free Software
26# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
27#
28##############################################################################
29#
30# This filter imports .mt940-files
31#
32
33from osv import fields, osv
34import time
35import pooler
36import conversion
37import string
38import copy
39
40def get_acc_number(statement_line):
41 pointer = 0
42 only_acc = ""
43 result=[]
44 # one of my suppliers uses incasso, and does not use white space in .940 file between bank account and name
45 while statement_line[pointer]!= " " and statement_line[pointer]!= "C" and statement_line[pointer]!= "D" and statement_line[pointer]!= "Q":
46 only_acc = only_acc+statement_line[pointer]
47 pointer += 1
48 return only_acc
49
50
51def get_number(statement_line):
52 pointer = 7
53 only_amount = ""
54 while statement_line[pointer] in ["0","1","2","3","4","5","6","7","8","9",","]:
55 only_amount = only_amount+statement_line[pointer]
56 pointer += 1
57 only_amount = only_amount.replace(",",".")
58 return only_amount
59
60
61
62def parse_sequence(bank_statement,bank, cr, uid,):
63 pool = pooler.get_pool(cr.dbname)
64 st_line = {}
65 bank_statement_output=[]
66 current=0
67 while current < len(bank_statement):
68 #if ':61:' in bank_statement[current]:
69 if bank_statement[current].has_key(':61:'):
70 # Pfff.. a line we can use. Gives us the date, debit/credit, and amount
71 st_line['date']=conversion.str2date(bank_statement[current][':61:'][0:6])
72 entry_date = time.strftime('%Y-%m-%d',time.strptime(conversion.str2date(bank_statement[current][':61:'][0:6]),"%d/%m/%y")),
73 st_line['val_date'] = time.strftime('%Y-%m-%d',time.strptime(conversion.str2date(bank_statement[current][':61:'][0:6]),"%d/%m/%y")),
74 st_line['entry_date']=entry_date
75 # Pfff...get amount
76 amount =round(float(get_number(bank_statement[current][':61:'])),2)
77 st_line['amount']=amount
78 # Getting rich or poor
79 if bank_statement[current][':61:'][6] == "D":
80 st_line['account_id'] = bank['def_pay_acc']
81 st_line['amount'] = - st_line['amount']
82 # chek_ids did not work correctly because the amount could also be negativ
83 amount = - amount
84 else:
85 st_line['account_id'] = bank['def_rec_acc']
86 # Well, that was the transaction, now the details, directly next line..
87 current += 1
88 if bank_statement[current].has_key(':68:'):
89 st_line['free_comm'] = " "
90 st_line['partner_id'] = 0
91 st_line['type'] = 'general'
92 st_line['free_comm'] = " "
93 st_line['partner_acc_number'] = get_acc_number(bank_statement[current][':68:'])
94 st_line['cntry_number'] = get_acc_number(bank_statement[current][':68:'])
95 st_line['contry_name'] =bank_statement[current][':68:'][len(st_line['cntry_number']):]
96 st_line['name'] = bank_statement[current][':68:'][len(st_line['cntry_number']):]
97 st_line['ref'] =" " # Sometimes .. there is no ref. Still, it is being used by other scripts.
98 # Houston, we have a problem.. ING uses nicely a second :86: code, Postbank does not ... (back to the filling of the list,.done)
99 # See if we have a next rule, only description!!
100 current += 1
101 if bank_statement[current].has_key(':68:'):
102 st_line['ref'] =bank_statement[current][':68:'][0:]
103 # extra comment.. filling the free_comm
104 current += 1
105 if bank_statement[current].has_key(':68:'):
106 st_line['free_comm'] = bank_statement[current][':68:'][0:]
107 else:
108 current -= 1
109 # check if there is already a statement like this...
110 check_ids = pool.get('account.bank.statement.line').search(cr,uid,[('amount','=',amount), ('date','=',entry_date),('name','=',st_line['name'])])
111 # check if there already is a relation ..., and use the ID
112 bank_ids = pool.get('res.partner.bank').search(cr,uid,[('acc_number','=',st_line['partner_acc_number'])])
113 if bank_ids:
114 bank = pool.get('res.partner.bank').browse(cr,uid,bank_ids[0],context={})
115 if bank.partner_id:
116 st_line['partner_id'] = bank.partner_id.id
117 partner = pool.get('res.partner').browse(cr,uid,bank.partner_id,context={})
118 if bank.partner_id.supplier == True and bank.partner_id.customer == False:
119 st_line['account_id'] = bank.partner_id.property_account_receivable.id
120 st_line['type'] ='supplier'
121 elif bank.partner_id.customer == True and bank.partner_id.supplier == False :
122 st_line['account_id'] = bank.partner_id.property_account_payable.id
123 st_line['type'] ='customer'
124 # ..Let see if we can make that just one line of imput
125 print st_line
126 if not check_ids:
127 bank_statement_output.append(st_line.copy())
128
129
130
131 current += 1
132 return bank_statement_output
133
134
135def fill_simple_list(bankData):
136 current = 0
137 bank_statement_lines={}
138 bank_statements_list=[]
139 while current < len(bankData):
140 # codes used are 20,25,28,28c,60m,61,86,62,64,65. Only 61 and 68 are intresting (if you want more checks 25 and 60 are intresting)
141 statement_line = string.find(bankData[current], ':61:')
142 statement_description = string.find(bankData[current], ':86:')
143 # these codes we use to determin the possible end of the description
144 closing_balance = string.find(bankData[current], ':62F:')
145 closing_balance_available = string.find(bankData[current], ':64:')
146 if statement_line >= 0:
147 bank_statement_lines[":61:"]=bankData[current][4:]
148 if statement_description >= 0:
149 bank_statement_lines[":68:"]=bankData[current][4:]
150 if closing_balance >= 0:
151 bank_statement_lines[":62F:"]=bankData[current][5:]
152 if closing_balance_available >= 0:
153 bank_statement_lines[":64:"]=bankData[current][4:]
154 if bankData[current][0]!=":" and bankData[current][0]!="-" :
155 # some banks use LF , an not an extra :68:, so mutch for a standerd
156 bank_statement_lines[":68:"]=bankData[current][0:]
157 if statement_line >= 0 or statement_description >= 0 or statement_description >= 0 or closing_balance_available>= 0:
158 bank_statements_list.append(bank_statement_lines.copy())
159 bank_statement_lines={}
160 current += 1
161 return bank_statements_list
162
163
164def get_data(self, cr, uid, bankData, bank_statement):
165 #pool = pooler.get_pool(cr.dbname)
166 bank_statement_list=[]
167 bank_statement_output=[]
168 bank_statement_list = fill_simple_list(bankData) #just keeping it simple
169 bank_statement_output=parse_sequence(bank_statement_list,bank_statement,cr, uid,)
170 print bank_statement_output
171 return bank_statement_output
172
173
0174
=== added directory 'account_banking'
=== renamed directory 'account_banking' => 'account_banking.moved'
=== added file 'account_banking/__init__.py'
--- account_banking/__init__.py 1970-01-01 00:00:00 +0000
+++ account_banking/__init__.py 2010-03-04 01:53:21 +0000
@@ -0,0 +1,34 @@
1# -*- encoding: utf-8 -*-
2##############################################################################
3#
4# Copyright (C) 2009 EduSense BV (<http://www.edusense.nl>).
5# All Rights Reserved
6#
7# WARNING: This program as such is intended to be used by professional
8# programmers who take the whole responsability of assessing all potential
9# consequences resulting from its eventual inadequacies and bugs
10# End users who are looking for a ready-to-use solution with commercial
11# garantees and support are strongly adviced to contract EduSense BV
12#
13# This program is free software: you can redistribute it and/or modify
14# it under the terms of the GNU General Public License as published by
15# the Free Software Foundation, either version 3 of the License, or
16# (at your option) any later version.
17#
18# This program is distributed in the hope that it will be useful,
19# but WITHOUT ANY WARRANTY; without even the implied warranty of
20# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21# GNU General Public License for more details.
22#
23# You should have received a copy of the GNU General Public License
24# along with this program. If not, see <http://www.gnu.org/licenses/>.
25#
26##############################################################################
27print 'Importing account_banking.account_banking'
28import account_banking
29print 'Importing account_banking.parsers'
30import parsers
31print 'Importing account_banking.wizard'
32import wizard
33
34# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
035
=== added file 'account_banking/__terp__.py'
--- account_banking/__terp__.py 1970-01-01 00:00:00 +0000
+++ account_banking/__terp__.py 2010-03-04 01:53:21 +0000
@@ -0,0 +1,97 @@
1##############################################################################
2#
3# Copyright (C) 2009 EduSense BV (<http://www.edusense.nl>).
4# All Rights Reserved
5#
6# WARNING: This program as such is intended to be used by professional
7# programmers who take the whole responsability of assessing all potential
8# consequences resulting from its eventual inadequacies and bugs
9# End users who are looking for a ready-to-use solution with commercial
10# garantees and support are strongly adviced to contract EduSense BV
11#
12# This program is free software: you can redistribute it and/or modify
13# it under the terms of the GNU General Public License as published by
14# the Free Software Foundation, either version 3 of the License, or
15# (at your option) any later version.
16#
17# This program is distributed in the hope that it will be useful,
18# but WITHOUT ANY WARRANTY; without even the implied warranty of
19# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20# GNU General Public License for more details.
21#
22# You should have received a copy of the GNU General Public License
23# along with this program. If not, see <http://www.gnu.org/licenses/>.
24#
25##############################################################################
26{
27 'name': 'Account Banking',
28 'version': '0.1',
29 'license': 'GPL-3',
30 'author': 'EduSense BV',
31 'category': 'Account Banking',
32 'depends': ['base', 'base_iban', 'account', 'account_payment'],
33 'init_xml': [],
34 'update_xml': [
35 #'security/ir.model.access.csv',
36 'account_banking_import_wizard.xml',
37 'account_banking_view.xml',
38 'account_banking_workflow.xml',
39 ],
40 'description': '''
41 Module to do banking.
42
43 This modules tries to combine all current banking import and export
44 schemes. Rationale for this is that it is quite common to have foreign
45 bank account numbers next to national bank account numbers. The current
46 approach, which hides the national banking interface schemes in the
47 l10n_xxx modules, makes it very difficult to use these simultanious.
48 A more banking oriented approach seems more logical and cleaner.
49
50 Changes to default OpenERP:
51
52 * Puts focus on the real life messaging with banks:
53 + Bank statement lines upgraded to independent bank transactions.
54 + Banking statements have no special accountancy meaning, they're just
55 message envelopes for a number of bank transactions.
56 + Bank statements can be either encoded by hand to reflect the document
57 version of Bank Statements, or created as an optional side effect of
58 importing Bank Transactions.
59
60 * Preparations for SEPA:
61 + IBAN accounts are the standard in the SEPA countries
62 + local accounts are derived from SEPA (excluding Turkey) but are
63 considered to be identical to the corresponding SEPA account.
64 + Banks are identified with either Country + Bank code + Branch code or BIC
65 + Each bank can have its own pace in introducing SEPA into their
66 communication with their customers.
67 + National online databases can be used to convert BBAN's to IBAN's.
68
69 * Adds dropin extensible import facility for bank communication in:
70 + MultiBank (NL) format transaction files,
71 - (todo) MT940 (Swift) format transaction files,
72 - (todo) CODA (BE) format transaction files,
73 - (wish) SEPA Credits (ISO 200022) messages,
74
75 * Extends payments for digital banking:
76 + Adapted workflow in payments to reflect banking operations
77 + Relies on account_payment mechanics to extend with export generators.
78 - ClieOp3 (NL) payment and direct debit orders files available as
79 account_banking_nl_clieop
80 - (wish) BTL91 (NL) payment orders files (no format description available),
81 - (wish) SEPA Direct Debits (ISO 200022) messages
82
83 * Additional features for the import/export mechanism:
84 + Automatic matching and creation of bank accounts, banks and partners,
85 during import of statements.
86 + Automatic matching with invoices and payments.
87 + Sound import mechanism, allowing multiple imports of the same
88 transactions repeated over multiple files.
89 + Journal configuration per bank account.
90 + Business logic and format parsing strictly separated to ease the
91 development of new parsers.
92 + No special configuration needed for the parsers, new parsers are
93 recognized and made available at server (re)start.
94 ''',
95 'active': False,
96 'installable': True,
97}
098
=== added file 'account_banking/account_banking.py'
--- account_banking/account_banking.py 1970-01-01 00:00:00 +0000
+++ account_banking/account_banking.py 2010-03-04 01:53:21 +0000
@@ -0,0 +1,752 @@
1# -*- encoding: utf-8 -*-
2##############################################################################
3#
4# Copyright (C) 2009 EduSense BV (<http://www.edusense.nl>).
5# All Rights Reserved
6#
7# This program is free software: you can redistribute it and/or modify
8# it under the terms of the GNU General Public License as published by
9# the Free Software Foundation, either version 3 of the License, or
10# (at your option) any later version.
11#
12# This program is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15# GNU General Public License for more details.
16#
17# You should have received a copy of the GNU General Public License
18# along with this program. If not, see <http://www.gnu.org/licenses/>.
19#
20##############################################################################
21
22'''
23This module shows resemblance to both account_bankimport/bankimport.py,
24account/account_bank_statement.py and account_payment(_export). All hail to
25the makers. account_bankimport is only referenced for their ideas and the
26framework of the filters, which they in their turn seem to have derived
27from account_coda.
28
29Modifications are extensive:
30
311. In relation to account/account_bank_statement.py:
32 account.bank.statement is effectively stripped from its account.period
33 association, while account.bank.statement.line is extended with the same
34 association, thereby reflecting real world usage of bank.statement as a
35 list of bank transactions and bank.statement.line as a bank transaction.
36
372. In relation to account/account_bankimport:
38 All filter objects and extensions to res.company are removed. Instead a
39 flexible auto-loading and auto-browsing plugin structure is created,
40 whereby business logic and encoding logic are strictly separated.
41 Both parsers and business logic are rewritten from scratch.
42
43 The association of account.journal with res.company is replaced by an
44 association of account.journal with res.partner.bank, thereby allowing
45 multiple bank accounts per company and one journal per bank account.
46
47 The imported bank statement file does not result in a single 'bank
48 statement', but in a list of bank statements by definition of whatever the
49 bank sees as a statement. Every imported bank statement contains at least
50 one bank transaction, which is a modded account.bank.statement.line.
51
523. In relation to account_payment:
53 An additional state was inserted between 'open' and 'done', to reflect a
54 exported bank orders file which was not reported back through statements.
55 The import of statements matches the payments and reconciles them when
56 needed, flagging them 'done'. When no export wizards are found, the
57 default behavior is to flag the orders as 'sent', not as 'done'.
58'''
59import time
60from osv import osv, fields
61from tools.translate import _
62
63class account_banking_account_settings(osv.osv):
64 '''Default Journal for Bank Account'''
65 _name = 'account.banking.account.settings'
66 _description = __doc__
67 _columns = {
68 'company_id': fields.many2one('res.company', 'Company', select=True,
69 required=True),
70 'partner_bank_id': fields.many2one('res.partner.bank', 'Bank Account',
71 select=True, required=True),
72 'journal_id': fields.many2one('account.journal', 'Journal',
73 required=True),
74 'default_credit_account_id': fields.many2one(
75 'account.account', 'Default credit account', select=True,
76 help=('The account to use when an unexpected payment was signaled. '
77 'This can happen when a direct debit payment is cancelled '
78 'by a customer, or when no matching payment can be found. '
79 ' Mind that you can correct movements before confirming them.'
80 ),
81 required=True
82 ),
83 'default_debit_account_id': fields.many2one(
84 'account.account', 'Default debit account',
85 select=True, required=True,
86 help=('The account to use when an unexpected payment is received. '
87 'This can be needed when a customer pays in advance or when '
88 'no matching invoice can be found. Mind that you can correct '
89 'movements before confirming them.'
90 ),
91 ),
92 }
93
94 def _default_company(self, cursor, uid, context={}):
95 user = self.pool.get('res.users').browse(cursor, uid, uid, context=context)
96 if user.company_id:
97 return user.company_id.id
98 return self.pool.get('res.company').search(cursor, uid,
99 [('parent_id', '=', False)]
100 )[0]
101
102 _defaults = {
103 'company_id': _default_company,
104 }
105account_banking_account_settings()
106
107class account_banking_imported_file(osv.osv):
108 '''Imported Bank Statements File'''
109 _name = 'account.banking.imported.file'
110 _description = __doc__
111 _columns = {
112 'company_id': fields.many2one('res.company', 'Company',
113 select=True, readonly=True
114 ),
115 'date': fields.datetime('Import Date', readonly=False, select=True),
116 'format': fields.char('File Format', size=20, readonly=False),
117 'file': fields.binary('Raw Data', readonly=False),
118 'log': fields.text('Import Log', readonly=False),
119 'user_id': fields.many2one('res.users', 'Responsible User',
120 readonly=False, select=True
121 ),
122 'state': fields.selection(
123 [('unfinished', 'Unfinished'),
124 ('error', 'Error'),
125 ('ready', 'Finished'),
126 ], 'State', select=True, readonly=True
127 ),
128 'statement_ids': fields.one2many('account.bank.statement',
129 'banking_id', 'Statements',
130 readonly=False,
131 ),
132 }
133 _defaults = {
134 'date': lambda *a: time.strftime('%Y-%m-%d %H:%M:%S'),
135 'user_id': lambda self, cursor, uid, context: uid,
136 }
137account_banking_imported_file()
138
139class account_bank_statement(osv.osv):
140 '''
141 Extensions from account_bank_statement:
142 1. Removed period_id (transformed to optional boolean) - as it is no
143 longer needed.
144 2. Extended 'button_confirm' trigger to cope with the period per
145 statement_line situation.
146 3. Added optional relation with imported statements file
147 '''
148 _inherit = 'account.bank.statement'
149 _columns = {
150 'period_id': fields.many2one('account.period', 'Period',
151 required=False, readonly=True),
152 'banking_id': fields.many2one('account.banking.imported.file',
153 'Imported File', readonly=True,
154 ),
155 }
156 _defaults = {
157 'period_id': lambda *a: False,
158 }
159
160 def _get_period(self, cursor, uid, date, context={}):
161 '''
162 Find matching period for date, not meant for _defaults.
163 '''
164 period_obj = self.pool.get('account.period')
165 periods = period_obj.find(cursor, uid, dt=date, context=context)
166 return periods and periods[0] or False
167
168 def button_confirm(self, cursor, uid, ids, context=None):
169 # This is largely a copy of the original code in account
170 # As there is no valid inheritance mechanism for large actions, this
171 # is the only option to add functionality to existing actions.
172 # WARNING: when the original code changes, this trigger has to be
173 # updated in sync.
174 done = []
175 res_currency_obj = self.pool.get('res.currency')
176 res_users_obj = self.pool.get('res.users')
177 account_move_obj = self.pool.get('account.move')
178 account_move_line_obj = self.pool.get('account.move.line')
179 account_bank_statement_line_obj = \
180 self.pool.get('account.bank.statement.line')
181
182 company_currency_id = res_users_obj.browse(cursor, uid, uid,
183 context=context).company_id.currency_id.id
184
185 for st in self.browse(cursor, uid, ids, context):
186 if not st.state=='draft':
187 continue
188 end_bal = st.balance_end or 0.0
189 if not (abs(end_bal - st.balance_end_real) < 0.0001):
190 raise osv.except_osv(_('Error !'),
191 _('The statement balance is incorrect !\n') +
192 _('The expected balance (%.2f) is different '
193 'than the computed one. (%.2f)') % (
194 st.balance_end_real, st.balance_end
195 ))
196 if (not st.journal_id.default_credit_account_id) \
197 or (not st.journal_id.default_debit_account_id):
198 raise osv.except_osv(_('Configration Error !'),
199 _('Please verify that an account is defined in the journal.'))
200
201 for line in st.move_line_ids:
202 if line.state <> 'valid':
203 raise osv.except_osv(_('Error !'),
204 _('The account entries lines are not in valid state.'))
205
206 for move in st.line_ids:
207 period_id = self._get_period(cursor, uid, move.date, context=context)
208 move_id = account_move_obj.create(cursor, uid, {
209 'journal_id': st.journal_id.id,
210 'period_id': period_id,
211 }, context=context)
212 account_bank_statement_line_obj.write(cursor, uid, [move.id], {
213 'move_ids': [(4, move_id, False)]
214 })
215 if not move.amount:
216 continue
217
218 torec = []
219 if move.amount >= 0:
220 account_id = st.journal_id.default_credit_account_id.id
221 else:
222 account_id = st.journal_id.default_debit_account_id.id
223 acc_cur = ((move.amount<=0) and st.journal_id.default_debit_account_id) \
224 or move.account_id
225 amount = res_currency_obj.compute(cursor, uid, st.currency.id,
226 company_currency_id, move.amount, context=context,
227 account=acc_cur)
228 if move.reconcile_id and move.reconcile_id.line_new_ids:
229 for newline in move.reconcile_id.line_new_ids:
230 amount += newline.amount
231
232 val = {
233 'name': move.name,
234 'date': move.date,
235 'ref': move.ref,
236 'move_id': move_id,
237 'partner_id': ((move.partner_id) and move.partner_id.id) or False,
238 'account_id': (move.account_id) and move.account_id.id,
239 'credit': ((amount>0) and amount) or 0.0,
240 'debit': ((amount<0) and -amount) or 0.0,
241 'statement_id': st.id,
242 'journal_id': st.journal_id.id,
243 'period_id': period_id,
244 'currency_id': st.currency.id,
245 }
246
247 amount = res_currency_obj.compute(cursor, uid, st.currency.id,
248 company_currency_id, move.amount, context=context,
249 account=acc_cur)
250
251 if move.account_id and move.account_id.currency_id:
252 val['currency_id'] = move.account_id.currency_id.id
253 if company_currency_id==move.account_id.currency_id.id:
254 amount_cur = move.amount
255 else:
256 amount_cur = res_currency_obj.compute(cursor, uid, company_currency_id,
257 move.account_id.currency_id.id, amount, context=context,
258 account=acc_cur)
259 val['amount_currency'] = amount_cur
260
261 torec.append(account_move_line_obj.create(cursor, uid, val , context=context))
262
263 if move.reconcile_id and move.reconcile_id.line_new_ids:
264 for newline in move.reconcile_id.line_new_ids:
265 account_move_line_obj.create(cursor, uid, {
266 'name': newline.name or move.name,
267 'date': move.date,
268 'ref': move.ref,
269 'move_id': move_id,
270 'partner_id': ((move.partner_id) and move.partner_id.id) or False,
271 'account_id': (newline.account_id) and newline.account_id.id,
272 'debit': newline.amount>0 and newline.amount or 0.0,
273 'credit': newline.amount<0 and -newline.amount or 0.0,
274 'statement_id': st.id,
275 'journal_id': st.journal_id.id,
276 'period_id': period_id,
277 }, context=context)
278
279 # Fill the secondary amount/currency
280 # if currency is not the same than the company
281 amount_currency = False
282 currency_id = False
283 if st.currency.id <> company_currency_id:
284 amount_currency = move.amount
285 currency_id = st.currency.id
286
287 account_move_line_obj.create(cursor, uid, {
288 'name': move.name,
289 'date': move.date,
290 'ref': move.ref,
291 'move_id': move_id,
292 'partner_id': ((move.partner_id) and move.partner_id.id) or False,
293 'account_id': account_id,
294 'credit': ((amount < 0) and -amount) or 0.0,
295 'debit': ((amount > 0) and amount) or 0.0,
296 'statement_id': st.id,
297 'journal_id': st.journal_id.id,
298 'period_id': period_id,
299 'amount_currency': amount_currency,
300 'currency_id': currency_id,
301 }, context=context)
302
303 for line in account_move_line_obj.browse(cursor, uid, [x.id for x in
304 account_move_obj.browse(cursor, uid, move_id, context=context).line_id
305 ], context=context):
306 if line.state <> 'valid':
307 raise osv.except_osv(
308 _('Error !'),
309 _('Account move line "%s" is not valid')
310 % line.name
311 )
312
313 if move.reconcile_id and move.reconcile_id.line_ids:
314 torec += map(lambda x: x.id, move.reconcile_id.line_ids)
315 #try:
316 if abs(move.reconcile_amount-move.amount)<0.0001:
317 account_move_line_obj.reconcile(
318 cursor, uid, torec, 'statement', context
319 )
320 else:
321 account_move_line_obj.reconcile_partial(
322 cursor, uid, torec, 'statement', context
323 )
324 #except:
325 # raise osv.except_osv(
326 # _('Error !'),
327 # _('Unable to reconcile entry "%s": %.2f') %
328 # (move.name, move.amount)
329 # )
330
331 if st.journal_id.entry_posted:
332 account_move_obj.write(cursor, uid, [move_id], {'state':'posted'})
333 done.append(st.id)
334 self.write(cursor, uid, done, {'state':'confirm'}, context=context)
335 return True
336
337account_bank_statement()
338
339class account_bank_statement_line(osv.osv):
340 '''
341 Extension on basic class:
342 1. Extra links to account.period and res.partner.bank for tracing and
343 matching.
344 2. Extra 'trans' field to carry the transaction id of the bank.
345 3. Extra 'international' flag to indicate the missing of a remote
346 account number. Some banks use seperate international banking
347 modules that do not integrate with the standard transaction files.
348 4. Readonly states for most fields except when in draft.
349 '''
350 _inherit = 'account.bank.statement.line'
351 _description = 'Bank Transaction'
352
353 def _get_period(self, cursor, uid, context={}):
354 date = context.get('date') and context['date'] or None
355 periods = self.pool.get('account.period').find(cursor, uid, dt=date)
356 return periods and periods[0] or False
357
358 def _seems_international(self, cursor, uid, context={}):
359 '''
360 Some banks have seperate international banking modules which do not
361 translate correctly into the national formats. Instead, they
362 leave key fields blank and signal this anomaly with a special
363 transfer type.
364 With the introduction of SEPA, this may worsen greatly, as SEPA
365 payments are considered to be analogous to international payments
366 by most local formats.
367 '''
368 # Quick and dirty check: if remote bank account is missing, assume
369 # international transfer
370 return not (
371 context.get('partner_bank_id') and context['partner_bank_id']
372 )
373 # Not so dirty check: check if partner_id is set. If it is, check the
374 # default/invoice addresses country. If it is the same as our
375 # company's, its local, else international.
376 # TODO: to be done
377
378 _columns = {
379 # Redefines
380 'amount': fields.float('Amount', readonly=True,
381 states={'draft': [('readonly', False)]}),
382 'ref': fields.char('Ref.', size=32, readonly=True,
383 states={'draft': [('readonly', False)]}),
384 'name': fields.char('Name', size=64, required=True, readonly=True,
385 states={'draft': [('readonly', False)]}),
386 'date': fields.date('Date', required=True, readonly=True,
387 states={'draft': [('readonly', False)]}),
388 # New columns
389 'trans': fields.char('Bank Transaction ID', size=15, required=False,
390 readonly=True,
391 states={'draft':[('readonly', False)]},
392 ),
393 'partner_bank_id': fields.many2one('res.partner.bank', 'Bank Account',
394 required=False, readonly=True,
395 states={'draft':[('readonly', False)]},
396 ),
397 'period_id': fields.many2one('account.period', 'Period', required=True,
398 states={'confirm': [('readonly', True)]}),
399 # Not used yet, but usefull in the future.
400 'international': fields.boolean('International Transaction',
401 required=False,
402 states={'confirm': [('readonly', True)]},
403 ),
404 }
405
406 _defaults = {
407 'period_id': _get_period,
408 'international': _seems_international,
409 }
410
411 def onchange_partner_id(self, cursor, uid, line_id, partner_id, type,
412 currency_id, context={}
413 ):
414 if not partner_id:
415 return {}
416 users_obj = self.pool.get('res.users')
417 partner_obj = self.pool.get('res.partner')
418
419 company_currency_id = users_obj.browse(cursor, uid, uid, context=context)\
420 .company_id.currency_id.id
421
422 if not currency_id:
423 currency_id = company_currency_id
424
425 partner = partner_obj.browse(cursor, uid, partner_id, context=context)
426 if partner.supplier and not part.customer:
427 account_id = part.property_account_payable.id
428 type = 'supplier'
429 elif partner.supplier and not part.customer:
430 account_id = part.property_account_receivable.id
431 type = 'customer'
432 else:
433 account_id = 0
434 type = 'general'
435
436 return {'value': {'type': type , 'account_id': account_id}}
437
438 def write(self, cursor, uid, ids, values, context={}):
439 # TODO: Not sure what to do with this, as it seems that most of
440 # this code is related to res_partner_bank and not to this class.
441 account_numbers = []
442 bank_obj = self.pool.get('res.partner.bank')
443 statement_line_obj = self.pool.get('account.bank.statement.line')
444
445 if 'partner_id' in values:
446 bank_account_ids = bank_obj.search(cursor, uid,
447 [('partner_id','=', values['partner_id'])]
448 )
449 bank_accounts = bank_obj.browse(cursor, uid, bank_account_ids)
450 import_account_numbers = statement_line_obj.browse(cursor, uid, ids)
451
452 for accno in bank_accounts:
453 # Allow acc_number and iban to co-exist (SEPA will unite the
454 # two, but - as seen now - in an uneven pace per country)
455 if accno.acc_number:
456 account_numbers.append(accno.acc_number)
457 if accno.iban:
458 account_numbers.append(accno.iban)
459
460 if any([x for x in import_account_numbers if x.bank_accnumber in
461 account_numbers]):
462 for accno in import_account_numbers:
463 account_data = _get_account_data(accno.bank_accnumber)
464 if account_data:
465 bank_id = bank_obj.search(cursor, uid, [
466 ('name', '=', account_data['bank_name'])
467 ])
468 if not bank_id:
469 bank_id = bank_obj.create(cursor, uid, {
470 'name': account_data['bank_name'],
471 'bic': account_data['bic'],
472 'active': 1,
473 })
474 else:
475 bank_id = bank_id[0]
476
477 bank_acc = bank_obj.create(cursor, uid, {
478 'state': 'bank',
479 'partner_id': values['partner_id'],
480 'bank': bank_id,
481 'acc_number': accno.bank_accnumber,
482 })
483
484 bank_iban = bank_obj.create(cursor, uid, {
485 'state': 'iban',
486 'partner_id': values['partner_id'],
487 'bank': bank_id,
488 'iban': account_data['iban'],
489 })
490
491 else:
492 bank_acc = bank_obj.create(cursor, uid, {
493 'state': 'bank',
494 'partner_id': values['partner_id'],
495 'acc_number': accno.bank_accnumber,
496 })
497
498 return super(account_bank_statement_line, self).write(
499 cursor, uid, ids, values, context
500 )
501
502account_bank_statement_line()
503
504class payment_type(osv.osv):
505 '''
506 Make description field translatable #, add country context
507 '''
508 _inherit = 'payment.type'
509 _columns = {
510 'name': fields.char('Name', size=64, required=True, translate=True,
511 help='Payment Type'
512 ),
513 #'country_id': fields.many2one('res.country', 'Country',
514 # required=False,
515 # help='Use this to limit this type to a specific country'
516 # ),
517 }
518 #_defaults = {
519 # 'country_id': lambda *a: False,
520 #}
521payment_type()
522
523class payment_line(osv.osv):
524 '''
525 Add extra export_state and date_done fields; make destination bank account
526 mandatory, as it makes no sense to send payments into thin air.
527 '''
528 _inherit = 'payment.line'
529 _columns = {
530 # New fields
531 'bank_id': fields.many2one('res.partner.bank',
532 'Destination Bank account',
533 required=True
534 ),
535 'export_state': fields.selection([
536 ('draft', 'Draft'),
537 ('open','Confirmed'),
538 ('cancel','Cancelled'),
539 ('sent', 'Sent'),
540 ('done','Done'),
541 ], 'State', select=True
542 ),
543 # Redefined fields: added states
544 'date_done': fields.datetime('Date Confirmed', select=True,
545 readonly=True),
546 'name': fields.char(
547 'Your Reference', size=64, required=True,
548 states={
549 'sent': [('readonly', True)],
550 'done': [('readonly', True)]
551 },
552 ),
553 'communication': fields.char(
554 'Communication', size=64, required=True,
555 help=("Used as the message between ordering customer and current "
556 "company. Depicts 'What do you want to say to the recipient"
557 " about this order ?'"
558 ),
559 states={
560 'sent': [('readonly', True)],
561 'done': [('readonly', True)]
562 },
563 ),
564 'communication2': fields.char(
565 'Communication 2', size=64,
566 help='The successor message of Communication.',
567 states={
568 'sent': [('readonly', True)],
569 'done': [('readonly', True)]
570 },
571 ),
572 'move_line_id': fields.many2one(
573 'account.move.line', 'Entry line',
574 domain=[('reconcile_id','=', False),
575 ('account_id.type', '=','payable')
576 ],
577 help=('This Entry Line will be referred for the information of '
578 'the ordering customer.'
579 ),
580 states={
581 'sent': [('readonly', True)],
582 'done': [('readonly', True)]
583 },
584 ),
585 'amount_currency': fields.float(
586 'Amount in Partner Currency', digits=(16,2),
587 required=True,
588 help='Payment amount in the partner currency',
589 states={
590 'sent': [('readonly', True)],
591 'done': [('readonly', True)]
592 },
593 ),
594 'currency': fields.many2one(
595 'res.currency', 'Partner Currency', required=True,
596 states={
597 'sent': [('readonly', True)],
598 'done': [('readonly', True)]
599 },
600 ),
601 'bank_id': fields.many2one(
602 'res.partner.bank', 'Destination Bank account',
603 states={
604 'sent': [('readonly', True)],
605 'done': [('readonly', True)]
606 },
607 ),
608 'order_id': fields.many2one(
609 'payment.order', 'Order', required=True,
610 ondelete='cascade', select=True,
611 states={
612 'sent': [('readonly', True)],
613 'done': [('readonly', True)]
614 },
615 ),
616 'partner_id': fields.many2one(
617 'res.partner', string="Partner", required=True,
618 help='The Ordering Customer',
619 states={
620 'sent': [('readonly', True)],
621 'done': [('readonly', True)]
622 },
623 ),
624 'date': fields.date(
625 'Payment Date',
626 help=("If no payment date is specified, the bank will treat this "
627 "payment line directly"
628 ),
629 states={
630 'sent': [('readonly', True)],
631 'done': [('readonly', True)]
632 },
633 ),
634 'state': fields.selection([
635 ('normal','Free'),
636 ('structured','Structured')
637 ], 'Communication Type', required=True,
638 states={
639 'sent': [('readonly', True)],
640 'done': [('readonly', True)]
641 },
642 ),
643 }
644 _defaults = {
645 'export_state': lambda *a: 'draft',
646 'date_done': lambda *a: False,
647 }
648payment_line()
649
650class payment_order(osv.osv):
651 '''
652 Enable extra state for payment exports
653 '''
654 _inherit = 'payment.order'
655 _columns = {
656 'date_planned': fields.date(
657 'Scheduled date if fixed',
658 states={
659 'sent': [('readonly', True)],
660 'done': [('readonly', True)]
661 },
662 help='Select a date if you have chosen Preferred Date to be fixed.'
663 ),
664 'reference': fields.char(
665 'Reference', size=128, required=True,
666 states={
667 'sent': [('readonly', True)],
668 'done': [('readonly', True)]
669 },
670 ),
671 'mode': fields.many2one(
672 'payment.mode', 'Payment mode', select=True, required=True,
673 states={
674 'sent': [('readonly', True)],
675 'done': [('readonly', True)]
676 },
677 help='Select the Payment Mode to be applied.'
678 ),
679 'state': fields.selection([
680 ('draft', 'Draft'),
681 ('open','Confirmed'),
682 ('cancel','Cancelled'),
683 ('sent', 'Sent'),
684 ('done','Done'),
685 ], 'State', select=True
686 ),
687 'line_ids': fields.one2many(
688 'payment.line', 'order_id', 'Payment lines',
689 states={
690 'sent': [('readonly', True)],
691 'done': [('readonly', True)]
692 },
693 ),
694 'user_id': fields.many2one(
695 'res.users','User', required=True,
696 states={
697 'sent': [('readonly', True)],
698 'done': [('readonly', True)]
699 },
700 ),
701 'date_prefered': fields.selection([
702 ('now', 'Directly'),
703 ('due', 'Due date'),
704 ('fixed', 'Fixed date')
705 ], "Preferred date", change_default=True, required=True,
706 states={
707 'sent': [('readonly', True)],
708 'done': [('readonly', True)]
709 },
710 help=("Choose an option for the Payment Order:'Fixed' stands for a "
711 "date specified by you.'Directly' stands for the direct "
712 "execution.'Due date' stands for the scheduled date of "
713 "execution."
714 )
715 ),
716 }
717
718 def set_to_draft(self, cr, uid, ids, *args):
719 cr.execute("UPDATE payment_line "
720 "SET export_state = 'draft' "
721 "WHERE order_id in (%s)" % (
722 ','.join(map(str, ids))
723 ))
724 return super(payment_order, self).set_to_draft(
725 cr, uid, ids, *args
726 )
727
728 def action_sent(self, cr, uid, ids, *args):
729 cr.execute("UPDATE payment_line "
730 "SET export_state = 'sent' "
731 "WHERE order_id in (%s)" % (
732 ','.join(map(str, ids))
733 ))
734 return True
735
736 def set_done(self, cr, uid, id, *args):
737 '''
738 Extend standard transition to update childs as well.
739 '''
740 cr.execute("UPDATE payment_line "
741 "SET export_state = 'done', date_done = '%s' "
742 "WHERE order_id = %s" % (
743 time.strftime('%Y-%m-%d'),
744 self.id
745 ))
746 return super(payment_order, self).set_done(
747 cr, uid, id, *args
748 )
749
750payment_order()
751
752# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
0753
=== added file 'account_banking/account_banking_demo.xml'
--- account_banking/account_banking_demo.xml 1970-01-01 00:00:00 +0000
+++ account_banking/account_banking_demo.xml 2010-03-04 01:53:21 +0000
@@ -0,0 +1,32 @@
1<?xml version="1.0" encoding="utf-8"?>
2<openerp>
3<data noupdate="1">
4 <record model="res.partner" id="partner_demo1">
5 <field name="name">Tiny S.p.r.l</field>
6 </record>
7 <record model="res.partner.bank" id="partner_bank1">
8 <field name="acc_number">301915554082</field>
9 <field name="state">bank</field>
10 <field name="partner_id" ref="partner_demo1"></field>
11 </record>
12
13 <record model="res.partner" id="partner_demo2">
14 <field name="name">The-design Company</field>
15 </record>
16 <record model="res.partner.bank" id="partner_bank2">
17 <field name="acc_number">050000000017</field>
18 <field name="state">iban</field>
19 <field name="partner_id" ref="partner_demo2"></field>
20 </record>
21
22<!-- <record model="res.partner.bank" id="partner_agrolait">
23 <field name="acc_number">301915554082</field>
24 <field name="partner_id" ref="base.res_partner_agrolait"/>
25 </record>
26
27 <record model="res.partner.bank" id="res_partner_10">
28 <field name="acc_number">050000000017</field>
29 <field name="partner_id" ref="base.res_partner_10"/>
30 </record>-->
31</data>
32</openerp>
033
=== added file 'account_banking/account_banking_import_wizard.xml'
--- account_banking/account_banking_import_wizard.xml 1970-01-01 00:00:00 +0000
+++ account_banking/account_banking_import_wizard.xml 2010-03-04 01:53:21 +0000
@@ -0,0 +1,15 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!--
3 Copyright (C) EduSense BV <http://www.edusense.nl>
4 All rights reserved.
5 The licence is in the file __terp__.py
6-->
7<openerp>
8 <data>
9 <wizard id="wizard_account_banking_import_file"
10 string="Import Bank Statements File"
11 model="account.bank.statement"
12 name="account_banking.banking_import"
13 />
14 </data>
15</openerp>
016
=== added file 'account_banking/account_banking_view.xml'
--- account_banking/account_banking_view.xml 1970-01-01 00:00:00 +0000
+++ account_banking/account_banking_view.xml 2010-03-04 01:53:21 +0000
@@ -0,0 +1,211 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!--
3 Copyright (C) EduSense BV <http://www.edusense.nl>
4 All rights reserved.
5 The licence is in the file __terp__.py
6-->
7<openerp>
8 <data>
9 <!-- Create new submenu in finance/periodical processing -->
10 <menuitem name="Banking"
11 id="account_banking.menu_finance_banking_actions"
12 parent="account.menu_finance_periodical_processing"
13 />
14 <!-- Create new submenu in finance/configuration -->
15 <menuitem name="Banking"
16 id="account_banking.menu_finance_banking_settings"
17 parent="account.menu_finance_configuration"
18 />
19
20 <!-- Create new view on default journals for bank accounts -->
21 <record model="ir.ui.view" id="view_banking_account_settings_form">
22 <field name="name">account.banking.account.settings.form</field>
23 <field name="model">account.banking.account.settings</field>
24 <field name="type">form</field>
25 <field name="arch" type="xml">
26 <form string="Default Import Settings for Bank Account">
27 <field name="company_id" />
28 <separator string="Bank Account Details" colspan="4" />
29 <field name="partner_bank_id" /> <!-- Needs fiddling... domain="[('partner_id','=',company_id.partner_id)]"/-->
30 <field name="journal_id" domain="[('type','=','cash')]" />
31 <separator string="Default Accounts for Unknown Movements" colspan="4" />
32 <field name="default_credit_account_id" />
33 <field name="default_debit_account_id" />
34 </form>
35 </field>
36 </record>
37 <record model="ir.ui.view" id="view_banking_account_settings_tree">
38 <field name="name">account.banking.account.settings.tree</field>
39 <field name="model">account.banking.account.settings</field>
40 <field name="type">tree</field>
41 <field name="arch" type="xml">
42 <tree string="Default Import Settings for Bank Account">
43 <field name="company_id" />
44 <field name="partner_bank_id" /> <!-- Needs fiddling... domain="[('partner_id','=',company_id.partner_id)]"/-->
45 <field name="journal_id" domain="[('type','=','cash')]" />
46 </tree>
47 </field>
48 </record>
49 <record model="ir.actions.act_window" id="action_account_banking_journals">
50 <field name="name">Default Import Settings for Bank Accounts</field>
51 <field name="type">ir.actions.act_window</field>
52 <field name="res_model">account.banking.account.settings</field>
53 <field name="view_type">form</field>
54 <field name="view_mode">tree,form</field>
55 </record>
56
57 <!-- Create new submenu for finance configuration -->
58 <menuitem name="Default Import Settings for Bank Accounts"
59 id="menu_action_account_banking_bank_journals"
60 parent="account_banking.menu_finance_banking_settings"
61 action="action_account_banking_journals"
62 sequence="12"
63 />
64
65 <!-- Create new view on imported statement files -->
66 <record model="ir.ui.view" id="view_account_banking_imported_file_form">
67 <field name="name">account.banking.imported.file.form</field>
68 <field name="model">account.banking.imported.file</field>
69 <field name="type">form</field>
70 <field name="arch" type="xml">
71 <form string="Imported Bank Statements">
72 <notebook colspan="4">
73 <page string="Import Details">
74 <field name="company_id" />
75 <field name="date" />
76 <field name="user_id" />
77 <field name="state" />
78 <field name="file"/>
79 <field name="format" />
80 </page>
81 <page string="Statements">
82 <field name="statement_ids" colspan="4"/>
83 </page>
84 <page string="Import Log">
85 <field name="log" colspan="4"/>
86 </page>
87 </notebook>
88 </form>
89 </field>
90 </record>
91 <record model="ir.ui.view" id="view_account_banking_imported_file_tree">
92 <field name="name">account.banking.imported.file.tree</field>
93 <field name="model">account.banking.imported.file</field>
94 <field name="type">tree</field>
95 <field name="arch" type="xml">
96 <tree string="Imported Bank Statements Files" colors="red:state=='error';blue:state=='unfinished'">
97 <field name="company_id" />
98 <field name="date" />
99 <field name="user_id" />
100 <field name="state" />
101 </tree>
102 </field>
103 </record>
104 <record model="ir.actions.act_window" id="action_account_banking_imported_files">
105 <field name="name">Imported Bank Statements Files</field>
106 <field name="type">ir.actions.act_window</field>
107 <field name="res_model">account.banking.imported.file</field>
108 <field name="view_type">form</field>
109 <field name="view_mode">tree,form</field>
110 </record>
111
112 <!-- Add a menu item for it -->
113 <menuitem name="Imported Bank Statements Files"
114 id="menu_action_account_banking_imported_files"
115 parent="account_banking.menu_finance_banking_actions"
116 action="action_account_banking_imported_files"
117 sequence="12"
118 />
119
120 <!-- Add the import wizard to the menu -->
121 <menuitem name="Import Bank Statements File"
122 id="menu_account_banking_import_wizard"
123 parent="account_banking.menu_finance_banking_actions"
124 type="wizard"
125 action="wizard_account_banking_import_file"
126 sequence="15"/>
127
128 <!-- Create right menu entry to see statements -->
129 <act_window name="Bank Statements File"
130 domain="[('banking_id', '=', active_id)]"
131 res_model="account.banking.imported.file"
132 src_model="account.bank.statement"
133 view_type="form"
134 view_mode="tree,form"
135 id="act_account_payment_account_bank_statement"/>
136
137 <!-- Move period_id from bank_statement form to bank_statement_line form
138 -->
139 <record id="view_banking_bank_statement_tree_1" model="ir.ui.view">
140 <field name="name">account.bank.statement.tree.banking</field>
141 <field name="inherit_id" ref="account.view_bank_statement_tree" />
142 <field name="model">account.bank.statement</field>
143 <field name="type">tree</field>
144 <field name="arch" type="xml">
145 <field name="period_id" position="replace"/>
146 </field>
147 </record>
148 <record id="view_banking_bank_statement_form_1" model="ir.ui.view">
149 <field name="name">account.bank.statement.form.banking-1</field>
150 <field name="inherit_id" ref="account.view_bank_statement_form" />
151 <field name="model">account.bank.statement</field>
152 <field name="type">form</field>
153 <field name="arch" type="xml">
154 <field name="period_id" position="replace"/>
155 </field>
156 </record>
157 <record id="view_banking_bank_statement_form_2" model="ir.ui.view">
158 <field name="name">account.bank.statement.form.banking-2</field>
159 <field name="inherit_id" ref="account.view_bank_statement_form" />
160 <field name="model">account.bank.statement</field>
161 <field name="type">form</field>
162 <field name="arch" type="xml">
163 <xpath expr="/form/notebook/page[@string='Entry encoding']/field/tree/field[@name='type']" position="after">
164 <field name="period_id"/>
165 </xpath>
166 </field>
167 </record>
168 <record id="view_banking_bank_statement_form_3" model="ir.ui.view">
169 <field name="name">account.bank.statement.form.banking-3</field>
170 <field name="inherit_id" ref="account.view_bank_statement_form" />
171 <field name="model">account.bank.statement</field>
172 <field name="type">form</field>
173 <field name="arch" type="xml">
174 <xpath expr="/form/notebook/page[@string='Entry encoding']/field/form/field[@name='type']" position="after">
175 <field name="period_id"/>
176 </xpath>
177 </field>
178 </record>
179
180 <!-- Reset trigger on button_confirm to the trigger code in this module -->
181 <record id="view_banking_bank_statement_form_4" model="ir.ui.view">
182 <field name="name">account.bank.statement.form.banking-4</field>
183 <field name="inherit_id" ref="account.view_bank_statement_form" />
184 <field name="model">account.bank.statement</field>
185 <field name="type">form</field>
186 <field name="arch" type="xml">
187 <button name="button_confirm" position="replace">
188 <button name="button_confirm" states="draft" string="Confirm" type="object"/>
189 </button>
190 </field>
191 </record>
192
193 <!-- Make buttons on payment order sensitive for 'Sent' state -->
194 <record id="view_banking_payment_order_form_1" model="ir.ui.view">
195 <field name="name">account.payment.order.form.banking-1</field>
196 <field name="inherit_id" ref="account_payment.view_payment_order_form" />
197 <field name="model">payment.order</field>
198 <field name="type">form</field>
199 <field name="arch" type="xml">
200 <xpath expr="/form/button[@string='Select Invoices to Pay']"
201 position="replace">
202 <button name="%(account_payment.wizard_populate_payment)s"
203 colspan="2" type="action" states="draft,open"
204 string="Select Invoices to Pay"
205 />
206 </xpath>
207 </field>
208 </record>
209
210 </data>
211</openerp>
0212
=== added file 'account_banking/account_banking_workflow.xml'
--- account_banking/account_banking_workflow.xml 1970-01-01 00:00:00 +0000
+++ account_banking/account_banking_workflow.xml 2010-03-04 01:53:21 +0000
@@ -0,0 +1,30 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!--
3 Copyright (C) EduSense BV <http://www.edusense.nl>
4 All rights reserved.
5 The licence is in the file __terp__.py
6-->
7<openerp>
8 <data>
9 <!-- New activity for workflow payment order: sent -->
10 <record id="act_sent" model="workflow.activity">
11 <field name="name">sent</field>
12 <field name="wkf_id" ref="account_payment.wkf_payment_order"/>
13 <field name="action">action_sent()
14write({'state':'sent'})</field>
15 <field name="kind">function</field>
16 </record>
17 <!-- Add new transition sent -> done -->
18 <record id="trans_sent_done" model="workflow.transition">
19 <field name="act_from" ref="act_sent"/>
20 <field name="act_to" ref="account_payment.act_done"/>
21 <field name="signal">done</field>
22 </record>
23 <!-- Rewrite existing open -> done transition to include 'sent' -->
24 <record id="account_payment.trans_open_done" model="workflow.transition">
25 <field name="act_from" ref="account_payment.act_open"/>
26 <field name="act_to" ref="act_sent"/>
27 <field name="signal">sent</field>
28 </record>
29 </data>
30</openerp>
031
=== added directory 'account_banking/i18n'
=== added file 'account_banking/i18n/account_banking.pot'
--- account_banking/i18n/account_banking.pot 1970-01-01 00:00:00 +0000
+++ account_banking/i18n/account_banking.pot 2010-03-04 01:53:21 +0000
@@ -0,0 +1,562 @@
1# Translation of OpenERP Server.
2# This file contains the translation of the following modules:
3# * account_banking
4#
5msgid ""
6msgstr ""
7"Project-Id-Version: OpenERP Server 5.0.7\n"
8"Report-Msgid-Bugs-To: support@openerp.com\n"
9"POT-Creation-Date: 2010-01-08 15:30:50+0000\n"
10"PO-Revision-Date: 2010-01-08 15:30:50+0000\n"
11"Last-Translator: <>\n"
12"Language-Team: \n"
13"MIME-Version: 1.0\n"
14"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Transfer-Encoding: \n"
16"Plural-Forms: \n"
17
18#. module: account_banking
19#: wizard_view:account_banking.banking_import,import:0
20msgid "Results:"
21msgstr ""
22
23#. module: account_banking
24#: code:addons/account_banking/wizard/bank_import.py:0
25#, python-format
26msgid "Number of errors found"
27msgstr ""
28
29#. module: account_banking
30#: wizard_view:account_banking.banking_import,init:0
31msgid "Select the processing details:"
32msgstr ""
33
34#. module: account_banking
35#: constraint:ir.actions.act_window:0
36msgid "Invalid model name in the action definition."
37msgstr ""
38
39#. module: account_banking
40#: wizard_button:account_banking.banking_import,import,open:0
41msgid "_Open Statement"
42msgstr ""
43
44#. module: account_banking
45#: field:payment.line,date_done:0
46msgid "Date Confirmed"
47msgstr ""
48
49#. module: account_banking
50#: wizard_button:account_banking.banking_import,import,end:0
51msgid "_Close"
52msgstr ""
53
54#. module: account_banking
55#: model:ir.model,name:account_banking.model_account_banking_account_settings
56msgid "Default Journal for Bank Account"
57msgstr ""
58
59#. module: account_banking
60#: wizard_field:account_banking.banking_import,init,file:0
61msgid "Statements File"
62msgstr ""
63
64#. module: account_banking
65#: code:addons/account_banking/wizard/banktools.py:0
66#, python-format
67msgid "More than one bank account was found with the same number %(account_no)s"
68msgstr ""
69
70#. module: account_banking
71#: code:addons/account_banking/wizard/bank_import.py:0
72#, python-format
73msgid "Total number of transactions"
74msgstr ""
75
76#. module: account_banking
77#: code:addons/account_banking/account_banking.py:0
78#, python-format
79msgid "Account move line \"%s\" is not valid"
80msgstr ""
81
82#. module: account_banking
83#: help:account.banking.account.settings,default_debit_account_id:0
84msgid "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."
85msgstr ""
86
87#. module: account_banking
88#: code:addons/account_banking/wizard/banktools.py:0
89#, python-format
90msgid "Bank account %(account_no)s was not found in the database"
91msgstr ""
92
93#. module: account_banking
94#: code:addons/account_banking/wizard/bank_import.py:0
95#, python-format
96msgid "Number of transactions skipped due to errors"
97msgstr ""
98
99#. module: account_banking
100#: code:addons/account_banking/account_banking.py:0
101#, python-format
102msgid "The expected balance (%.2f) is different '\n"
103" 'than the computed one. (%.2f)"
104msgstr ""
105
106#. module: account_banking
107#: code:addons/account_banking/wizard/bank_import.py:0
108#, python-format
109msgid "Statement for account %(bank_account)s uses different '\n"
110" 'currency than the defined bank journal."
111msgstr ""
112
113#. module: account_banking
114#: code:addons/account_banking/wizard/bank_import.py:0
115#, python-format
116msgid "Number of statements skipped due to errors"
117msgstr ""
118
119#. module: account_banking
120#: view:account.banking.account.settings:0
121msgid "Default Import Settings for Bank Account"
122msgstr ""
123
124#. module: account_banking
125#: help:account.banking.account.settings,default_credit_account_id:0
126msgid "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."
127msgstr ""
128
129#. module: account_banking
130#: code:addons/account_banking/wizard/bank_import.py:0
131#, python-format
132msgid "Unable to import parser %(parser)s. Parser class not found."
133msgstr ""
134
135#. module: account_banking
136#: selection:payment.line,export_state:0
137msgid "Cancelled"
138msgstr ""
139
140#. module: account_banking
141#: view:account.banking.imported.file:0
142#: field:account.banking.imported.file,statement_ids:0
143msgid "Statements"
144msgstr ""
145
146#. module: account_banking
147#: field:account.banking.account.settings,default_debit_account_id:0
148msgid "Default debit account"
149msgstr ""
150
151#. module: account_banking
152#: wizard_button:account_banking.banking_import,init,end:0
153msgid "_Cancel"
154msgstr ""
155
156#. module: account_banking
157#: selection:payment.line,export_state:0
158msgid "Draft"
159msgstr ""
160
161#. module: account_banking
162#: field:account.banking.imported.file,date:0
163msgid "Import Date"
164msgstr ""
165
166#. module: account_banking
167#: selection:payment.line,export_state:0
168msgid "Confirmed"
169msgstr ""
170
171#. module: account_banking
172#: view:account.banking.account.settings:0
173msgid "Default Accounts for Unknown Movements"
174msgstr ""
175
176#. module: account_banking
177#: view:account.bank.statement:0
178msgid "Confirm"
179msgstr ""
180
181#. module: account_banking
182#: field:account.banking.account.settings,default_credit_account_id:0
183msgid "Default credit account"
184msgstr ""
185
186#. module: account_banking
187#: code:addons/account_banking/wizard/bank_import.py:0
188#, python-format
189msgid "Statements found for account %(bank_account)s, '\n"
190" 'but no default journal was defined."
191msgstr ""
192
193#. module: account_banking
194#: field:account.bank.statement.line,international:0
195msgid "International Transaction"
196msgstr ""
197
198#. module: account_banking
199#: code:addons/account_banking/account_banking.py:0
200#, python-format
201msgid "Please verify that an account is defined in the journal."
202msgstr ""
203
204#. module: account_banking
205#: field:account.bank.statement.line,trans:0
206msgid "Bank Transaction ID"
207msgstr ""
208
209#. module: account_banking
210#: code:addons/account_banking/wizard/bank_import.py:0
211#, python-format
212msgid "Statement %(id)s known - skipped"
213msgstr ""
214
215#. module: account_banking
216#: selection:payment.line,export_state:0
217msgid "Sent"
218msgstr ""
219
220#. module: account_banking
221#: code:addons/account_banking/account_banking.py:0
222#, python-format
223msgid "Error !"
224msgstr ""
225
226#. module: account_banking
227#: code:addons/account_banking/account_banking.py:0
228#, python-format
229msgid "The account entries lines are not in valid state."
230msgstr ""
231
232#. module: account_banking
233#: model:ir.actions.act_window,name:account_banking.action_account_banking_journals
234#: model:ir.ui.menu,name:account_banking.menu_action_account_banking_bank_journals
235msgid "Default Import Settings for Bank Accounts"
236msgstr ""
237
238#. module: account_banking
239#: model:ir.actions.wizard,name:account_banking.wizard_account_banking_import_file
240#: model:ir.ui.menu,name:account_banking.menu_account_banking_import_wizard
241msgid "Import Bank Statements File"
242msgstr ""
243
244#. module: account_banking
245#: help:account_banking.banking_import,init,file:0
246msgid "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"
247"\n"
248"To stay on the safe side, always load bank statements files using the same format."
249msgstr ""
250
251#. module: account_banking
252#: constraint:ir.ui.view:0
253msgid "Invalid XML for View Architecture!"
254msgstr ""
255
256#. module: account_banking
257#: view:account.banking.imported.file:0
258msgid "Imported Bank Statements"
259msgstr ""
260
261#. module: account_banking
262#: wizard_view:account_banking.banking_import,import:0
263#: wizard_view:account_banking.banking_import,init:0
264msgid "Import Bank Transactions File"
265msgstr ""
266
267#. module: account_banking
268#: code:addons/account_banking/wizard/banktools.py:0
269#, python-format
270msgid "Account %(account_no)s is not owned by %(partner)s"
271msgstr ""
272
273#. module: account_banking
274#: wizard_button:account_banking.banking_import,init,import:0
275msgid "_Ok"
276msgstr ""
277
278#. module: account_banking
279#: code:addons/account_banking/wizard/banktools.py:0
280#, python-format
281msgid "More then one possible match found for partner with name %(name)s"
282msgstr ""
283
284#. module: account_banking
285#: field:account.banking.imported.file,state:0
286#: field:payment.line,export_state:0
287msgid "State"
288msgstr ""
289
290#. module: account_banking
291#: code:addons/account_banking/wizard/bank_import.py:0
292#, python-format
293msgid "ERROR!"
294msgstr ""
295
296#. module: account_banking
297#: code:addons/account_banking/wizard/banktools.py:0
298#, python-format
299msgid "No suitable period found for date %(date)s"
300msgstr ""
301
302#. module: account_banking
303#: code:addons/account_banking/wizard/banktools.py:0
304#, python-format
305msgid "Multiple overlapping periods for date %(date)s"
306msgstr ""
307
308#. module: account_banking
309#: field:account.banking.account.settings,company_id:0
310#: field:account.banking.imported.file,company_id:0
311#: wizard_field:account_banking.banking_import,init,company:0
312msgid "Company"
313msgstr ""
314
315#. module: account_banking
316#: wizard_field:account_banking.banking_import,import,log:0
317msgid "Log"
318msgstr ""
319
320#. module: account_banking
321#: field:account.banking.imported.file,file:0
322msgid "Raw Data"
323msgstr ""
324
325#. module: account_banking
326#: code:addons/account_banking/account_banking.py:0
327#, python-format
328msgid "Configration Error !"
329msgstr ""
330
331#. module: account_banking
332#: model:ir.module.module,description:account_banking.module_meta_information
333msgid "\n"
334" Module to do banking.\n"
335"\n"
336" This modules tries to combine all current banking import and export\n"
337" schemes. Rationale for this is that it is quite common to have foreign\n"
338" bank account numbers next to national bank account numbers. The current\n"
339" approach, which hides the national banking interface schemes in the\n"
340" l10n_xxx modules, makes it very difficult to use these simultanious.\n"
341" A more banking oriented approach seems more logical and cleaner.\n"
342"\n"
343" Changes to default OpenERP:\n"
344"\n"
345" * Puts focus on the real life messaging with banks:\n"
346" + Bank statement lines upgraded to independent bank transactions.\n"
347" + Banking statements have no special accountancy meaning, they're just\n"
348" message envelopes for a number of bank transactions.\n"
349" + Bank statements can be either encoded by hand to reflect the document\n"
350" version of Bank Statements, or created as an optional side effect of\n"
351" importing Bank Transactions.\n"
352"\n"
353" * Preparations for SEPA:\n"
354" + IBAN accounts are the standard in the SEPA countries\n"
355" + local accounts are derived from SEPA (excluding Turkey) but are\n"
356" considered to be identical to the corresponding SEPA account.\n"
357" + Banks are identified with either Country + Bank code + Branch code or BIC\n"
358" + Each bank can have its own pace in introducing SEPA into their\n"
359" communication with their customers.\n"
360" + National online databases can be used to convert BBAN's to IBAN's.\n"
361"\n"
362" * Adds dropin extensible import facility for bank communication in:\n"
363" + MultiBank (NL) format transaction files,\n"
364" - (todo) MT940 (Swift) format transaction files,\n"
365" - (todo) CODA (BE) format transaction files,\n"
366" - (wish) SEPA Credits (ISO 200022) messages,\n"
367"\n"
368" * Extends payments for digital banking:\n"
369" + Adapted workflow in payments to reflect banking operations\n"
370" + Relies on account_payment mechanics to extend with export generators.\n"
371" - ClieOp3 (NL) payment and direct debit orders files available as\n"
372" account_banking_nl_clieop\n"
373" - (wish) BTL91 (NL) payment orders files (no format description available),\n"
374" - (wish) SEPA Direct Debits (ISO 200022) messages\n"
375"\n"
376" * Additional features for the import/export mechanism:\n"
377" + Automatic matching and creation of bank accounts, banks and partners,\n"
378" during import of statements.\n"
379" + Automatic matching with invoices and payments.\n"
380" + Sound import mechanism, allowing multiple imports of the same\n"
381" transactions repeated over multiple files.\n"
382" + Journal configuration per bank account.\n"
383" + Business logic and format parsing strictly separated to ease the\n"
384" development of new parsers.\n"
385" + No special configuration needed for the parsers, new parsers are\n"
386" recognized and made available at server (re)start.\n"
387" "
388msgstr ""
389
390#. module: account_banking
391#: model:ir.actions.act_window,name:account_banking.act_account_payment_account_bank_statement
392msgid "Bank Statements File"
393msgstr ""
394
395#. module: account_banking
396#: code:addons/account_banking/parsers/models.py:0
397#, python-format
398msgid "This is a stub. Please implement your own."
399msgstr ""
400
401#. module: account_banking
402#: view:account.banking.imported.file:0
403#: model:ir.actions.act_window,name:account_banking.action_account_banking_imported_files
404#: model:ir.ui.menu,name:account_banking.menu_action_account_banking_imported_files
405msgid "Imported Bank Statements Files"
406msgstr ""
407
408#. module: account_banking
409#: field:account.bank.statement,banking_id:0
410msgid "Imported File"
411msgstr ""
412
413#. module: account_banking
414#: view:account.banking.imported.file:0
415#: field:account.banking.imported.file,log:0
416msgid "Import Log"
417msgstr ""
418
419#. module: account_banking
420#: code:addons/account_banking/wizard/bank_import.py:0
421#, python-format
422msgid "The imported statements appear to be invalid! Check your file."
423msgstr ""
424
425#. module: account_banking
426#: code:addons/account_banking/wizard/bank_import.py:0
427#, python-format
428msgid "Number of statements loaded"
429msgstr ""
430
431#. module: account_banking
432#: model:ir.ui.menu,name:account_banking.menu_finance_banking_actions
433#: model:ir.ui.menu,name:account_banking.menu_finance_banking_settings
434msgid "Banking"
435msgstr ""
436
437#. module: account_banking
438#: selection:account.banking.imported.file,state:0
439msgid "Error"
440msgstr ""
441
442#. module: account_banking
443#: code:addons/account_banking/account_banking.py:0
444#, python-format
445msgid "Unable to reconcile entry \"%s\": %.2f"
446msgstr ""
447
448#. module: account_banking
449#: view:account.banking.imported.file:0
450msgid "Import Details"
451msgstr ""
452
453#. module: account_banking
454#: field:account.bank.statement.line,period_id:0
455msgid "Period"
456msgstr ""
457
458#. module: account_banking
459#: selection:payment.line,export_state:0
460msgid "Done"
461msgstr ""
462
463#. module: account_banking
464#: view:payment.order:0
465msgid "Select Invoices to Pay"
466msgstr ""
467
468#. module: account_banking
469#: field:account.banking.imported.file,user_id:0
470msgid "Responsible User"
471msgstr ""
472
473#. module: account_banking
474#: code:addons/account_banking/account_banking.py:0
475#, python-format
476msgid "The statement balance is incorrect !\n"
477msgstr ""
478
479#. module: account_banking
480#: constraint:ir.model:0
481msgid "The Object name must start with x_ and not contain any special character !"
482msgstr ""
483
484#. module: account_banking
485#: selection:account.banking.imported.file,state:0
486msgid "Unfinished"
487msgstr ""
488
489#. module: account_banking
490#: code:addons/account_banking/wizard/bank_import.py:0
491#, python-format
492msgid "Statements found for unknown account %(bank_account)s"
493msgstr ""
494
495#. module: account_banking
496#: model:ir.module.module,shortdesc:account_banking.module_meta_information
497msgid "Account Banking"
498msgstr ""
499
500#. module: account_banking
501#: code:addons/account_banking/wizard/bank_import.py:0
502#, python-format
503msgid "Total number of statements"
504msgstr ""
505
506#. module: account_banking
507#: field:account.banking.imported.file,format:0
508#: wizard_field:account_banking.banking_import,init,parser:0
509msgid "File Format"
510msgstr ""
511
512#. module: account_banking
513#: field:account.banking.account.settings,journal_id:0
514msgid "Journal"
515msgstr ""
516
517#. module: account_banking
518#: selection:account.banking.imported.file,state:0
519msgid "Finished"
520msgstr ""
521
522#. module: account_banking
523#: code:addons/account_banking/wizard/banktools.py:0
524#, python-format
525msgid "No suitable fiscal year found for company %(company_name)s"
526msgstr ""
527
528#. module: account_banking
529#: view:account.banking.account.settings:0
530msgid "Bank Account Details"
531msgstr ""
532
533#. module: account_banking
534#: code:addons/account_banking/wizard/bank_import.py:0
535#, python-format
536msgid "Unable to link transaction %(trans)s to invoice: '\n"
537" '%(no_candidates)s candidates found; can\'t choose."
538msgstr ""
539
540#. module: account_banking
541#: field:account.bank.statement.line,partner_bank_id:0
542#: field:account.banking.account.settings,partner_bank_id:0
543msgid "Bank Account"
544msgstr ""
545
546#. module: account_banking
547#: code:addons/account_banking/wizard/bank_import.py:0
548#, python-format
549msgid "Number of transactions loaded"
550msgstr ""
551
552#. module: account_banking
553#: code:addons/account_banking/wizard/banktools.py:0
554#, python-format
555msgid "Multiple overlapping fiscal years found for date %(date)s"
556msgstr ""
557
558#. module: account_banking
559#: model:ir.model,name:account_banking.model_account_banking_imported_file
560msgid "Imported Bank Statements File"
561msgstr ""
562
0563
=== added file 'account_banking/i18n/en_US.po'
--- account_banking/i18n/en_US.po 1970-01-01 00:00:00 +0000
+++ account_banking/i18n/en_US.po 2010-03-04 01:53:21 +0000
@@ -0,0 +1,562 @@
1# Translation of OpenERP Server.
2# This file contains the translation of the following modules:
3# * account_banking
4#
5msgid ""
6msgstr ""
7"Project-Id-Version: OpenERP Server 5.0.7\n"
8"Report-Msgid-Bugs-To: support@openerp.com\n"
9"POT-Creation-Date: 2010-01-08 15:30:50+0000\n"
10"PO-Revision-Date: 2010-01-08 15:30:50+0000\n"
11"Last-Translator: <>\n"
12"Language-Team: \n"
13"MIME-Version: 1.0\n"
14"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Transfer-Encoding: \n"
16"Plural-Forms: \n"
17
18#. module: account_banking
19#: wizard_view:account_banking.banking_import,import:0
20msgid "Results:"
21msgstr ""
22
23#. module: account_banking
24#: code:addons/account_banking/wizard/bank_import.py:0
25#, python-format
26msgid "Number of errors found"
27msgstr ""
28
29#. module: account_banking
30#: wizard_view:account_banking.banking_import,init:0
31msgid "Select the processing details:"
32msgstr ""
33
34#. module: account_banking
35#: constraint:ir.actions.act_window:0
36msgid "Invalid model name in the action definition."
37msgstr ""
38
39#. module: account_banking
40#: wizard_button:account_banking.banking_import,import,open:0
41msgid "_Open Statement"
42msgstr ""
43
44#. module: account_banking
45#: field:payment.line,date_done:0
46msgid "Date Confirmed"
47msgstr ""
48
49#. module: account_banking
50#: wizard_button:account_banking.banking_import,import,end:0
51msgid "_Close"
52msgstr ""
53
54#. module: account_banking
55#: model:ir.model,name:account_banking.model_account_banking_account_settings
56msgid "Default Journal for Bank Account"
57msgstr ""
58
59#. module: account_banking
60#: wizard_field:account_banking.banking_import,init,file:0
61msgid "Statements File"
62msgstr ""
63
64#. module: account_banking
65#: code:addons/account_banking/wizard/banktools.py:0
66#, python-format
67msgid "More than one bank account was found with the same number %(account_no)s"
68msgstr ""
69
70#. module: account_banking
71#: code:addons/account_banking/wizard/bank_import.py:0
72#, python-format
73msgid "Total number of transactions"
74msgstr ""
75
76#. module: account_banking
77#: code:addons/account_banking/account_banking.py:0
78#, python-format
79msgid "Account move line \"%s\" is not valid"
80msgstr ""
81
82#. module: account_banking
83#: help:account.banking.account.settings,default_debit_account_id:0
84msgid "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."
85msgstr ""
86
87#. module: account_banking
88#: code:addons/account_banking/wizard/banktools.py:0
89#, python-format
90msgid "Bank account %(account_no)s was not found in the database"
91msgstr ""
92
93#. module: account_banking
94#: code:addons/account_banking/wizard/bank_import.py:0
95#, python-format
96msgid "Number of transactions skipped due to errors"
97msgstr ""
98
99#. module: account_banking
100#: code:addons/account_banking/account_banking.py:0
101#, python-format
102msgid "The expected balance (%.2f) is different '\n"
103" 'than the computed one. (%.2f)"
104msgstr ""
105
106#. module: account_banking
107#: code:addons/account_banking/wizard/bank_import.py:0
108#, python-format
109msgid "Statement for account %(bank_account)s uses different '\n"
110" 'currency than the defined bank journal."
111msgstr ""
112
113#. module: account_banking
114#: code:addons/account_banking/wizard/bank_import.py:0
115#, python-format
116msgid "Number of statements skipped due to errors"
117msgstr ""
118
119#. module: account_banking
120#: view:account.banking.account.settings:0
121msgid "Default Import Settings for Bank Account"
122msgstr ""
123
124#. module: account_banking
125#: help:account.banking.account.settings,default_credit_account_id:0
126msgid "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."
127msgstr ""
128
129#. module: account_banking
130#: code:addons/account_banking/wizard/bank_import.py:0
131#, python-format
132msgid "Unable to import parser %(parser)s. Parser class not found."
133msgstr ""
134
135#. module: account_banking
136#: selection:payment.line,export_state:0
137msgid "Cancelled"
138msgstr ""
139
140#. module: account_banking
141#: view:account.banking.imported.file:0
142#: field:account.banking.imported.file,statement_ids:0
143msgid "Statements"
144msgstr ""
145
146#. module: account_banking
147#: field:account.banking.account.settings,default_debit_account_id:0
148msgid "Default debit account"
149msgstr ""
150
151#. module: account_banking
152#: wizard_button:account_banking.banking_import,init,end:0
153msgid "_Cancel"
154msgstr ""
155
156#. module: account_banking
157#: selection:payment.line,export_state:0
158msgid "Draft"
159msgstr ""
160
161#. module: account_banking
162#: field:account.banking.imported.file,date:0
163msgid "Import Date"
164msgstr ""
165
166#. module: account_banking
167#: selection:payment.line,export_state:0
168msgid "Confirmed"
169msgstr ""
170
171#. module: account_banking
172#: view:account.banking.account.settings:0
173msgid "Default Accounts for Unknown Movements"
174msgstr ""
175
176#. module: account_banking
177#: view:account.bank.statement:0
178msgid "Confirm"
179msgstr ""
180
181#. module: account_banking
182#: field:account.banking.account.settings,default_credit_account_id:0
183msgid "Default credit account"
184msgstr ""
185
186#. module: account_banking
187#: code:addons/account_banking/wizard/bank_import.py:0
188#, python-format
189msgid "Statements found for account %(bank_account)s, '\n"
190" 'but no default journal was defined."
191msgstr ""
192
193#. module: account_banking
194#: field:account.bank.statement.line,international:0
195msgid "International Transaction"
196msgstr ""
197
198#. module: account_banking
199#: code:addons/account_banking/account_banking.py:0
200#, python-format
201msgid "Please verify that an account is defined in the journal."
202msgstr ""
203
204#. module: account_banking
205#: field:account.bank.statement.line,trans:0
206msgid "Bank Transaction ID"
207msgstr ""
208
209#. module: account_banking
210#: code:addons/account_banking/wizard/bank_import.py:0
211#, python-format
212msgid "Statement %(id)s known - skipped"
213msgstr ""
214
215#. module: account_banking
216#: selection:payment.line,export_state:0
217msgid "Sent"
218msgstr ""
219
220#. module: account_banking
221#: code:addons/account_banking/account_banking.py:0
222#, python-format
223msgid "Error !"
224msgstr ""
225
226#. module: account_banking
227#: code:addons/account_banking/account_banking.py:0
228#, python-format
229msgid "The account entries lines are not in valid state."
230msgstr ""
231
232#. module: account_banking
233#: model:ir.actions.act_window,name:account_banking.action_account_banking_journals
234#: model:ir.ui.menu,name:account_banking.menu_action_account_banking_bank_journals
235msgid "Default Import Settings for Bank Accounts"
236msgstr ""
237
238#. module: account_banking
239#: model:ir.actions.wizard,name:account_banking.wizard_account_banking_import_file
240#: model:ir.ui.menu,name:account_banking.menu_account_banking_import_wizard
241msgid "Import Bank Statements File"
242msgstr ""
243
244#. module: account_banking
245#: help:account_banking.banking_import,init,file:0
246msgid "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"
247"\n"
248"To stay on the safe side, always load bank statements files using the same format."
249msgstr ""
250
251#. module: account_banking
252#: constraint:ir.ui.view:0
253msgid "Invalid XML for View Architecture!"
254msgstr ""
255
256#. module: account_banking
257#: view:account.banking.imported.file:0
258msgid "Imported Bank Statements"
259msgstr ""
260
261#. module: account_banking
262#: wizard_view:account_banking.banking_import,import:0
263#: wizard_view:account_banking.banking_import,init:0
264msgid "Import Bank Transactions File"
265msgstr ""
266
267#. module: account_banking
268#: code:addons/account_banking/wizard/banktools.py:0
269#, python-format
270msgid "Account %(account_no)s is not owned by %(partner)s"
271msgstr ""
272
273#. module: account_banking
274#: wizard_button:account_banking.banking_import,init,import:0
275msgid "_Ok"
276msgstr ""
277
278#. module: account_banking
279#: code:addons/account_banking/wizard/banktools.py:0
280#, python-format
281msgid "More then one possible match found for partner with name %(name)s"
282msgstr ""
283
284#. module: account_banking
285#: field:account.banking.imported.file,state:0
286#: field:payment.line,export_state:0
287msgid "State"
288msgstr ""
289
290#. module: account_banking
291#: code:addons/account_banking/wizard/bank_import.py:0
292#, python-format
293msgid "ERROR!"
294msgstr ""
295
296#. module: account_banking
297#: code:addons/account_banking/wizard/banktools.py:0
298#, python-format
299msgid "No suitable period found for date %(date)s"
300msgstr ""
301
302#. module: account_banking
303#: code:addons/account_banking/wizard/banktools.py:0
304#, python-format
305msgid "Multiple overlapping periods for date %(date)s"
306msgstr ""
307
308#. module: account_banking
309#: field:account.banking.account.settings,company_id:0
310#: field:account.banking.imported.file,company_id:0
311#: wizard_field:account_banking.banking_import,init,company:0
312msgid "Company"
313msgstr ""
314
315#. module: account_banking
316#: wizard_field:account_banking.banking_import,import,log:0
317msgid "Log"
318msgstr ""
319
320#. module: account_banking
321#: field:account.banking.imported.file,file:0
322msgid "Raw Data"
323msgstr ""
324
325#. module: account_banking
326#: code:addons/account_banking/account_banking.py:0
327#, python-format
328msgid "Configration Error !"
329msgstr ""
330
331#. module: account_banking
332#: model:ir.module.module,description:account_banking.module_meta_information
333msgid "\n"
334" Module to do banking.\n"
335"\n"
336" This modules tries to combine all current banking import and export\n"
337" schemes. Rationale for this is that it is quite common to have foreign\n"
338" bank account numbers next to national bank account numbers. The current\n"
339" approach, which hides the national banking interface schemes in the\n"
340" l10n_xxx modules, makes it very difficult to use these simultanious.\n"
341" A more banking oriented approach seems more logical and cleaner.\n"
342"\n"
343" Changes to default OpenERP:\n"
344"\n"
345" * Puts focus on the real life messaging with banks:\n"
346" + Bank statement lines upgraded to independent bank transactions.\n"
347" + Banking statements have no special accountancy meaning, they're just\n"
348" message envelopes for a number of bank transactions.\n"
349" + Bank statements can be either encoded by hand to reflect the document\n"
350" version of Bank Statements, or created as an optional side effect of\n"
351" importing Bank Transactions.\n"
352"\n"
353" * Preparations for SEPA:\n"
354" + IBAN accounts are the standard in the SEPA countries\n"
355" + local accounts are derived from SEPA (excluding Turkey) but are\n"
356" considered to be identical to the corresponding SEPA account.\n"
357" + Banks are identified with either Country + Bank code + Branch code or BIC\n"
358" + Each bank can have its own pace in introducing SEPA into their\n"
359" communication with their customers.\n"
360" + National online databases can be used to convert BBAN's to IBAN's.\n"
361"\n"
362" * Adds dropin extensible import facility for bank communication in:\n"
363" + MultiBank (NL) format transaction files,\n"
364" - (todo) MT940 (Swift) format transaction files,\n"
365" - (todo) CODA (BE) format transaction files,\n"
366" - (wish) SEPA Credits (ISO 200022) messages,\n"
367"\n"
368" * Extends payments for digital banking:\n"
369" + Adapted workflow in payments to reflect banking operations\n"
370" + Relies on account_payment mechanics to extend with export generators.\n"
371" - ClieOp3 (NL) payment and direct debit orders files available as\n"
372" account_banking_nl_clieop\n"
373" - (wish) BTL91 (NL) payment orders files (no format description available),\n"
374" - (wish) SEPA Direct Debits (ISO 200022) messages\n"
375"\n"
376" * Additional features for the import/export mechanism:\n"
377" + Automatic matching and creation of bank accounts, banks and partners,\n"
378" during import of statements.\n"
379" + Automatic matching with invoices and payments.\n"
380" + Sound import mechanism, allowing multiple imports of the same\n"
381" transactions repeated over multiple files.\n"
382" + Journal configuration per bank account.\n"
383" + Business logic and format parsing strictly separated to ease the\n"
384" development of new parsers.\n"
385" + No special configuration needed for the parsers, new parsers are\n"
386" recognized and made available at server (re)start.\n"
387" "
388msgstr ""
389
390#. module: account_banking
391#: model:ir.actions.act_window,name:account_banking.act_account_payment_account_bank_statement
392msgid "Bank Statements File"
393msgstr ""
394
395#. module: account_banking
396#: code:addons/account_banking/parsers/models.py:0
397#, python-format
398msgid "This is a stub. Please implement your own."
399msgstr ""
400
401#. module: account_banking
402#: view:account.banking.imported.file:0
403#: model:ir.actions.act_window,name:account_banking.action_account_banking_imported_files
404#: model:ir.ui.menu,name:account_banking.menu_action_account_banking_imported_files
405msgid "Imported Bank Statements Files"
406msgstr ""
407
408#. module: account_banking
409#: field:account.bank.statement,banking_id:0
410msgid "Imported File"
411msgstr ""
412
413#. module: account_banking
414#: view:account.banking.imported.file:0
415#: field:account.banking.imported.file,log:0
416msgid "Import Log"
417msgstr ""
418
419#. module: account_banking
420#: code:addons/account_banking/wizard/bank_import.py:0
421#, python-format
422msgid "The imported statements appear to be invalid! Check your file."
423msgstr ""
424
425#. module: account_banking
426#: code:addons/account_banking/wizard/bank_import.py:0
427#, python-format
428msgid "Number of statements loaded"
429msgstr ""
430
431#. module: account_banking
432#: model:ir.ui.menu,name:account_banking.menu_finance_banking_actions
433#: model:ir.ui.menu,name:account_banking.menu_finance_banking_settings
434msgid "Banking"
435msgstr ""
436
437#. module: account_banking
438#: selection:account.banking.imported.file,state:0
439msgid "Error"
440msgstr ""
441
442#. module: account_banking
443#: code:addons/account_banking/account_banking.py:0
444#, python-format
445msgid "Unable to reconcile entry \"%s\": %.2f"
446msgstr ""
447
448#. module: account_banking
449#: view:account.banking.imported.file:0
450msgid "Import Details"
451msgstr ""
452
453#. module: account_banking
454#: field:account.bank.statement.line,period_id:0
455msgid "Period"
456msgstr ""
457
458#. module: account_banking
459#: selection:payment.line,export_state:0
460msgid "Done"
461msgstr ""
462
463#. module: account_banking
464#: view:payment.order:0
465msgid "Select Invoices to Pay"
466msgstr ""
467
468#. module: account_banking
469#: field:account.banking.imported.file,user_id:0
470msgid "Responsible User"
471msgstr ""
472
473#. module: account_banking
474#: code:addons/account_banking/account_banking.py:0
475#, python-format
476msgid "The statement balance is incorrect !\n"
477msgstr ""
478
479#. module: account_banking
480#: constraint:ir.model:0
481msgid "The Object name must start with x_ and not contain any special character !"
482msgstr ""
483
484#. module: account_banking
485#: selection:account.banking.imported.file,state:0
486msgid "Unfinished"
487msgstr ""
488
489#. module: account_banking
490#: code:addons/account_banking/wizard/bank_import.py:0
491#, python-format
492msgid "Statements found for unknown account %(bank_account)s"
493msgstr ""
494
495#. module: account_banking
496#: model:ir.module.module,shortdesc:account_banking.module_meta_information
497msgid "Account Banking"
498msgstr ""
499
500#. module: account_banking
501#: code:addons/account_banking/wizard/bank_import.py:0
502#, python-format
503msgid "Total number of statements"
504msgstr ""
505
506#. module: account_banking
507#: field:account.banking.imported.file,format:0
508#: wizard_field:account_banking.banking_import,init,parser:0
509msgid "File Format"
510msgstr ""
511
512#. module: account_banking
513#: field:account.banking.account.settings,journal_id:0
514msgid "Journal"
515msgstr ""
516
517#. module: account_banking
518#: selection:account.banking.imported.file,state:0
519msgid "Finished"
520msgstr ""
521
522#. module: account_banking
523#: code:addons/account_banking/wizard/banktools.py:0
524#, python-format
525msgid "No suitable fiscal year found for company %(company_name)s"
526msgstr ""
527
528#. module: account_banking
529#: view:account.banking.account.settings:0
530msgid "Bank Account Details"
531msgstr ""
532
533#. module: account_banking
534#: code:addons/account_banking/wizard/bank_import.py:0
535#, python-format
536msgid "Unable to link transaction %(trans)s to invoice: '\n"
537" '%(no_candidates)s candidates found; can\'t choose."
538msgstr ""
539
540#. module: account_banking
541#: field:account.bank.statement.line,partner_bank_id:0
542#: field:account.banking.account.settings,partner_bank_id:0
543msgid "Bank Account"
544msgstr ""
545
546#. module: account_banking
547#: code:addons/account_banking/wizard/bank_import.py:0
548#, python-format
549msgid "Number of transactions loaded"
550msgstr ""
551
552#. module: account_banking
553#: code:addons/account_banking/wizard/banktools.py:0
554#, python-format
555msgid "Multiple overlapping fiscal years found for date %(date)s"
556msgstr ""
557
558#. module: account_banking
559#: model:ir.model,name:account_banking.model_account_banking_imported_file
560msgid "Imported Bank Statements File"
561msgstr ""
562
0563
=== added file 'account_banking/i18n/nl_NL.po'
--- account_banking/i18n/nl_NL.po 1970-01-01 00:00:00 +0000
+++ account_banking/i18n/nl_NL.po 2010-03-04 01:53:21 +0000
@@ -0,0 +1,607 @@
1# Translation of OpenERP Server.
2# This file contains the translation of the following modules:
3# * account_banking
4#
5msgid ""
6msgstr ""
7"Project-Id-Version: OpenERP Server 5.0.7\n"
8"Report-Msgid-Bugs-To: support@openerp.com\n"
9"POT-Creation-Date: 2010-01-08 15:18:44+0000\n"
10"PO-Revision-Date: 2010-01-08 15:18:44+0000\n"
11"Last-Translator: <>\n"
12"Language-Team: \n"
13"MIME-Version: 1.0\n"
14"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Transfer-Encoding: \n"
16"Plural-Forms: \n"
17
18#. module: account_banking
19#: wizard_view:account_banking.banking_import,import:0
20msgid "Results:"
21msgstr "Resultaat:"
22
23#. module: account_banking
24#: code:addons/account_banking/wizard/bank_import.py:0
25#, python-format
26msgid "Number of errors found"
27msgstr "Aantal gevonden fouten"
28
29#. module: account_banking
30#: wizard_view:account_banking.banking_import,init:0
31msgid "Select the processing details:"
32msgstr "Kies de verwerkings-details:"
33
34#. module: account_banking
35#: constraint:ir.actions.act_window:0
36msgid "Invalid model name in the action definition."
37msgstr "Ongeldige naam in actie-definitie."
38
39#. module: account_banking
40#: wizard_button:account_banking.banking_import,import,open:0
41msgid "_Open Statement"
42msgstr "_Open bankafschriften"
43
44#. module: account_banking
45#: field:payment.line,date_done:0
46msgid "Date Confirmed"
47msgstr "Bevestigingsdatum"
48
49#. module: account_banking
50#: wizard_button:account_banking.banking_import,import,end:0
51msgid "_Close"
52msgstr "_Sluit"
53
54#. module: account_banking
55#: model:ir.model,name:account_banking.model_account_banking_account_settings
56msgid "Default Journal for Bank Account"
57msgstr "Standaard dagboek voor bankrekening"
58
59#. module: account_banking
60#: wizard_field:account_banking.banking_import,init,file:0
61msgid "Statements File"
62msgstr "Transactiebestand"
63
64#. module: account_banking
65#: code:addons/account_banking/wizard/banktools.py:0
66#, python-format
67msgid "More than one bank account was found with the same number %(account_no)s"
68msgstr "Meer dan één bankrekening gevonden met hetzelfde rekeningnummer %(account_no)s"
69
70#. module: account_banking
71#: code:addons/account_banking/wizard/bank_import.py:0
72#, python-format
73msgid "Total number of transactions"
74msgstr "Totaal aantal transacties"
75
76#. module: account_banking
77#: code:addons/account_banking/account_banking.py:0
78#, python-format
79msgid "Account move line \"%s\" is not valid"
80msgstr "Boekingsregel \"%s\" is onjuist."
81
82#. module: account_banking
83#: help:account.banking.account.settings,default_debit_account_id:0
84msgid "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."
85msgstr "De rekening waarop geboekt moet worden bij onverwachte betalingen. Dit kan nodig zijn als een klant vooruit betaalt of wanneer er geen overeenkomende factuur gevonden kan worden. Merk op dat u altijd boekingen kunt corrigeren voordat u deze bevestigt."
86
87#. module: account_banking
88#: code:addons/account_banking/wizard/banktools.py:0
89#, python-format
90msgid "Bank account %(account_no)s was not found in the database"
91msgstr "Bankrekening %(account)s niet gevonden in de database"
92
93#. module: account_banking
94#: code:addons/account_banking/wizard/bank_import.py:0
95#, python-format
96msgid "Number of transactions skipped due to errors"
97msgstr "Aantal overgeslagen transacties als gevolg van fouten"
98
99#. module: account_banking
100#: code:addons/account_banking/account_banking.py:0
101#, python-format
102msgid "The expected balance (%.2f) is different '\n"
103" 'than the computed one. (%.2f)"
104msgstr "Het verwachte saldo (%.2f) wijkt af van het berekende- (%.2f)."
105
106#. module: account_banking
107#: code:addons/account_banking/wizard/bank_import.py:0
108#, python-format
109msgid "Statement for account %(bank_account)s uses different '\n"
110" 'currency than the defined bank journal."
111msgstr "Afschrift voor bankrekening %(account)s gebruik andere valuta dan opgegeven in het bankdagboek."
112
113#. module: account_banking
114#: code:addons/account_banking/wizard/bank_import.py:0
115#, python-format
116msgid "Number of statements skipped due to errors"
117msgstr "Aantal afschriften overgeslagen door fouten"
118
119#. module: account_banking
120#: view:account.banking.account.settings:0
121msgid "Default Import Settings for Bank Account"
122msgstr "Standaardinstellingen voor bankrekeningen"
123
124#. module: account_banking
125#: help:account.banking.account.settings,default_credit_account_id:0
126msgid "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."
127msgstr "De te gebruiken rekening bij onverwachte betalingen. Dit kan voorkomen indien een incasso-opdracht door een klant is geannuleerd, of wanneer er geen overeenkomende betaling kan worden gevonden. Merk op dat u altijd boekingen kunt corrigeren voordat u deze bevestigt."
128
129#. module: account_banking
130#: code:addons/account_banking/wizard/bank_import.py:0
131#, python-format
132msgid "Unable to import parser %(parser)s. Parser class not found."
133msgstr "Niet in staat parser %(parser)s te importeren. Parser class niet gevonden."
134
135#. module: account_banking
136#: selection:payment.line,export_state:0
137msgid "Cancelled"
138msgstr "Geannuleerd"
139
140#. module: account_banking
141#: view:account.banking.imported.file:0
142#: field:account.banking.imported.file,statement_ids:0
143msgid "Statements"
144msgstr "Afschriften"
145
146#. module: account_banking
147#: field:account.banking.account.settings,default_debit_account_id:0
148msgid "Default debit account"
149msgstr "Standaard debet-rekening"
150
151#. module: account_banking
152
153#. module: account_banking
154#: field:account.banking.imported.file,date:0
155msgid "Import Date"
156msgstr "Importdatum"
157
158#. module: account_banking
159#: selection:payment.line,export_state:0
160msgid "Confirmed"
161msgstr "Bevestigd"
162
163#. module: account_banking
164#: view:account.banking.account.settings:0
165msgid "Default Accounts for Unknown Movements"
166msgstr "Standaard rekeningen voor onverwachte mutaties"
167
168#. module: account_banking
169#: view:account.bank.statement:0
170msgid "Confirm"
171msgstr "Bevestig"
172
173#. module: account_banking
174#: field:account.banking.account.settings,default_credit_account_id:0
175msgid "Default credit account"
176msgstr "Standaard credit-rekening"
177
178#. module: account_banking
179#: code:addons/account_banking/wizard/bank_import.py:0
180#, python-format
181msgid "Statements found for account %(bank_account)s, '\n"
182" 'but no default journal was defined."
183msgstr "Afschriften gevonden voor bankrekening %(bank_account)s, maar geen gedefinieerd dagboek gevonden hiervoor."
184
185#. module: account_banking
186#: field:account.bank.statement.line,international:0
187msgid "International Transaction"
188msgstr "Internationale transactie"
189
190#. module: account_banking
191#: code:addons/account_banking/account_banking.py:0
192#, python-format
193msgid "Please verify that an account is defined in the journal."
194msgstr "Controleer alstublieft of een rekening is opgegeven in het journaal"
195
196#. module: account_banking
197#: field:account.bank.statement.line,trans:0
198msgid "Bank Transaction ID"
199msgstr "Transactie ID bank"
200
201#. module: account_banking
202#: code:addons/account_banking/wizard/bank_import.py:0
203#, python-format
204msgid "Statement %(id)s known - skipped"
205msgstr "Afschrift %(id)s al bekend - overgeslagen"
206
207#. module: account_banking
208#: selection:payment.line,export_state:0
209msgid "Sent"
210msgstr "Verzonden"
211
212#. module: account_banking
213#: code:addons/account_banking/account_banking.py:0
214#, python-format
215msgid "Error !"
216msgstr "Fout !"
217
218#. module: account_banking
219#: code:addons/account_banking/account_banking.py:0
220#, python-format
221msgid "The account entries lines are not in valid state."
222msgstr "De boekingsregels zijn niet geldig."
223
224#. module: account_banking
225#: model:ir.actions.act_window,name:account_banking.action_account_banking_journals
226#: model:ir.ui.menu,name:account_banking.menu_action_account_banking_bank_journals
227msgid "Default Import Settings for Bank Accounts"
228msgstr "Standaardinstellingen voor bankrekeningen"
229
230#. module: account_banking
231#: model:ir.actions.wizard,name:account_banking.wizard_account_banking_import_file
232#: model:ir.ui.menu,name:account_banking.menu_account_banking_import_wizard
233msgid "Import Bank Statements File"
234msgstr "Importeer bankafschrift bestand"
235
236#. module: account_banking
237#: help:account_banking.banking_import,init,file:0
238msgid "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"
239"\n"
240"To stay on the safe side, always load bank statements files using the same format."
241msgstr "Het te importeren transactiebestand. Let alstublieft op: hoewel het zondermeer veilig is om hetzelfde bestand meerdere keren te importeren of om in tijd overlappende bestanden te importeren, zijn er formaten die een ander nummeringsschema introduceren, wat tot problemen kan leiden.\n"
242"\n"
243"Om aan de veilige kant te blijven, importeer altijd transactiebestanden in hetzelfde formaat."
244
245#. module: account_banking
246#: constraint:ir.ui.view:0
247msgid "Invalid XML for View Architecture!"
248msgstr "Ongeldige XML voor overzicht"
249
250#. module: account_banking
251#: view:account.banking.imported.file:0
252msgid "Imported Bank Statements"
253msgstr "Geïmporteerde bankafschriften"
254
255#. module: account_banking
256#: wizard_view:account_banking.banking_import,import:0
257#: wizard_view:account_banking.banking_import,init:0
258msgid "Import Bank Transactions File"
259msgstr "Importeer banktransacties-bestand"
260
261#. module: account_banking
262#: code:addons/account_banking/wizard/banktools.py:0
263#, python-format
264msgid "Account %(account_no)s is not owned by %(partner)s"
265msgstr "Rekening %(account_no)s is geen eigendom van %(partner)s"
266
267#. module: account_banking
268#: wizard_button:account_banking.banking_import,init,import:0
269msgid "_Ok"
270msgstr "_Ok"
271
272#. module: account_banking
273#: code:addons/account_banking/wizard/banktools.py:0
274#, python-format
275msgid "More then one possible match found for partner with name %(name)s"
276msgstr "Meer dan één mogelijke match gevonden voor partner met naam %(name)s"
277
278#. module: account_banking
279#: field:account.banking.imported.file,state:0
280#: field:payment.line,export_state:0
281msgid "State"
282msgstr "Status"
283
284
285#. module: account_banking
286#: code:addons/account_banking/wizard/banktools.py:0
287#, python-format
288msgid "No suitable period found for date %(date)s"
289msgstr "Geen geschikte periode gevonden voor datum %(date)s"
290
291#. module: account_banking
292#: code:addons/account_banking/wizard/banktools.py:0
293#, python-format
294msgid "Multiple overlapping periods for date %(date)s"
295msgstr "Meerdere overlappende periodes gevonden voor datum %(date)s"
296
297#. module: account_banking
298#: field:account.banking.account.settings,company_id:0
299#: field:account.banking.imported.file,company_id:0
300#: wizard_field:account_banking.banking_import,init,company:0
301msgid "Company"
302msgstr "Bedrijf"
303
304#. module: account_banking
305#: wizard_field:account_banking.banking_import,import,log:0
306msgid "Log"
307msgstr "Logboek"
308
309#. module: account_banking
310#: field:account.banking.imported.file,file:0
311msgid "Raw Data"
312msgstr "Ruwe data"
313
314#. module: account_banking
315#: code:addons/account_banking/account_banking.py:0
316#, python-format
317msgid "Configration Error !"
318msgstr "Instellingsfout!"
319
320#. module: account_banking
321#: model:ir.module.module,description:account_banking.module_meta_information
322msgid "\n"
323" Module to do banking.\n"
324"\n"
325" This modules tries to combine all current banking import and export\n"
326" schemes. Rationale for this is that it is quite common to have foreign\n"
327" bank account numbers next to national bank account numbers. The current\n"
328" approach, which hides the national banking interface schemes in the\n"
329" l10n_xxx modules, makes it very difficult to use these simultanious.\n"
330" A more banking oriented approach seems more logical and cleaner.\n"
331"\n"
332" Changes to default OpenERP:\n"
333"\n"
334" * Puts focus on the real life messaging with banks:\n"
335" + Bank statement lines upgraded to independent bank transactions.\n"
336" + Banking statements have no special accountancy meaning, they're just\n"
337" message envelopes for a number of bank transactions.\n"
338" + Bank statements can be either encoded by hand to reflect the document\n"
339" version of Bank Statements, or created as an optional side effect of\n"
340" importing Bank Transactions.\n"
341"\n"
342" * Preparations for SEPA:\n"
343" + IBAN accounts are the standard in the SEPA countries\n"
344" + local accounts are derived from SEPA (excluding Turkey) but are\n"
345" considered to be identical to the corresponding SEPA account.\n"
346" + Banks are identified with either Country + Bank code + Branch code or BIC\n"
347" + Each bank can have its own pace in introducing SEPA into their\n"
348" communication with their customers.\n"
349" + National online databases can be used to convert BBAN's to IBAN's.\n"
350"\n"
351" * Adds dropin extensible import facility for bank communication in:\n"
352" + MultiBank (NL) format transaction files,\n"
353" - (todo) MT940 (Swift) format transaction files,\n"
354" - (todo) CODA (BE) format transaction files,\n"
355" - (wish) SEPA Credits (ISO 200022) messages,\n"
356"\n"
357" * Extends payments for digital banking:\n"
358" + Adapted workflow in payments to reflect banking operations\n"
359" + Relies on account_payment mechanics to extend with export generators.\n"
360" - ClieOp3 (NL) payment and direct debit orders files available as\n"
361" account_banking_nl_clieop\n"
362" - (wish) BTL91 (NL) payment orders files (no format description available),\n"
363" - (wish) SEPA Direct Debits (ISO 200022) messages\n"
364"\n"
365" * Additional features for the import/export mechanism:\n"
366" + Automatic matching and creation of bank accounts, banks and partners,\n"
367" during import of statements.\n"
368" + Automatic matching with invoices and payments.\n"
369" + Sound import mechanism, allowing multiple imports of the same\n"
370" transactions repeated over multiple files.\n"
371" + Journal configuration per bank account.\n"
372" + Business logic and format parsing strictly separated to ease the\n"
373" development of new parsers.\n"
374" + No special configuration needed for the parsers, new parsers are\n"
375" recognized and made available at server (re)start.\n"
376" "
377msgstr " Module voor bankzaken.\n"
378"\n"
379" Deze module probeert alle bestaande bankimport- en -exportschema's\n"
380" te combineren. Ratio hierachter is dat het vrij gebruikelijk is om\n"
381" buitenlandse bankrekeningen te hebben naast nationale-. De huidige\n"
382" benadering waarbij nationale bankinterfaces ondergebracht worden in\n"
383" de l10n_xxx modules, maakt het zeer lastig om deze naast elkaar te\n"
384" gebruiken. Een meer bank-geöriënteerde benadering lijkt logischer en\n"
385" 'schoner'.\n"
386"\n"
387" Wijzigingen op standaard OpenERP:\n"
388"\n"
389" * Legt focus op berichtuitwisseling met banken:\n"
390" + Bankafschriftregels opgewaardeerd naar onafhankelijke banktransacties.\n"
391" + Bankafschriften hebben geen speciale accountancy-betekenis, ze zijn\n"
392" slechts enveloppen voor een reeks banktransacties.\n"
393" + Bankafschriften kunnen hetzij met de hand worden ingevoerd als projectie\n"
394" van de papieren versie, of gemaakt worden als neveneffect van het\n"
395" importeren van banktransacties.\n"
396"\n"
397" * Voorbereidingen voor SEPA:\n"
398" + IBAN bankrekeningen zijn de standaard in de SEPA-landen\n"
399" + lokale bankrekeningen worden afgeleid van SEPA (uitgezonderd Turkije)\n"
400" maar worden beschouwd als identiek aan de corresponderende IBAN-rekening.\n"
401" + Banken worden geïdentificeerd met hetzij land + bankcode + branchcode of BIC\n"
402" - Each bank can have its own pace in introducing SEPA into their\n"
403" communication with their customers.\n"
404" + Nationale online databases kunnen gebruikt worden om BBAN's naar IBAN's te\n"
405" converteren.\n"
406"\n"
407" * Geeft dropin uitbreidbare importvoorzieningen voor bankcommunicatie in:\n"
408" + MultiBank (NL) formaat transactiebestanden,\n"
409" - (todo) MT940 (Swift) formaat transactiebestanden,\n"
410" - (todo) CODA (BE) formaat transactiebestanden,\n"
411" - (wish) SEPA Credits (ISO 200022) berichten,\n"
412"\n"
413" * Breidt betalingen uit voor digitaal bankieren:\n"
414" + Werkstroom in betalingen aangepast voor bank-operaties\n"
415" + Bouwt op account_payment mechanieken voor uitbreidingen met export generatoren.\n"
416" - ClieOp3 (NL) betalings- en incasso-opdrachten beschikbaar in de\n"
417" account_banking_nl_clieop module\n"
418" - (wish) BTL91 (NL) batalingsopdrachten (geen formaatbeschrijving beschikbaar),\n"
419" - (wish) SEPA Direct Debits (ISO 200022) berichten\n"
420"\n"
421" * Toegevoegde mogelijkheden voor het import/export mechanisme:\n"
422" + Automatische koppeling en aanmaken van bankrekeningen, banken en relaties\n"
423" tijdens het importeren van transacties.\n"
424" + Automatisch koppelen met facturen en betalingen.\n"
425" + Solide importmechanisme dat meerdere imports van dezelfde transacties over\n"
426" over meerdere bestanden toestaat.\n"
427" + Dagboek-instellingen per bankrekening.\n"
428" + Business logica en bestands-parsing strikt gescheiden om de ontwikkeling\n"
429" van nieuwe parsers te vergemakkelijken\n"
430" + Geen speciale configuratie nodig voor de parsers, nieuwe parsers worden\n"
431" herkend en beschikbaar gemaakt voor gebuikers bij server(her)start.\n"
432" "
433
434#. module: account_banking
435#: model:ir.actions.act_window,name:account_banking.act_account_payment_account_bank_statement
436msgid "Bank Statements File"
437msgstr "Bankafschrift bestand"
438
439#. module: account_banking
440#: code:addons/account_banking/parsers/models.py:0
441#, python-format
442msgid "This is a stub. Please implement your own."
443msgstr "Dit is een stub. Maak alstublieft uw eigen versie."
444
445#. module: account_banking
446#: view:account.banking.imported.file:0
447#: model:ir.actions.act_window,name:account_banking.action_account_banking_imported_files
448#: model:ir.ui.menu,name:account_banking.menu_action_account_banking_imported_files
449msgid "Imported Bank Statements Files"
450msgstr "Geïmporteerde bankafschrift bestanden"
451
452#. module: account_banking
453#: field:account.bank.statement,banking_id:0
454msgid "Imported File"
455msgstr "Geïmporteerd bestand"
456
457#. module: account_banking
458#: view:account.banking.imported.file:0
459#: field:account.banking.imported.file,log:0
460msgid "Import Log"
461msgstr "Import log"
462
463#. module: account_banking
464#: code:addons/account_banking/wizard/bank_import.py:0
465#, python-format
466msgid "The imported statements appear to be invalid! Check your file."
467msgstr "De geïmporteerde afschriften lijken onjuist! Controleer uw bestand."
468
469#. module: account_banking
470#: code:addons/account_banking/wizard/bank_import.py:0
471#, python-format
472msgid "Number of statements loaded"
473msgstr "Aantal geladen afschriften"
474
475#. module: account_banking
476#: model:ir.ui.menu,name:account_banking.menu_finance_banking_actions
477#: model:ir.ui.menu,name:account_banking.menu_finance_banking_settings
478msgid "Banking"
479msgstr "Bankzaken"
480
481#. module: account_banking
482#: selection:account.banking.imported.file,state:0
483msgid "Error"
484msgstr "Fout"
485
486#. module: account_banking
487#: code:addons/account_banking/account_banking.py:0
488#, python-format
489msgid "Unable to reconcile entry \"%s\": %.2f"
490msgstr "Niet in staat boeking af te letteren \"%s\": %.2f"
491
492#. module: account_banking
493#: view:account.banking.imported.file:0
494msgid "Import Details"
495msgstr "Details import"
496
497#. module: account_banking
498#: field:account.bank.statement.line,period_id:0
499msgid "Period"
500msgstr "Periode"
501
502#. module: account_banking
503#: selection:payment.line,export_state:0
504msgid "Done"
505msgstr "Verwerkt"
506
507#. module: account_banking
508#: view:payment.order:0
509msgid "Select Invoices to Pay"
510msgstr "Kies te betalen facturen"
511
512#. module: account_banking
513#: field:account.banking.imported.file,user_id:0
514msgid "Responsible User"
515msgstr "Verantwoordelijke gebruiker"
516
517#. module: account_banking
518#: code:addons/account_banking/account_banking.py:0
519#, python-format
520msgid "The statement balance is incorrect !\n"
521msgstr "Het saldo op het afschrift is onjuist!\n"
522
523#. module: account_banking
524#: constraint:ir.model:0
525msgid "The Object name must start with x_ and not contain any special character !"
526msgstr "De objectnaam moet beginnen met x_ en mag geen speciale karakters bevatten !"
527
528#. module: account_banking
529#: selection:account.banking.imported.file,state:0
530msgid "Unfinished"
531msgstr "Onvoltooid"
532
533#. module: account_banking
534#: code:addons/account_banking/wizard/bank_import.py:0
535#, python-format
536msgid "Statements found for unknown account %(bank_account)s"
537msgstr "Afschriften gevonden voor onbekende bankrekening %(bank_account)s"
538
539#. module: account_banking
540#: model:ir.module.module,shortdesc:account_banking.module_meta_information
541msgid "Account Banking"
542msgstr "Account Banking"
543
544#. module: account_banking
545#: code:addons/account_banking/wizard/bank_import.py:0
546#, python-format
547msgid "Total number of statements"
548msgstr "Totaal aantal afschriften"
549
550#. module: account_banking
551#: field:account.banking.imported.file,format:0
552#: wizard_field:account_banking.banking_import,init,parser:0
553msgid "File Format"
554msgstr "Bestandsformaat"
555
556#. module: account_banking
557#: field:account.banking.account.settings,journal_id:0
558msgid "Journal"
559msgstr "Dagboek"
560
561#. module: account_banking
562#: selection:account.banking.imported.file,state:0
563msgid "Finished"
564msgstr "Gereed"
565
566#. module: account_banking
567#: code:addons/account_banking/wizard/banktools.py:0
568#, python-format
569msgid "No suitable fiscal year found for company %(company_name)s"
570msgstr "Geen geschikt boekjaar gevonden voor bedrijf %(company_name)s"
571
572#. module: account_banking
573#: view:account.banking.account.settings:0
574msgid "Bank Account Details"
575msgstr "Details bankrekening"
576
577#. module: account_banking
578#: code:addons/account_banking/wizard/bank_import.py:0
579#, python-format
580msgid "Unable to link transaction %(trans)s to invoice: '\n"
581" '%(no_candidates)s candidates found; can\'t choose."
582msgstr "Niet in staat transactie %(trans)s aan factuur te koppelen: '\n"
583" '%(no_candidates)s kandidaten gevonden; kan niet kiezen."
584
585#. module: account_banking
586#: field:account.bank.statement.line,partner_bank_id:0
587#: field:account.banking.account.settings,partner_bank_id:0
588msgid "Bank Account"
589msgstr "Bankrekening"
590
591#. module: account_banking
592#: code:addons/account_banking/wizard/bank_import.py:0
593#, python-format
594msgid "Number of transactions loaded"
595msgstr "Aantal geladen transacties"
596
597#. module: account_banking
598#: code:addons/account_banking/wizard/banktools.py:0
599#, python-format
600msgid "Multiple overlapping fiscal years found for date %(date)s"
601msgstr "Meerdere overlappende boekjaren gevonden voor datum %(date)s"
602
603#. module: account_banking
604#: model:ir.model,name:account_banking.model_account_banking_imported_file
605msgid "Imported Bank Statements File"
606msgstr "Geïmporteerde bankafschrift bestand"
607
0608
=== added directory 'account_banking/parsers'
=== added file 'account_banking/parsers/__init__.py'
--- account_banking/parsers/__init__.py 1970-01-01 00:00:00 +0000
+++ account_banking/parsers/__init__.py 2010-03-04 01:53:21 +0000
@@ -0,0 +1,24 @@
1# -*- encoding: utf-8 -*-
2##############################################################################
3#
4# Copyright (C) 2009 EduSense BV (<http://www.edusense.nl>).
5# All Rights Reserved
6#
7# This program is free software: you can redistribute it and/or modify
8# it under the terms of the GNU General Public License as published by
9# the Free Software Foundation, either version 3 of the License, or
10# (at your option) any later version.
11#
12# This program is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15# GNU General Public License for more details.
16#
17# You should have received a copy of the GNU General Public License
18# along with this program. If not, see <http://www.gnu.org/licenses/>.
19#
20##############################################################################
21
22import models
23
24# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
025
=== added file 'account_banking/parsers/convert.py'
--- account_banking/parsers/convert.py 1970-01-01 00:00:00 +0000
+++ account_banking/parsers/convert.py 2010-03-04 01:53:21 +0000
@@ -0,0 +1,41 @@
1# -*- encoding: utf-8 -*-
2##############################################################################
3#
4# Copyright (C) 2009 EduSense BV (<http://www.edusense.nl>).
5# All Rights Reserved
6#
7# This program is free software: you can redistribute it and/or modify
8# it under the terms of the GNU General Public License as published by
9# the Free Software Foundation, either version 3 of the License, or
10# (at your option) any later version.
11#
12# This program is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15# GNU General Public License for more details.
16#
17# You should have received a copy of the GNU General Public License
18# along with this program. If not, see <http://www.gnu.org/licenses/>.
19#
20##############################################################################
21
22__all__ = ['str2date', 'date2str', 'date2date']
23
24import datetime
25
26def str2date(datestr, format='%d/%m/%y'):
27 '''Convert a string to a datatime object'''
28 return datetime.datetime.strptime(datestr, format)
29
30def date2str(date, format='%Y-%m-%d'):
31 '''Convert a datetime object to a string'''
32 return date.strftime(format)
33
34def date2date(datestr, fromfmt='%d/%m/%y', tofmt='%Y-%m-%d'):
35 '''
36 Convert a date in a string to another string, in a different
37 format
38 '''
39 return date2str(str2date(datestr, fromfmt), tofmt)
40
41# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
042
=== added file 'account_banking/parsers/models.py'
--- account_banking/parsers/models.py 1970-01-01 00:00:00 +0000
+++ account_banking/parsers/models.py 2010-03-04 01:53:21 +0000
@@ -0,0 +1,161 @@
1# -*- encoding: utf-8 -*-
2##############################################################################
3#
4# Copyright (C) 2009 EduSense BV (<http://www.edusense.nl>).
5# All Rights Reserved
6#
7# This program is free software: you can redistribute it and/or modify
8# it under the terms of the GNU General Public License as published by
9# the Free Software Foundation, either version 3 of the License, or
10# (at your option) any later version.
11#
12# This program is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15# GNU General Public License for more details.
16#
17# You should have received a copy of the GNU General Public License
18# along with this program. If not, see <http://www.gnu.org/licenses/>.
19#
20##############################################################################
21
22class mem_bank_statement(object):
23 '''
24 A mem_bank_statement is a real life projection of a bank statement paper
25 containing a report of one or more transactions done. As these reports can
26 contain payments that originate in several accounting periods, period is an
27 attribute of mem_bank_transaction, not of mem_bank_statement.
28 Also note that the statement_id is copied from the bank statement, and not
29 generated from any sequence. This enables us to skip old data in new
30 statement files.
31 '''
32 # Lock attributes to enable parsers to trigger non-conformity faults
33 __slots__ = [
34 'start_balance','end_balance', 'date', 'local_account',
35 'local_currency', 'id', 'statements'
36 ]
37 def __init__(self, *args, **kwargs):
38 super(mem_bank_statement, self).__init__(*args, **kwargs)
39 self.id = ''
40 self.local_account = ''
41 self.local_currency = ''
42 self.start_balance = 0.0
43 self.end_balance = 0.0
44 self.date = ''
45 self.transactions = []
46
47 def is_valid(self):
48 '''
49 Final check: ok if calculated end_balance and parsed end_balance are
50 identical and perform a heuristic check on the transactions.
51 '''
52 if any([x for x in self.transactions if not x.is_valid()]):
53 return False
54 check = float(self.start_balance)
55 for transaction in self.transactions:
56 check += float(transaction.transferred_amount)
57 return abs(check - float(self.end_balance)) < 0.0001
58
59class mem_bank_transaction(object):
60 '''
61 A mem_bank_transaction is a real life copy of a bank transfer. Mapping to
62 OpenERP moves and linking to invoices and the like is done afterwards.
63 '''
64 # Lock attributes to enable parsers to trigger non-conformity faults
65 __slots__ = [
66 'id', 'local_account', 'local_currency', 'execution_date',
67 'effective_date', 'remote_owner', 'remote_account',
68 'remote_currency', 'transferred_amount', 'transfer_type',
69 'reference', 'message', 'statement_id',
70 ]
71
72 def __init__(self, *args, **kwargs):
73 super(mem_bank_transaction, self).__init__(*args, **kwargs)
74 self.id = ''
75 self.local_account = ''
76 self.local_currency = ''
77 self.execution_date = ''
78 self.effective_date = ''
79 self.remote_account = ''
80 self.remote_owner = ''
81 self.remote_currency = ''
82 self.transferred_amount = ''
83 self.transfer_type = ''
84 self.reference = ''
85 self.message = ''
86 self.statement_id = ''
87
88 def is_valid(self):
89 '''
90 Heuristic check: at least id, execution_date, remote_account and
91 transferred_amount should be filled to create a valid transfer.
92 '''
93 return (self.execution_date and self.remote_account
94 and self.transferred_amount and True) or False
95
96class parser_type(type):
97 parsers = []
98 parser_by_name = {}
99 parser_by_code = {}
100 parser_by_classname = {}
101
102 def __new__(metacls, clsname, bases, clsdict):
103 newcls = type.__new__(metacls, clsname, bases, clsdict)
104 if 'name' in clsdict and newcls.name:
105 metacls.parsers.append(newcls)
106 metacls.parser_by_name[newcls.name] = newcls
107 metacls.parser_by_code[newcls.code] = newcls
108 metacls.parser_by_classname[clsname] = newcls
109 return newcls
110
111 @classmethod
112 def get_parser_types(cls, sort='name'):
113 if sort == 'name':
114 keys = cls.parser_by_name.keys()
115 parsers = cls.parser_by_name
116 else:
117 keys = cls.parser_by_code.itervalues()
118 parsers = cls.parser_by_code
119 keys.sort()
120 return [(parsers[x].code, parsers[x].name) for x in keys]
121
122def create_parser(code):
123 if code in parser_type.parser_by_code:
124 return parser_type.parser_by_code[code]()
125 return None
126
127class parser(object):
128 '''
129 A parser delivers the interface for any parser object. Inherit from
130 it to implement your own.
131 You should at least implement the following at the class level:
132 name -> the name of the parser, shown to the user and
133 translatable.
134 code -> the identifier you care to give it. Not translatable
135 doc -> the description of the identifier. Shown to the user.
136 Translatable.
137
138 parse -> the method for the actual parsing.
139 '''
140 __metaclass__ = parser_type
141 name = None
142 code = None
143 doc = __doc__
144
145 def parse(self, data):
146 '''
147 Parse data.
148
149 data is a raw in memory file object. You have to split it in
150 whatever chunks you see fit for parsing. It should return a list
151 of mem_bank_statement objects. Every mem_bank_statement object
152 should contain a list of mem_bank_transaction objects.
153
154 For identification purposes, don't invent numbering of the transaction
155 numbers or bank statements ids on your own - stick with those provided
156 by your bank. Doing so enables the users to re-load old transaction
157 files without creating multiple identical bank statements.
158 '''
159 raise NotImplementedError(_('This is a stub. Please implement your own.'))
160
161# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
0162
=== added file 'account_banking/record.py'
--- account_banking/record.py 1970-01-01 00:00:00 +0000
+++ account_banking/record.py 2010-03-04 01:53:21 +0000
@@ -0,0 +1,182 @@
1# -*- encoding: utf-8 -*-
2##############################################################################
3#
4# Copyright (C) 2009 EduSense BV (<http://www.edusense.nl>).
5# All Rights Reserved
6#
7# This program is free software: you can redistribute it and/or modify
8# it under the terms of the GNU General Public License as published by
9# the Free Software Foundation, either version 3 of the License, or
10# (at your option) any later version.
11#
12# This program is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15# GNU General Public License for more details.
16#
17# You should have received a copy of the GNU General Public License
18# along with this program. If not, see <http://www.gnu.org/licenses/>.
19#
20##############################################################################
21
22__all__ = [
23 'Field', 'Filler', 'DateField', 'NumberField', 'RightAlignedField',
24 'RecordType', 'Record', 'asciify'
25]
26
27__doc__ = '''Ease working with fixed length records in files'''
28
29from datetime import datetime, date
30import unicodedata
31
32class Field(object):
33 '''Base Field class - fixed length left aligned string field in a record'''
34 def __init__(self, name, length=1, fillchar=' '):
35 self.name = name.replace(' ', '_')
36 self.length = length
37 self.fillchar = fillchar
38
39 def format(self, value):
40 value = str(value)
41 if len(value) > self.length:
42 return value[len(value) - self.length:]
43 return value.ljust(self.length, self.fillchar)
44
45 def take(self, buffer):
46 offset = hasattr(self, 'offset') and self.offset or 0
47 return buffer[offset:offset + self.length].rstrip(self.fillchar)
48
49 def __repr__(self):
50 return '%s "%s"' % (self.__class__.__name__, self.name)
51
52class Filler(Field):
53 '''Constant value field'''
54 def __init__(self, name, length=1, value=' '):
55 super(Filler, self).__init__(name, length)
56 self.value = str(value)
57
58 def take(self, buffer):
59 return self.format(buffer)
60
61 def format(self, value):
62 return super(Filler, self).format(
63 self.value * (self.length / len(self.value) +1)
64 )
65
66class DateField(Field):
67 '''Variable date field'''
68 def __init__(self, name, format='%Y-%m-%d', auto=False):
69 length = len(date.today().strftime(format))
70 super(DateField, self).__init__(name, length)
71 self.dateformat = format
72 self.auto = auto
73
74 def format(self, value):
75 if isinstance(value, (str, unicode)) and \
76 len(value.strip()) == self.length:
77 value = datetime.strptime(value, self.dateformat).date()
78 elif not isinstance(value, (datetime, date)):
79 value = date.today()
80 return value.strftime(self.dateformat)
81
82 def take(self, buffer):
83 value = super(DateField, self).take(buffer)
84 if value:
85 return datetime.strptime(value, self.dateformat).date()
86 return self.auto and date.today() or None
87
88class RightAlignedField(Field):
89 '''Deviation of Field: right aligned'''
90 def format(self, value):
91 if len(value) > self.length:
92 return value[:self.length]
93 return value.rjust(self.length, self.fillchar)
94
95 def take(self, buffer):
96 offset = hasattr(self, 'offset') and self.offset or 0
97 return buffer[offset:offset + self.length].lstrip(self.fillchar)
98
99class NumberField(RightAlignedField):
100 '''Deviation of Field: left zero filled'''
101 def __init__(self, *args, **kwargs):
102 kwargs['fillchar'] = '0'
103 super(NumberField, self).__init__(*args, **kwargs)
104
105 def format(self, value):
106 return super(NumberField, self).format(value and str(value) or '')
107
108class RecordType(object):
109 fields = []
110
111 def __init__(self, fields=[]):
112 if fields:
113 self.fields = fields
114 offset = 0
115 for field in self.fields:
116 field.offset = offset
117 offset += field.length
118
119 def __len__(self):
120 return reduce(lambda x,y: x+y.length, self.fields, 0)
121
122 def __contains__(self, key):
123 return any(lambda x, y=key: x.name == y, self.fields)
124
125 def __getitem__(self, key):
126 for field in self.fields:
127 if field.name == key:
128 return field
129 raise KeyError, 'No such field: %s' % key
130
131 def format(self, buffer):
132 result = []
133 for field in self.fields:
134 result.append(field.format(field.take(buffer)))
135 return ''.join(result)
136
137 def take(self, buffer):
138 return dict(zip([x.name for x in self.fields],
139 [x.take(buffer) for x in self.fields]
140 ))
141
142class Record(object):
143 _recordtype = None
144
145 def __init__(self, recordtype=None, value=''):
146 if hasattr(self, '_fields') and self._fields:
147 self._recordtype = RecordType(self._fields)
148 if not self._recordtype and not recordtype:
149 raise ValueError, 'No recordtype specified'
150 if not self._recordtype:
151 self._recordtype = recordtype()
152 self._length = len(self._recordtype)
153 self._value = value.ljust(self._length)[:self._length]
154
155 def __len__(self):
156 return self._length
157
158 def __setattr__(self, attr, value):
159 if attr.startswith('_'):
160 super(Record, self).__setattr__(attr, value)
161 else:
162 field = self._recordtype[attr]
163 self._value = self._value[:field.offset] + \
164 field.format(value) + \
165 self._value[field.offset + field.length:]
166
167 def __getattr__(self, attr):
168 if attr.startswith('_'):
169 return super(Record, self).__getattr__(attr)
170 field = self._recordtype[attr]
171 return field.take(self._value)
172
173 def __str__(self):
174 return self._recordtype.format(self._value)
175
176 def __unicode__(self):
177 return unicode(str(self))
178
179def asciify(str):
180 return unicodedata.normalize('NFKD', str).encode('ascii', 'ignore')
181
182# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
0183
=== added file 'account_banking/sepa.py'
--- account_banking/sepa.py 1970-01-01 00:00:00 +0000
+++ account_banking/sepa.py 2010-03-04 01:53:21 +0000
@@ -0,0 +1,421 @@
1# -*- encoding: utf-8 -*-
2##############################################################################
3#
4# Copyright (C) 2009 EduSense BV (<http://www.edusense.nl>).
5# All Rights Reserved
6#
7# This program is free software: you can redistribute it and/or modify
8# it under the terms of the GNU General Public License as published by
9# the Free Software Foundation, either version 3 of the License, or
10# (at your option) any later version.
11#
12# This program is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15# GNU General Public License for more details.
16#
17# You should have received a copy of the GNU General Public License
18# along with this program. If not, see <http://www.gnu.org/licenses/>.
19#
20##############################################################################
21
22# The information about SEPA account numbers in this module are collected
23# from ISO 13616-1, which can be found at SWIFT's website:
24# http://www.swift.com/solutions/messaging/information_products/bic_downloads_documents/pdfs/IBAN_Registry.pdf
25#
26# This module uses both SEPA and IBAN as seemingly interchangeble terms.
27# However, a SEPA account is a bank account in the SEPA zone, which is
28# represented by a IBAN number, which is build up from a ISO-693-1 two letter
29# country code, two check digits and a BBAN number, representing the
30# local/national accounting scheme.
31#
32# With the exception of Turkey, all countries use the full local adressing
33# scheme in the IBAN numbers, making it possible to deduce the BBAN from the
34# IBAN. As Turkey uses an additional code in the local scheme which is not
35# part of the BBAN, for accounts located in Turkeys banks it is not possible
36# to use the BBAN to reconstruct the local account.
37#
38# WARNING:
39# This module contains seemingly enough info to create IBAN's from BBAN's.
40# Although many BBAN/IBAN conversions seem algorithmic, there is enough
41# deviation to take the warning from SEPA seriously: this is the domain of the
42# account owning banks. Don't use it, unless you are prepared to loose your
43# money. It is for heuristic validation purposes only.
44
45__all__ = ['IBAN']
46
47def modulo_97_base10(buffer):
48 '''
49 Calculate the modulo 97 value of a string in base10
50 '''
51 checksum = int(buffer[0])
52 for digit in buffer[1:]:
53 checksum *= 10;
54 checksum += int(digit)
55 checksum %= 97
56 return checksum
57
58def base36_to_base10str(buffer):
59 '''
60 Convert a base36 string value to a string of base10 digits.
61 '''
62 result = ''
63 for digit in buffer:
64 if digit.isalpha():
65 result += str(ord(digit) - 55)
66 else:
67 result += digit
68 return result
69
70class BBANFormat(object):
71 '''
72 A BBANFormat is an auxilliary class for IBAN. It represents the composition
73 of a BBAN number from the different elements in order to translate a
74 IBAN number to a localized number. The reverse route, transforming a local
75 account to a SEPA account, is the sole responsibility of the banks.
76 '''
77
78 def __init__(self, ibanfmt, bbanfmt='%A', nolz=False):
79 '''
80 Specify the structure of the SEPA account in relation to the local
81 account. The XXZZ prefix that all SEPA accounts have is not part of
82 the structure in BBANFormat.
83
84 ibanfmt: string of identifiers from position 5 (start = 1):
85 A = Account position
86 N = Account digit
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches

to all changes: