Merge lp:~camptocamp/banking-addons/bank-statement-reconcile-7.0_voucher_killer_vre into lp:banking-addons
- bank-statement-reconcile-7.0_voucher_killer_vre
- Merge into banking-addons-70
Status: | Superseded | ||||
---|---|---|---|---|---|
Proposed branch: | lp:~camptocamp/banking-addons/bank-statement-reconcile-7.0_voucher_killer_vre | ||||
Merge into: | lp:banking-addons | ||||
Diff against target: |
13731 lines (+12871/-0) 160 files modified
account_advanced_reconcile/__init__.py (+24/-0) account_advanced_reconcile/__openerp__.py (+83/-0) account_advanced_reconcile/advanced_reconciliation.py (+118/-0) account_advanced_reconcile/base_advanced_reconciliation.py (+272/-0) account_advanced_reconcile/easy_reconcile.py (+36/-0) account_advanced_reconcile/easy_reconcile_view.xml (+19/-0) account_advanced_reconcile/i18n/account_advanced_reconcile.pot (+90/-0) account_advanced_reconcile/i18n/fr.po (+98/-0) account_advanced_reconcile_transaction_ref/__init__.py (+24/-0) account_advanced_reconcile_transaction_ref/__openerp__.py (+40/-0) account_advanced_reconcile_transaction_ref/account.py (+54/-0) account_advanced_reconcile_transaction_ref/advanced_reconciliation.py (+43/-0) account_advanced_reconcile_transaction_ref/base_advanced_reconciliation.py (+46/-0) account_advanced_reconcile_transaction_ref/easy_reconcile.py (+37/-0) account_advanced_reconcile_transaction_ref/easy_reconcile_view.xml (+19/-0) account_advanced_reconcile_transaction_ref/i18n/account_advanced_reconcile_transaction_ref.pot (+97/-0) account_advanced_reconcile_transaction_ref/i18n/fr.po (+106/-0) account_easy_reconcile/__init__.py (+25/-0) account_easy_reconcile/__openerp__.py (+66/-0) account_easy_reconcile/base_reconciliation.py (+208/-0) account_easy_reconcile/easy_reconcile.py (+338/-0) account_easy_reconcile/easy_reconcile.xml (+162/-0) account_easy_reconcile/easy_reconcile_history.py (+153/-0) account_easy_reconcile/easy_reconcile_history_view.xml (+98/-0) account_easy_reconcile/i18n/account_easy_reconcile.pot (+406/-0) account_easy_reconcile/i18n/es.po (+415/-0) account_easy_reconcile/i18n/fr.po (+432/-0) account_easy_reconcile/security/ir.model.access.csv (+15/-0) account_easy_reconcile/security/ir_rule.xml (+25/-0) account_easy_reconcile/simple_reconciliation.py (+120/-0) account_statement_bankaccount_completion/__init__.py (+21/-0) account_statement_bankaccount_completion/__openerp__.py (+48/-0) account_statement_bankaccount_completion/data.xml (+12/-0) account_statement_bankaccount_completion/i18n/account_statement_bankaccount_completion.pot (+43/-0) account_statement_bankaccount_completion/statement.py (+96/-0) account_statement_bankaccount_completion/tests/__init__.py (+27/-0) account_statement_bankaccount_completion/tests/test_bankaccount_completion.py (+91/-0) account_statement_base_completion/__init__.py (+23/-0) account_statement_base_completion/__openerp__.py (+77/-0) account_statement_base_completion/data.xml (+31/-0) account_statement_base_completion/i18n/ab.po (+216/-0) account_statement_base_completion/i18n/account_statement_base_completion.pot (+199/-0) account_statement_base_completion/i18n/fr.po (+216/-0) account_statement_base_completion/partner.py (+38/-0) account_statement_base_completion/partner_view.xml (+22/-0) account_statement_base_completion/security/ir.model.access.csv (+3/-0) account_statement_base_completion/statement.py (+576/-0) account_statement_base_completion/statement_view.xml (+104/-0) account_statement_base_completion/test/completion_test.yml (+87/-0) account_statement_base_completion/test/invoice.yml (+32/-0) account_statement_base_completion/test/partner.yml (+5/-0) account_statement_base_completion/test/supplier_invoice.yml (+31/-0) account_statement_base_completion/tests/__init__.py (+27/-0) account_statement_base_completion/tests/test_base_completion.py (+95/-0) account_statement_base_import/__init__.py (+23/-0) account_statement_base_import/__openerp__.py (+69/-0) account_statement_base_import/data/statement.csv (+4/-0) account_statement_base_import/i18n/account_statement_base_import.pot (+289/-0) account_statement_base_import/i18n/es.po (+305/-0) account_statement_base_import/i18n/fr.po (+303/-0) account_statement_base_import/parser/__init__.py (+25/-0) account_statement_base_import/parser/file_parser.py (+221/-0) account_statement_base_import/parser/generic_file_parser.py (+74/-0) account_statement_base_import/parser/parser.py (+222/-0) account_statement_base_import/statement.py (+241/-0) account_statement_base_import/statement_view.xml (+30/-0) account_statement_base_import/wizard/__init__.py (+20/-0) account_statement_base_import/wizard/import_statement.py (+116/-0) account_statement_base_import/wizard/import_statement_view.xml (+42/-0) account_statement_commission/__init__.py (+22/-0) account_statement_commission/__openerp__.py (+47/-0) account_statement_commission/commission.py (+72/-0) account_statement_commission/i18n/account_statement_commission.pot (+53/-0) account_statement_commission/import_statement_view.xml (+18/-0) account_statement_commission/statement_view.xml (+21/-0) account_statement_completion_voucher/__init__.py (+20/-0) account_statement_completion_voucher/__openerp__.py (+46/-0) account_statement_completion_voucher/statement_view.xml (+21/-0) account_statement_ext/__init__.py (+25/-0) account_statement_ext/__openerp__.py (+89/-0) account_statement_ext/account.py (+41/-0) account_statement_ext/account_view.xml (+17/-0) account_statement_ext/i18n/fr.po (+301/-0) account_statement_ext/report.xml (+25/-0) account_statement_ext/report/__init__.py (+26/-0) account_statement_ext/report/bank_statement_report.mako (+70/-0) account_statement_ext/report/bank_statement_report.py (+71/-0) account_statement_ext/report/bank_statement_webkit_header.xml (+180/-0) account_statement_ext/security/ir.model.access.csv (+3/-0) account_statement_ext/security/ir_rule.xml (+10/-0) account_statement_ext/statement.py (+745/-0) account_statement_ext/statement_view.xml (+160/-0) account_statement_ext/test/test_profile_related_fields.yml (+78/-0) account_statement_ext/voucher.py (+49/-0) account_statement_ext_point_of_sale/__init__.py (+22/-0) account_statement_ext_point_of_sale/__openerp__.py (+43/-0) account_statement_ext_point_of_sale/point_of_sale.py (+123/-0) account_statement_ext_voucher/__init__.py (+20/-0) account_statement_ext_voucher/__openerp__.py (+52/-0) account_statement_ext_voucher/statement_voucher.py (+51/-0) account_statement_no_invoice_import/__init__.py (+22/-0) account_statement_no_invoice_import/__openerp__.py (+40/-0) account_statement_no_invoice_import/statement_view.xml (+21/-0) account_statement_ofx_import/__init__.py (+22/-0) account_statement_ofx_import/__openerp__.py (+49/-0) account_statement_ofx_import/i18n/account_statement_ofx_import.pot (+34/-0) account_statement_ofx_import/parser/__init__.py (+22/-0) account_statement_ofx_import/parser/ofx_parser.py (+118/-0) account_statement_ofx_import/statement.py (+35/-0) account_statement_one_move/__init__.py (+23/-0) account_statement_one_move/__openerp__.py (+45/-0) account_statement_one_move/statement.py (+225/-0) account_statement_one_move/statement_view.xml (+26/-0) account_statement_regex_account_completion/__init__.py (+32/-0) account_statement_regex_account_completion/__openerp__.py (+56/-0) account_statement_regex_account_completion/i18n/account_statement_regex_account_completion.pot (+32/-0) account_statement_regex_account_completion/i18n/fr.po (+32/-0) account_statement_regex_account_completion/statement.py (+75/-0) account_statement_regex_account_completion/statement_view.xml (+21/-0) account_statement_regex_account_completion/tests/__init__.py (+36/-0) account_statement_regex_account_completion/tests/test_regex_account_completion.py (+91/-0) account_statement_so_completion/__init__.py (+25/-0) account_statement_so_completion/__openerp__.py (+52/-0) account_statement_so_completion/data.xml (+12/-0) account_statement_so_completion/i18n/account_statement_so_completion.pot (+28/-0) account_statement_so_completion/statement.py (+94/-0) account_statement_so_completion/test/completion_so_test.yml (+44/-0) account_statement_transactionid_completion/__init__.py (+22/-0) account_statement_transactionid_completion/__openerp__.py (+59/-0) account_statement_transactionid_completion/data.xml (+12/-0) account_statement_transactionid_completion/i18n/account_statement_transactionid_completion.pot (+43/-0) account_statement_transactionid_completion/statement.py (+94/-0) account_statement_transactionid_completion/statement_view.xml (+22/-0) account_statement_transactionid_completion/test/completion_transactionid_test.yml (+44/-0) account_statement_transactionid_completion/test/sale.yml (+11/-0) account_statement_transactionid_import/__init__.py (+22/-0) account_statement_transactionid_import/__openerp__.py (+60/-0) account_statement_transactionid_import/data/statement.csv (+4/-0) account_statement_transactionid_import/i18n/account_statement_transactionid_import.pot (+21/-0) account_statement_transactionid_import/parser/__init__.py (+22/-0) account_statement_transactionid_import/parser/transactionid_file_parser.py (+80/-0) account_statement_transactionid_import/statement.py (+47/-0) base_transaction_id/__init__.py (+24/-0) base_transaction_id/__openerp__.py (+57/-0) base_transaction_id/i18n/base_transaction_id.pot (+58/-0) base_transaction_id/invoice.py (+36/-0) base_transaction_id/invoice_view.xml (+30/-0) base_transaction_id/sale.py (+43/-0) base_transaction_id/sale_view.xml (+21/-0) base_transaction_id/stock.py (+42/-0) invoicing_voucher_killer/__init__.py (+20/-0) invoicing_voucher_killer/__openerp__.py (+39/-0) invoicing_voucher_killer/i18n/invoicing_voucher_killer.pot (+32/-0) invoicing_voucher_killer/invoice_data.xml (+7/-0) invoicing_voucher_killer/invoice_view.xml (+48/-0) statement_voucher_killer/__init__.py (+21/-0) statement_voucher_killer/__openerp__.py (+48/-0) statement_voucher_killer/i18n/statement_voucher_killer.pot (+27/-0) statement_voucher_killer/statement_view.xml (+20/-0) statement_voucher_killer/voucher.py (+129/-0) |
||||
To merge this branch: | bzr merge lp:~camptocamp/banking-addons/bank-statement-reconcile-7.0_voucher_killer_vre | ||||
Related bugs: |
|
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Pedro Manuel Baeza | Needs Fixing | ||
Review via email: mp+213973@code.launchpad.net |
This proposal has been superseded by a proposal from 2014-04-03.
Commit message
Description of the change
It take the date of the payment line to set the bank statement line instead of maturity date of the payment line
See bug report
Unmerged revisions
- 142. By Vincent Renaville@camptocamp
-
[FIX] pep8
- 141. By Vincent Renaville@camptocamp
-
[FIx] set correct date when import payment line into payment order: see bug #1301781
- 140. By Launchpad Translations on behalf of banking-addons-team
-
Launchpad automatic translations update.
- 139. By Joël Grand-Guillaume @ camptocamp
-
[IMP] Add buttons to open unreconciled and partially reconciled items from a profile to easy the verification and controlling
[IMP] Add the number of lines in completion log to let the user know if some hasn't been auto-completed (e.g. 332/335 line compelted)
[IMP] Add a group by bank statement in journal items search view to ease the reconciliation - 138. By Leonardo Pistone
-
[fix] account_
statement_ base_import: add all missing default values to the statement line.
This has to be done manually because the module uses sql trickery - 137. By Launchpad Translations on behalf of banking-addons-team
-
Launchpad automatic translations update.
- 136. By Pedro Manuel Baeza
-
[IMP] Translation template files.
- 135. By Launchpad Translations on behalf of banking-addons-team
-
Launchpad automatic translations update.
- 134. By Leonardo Pistone
-
[fix] account_
statement_ ext: trigger related fields - 133. By Alexandre Fayolle - camptocamp
-
fix issue when creating empty statement (lp:1247876) and add a module which enables bank statement creation from the point of sale with the banking framework installed.
Preview Diff
1 | === added directory 'account_advanced_reconcile' |
2 | === added file 'account_advanced_reconcile/__init__.py' |
3 | --- account_advanced_reconcile/__init__.py 1970-01-01 00:00:00 +0000 |
4 | +++ account_advanced_reconcile/__init__.py 2014-04-03 07:40:14 +0000 |
5 | @@ -0,0 +1,24 @@ |
6 | +# -*- coding: utf-8 -*- |
7 | +############################################################################## |
8 | +# |
9 | +# Author: Guewen Baconnier |
10 | +# Copyright 2012 Camptocamp SA |
11 | +# |
12 | +# This program is free software: you can redistribute it and/or modify |
13 | +# it under the terms of the GNU Affero General Public License as |
14 | +# published by the Free Software Foundation, either version 3 of the |
15 | +# License, or (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 Affero General Public License for more details. |
21 | +# |
22 | +# You should have received a copy of the GNU Affero General Public License |
23 | +# along with this program. If not, see <http://www.gnu.org/licenses/>. |
24 | +# |
25 | +############################################################################## |
26 | + |
27 | +import easy_reconcile |
28 | +import base_advanced_reconciliation |
29 | +import advanced_reconciliation |
30 | |
31 | === added file 'account_advanced_reconcile/__openerp__.py' |
32 | --- account_advanced_reconcile/__openerp__.py 1970-01-01 00:00:00 +0000 |
33 | +++ account_advanced_reconcile/__openerp__.py 2014-04-03 07:40:14 +0000 |
34 | @@ -0,0 +1,83 @@ |
35 | +# -*- coding: utf-8 -*- |
36 | +############################################################################## |
37 | +# |
38 | +# Author: Guewen Baconnier |
39 | +# Copyright 2012 Camptocamp SA |
40 | +# |
41 | +# This program is free software: you can redistribute it and/or modify |
42 | +# it under the terms of the GNU Affero General Public License as |
43 | +# published by the Free Software Foundation, either version 3 of the |
44 | +# License, or (at your option) any later version. |
45 | +# |
46 | +# This program is distributed in the hope that it will be useful, |
47 | +# but WITHOUT ANY WARRANTY; without even the implied warranty of |
48 | +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
49 | +# GNU Affero General Public License for more details. |
50 | +# |
51 | +# You should have received a copy of the GNU Affero General Public License |
52 | +# along with this program. If not, see <http://www.gnu.org/licenses/>. |
53 | +# |
54 | +############################################################################## |
55 | + |
56 | +{'name': "Advanced Reconcile", |
57 | + 'version': '1.0', |
58 | + 'author': 'Camptocamp', |
59 | + 'maintainer': 'Camptocamp', |
60 | + 'category': 'Finance', |
61 | + 'complexity': 'normal', |
62 | + 'depends': ['account_easy_reconcile', |
63 | + ], |
64 | + 'description': """ |
65 | +Advanced reconciliation methods for the module account_easy_reconcile. |
66 | + |
67 | +In addition to the features implemented in account_easy_reconcile, which are: |
68 | + - reconciliation facilities for big volume of transactions |
69 | + - setup different profiles of reconciliation by account |
70 | + - each profile can use many methods of reconciliation |
71 | + - this module is also a base to create others reconciliation methods |
72 | + which can plug in the profiles |
73 | + - a profile a reconciliation can be run manually or by a cron |
74 | + - monitoring of reconcilation runs with an history |
75 | + |
76 | +It implements a basis to created advanced reconciliation methods in a few lines |
77 | +of code. |
78 | + |
79 | +Typically, such a method can be: |
80 | + - Reconcile Journal items if the partner and the ref are equal |
81 | + - Reconcile Journal items if the partner is equal and the ref |
82 | + is the same than ref or name |
83 | + - Reconcile Journal items if the partner is equal and the ref |
84 | + match with a pattern |
85 | + |
86 | +And they allows: |
87 | + - Reconciliations with multiple credit / multiple debit lines |
88 | + - Partial reconciliations |
89 | + - Write-off amount as well |
90 | + |
91 | +A method is already implemented in this module, it matches on items: |
92 | + - Partner |
93 | + - Ref on credit move lines should be case insensitive equals to the ref or |
94 | + the name of the debit move line |
95 | + |
96 | +The base class to find the reconciliations is built to be as efficient as |
97 | +possible. |
98 | + |
99 | +So basically, if you have an invoice with 3 payments (one per month), the first |
100 | +month, it will partial reconcile the debit move line with the first payment, the second |
101 | +month, it will partial reconcile the debit move line with 2 first payments, |
102 | +the third month, it will make the full reconciliation. |
103 | + |
104 | +This module is perfectly adapted for E-Commerce business where a big volume of |
105 | +move lines and so, reconciliations, are involved and payments often come from |
106 | +many offices. |
107 | + |
108 | + """, |
109 | + 'website': 'http://www.camptocamp.com', |
110 | + 'data': ['easy_reconcile_view.xml'], |
111 | + 'test': [], |
112 | + 'images': [], |
113 | + 'installable': True, |
114 | + 'auto_install': False, |
115 | + 'license': 'AGPL-3', |
116 | + 'application': True, |
117 | +} |
118 | |
119 | === added file 'account_advanced_reconcile/advanced_reconciliation.py' |
120 | --- account_advanced_reconcile/advanced_reconciliation.py 1970-01-01 00:00:00 +0000 |
121 | +++ account_advanced_reconcile/advanced_reconciliation.py 2014-04-03 07:40:14 +0000 |
122 | @@ -0,0 +1,118 @@ |
123 | +# -*- coding: utf-8 -*- |
124 | +############################################################################## |
125 | +# |
126 | +# Author: Guewen Baconnier |
127 | +# Copyright 2012 Camptocamp SA |
128 | +# |
129 | +# This program is free software: you can redistribute it and/or modify |
130 | +# it under the terms of the GNU Affero General Public License as |
131 | +# published by the Free Software Foundation, either version 3 of the |
132 | +# License, or (at your option) any later version. |
133 | +# |
134 | +# This program is distributed in the hope that it will be useful, |
135 | +# but WITHOUT ANY WARRANTY; without even the implied warranty of |
136 | +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
137 | +# GNU Affero General Public License for more details. |
138 | +# |
139 | +# You should have received a copy of the GNU Affero General Public License |
140 | +# along with this program. If not, see <http://www.gnu.org/licenses/>. |
141 | +# |
142 | +############################################################################## |
143 | + |
144 | +from openerp.osv import orm |
145 | + |
146 | + |
147 | +class easy_reconcile_advanced_ref(orm.TransientModel): |
148 | + |
149 | + _name = 'easy.reconcile.advanced.ref' |
150 | + _inherit = 'easy.reconcile.advanced' |
151 | + |
152 | + def _skip_line(self, cr, uid, rec, move_line, context=None): |
153 | + """ |
154 | + When True is returned on some conditions, the credit move line |
155 | + will be skipped for reconciliation. Can be inherited to |
156 | + skip on some conditions. ie: ref or partner_id is empty. |
157 | + """ |
158 | + return not (move_line.get('ref') and move_line.get('partner_id')) |
159 | + |
160 | + def _matchers(self, cr, uid, rec, move_line, context=None): |
161 | + """ |
162 | + Return the values used as matchers to find the opposite lines |
163 | + |
164 | + All the matcher keys in the dict must have their equivalent in |
165 | + the `_opposite_matchers`. |
166 | + |
167 | + The values of each matcher key will be searched in the |
168 | + one returned by the `_opposite_matchers` |
169 | + |
170 | + Must be inherited to implement the matchers for one method |
171 | + |
172 | + For instance, it can return: |
173 | + return ('ref', move_line['rec']) |
174 | + |
175 | + or |
176 | + return (('partner_id', move_line['partner_id']), |
177 | + ('ref', "prefix_%s" % move_line['rec'])) |
178 | + |
179 | + All the matchers have to be found in the opposite lines |
180 | + to consider them as "opposite" |
181 | + |
182 | + The matchers will be evaluated in the same order as declared |
183 | + vs the the opposite matchers, so you can gain performance by |
184 | + declaring first the partners with the less computation. |
185 | + |
186 | + All matchers should match with their opposite to be considered |
187 | + as "matching". |
188 | + So with the previous example, partner_id and ref have to be |
189 | + equals on the opposite line matchers. |
190 | + |
191 | + :return: tuple of tuples (key, value) where the keys are |
192 | + the matchers keys |
193 | + (must be the same than `_opposite_matchers` returns, |
194 | + and their values to match in the opposite lines. |
195 | + A matching key can have multiples values. |
196 | + """ |
197 | + return (('partner_id', move_line['partner_id']), |
198 | + ('ref', move_line['ref'].lower().strip())) |
199 | + |
200 | + def _opposite_matchers(self, cr, uid, rec, move_line, context=None): |
201 | + """ |
202 | + Return the values of the opposite line used as matchers |
203 | + so the line is matched |
204 | + |
205 | + Must be inherited to implement the matchers for one method |
206 | + It can be inherited to apply some formatting of fields |
207 | + (strip(), lower() and so on) |
208 | + |
209 | + This method is the counterpart of the `_matchers()` method. |
210 | + |
211 | + Each matcher has to yield its value respecting the order |
212 | + of the `_matchers()`. |
213 | + |
214 | + When a matcher does not correspond, the next matchers won't |
215 | + be evaluated so the ones which need the less computation |
216 | + have to be executed first. |
217 | + |
218 | + If the `_matchers()` returns: |
219 | + (('partner_id', move_line['partner_id']), |
220 | + ('ref', move_line['ref'])) |
221 | + |
222 | + Here, you should yield : |
223 | + yield ('partner_id', move_line['partner_id']) |
224 | + yield ('ref', move_line['ref']) |
225 | + |
226 | + Note that a matcher can contain multiple values, as instance, |
227 | + if for a move line, you want to search from its `ref` in the |
228 | + `ref` or `name` fields of the opposite move lines, you have to |
229 | + yield ('partner_id', move_line['partner_id']) |
230 | + yield ('ref', (move_line['ref'], move_line['name']) |
231 | + |
232 | + An OR is used between the values for the same key. |
233 | + An AND is used between the differents keys. |
234 | + |
235 | + :param dict move_line: values of the move_line |
236 | + :yield: matchers as tuple ('matcher key', value(s)) |
237 | + """ |
238 | + yield ('partner_id', move_line['partner_id']) |
239 | + yield ('ref', ((move_line['ref'] or '').lower().strip(), |
240 | + move_line['name'].lower().strip())) |
241 | |
242 | === added file 'account_advanced_reconcile/base_advanced_reconciliation.py' |
243 | --- account_advanced_reconcile/base_advanced_reconciliation.py 1970-01-01 00:00:00 +0000 |
244 | +++ account_advanced_reconcile/base_advanced_reconciliation.py 2014-04-03 07:40:14 +0000 |
245 | @@ -0,0 +1,272 @@ |
246 | +# -*- coding: utf-8 -*- |
247 | +############################################################################## |
248 | +# |
249 | +# Author: Guewen Baconnier |
250 | +# Copyright 2012 Camptocamp SA |
251 | +# |
252 | +# This program is free software: you can redistribute it and/or modify |
253 | +# it under the terms of the GNU Affero General Public License as |
254 | +# published by the Free Software Foundation, either version 3 of the |
255 | +# License, or (at your option) any later version. |
256 | +# |
257 | +# This program is distributed in the hope that it will be useful, |
258 | +# but WITHOUT ANY WARRANTY; without even the implied warranty of |
259 | +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
260 | +# GNU Affero General Public License for more details. |
261 | +# |
262 | +# You should have received a copy of the GNU Affero General Public License |
263 | +# along with this program. If not, see <http://www.gnu.org/licenses/>. |
264 | +# |
265 | +############################################################################## |
266 | + |
267 | +from itertools import product |
268 | +from openerp.osv import orm |
269 | + |
270 | + |
271 | +class easy_reconcile_advanced(orm.AbstractModel): |
272 | + |
273 | + _name = 'easy.reconcile.advanced' |
274 | + _inherit = 'easy.reconcile.base' |
275 | + |
276 | + def _query_debit(self, cr, uid, rec, context=None): |
277 | + """Select all move (debit>0) as candidate. """ |
278 | + select = self._select(rec) |
279 | + sql_from = self._from(rec) |
280 | + where, params = self._where(rec) |
281 | + where += " AND account_move_line.debit > 0 " |
282 | + |
283 | + where2, params2 = self._get_filter(cr, uid, rec, context=context) |
284 | + |
285 | + query = ' '.join((select, sql_from, where, where2)) |
286 | + |
287 | + cr.execute(query, params + params2) |
288 | + return cr.dictfetchall() |
289 | + |
290 | + def _query_credit(self, cr, uid, rec, context=None): |
291 | + """Select all move (credit>0) as candidate. """ |
292 | + select = self._select(rec) |
293 | + sql_from = self._from(rec) |
294 | + where, params = self._where(rec) |
295 | + where += " AND account_move_line.credit > 0 " |
296 | + |
297 | + where2, params2 = self._get_filter(cr, uid, rec, context=context) |
298 | + |
299 | + query = ' '.join((select, sql_from, where, where2)) |
300 | + |
301 | + cr.execute(query, params + params2) |
302 | + return cr.dictfetchall() |
303 | + |
304 | + def _matchers(self, cr, uid, rec, move_line, context=None): |
305 | + """ |
306 | + Return the values used as matchers to find the opposite lines |
307 | + |
308 | + All the matcher keys in the dict must have their equivalent in |
309 | + the `_opposite_matchers`. |
310 | + |
311 | + The values of each matcher key will be searched in the |
312 | + one returned by the `_opposite_matchers` |
313 | + |
314 | + Must be inherited to implement the matchers for one method |
315 | + |
316 | + As instance, it can return: |
317 | + return ('ref', move_line['rec']) |
318 | + |
319 | + or |
320 | + return (('partner_id', move_line['partner_id']), |
321 | + ('ref', "prefix_%s" % move_line['rec'])) |
322 | + |
323 | + All the matchers have to be found in the opposite lines |
324 | + to consider them as "opposite" |
325 | + |
326 | + The matchers will be evaluated in the same order as declared |
327 | + vs the the opposite matchers, so you can gain performance by |
328 | + declaring first the partners with the less computation. |
329 | + |
330 | + All matchers should match with their opposite to be considered |
331 | + as "matching". |
332 | + So with the previous example, partner_id and ref have to be |
333 | + equals on the opposite line matchers. |
334 | + |
335 | + :return: tuple of tuples (key, value) where the keys are |
336 | + the matchers keys |
337 | + (must be the same than `_opposite_matchers` returns, |
338 | + and their values to match in the opposite lines. |
339 | + A matching key can have multiples values. |
340 | + """ |
341 | + raise NotImplementedError |
342 | + |
343 | + def _opposite_matchers(self, cr, uid, rec, move_line, context=None): |
344 | + """ |
345 | + Return the values of the opposite line used as matchers |
346 | + so the line is matched |
347 | + |
348 | + Must be inherited to implement the matchers for one method |
349 | + It can be inherited to apply some formatting of fields |
350 | + (strip(), lower() and so on) |
351 | + |
352 | + This method is the counterpart of the `_matchers()` method. |
353 | + |
354 | + Each matcher has to yield its value respecting the order |
355 | + of the `_matchers()`. |
356 | + |
357 | + When a matcher does not correspond, the next matchers won't |
358 | + be evaluated so the ones which need the less computation |
359 | + have to be executed first. |
360 | + |
361 | + If the `_matchers()` returns: |
362 | + (('partner_id', move_line['partner_id']), |
363 | + ('ref', move_line['ref'])) |
364 | + |
365 | + Here, you should yield : |
366 | + yield ('partner_id', move_line['partner_id']) |
367 | + yield ('ref', move_line['ref']) |
368 | + |
369 | + Note that a matcher can contain multiple values, as instance, |
370 | + if for a move line, you want to search from its `ref` in the |
371 | + `ref` or `name` fields of the opposite move lines, you have to |
372 | + yield ('partner_id', move_line['partner_id']) |
373 | + yield ('ref', (move_line['ref'], move_line['name']) |
374 | + |
375 | + An OR is used between the values for the same key. |
376 | + An AND is used between the differents keys. |
377 | + |
378 | + :param dict move_line: values of the move_line |
379 | + :yield: matchers as tuple ('matcher key', value(s)) |
380 | + """ |
381 | + raise NotImplementedError |
382 | + |
383 | + @staticmethod |
384 | + def _compare_values(key, value, opposite_value): |
385 | + """Can be inherited to modify the equality condition |
386 | + specifically according to the matcher key (maybe using |
387 | + a like operator instead of equality on 'ref' as instance) |
388 | + """ |
389 | + # consider that empty vals are not valid matchers |
390 | + # it can still be inherited for some special cases |
391 | + # where it would be allowed |
392 | + if not (value and opposite_value): |
393 | + return False |
394 | + |
395 | + if value == opposite_value: |
396 | + return True |
397 | + return False |
398 | + |
399 | + @staticmethod |
400 | + def _compare_matcher_values(key, values, opposite_values): |
401 | + """ Compare every values from a matcher vs an opposite matcher |
402 | + and return True if it matches |
403 | + """ |
404 | + for value, ovalue in product(values, opposite_values): |
405 | + # we do not need to compare all values, if one matches |
406 | + # we are done |
407 | + if easy_reconcile_advanced._compare_values(key, value, ovalue): |
408 | + return True |
409 | + return False |
410 | + |
411 | + @staticmethod |
412 | + def _compare_matchers(matcher, opposite_matcher): |
413 | + """ |
414 | + Prepare and check the matchers to compare |
415 | + """ |
416 | + mkey, mvalue = matcher |
417 | + omkey, omvalue = opposite_matcher |
418 | + assert mkey == omkey, ("A matcher %s is compared with a matcher %s, " |
419 | + " the _matchers and _opposite_matchers are probably wrong" % |
420 | + (mkey, omkey)) |
421 | + if not isinstance(mvalue, (list, tuple)): |
422 | + mvalue = mvalue, |
423 | + if not isinstance(omvalue, (list, tuple)): |
424 | + omvalue = omvalue, |
425 | + return easy_reconcile_advanced._compare_matcher_values(mkey, mvalue, omvalue) |
426 | + |
427 | + def _compare_opposite(self, cr, uid, rec, move_line, opposite_move_line, |
428 | + matchers, context=None): |
429 | + """ Iterate over the matchers of the move lines vs opposite move lines |
430 | + and if they all match, return True. |
431 | + |
432 | + If all the matchers match for a move line and an opposite move line, |
433 | + they are candidate for a reconciliation. |
434 | + """ |
435 | + opp_matchers = self._opposite_matchers(cr, uid, rec, opposite_move_line, |
436 | + context=context) |
437 | + for matcher in matchers: |
438 | + try: |
439 | + opp_matcher = opp_matchers.next() |
440 | + except StopIteration: |
441 | + # if you fall here, you probably missed to put a `yield` |
442 | + # in `_opposite_matchers()` |
443 | + raise ValueError("Missing _opposite_matcher: %s" % matcher[0]) |
444 | + |
445 | + if not self._compare_matchers(matcher, opp_matcher): |
446 | + # if any of the matcher fails, the opposite line |
447 | + # is not a valid counterpart |
448 | + # directly returns so the next yield of _opposite_matchers |
449 | + # are not evaluated |
450 | + return False |
451 | + |
452 | + return True |
453 | + |
454 | + def _search_opposites(self, cr, uid, rec, move_line, opposite_move_lines, context=None): |
455 | + """ |
456 | + Search the opposite move lines for a move line |
457 | + |
458 | + :param dict move_line: the move line for which we search opposites |
459 | + :param list opposite_move_lines: list of dict of move lines values, the move |
460 | + lines we want to search for |
461 | + :return: list of matching lines |
462 | + """ |
463 | + matchers = self._matchers(cr, uid, rec, move_line, context=context) |
464 | + return [op for op in opposite_move_lines if |
465 | + self._compare_opposite( |
466 | + cr, uid, rec, move_line, op, matchers, context=context)] |
467 | + |
468 | + def _action_rec(self, cr, uid, rec, context=None): |
469 | + credit_lines = self._query_credit(cr, uid, rec, context=context) |
470 | + debit_lines = self._query_debit(cr, uid, rec, context=context) |
471 | + return self._rec_auto_lines_advanced( |
472 | + cr, uid, rec, credit_lines, debit_lines, context=context) |
473 | + |
474 | + def _skip_line(self, cr, uid, rec, move_line, context=None): |
475 | + """ |
476 | + When True is returned on some conditions, the credit move line |
477 | + will be skipped for reconciliation. Can be inherited to |
478 | + skip on some conditions. ie: ref or partner_id is empty. |
479 | + """ |
480 | + return False |
481 | + |
482 | + def _rec_auto_lines_advanced(self, cr, uid, rec, credit_lines, debit_lines, context=None): |
483 | + """ Advanced reconciliation main loop """ |
484 | + reconciled_ids = [] |
485 | + partial_reconciled_ids = [] |
486 | + reconcile_groups = [] |
487 | + |
488 | + for credit_line in credit_lines: |
489 | + if self._skip_line(cr, uid, rec, credit_line, context=context): |
490 | + continue |
491 | + |
492 | + opposite_lines = self._search_opposites( |
493 | + cr, uid, rec, credit_line, debit_lines, context=context) |
494 | + |
495 | + if not opposite_lines: |
496 | + continue |
497 | + |
498 | + opposite_ids = [l['id'] for l in opposite_lines] |
499 | + line_ids = opposite_ids + [credit_line['id']] |
500 | + for group in reconcile_groups: |
501 | + if any([lid in group for lid in opposite_ids]): |
502 | + group.update(line_ids) |
503 | + break |
504 | + else: |
505 | + reconcile_groups.append(set(line_ids)) |
506 | + |
507 | + lines_by_id = dict([(l['id'], l) for l in credit_lines + debit_lines]) |
508 | + for reconcile_group_ids in reconcile_groups: |
509 | + group_lines = [lines_by_id[lid] for lid in reconcile_group_ids] |
510 | + reconciled, full = self._reconcile_lines( |
511 | + cr, uid, rec, group_lines, allow_partial=True, context=context) |
512 | + if reconciled and full: |
513 | + reconciled_ids += reconcile_group_ids |
514 | + elif reconciled: |
515 | + partial_reconciled_ids += reconcile_group_ids |
516 | + |
517 | + return reconciled_ids, partial_reconciled_ids |
518 | |
519 | === added file 'account_advanced_reconcile/easy_reconcile.py' |
520 | --- account_advanced_reconcile/easy_reconcile.py 1970-01-01 00:00:00 +0000 |
521 | +++ account_advanced_reconcile/easy_reconcile.py 2014-04-03 07:40:14 +0000 |
522 | @@ -0,0 +1,36 @@ |
523 | +# -*- coding: utf-8 -*- |
524 | +############################################################################## |
525 | +# |
526 | +# Author: Guewen Baconnier |
527 | +# Copyright 2012 Camptocamp SA |
528 | +# |
529 | +# This program is free software: you can redistribute it and/or modify |
530 | +# it under the terms of the GNU Affero General Public License as |
531 | +# published by the Free Software Foundation, either version 3 of the |
532 | +# License, or (at your option) any later version. |
533 | +# |
534 | +# This program is distributed in the hope that it will be useful, |
535 | +# but WITHOUT ANY WARRANTY; without even the implied warranty of |
536 | +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
537 | +# GNU Affero General Public License for more details. |
538 | +# |
539 | +# You should have received a copy of the GNU Affero General Public License |
540 | +# along with this program. If not, see <http://www.gnu.org/licenses/>. |
541 | +# |
542 | +############################################################################## |
543 | + |
544 | +from openerp.osv import orm |
545 | + |
546 | + |
547 | +class account_easy_reconcile_method(orm.Model): |
548 | + |
549 | + _inherit = 'account.easy.reconcile.method' |
550 | + |
551 | + def _get_all_rec_method(self, cr, uid, context=None): |
552 | + methods = super(account_easy_reconcile_method, self).\ |
553 | + _get_all_rec_method(cr, uid, context=context) |
554 | + methods += [ |
555 | + ('easy.reconcile.advanced.ref', |
556 | + 'Advanced. Partner and Ref.'), |
557 | + ] |
558 | + return methods |
559 | |
560 | === added file 'account_advanced_reconcile/easy_reconcile_view.xml' |
561 | --- account_advanced_reconcile/easy_reconcile_view.xml 1970-01-01 00:00:00 +0000 |
562 | +++ account_advanced_reconcile/easy_reconcile_view.xml 2014-04-03 07:40:14 +0000 |
563 | @@ -0,0 +1,19 @@ |
564 | +<?xml version="1.0" encoding="utf-8"?> |
565 | +<openerp> |
566 | + <data noupdate="0"> |
567 | + <record id="view_easy_reconcile_form" model="ir.ui.view"> |
568 | + <field name="name">account.easy.reconcile.form</field> |
569 | + <field name="model">account.easy.reconcile</field> |
570 | + <field name="inherit_id" ref="account_easy_reconcile.account_easy_reconcile_form"/> |
571 | + <field name="arch" type="xml"> |
572 | + <page name="information" position="inside"> |
573 | + <group colspan="2" col="2"> |
574 | + <separator colspan="4" string="Advanced. Partner and Ref"/> |
575 | + <label string="Match multiple debit vs multiple credit entries. Allow partial reconciliation. |
576 | +The lines should have the partner, the credit entry ref. is matched vs the debit entry ref. or name." colspan="4"/> |
577 | + </group> |
578 | + </page> |
579 | + </field> |
580 | + </record> |
581 | + </data> |
582 | +</openerp> |
583 | |
584 | === added directory 'account_advanced_reconcile/i18n' |
585 | === added file 'account_advanced_reconcile/i18n/account_advanced_reconcile.pot' |
586 | --- account_advanced_reconcile/i18n/account_advanced_reconcile.pot 1970-01-01 00:00:00 +0000 |
587 | +++ account_advanced_reconcile/i18n/account_advanced_reconcile.pot 2014-04-03 07:40:14 +0000 |
588 | @@ -0,0 +1,90 @@ |
589 | +# Translation of OpenERP Server. |
590 | +# This file contains the translation of the following modules: |
591 | +# * account_advanced_reconcile |
592 | +# |
593 | +msgid "" |
594 | +msgstr "" |
595 | +"Project-Id-Version: OpenERP Server 7.0\n" |
596 | +"Report-Msgid-Bugs-To: \n" |
597 | +"POT-Creation-Date: 2014-01-21 11:54+0000\n" |
598 | +"PO-Revision-Date: 2014-01-21 11:54+0000\n" |
599 | +"Last-Translator: <>\n" |
600 | +"Language-Team: \n" |
601 | +"MIME-Version: 1.0\n" |
602 | +"Content-Type: text/plain; charset=UTF-8\n" |
603 | +"Content-Transfer-Encoding: \n" |
604 | +"Plural-Forms: \n" |
605 | + |
606 | +#. module: account_advanced_reconcile |
607 | +#: field:easy.reconcile.advanced,partner_ids:0 |
608 | +#: field:easy.reconcile.advanced.ref,partner_ids:0 |
609 | +msgid "Restrict on partners" |
610 | +msgstr "" |
611 | + |
612 | +#. module: account_advanced_reconcile |
613 | +#: field:easy.reconcile.advanced,account_id:0 |
614 | +#: field:easy.reconcile.advanced.ref,account_id:0 |
615 | +msgid "Account" |
616 | +msgstr "" |
617 | + |
618 | +#. module: account_advanced_reconcile |
619 | +#: model:ir.model,name:account_advanced_reconcile.model_account_easy_reconcile_method |
620 | +msgid "reconcile method for account_easy_reconcile" |
621 | +msgstr "" |
622 | + |
623 | +#. module: account_advanced_reconcile |
624 | +#: field:easy.reconcile.advanced,journal_id:0 |
625 | +#: field:easy.reconcile.advanced.ref,journal_id:0 |
626 | +msgid "Journal" |
627 | +msgstr "" |
628 | + |
629 | +#. module: account_advanced_reconcile |
630 | +#: field:easy.reconcile.advanced,account_profit_id:0 |
631 | +#: field:easy.reconcile.advanced.ref,account_profit_id:0 |
632 | +msgid "Account Profit" |
633 | +msgstr "" |
634 | + |
635 | +#. module: account_advanced_reconcile |
636 | +#: view:account.easy.reconcile:0 |
637 | +msgid "Match multiple debit vs multiple credit entries. Allow partial reconciliation. The lines should have the partner, the credit entry ref. is matched vs the debit entry ref. or name." |
638 | +msgstr "" |
639 | + |
640 | +#. module: account_advanced_reconcile |
641 | +#: field:easy.reconcile.advanced,filter:0 |
642 | +#: field:easy.reconcile.advanced.ref,filter:0 |
643 | +msgid "Filter" |
644 | +msgstr "" |
645 | + |
646 | +#. module: account_advanced_reconcile |
647 | +#: view:account.easy.reconcile:0 |
648 | +msgid "Advanced. Partner and Ref" |
649 | +msgstr "" |
650 | + |
651 | +#. module: account_advanced_reconcile |
652 | +#: field:easy.reconcile.advanced,date_base_on:0 |
653 | +#: field:easy.reconcile.advanced.ref,date_base_on:0 |
654 | +msgid "Date of reconciliation" |
655 | +msgstr "" |
656 | + |
657 | +#. module: account_advanced_reconcile |
658 | +#: model:ir.model,name:account_advanced_reconcile.model_easy_reconcile_advanced |
659 | +msgid "easy.reconcile.advanced" |
660 | +msgstr "" |
661 | + |
662 | +#. module: account_advanced_reconcile |
663 | +#: field:easy.reconcile.advanced,account_lost_id:0 |
664 | +#: field:easy.reconcile.advanced.ref,account_lost_id:0 |
665 | +msgid "Account Lost" |
666 | +msgstr "" |
667 | + |
668 | +#. module: account_advanced_reconcile |
669 | +#: model:ir.model,name:account_advanced_reconcile.model_easy_reconcile_advanced_ref |
670 | +msgid "easy.reconcile.advanced.ref" |
671 | +msgstr "" |
672 | + |
673 | +#. module: account_advanced_reconcile |
674 | +#: field:easy.reconcile.advanced,write_off:0 |
675 | +#: field:easy.reconcile.advanced.ref,write_off:0 |
676 | +msgid "Write off allowed" |
677 | +msgstr "" |
678 | + |
679 | |
680 | === added file 'account_advanced_reconcile/i18n/fr.po' |
681 | --- account_advanced_reconcile/i18n/fr.po 1970-01-01 00:00:00 +0000 |
682 | +++ account_advanced_reconcile/i18n/fr.po 2014-04-03 07:40:14 +0000 |
683 | @@ -0,0 +1,98 @@ |
684 | +# Translation of OpenERP Server. |
685 | +# This file contains the translation of the following modules: |
686 | +# * account_advanced_reconcile |
687 | +# |
688 | +msgid "" |
689 | +msgstr "" |
690 | +"Project-Id-Version: OpenERP Server 6.1\n" |
691 | +"Report-Msgid-Bugs-To: \n" |
692 | +"POT-Creation-Date: 2014-01-21 11:54+0000\n" |
693 | +"PO-Revision-Date: 2014-03-21 15:24+0000\n" |
694 | +"Last-Translator: Guewen Baconnier @ Camptocamp <Unknown>\n" |
695 | +"Language-Team: \n" |
696 | +"MIME-Version: 1.0\n" |
697 | +"Content-Type: text/plain; charset=UTF-8\n" |
698 | +"Content-Transfer-Encoding: 8bit\n" |
699 | +"X-Launchpad-Export-Date: 2014-03-22 07:11+0000\n" |
700 | +"X-Generator: Launchpad (build 16967)\n" |
701 | +"Language: \n" |
702 | + |
703 | +#. module: account_advanced_reconcile |
704 | +#: field:easy.reconcile.advanced,partner_ids:0 |
705 | +#: field:easy.reconcile.advanced.ref,partner_ids:0 |
706 | +msgid "Restrict on partners" |
707 | +msgstr "Restriction sur les partenaires" |
708 | + |
709 | +#. module: account_advanced_reconcile |
710 | +#: field:easy.reconcile.advanced,account_id:0 |
711 | +#: field:easy.reconcile.advanced.ref,account_id:0 |
712 | +msgid "Account" |
713 | +msgstr "Compte" |
714 | + |
715 | +#. module: account_advanced_reconcile |
716 | +#: model:ir.model,name:account_advanced_reconcile.model_account_easy_reconcile_method |
717 | +msgid "reconcile method for account_easy_reconcile" |
718 | +msgstr "Méthode de lettrage pour le module account_easy_reconcile" |
719 | + |
720 | +#. module: account_advanced_reconcile |
721 | +#: field:easy.reconcile.advanced,journal_id:0 |
722 | +#: field:easy.reconcile.advanced.ref,journal_id:0 |
723 | +msgid "Journal" |
724 | +msgstr "Journal" |
725 | + |
726 | +#. module: account_advanced_reconcile |
727 | +#: field:easy.reconcile.advanced,account_profit_id:0 |
728 | +#: field:easy.reconcile.advanced.ref,account_profit_id:0 |
729 | +msgid "Account Profit" |
730 | +msgstr "Compte de produit" |
731 | + |
732 | +#. module: account_advanced_reconcile |
733 | +#: view:account.easy.reconcile:0 |
734 | +msgid "" |
735 | +"Match multiple debit vs multiple credit entries. Allow partial " |
736 | +"reconciliation. The lines should have the partner, the credit entry ref. is " |
737 | +"matched vs the debit entry ref. or name." |
738 | +msgstr "" |
739 | +"Le Lettrage peut s'effectuer sur plusieurs écritures de débit et crédit. Le " |
740 | +"Lettrage partiel est autorisé. Les écritures doivent avoir le même " |
741 | +"partenaire et la référence sur les écritures de crédit doit se retrouver " |
742 | +"dans la référence ou la description sur les écritures de débit." |
743 | + |
744 | +#. module: account_advanced_reconcile |
745 | +#: field:easy.reconcile.advanced,filter:0 |
746 | +#: field:easy.reconcile.advanced.ref,filter:0 |
747 | +msgid "Filter" |
748 | +msgstr "Filtre" |
749 | + |
750 | +#. module: account_advanced_reconcile |
751 | +#: view:account.easy.reconcile:0 |
752 | +msgid "Advanced. Partner and Ref" |
753 | +msgstr "Avancé. Partenaire et Réf." |
754 | + |
755 | +#. module: account_advanced_reconcile |
756 | +#: field:easy.reconcile.advanced,date_base_on:0 |
757 | +#: field:easy.reconcile.advanced.ref,date_base_on:0 |
758 | +msgid "Date of reconciliation" |
759 | +msgstr "Date de lettrage" |
760 | + |
761 | +#. module: account_advanced_reconcile |
762 | +#: model:ir.model,name:account_advanced_reconcile.model_easy_reconcile_advanced |
763 | +msgid "easy.reconcile.advanced" |
764 | +msgstr "easy.reconcile.advanced" |
765 | + |
766 | +#. module: account_advanced_reconcile |
767 | +#: field:easy.reconcile.advanced,account_lost_id:0 |
768 | +#: field:easy.reconcile.advanced.ref,account_lost_id:0 |
769 | +msgid "Account Lost" |
770 | +msgstr "Compte de charge" |
771 | + |
772 | +#. module: account_advanced_reconcile |
773 | +#: model:ir.model,name:account_advanced_reconcile.model_easy_reconcile_advanced_ref |
774 | +msgid "easy.reconcile.advanced.ref" |
775 | +msgstr "easy.reconcile.advanced.ref" |
776 | + |
777 | +#. module: account_advanced_reconcile |
778 | +#: field:easy.reconcile.advanced,write_off:0 |
779 | +#: field:easy.reconcile.advanced.ref,write_off:0 |
780 | +msgid "Write off allowed" |
781 | +msgstr "Écart autorisé" |
782 | |
783 | === added directory 'account_advanced_reconcile_transaction_ref' |
784 | === added file 'account_advanced_reconcile_transaction_ref/__init__.py' |
785 | --- account_advanced_reconcile_transaction_ref/__init__.py 1970-01-01 00:00:00 +0000 |
786 | +++ account_advanced_reconcile_transaction_ref/__init__.py 2014-04-03 07:40:14 +0000 |
787 | @@ -0,0 +1,24 @@ |
788 | +# -*- coding: utf-8 -*- |
789 | +############################################################################## |
790 | +# |
791 | +# Author: Romain Deheele. Copyright Camptocamp SA |
792 | +# |
793 | +# This program is free software: you can redistribute it and/or modify |
794 | +# it under the terms of the GNU Affero General Public License as |
795 | +# published by the Free Software Foundation, either version 3 of the |
796 | +# License, or (at your option) any later version. |
797 | +# |
798 | +# This program is distributed in the hope that it will be useful, |
799 | +# but WITHOUT ANY WARRANTY; without even the implied warranty of |
800 | +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
801 | +# GNU Affero General Public License for more details. |
802 | +# |
803 | +# You should have received a copy of the GNU Affero General Public License |
804 | +# along with this program. If not, see <http://www.gnu.org/licenses/>. |
805 | +# |
806 | +############################################################################## |
807 | + |
808 | +from . import account |
809 | +from . import easy_reconcile |
810 | +from . import base_advanced_reconciliation |
811 | +from . import advanced_reconciliation |
812 | |
813 | === added file 'account_advanced_reconcile_transaction_ref/__openerp__.py' |
814 | --- account_advanced_reconcile_transaction_ref/__openerp__.py 1970-01-01 00:00:00 +0000 |
815 | +++ account_advanced_reconcile_transaction_ref/__openerp__.py 2014-04-03 07:40:14 +0000 |
816 | @@ -0,0 +1,40 @@ |
817 | +# -*- coding: utf-8 -*- |
818 | +############################################################################## |
819 | +# |
820 | +# Author: Romain Deheele. Copyright Camptocamp SA |
821 | +# |
822 | +# This program is free software: you can redistribute it and/or modify |
823 | +# it under the terms of the GNU Affero General Public License as |
824 | +# published by the Free Software Foundation, either version 3 of the |
825 | +# License, or (at your option) any later version. |
826 | +# |
827 | +# This program is distributed in the hope that it will be useful, |
828 | +# but WITHOUT ANY WARRANTY; without even the implied warranty of |
829 | +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
830 | +# GNU Affero General Public License for more details. |
831 | +# |
832 | +# You should have received a copy of the GNU Affero General Public License |
833 | +# along with this program. If not, see <http://www.gnu.org/licenses/>. |
834 | +# |
835 | +############################################################################## |
836 | + |
837 | +{'name': 'Advanced Reconcile Transaction Ref', |
838 | + 'description': """ |
839 | +Advanced reconciliation method for the module account_easy_reconcile |
840 | +================================================= |
841 | +Reconcile rules with transaction_ref |
842 | + |
843 | +""", |
844 | + 'version': '1.0.1', |
845 | + 'author': 'Camptocamp', |
846 | + 'category': 'Finance', |
847 | + 'website': 'http://www.camptocamp.com', |
848 | + 'depends': ['account_advanced_reconcile'], |
849 | + 'data': ['easy_reconcile_view.xml'], |
850 | + 'demo': [], |
851 | + 'test': [], # To be ported or migrate to unit tests or scenarios |
852 | + 'auto_install': False, |
853 | + 'installable': True, |
854 | + 'images': [] |
855 | +} |
856 | +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: |
857 | |
858 | === added file 'account_advanced_reconcile_transaction_ref/account.py' |
859 | --- account_advanced_reconcile_transaction_ref/account.py 1970-01-01 00:00:00 +0000 |
860 | +++ account_advanced_reconcile_transaction_ref/account.py 2014-04-03 07:40:14 +0000 |
861 | @@ -0,0 +1,54 @@ |
862 | +# -*- coding: utf-8 -*- |
863 | +############################################################################## |
864 | +# |
865 | +# Author: Romain Deheele |
866 | +# Copyright 2013 Camptocamp SA |
867 | +# |
868 | +# This program is free software: you can redistribute it and/or modify |
869 | +# it under the terms of the GNU Affero General Public License as |
870 | +# published by the Free Software Foundation, either version 3 of the |
871 | +# License, or (at your option) any later version. |
872 | +# |
873 | +# This program is distributed in the hope that it will be useful, |
874 | +# but WITHOUT ANY WARRANTY; without even the implied warranty of |
875 | +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
876 | +# GNU Affero General Public License for more details. |
877 | +# |
878 | +# You should have received a copy of the GNU Affero General Public License |
879 | +# along with this program. If not, see <http://www.gnu.org/licenses/>. |
880 | +# |
881 | +############################################################################## |
882 | + |
883 | +from openerp.osv.orm import Model, fields |
884 | + |
885 | +class AccountMoveLine(Model): |
886 | + """ |
887 | + Inherit account.move.line class in order to add transaction_ref field |
888 | + """ |
889 | + _inherit = "account.move.line" |
890 | + _columns = { |
891 | + 'transaction_ref': fields.char('Transaction Ref.', size=128), |
892 | + } |
893 | + |
894 | +class AccountBankStatement(Model): |
895 | + """ |
896 | + Inherit account.bank.statement class in order to set transaction_ref info on account.move.line |
897 | + """ |
898 | + _inherit = "account.bank.statement" |
899 | + |
900 | + def _prepare_move_line_vals( |
901 | + self, cr, uid, st_line, move_id, debit, credit, currency_id=False, |
902 | + amount_currency=False, account_id=False, analytic_id=False, |
903 | + partner_id=False, context=None): |
904 | + |
905 | + if context is None: |
906 | + context = {} |
907 | + res = super(AccountBankStatement, self)._prepare_move_line_vals( |
908 | + cr, uid, st_line, move_id, debit, credit, |
909 | + currency_id=currency_id, |
910 | + amount_currency=amount_currency, |
911 | + account_id=account_id, |
912 | + analytic_id=analytic_id, |
913 | + partner_id=partner_id, context=context) |
914 | + res.update({'transaction_ref': st_line.ref}) |
915 | + return res |
916 | |
917 | === added file 'account_advanced_reconcile_transaction_ref/advanced_reconciliation.py' |
918 | --- account_advanced_reconcile_transaction_ref/advanced_reconciliation.py 1970-01-01 00:00:00 +0000 |
919 | +++ account_advanced_reconcile_transaction_ref/advanced_reconciliation.py 2014-04-03 07:40:14 +0000 |
920 | @@ -0,0 +1,43 @@ |
921 | +# -*- coding: utf-8 -*- |
922 | +############################################################################## |
923 | +# |
924 | +# Author: Romain Deheele. Copyright Camptocamp SA |
925 | +# |
926 | +# This program is free software: you can redistribute it and/or modify |
927 | +# it under the terms of the GNU Affero General Public License as |
928 | +# published by the Free Software Foundation, either version 3 of the |
929 | +# License, or (at your option) any later version. |
930 | +# |
931 | +# This program is distributed in the hope that it will be useful, |
932 | +# but WITHOUT ANY WARRANTY; without even the implied warranty of |
933 | +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
934 | +# GNU Affero General Public License for more details. |
935 | +# |
936 | +# You should have received a copy of the GNU Affero General Public License |
937 | +# along with this program. If not, see <http://www.gnu.org/licenses/>. |
938 | +# |
939 | +############################################################################## |
940 | + |
941 | +from openerp.osv import orm |
942 | + |
943 | + |
944 | +class easy_reconcile_advanced_transaction_ref(orm.TransientModel): |
945 | + |
946 | + _name = 'easy.reconcile.advanced.transaction_ref' |
947 | + _inherit = 'easy.reconcile.advanced' |
948 | + |
949 | + def _skip_line(self, cr, uid, rec, move_line, context=None): |
950 | + """ |
951 | + When True is returned on some conditions, the credit move line |
952 | + will be skipped for reconciliation. Can be inherited to |
953 | + skip on some conditions. ie: ref or partner_id is empty. |
954 | + """ |
955 | + return not (move_line.get('ref') and move_line.get('partner_id')) |
956 | + |
957 | + def _matchers(self, cr, uid, rec, move_line, context=None): |
958 | + return (('partner_id', move_line['partner_id']), |
959 | + ('ref', move_line['transaction_ref'].lower().strip())) |
960 | + |
961 | + def _opposite_matchers(self, cr, uid, rec, move_line, context=None): |
962 | + yield ('partner_id', move_line['partner_id']) |
963 | + yield ('ref', (move_line['transaction_ref'] or '').lower().strip()) |
964 | |
965 | === added file 'account_advanced_reconcile_transaction_ref/base_advanced_reconciliation.py' |
966 | --- account_advanced_reconcile_transaction_ref/base_advanced_reconciliation.py 1970-01-01 00:00:00 +0000 |
967 | +++ account_advanced_reconcile_transaction_ref/base_advanced_reconciliation.py 2014-04-03 07:40:14 +0000 |
968 | @@ -0,0 +1,46 @@ |
969 | +# -*- coding: utf-8 -*- |
970 | +############################################################################## |
971 | +# |
972 | +# Author: Romain Deheele |
973 | +# Copyright 2013 Camptocamp SA |
974 | +# |
975 | +# This program is free software: you can redistribute it and/or modify |
976 | +# it under the terms of the GNU Affero General Public License as |
977 | +# published by the Free Software Foundation, either version 3 of the |
978 | +# License, or (at your option) any later version. |
979 | +# |
980 | +# This program is distributed in the hope that it will be useful, |
981 | +# but WITHOUT ANY WARRANTY; without even the implied warranty of |
982 | +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
983 | +# GNU Affero General Public License for more details. |
984 | +# |
985 | +# You should have received a copy of the GNU Affero General Public License |
986 | +# along with this program. If not, see <http://www.gnu.org/licenses/>. |
987 | +# |
988 | +############################################################################## |
989 | + |
990 | +from itertools import product |
991 | +from openerp.osv import orm |
992 | + |
993 | + |
994 | +class easy_reconcile_advanced(orm.AbstractModel): |
995 | + |
996 | + _inherit = 'easy.reconcile.advanced' |
997 | + |
998 | + def _base_columns(self, rec): |
999 | + """ Mandatory columns for move lines queries |
1000 | + An extra column aliased as ``key`` should be defined |
1001 | + in each query.""" |
1002 | + aml_cols = ( |
1003 | + 'id', |
1004 | + 'debit', |
1005 | + 'credit', |
1006 | + 'date', |
1007 | + 'period_id', |
1008 | + 'ref', |
1009 | + 'name', |
1010 | + 'partner_id', |
1011 | + 'account_id', |
1012 | + 'move_id', |
1013 | + 'transaction_ref') |
1014 | + return ["account_move_line.%s" % col for col in aml_cols] |
1015 | |
1016 | === added file 'account_advanced_reconcile_transaction_ref/easy_reconcile.py' |
1017 | --- account_advanced_reconcile_transaction_ref/easy_reconcile.py 1970-01-01 00:00:00 +0000 |
1018 | +++ account_advanced_reconcile_transaction_ref/easy_reconcile.py 2014-04-03 07:40:14 +0000 |
1019 | @@ -0,0 +1,37 @@ |
1020 | +# -*- coding: utf-8 -*- |
1021 | +############################################################################## |
1022 | +# |
1023 | +# Author: Romain Deheele |
1024 | +# Copyright 2013 Camptocamp SA |
1025 | +# |
1026 | +# This program is free software: you can redistribute it and/or modify |
1027 | +# it under the terms of the GNU Affero General Public License as |
1028 | +# published by the Free Software Foundation, either version 3 of the |
1029 | +# License, or (at your option) any later version. |
1030 | +# |
1031 | +# This program is distributed in the hope that it will be useful, |
1032 | +# but WITHOUT ANY WARRANTY; without even the implied warranty of |
1033 | +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
1034 | +# GNU Affero General Public License for more details. |
1035 | +# |
1036 | +# You should have received a copy of the GNU Affero General Public License |
1037 | +# along with this program. If not, see <http://www.gnu.org/licenses/>. |
1038 | +# |
1039 | +############################################################################## |
1040 | + |
1041 | +from openerp.osv import orm |
1042 | + |
1043 | + |
1044 | +class account_easy_reconcile_method(orm.Model): |
1045 | + |
1046 | + _inherit = 'account.easy.reconcile.method' |
1047 | + |
1048 | + def _get_all_rec_method(self, cr, uid, context=None): |
1049 | + methods = super(account_easy_reconcile_method, self).\ |
1050 | + _get_all_rec_method(cr, uid, context=context) |
1051 | + methods += [ |
1052 | + ('easy.reconcile.advanced.transaction_ref', |
1053 | + 'Advanced. Partner and Transaction Ref.'), |
1054 | + ] |
1055 | + return methods |
1056 | + |
1057 | |
1058 | === added file 'account_advanced_reconcile_transaction_ref/easy_reconcile_view.xml' |
1059 | --- account_advanced_reconcile_transaction_ref/easy_reconcile_view.xml 1970-01-01 00:00:00 +0000 |
1060 | +++ account_advanced_reconcile_transaction_ref/easy_reconcile_view.xml 2014-04-03 07:40:14 +0000 |
1061 | @@ -0,0 +1,19 @@ |
1062 | +<?xml version="1.0" encoding="utf-8"?> |
1063 | +<openerp> |
1064 | + <data noupdate="0"> |
1065 | + <record id="view_easy_reconcile_form" model="ir.ui.view"> |
1066 | + <field name="name">account.easy.reconcile.form</field> |
1067 | + <field name="model">account.easy.reconcile</field> |
1068 | + <field name="inherit_id" ref="account_easy_reconcile.account_easy_reconcile_form"/> |
1069 | + <field name="arch" type="xml"> |
1070 | + <page name="information" position="inside"> |
1071 | + <group colspan="2" col="2"> |
1072 | + <separator colspan="4" string="Advanced. Partner and Transaction Ref"/> |
1073 | + <label string="Match multiple debit vs multiple credit entries. Allow partial reconciliation. |
1074 | +The lines should have the partner, the credit entry transaction ref. is matched vs the debit entry transaction ref. or name." colspan="4"/> |
1075 | + </group> |
1076 | + </page> |
1077 | + </field> |
1078 | + </record> |
1079 | + </data> |
1080 | +</openerp> |
1081 | |
1082 | === added directory 'account_advanced_reconcile_transaction_ref/i18n' |
1083 | === added file 'account_advanced_reconcile_transaction_ref/i18n/account_advanced_reconcile_transaction_ref.pot' |
1084 | --- account_advanced_reconcile_transaction_ref/i18n/account_advanced_reconcile_transaction_ref.pot 1970-01-01 00:00:00 +0000 |
1085 | +++ account_advanced_reconcile_transaction_ref/i18n/account_advanced_reconcile_transaction_ref.pot 2014-04-03 07:40:14 +0000 |
1086 | @@ -0,0 +1,97 @@ |
1087 | +# Translation of OpenERP Server. |
1088 | +# This file contains the translation of the following modules: |
1089 | +# * account_advanced_reconcile_transaction_ref |
1090 | +# |
1091 | +msgid "" |
1092 | +msgstr "" |
1093 | +"Project-Id-Version: OpenERP Server 7.0\n" |
1094 | +"Report-Msgid-Bugs-To: \n" |
1095 | +"POT-Creation-Date: 2014-01-21 11:55+0000\n" |
1096 | +"PO-Revision-Date: 2014-01-21 11:55+0000\n" |
1097 | +"Last-Translator: <>\n" |
1098 | +"Language-Team: \n" |
1099 | +"MIME-Version: 1.0\n" |
1100 | +"Content-Type: text/plain; charset=UTF-8\n" |
1101 | +"Content-Transfer-Encoding: \n" |
1102 | +"Plural-Forms: \n" |
1103 | + |
1104 | +#. module: account_advanced_reconcile_transaction_ref |
1105 | +#: field:easy.reconcile.advanced.transaction_ref,partner_ids:0 |
1106 | +msgid "Restrict on partners" |
1107 | +msgstr "" |
1108 | + |
1109 | +#. module: account_advanced_reconcile_transaction_ref |
1110 | +#: field:easy.reconcile.advanced.transaction_ref,account_id:0 |
1111 | +msgid "Account" |
1112 | +msgstr "" |
1113 | + |
1114 | +#. module: account_advanced_reconcile_transaction_ref |
1115 | +#: view:account.easy.reconcile:0 |
1116 | +msgid "Advanced. Partner and Transaction Ref" |
1117 | +msgstr "" |
1118 | + |
1119 | +#. module: account_advanced_reconcile_transaction_ref |
1120 | +#: view:account.easy.reconcile:0 |
1121 | +msgid "Match multiple debit vs multiple credit entries. Allow partial reconciliation. The lines should have the partner, the credit entry transaction ref. is matched vs the debit entry transaction ref. or name." |
1122 | +msgstr "" |
1123 | + |
1124 | +#. module: account_advanced_reconcile_transaction_ref |
1125 | +#: model:ir.model,name:account_advanced_reconcile_transaction_ref.model_easy_reconcile_advanced_transaction_ref |
1126 | +msgid "easy.reconcile.advanced.transaction_ref" |
1127 | +msgstr "" |
1128 | + |
1129 | +#. module: account_advanced_reconcile_transaction_ref |
1130 | +#: field:account.move.line,transaction_ref:0 |
1131 | +msgid "Transaction Ref." |
1132 | +msgstr "" |
1133 | + |
1134 | +#. module: account_advanced_reconcile_transaction_ref |
1135 | +#: field:easy.reconcile.advanced.transaction_ref,journal_id:0 |
1136 | +msgid "Journal" |
1137 | +msgstr "" |
1138 | + |
1139 | +#. module: account_advanced_reconcile_transaction_ref |
1140 | +#: field:easy.reconcile.advanced.transaction_ref,account_profit_id:0 |
1141 | +msgid "Account Profit" |
1142 | +msgstr "" |
1143 | + |
1144 | +#. module: account_advanced_reconcile_transaction_ref |
1145 | +#: model:ir.model,name:account_advanced_reconcile_transaction_ref.model_account_bank_statement |
1146 | +msgid "Bank Statement" |
1147 | +msgstr "" |
1148 | + |
1149 | +#. module: account_advanced_reconcile_transaction_ref |
1150 | +#: field:easy.reconcile.advanced.transaction_ref,filter:0 |
1151 | +msgid "Filter" |
1152 | +msgstr "" |
1153 | + |
1154 | +#. module: account_advanced_reconcile_transaction_ref |
1155 | +#: model:ir.model,name:account_advanced_reconcile_transaction_ref.model_account_easy_reconcile_method |
1156 | +msgid "reconcile method for account_easy_reconcile" |
1157 | +msgstr "" |
1158 | + |
1159 | +#. module: account_advanced_reconcile_transaction_ref |
1160 | +#: field:easy.reconcile.advanced.transaction_ref,date_base_on:0 |
1161 | +msgid "Date of reconciliation" |
1162 | +msgstr "" |
1163 | + |
1164 | +#. module: account_advanced_reconcile_transaction_ref |
1165 | +#: model:ir.model,name:account_advanced_reconcile_transaction_ref.model_account_move_line |
1166 | +msgid "Journal Items" |
1167 | +msgstr "" |
1168 | + |
1169 | +#. module: account_advanced_reconcile_transaction_ref |
1170 | +#: model:ir.model,name:account_advanced_reconcile_transaction_ref.model_easy_reconcile_advanced |
1171 | +msgid "easy.reconcile.advanced" |
1172 | +msgstr "" |
1173 | + |
1174 | +#. module: account_advanced_reconcile_transaction_ref |
1175 | +#: field:easy.reconcile.advanced.transaction_ref,account_lost_id:0 |
1176 | +msgid "Account Lost" |
1177 | +msgstr "" |
1178 | + |
1179 | +#. module: account_advanced_reconcile_transaction_ref |
1180 | +#: field:easy.reconcile.advanced.transaction_ref,write_off:0 |
1181 | +msgid "Write off allowed" |
1182 | +msgstr "" |
1183 | + |
1184 | |
1185 | === added file 'account_advanced_reconcile_transaction_ref/i18n/fr.po' |
1186 | --- account_advanced_reconcile_transaction_ref/i18n/fr.po 1970-01-01 00:00:00 +0000 |
1187 | +++ account_advanced_reconcile_transaction_ref/i18n/fr.po 2014-04-03 07:40:14 +0000 |
1188 | @@ -0,0 +1,106 @@ |
1189 | +# Translation of OpenERP Server. |
1190 | +# This file contains the translation of the following modules: |
1191 | +# * account_advanced_reconcile_transaction_ref |
1192 | +# |
1193 | +msgid "" |
1194 | +msgstr "" |
1195 | +"Project-Id-Version: OpenERP Server 7.0\n" |
1196 | +"Report-Msgid-Bugs-To: \n" |
1197 | +"POT-Creation-Date: 2014-01-21 11:55+0000\n" |
1198 | +"PO-Revision-Date: 2014-03-21 15:25+0000\n" |
1199 | +"Last-Translator: Vincent Renaville@camptocamp " |
1200 | +"<vincent.renaville@camptocamp.com>\n" |
1201 | +"Language-Team: \n" |
1202 | +"MIME-Version: 1.0\n" |
1203 | +"Content-Type: text/plain; charset=UTF-8\n" |
1204 | +"Content-Transfer-Encoding: 8bit\n" |
1205 | +"X-Launchpad-Export-Date: 2014-03-22 07:11+0000\n" |
1206 | +"X-Generator: Launchpad (build 16967)\n" |
1207 | + |
1208 | +#. module: account_advanced_reconcile_transaction_ref |
1209 | +#: field:easy.reconcile.advanced.transaction_ref,partner_ids:0 |
1210 | +msgid "Restrict on partners" |
1211 | +msgstr "Restriction sur les partenaires" |
1212 | + |
1213 | +#. module: account_advanced_reconcile_transaction_ref |
1214 | +#: field:easy.reconcile.advanced.transaction_ref,account_id:0 |
1215 | +msgid "Account" |
1216 | +msgstr "Compte" |
1217 | + |
1218 | +#. module: account_advanced_reconcile_transaction_ref |
1219 | +#: view:account.easy.reconcile:0 |
1220 | +msgid "Advanced. Partner and Transaction Ref" |
1221 | +msgstr "Avancé. Partenaire et Référence de transaction" |
1222 | + |
1223 | +#. module: account_advanced_reconcile_transaction_ref |
1224 | +#: view:account.easy.reconcile:0 |
1225 | +msgid "" |
1226 | +"Match multiple debit vs multiple credit entries. Allow partial " |
1227 | +"reconciliation. The lines should have the partner, the credit entry " |
1228 | +"transaction ref. is matched vs the debit entry transaction ref. or name." |
1229 | +msgstr "" |
1230 | +"Le lettrage peut s'effectuer sur plusieurs écritures de débit et crédit. Le " |
1231 | +"Lettrage partiel est autorisé. Les écritures doivent avoir le même " |
1232 | +"partenaire et la même référence de transaction sur les écritures de crédit " |
1233 | +"doit se retrouver dans la référence de transaction ou la description sur les " |
1234 | +"écritures de débit." |
1235 | + |
1236 | +#. module: account_advanced_reconcile_transaction_ref |
1237 | +#: model:ir.model,name:account_advanced_reconcile_transaction_ref.model_easy_reconcile_advanced_transaction_ref |
1238 | +msgid "easy.reconcile.advanced.transaction_ref" |
1239 | +msgstr "easy.reconcile.advanced.transaction_ref" |
1240 | + |
1241 | +#. module: account_advanced_reconcile_transaction_ref |
1242 | +#: field:account.move.line,transaction_ref:0 |
1243 | +msgid "Transaction Ref." |
1244 | +msgstr "Réf. de transaction" |
1245 | + |
1246 | +#. module: account_advanced_reconcile_transaction_ref |
1247 | +#: field:easy.reconcile.advanced.transaction_ref,journal_id:0 |
1248 | +msgid "Journal" |
1249 | +msgstr "Journal" |
1250 | + |
1251 | +#. module: account_advanced_reconcile_transaction_ref |
1252 | +#: field:easy.reconcile.advanced.transaction_ref,account_profit_id:0 |
1253 | +msgid "Account Profit" |
1254 | +msgstr "Compte de produit" |
1255 | + |
1256 | +#. module: account_advanced_reconcile_transaction_ref |
1257 | +#: model:ir.model,name:account_advanced_reconcile_transaction_ref.model_account_bank_statement |
1258 | +msgid "Bank Statement" |
1259 | +msgstr "Relevé bancaire" |
1260 | + |
1261 | +#. module: account_advanced_reconcile_transaction_ref |
1262 | +#: field:easy.reconcile.advanced.transaction_ref,filter:0 |
1263 | +msgid "Filter" |
1264 | +msgstr "Filtre" |
1265 | + |
1266 | +#. module: account_advanced_reconcile_transaction_ref |
1267 | +#: model:ir.model,name:account_advanced_reconcile_transaction_ref.model_account_easy_reconcile_method |
1268 | +msgid "reconcile method for account_easy_reconcile" |
1269 | +msgstr "Méthode de lettrage pour le module account_easy_reconcile" |
1270 | + |
1271 | +#. module: account_advanced_reconcile_transaction_ref |
1272 | +#: field:easy.reconcile.advanced.transaction_ref,date_base_on:0 |
1273 | +msgid "Date of reconciliation" |
1274 | +msgstr "Date de lettrage" |
1275 | + |
1276 | +#. module: account_advanced_reconcile_transaction_ref |
1277 | +#: model:ir.model,name:account_advanced_reconcile_transaction_ref.model_account_move_line |
1278 | +msgid "Journal Items" |
1279 | +msgstr "Écritures comptables" |
1280 | + |
1281 | +#. module: account_advanced_reconcile_transaction_ref |
1282 | +#: model:ir.model,name:account_advanced_reconcile_transaction_ref.model_easy_reconcile_advanced |
1283 | +msgid "easy.reconcile.advanced" |
1284 | +msgstr "easy.reconcile.advanced" |
1285 | + |
1286 | +#. module: account_advanced_reconcile_transaction_ref |
1287 | +#: field:easy.reconcile.advanced.transaction_ref,account_lost_id:0 |
1288 | +msgid "Account Lost" |
1289 | +msgstr "Compte de charge" |
1290 | + |
1291 | +#. module: account_advanced_reconcile_transaction_ref |
1292 | +#: field:easy.reconcile.advanced.transaction_ref,write_off:0 |
1293 | +msgid "Write off allowed" |
1294 | +msgstr "Ecart autorisé" |
1295 | |
1296 | === added directory 'account_easy_reconcile' |
1297 | === added file 'account_easy_reconcile/__init__.py' |
1298 | --- account_easy_reconcile/__init__.py 1970-01-01 00:00:00 +0000 |
1299 | +++ account_easy_reconcile/__init__.py 2014-04-03 07:40:14 +0000 |
1300 | @@ -0,0 +1,25 @@ |
1301 | +# -*- coding: utf-8 -*- |
1302 | +############################################################################## |
1303 | +# |
1304 | +# Copyright 2012 Camptocamp SA (Guewen Baconnier) |
1305 | +# Copyright (C) 2010 Sébastien Beau |
1306 | +# |
1307 | +# This program is free software: you can redistribute it and/or modify |
1308 | +# it under the terms of the GNU Affero General Public License as |
1309 | +# published by the Free Software Foundation, either version 3 of the |
1310 | +# License, or (at your option) any later version. |
1311 | +# |
1312 | +# This program is distributed in the hope that it will be useful, |
1313 | +# but WITHOUT ANY WARRANTY; without even the implied warranty of |
1314 | +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
1315 | +# GNU Affero General Public License for more details. |
1316 | +# |
1317 | +# You should have received a copy of the GNU Affero General Public License |
1318 | +# along with this program. If not, see <http://www.gnu.org/licenses/>. |
1319 | +# |
1320 | +############################################################################## |
1321 | + |
1322 | +import easy_reconcile |
1323 | +import base_reconciliation |
1324 | +import simple_reconciliation |
1325 | +import easy_reconcile_history |
1326 | |
1327 | === added file 'account_easy_reconcile/__openerp__.py' |
1328 | --- account_easy_reconcile/__openerp__.py 1970-01-01 00:00:00 +0000 |
1329 | +++ account_easy_reconcile/__openerp__.py 2014-04-03 07:40:14 +0000 |
1330 | @@ -0,0 +1,66 @@ |
1331 | +# -*- coding: utf-8 -*- |
1332 | +############################################################################## |
1333 | +# |
1334 | +# Copyright 2012 Camptocamp SA (Guewen Baconnier) |
1335 | +# Copyright (C) 2010 Sébastien Beau |
1336 | +# |
1337 | +# This program is free software: you can redistribute it and/or modify |
1338 | +# it under the terms of the GNU Affero General Public License as |
1339 | +# published by the Free Software Foundation, either version 3 of the |
1340 | +# License, or (at your option) any later version. |
1341 | +# |
1342 | +# This program is distributed in the hope that it will be useful, |
1343 | +# but WITHOUT ANY WARRANTY; without even the implied warranty of |
1344 | +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
1345 | +# GNU Affero General Public License for more details. |
1346 | +# |
1347 | +# You should have received a copy of the GNU Affero General Public License |
1348 | +# along with this program. If not, see <http://www.gnu.org/licenses/>. |
1349 | +# |
1350 | +############################################################################## |
1351 | + |
1352 | +{ |
1353 | + "name": "Easy Reconcile", |
1354 | + "version": "1.3.1", |
1355 | + "depends": ["account"], |
1356 | + "author": "Akretion,Camptocamp", |
1357 | + "description": """ |
1358 | +Easy Reconcile |
1359 | +============== |
1360 | + |
1361 | +This is a shared work between Akretion and Camptocamp |
1362 | +in order to provide: |
1363 | + - reconciliation facilities for big volume of transactions |
1364 | + - setup different profiles of reconciliation by account |
1365 | + - each profile can use many methods of reconciliation |
1366 | + - this module is also a base to create others |
1367 | + reconciliation methods which can plug in the profiles |
1368 | + - a profile a reconciliation can be run manually |
1369 | + or by a cron |
1370 | + - monitoring of reconciliation runs with an history |
1371 | + which keep track of the reconciled Journal items |
1372 | + |
1373 | +2 simple reconciliation methods are integrated |
1374 | +in this module, the simple reconciliations works |
1375 | +on 2 lines (1 debit / 1 credit) and do not allow |
1376 | +partial reconcilation, they also match on 1 key, |
1377 | +partner or Journal item name. |
1378 | + |
1379 | +You may be interested to install also the |
1380 | +``account_advanced_reconciliation`` module. |
1381 | +This latter add more complex reconciliations, |
1382 | +allows multiple lines and partial. |
1383 | + |
1384 | +""", |
1385 | + "website": "http://www.akretion.com/", |
1386 | + "category": "Finance", |
1387 | + "demo_xml": [], |
1388 | + "data": ["easy_reconcile.xml", |
1389 | + "easy_reconcile_history_view.xml", |
1390 | + "security/ir_rule.xml", |
1391 | + "security/ir.model.access.csv"], |
1392 | + 'license': 'AGPL-3', |
1393 | + "auto_install": False, |
1394 | + "installable": True, |
1395 | + |
1396 | +} |
1397 | |
1398 | === added file 'account_easy_reconcile/base_reconciliation.py' |
1399 | --- account_easy_reconcile/base_reconciliation.py 1970-01-01 00:00:00 +0000 |
1400 | +++ account_easy_reconcile/base_reconciliation.py 2014-04-03 07:40:14 +0000 |
1401 | @@ -0,0 +1,208 @@ |
1402 | +# -*- coding: utf-8 -*- |
1403 | +############################################################################## |
1404 | +# |
1405 | +# Copyright 2012-2013 Camptocamp SA (Guewen Baconnier) |
1406 | +# Copyright (C) 2010 Sébastien Beau |
1407 | +# |
1408 | +# This program is free software: you can redistribute it and/or modify |
1409 | +# it under the terms of the GNU Affero General Public License as |
1410 | +# published by the Free Software Foundation, either version 3 of the |
1411 | +# License, or (at your option) any later version. |
1412 | +# |
1413 | +# This program is distributed in the hope that it will be useful, |
1414 | +# but WITHOUT ANY WARRANTY; without even the implied warranty of |
1415 | +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
1416 | +# GNU Affero General Public License for more details. |
1417 | +# |
1418 | +# You should have received a copy of the GNU Affero General Public License |
1419 | +# along with this program. If not, see <http://www.gnu.org/licenses/>. |
1420 | +# |
1421 | +############################################################################## |
1422 | + |
1423 | +from openerp.osv import fields, orm |
1424 | +from operator import itemgetter, attrgetter |
1425 | + |
1426 | + |
1427 | +class easy_reconcile_base(orm.AbstractModel): |
1428 | + """Abstract Model for reconciliation methods""" |
1429 | + |
1430 | + _name = 'easy.reconcile.base' |
1431 | + |
1432 | + _inherit = 'easy.reconcile.options' |
1433 | + |
1434 | + _columns = { |
1435 | + 'account_id': fields.many2one( |
1436 | + 'account.account', 'Account', required=True), |
1437 | + 'partner_ids': fields.many2many( |
1438 | + 'res.partner', string="Restrict on partners"), |
1439 | + # other columns are inherited from easy.reconcile.options |
1440 | + } |
1441 | + |
1442 | + def automatic_reconcile(self, cr, uid, ids, context=None): |
1443 | + """ Reconciliation method called from the view. |
1444 | + |
1445 | + :return: list of reconciled ids, list of partially reconciled items |
1446 | + """ |
1447 | + if isinstance(ids, (int, long)): |
1448 | + ids = [ids] |
1449 | + assert len(ids) == 1, "Has to be called on one id" |
1450 | + rec = self.browse(cr, uid, ids[0], context=context) |
1451 | + return self._action_rec(cr, uid, rec, context=context) |
1452 | + |
1453 | + def _action_rec(self, cr, uid, rec, context=None): |
1454 | + """ Must be inherited to implement the reconciliation |
1455 | + |
1456 | + :return: list of reconciled ids |
1457 | + """ |
1458 | + raise NotImplementedError |
1459 | + |
1460 | + def _base_columns(self, rec): |
1461 | + """ Mandatory columns for move lines queries |
1462 | + An extra column aliased as ``key`` should be defined |
1463 | + in each query.""" |
1464 | + aml_cols = ( |
1465 | + 'id', |
1466 | + 'debit', |
1467 | + 'credit', |
1468 | + 'date', |
1469 | + 'period_id', |
1470 | + 'ref', |
1471 | + 'name', |
1472 | + 'partner_id', |
1473 | + 'account_id', |
1474 | + 'move_id') |
1475 | + return ["account_move_line.%s" % col for col in aml_cols] |
1476 | + |
1477 | + def _select(self, rec, *args, **kwargs): |
1478 | + return "SELECT %s" % ', '.join(self._base_columns(rec)) |
1479 | + |
1480 | + def _from(self, rec, *args, **kwargs): |
1481 | + return "FROM account_move_line" |
1482 | + |
1483 | + def _where(self, rec, *args, **kwargs): |
1484 | + where = ("WHERE account_move_line.account_id = %s " |
1485 | + "AND account_move_line.reconcile_id IS NULL ") |
1486 | + # it would be great to use dict for params |
1487 | + # but as we use _where_calc in _get_filter |
1488 | + # which returns a list, we have to |
1489 | + # accomodate with that |
1490 | + params = [rec.account_id.id] |
1491 | + |
1492 | + if rec.partner_ids: |
1493 | + where += " AND account_move_line.partner_id IN %s" |
1494 | + params.append(tuple([l.id for l in rec.partner_ids])) |
1495 | + return where, params |
1496 | + |
1497 | + def _get_filter(self, cr, uid, rec, context): |
1498 | + ml_obj = self.pool.get('account.move.line') |
1499 | + where = '' |
1500 | + params = [] |
1501 | + if rec.filter: |
1502 | + dummy, where, params = ml_obj._where_calc( |
1503 | + cr, uid, eval(rec.filter), context=context).get_sql() |
1504 | + if where: |
1505 | + where = " AND %s" % where |
1506 | + return where, params |
1507 | + |
1508 | + def _below_writeoff_limit(self, cr, uid, rec, lines, |
1509 | + writeoff_limit, context=None): |
1510 | + precision = self.pool.get('decimal.precision').precision_get( |
1511 | + cr, uid, 'Account') |
1512 | + keys = ('debit', 'credit') |
1513 | + sums = reduce( |
1514 | + lambda line, memo: |
1515 | + dict((key, value + memo[key]) |
1516 | + for key, value |
1517 | + in line.iteritems() |
1518 | + if key in keys), lines) |
1519 | + |
1520 | + debit, credit = sums['debit'], sums['credit'] |
1521 | + writeoff_amount = round(debit - credit, precision) |
1522 | + return bool(writeoff_limit >= abs(writeoff_amount)), debit, credit |
1523 | + |
1524 | + def _get_rec_date(self, cr, uid, rec, lines, |
1525 | + based_on='end_period_last_credit', context=None): |
1526 | + period_obj = self.pool.get('account.period') |
1527 | + |
1528 | + def last_period(mlines): |
1529 | + period_ids = [ml['period_id'] for ml in mlines] |
1530 | + periods = period_obj.browse( |
1531 | + cr, uid, period_ids, context=context) |
1532 | + return max(periods, key=attrgetter('date_stop')) |
1533 | + |
1534 | + def last_date(mlines): |
1535 | + return max(mlines, key=itemgetter('date')) |
1536 | + |
1537 | + def credit(mlines): |
1538 | + return [l for l in mlines if l['credit'] > 0] |
1539 | + |
1540 | + def debit(mlines): |
1541 | + return [l for l in mlines if l['debit'] > 0] |
1542 | + |
1543 | + if based_on == 'end_period_last_credit': |
1544 | + return last_period(credit(lines)).date_stop |
1545 | + if based_on == 'end_period': |
1546 | + return last_period(lines).date_stop |
1547 | + elif based_on == 'newest': |
1548 | + return last_date(lines)['date'] |
1549 | + elif based_on == 'newest_credit': |
1550 | + return last_date(credit(lines))['date'] |
1551 | + elif based_on == 'newest_debit': |
1552 | + return last_date(debit(lines))['date'] |
1553 | + # reconcilation date will be today |
1554 | + # when date is None |
1555 | + return None |
1556 | + |
1557 | + def _reconcile_lines(self, cr, uid, rec, lines, allow_partial=False, context=None): |
1558 | + """ Try to reconcile given lines |
1559 | + |
1560 | + :param list lines: list of dict of move lines, they must at least |
1561 | + contain values for : id, debit, credit |
1562 | + :param boolean allow_partial: if True, partial reconciliation will be |
1563 | + created, otherwise only Full |
1564 | + reconciliation will be created |
1565 | + :return: tuple of boolean values, first item is wether the items |
1566 | + have been reconciled or not, |
1567 | + the second is wether the reconciliation is full (True) |
1568 | + or partial (False) |
1569 | + """ |
1570 | + if context is None: |
1571 | + context = {} |
1572 | + |
1573 | + ml_obj = self.pool.get('account.move.line') |
1574 | + writeoff = rec.write_off |
1575 | + |
1576 | + line_ids = [l['id'] for l in lines] |
1577 | + below_writeoff, sum_debit, sum_credit = self._below_writeoff_limit( |
1578 | + cr, uid, rec, lines, writeoff, context=context) |
1579 | + date = self._get_rec_date( |
1580 | + cr, uid, rec, lines, rec.date_base_on, context=context) |
1581 | + |
1582 | + rec_ctx = dict(context, date_p=date) |
1583 | + if below_writeoff: |
1584 | + if sum_credit < sum_debit: |
1585 | + writeoff_account_id = rec.account_profit_id.id |
1586 | + else: |
1587 | + writeoff_account_id = rec.account_lost_id.id |
1588 | + |
1589 | + period_id = self.pool.get('account.period').find( |
1590 | + cr, uid, dt=date, context=context)[0] |
1591 | + |
1592 | + ml_obj.reconcile( |
1593 | + cr, uid, |
1594 | + line_ids, |
1595 | + type='auto', |
1596 | + writeoff_acc_id=writeoff_account_id, |
1597 | + writeoff_period_id=period_id, |
1598 | + writeoff_journal_id=rec.journal_id.id, |
1599 | + context=rec_ctx) |
1600 | + return True, True |
1601 | + elif allow_partial: |
1602 | + ml_obj.reconcile_partial( |
1603 | + cr, uid, |
1604 | + line_ids, |
1605 | + type='manual', |
1606 | + context=rec_ctx) |
1607 | + return True, False |
1608 | + |
1609 | + return False, False |
1610 | |
1611 | === added file 'account_easy_reconcile/easy_reconcile.py' |
1612 | --- account_easy_reconcile/easy_reconcile.py 1970-01-01 00:00:00 +0000 |
1613 | +++ account_easy_reconcile/easy_reconcile.py 2014-04-03 07:40:14 +0000 |
1614 | @@ -0,0 +1,338 @@ |
1615 | +# -*- coding: utf-8 -*- |
1616 | +############################################################################## |
1617 | +# |
1618 | +# Copyright 2012-2013 Camptocamp SA (Guewen Baconnier) |
1619 | +# Copyright (C) 2010 Sébastien Beau |
1620 | +# |
1621 | +# This program is free software: you can redistribute it and/or modify |
1622 | +# it under the terms of the GNU Affero General Public License as |
1623 | +# published by the Free Software Foundation, either version 3 of the |
1624 | +# License, or (at your option) any later version. |
1625 | +# |
1626 | +# This program is distributed in the hope that it will be useful, |
1627 | +# but WITHOUT ANY WARRANTY; without even the implied warranty of |
1628 | +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
1629 | +# GNU Affero General Public License for more details. |
1630 | +# |
1631 | +# You should have received a copy of the GNU Affero General Public License |
1632 | +# along with this program. If not, see <http://www.gnu.org/licenses/>. |
1633 | +# |
1634 | +############################################################################## |
1635 | + |
1636 | +from openerp.osv import fields, osv, orm |
1637 | +from openerp.tools.translate import _ |
1638 | +from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT |
1639 | +from openerp.tools.translate import _ |
1640 | + |
1641 | + |
1642 | +class easy_reconcile_options(orm.AbstractModel): |
1643 | + """Options of a reconciliation profile |
1644 | + |
1645 | + Columns shared by the configuration of methods |
1646 | + and by the reconciliation wizards. |
1647 | + This allows decoupling of the methods and the |
1648 | + wizards and allows to launch the wizards alone |
1649 | + """ |
1650 | + |
1651 | + _name = 'easy.reconcile.options' |
1652 | + |
1653 | + def _get_rec_base_date(self, cr, uid, context=None): |
1654 | + return [('end_period_last_credit', 'End of period of most recent credit'), |
1655 | + ('newest', 'Most recent move line'), |
1656 | + ('actual', 'Today'), |
1657 | + ('end_period', 'End of period of most recent move line'), |
1658 | + ('newest_credit', 'Date of most recent credit'), |
1659 | + ('newest_debit', 'Date of most recent debit')] |
1660 | + |
1661 | + _columns = { |
1662 | + 'write_off': fields.float('Write off allowed'), |
1663 | + 'account_lost_id': fields.many2one( |
1664 | + 'account.account', 'Account Lost'), |
1665 | + 'account_profit_id': fields.many2one( |
1666 | + 'account.account', 'Account Profit'), |
1667 | + 'journal_id': fields.many2one( |
1668 | + 'account.journal', 'Journal'), |
1669 | + 'date_base_on': fields.selection( |
1670 | + _get_rec_base_date, |
1671 | + required=True, |
1672 | + string='Date of reconciliation'), |
1673 | + 'filter': fields.char('Filter', size=128), |
1674 | + } |
1675 | + |
1676 | + _defaults = { |
1677 | + 'write_off': 0., |
1678 | + 'date_base_on': 'end_period_last_credit', |
1679 | + } |
1680 | + |
1681 | + |
1682 | +class account_easy_reconcile_method(orm.Model): |
1683 | + |
1684 | + _name = 'account.easy.reconcile.method' |
1685 | + _description = 'reconcile method for account_easy_reconcile' |
1686 | + |
1687 | + _inherit = 'easy.reconcile.options' |
1688 | + |
1689 | + _order = 'sequence' |
1690 | + |
1691 | + def _get_all_rec_method(self, cr, uid, context=None): |
1692 | + return [ |
1693 | + ('easy.reconcile.simple.name', 'Simple. Amount and Name'), |
1694 | + ('easy.reconcile.simple.partner', 'Simple. Amount and Partner'), |
1695 | + ('easy.reconcile.simple.reference', 'Simple. Amount and Reference'), |
1696 | + ] |
1697 | + |
1698 | + def _get_rec_method(self, cr, uid, context=None): |
1699 | + return self._get_all_rec_method(cr, uid, context=None) |
1700 | + |
1701 | + _columns = { |
1702 | + 'name': fields.selection( |
1703 | + _get_rec_method, 'Type', required=True), |
1704 | + 'sequence': fields.integer( |
1705 | + 'Sequence', |
1706 | + required=True, |
1707 | + help="The sequence field is used to order " |
1708 | + "the reconcile method"), |
1709 | + 'task_id': fields.many2one( |
1710 | + 'account.easy.reconcile', |
1711 | + string='Task', |
1712 | + required=True, |
1713 | + ondelete='cascade'), |
1714 | + 'company_id': fields.related('task_id','company_id', |
1715 | + relation='res.company', |
1716 | + type='many2one', |
1717 | + string='Company', |
1718 | + store=True, |
1719 | + readonly=True), |
1720 | + } |
1721 | + |
1722 | + _defaults = { |
1723 | + 'sequence': 1, |
1724 | + } |
1725 | + |
1726 | + def init(self, cr): |
1727 | + """ Migration stuff |
1728 | + |
1729 | + Name is not anymore methods names but the name |
1730 | + of the model which does the reconciliation |
1731 | + """ |
1732 | + cr.execute(""" |
1733 | + UPDATE account_easy_reconcile_method |
1734 | + SET name = 'easy.reconcile.simple.partner' |
1735 | + WHERE name = 'action_rec_auto_partner' |
1736 | + """) |
1737 | + cr.execute(""" |
1738 | + UPDATE account_easy_reconcile_method |
1739 | + SET name = 'easy.reconcile.simple.name' |
1740 | + WHERE name = 'action_rec_auto_name' |
1741 | + """) |
1742 | + |
1743 | + |
1744 | +class account_easy_reconcile(orm.Model): |
1745 | + |
1746 | + _name = 'account.easy.reconcile' |
1747 | + _description = 'account easy reconcile' |
1748 | + |
1749 | + def _get_total_unrec(self, cr, uid, ids, name, arg, context=None): |
1750 | + obj_move_line = self.pool.get('account.move.line') |
1751 | + res = {} |
1752 | + for task in self.browse(cr, uid, ids, context=context): |
1753 | + res[task.id] = len(obj_move_line.search( |
1754 | + cr, uid, |
1755 | + [('account_id', '=', task.account.id), |
1756 | + ('reconcile_id', '=', False), |
1757 | + ('reconcile_partial_id', '=', False)], |
1758 | + context=context)) |
1759 | + return res |
1760 | + |
1761 | + def _get_partial_rec(self, cr, uid, ids, name, arg, context=None): |
1762 | + obj_move_line = self.pool.get('account.move.line') |
1763 | + res = {} |
1764 | + for task in self.browse(cr, uid, ids, context=context): |
1765 | + res[task.id] = len(obj_move_line.search( |
1766 | + cr, uid, |
1767 | + [('account_id', '=', task.account.id), |
1768 | + ('reconcile_id', '=', False), |
1769 | + ('reconcile_partial_id', '!=', False)], |
1770 | + context=context)) |
1771 | + return res |
1772 | + |
1773 | + def _last_history(self, cr, uid, ids, name, args, context=None): |
1774 | + result = {} |
1775 | + for history in self.browse(cr, uid, ids, context=context): |
1776 | + result[history.id] = False |
1777 | + if history.history_ids: |
1778 | + # history is sorted by date desc |
1779 | + result[history.id] = history.history_ids[0].id |
1780 | + return result |
1781 | + |
1782 | + _columns = { |
1783 | + 'name': fields.char('Name', required=True), |
1784 | + 'account': fields.many2one( |
1785 | + 'account.account', 'Account', required=True), |
1786 | + 'reconcile_method': fields.one2many( |
1787 | + 'account.easy.reconcile.method', 'task_id', 'Method'), |
1788 | + 'unreconciled_count': fields.function( |
1789 | + _get_total_unrec, type='integer', string='Unreconciled Items'), |
1790 | + 'reconciled_partial_count': fields.function( |
1791 | + _get_partial_rec, |
1792 | + type='integer', |
1793 | + string='Partially Reconciled Items'), |
1794 | + 'history_ids': fields.one2many( |
1795 | + 'easy.reconcile.history', |
1796 | + 'easy_reconcile_id', |
1797 | + string='History', |
1798 | + readonly=True), |
1799 | + 'last_history': |
1800 | + fields.function( |
1801 | + _last_history, |
1802 | + string='Last History', |
1803 | + type='many2one', |
1804 | + relation='easy.reconcile.history', |
1805 | + readonly=True), |
1806 | + 'company_id': fields.many2one('res.company', 'Company'), |
1807 | + } |
1808 | + |
1809 | + def _prepare_run_transient(self, cr, uid, rec_method, context=None): |
1810 | + return {'account_id': rec_method.task_id.account.id, |
1811 | + 'write_off': rec_method.write_off, |
1812 | + 'account_lost_id': (rec_method.account_lost_id and |
1813 | + rec_method.account_lost_id.id), |
1814 | + 'account_profit_id': (rec_method.account_profit_id and |
1815 | + rec_method.account_profit_id.id), |
1816 | + 'journal_id': (rec_method.journal_id and |
1817 | + rec_method.journal_id.id), |
1818 | + 'date_base_on': rec_method.date_base_on, |
1819 | + 'filter': rec_method.filter} |
1820 | + |
1821 | + def run_reconcile(self, cr, uid, ids, context=None): |
1822 | + def find_reconcile_ids(fieldname, move_line_ids): |
1823 | + if not move_line_ids: |
1824 | + return [] |
1825 | + sql = ("SELECT DISTINCT " + fieldname + |
1826 | + " FROM account_move_line " |
1827 | + " WHERE id in %s " |
1828 | + " AND " + fieldname + " IS NOT NULL") |
1829 | + cr.execute(sql, (tuple(move_line_ids),)) |
1830 | + res = cr.fetchall() |
1831 | + return [row[0] for row in res] |
1832 | + |
1833 | + for rec in self.browse(cr, uid, ids, context=context): |
1834 | + all_ml_rec_ids = [] |
1835 | + all_ml_partial_ids = [] |
1836 | + |
1837 | + for method in rec.reconcile_method: |
1838 | + rec_model = self.pool.get(method.name) |
1839 | + auto_rec_id = rec_model.create( |
1840 | + cr, uid, |
1841 | + self._prepare_run_transient( |
1842 | + cr, uid, method, context=context), |
1843 | + context=context) |
1844 | + |
1845 | + ml_rec_ids, ml_partial_ids = rec_model.automatic_reconcile( |
1846 | + cr, uid, auto_rec_id, context=context) |
1847 | + |
1848 | + all_ml_rec_ids += ml_rec_ids |
1849 | + all_ml_partial_ids += ml_partial_ids |
1850 | + |
1851 | + reconcile_ids = find_reconcile_ids( |
1852 | + 'reconcile_id', all_ml_rec_ids) |
1853 | + partial_ids = find_reconcile_ids( |
1854 | + 'reconcile_partial_id', all_ml_partial_ids) |
1855 | + |
1856 | + self.pool.get('easy.reconcile.history').create( |
1857 | + cr, |
1858 | + uid, |
1859 | + {'easy_reconcile_id': rec.id, |
1860 | + 'date': fields.datetime.now(), |
1861 | + 'reconcile_ids': [(4, rid) for rid in reconcile_ids], |
1862 | + 'reconcile_partial_ids': [(4, rid) for rid in partial_ids]}, |
1863 | + context=context) |
1864 | + return True |
1865 | + |
1866 | + def _no_history(self, cr, uid, rec, context=None): |
1867 | + """ Raise an `osv.except_osv` error, supposed to |
1868 | + be called when there is no history on the reconciliation |
1869 | + task. |
1870 | + """ |
1871 | + raise osv.except_osv( |
1872 | + _('Error'), |
1873 | + _('There is no history of reconciled ' |
1874 | + 'items on the task: %s.') % rec.name) |
1875 | + |
1876 | + def _open_move_line_list(sefl, cr, uid, move_line_ids, name, context=None): |
1877 | + return { |
1878 | + 'name': name, |
1879 | + 'view_mode': 'tree,form', |
1880 | + 'view_id': False, |
1881 | + 'view_type': 'form', |
1882 | + 'res_model': 'account.move.line', |
1883 | + 'type': 'ir.actions.act_window', |
1884 | + 'nodestroy': True, |
1885 | + 'target': 'current', |
1886 | + 'domain': unicode([('id', 'in', move_line_ids)]), |
1887 | + } |
1888 | + |
1889 | + def open_unreconcile(self, cr, uid, ids, context=None): |
1890 | + """ Open the view of move line with the unreconciled move lines |
1891 | + """ |
1892 | + |
1893 | + assert len(ids) == 1 , \ |
1894 | + "You can only open entries from one profile at a time" |
1895 | + |
1896 | + obj_move_line = self.pool.get('account.move.line') |
1897 | + res = {} |
1898 | + for task in self.browse(cr, uid, ids, context=context): |
1899 | + line_ids = obj_move_line.search( |
1900 | + cr, uid, |
1901 | + [('account_id', '=', task.account.id), |
1902 | + ('reconcile_id', '=', False), |
1903 | + ('reconcile_partial_id', '=', False)], |
1904 | + context=context) |
1905 | + |
1906 | + name = _('Unreconciled items') |
1907 | + return self._open_move_line_list(cr, uid, line_ids, name, context=context) |
1908 | + |
1909 | + def open_partial_reconcile(self, cr, uid, ids, context=None): |
1910 | + """ Open the view of move line with the unreconciled move lines |
1911 | + """ |
1912 | + |
1913 | + assert len(ids) == 1 , \ |
1914 | + "You can only open entries from one profile at a time" |
1915 | + |
1916 | + obj_move_line = self.pool.get('account.move.line') |
1917 | + res = {} |
1918 | + for task in self.browse(cr, uid, ids, context=context): |
1919 | + line_ids = obj_move_line.search( |
1920 | + cr, uid, |
1921 | + [('account_id', '=', task.account.id), |
1922 | + ('reconcile_id', '=', False), |
1923 | + ('reconcile_partial_id', '!=', False)], |
1924 | + context=context) |
1925 | + name = _('Partial reconciled items') |
1926 | + return self._open_move_line_list(cr, uid, line_ids, name, context=context) |
1927 | + |
1928 | + def last_history_reconcile(self, cr, uid, rec_id, context=None): |
1929 | + """ Get the last history record for this reconciliation profile |
1930 | + and return the action which opens move lines reconciled |
1931 | + """ |
1932 | + if isinstance(rec_id, (tuple, list)): |
1933 | + assert len(rec_id) == 1, \ |
1934 | + "Only 1 id expected" |
1935 | + rec_id = rec_id[0] |
1936 | + rec = self.browse(cr, uid, rec_id, context=context) |
1937 | + if not rec.last_history: |
1938 | + self._no_history(cr, uid, rec, context=context) |
1939 | + return rec.last_history.open_reconcile() |
1940 | + |
1941 | + def last_history_partial(self, cr, uid, rec_id, context=None): |
1942 | + """ Get the last history record for this reconciliation profile |
1943 | + and return the action which opens move lines reconciled |
1944 | + """ |
1945 | + if isinstance(rec_id, (tuple, list)): |
1946 | + assert len(rec_id) == 1, \ |
1947 | + "Only 1 id expected" |
1948 | + rec_id = rec_id[0] |
1949 | + rec = self.browse(cr, uid, rec_id, context=context) |
1950 | + if not rec.last_history: |
1951 | + self._no_history(cr, uid, rec, context=context) |
1952 | + return rec.last_history.open_partial() |
1953 | |
1954 | === added file 'account_easy_reconcile/easy_reconcile.xml' |
1955 | --- account_easy_reconcile/easy_reconcile.xml 1970-01-01 00:00:00 +0000 |
1956 | +++ account_easy_reconcile/easy_reconcile.xml 2014-04-03 07:40:14 +0000 |
1957 | @@ -0,0 +1,162 @@ |
1958 | +<?xml version="1.0" encoding="UTF-8"?> |
1959 | +<openerp> |
1960 | +<data> |
1961 | + |
1962 | + <!-- account.easy.reconcile view --> |
1963 | + <record id="account_easy_reconcile_form" model="ir.ui.view"> |
1964 | + <field name="name">account.easy.reconcile.form</field> |
1965 | + <field name="priority">20</field> |
1966 | + <field name="model">account.easy.reconcile</field> |
1967 | + <field name="arch" type="xml"> |
1968 | + <form string="Automatic Easy Reconcile" version="7.0"> |
1969 | + <header> |
1970 | + <button name="run_reconcile" class="oe_highlight" |
1971 | + string="Start Auto Reconciliation" type="object"/> |
1972 | + <button icon="STOCK_JUMP_TO" name="last_history_reconcile" |
1973 | + string="Display items reconciled on the last run" |
1974 | + type="object"/> |
1975 | + <button icon="STOCK_JUMP_TO" name="last_history_partial" |
1976 | + string="Display items partially reconciled on the last run" |
1977 | + type="object"/> |
1978 | + </header> |
1979 | + <sheet> |
1980 | + <separator colspan="4" string="Profile Information" /> |
1981 | + <group> |
1982 | + <group> |
1983 | + <field name="name" select="1"/> |
1984 | + <field name="account"/> |
1985 | + <field name="company_id" groups="base.group_multi_company"/> |
1986 | + </group> |
1987 | + <group> |
1988 | + <group> |
1989 | + <field name="unreconciled_count"/> |
1990 | + <button icon="STOCK_JUMP_TO" name="open_unreconcile" |
1991 | + string="Go to unreconciled items" type="object"/> |
1992 | + </group> |
1993 | + <group> |
1994 | + <field name="reconciled_partial_count"/> |
1995 | + <button icon="STOCK_JUMP_TO" name="open_partial_reconcile" |
1996 | + string="Go to partial reconciled items" type="object"/> |
1997 | + </group> |
1998 | + </group> |
1999 | + </group> |
2000 | + <notebook colspan="4"> |
2001 | + <page name="methods" string="Configuration"> |
2002 | + <field name="reconcile_method" colspan = "4" nolabel="1"/> |
2003 | + </page> |
2004 | + <page name="history" string="History"> |
2005 | + <field name="history_ids" nolabel="1"> |
2006 | + <tree string="Automatic Easy Reconcile History"> |
2007 | + <field name="date"/> |
2008 | + <button icon="STOCK_JUMP_TO" name="open_reconcile" |
2009 | + string="Go to reconciled items" type="object"/> |
2010 | + <button icon="STOCK_JUMP_TO" name="open_partial" |
2011 | + string="Go to partially reconciled items" type="object"/> |
2012 | + </tree> |
2013 | + </field> |
2014 | + </page> |
2015 | + <page name="information" string="Information"> |
2016 | + <separator colspan="4" string="Simple. Amount and Name"/> |
2017 | + <label string="Match one debit line vs one credit line. Do not allow partial reconciliation. |
2018 | +The lines should have the same amount (with the write-off) and the same name to be reconciled." colspan="4"/> |
2019 | + |
2020 | + <separator colspan="4" string="Simple. Amount and Partner"/> |
2021 | + <label string="Match one debit line vs one credit line. Do not allow partial reconciliation. |
2022 | +The lines should have the same amount (with the write-off) and the same partner to be reconciled." colspan="4"/> |
2023 | + |
2024 | + <separator colspan="4" string="Simple. Amount and Reference"/> |
2025 | + <label string="Match one debit line vs one credit line. Do not allow partial reconciliation. |
2026 | +The lines should have the same amount (with the write-off) and the same reference to be reconciled." colspan="4"/> |
2027 | + |
2028 | + </page> |
2029 | + </notebook> |
2030 | + </sheet> |
2031 | + </form> |
2032 | + </field> |
2033 | + </record> |
2034 | + |
2035 | + <record id="account_easy_reconcile_tree" model="ir.ui.view"> |
2036 | + <field name="name">account.easy.reconcile.tree</field> |
2037 | + <field name="priority">20</field> |
2038 | + <field name="model">account.easy.reconcile</field> |
2039 | + <field name="arch" type="xml"> |
2040 | + <tree string="Automatic Easy Reconcile"> |
2041 | + <field name="name"/> |
2042 | + <field name="account"/> |
2043 | + <field name="company_id" groups="base.group_multi_company"/> |
2044 | + <field name="unreconciled_count"/> |
2045 | + <field name="reconciled_partial_count"/> |
2046 | + <button icon="gtk-ok" name="run_reconcile" colspan="4" |
2047 | + string="Start Auto Reconcilation" type="object"/> |
2048 | + <button icon="STOCK_JUMP_TO" name="last_history_reconcile" colspan="2" |
2049 | + string="Display items reconciled on the last run" type="object"/> |
2050 | + <button icon="STOCK_JUMP_TO" name="last_history_partial" colspan="2" |
2051 | + string="Display items partially reconciled on the last run" |
2052 | + type="object"/> |
2053 | + </tree> |
2054 | + </field> |
2055 | + </record> |
2056 | + |
2057 | + <record id="action_account_easy_reconcile" model="ir.actions.act_window"> |
2058 | + <field name="name">Easy Automatic Reconcile</field> |
2059 | + <field name="type">ir.actions.act_window</field> |
2060 | + <field name="res_model">account.easy.reconcile</field> |
2061 | + <field name="view_type">form</field> |
2062 | + <field name="view_mode">tree,form</field> |
2063 | + <field name="help" type="html"> |
2064 | + <p class="oe_view_nocontent_create"> |
2065 | + Click to add a reconciliation profile. |
2066 | + </p><p> |
2067 | + A reconciliation profile specifies, for one account, how |
2068 | + the entries should be reconciled. |
2069 | + You can select one or many reconciliation methods which will |
2070 | + be run sequentially to match the entries between them. |
2071 | + </p> |
2072 | + </field> |
2073 | + </record> |
2074 | + |
2075 | + |
2076 | + <!-- account.easy.reconcile.method view --> |
2077 | + |
2078 | + <record id="account_easy_reconcile_method_form" model="ir.ui.view"> |
2079 | + <field name="name">account.easy.reconcile.method.form</field> |
2080 | + <field name="priority">20</field> |
2081 | + <field name="model">account.easy.reconcile.method</field> |
2082 | + <field name="arch" type="xml"> |
2083 | + <form string="Automatic Easy Reconcile Method"> |
2084 | + <field name="sequence"/> |
2085 | + <field name="name"/> |
2086 | + <field name="write_off"/> |
2087 | + <field name="account_lost_id" attrs="{'required':[('write_off','>',0)]}"/> |
2088 | + <field name="account_profit_id" attrs="{'required':[('write_off','>',0)]}"/> |
2089 | + <field name="journal_id" attrs="{'required':[('write_off','>',0)]}"/> |
2090 | + <field name="date_base_on"/> |
2091 | + </form> |
2092 | + </field> |
2093 | + </record> |
2094 | + |
2095 | + <record id="account_easy_reconcile_method_tree" model="ir.ui.view"> |
2096 | + <field name="name">account.easy.reconcile.method.tree</field> |
2097 | + <field name="priority">20</field> |
2098 | + <field name="model">account.easy.reconcile.method</field> |
2099 | + <field name="arch" type="xml"> |
2100 | + <tree editable="top" string="Automatic Easy Reconcile Method"> |
2101 | + <field name="sequence"/> |
2102 | + <field name="name"/> |
2103 | + <field name="write_off"/> |
2104 | + <field name="account_lost_id" attrs="{'required':[('write_off','>',0)]}"/> |
2105 | + <field name="account_profit_id" attrs="{'required':[('write_off','>',0)]}"/> |
2106 | + <field name="journal_id" attrs="{'required':[('write_off','>',0)]}"/> |
2107 | + <field name="date_base_on"/> |
2108 | + </tree> |
2109 | + </field> |
2110 | + </record> |
2111 | + |
2112 | + <!-- menu item --> |
2113 | + |
2114 | + <menuitem action="action_account_easy_reconcile" |
2115 | + id="menu_easy_reconcile" |
2116 | + parent="account.periodical_processing_reconciliation"/> |
2117 | + |
2118 | +</data> |
2119 | +</openerp> |
2120 | |
2121 | === added file 'account_easy_reconcile/easy_reconcile_history.py' |
2122 | --- account_easy_reconcile/easy_reconcile_history.py 1970-01-01 00:00:00 +0000 |
2123 | +++ account_easy_reconcile/easy_reconcile_history.py 2014-04-03 07:40:14 +0000 |
2124 | @@ -0,0 +1,153 @@ |
2125 | +# -*- coding: utf-8 -*- |
2126 | +############################################################################## |
2127 | +# |
2128 | +# Author: Guewen Baconnier |
2129 | +# Copyright 2012 Camptocamp SA |
2130 | +# |
2131 | +# This program is free software: you can redistribute it and/or modify |
2132 | +# it under the terms of the GNU Affero General Public License as |
2133 | +# published by the Free Software Foundation, either version 3 of the |
2134 | +# License, or (at your option) any later version. |
2135 | +# |
2136 | +# This program is distributed in the hope that it will be useful, |
2137 | +# but WITHOUT ANY WARRANTY; without even the implied warranty of |
2138 | +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
2139 | +# GNU Affero General Public License for more details. |
2140 | +# |
2141 | +# You should have received a copy of the GNU Affero General Public License |
2142 | +# along with this program. If not, see <http://www.gnu.org/licenses/>. |
2143 | +# |
2144 | +############################################################################## |
2145 | + |
2146 | +from openerp.osv import orm, fields |
2147 | +from openerp.tools.translate import _ |
2148 | + |
2149 | + |
2150 | +class easy_reconcile_history(orm.Model): |
2151 | + """ Store an history of the runs per profile |
2152 | + Each history stores the list of reconciliations done""" |
2153 | + |
2154 | + _name = 'easy.reconcile.history' |
2155 | + _rec_name = 'easy_reconcile_id' |
2156 | + _order = 'date DESC' |
2157 | + |
2158 | + def _reconcile_line_ids(self, cr, uid, ids, name, args, context=None): |
2159 | + result = {} |
2160 | + |
2161 | + for history in self.browse(cr, uid, ids, context=context): |
2162 | + result[history.id] = {} |
2163 | + |
2164 | + move_line_ids = [] |
2165 | + for reconcile in history.reconcile_ids: |
2166 | + move_line_ids += [line.id |
2167 | + for line |
2168 | + in reconcile.line_id] |
2169 | + result[history.id]['reconcile_line_ids'] = move_line_ids |
2170 | + |
2171 | + move_line_ids = [] |
2172 | + for reconcile in history.reconcile_partial_ids: |
2173 | + move_line_ids += [line.id |
2174 | + for line |
2175 | + in reconcile.line_partial_ids] |
2176 | + result[history.id]['partial_line_ids'] = move_line_ids |
2177 | + |
2178 | + return result |
2179 | + |
2180 | + _columns = { |
2181 | + 'easy_reconcile_id': fields.many2one( |
2182 | + 'account.easy.reconcile', 'Reconcile Profile', readonly=True), |
2183 | + 'date': fields.datetime('Run date', readonly=True), |
2184 | + 'reconcile_ids': fields.many2many( |
2185 | + 'account.move.reconcile', |
2186 | + 'account_move_reconcile_history_rel', |
2187 | + string='Reconciliations', readonly=True), |
2188 | + 'reconcile_partial_ids': fields.many2many( |
2189 | + 'account.move.reconcile', |
2190 | + 'account_move_reconcile_history_partial_rel', |
2191 | + string='Partial Reconciliations', readonly=True), |
2192 | + 'reconcile_line_ids': |
2193 | + fields.function( |
2194 | + _reconcile_line_ids, |
2195 | + string='Reconciled Items', |
2196 | + type='many2many', |
2197 | + relation='account.move.line', |
2198 | + readonly=True, |
2199 | + multi='lines'), |
2200 | + 'partial_line_ids': |
2201 | + fields.function( |
2202 | + _reconcile_line_ids, |
2203 | + string='Partially Reconciled Items', |
2204 | + type='many2many', |
2205 | + relation='account.move.line', |
2206 | + readonly=True, |
2207 | + multi='lines'), |
2208 | + 'company_id': fields.related('easy_reconcile_id','company_id', |
2209 | + relation='res.company', |
2210 | + type='many2one', |
2211 | + string='Company', |
2212 | + store=True, |
2213 | + readonly=True), |
2214 | + |
2215 | + } |
2216 | + |
2217 | + def _open_move_lines(self, cr, uid, history_id, rec_type='full', context=None): |
2218 | + """ For an history record, open the view of move line with |
2219 | + the reconciled or partially reconciled move lines |
2220 | + |
2221 | + :param history_id: id of the history |
2222 | + :param rec_type: 'full' or 'partial' |
2223 | + :return: action to open the move lines |
2224 | + """ |
2225 | + assert rec_type in ('full', 'partial'), \ |
2226 | + "rec_type must be 'full' or 'partial'" |
2227 | + |
2228 | + history = self.browse(cr, uid, history_id, context=context) |
2229 | + |
2230 | + if rec_type == 'full': |
2231 | + field = 'reconcile_line_ids' |
2232 | + name = _('Reconciliations') |
2233 | + else: |
2234 | + field = 'partial_line_ids' |
2235 | + name = _('Partial Reconciliations') |
2236 | + |
2237 | + move_line_ids = [line.id for line in getattr(history, field)] |
2238 | + |
2239 | + return { |
2240 | + 'name': name, |
2241 | + 'view_mode': 'tree,form', |
2242 | + 'view_id': False, |
2243 | + 'view_type': 'form', |
2244 | + 'res_model': 'account.move.line', |
2245 | + 'type': 'ir.actions.act_window', |
2246 | + 'nodestroy': True, |
2247 | + 'target': 'current', |
2248 | + 'domain': unicode([('id', 'in', move_line_ids)]), |
2249 | + } |
2250 | + |
2251 | + def open_reconcile(self, cr, uid, history_ids, context=None): |
2252 | + """ For an history record, open the view of move line |
2253 | + with the reconciled move lines |
2254 | + |
2255 | + :param history_ids: id of the record as int or long |
2256 | + Accept a list with 1 id too to be |
2257 | + used from the client. |
2258 | + """ |
2259 | + if isinstance(history_ids, (tuple, list)): |
2260 | + assert len(history_ids) == 1, "only 1 ID is accepted" |
2261 | + history_ids = history_ids[0] |
2262 | + return self._open_move_lines( |
2263 | + cr, uid, history_ids, rec_type='full', context=None) |
2264 | + |
2265 | + def open_partial(self, cr, uid, history_ids, context=None): |
2266 | + """ For an history record, open the view of move line |
2267 | + with the partially reconciled move lines |
2268 | + |
2269 | + :param history_ids: id of the record as int or long |
2270 | + Accept a list with 1 id too to be |
2271 | + used from the client. |
2272 | + """ |
2273 | + if isinstance(history_ids, (tuple, list)): |
2274 | + assert len(history_ids) == 1, "only 1 ID is accepted" |
2275 | + history_ids = history_ids[0] |
2276 | + return self._open_move_lines( |
2277 | + cr, uid, history_ids, rec_type='partial', context=None) |
2278 | |
2279 | === added file 'account_easy_reconcile/easy_reconcile_history_view.xml' |
2280 | --- account_easy_reconcile/easy_reconcile_history_view.xml 1970-01-01 00:00:00 +0000 |
2281 | +++ account_easy_reconcile/easy_reconcile_history_view.xml 2014-04-03 07:40:14 +0000 |
2282 | @@ -0,0 +1,98 @@ |
2283 | +<?xml version="1.0" encoding="utf-8"?> |
2284 | +<openerp> |
2285 | + <data noupdate="0"> |
2286 | + |
2287 | + <record id="view_easy_reconcile_history_search" model="ir.ui.view"> |
2288 | + <field name="name">easy.reconcile.history.search</field> |
2289 | + <field name="model">easy.reconcile.history</field> |
2290 | + <field name="arch" type="xml"> |
2291 | + <search string="Automatic Easy Reconcile History"> |
2292 | + <filter icon="terp-go-today" string="Today" |
2293 | + domain="[('date','<', time.strftime('%%Y-%%m-%%d 23:59:59')), ('date','>=', time.strftime('%%Y-%%m-%%d 00:00:00'))]" |
2294 | + help="Todays' Reconcilations" /> |
2295 | + <filter icon="terp-go-week" string="7 Days" |
2296 | + help="Reconciliations of last 7 days" |
2297 | + domain="[('date','<', time.strftime('%%Y-%%m-%%d 23:59:59')),('date','>=',(datetime.date.today()-datetime.timedelta(days=7)).strftime('%%Y-%%m-%%d 00:00:00'))]" |
2298 | + /> |
2299 | + |
2300 | + <separator orientation="vertical"/> |
2301 | + <field name="easy_reconcile_id"/> |
2302 | + <field name="date"/> |
2303 | + |
2304 | + <newline/> |
2305 | + <group expand="0" string="Group By..."> |
2306 | + <filter string="Reconciliation Profile" |
2307 | + icon="terp-stock_effects-object-colorize" |
2308 | + domain="[]" context="{'group_by': 'easy_reconcile_id'}"/> |
2309 | + <filter string="Date" icon="terp-go-month" domain="[]" |
2310 | + context="{'group_by': 'date'}"/> |
2311 | + </group> |
2312 | + </search> |
2313 | + </field> |
2314 | + </record> |
2315 | + |
2316 | + <record id="easy_reconcile_history_form" model="ir.ui.view"> |
2317 | + <field name="name">easy.reconcile.history.form</field> |
2318 | + <field name="model">easy.reconcile.history</field> |
2319 | + <field name="arch" type="xml"> |
2320 | + <form string="Automatic Easy Reconcile History" version="7.0"> |
2321 | + <header> |
2322 | + <button name="open_reconcile" |
2323 | + string="Go to reconciled items" |
2324 | + icon="STOCK_JUMP_TO" type="object"/> |
2325 | + <button name="open_partial" |
2326 | + string="Go to partially reconciled items" |
2327 | + icon="STOCK_JUMP_TO" type="object"/> |
2328 | + </header> |
2329 | + <sheet> |
2330 | + <group> |
2331 | + <field name="easy_reconcile_id"/> |
2332 | + <field name="date"/> |
2333 | + <field name="company_id" groups="base.group_multi_company"/> |
2334 | + </group> |
2335 | + <group col="2"> |
2336 | + <separator colspan="2" string="Reconciliations"/> |
2337 | + <field name="reconcile_ids" nolabel="1"/> |
2338 | + </group> |
2339 | + <group col="2"> |
2340 | + <separator colspan="2" string="Partial Reconciliations"/> |
2341 | + <field name="reconcile_partial_ids" nolabel="1"/> |
2342 | + </group> |
2343 | + </sheet> |
2344 | + </form> |
2345 | + </field> |
2346 | + </record> |
2347 | + |
2348 | + <record id="easy_reconcile_history_tree" model="ir.ui.view"> |
2349 | + <field name="name">easy.reconcile.history.tree</field> |
2350 | + <field name="model">easy.reconcile.history</field> |
2351 | + <field name="arch" type="xml"> |
2352 | + <tree string="Automatic Easy Reconcile History"> |
2353 | + <field name="easy_reconcile_id"/> |
2354 | + <field name="date"/> |
2355 | + <button icon="STOCK_JUMP_TO" name="open_reconcile" |
2356 | + string="Go to reconciled items" type="object"/> |
2357 | + <button icon="STOCK_JUMP_TO" name="open_partial" |
2358 | + string="Go to partially reconciled items" type="object"/> |
2359 | + </tree> |
2360 | + </field> |
2361 | + </record> |
2362 | + |
2363 | + <record id="action_easy_reconcile_history" model="ir.actions.act_window"> |
2364 | + <field name="name">Easy Automatic Reconcile History</field> |
2365 | + <field name="type">ir.actions.act_window</field> |
2366 | + <field name="res_model">easy.reconcile.history</field> |
2367 | + <field name="view_type">form</field> |
2368 | + <field name="view_mode">tree,form</field> |
2369 | + </record> |
2370 | + |
2371 | + <act_window |
2372 | + context="{'search_default_easy_reconcile_id': [active_id], 'default_easy_reconcile_id': active_id}" |
2373 | + id="act_easy_reconcile_to_history" |
2374 | + name="History Details" |
2375 | + groups="" |
2376 | + res_model="easy.reconcile.history" |
2377 | + src_model="account.easy.reconcile"/> |
2378 | + |
2379 | + </data> |
2380 | +</openerp> |
2381 | |
2382 | === added directory 'account_easy_reconcile/i18n' |
2383 | === added file 'account_easy_reconcile/i18n/account_easy_reconcile.pot' |
2384 | --- account_easy_reconcile/i18n/account_easy_reconcile.pot 1970-01-01 00:00:00 +0000 |
2385 | +++ account_easy_reconcile/i18n/account_easy_reconcile.pot 2014-04-03 07:40:14 +0000 |
2386 | @@ -0,0 +1,406 @@ |
2387 | +# Translation of OpenERP Server. |
2388 | +# This file contains the translation of the following modules: |
2389 | +# * account_easy_reconcile |
2390 | +# |
2391 | +msgid "" |
2392 | +msgstr "" |
2393 | +"Project-Id-Version: OpenERP Server 7.0\n" |
2394 | +"Report-Msgid-Bugs-To: \n" |
2395 | +"POT-Creation-Date: 2014-01-21 11:55+0000\n" |
2396 | +"PO-Revision-Date: 2014-01-21 11:55+0000\n" |
2397 | +"Last-Translator: <>\n" |
2398 | +"Language-Team: \n" |
2399 | +"MIME-Version: 1.0\n" |
2400 | +"Content-Type: text/plain; charset=UTF-8\n" |
2401 | +"Content-Transfer-Encoding: \n" |
2402 | +"Plural-Forms: \n" |
2403 | + |
2404 | +#. module: account_easy_reconcile |
2405 | +#: code:addons/account_easy_reconcile/easy_reconcile_history.py:108 |
2406 | +#: view:easy.reconcile.history:0 |
2407 | +#: field:easy.reconcile.history,reconcile_ids:0 |
2408 | +#, python-format |
2409 | +msgid "Reconciliations" |
2410 | +msgstr "" |
2411 | + |
2412 | +#. module: account_easy_reconcile |
2413 | +#: view:account.easy.reconcile:0 |
2414 | +#: view:easy.reconcile.history:0 |
2415 | +msgid "Automatic Easy Reconcile History" |
2416 | +msgstr "" |
2417 | + |
2418 | +#. module: account_easy_reconcile |
2419 | +#: view:account.easy.reconcile:0 |
2420 | +msgid "Information" |
2421 | +msgstr "" |
2422 | + |
2423 | +#. module: account_easy_reconcile |
2424 | +#: view:account.easy.reconcile:0 |
2425 | +#: view:easy.reconcile.history:0 |
2426 | +msgid "Go to partially reconciled items" |
2427 | +msgstr "" |
2428 | + |
2429 | +#. module: account_easy_reconcile |
2430 | +#: help:account.easy.reconcile.method,sequence:0 |
2431 | +msgid "The sequence field is used to order the reconcile method" |
2432 | +msgstr "" |
2433 | + |
2434 | +#. module: account_easy_reconcile |
2435 | +#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_history |
2436 | +msgid "easy.reconcile.history" |
2437 | +msgstr "" |
2438 | + |
2439 | +#. module: account_easy_reconcile |
2440 | +#: model:ir.actions.act_window,help:account_easy_reconcile.action_account_easy_reconcile |
2441 | +msgid "<p class=\"oe_view_nocontent_create\">\n" |
2442 | +" Click to add a reconciliation profile.\n" |
2443 | +" </p><p>\n" |
2444 | +" A reconciliation profile specifies, for one account, how\n" |
2445 | +" the entries should be reconciled.\n" |
2446 | +" You can select one or many reconciliation methods which will\n" |
2447 | +" be run sequentially to match the entries between them.\n" |
2448 | +" </p>\n" |
2449 | +" " |
2450 | +msgstr "" |
2451 | + |
2452 | +#. module: account_easy_reconcile |
2453 | +#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_options |
2454 | +msgid "easy.reconcile.options" |
2455 | +msgstr "" |
2456 | + |
2457 | +#. module: account_easy_reconcile |
2458 | +#: view:easy.reconcile.history:0 |
2459 | +msgid "Group By..." |
2460 | +msgstr "" |
2461 | + |
2462 | +#. module: account_easy_reconcile |
2463 | +#: field:account.easy.reconcile,unreconciled_count:0 |
2464 | +msgid "Unreconciled Items" |
2465 | +msgstr "" |
2466 | + |
2467 | +#. module: account_easy_reconcile |
2468 | +#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_base |
2469 | +msgid "easy.reconcile.base" |
2470 | +msgstr "" |
2471 | + |
2472 | +#. module: account_easy_reconcile |
2473 | +#: field:easy.reconcile.history,reconcile_line_ids:0 |
2474 | +msgid "Reconciled Items" |
2475 | +msgstr "" |
2476 | + |
2477 | +#. module: account_easy_reconcile |
2478 | +#: field:account.easy.reconcile,reconcile_method:0 |
2479 | +msgid "Method" |
2480 | +msgstr "" |
2481 | + |
2482 | +#. module: account_easy_reconcile |
2483 | +#: view:easy.reconcile.history:0 |
2484 | +msgid "7 Days" |
2485 | +msgstr "" |
2486 | + |
2487 | +#. module: account_easy_reconcile |
2488 | +#: model:ir.actions.act_window,name:account_easy_reconcile.action_easy_reconcile_history |
2489 | +msgid "Easy Automatic Reconcile History" |
2490 | +msgstr "" |
2491 | + |
2492 | +#. module: account_easy_reconcile |
2493 | +#: field:easy.reconcile.history,date:0 |
2494 | +msgid "Run date" |
2495 | +msgstr "" |
2496 | + |
2497 | +#. module: account_easy_reconcile |
2498 | +#: view:account.easy.reconcile:0 |
2499 | +msgid "Match one debit line vs one credit line. Do not allow partial reconciliation. The lines should have the same amount (with the write-off) and the same reference to be reconciled." |
2500 | +msgstr "" |
2501 | + |
2502 | +#. module: account_easy_reconcile |
2503 | +#: model:ir.actions.act_window,name:account_easy_reconcile.act_easy_reconcile_to_history |
2504 | +msgid "History Details" |
2505 | +msgstr "" |
2506 | + |
2507 | +#. module: account_easy_reconcile |
2508 | +#: view:account.easy.reconcile:0 |
2509 | +msgid "Display items reconciled on the last run" |
2510 | +msgstr "" |
2511 | + |
2512 | +#. module: account_easy_reconcile |
2513 | +#: field:account.easy.reconcile.method,name:0 |
2514 | +msgid "Type" |
2515 | +msgstr "" |
2516 | + |
2517 | +#. module: account_easy_reconcile |
2518 | +#: field:account.easy.reconcile,company_id:0 |
2519 | +#: field:account.easy.reconcile.method,company_id:0 |
2520 | +#: field:easy.reconcile.history,company_id:0 |
2521 | +msgid "Company" |
2522 | +msgstr "" |
2523 | + |
2524 | +#. module: account_easy_reconcile |
2525 | +#: field:account.easy.reconcile.method,account_profit_id:0 |
2526 | +#: field:easy.reconcile.base,account_profit_id:0 |
2527 | +#: field:easy.reconcile.options,account_profit_id:0 |
2528 | +#: field:easy.reconcile.simple,account_profit_id:0 |
2529 | +#: field:easy.reconcile.simple.name,account_profit_id:0 |
2530 | +#: field:easy.reconcile.simple.partner,account_profit_id:0 |
2531 | +#: field:easy.reconcile.simple.reference,account_profit_id:0 |
2532 | +msgid "Account Profit" |
2533 | +msgstr "" |
2534 | + |
2535 | +#. module: account_easy_reconcile |
2536 | +#: view:easy.reconcile.history:0 |
2537 | +msgid "Todays' Reconcilations" |
2538 | +msgstr "" |
2539 | + |
2540 | +#. module: account_easy_reconcile |
2541 | +#: view:account.easy.reconcile:0 |
2542 | +msgid "Simple. Amount and Name" |
2543 | +msgstr "" |
2544 | + |
2545 | +#. module: account_easy_reconcile |
2546 | +#: field:easy.reconcile.base,partner_ids:0 |
2547 | +#: field:easy.reconcile.simple,partner_ids:0 |
2548 | +#: field:easy.reconcile.simple.name,partner_ids:0 |
2549 | +#: field:easy.reconcile.simple.partner,partner_ids:0 |
2550 | +#: field:easy.reconcile.simple.reference,partner_ids:0 |
2551 | +msgid "Restrict on partners" |
2552 | +msgstr "" |
2553 | + |
2554 | +#. module: account_easy_reconcile |
2555 | +#: model:ir.actions.act_window,name:account_easy_reconcile.action_account_easy_reconcile |
2556 | +#: model:ir.ui.menu,name:account_easy_reconcile.menu_easy_reconcile |
2557 | +msgid "Easy Automatic Reconcile" |
2558 | +msgstr "" |
2559 | + |
2560 | +#. module: account_easy_reconcile |
2561 | +#: view:easy.reconcile.history:0 |
2562 | +msgid "Today" |
2563 | +msgstr "" |
2564 | + |
2565 | +#. module: account_easy_reconcile |
2566 | +#: view:easy.reconcile.history:0 |
2567 | +msgid "Date" |
2568 | +msgstr "" |
2569 | + |
2570 | +#. module: account_easy_reconcile |
2571 | +#: field:account.easy.reconcile,last_history:0 |
2572 | +msgid "Last History" |
2573 | +msgstr "" |
2574 | + |
2575 | +#. module: account_easy_reconcile |
2576 | +#: view:account.easy.reconcile:0 |
2577 | +msgid "Configuration" |
2578 | +msgstr "" |
2579 | + |
2580 | +#. module: account_easy_reconcile |
2581 | +#: field:account.easy.reconcile,reconciled_partial_count:0 |
2582 | +#: field:easy.reconcile.history,partial_line_ids:0 |
2583 | +msgid "Partially Reconciled Items" |
2584 | +msgstr "" |
2585 | + |
2586 | +#. module: account_easy_reconcile |
2587 | +#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_simple_partner |
2588 | +msgid "easy.reconcile.simple.partner" |
2589 | +msgstr "" |
2590 | + |
2591 | +#. module: account_easy_reconcile |
2592 | +#: field:account.easy.reconcile.method,write_off:0 |
2593 | +#: field:easy.reconcile.base,write_off:0 |
2594 | +#: field:easy.reconcile.options,write_off:0 |
2595 | +#: field:easy.reconcile.simple,write_off:0 |
2596 | +#: field:easy.reconcile.simple.name,write_off:0 |
2597 | +#: field:easy.reconcile.simple.partner,write_off:0 |
2598 | +#: field:easy.reconcile.simple.reference,write_off:0 |
2599 | +msgid "Write off allowed" |
2600 | +msgstr "" |
2601 | + |
2602 | +#. module: account_easy_reconcile |
2603 | +#: view:account.easy.reconcile:0 |
2604 | +msgid "Automatic Easy Reconcile" |
2605 | +msgstr "" |
2606 | + |
2607 | +#. module: account_easy_reconcile |
2608 | +#: field:account.easy.reconcile,account:0 |
2609 | +#: field:easy.reconcile.base,account_id:0 |
2610 | +#: field:easy.reconcile.simple,account_id:0 |
2611 | +#: field:easy.reconcile.simple.name,account_id:0 |
2612 | +#: field:easy.reconcile.simple.partner,account_id:0 |
2613 | +#: field:easy.reconcile.simple.reference,account_id:0 |
2614 | +msgid "Account" |
2615 | +msgstr "" |
2616 | + |
2617 | +#. module: account_easy_reconcile |
2618 | +#: field:account.easy.reconcile.method,task_id:0 |
2619 | +msgid "Task" |
2620 | +msgstr "" |
2621 | + |
2622 | +#. module: account_easy_reconcile |
2623 | +#: field:account.easy.reconcile,name:0 |
2624 | +msgid "Name" |
2625 | +msgstr "" |
2626 | + |
2627 | +#. module: account_easy_reconcile |
2628 | +#: view:account.easy.reconcile:0 |
2629 | +msgid "Simple. Amount and Partner" |
2630 | +msgstr "" |
2631 | + |
2632 | +#. module: account_easy_reconcile |
2633 | +#: view:account.easy.reconcile:0 |
2634 | +msgid "Start Auto Reconcilation" |
2635 | +msgstr "" |
2636 | + |
2637 | +#. module: account_easy_reconcile |
2638 | +#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_simple_name |
2639 | +msgid "easy.reconcile.simple.name" |
2640 | +msgstr "" |
2641 | + |
2642 | +#. module: account_easy_reconcile |
2643 | +#: field:account.easy.reconcile.method,filter:0 |
2644 | +#: field:easy.reconcile.base,filter:0 |
2645 | +#: field:easy.reconcile.options,filter:0 |
2646 | +#: field:easy.reconcile.simple,filter:0 |
2647 | +#: field:easy.reconcile.simple.name,filter:0 |
2648 | +#: field:easy.reconcile.simple.partner,filter:0 |
2649 | +#: field:easy.reconcile.simple.reference,filter:0 |
2650 | +msgid "Filter" |
2651 | +msgstr "" |
2652 | + |
2653 | +#. module: account_easy_reconcile |
2654 | +#: view:account.easy.reconcile:0 |
2655 | +msgid "Match one debit line vs one credit line. Do not allow partial reconciliation. The lines should have the same amount (with the write-off) and the same partner to be reconciled." |
2656 | +msgstr "" |
2657 | + |
2658 | +#. module: account_easy_reconcile |
2659 | +#: field:easy.reconcile.history,easy_reconcile_id:0 |
2660 | +msgid "Reconcile Profile" |
2661 | +msgstr "" |
2662 | + |
2663 | +#. module: account_easy_reconcile |
2664 | +#: model:ir.model,name:account_easy_reconcile.model_account_easy_reconcile_method |
2665 | +msgid "reconcile method for account_easy_reconcile" |
2666 | +msgstr "" |
2667 | + |
2668 | +#. module: account_easy_reconcile |
2669 | +#: view:account.easy.reconcile:0 |
2670 | +msgid "Start Auto Reconciliation" |
2671 | +msgstr "" |
2672 | + |
2673 | +#. module: account_easy_reconcile |
2674 | +#: code:addons/account_easy_reconcile/easy_reconcile.py:257 |
2675 | +#, python-format |
2676 | +msgid "Error" |
2677 | +msgstr "" |
2678 | + |
2679 | +#. module: account_easy_reconcile |
2680 | +#: code:addons/account_easy_reconcile/easy_reconcile.py:258 |
2681 | +#, python-format |
2682 | +msgid "There is no history of reconciled items on the task: %s." |
2683 | +msgstr "" |
2684 | + |
2685 | +#. module: account_easy_reconcile |
2686 | +#: view:account.easy.reconcile:0 |
2687 | +msgid "Match one debit line vs one credit line. Do not allow partial reconciliation. The lines should have the same amount (with the write-off) and the same name to be reconciled." |
2688 | +msgstr "" |
2689 | + |
2690 | +#. module: account_easy_reconcile |
2691 | +#: field:account.easy.reconcile.method,account_lost_id:0 |
2692 | +#: field:easy.reconcile.base,account_lost_id:0 |
2693 | +#: field:easy.reconcile.options,account_lost_id:0 |
2694 | +#: field:easy.reconcile.simple,account_lost_id:0 |
2695 | +#: field:easy.reconcile.simple.name,account_lost_id:0 |
2696 | +#: field:easy.reconcile.simple.partner,account_lost_id:0 |
2697 | +#: field:easy.reconcile.simple.reference,account_lost_id:0 |
2698 | +msgid "Account Lost" |
2699 | +msgstr "" |
2700 | + |
2701 | +#. module: account_easy_reconcile |
2702 | +#: view:easy.reconcile.history:0 |
2703 | +msgid "Reconciliation Profile" |
2704 | +msgstr "" |
2705 | + |
2706 | +#. module: account_easy_reconcile |
2707 | +#: view:account.easy.reconcile:0 |
2708 | +#: field:account.easy.reconcile,history_ids:0 |
2709 | +msgid "History" |
2710 | +msgstr "" |
2711 | + |
2712 | +#. module: account_easy_reconcile |
2713 | +#: view:account.easy.reconcile:0 |
2714 | +#: view:easy.reconcile.history:0 |
2715 | +msgid "Go to reconciled items" |
2716 | +msgstr "" |
2717 | + |
2718 | +#. module: account_easy_reconcile |
2719 | +#: view:account.easy.reconcile:0 |
2720 | +msgid "Profile Information" |
2721 | +msgstr "" |
2722 | + |
2723 | +#. module: account_easy_reconcile |
2724 | +#: view:account.easy.reconcile.method:0 |
2725 | +msgid "Automatic Easy Reconcile Method" |
2726 | +msgstr "" |
2727 | + |
2728 | +#. module: account_easy_reconcile |
2729 | +#: view:account.easy.reconcile:0 |
2730 | +msgid "Simple. Amount and Reference" |
2731 | +msgstr "" |
2732 | + |
2733 | +#. module: account_easy_reconcile |
2734 | +#: view:account.easy.reconcile:0 |
2735 | +msgid "Display items partially reconciled on the last run" |
2736 | +msgstr "" |
2737 | + |
2738 | +#. module: account_easy_reconcile |
2739 | +#: field:account.easy.reconcile.method,sequence:0 |
2740 | +msgid "Sequence" |
2741 | +msgstr "" |
2742 | + |
2743 | +#. module: account_easy_reconcile |
2744 | +#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_simple |
2745 | +msgid "easy.reconcile.simple" |
2746 | +msgstr "" |
2747 | + |
2748 | +#. module: account_easy_reconcile |
2749 | +#: view:easy.reconcile.history:0 |
2750 | +msgid "Reconciliations of last 7 days" |
2751 | +msgstr "" |
2752 | + |
2753 | +#. module: account_easy_reconcile |
2754 | +#: field:account.easy.reconcile.method,date_base_on:0 |
2755 | +#: field:easy.reconcile.base,date_base_on:0 |
2756 | +#: field:easy.reconcile.options,date_base_on:0 |
2757 | +#: field:easy.reconcile.simple,date_base_on:0 |
2758 | +#: field:easy.reconcile.simple.name,date_base_on:0 |
2759 | +#: field:easy.reconcile.simple.partner,date_base_on:0 |
2760 | +#: field:easy.reconcile.simple.reference,date_base_on:0 |
2761 | +msgid "Date of reconciliation" |
2762 | +msgstr "" |
2763 | + |
2764 | +#. module: account_easy_reconcile |
2765 | +#: code:addons/account_easy_reconcile/easy_reconcile_history.py:111 |
2766 | +#: view:easy.reconcile.history:0 |
2767 | +#: field:easy.reconcile.history,reconcile_partial_ids:0 |
2768 | +#, python-format |
2769 | +msgid "Partial Reconciliations" |
2770 | +msgstr "" |
2771 | + |
2772 | +#. module: account_easy_reconcile |
2773 | +#: field:account.easy.reconcile.method,journal_id:0 |
2774 | +#: field:easy.reconcile.base,journal_id:0 |
2775 | +#: field:easy.reconcile.options,journal_id:0 |
2776 | +#: field:easy.reconcile.simple,journal_id:0 |
2777 | +#: field:easy.reconcile.simple.name,journal_id:0 |
2778 | +#: field:easy.reconcile.simple.partner,journal_id:0 |
2779 | +#: field:easy.reconcile.simple.reference,journal_id:0 |
2780 | +msgid "Journal" |
2781 | +msgstr "" |
2782 | + |
2783 | +#. module: account_easy_reconcile |
2784 | +#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_simple_reference |
2785 | +msgid "easy.reconcile.simple.reference" |
2786 | +msgstr "" |
2787 | + |
2788 | +#. module: account_easy_reconcile |
2789 | +#: model:ir.model,name:account_easy_reconcile.model_account_easy_reconcile |
2790 | +msgid "account easy reconcile" |
2791 | +msgstr "" |
2792 | + |
2793 | |
2794 | === added file 'account_easy_reconcile/i18n/es.po' |
2795 | --- account_easy_reconcile/i18n/es.po 1970-01-01 00:00:00 +0000 |
2796 | +++ account_easy_reconcile/i18n/es.po 2014-04-03 07:40:14 +0000 |
2797 | @@ -0,0 +1,415 @@ |
2798 | +# Spanish translation for banking-addons |
2799 | +# Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 |
2800 | +# This file is distributed under the same license as the banking-addons package. |
2801 | +# FIRST AUTHOR <EMAIL@ADDRESS>, 2014. |
2802 | +# |
2803 | +msgid "" |
2804 | +msgstr "" |
2805 | +"Project-Id-Version: banking-addons\n" |
2806 | +"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" |
2807 | +"POT-Creation-Date: 2014-01-21 11:55+0000\n" |
2808 | +"PO-Revision-Date: 2014-04-02 21:56+0000\n" |
2809 | +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" |
2810 | +"Language-Team: Spanish <es@li.org>\n" |
2811 | +"MIME-Version: 1.0\n" |
2812 | +"Content-Type: text/plain; charset=UTF-8\n" |
2813 | +"Content-Transfer-Encoding: 8bit\n" |
2814 | +"X-Launchpad-Export-Date: 2014-04-03 06:06+0000\n" |
2815 | +"X-Generator: Launchpad (build 16967)\n" |
2816 | + |
2817 | +#. module: account_easy_reconcile |
2818 | +#: code:addons/account_easy_reconcile/easy_reconcile_history.py:101 |
2819 | +#: field:easy.reconcile.history,reconcile_ids:0 |
2820 | +#, python-format |
2821 | +msgid "Reconciliations" |
2822 | +msgstr "Conciliaciones" |
2823 | + |
2824 | +#. module: account_easy_reconcile |
2825 | +#: view:account.easy.reconcile:0 |
2826 | +#: view:easy.reconcile.history:0 |
2827 | +msgid "Automatic Easy Reconcile History" |
2828 | +msgstr "Historial de conciliación automática sencilla" |
2829 | + |
2830 | +#. module: account_easy_reconcile |
2831 | +#: view:account.easy.reconcile:0 |
2832 | +msgid "Information" |
2833 | +msgstr "Información" |
2834 | + |
2835 | +#. module: account_easy_reconcile |
2836 | +#: view:account.easy.reconcile:0 |
2837 | +#: view:easy.reconcile.history:0 |
2838 | +msgid "Go to partially reconciled items" |
2839 | +msgstr "Ir a los elementos parcialmente conciliados" |
2840 | + |
2841 | +#. module: account_easy_reconcile |
2842 | +#: help:account.easy.reconcile.method,sequence:0 |
2843 | +msgid "The sequence field is used to order the reconcile method" |
2844 | +msgstr "" |
2845 | +"El campo de secuencia se usa para ordenar los métodos de conciliación" |
2846 | + |
2847 | +#. module: account_easy_reconcile |
2848 | +#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_history |
2849 | +msgid "easy.reconcile.history" |
2850 | +msgstr "easy.reconcile.history" |
2851 | + |
2852 | +#. module: account_easy_reconcile |
2853 | +#: model:ir.actions.act_window,help:account_easy_reconcile.action_account_easy_reconcile |
2854 | +msgid "" |
2855 | +"<p class=\"oe_view_nocontent_create\">\n" |
2856 | +" Click to add a reconciliation profile.\n" |
2857 | +" </p><p>\n" |
2858 | +" A reconciliation profile specifies, for one account, how\n" |
2859 | +" the entries should be reconciled.\n" |
2860 | +" You can select one or many reconciliation methods which will\n" |
2861 | +" be run sequentially to match the entries between them.\n" |
2862 | +" </p>\n" |
2863 | +" " |
2864 | +msgstr "" |
2865 | + |
2866 | +#. module: account_easy_reconcile |
2867 | +#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_options |
2868 | +msgid "easy.reconcile.options" |
2869 | +msgstr "easy.reconcile.options" |
2870 | + |
2871 | +#. module: account_easy_reconcile |
2872 | +#: view:easy.reconcile.history:0 |
2873 | +msgid "Group By..." |
2874 | +msgstr "Agrupar por..." |
2875 | + |
2876 | +#. module: account_easy_reconcile |
2877 | +#: field:account.easy.reconcile,unreconciled_count:0 |
2878 | +msgid "Unreconciled Items" |
2879 | +msgstr "" |
2880 | + |
2881 | +#. module: account_easy_reconcile |
2882 | +#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_base |
2883 | +msgid "easy.reconcile.base" |
2884 | +msgstr "easy.reconcile.base" |
2885 | + |
2886 | +#. module: account_easy_reconcile |
2887 | +#: field:easy.reconcile.history,reconcile_line_ids:0 |
2888 | +msgid "Reconciled Items" |
2889 | +msgstr "Elementos conciliados" |
2890 | + |
2891 | +#. module: account_easy_reconcile |
2892 | +#: field:account.easy.reconcile,reconcile_method:0 |
2893 | +msgid "Method" |
2894 | +msgstr "Método" |
2895 | + |
2896 | +#. module: account_easy_reconcile |
2897 | +#: view:easy.reconcile.history:0 |
2898 | +msgid "7 Days" |
2899 | +msgstr "7 días" |
2900 | + |
2901 | +#. module: account_easy_reconcile |
2902 | +#: model:ir.actions.act_window,name:account_easy_reconcile.action_easy_reconcile_history |
2903 | +msgid "Easy Automatic Reconcile History" |
2904 | +msgstr "Historial de la conciliación automática sencilla" |
2905 | + |
2906 | +#. module: account_easy_reconcile |
2907 | +#: field:easy.reconcile.history,date:0 |
2908 | +msgid "Run date" |
2909 | +msgstr "Fecha ejecucción" |
2910 | + |
2911 | +#. module: account_easy_reconcile |
2912 | +#: view:account.easy.reconcile:0 |
2913 | +msgid "" |
2914 | +"Match one debit line vs one credit line. Do not allow partial " |
2915 | +"reconciliation. The lines should have the same amount (with the write-off) " |
2916 | +"and the same reference to be reconciled." |
2917 | +msgstr "" |
2918 | + |
2919 | +#. module: account_easy_reconcile |
2920 | +#: model:ir.actions.act_window,name:account_easy_reconcile.act_easy_reconcile_to_history |
2921 | +msgid "History Details" |
2922 | +msgstr "Detalles del historial" |
2923 | + |
2924 | +#. module: account_easy_reconcile |
2925 | +#: view:account.easy.reconcile:0 |
2926 | +msgid "Display items reconciled on the last run" |
2927 | +msgstr "Mostrar elementos conciliados en la última ejecucción" |
2928 | + |
2929 | +#. module: account_easy_reconcile |
2930 | +#: field:account.easy.reconcile.method,name:0 |
2931 | +msgid "Type" |
2932 | +msgstr "Tipo" |
2933 | + |
2934 | +#. module: account_easy_reconcile |
2935 | +#: field:account.easy.reconcile,company_id:0 |
2936 | +#: field:account.easy.reconcile.method,company_id:0 |
2937 | +#: field:easy.reconcile.history,company_id:0 |
2938 | +msgid "Company" |
2939 | +msgstr "" |
2940 | + |
2941 | +#. module: account_easy_reconcile |
2942 | +#: field:account.easy.reconcile.method,account_profit_id:0 |
2943 | +#: field:easy.reconcile.base,account_profit_id:0 |
2944 | +#: field:easy.reconcile.options,account_profit_id:0 |
2945 | +#: field:easy.reconcile.simple,account_profit_id:0 |
2946 | +#: field:easy.reconcile.simple.name,account_profit_id:0 |
2947 | +#: field:easy.reconcile.simple.partner,account_profit_id:0 |
2948 | +#: field:easy.reconcile.simple.reference,account_profit_id:0 |
2949 | +msgid "Account Profit" |
2950 | +msgstr "Cuenta de ganancias" |
2951 | + |
2952 | +#. module: account_easy_reconcile |
2953 | +#: view:easy.reconcile.history:0 |
2954 | +msgid "Todays' Reconcilations" |
2955 | +msgstr "Conciliaciones de hoy" |
2956 | + |
2957 | +#. module: account_easy_reconcile |
2958 | +#: view:account.easy.reconcile:0 |
2959 | +msgid "Simple. Amount and Name" |
2960 | +msgstr "Simple. Cantidad y nombre" |
2961 | + |
2962 | +#. module: account_easy_reconcile |
2963 | +#: field:easy.reconcile.base,partner_ids:0 |
2964 | +#: field:easy.reconcile.simple,partner_ids:0 |
2965 | +#: field:easy.reconcile.simple.name,partner_ids:0 |
2966 | +#: field:easy.reconcile.simple.partner,partner_ids:0 |
2967 | +#: field:easy.reconcile.simple.reference,partner_ids:0 |
2968 | +msgid "Restrict on partners" |
2969 | +msgstr "Restringir en las empresas" |
2970 | + |
2971 | +#. module: account_easy_reconcile |
2972 | +#: model:ir.actions.act_window,name:account_easy_reconcile.action_account_easy_reconcile |
2973 | +#: model:ir.ui.menu,name:account_easy_reconcile.menu_easy_reconcile |
2974 | +msgid "Easy Automatic Reconcile" |
2975 | +msgstr "Conciliación automática simple" |
2976 | + |
2977 | +#. module: account_easy_reconcile |
2978 | +#: view:easy.reconcile.history:0 |
2979 | +msgid "Today" |
2980 | +msgstr "Hoy" |
2981 | + |
2982 | +#. module: account_easy_reconcile |
2983 | +#: view:easy.reconcile.history:0 |
2984 | +msgid "Date" |
2985 | +msgstr "Fecha" |
2986 | + |
2987 | +#. module: account_easy_reconcile |
2988 | +#: field:account.easy.reconcile,last_history:0 |
2989 | +msgid "Last History" |
2990 | +msgstr "Último historial" |
2991 | + |
2992 | +#. module: account_easy_reconcile |
2993 | +#: view:account.easy.reconcile:0 |
2994 | +msgid "Configuration" |
2995 | +msgstr "Configuración" |
2996 | + |
2997 | +#. module: account_easy_reconcile |
2998 | +#: field:easy.reconcile.history,partial_line_ids:0 |
2999 | +msgid "Partially Reconciled Items" |
3000 | +msgstr "Elementos parcialmente conciliados" |
3001 | + |
3002 | +#. module: account_easy_reconcile |
3003 | +#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_simple_partner |
3004 | +msgid "easy.reconcile.simple.partner" |
3005 | +msgstr "easy.reconcile.simple.partner" |
3006 | + |
3007 | +#. module: account_easy_reconcile |
3008 | +#: field:account.easy.reconcile.method,write_off:0 |
3009 | +#: field:easy.reconcile.base,write_off:0 |
3010 | +#: field:easy.reconcile.options,write_off:0 |
3011 | +#: field:easy.reconcile.simple,write_off:0 |
3012 | +#: field:easy.reconcile.simple.name,write_off:0 |
3013 | +#: field:easy.reconcile.simple.partner,write_off:0 |
3014 | +#: field:easy.reconcile.simple.reference,write_off:0 |
3015 | +msgid "Write off allowed" |
3016 | +msgstr "Desajuste permitido" |
3017 | + |
3018 | +#. module: account_easy_reconcile |
3019 | +#: view:account.easy.reconcile:0 |
3020 | +msgid "Automatic Easy Reconcile" |
3021 | +msgstr "Conciliación automática sencilla" |
3022 | + |
3023 | +#. module: account_easy_reconcile |
3024 | +#: field:account.easy.reconcile,account:0 |
3025 | +#: field:easy.reconcile.base,account_id:0 |
3026 | +#: field:easy.reconcile.simple,account_id:0 |
3027 | +#: field:easy.reconcile.simple.name,account_id:0 |
3028 | +#: field:easy.reconcile.simple.partner,account_id:0 |
3029 | +#: field:easy.reconcile.simple.reference,account_id:0 |
3030 | +msgid "Account" |
3031 | +msgstr "Cuenta" |
3032 | + |
3033 | +#. module: account_easy_reconcile |
3034 | +#: field:account.easy.reconcile.method,task_id:0 |
3035 | +msgid "Task" |
3036 | +msgstr "Tarea" |
3037 | + |
3038 | +#. module: account_easy_reconcile |
3039 | +#: field:account.easy.reconcile,name:0 |
3040 | +msgid "Name" |
3041 | +msgstr "Nombre" |
3042 | + |
3043 | +#. module: account_easy_reconcile |
3044 | +#: view:account.easy.reconcile:0 |
3045 | +msgid "Simple. Amount and Partner" |
3046 | +msgstr "" |
3047 | + |
3048 | +#. module: account_easy_reconcile |
3049 | +#: view:account.easy.reconcile:0 |
3050 | +msgid "Start Auto Reconcilation" |
3051 | +msgstr "Iniciar conciliación automática" |
3052 | + |
3053 | +#. module: account_easy_reconcile |
3054 | +#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_simple_name |
3055 | +msgid "easy.reconcile.simple.name" |
3056 | +msgstr "easy.reconcile.simple.name" |
3057 | + |
3058 | +#. module: account_easy_reconcile |
3059 | +#: field:account.easy.reconcile.method,filter:0 |
3060 | +#: field:easy.reconcile.base,filter:0 |
3061 | +#: field:easy.reconcile.options,filter:0 |
3062 | +#: field:easy.reconcile.simple,filter:0 |
3063 | +#: field:easy.reconcile.simple.name,filter:0 |
3064 | +#: field:easy.reconcile.simple.partner,filter:0 |
3065 | +#: field:easy.reconcile.simple.reference,filter:0 |
3066 | +msgid "Filter" |
3067 | +msgstr "Filtro" |
3068 | + |
3069 | +#. module: account_easy_reconcile |
3070 | +#: view:account.easy.reconcile:0 |
3071 | +msgid "" |
3072 | +"Match one debit line vs one credit line. Do not allow partial " |
3073 | +"reconciliation. The lines should have the same amount (with the write-off) " |
3074 | +"and the same partner to be reconciled." |
3075 | +msgstr "" |
3076 | + |
3077 | +#. module: account_easy_reconcile |
3078 | +#: field:easy.reconcile.history,easy_reconcile_id:0 |
3079 | +msgid "Reconcile Profile" |
3080 | +msgstr "Perfil de conciliación" |
3081 | + |
3082 | +#. module: account_easy_reconcile |
3083 | +#: model:ir.model,name:account_easy_reconcile.model_account_easy_reconcile_method |
3084 | +msgid "reconcile method for account_easy_reconcile" |
3085 | +msgstr "Método de conciliación para account_easy_reconcile" |
3086 | + |
3087 | +#. module: account_easy_reconcile |
3088 | +#: view:account.easy.reconcile:0 |
3089 | +msgid "Start Auto Reconciliation" |
3090 | +msgstr "" |
3091 | + |
3092 | +#. module: account_easy_reconcile |
3093 | +#: code:addons/account_easy_reconcile/easy_reconcile.py:233 |
3094 | +#, python-format |
3095 | +msgid "Error" |
3096 | +msgstr "Error" |
3097 | + |
3098 | +#. module: account_easy_reconcile |
3099 | +#: code:addons/account_easy_reconcile/easy_reconcile.py:258 |
3100 | +#, python-format |
3101 | +msgid "There is no history of reconciled items on the task: %s." |
3102 | +msgstr "" |
3103 | + |
3104 | +#. module: account_easy_reconcile |
3105 | +#: view:account.easy.reconcile:0 |
3106 | +msgid "" |
3107 | +"Match one debit line vs one credit line. Do not allow partial " |
3108 | +"reconciliation. The lines should have the same amount (with the write-off) " |
3109 | +"and the same name to be reconciled." |
3110 | +msgstr "" |
3111 | + |
3112 | +#. module: account_easy_reconcile |
3113 | +#: field:account.easy.reconcile.method,account_lost_id:0 |
3114 | +#: field:easy.reconcile.base,account_lost_id:0 |
3115 | +#: field:easy.reconcile.options,account_lost_id:0 |
3116 | +#: field:easy.reconcile.simple,account_lost_id:0 |
3117 | +#: field:easy.reconcile.simple.name,account_lost_id:0 |
3118 | +#: field:easy.reconcile.simple.partner,account_lost_id:0 |
3119 | +#: field:easy.reconcile.simple.reference,account_lost_id:0 |
3120 | +msgid "Account Lost" |
3121 | +msgstr "Cuenta de pérdidas" |
3122 | + |
3123 | +#. module: account_easy_reconcile |
3124 | +#: view:easy.reconcile.history:0 |
3125 | +msgid "Reconciliation Profile" |
3126 | +msgstr "Perfil de conciliación" |
3127 | + |
3128 | +#. module: account_easy_reconcile |
3129 | +#: view:account.easy.reconcile:0 |
3130 | +#: field:account.easy.reconcile,history_ids:0 |
3131 | +msgid "History" |
3132 | +msgstr "Historial" |
3133 | + |
3134 | +#. module: account_easy_reconcile |
3135 | +#: view:account.easy.reconcile:0 |
3136 | +#: view:easy.reconcile.history:0 |
3137 | +msgid "Go to reconciled items" |
3138 | +msgstr "Ir a los elementos conciliados" |
3139 | + |
3140 | +#. module: account_easy_reconcile |
3141 | +#: view:account.easy.reconcile:0 |
3142 | +msgid "Profile Information" |
3143 | +msgstr "" |
3144 | + |
3145 | +#. module: account_easy_reconcile |
3146 | +#: view:account.easy.reconcile.method:0 |
3147 | +msgid "Automatic Easy Reconcile Method" |
3148 | +msgstr "Método de conciliación automática sencilla" |
3149 | + |
3150 | +#. module: account_easy_reconcile |
3151 | +#: view:account.easy.reconcile:0 |
3152 | +msgid "Simple. Amount and Reference" |
3153 | +msgstr "" |
3154 | + |
3155 | +#. module: account_easy_reconcile |
3156 | +#: view:account.easy.reconcile:0 |
3157 | +msgid "Display items partially reconciled on the last run" |
3158 | +msgstr "Mostrar elementos conciliados parcialmente en la última ejecucción" |
3159 | + |
3160 | +#. module: account_easy_reconcile |
3161 | +#: field:account.easy.reconcile.method,sequence:0 |
3162 | +msgid "Sequence" |
3163 | +msgstr "Secuencia" |
3164 | + |
3165 | +#. module: account_easy_reconcile |
3166 | +#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_simple |
3167 | +msgid "easy.reconcile.simple" |
3168 | +msgstr "easy.reconcile.simple" |
3169 | + |
3170 | +#. module: account_easy_reconcile |
3171 | +#: view:easy.reconcile.history:0 |
3172 | +msgid "Reconciliations of last 7 days" |
3173 | +msgstr "Conciliaciones de los últimos 7 días" |
3174 | + |
3175 | +#. module: account_easy_reconcile |
3176 | +#: field:account.easy.reconcile.method,date_base_on:0 |
3177 | +#: field:easy.reconcile.base,date_base_on:0 |
3178 | +#: field:easy.reconcile.options,date_base_on:0 |
3179 | +#: field:easy.reconcile.simple,date_base_on:0 |
3180 | +#: field:easy.reconcile.simple.name,date_base_on:0 |
3181 | +#: field:easy.reconcile.simple.partner,date_base_on:0 |
3182 | +#: field:easy.reconcile.simple.reference,date_base_on:0 |
3183 | +msgid "Date of reconciliation" |
3184 | +msgstr "" |
3185 | + |
3186 | +#. module: account_easy_reconcile |
3187 | +#: code:addons/account_easy_reconcile/easy_reconcile_history.py:104 |
3188 | +#: field:easy.reconcile.history,reconcile_partial_ids:0 |
3189 | +#, python-format |
3190 | +msgid "Partial Reconciliations" |
3191 | +msgstr "Conciliaciones parciales" |
3192 | + |
3193 | +#. module: account_easy_reconcile |
3194 | +#: field:account.easy.reconcile.method,journal_id:0 |
3195 | +#: field:easy.reconcile.base,journal_id:0 |
3196 | +#: field:easy.reconcile.options,journal_id:0 |
3197 | +#: field:easy.reconcile.simple,journal_id:0 |
3198 | +#: field:easy.reconcile.simple.name,journal_id:0 |
3199 | +#: field:easy.reconcile.simple.partner,journal_id:0 |
3200 | +#: field:easy.reconcile.simple.reference,journal_id:0 |
3201 | +msgid "Journal" |
3202 | +msgstr "Diario" |
3203 | + |
3204 | +#. module: account_easy_reconcile |
3205 | +#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_simple_reference |
3206 | +msgid "easy.reconcile.simple.reference" |
3207 | +msgstr "easy.reconcile.simple.reference" |
3208 | + |
3209 | +#. module: account_easy_reconcile |
3210 | +#: model:ir.model,name:account_easy_reconcile.model_account_easy_reconcile |
3211 | +msgid "account easy reconcile" |
3212 | +msgstr "account easy reconcile" |
3213 | |
3214 | === added file 'account_easy_reconcile/i18n/fr.po' |
3215 | --- account_easy_reconcile/i18n/fr.po 1970-01-01 00:00:00 +0000 |
3216 | +++ account_easy_reconcile/i18n/fr.po 2014-04-03 07:40:14 +0000 |
3217 | @@ -0,0 +1,432 @@ |
3218 | +# Translation of OpenERP Server. |
3219 | +# This file contains the translation of the following modules: |
3220 | +# * account_easy_reconcile |
3221 | +# |
3222 | +msgid "" |
3223 | +msgstr "" |
3224 | +"Project-Id-Version: OpenERP Server 6.1\n" |
3225 | +"Report-Msgid-Bugs-To: \n" |
3226 | +"POT-Creation-Date: 2014-01-21 11:55+0000\n" |
3227 | +"PO-Revision-Date: 2014-03-21 15:25+0000\n" |
3228 | +"Last-Translator: Guewen Baconnier @ Camptocamp <Unknown>\n" |
3229 | +"Language-Team: \n" |
3230 | +"MIME-Version: 1.0\n" |
3231 | +"Content-Type: text/plain; charset=UTF-8\n" |
3232 | +"Content-Transfer-Encoding: 8bit\n" |
3233 | +"X-Launchpad-Export-Date: 2014-03-22 07:11+0000\n" |
3234 | +"X-Generator: Launchpad (build 16967)\n" |
3235 | +"Language: \n" |
3236 | + |
3237 | +#. module: account_easy_reconcile |
3238 | +#: code:addons/account_easy_reconcile/easy_reconcile_history.py:108 |
3239 | +#: view:easy.reconcile.history:0 |
3240 | +#: field:easy.reconcile.history,reconcile_ids:0 |
3241 | +#, python-format |
3242 | +msgid "Reconciliations" |
3243 | +msgstr "Lettrages" |
3244 | + |
3245 | +#. module: account_easy_reconcile |
3246 | +#: view:account.easy.reconcile:0 |
3247 | +#: view:easy.reconcile.history:0 |
3248 | +msgid "Automatic Easy Reconcile History" |
3249 | +msgstr "Historique des lettrages automatisés" |
3250 | + |
3251 | +#. module: account_easy_reconcile |
3252 | +#: view:account.easy.reconcile:0 |
3253 | +msgid "Information" |
3254 | +msgstr "Information" |
3255 | + |
3256 | +#. module: account_easy_reconcile |
3257 | +#: view:account.easy.reconcile:0 |
3258 | +#: view:easy.reconcile.history:0 |
3259 | +msgid "Go to partially reconciled items" |
3260 | +msgstr "Voir les entrées partiellement lettrées" |
3261 | + |
3262 | +#. module: account_easy_reconcile |
3263 | +#: help:account.easy.reconcile.method,sequence:0 |
3264 | +msgid "The sequence field is used to order the reconcile method" |
3265 | +msgstr "La séquence détermine l'ordre des méthodes de lettrage" |
3266 | + |
3267 | +#. module: account_easy_reconcile |
3268 | +#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_history |
3269 | +msgid "easy.reconcile.history" |
3270 | +msgstr "easy.reconcile.history" |
3271 | + |
3272 | +#. module: account_easy_reconcile |
3273 | +#: model:ir.actions.act_window,help:account_easy_reconcile.action_account_easy_reconcile |
3274 | +msgid "" |
3275 | +"<p class=\"oe_view_nocontent_create\">\n" |
3276 | +" Click to add a reconciliation profile.\n" |
3277 | +" </p><p>\n" |
3278 | +" A reconciliation profile specifies, for one account, how\n" |
3279 | +" the entries should be reconciled.\n" |
3280 | +" You can select one or many reconciliation methods which will\n" |
3281 | +" be run sequentially to match the entries between them.\n" |
3282 | +" </p>\n" |
3283 | +" " |
3284 | +msgstr "" |
3285 | +"<p class=\"oe_view_nocontent_create\">\n" |
3286 | +" Cliquez pour ajouter un profil de lettrage.\n" |
3287 | +" </p><p>\n" |
3288 | +" Un profil de lettrage spécifie, pour un compte, comment\n" |
3289 | +" les écritures doivent être lettrées.\n" |
3290 | +" Vous pouvez sélectionner une ou plusieurs méthodes de lettrage\n" |
3291 | +" qui seront lancées successivement pour identifier les écritures\n" |
3292 | +" devant être lettrées. </p>\n" |
3293 | +" " |
3294 | + |
3295 | +#. module: account_easy_reconcile |
3296 | +#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_options |
3297 | +msgid "easy.reconcile.options" |
3298 | +msgstr "easy.reconcile.options" |
3299 | + |
3300 | +#. module: account_easy_reconcile |
3301 | +#: view:easy.reconcile.history:0 |
3302 | +msgid "Group By..." |
3303 | +msgstr "Grouper par..." |
3304 | + |
3305 | +#. module: account_easy_reconcile |
3306 | +#: field:account.easy.reconcile,unreconciled_count:0 |
3307 | +msgid "Unreconciled Items" |
3308 | +msgstr "Écritures non lettrées" |
3309 | + |
3310 | +#. module: account_easy_reconcile |
3311 | +#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_base |
3312 | +msgid "easy.reconcile.base" |
3313 | +msgstr "easy.reconcile.base" |
3314 | + |
3315 | +#. module: account_easy_reconcile |
3316 | +#: field:easy.reconcile.history,reconcile_line_ids:0 |
3317 | +msgid "Reconciled Items" |
3318 | +msgstr "Écritures lettrées" |
3319 | + |
3320 | +#. module: account_easy_reconcile |
3321 | +#: field:account.easy.reconcile,reconcile_method:0 |
3322 | +msgid "Method" |
3323 | +msgstr "Méthode" |
3324 | + |
3325 | +#. module: account_easy_reconcile |
3326 | +#: view:easy.reconcile.history:0 |
3327 | +msgid "7 Days" |
3328 | +msgstr "7 jours" |
3329 | + |
3330 | +#. module: account_easy_reconcile |
3331 | +#: model:ir.actions.act_window,name:account_easy_reconcile.action_easy_reconcile_history |
3332 | +msgid "Easy Automatic Reconcile History" |
3333 | +msgstr "Lettrage automatisé" |
3334 | + |
3335 | +#. module: account_easy_reconcile |
3336 | +#: field:easy.reconcile.history,date:0 |
3337 | +msgid "Run date" |
3338 | +msgstr "Date de lancement" |
3339 | + |
3340 | +#. module: account_easy_reconcile |
3341 | +#: view:account.easy.reconcile:0 |
3342 | +msgid "" |
3343 | +"Match one debit line vs one credit line. Do not allow partial " |
3344 | +"reconciliation. The lines should have the same amount (with the write-off) " |
3345 | +"and the same reference to be reconciled." |
3346 | +msgstr "" |
3347 | +"Lettre un débit avec un crédit ayant le même montant et la même référence. " |
3348 | +"Le lettrage ne peut être partiel (écriture d'ajustement en cas d'écart)." |
3349 | + |
3350 | +#. module: account_easy_reconcile |
3351 | +#: model:ir.actions.act_window,name:account_easy_reconcile.act_easy_reconcile_to_history |
3352 | +msgid "History Details" |
3353 | +msgstr "Détails de l'historique" |
3354 | + |
3355 | +#. module: account_easy_reconcile |
3356 | +#: view:account.easy.reconcile:0 |
3357 | +msgid "Display items reconciled on the last run" |
3358 | +msgstr "Voir les entrées lettrées au dernier lettrage" |
3359 | + |
3360 | +#. module: account_easy_reconcile |
3361 | +#: field:account.easy.reconcile.method,name:0 |
3362 | +msgid "Type" |
3363 | +msgstr "Type" |
3364 | + |
3365 | +#. module: account_easy_reconcile |
3366 | +#: field:account.easy.reconcile,company_id:0 |
3367 | +#: field:account.easy.reconcile.method,company_id:0 |
3368 | +#: field:easy.reconcile.history,company_id:0 |
3369 | +msgid "Company" |
3370 | +msgstr "" |
3371 | + |
3372 | +#. module: account_easy_reconcile |
3373 | +#: field:account.easy.reconcile.method,account_profit_id:0 |
3374 | +#: field:easy.reconcile.base,account_profit_id:0 |
3375 | +#: field:easy.reconcile.options,account_profit_id:0 |
3376 | +#: field:easy.reconcile.simple,account_profit_id:0 |
3377 | +#: field:easy.reconcile.simple.name,account_profit_id:0 |
3378 | +#: field:easy.reconcile.simple.partner,account_profit_id:0 |
3379 | +#: field:easy.reconcile.simple.reference,account_profit_id:0 |
3380 | +msgid "Account Profit" |
3381 | +msgstr "Compte de profits" |
3382 | + |
3383 | +#. module: account_easy_reconcile |
3384 | +#: view:easy.reconcile.history:0 |
3385 | +msgid "Todays' Reconcilations" |
3386 | +msgstr "Lettrages du jour" |
3387 | + |
3388 | +#. module: account_easy_reconcile |
3389 | +#: view:account.easy.reconcile:0 |
3390 | +msgid "Simple. Amount and Name" |
3391 | +msgstr "Simple. Montant et description" |
3392 | + |
3393 | +#. module: account_easy_reconcile |
3394 | +#: field:easy.reconcile.base,partner_ids:0 |
3395 | +#: field:easy.reconcile.simple,partner_ids:0 |
3396 | +#: field:easy.reconcile.simple.name,partner_ids:0 |
3397 | +#: field:easy.reconcile.simple.partner,partner_ids:0 |
3398 | +#: field:easy.reconcile.simple.reference,partner_ids:0 |
3399 | +msgid "Restrict on partners" |
3400 | +msgstr "Filtrer sur des partenaires" |
3401 | + |
3402 | +#. module: account_easy_reconcile |
3403 | +#: model:ir.actions.act_window,name:account_easy_reconcile.action_account_easy_reconcile |
3404 | +#: model:ir.ui.menu,name:account_easy_reconcile.menu_easy_reconcile |
3405 | +msgid "Easy Automatic Reconcile" |
3406 | +msgstr "Lettrage automatisé" |
3407 | + |
3408 | +#. module: account_easy_reconcile |
3409 | +#: view:easy.reconcile.history:0 |
3410 | +msgid "Today" |
3411 | +msgstr "Aujourd'hui" |
3412 | + |
3413 | +#. module: account_easy_reconcile |
3414 | +#: view:easy.reconcile.history:0 |
3415 | +msgid "Date" |
3416 | +msgstr "Date" |
3417 | + |
3418 | +#. module: account_easy_reconcile |
3419 | +#: field:account.easy.reconcile,last_history:0 |
3420 | +msgid "Last History" |
3421 | +msgstr "Dernier historique" |
3422 | + |
3423 | +#. module: account_easy_reconcile |
3424 | +#: view:account.easy.reconcile:0 |
3425 | +msgid "Configuration" |
3426 | +msgstr "Configuration" |
3427 | + |
3428 | +#. module: account_easy_reconcile |
3429 | +#: field:account.easy.reconcile,reconciled_partial_count:0 |
3430 | +#: field:easy.reconcile.history,partial_line_ids:0 |
3431 | +msgid "Partially Reconciled Items" |
3432 | +msgstr "Écritures partiellement lettrées" |
3433 | + |
3434 | +#. module: account_easy_reconcile |
3435 | +#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_simple_partner |
3436 | +msgid "easy.reconcile.simple.partner" |
3437 | +msgstr "easy.reconcile.simple.partner" |
3438 | + |
3439 | +#. module: account_easy_reconcile |
3440 | +#: field:account.easy.reconcile.method,write_off:0 |
3441 | +#: field:easy.reconcile.base,write_off:0 |
3442 | +#: field:easy.reconcile.options,write_off:0 |
3443 | +#: field:easy.reconcile.simple,write_off:0 |
3444 | +#: field:easy.reconcile.simple.name,write_off:0 |
3445 | +#: field:easy.reconcile.simple.partner,write_off:0 |
3446 | +#: field:easy.reconcile.simple.reference,write_off:0 |
3447 | +msgid "Write off allowed" |
3448 | +msgstr "Écart autorisé" |
3449 | + |
3450 | +#. module: account_easy_reconcile |
3451 | +#: view:account.easy.reconcile:0 |
3452 | +msgid "Automatic Easy Reconcile" |
3453 | +msgstr "Lettrage automatisé" |
3454 | + |
3455 | +#. module: account_easy_reconcile |
3456 | +#: field:account.easy.reconcile,account:0 |
3457 | +#: field:easy.reconcile.base,account_id:0 |
3458 | +#: field:easy.reconcile.simple,account_id:0 |
3459 | +#: field:easy.reconcile.simple.name,account_id:0 |
3460 | +#: field:easy.reconcile.simple.partner,account_id:0 |
3461 | +#: field:easy.reconcile.simple.reference,account_id:0 |
3462 | +msgid "Account" |
3463 | +msgstr "Compte" |
3464 | + |
3465 | +#. module: account_easy_reconcile |
3466 | +#: field:account.easy.reconcile.method,task_id:0 |
3467 | +msgid "Task" |
3468 | +msgstr "Tâche" |
3469 | + |
3470 | +#. module: account_easy_reconcile |
3471 | +#: field:account.easy.reconcile,name:0 |
3472 | +msgid "Name" |
3473 | +msgstr "Nom" |
3474 | + |
3475 | +#. module: account_easy_reconcile |
3476 | +#: view:account.easy.reconcile:0 |
3477 | +msgid "Simple. Amount and Partner" |
3478 | +msgstr "Simple. Montant et partenaire" |
3479 | + |
3480 | +#. module: account_easy_reconcile |
3481 | +#: view:account.easy.reconcile:0 |
3482 | +msgid "Start Auto Reconcilation" |
3483 | +msgstr "Lancer le lettrage automatisé" |
3484 | + |
3485 | +#. module: account_easy_reconcile |
3486 | +#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_simple_name |
3487 | +msgid "easy.reconcile.simple.name" |
3488 | +msgstr "easy.reconcile.simple.name" |
3489 | + |
3490 | +#. module: account_easy_reconcile |
3491 | +#: field:account.easy.reconcile.method,filter:0 |
3492 | +#: field:easy.reconcile.base,filter:0 |
3493 | +#: field:easy.reconcile.options,filter:0 |
3494 | +#: field:easy.reconcile.simple,filter:0 |
3495 | +#: field:easy.reconcile.simple.name,filter:0 |
3496 | +#: field:easy.reconcile.simple.partner,filter:0 |
3497 | +#: field:easy.reconcile.simple.reference,filter:0 |
3498 | +msgid "Filter" |
3499 | +msgstr "Filtre" |
3500 | + |
3501 | +#. module: account_easy_reconcile |
3502 | +#: view:account.easy.reconcile:0 |
3503 | +msgid "" |
3504 | +"Match one debit line vs one credit line. Do not allow partial " |
3505 | +"reconciliation. The lines should have the same amount (with the write-off) " |
3506 | +"and the same partner to be reconciled." |
3507 | +msgstr "" |
3508 | +"Lettre un débit avec un crédit ayant le même montant et le même partenaire. " |
3509 | +"Le lettrage ne peut être partiel (écriture d'ajustement en cas d'écart)." |
3510 | + |
3511 | +#. module: account_easy_reconcile |
3512 | +#: field:easy.reconcile.history,easy_reconcile_id:0 |
3513 | +msgid "Reconcile Profile" |
3514 | +msgstr "Profil de réconciliation" |
3515 | + |
3516 | +#. module: account_easy_reconcile |
3517 | +#: model:ir.model,name:account_easy_reconcile.model_account_easy_reconcile_method |
3518 | +msgid "reconcile method for account_easy_reconcile" |
3519 | +msgstr "Méthode de lettrage" |
3520 | + |
3521 | +#. module: account_easy_reconcile |
3522 | +#: view:account.easy.reconcile:0 |
3523 | +msgid "Start Auto Reconciliation" |
3524 | +msgstr "Lancer le lettrage automatisé" |
3525 | + |
3526 | +#. module: account_easy_reconcile |
3527 | +#: code:addons/account_easy_reconcile/easy_reconcile.py:257 |
3528 | +#, python-format |
3529 | +msgid "Error" |
3530 | +msgstr "Erreur" |
3531 | + |
3532 | +#. module: account_easy_reconcile |
3533 | +#: code:addons/account_easy_reconcile/easy_reconcile.py:258 |
3534 | +#, python-format |
3535 | +msgid "There is no history of reconciled items on the task: %s." |
3536 | +msgstr "Il n'y a pas d'historique d'écritures lettrées sur la tâche: %s." |
3537 | + |
3538 | +#. module: account_easy_reconcile |
3539 | +#: view:account.easy.reconcile:0 |
3540 | +msgid "" |
3541 | +"Match one debit line vs one credit line. Do not allow partial " |
3542 | +"reconciliation. The lines should have the same amount (with the write-off) " |
3543 | +"and the same name to be reconciled." |
3544 | +msgstr "" |
3545 | +"Lettre un débit avec un crédit ayant le même montant et la même description. " |
3546 | +"Le lettrage ne peut être partiel (écriture d'ajustement en cas d'écart)." |
3547 | + |
3548 | +#. module: account_easy_reconcile |
3549 | +#: field:account.easy.reconcile.method,account_lost_id:0 |
3550 | +#: field:easy.reconcile.base,account_lost_id:0 |
3551 | +#: field:easy.reconcile.options,account_lost_id:0 |
3552 | +#: field:easy.reconcile.simple,account_lost_id:0 |
3553 | +#: field:easy.reconcile.simple.name,account_lost_id:0 |
3554 | +#: field:easy.reconcile.simple.partner,account_lost_id:0 |
3555 | +#: field:easy.reconcile.simple.reference,account_lost_id:0 |
3556 | +msgid "Account Lost" |
3557 | +msgstr "Compte de pertes" |
3558 | + |
3559 | +#. module: account_easy_reconcile |
3560 | +#: view:easy.reconcile.history:0 |
3561 | +msgid "Reconciliation Profile" |
3562 | +msgstr "Profil de réconciliation" |
3563 | + |
3564 | +#. module: account_easy_reconcile |
3565 | +#: view:account.easy.reconcile:0 |
3566 | +#: field:account.easy.reconcile,history_ids:0 |
3567 | +msgid "History" |
3568 | +msgstr "Historique" |
3569 | + |
3570 | +#. module: account_easy_reconcile |
3571 | +#: view:account.easy.reconcile:0 |
3572 | +#: view:easy.reconcile.history:0 |
3573 | +msgid "Go to reconciled items" |
3574 | +msgstr "Voir les entrées lettrées" |
3575 | + |
3576 | +#. module: account_easy_reconcile |
3577 | +#: view:account.easy.reconcile:0 |
3578 | +msgid "Profile Information" |
3579 | +msgstr "Information sur le profil" |
3580 | + |
3581 | +#. module: account_easy_reconcile |
3582 | +#: view:account.easy.reconcile.method:0 |
3583 | +msgid "Automatic Easy Reconcile Method" |
3584 | +msgstr "Méthode de lettrage automatisé" |
3585 | + |
3586 | +#. module: account_easy_reconcile |
3587 | +#: view:account.easy.reconcile:0 |
3588 | +msgid "Simple. Amount and Reference" |
3589 | +msgstr "Simple. Montant et référence" |
3590 | + |
3591 | +#. module: account_easy_reconcile |
3592 | +#: view:account.easy.reconcile:0 |
3593 | +msgid "Display items partially reconciled on the last run" |
3594 | +msgstr "Afficher les entrées partiellement lettrées au dernier lettrage" |
3595 | + |
3596 | +#. module: account_easy_reconcile |
3597 | +#: field:account.easy.reconcile.method,sequence:0 |
3598 | +msgid "Sequence" |
3599 | +msgstr "Séquence" |
3600 | + |
3601 | +#. module: account_easy_reconcile |
3602 | +#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_simple |
3603 | +msgid "easy.reconcile.simple" |
3604 | +msgstr "easy.reconcile.simple" |
3605 | + |
3606 | +#. module: account_easy_reconcile |
3607 | +#: view:easy.reconcile.history:0 |
3608 | +msgid "Reconciliations of last 7 days" |
3609 | +msgstr "Lettrages des 7 derniers jours" |
3610 | + |
3611 | +#. module: account_easy_reconcile |
3612 | +#: field:account.easy.reconcile.method,date_base_on:0 |
3613 | +#: field:easy.reconcile.base,date_base_on:0 |
3614 | +#: field:easy.reconcile.options,date_base_on:0 |
3615 | +#: field:easy.reconcile.simple,date_base_on:0 |
3616 | +#: field:easy.reconcile.simple.name,date_base_on:0 |
3617 | +#: field:easy.reconcile.simple.partner,date_base_on:0 |
3618 | +#: field:easy.reconcile.simple.reference,date_base_on:0 |
3619 | +msgid "Date of reconciliation" |
3620 | +msgstr "Date de lettrage" |
3621 | + |
3622 | +#. module: account_easy_reconcile |
3623 | +#: code:addons/account_easy_reconcile/easy_reconcile_history.py:111 |
3624 | +#: view:easy.reconcile.history:0 |
3625 | +#: field:easy.reconcile.history,reconcile_partial_ids:0 |
3626 | +#, python-format |
3627 | +msgid "Partial Reconciliations" |
3628 | +msgstr "Lettrages partiels" |
3629 | + |
3630 | +#. module: account_easy_reconcile |
3631 | +#: field:account.easy.reconcile.method,journal_id:0 |
3632 | +#: field:easy.reconcile.base,journal_id:0 |
3633 | +#: field:easy.reconcile.options,journal_id:0 |
3634 | +#: field:easy.reconcile.simple,journal_id:0 |
3635 | +#: field:easy.reconcile.simple.name,journal_id:0 |
3636 | +#: field:easy.reconcile.simple.partner,journal_id:0 |
3637 | +#: field:easy.reconcile.simple.reference,journal_id:0 |
3638 | +msgid "Journal" |
3639 | +msgstr "Journal" |
3640 | + |
3641 | +#. module: account_easy_reconcile |
3642 | +#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_simple_reference |
3643 | +msgid "easy.reconcile.simple.reference" |
3644 | +msgstr "easy.reconcile.simple.reference" |
3645 | + |
3646 | +#. module: account_easy_reconcile |
3647 | +#: model:ir.model,name:account_easy_reconcile.model_account_easy_reconcile |
3648 | +msgid "account easy reconcile" |
3649 | +msgstr "Lettrage automatisé" |
3650 | |
3651 | === added directory 'account_easy_reconcile/security' |
3652 | === added file 'account_easy_reconcile/security/ir.model.access.csv' |
3653 | --- account_easy_reconcile/security/ir.model.access.csv 1970-01-01 00:00:00 +0000 |
3654 | +++ account_easy_reconcile/security/ir.model.access.csv 2014-04-03 07:40:14 +0000 |
3655 | @@ -0,0 +1,15 @@ |
3656 | +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink |
3657 | +access_easy_reconcile_options_acc_user,easy.reconcile.options,model_easy_reconcile_options,account.group_account_user,1,0,0,0 |
3658 | +access_account_easy_reconcile_method_acc_user,account.easy.reconcile.method,model_account_easy_reconcile_method,account.group_account_user,1,0,0,0 |
3659 | +access_account_easy_reconcile_acc_user,account.easy.reconcile,model_account_easy_reconcile,account.group_account_user,1,1,0,0 |
3660 | +access_easy_reconcile_simple_name_acc_user,easy.reconcile.simple.name,model_easy_reconcile_simple_name,account.group_account_user,1,0,0,0 |
3661 | +access_easy_reconcile_simple_partner_acc_user,easy.reconcile.simple.partner,model_easy_reconcile_simple_partner,account.group_account_user,1,0,0,0 |
3662 | +access_easy_reconcile_simple_reference_acc_user,easy.reconcile.simple.reference,model_easy_reconcile_simple_reference,account.group_account_user,1,0,0,0 |
3663 | +access_easy_reconcile_options_acc_mgr,easy.reconcile.options,model_easy_reconcile_options,account.group_account_user,1,0,0,0 |
3664 | +access_account_easy_reconcile_method_acc_mgr,account.easy.reconcile.method,model_account_easy_reconcile_method,account.group_account_user,1,1,1,1 |
3665 | +access_account_easy_reconcile_acc_mgr,account.easy.reconcile,model_account_easy_reconcile,account.group_account_user,1,1,1,1 |
3666 | +access_easy_reconcile_simple_name_acc_mgr,easy.reconcile.simple.name,model_easy_reconcile_simple_name,account.group_account_user,1,0,0,0 |
3667 | +access_easy_reconcile_simple_partner_acc_mgr,easy.reconcile.simple.partner,model_easy_reconcile_simple_partner,account.group_account_user,1,0,0,0 |
3668 | +access_easy_reconcile_simple_reference_acc_mgr,easy.reconcile.simple.reference,model_easy_reconcile_simple_reference,account.group_account_user,1,0,0,0 |
3669 | +access_easy_reconcile_history_acc_user,easy.reconcile.history,model_easy_reconcile_history,account.group_account_user,1,1,1,0 |
3670 | +access_easy_reconcile_history_acc_mgr,easy.reconcile.history,model_easy_reconcile_history,account.group_account_manager,1,1,1,1 |
3671 | |
3672 | === added file 'account_easy_reconcile/security/ir_rule.xml' |
3673 | --- account_easy_reconcile/security/ir_rule.xml 1970-01-01 00:00:00 +0000 |
3674 | +++ account_easy_reconcile/security/ir_rule.xml 2014-04-03 07:40:14 +0000 |
3675 | @@ -0,0 +1,25 @@ |
3676 | +<?xml version="1.0" encoding="utf-8"?> |
3677 | +<openerp> |
3678 | + <data noupdate="1"> |
3679 | + <record id="easy_reconcile_rule" model="ir.rule"> |
3680 | + <field name="name">Easy reconcile multi-company</field> |
3681 | + <field name="model_id" ref="model_account_easy_reconcile"/> |
3682 | + <field name="global" eval="True"/> |
3683 | + <field name="domain_force">['|', ('company_id', '=', False), ('company_id', 'child_of', [user.company_id.id])]</field> |
3684 | + </record> |
3685 | + |
3686 | + <record id="easy_reconcile_history_rule" model="ir.rule"> |
3687 | + <field name="name">Easy reconcile history multi-company</field> |
3688 | + <field name="model_id" ref="model_easy_reconcile_history"/> |
3689 | + <field name="global" eval="True"/> |
3690 | + <field name="domain_force">['|', ('company_id', '=', False), ('company_id', 'child_of', [user.company_id.id])]</field> |
3691 | + </record> |
3692 | + |
3693 | + <record id="easy_reconcile_method_rule" model="ir.rule"> |
3694 | + <field name="name">Easy reconcile method multi-company</field> |
3695 | + <field name="model_id" ref="model_account_easy_reconcile_method"/> |
3696 | + <field name="global" eval="True"/> |
3697 | + <field name="domain_force">['|', ('company_id', '=', False), ('company_id', 'child_of', [user.company_id.id])]</field> |
3698 | + </record> |
3699 | + </data> |
3700 | +</openerp> |
3701 | |
3702 | === added file 'account_easy_reconcile/simple_reconciliation.py' |
3703 | --- account_easy_reconcile/simple_reconciliation.py 1970-01-01 00:00:00 +0000 |
3704 | +++ account_easy_reconcile/simple_reconciliation.py 2014-04-03 07:40:14 +0000 |
3705 | @@ -0,0 +1,120 @@ |
3706 | +# -*- coding: utf-8 -*- |
3707 | +############################################################################## |
3708 | +# |
3709 | +# Copyright 2012-2013 Camptocamp SA (Guewen Baconnier) |
3710 | +# Copyright (C) 2010 Sébastien Beau |
3711 | +# |
3712 | +# This program is free software: you can redistribute it and/or modify |
3713 | +# it under the terms of the GNU Affero General Public License as |
3714 | +# published by the Free Software Foundation, either version 3 of the |
3715 | +# License, or (at your option) any later version. |
3716 | +# |
3717 | +# This program is distributed in the hope that it will be useful, |
3718 | +# but WITHOUT ANY WARRANTY; without even the implied warranty of |
3719 | +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
3720 | +# GNU Affero General Public License for more details. |
3721 | +# |
3722 | +# You should have received a copy of the GNU Affero General Public License |
3723 | +# along with this program. If not, see <http://www.gnu.org/licenses/>. |
3724 | +# |
3725 | +############################################################################## |
3726 | + |
3727 | +from openerp.osv.orm import AbstractModel, TransientModel |
3728 | + |
3729 | + |
3730 | +class easy_reconcile_simple(AbstractModel): |
3731 | + |
3732 | + _name = 'easy.reconcile.simple' |
3733 | + _inherit = 'easy.reconcile.base' |
3734 | + |
3735 | + # has to be subclassed |
3736 | + # field name used as key for matching the move lines |
3737 | + _key_field = None |
3738 | + |
3739 | + def rec_auto_lines_simple(self, cr, uid, rec, lines, context=None): |
3740 | + if context is None: |
3741 | + context = {} |
3742 | + |
3743 | + if self._key_field is None: |
3744 | + raise ValueError("_key_field has to be defined") |
3745 | + |
3746 | + count = 0 |
3747 | + res = [] |
3748 | + while (count < len(lines)): |
3749 | + for i in xrange(count+1, len(lines)): |
3750 | + writeoff_account_id = False |
3751 | + if lines[count][self._key_field] != lines[i][self._key_field]: |
3752 | + break |
3753 | + |
3754 | + check = False |
3755 | + if lines[count]['credit'] > 0 and lines[i]['debit'] > 0: |
3756 | + credit_line = lines[count] |
3757 | + debit_line = lines[i] |
3758 | + check = True |
3759 | + elif lines[i]['credit'] > 0 and lines[count]['debit'] > 0: |
3760 | + credit_line = lines[i] |
3761 | + debit_line = lines[count] |
3762 | + check = True |
3763 | + if not check: |
3764 | + continue |
3765 | + |
3766 | + reconciled, dummy = self._reconcile_lines( |
3767 | + cr, uid, rec, [credit_line, debit_line], |
3768 | + allow_partial=False, context=context) |
3769 | + if reconciled: |
3770 | + res += [credit_line['id'], debit_line['id']] |
3771 | + del lines[i] |
3772 | + break |
3773 | + count += 1 |
3774 | + return res, [] # empty list for partial, only full rec in "simple" rec |
3775 | + |
3776 | + def _simple_order(self, rec, *args, **kwargs): |
3777 | + return "ORDER BY account_move_line.%s" % self._key_field |
3778 | + |
3779 | + def _action_rec(self, cr, uid, rec, context=None): |
3780 | + """Match only 2 move lines, do not allow partial reconcile""" |
3781 | + select = self._select(rec) |
3782 | + select += ", account_move_line.%s " % self._key_field |
3783 | + where, params = self._where(rec) |
3784 | + where += " AND account_move_line.%s IS NOT NULL " % self._key_field |
3785 | + |
3786 | + where2, params2 = self._get_filter(cr, uid, rec, context=context) |
3787 | + query = ' '.join(( |
3788 | + select, |
3789 | + self._from(rec), |
3790 | + where, where2, |
3791 | + self._simple_order(rec))) |
3792 | + |
3793 | + cr.execute(query, params + params2) |
3794 | + lines = cr.dictfetchall() |
3795 | + return self.rec_auto_lines_simple(cr, uid, rec, lines, context) |
3796 | + |
3797 | + |
3798 | +class easy_reconcile_simple_name(TransientModel): |
3799 | + |
3800 | + _name = 'easy.reconcile.simple.name' |
3801 | + _inherit = 'easy.reconcile.simple' |
3802 | + |
3803 | + # has to be subclassed |
3804 | + # field name used as key for matching the move lines |
3805 | + _key_field = 'name' |
3806 | + |
3807 | + |
3808 | +class easy_reconcile_simple_partner(TransientModel): |
3809 | + |
3810 | + _name = 'easy.reconcile.simple.partner' |
3811 | + _inherit = 'easy.reconcile.simple' |
3812 | + |
3813 | + # has to be subclassed |
3814 | + # field name used as key for matching the move lines |
3815 | + _key_field = 'partner_id' |
3816 | + |
3817 | + |
3818 | +class easy_reconcile_simple_reference(TransientModel): |
3819 | + |
3820 | + _name = 'easy.reconcile.simple.reference' |
3821 | + _inherit = 'easy.reconcile.simple' |
3822 | + |
3823 | + # has to be subclassed |
3824 | + # field name used as key for matching the move lines |
3825 | + _key_field = 'ref' |
3826 | |
3827 | === added directory 'account_statement_bankaccount_completion' |
3828 | === added file 'account_statement_bankaccount_completion/__init__.py' |
3829 | --- account_statement_bankaccount_completion/__init__.py 1970-01-01 00:00:00 +0000 |
3830 | +++ account_statement_bankaccount_completion/__init__.py 2014-04-03 07:40:14 +0000 |
3831 | @@ -0,0 +1,21 @@ |
3832 | +# -*- coding: utf-8 -*- |
3833 | +# |
3834 | +# |
3835 | +# Author: Laurent Mignon |
3836 | +# Copyright 2013 'ACSONE SA/NV' |
3837 | +# |
3838 | +# This program is free software: you can redistribute it and/or modify |
3839 | +# it under the terms of the GNU Affero General Public License as |
3840 | +# published by the Free Software Foundation, either version 3 of the |
3841 | +# License, or (at your option) any later version. |
3842 | +# |
3843 | +# This program is distributed in the hope that it will be useful, |
3844 | +# but WITHOUT ANY WARRANTY; without even the implied warranty of |
3845 | +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
3846 | +# GNU Affero General Public License for more details. |
3847 | +# |
3848 | +# You should have received a copy of the GNU Affero General Public License |
3849 | +# along with this program. If not, see <http://www.gnu.org/licenses/>. |
3850 | +# |
3851 | +# |
3852 | +import statement |
3853 | |
3854 | === added file 'account_statement_bankaccount_completion/__openerp__.py' |
3855 | --- account_statement_bankaccount_completion/__openerp__.py 1970-01-01 00:00:00 +0000 |
3856 | +++ account_statement_bankaccount_completion/__openerp__.py 2014-04-03 07:40:14 +0000 |
3857 | @@ -0,0 +1,48 @@ |
3858 | +# -*- coding: utf-8 -*- |
3859 | +# |
3860 | +# |
3861 | +# Author: Laurent Mignon |
3862 | +# Copyright 2013 'ACSONE SA/NV' |
3863 | +# |
3864 | +# This program is free software: you can redistribute it and/or modify |
3865 | +# it under the terms of the GNU Affero General Public License as |
3866 | +# published by the Free Software Foundation, either version 3 of the |
3867 | +# License, or (at your option) any later version. |
3868 | +# |
3869 | +# This program is distributed in the hope that it will be useful, |
3870 | +# but WITHOUT ANY WARRANTY; without even the implied warranty of |
3871 | +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
3872 | +# GNU Affero General Public License for more details. |
3873 | +# |
3874 | +# You should have received a copy of the GNU Affero General Public License |
3875 | +# along with this program. If not, see <http://www.gnu.org/licenses/>. |
3876 | +# |
3877 | +# |
3878 | + |
3879 | +{'name': "Bank statement completion from bank account number", |
3880 | + 'version': '1.0.1', |
3881 | + 'author': 'ACSONE SA/NV', |
3882 | + 'maintainer': 'ACSONE SA/NV', |
3883 | + 'category': 'Finance', |
3884 | + 'complexity': 'normal', |
3885 | + 'depends': [ |
3886 | + 'account_statement_base_completion', |
3887 | + ], |
3888 | + 'description': """ |
3889 | + Add a completion method based on the partner bank account number |
3890 | + provided by the bank/office. |
3891 | + |
3892 | + Completion will look in the partner with that bank account number |
3893 | + to match the partner, then it will fill in the bank statement line |
3894 | + with it to ease the reconciliation. |
3895 | + |
3896 | + """, |
3897 | + 'website': 'http://www.acsone.eu', |
3898 | + 'data': [ |
3899 | + "data.xml", |
3900 | + ], |
3901 | + 'demo': [], |
3902 | + 'installable': True, |
3903 | + 'auto_install': False, |
3904 | + 'license': 'AGPL-3', |
3905 | + } |
3906 | |
3907 | === added file 'account_statement_bankaccount_completion/data.xml' |
3908 | --- account_statement_bankaccount_completion/data.xml 1970-01-01 00:00:00 +0000 |
3909 | +++ account_statement_bankaccount_completion/data.xml 2014-04-03 07:40:14 +0000 |
3910 | @@ -0,0 +1,12 @@ |
3911 | +<?xml version="1.0" encoding="utf-8"?> |
3912 | +<openerp> |
3913 | +<data noupdate="1"> |
3914 | + |
3915 | + <record id="bank_statement_completion_rule_10" model="account.statement.completion.rule"> |
3916 | + <field name="name">Match from bank account number (Normal or IBAN))</field> |
3917 | + <field name="sequence">10</field> |
3918 | + <field name="function_to_call">get_from_bank_account</field> |
3919 | + </record> |
3920 | + |
3921 | +</data> |
3922 | +</openerp> |
3923 | |
3924 | === added directory 'account_statement_bankaccount_completion/i18n' |
3925 | === added file 'account_statement_bankaccount_completion/i18n/account_statement_bankaccount_completion.pot' |
3926 | --- account_statement_bankaccount_completion/i18n/account_statement_bankaccount_completion.pot 1970-01-01 00:00:00 +0000 |
3927 | +++ account_statement_bankaccount_completion/i18n/account_statement_bankaccount_completion.pot 2014-04-03 07:40:14 +0000 |
3928 | @@ -0,0 +1,43 @@ |
3929 | +# Translation of OpenERP Server. |
3930 | +# This file contains the translation of the following modules: |
3931 | +# * account_statement_bankaccount_completion |
3932 | +# |
3933 | +msgid "" |
3934 | +msgstr "" |
3935 | +"Project-Id-Version: OpenERP Server 7.0\n" |
3936 | +"Report-Msgid-Bugs-To: \n" |
3937 | +"POT-Creation-Date: 2014-01-21 11:57+0000\n" |
3938 | +"PO-Revision-Date: 2014-01-21 11:57+0000\n" |
3939 | +"Last-Translator: <>\n" |
3940 | +"Language-Team: \n" |
3941 | +"MIME-Version: 1.0\n" |
3942 | +"Content-Type: text/plain; charset=UTF-8\n" |
3943 | +"Content-Transfer-Encoding: \n" |
3944 | +"Plural-Forms: \n" |
3945 | + |
3946 | +#. module: account_statement_bankaccount_completion |
3947 | +#: help:account.bank.statement.line,partner_acc_number:0 |
3948 | +msgid "Account number of the partner" |
3949 | +msgstr "" |
3950 | + |
3951 | +#. module: account_statement_bankaccount_completion |
3952 | +#: model:ir.model,name:account_statement_bankaccount_completion.model_account_bank_statement_line |
3953 | +msgid "Bank Statement Line" |
3954 | +msgstr "" |
3955 | + |
3956 | +#. module: account_statement_bankaccount_completion |
3957 | +#: code:addons/account_statement_bankaccount_completion/statement.py:68 |
3958 | +#, python-format |
3959 | +msgid "Line named \"%s\" (Ref:%s) was matched by more than one partner for account number \"%s\"." |
3960 | +msgstr "" |
3961 | + |
3962 | +#. module: account_statement_bankaccount_completion |
3963 | +#: field:account.bank.statement.line,partner_acc_number:0 |
3964 | +msgid "Account Number" |
3965 | +msgstr "" |
3966 | + |
3967 | +#. module: account_statement_bankaccount_completion |
3968 | +#: model:ir.model,name:account_statement_bankaccount_completion.model_account_statement_completion_rule |
3969 | +msgid "account.statement.completion.rule" |
3970 | +msgstr "" |
3971 | + |
3972 | |
3973 | === added file 'account_statement_bankaccount_completion/statement.py' |
3974 | --- account_statement_bankaccount_completion/statement.py 1970-01-01 00:00:00 +0000 |
3975 | +++ account_statement_bankaccount_completion/statement.py 2014-04-03 07:40:14 +0000 |
3976 | @@ -0,0 +1,96 @@ |
3977 | +# -*- coding: utf-8 -*- |
3978 | +# |
3979 | +# |
3980 | +# Author: Laurent Mignon |
3981 | +# Copyright 2013 'ACSONE SA/NV' |
3982 | +# |
3983 | +# This program is free software: you can redistribute it and/or modify |
3984 | +# it under the terms of the GNU Affero General Public License as |
3985 | +# published by the Free Software Foundation, either version 3 of the |
3986 | +# License, or (at your option) any later version. |
3987 | +# |
3988 | +# This program is distributed in the hope that it will be useful, |
3989 | +# but WITHOUT ANY WARRANTY; without even the implied warranty of |
3990 | +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
3991 | +# GNU Affero General Public License for more details. |
3992 | +# |
3993 | +# You should have received a copy of the GNU Affero General Public License |
3994 | +# along with this program. If not, see <http://www.gnu.org/licenses/>. |
3995 | +# |
3996 | +# |
3997 | + |
3998 | + |
3999 | +from openerp.tools.translate import _ |
4000 | +from openerp.osv.orm import Model |
4001 | +from openerp.osv import fields |
4002 | +from openerp.addons.account_statement_base_completion.statement import ErrorTooManyPartner |
4003 | + |
4004 | + |
4005 | +class AccountStatementCompletionRule(Model): |
4006 | + """Add a rule based on transaction ID""" |
4007 | + |
4008 | + _inherit = "account.statement.completion.rule" |
4009 | + |
4010 | + def _get_functions(self, cr, uid, context=None): |
4011 | + res = super(AccountStatementCompletionRule, self)._get_functions( |
4012 | + cr, uid, context=context) |
4013 | + res.append(('get_from_bank_account', |
4014 | + 'From bank account number (Normal or IBAN)')) |
4015 | + return res |
4016 | + |
4017 | + _columns = { |
4018 | + 'function_to_call': fields.selection(_get_functions, 'Method'), |
4019 | + } |
4020 | + |
4021 | + def get_from_bank_account(self, cr, uid, st_line, context=None): |
4022 | + """ |
4023 | + Match the partner based on the partner account number field |
4024 | + Then, call the generic st_line method to complete other values. |
4025 | + :param dict st_line: read of the concerned account.bank.statement.line |
4026 | + :return: |
4027 | + A dict of value that can be passed directly to the write method of |
4028 | + the statement line or {} |
4029 | + {'partner_id': value, |
4030 | + 'account_id' : value, |
4031 | + ...} |
4032 | + """ |
4033 | + partner_acc_number = st_line['partner_acc_number'] |
4034 | + if not partner_acc_number: |
4035 | + return {} |
4036 | + st_obj = self.pool.get('account.bank.statement.line') |
4037 | + res = {} |
4038 | + res_bank_obj = self.pool.get('res.partner.bank') |
4039 | + ids = res_bank_obj.search(cr, |
4040 | + uid, |
4041 | + [('acc_number', '=', partner_acc_number)], |
4042 | + context=context) |
4043 | + if len(ids) > 1: |
4044 | + raise ErrorTooManyPartner(_('Line named "%s" (Ref:%s) was matched by more than ' |
4045 | + 'one partner for account number "%s".') % (st_line['name'], st_line['ref'], partner_acc_number)) |
4046 | + if len(ids) == 1: |
4047 | + partner = res_bank_obj.browse(cr, uid, ids[0], context=context).partner_id |
4048 | + res['partner_id'] = partner.id |
4049 | + st_vals = st_obj.get_values_for_line(cr, |
4050 | + uid, |
4051 | + profile_id=st_line['profile_id'], |
4052 | + master_account_id=st_line['master_account_id'], |
4053 | + partner_id=res.get('partner_id', False), |
4054 | + line_type=st_line['type'], |
4055 | + amount=st_line['amount'] if st_line['amount'] else 0.0, |
4056 | + context=context) |
4057 | + res.update(st_vals) |
4058 | + return res |
4059 | + |
4060 | + |
4061 | +class AccountStatementLine(Model): |
4062 | + _inherit = "account.bank.statement.line" |
4063 | + |
4064 | + _columns = { |
4065 | + # 'additional_bank_fields' : fields.serialized('Additional infos from bank', help="Used by completion and import system."), |
4066 | + 'partner_acc_number': fields.sparse( |
4067 | + type='char', |
4068 | + string='Account Number', |
4069 | + size=64, |
4070 | + serialization_field='additionnal_bank_fields', |
4071 | + help="Account number of the partner"), |
4072 | + } |
4073 | |
4074 | === added directory 'account_statement_bankaccount_completion/tests' |
4075 | === added file 'account_statement_bankaccount_completion/tests/__init__.py' |
4076 | --- account_statement_bankaccount_completion/tests/__init__.py 1970-01-01 00:00:00 +0000 |
4077 | +++ account_statement_bankaccount_completion/tests/__init__.py 2014-04-03 07:40:14 +0000 |
4078 | @@ -0,0 +1,27 @@ |
4079 | +# -*- coding: utf-8 -*- |
4080 | +# |
4081 | +# |
4082 | +# Authors: Laurent Mignon |
4083 | +# Copyright (c) 2013 Acsone SA/NV (http://www.acsone.eu) |
4084 | +# All Rights Reserved |
4085 | +# |
4086 | +# This program is free software: you can redistribute it and/or modify |
4087 | +# it under the terms of the GNU Affero General Public License as |
4088 | +# published by the Free Software Foundation, either version 3 of the |
4089 | +# License, or (at your option) any later version. |
4090 | +# |
4091 | +# This program is distributed in the hope that it will be useful, |
4092 | +# but WITHOUT ANY WARRANTY; without even the implied warranty of |
4093 | +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
4094 | +# GNU Affero General Public License for more details. |
4095 | +# |
4096 | +# You should have received a copy of the GNU Affero General Public License |
4097 | +# along with this program. If not, see <http://www.gnu.org/licenses/>. |
4098 | +# |
4099 | +# |
4100 | + |
4101 | +from . import test_bankaccount_completion |
4102 | + |
4103 | +checks = [ |
4104 | + test_bankaccount_completion |
4105 | +] |
4106 | |
4107 | === added file 'account_statement_bankaccount_completion/tests/test_bankaccount_completion.py' |
4108 | --- account_statement_bankaccount_completion/tests/test_bankaccount_completion.py 1970-01-01 00:00:00 +0000 |
4109 | +++ account_statement_bankaccount_completion/tests/test_bankaccount_completion.py 2014-04-03 07:40:14 +0000 |
4110 | @@ -0,0 +1,91 @@ |
4111 | +# -*- coding: utf-8 -*- |
4112 | +# |
4113 | +# |
4114 | +# Authors: Laurent Mignon |
4115 | +# Copyright (c) 2013 Acsone SA/NV (http://www.acsone.eu) |
4116 | +# All Rights Reserved |
4117 | +# |
4118 | +# This program is free software: you can redistribute it and/or modify |
4119 | +# it under the terms of the GNU Affero General Public License as |
4120 | +# published by the Free Software Foundation, either version 3 of the |
4121 | +# License, or (at your option) any later version. |
4122 | +# |
4123 | +# This program is distributed in the hope that it will be useful, |
4124 | +# but WITHOUT ANY WARRANTY; without even the implied warranty of |
4125 | +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
4126 | +# GNU Affero General Public License for more details. |
4127 | +# |
4128 | +# You should have received a copy of the GNU Affero General Public License |
4129 | +# along with this program. If not, see <http://www.gnu.org/licenses/>. |
4130 | +# |
4131 | +# |
4132 | +from openerp.tests import common |
4133 | +import time |
4134 | + |
4135 | +ACC_NUMBER = "BE38733040385372" |
4136 | + |
4137 | + |
4138 | +class bankaccount_completion(common.TransactionCase): |
4139 | + |
4140 | + def prepare(self): |
4141 | + self.company_a = self.browse_ref('base.main_company') |
4142 | + self.profile_obj = self.registry("account.statement.profile") |
4143 | + self.account_bank_statement_obj = self.registry("account.bank.statement") |
4144 | + self.account_bank_statement_line_obj = self.registry("account.bank.statement.line") |
4145 | + self.completion_rule_id = self.ref('account_statement_bankaccount_completion.bank_statement_completion_rule_10') |
4146 | + self.journal_id = self.registry("ir.model.data").get_object_reference(self.cr, self. uid, "account", "bank_journal")[1] |
4147 | + self.partner_id = self.ref('base.main_partner') |
4148 | + # Create the profile |
4149 | + self.account_id = self.registry("ir.model.data").get_object_reference(self.cr, self.uid, "account", "a_recv")[1] |
4150 | + self.journal_id = self.registry("ir.model.data").get_object_reference(self.cr, self. uid, "account", "bank_journal")[1] |
4151 | + self.profile_id = self.profile_obj.create(self.cr, self.uid, { |
4152 | + "name": "TEST", |
4153 | + "commission_account_id": self.account_id, |
4154 | + "journal_id": self.journal_id, |
4155 | + "rule_ids": [(6, 0, [self.completion_rule_id])]}) |
4156 | + # Create the completion rule |
4157 | + |
4158 | + # Create a bank statement |
4159 | + self.statement_id = self.account_bank_statement_obj.create(self.cr, self.uid, { |
4160 | + "balance_end_real": 0.0, |
4161 | + "balance_start": 0.0, |
4162 | + "date": time.strftime('%Y-%m-%d'), |
4163 | + "journal_id": self.journal_id, |
4164 | + "profile_id": self.profile_id |
4165 | + |
4166 | + }) |
4167 | + |
4168 | + # Create bank a statement line |
4169 | + self.statement_line_id = self.account_bank_statement_line_obj.create(self.cr, self.uid, { |
4170 | + 'amount': 1000.0, |
4171 | + 'name': 'EXT001', |
4172 | + 'ref': 'My ref', |
4173 | + 'statement_id': self.statement_id, |
4174 | + 'partner_acc_number': ACC_NUMBER |
4175 | + }) |
4176 | + |
4177 | + # Add a bank account number to the partner |
4178 | + res_bank_obj = self.registry('res.partner.bank') |
4179 | + res_bank_obj.create(self.cr, self.uid, { |
4180 | + "state": "bank", |
4181 | + "company_id": self.company_a.id, |
4182 | + "partner_id": self.partner_id, |
4183 | + "acc_number": ACC_NUMBER, |
4184 | + "footer": True, |
4185 | + "bank_name": "Reserve" |
4186 | + }) |
4187 | + |
4188 | + def test_00(self): |
4189 | + """Test complete partner_id from bank account number |
4190 | + |
4191 | + Test the automatic completion of the partner_id based on the account number associated to the |
4192 | + statement line |
4193 | + """ |
4194 | + self.prepare() |
4195 | + statement_line = self.account_bank_statement_line_obj.browse(self.cr, self.uid, self.statement_line_id) |
4196 | + # before import, the |
4197 | + self.assertFalse(statement_line.partner_id, "Partner_id must be blank before completion") |
4198 | + statement_obj = self.account_bank_statement_obj.browse(self.cr, self.uid, self.statement_id) |
4199 | + statement_obj.button_auto_completion() |
4200 | + statement_line = self.account_bank_statement_line_obj.browse(self.cr, self.uid, self.statement_line_id) |
4201 | + self.assertEquals(self.partner_id, statement_line.partner_id['id'], "Missing expected partner id after completion") |
4202 | |
4203 | === added directory 'account_statement_base_completion' |
4204 | === added file 'account_statement_base_completion/__init__.py' |
4205 | --- account_statement_base_completion/__init__.py 1970-01-01 00:00:00 +0000 |
4206 | +++ account_statement_base_completion/__init__.py 2014-04-03 07:40:14 +0000 |
4207 | @@ -0,0 +1,23 @@ |
4208 | +# -*- coding: utf-8 -*- |
4209 | +############################################################################## |
4210 | +# |
4211 | +# Author: Joel Grand-Guillaume |
4212 | +# Copyright 2011-2012 Camptocamp SA |
4213 | +# |
4214 | +# This program is free software: you can redistribute it and/or modify |
4215 | +# it under the terms of the GNU Affero General Public License as |
4216 | +# published by the Free Software Foundation, either version 3 of the |
4217 | +# License, or (at your option) any later version. |
4218 | +# |
4219 | +# This program is distributed in the hope that it will be useful, |
4220 | +# but WITHOUT ANY WARRANTY; without even the implied warranty of |
4221 | +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
4222 | +# GNU Affero General Public License for more details. |
4223 | +# |
4224 | +# You should have received a copy of the GNU Affero General Public License |
4225 | +# along with this program. If not, see <http://www.gnu.org/licenses/>. |
4226 | +# |
4227 | +############################################################################## |
4228 | + |
4229 | +from . import partner |
4230 | +from . import statement |
4231 | |
4232 | === added file 'account_statement_base_completion/__openerp__.py' |
4233 | --- account_statement_base_completion/__openerp__.py 1970-01-01 00:00:00 +0000 |
4234 | +++ account_statement_base_completion/__openerp__.py 2014-04-03 07:40:14 +0000 |
4235 | @@ -0,0 +1,77 @@ |
4236 | +# -*- coding: utf-8 -*- |
4237 | +############################################################################## |
4238 | +# |
4239 | +# Author: Joel Grand-Guillaume |
4240 | +# Copyright 2011-2012 Camptocamp SA |
4241 | +# |
4242 | +# This program is free software: you can redistribute it and/or modify |
4243 | +# it under the terms of the GNU Affero General Public License as |
4244 | +# published by the Free Software Foundation, either version 3 of the |
4245 | +# License, or (at your option) any later version. |
4246 | +# |
4247 | +# This program is distributed in the hope that it will be useful, |
4248 | +# but WITHOUT ANY WARRANTY; without even the implied warranty of |
4249 | +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
4250 | +# GNU Affero General Public License for more details. |
4251 | +# |
4252 | +# You should have received a copy of the GNU Affero General Public License |
4253 | +# along with this program. If not, see <http://www.gnu.org/licenses/>. |
4254 | +# |
4255 | +############################################################################## |
4256 | + |
4257 | +{'name': "Bank statement base completion", |
4258 | + 'version': '1.0.2', |
4259 | + 'author': 'Camptocamp', |
4260 | + 'maintainer': 'Camptocamp', |
4261 | + 'category': 'Finance', |
4262 | + 'complexity': 'normal', |
4263 | + 'depends': ['account_statement_ext'], |
4264 | + 'description': """ |
4265 | + The goal of this module is to improve the basic bank statement, help dealing with huge volume of |
4266 | + reconciliation by providing basic rules to identify the partner of a bank statement line. |
4267 | + Each bank statement profile can have its own rules to be applied according to a sequence order. |
4268 | + |
4269 | + Some basic rules are provided in this module: |
4270 | + |
4271 | + 1) Match from statement line label (based on partner field 'Bank Statement Label') |
4272 | + 2) Match from statement line label (based on partner name) |
4273 | + 3) Match from statement line reference (based on Invoice number) |
4274 | + |
4275 | + You can easily override this module and add your own rules in your own one. The basic rules only |
4276 | + fill in the partner, but you can use them to fill in any value of the line (in the future, we will |
4277 | + add a rule to automatically match and reconcile the line). |
4278 | + |
4279 | + It adds as well a label on the bank statement line (on which the pre-define rules can match) and |
4280 | + a char field on the partner called 'Bank Statement Label'. Using the pre-define rules, you will be |
4281 | + able to match various labels for a partner. |
4282 | + |
4283 | + The reference of the line is always used by the reconciliation process. We're supposed to copy |
4284 | + there (or write manually) the matching string. This can be: the order Number or an invoice number, |
4285 | + or anything that will be found in the invoice accounting entry part to make the match. |
4286 | + |
4287 | + You can use it with our account_advanced_reconcile module to automatize the reconciliation process. |
4288 | + |
4289 | + |
4290 | + TODO: The rules that look for invoices to find out the partner should take back the payable / receivable |
4291 | + account from there directly instead of retrieving it from partner properties ! |
4292 | + |
4293 | + """, |
4294 | + 'website': 'http://www.camptocamp.com', |
4295 | + 'data': [ |
4296 | + 'statement_view.xml', |
4297 | + 'partner_view.xml', |
4298 | + 'data.xml', |
4299 | + 'security/ir.model.access.csv', |
4300 | + ], |
4301 | + 'demo': [], |
4302 | + 'test': [ |
4303 | + 'test/partner.yml', |
4304 | + 'test/invoice.yml', |
4305 | + 'test/supplier_invoice.yml', |
4306 | + 'test/completion_test.yml' |
4307 | + ], |
4308 | + 'installable': True, |
4309 | + 'images': [], |
4310 | + 'auto_install': False, |
4311 | + 'license': 'AGPL-3', |
4312 | +} |
4313 | |
4314 | === added file 'account_statement_base_completion/data.xml' |
4315 | --- account_statement_base_completion/data.xml 1970-01-01 00:00:00 +0000 |
4316 | +++ account_statement_base_completion/data.xml 2014-04-03 07:40:14 +0000 |
4317 | @@ -0,0 +1,31 @@ |
4318 | +<?xml version="1.0" encoding="utf-8"?> |
4319 | +<openerp> |
4320 | +<data noupdate="1"> |
4321 | + |
4322 | + <record id="bank_statement_completion_rule_2" model="account.statement.completion.rule"> |
4323 | + <field name="name">Match from line label (based on partner field 'Bank Statement Label')</field> |
4324 | + <field name="sequence">60</field> |
4325 | + <field name="function_to_call">get_from_label_and_partner_field</field> |
4326 | + </record> |
4327 | + |
4328 | + <record id="bank_statement_completion_rule_3" model="account.statement.completion.rule"> |
4329 | + <field name="name">Match from line label (based on partner name)</field> |
4330 | + <field name="sequence">70</field> |
4331 | + <field name="function_to_call">get_from_label_and_partner_name</field> |
4332 | + </record> |
4333 | + |
4334 | + <record id="bank_statement_completion_rule_4" model="account.statement.completion.rule"> |
4335 | + <field name="name">Match from line reference (based on Invoice number)</field> |
4336 | + <field name="sequence">40</field> |
4337 | + <field name="function_to_call">get_from_ref_and_invoice</field> |
4338 | + </record> |
4339 | + |
4340 | + <record id="bank_statement_completion_rule_5" model="account.statement.completion.rule"> |
4341 | + <field name="name">Match from line reference (based on Invoice Supplier number)</field> |
4342 | + <field name="sequence">45</field> |
4343 | + <field name="function_to_call">get_from_ref_and_supplier_invoice</field> |
4344 | + </record> |
4345 | + |
4346 | + |
4347 | +</data> |
4348 | +</openerp> |
4349 | |
4350 | === added directory 'account_statement_base_completion/i18n' |
4351 | === added file 'account_statement_base_completion/i18n/ab.po' |
4352 | --- account_statement_base_completion/i18n/ab.po 1970-01-01 00:00:00 +0000 |
4353 | +++ account_statement_base_completion/i18n/ab.po 2014-04-03 07:40:14 +0000 |
4354 | @@ -0,0 +1,216 @@ |
4355 | +# Abkhazian translation for banking-addons |
4356 | +# Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 |
4357 | +# This file is distributed under the same license as the banking-addons package. |
4358 | +# FIRST AUTHOR <EMAIL@ADDRESS>, 2014. |
4359 | +# |
4360 | +msgid "" |
4361 | +msgstr "" |
4362 | +"Project-Id-Version: banking-addons\n" |
4363 | +"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" |
4364 | +"POT-Creation-Date: 2014-01-21 11:57+0000\n" |
4365 | +"PO-Revision-Date: 2014-04-02 23:04+0000\n" |
4366 | +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" |
4367 | +"Language-Team: Abkhazian <ab@li.org>\n" |
4368 | +"MIME-Version: 1.0\n" |
4369 | +"Content-Type: text/plain; charset=UTF-8\n" |
4370 | +"Content-Transfer-Encoding: 8bit\n" |
4371 | +"X-Launchpad-Export-Date: 2014-04-03 06:06+0000\n" |
4372 | +"X-Generator: Launchpad (build 16967)\n" |
4373 | + |
4374 | +#. module: account_statement_base_completion |
4375 | +#: view:account.statement.completion.rule:0 |
4376 | +msgid "Related Profiles" |
4377 | +msgstr "" |
4378 | + |
4379 | +#. module: account_statement_base_completion |
4380 | +#: help:account.bank.statement.line,label:0 |
4381 | +msgid "" |
4382 | +"Generic field to store a label given from the bank/office on which we can " |
4383 | +"base the default/standard providen rule." |
4384 | +msgstr "" |
4385 | + |
4386 | +#. module: account_statement_base_completion |
4387 | +#: code:addons/account_statement_base_completion/statement.py:169 |
4388 | +#, python-format |
4389 | +msgid "" |
4390 | +"Line named \"%s\" (Ref:%s) was matched by more than one partner while " |
4391 | +"looking on %s invoices" |
4392 | +msgstr "" |
4393 | + |
4394 | +#. module: account_statement_base_completion |
4395 | +#: field:account.bank.statement,completion_logs:0 |
4396 | +msgid "Completion Log" |
4397 | +msgstr "" |
4398 | + |
4399 | +#. module: account_statement_base_completion |
4400 | +#: field:account.bank.statement.line,label:0 |
4401 | +msgid "Label" |
4402 | +msgstr "" |
4403 | + |
4404 | +#. module: account_statement_base_completion |
4405 | +#: model:ir.model,name:account_statement_base_completion.model_account_bank_statement |
4406 | +msgid "Bank Statement" |
4407 | +msgstr "" |
4408 | + |
4409 | +#. module: account_statement_base_completion |
4410 | +#: field:account.statement.completion.rule,function_to_call:0 |
4411 | +msgid "Method" |
4412 | +msgstr "" |
4413 | + |
4414 | +#. module: account_statement_base_completion |
4415 | +#: code:addons/account_statement_base_completion/statement.py:326 |
4416 | +#, python-format |
4417 | +msgid "" |
4418 | +"Line named \"%s\" (Ref:%s) was matched by more than one partner while " |
4419 | +"looking on partner by name" |
4420 | +msgstr "" |
4421 | + |
4422 | +#. module: account_statement_base_completion |
4423 | +#: code:addons/account_statement_base_completion/statement.py:504 |
4424 | +#, python-format |
4425 | +msgid "Statement ID %s auto-completed for %s lines completed" |
4426 | +msgstr "" |
4427 | + |
4428 | +#. module: account_statement_base_completion |
4429 | +#: code:addons/account_statement_base_completion/statement.py:500 |
4430 | +#, python-format |
4431 | +msgid "" |
4432 | +"%s Bank Statement ID %s has %s lines completed by %s \n" |
4433 | +"%s\n" |
4434 | +"%s\n" |
4435 | +msgstr "" |
4436 | + |
4437 | +#. module: account_statement_base_completion |
4438 | +#: model:ir.model,name:account_statement_base_completion.model_account_bank_statement_line |
4439 | +msgid "Bank Statement Line" |
4440 | +msgstr "" |
4441 | + |
4442 | +#. module: account_statement_base_completion |
4443 | +#: field:account.bank.statement.line,additionnal_bank_fields:0 |
4444 | +msgid "Additionnal infos from bank" |
4445 | +msgstr "" |
4446 | + |
4447 | +#. module: account_statement_base_completion |
4448 | +#: view:account.statement.profile:0 |
4449 | +msgid "Auto-Completion Rules" |
4450 | +msgstr "" |
4451 | + |
4452 | +#. module: account_statement_base_completion |
4453 | +#: view:account.bank.statement:0 |
4454 | +msgid "Importation related infos" |
4455 | +msgstr "" |
4456 | + |
4457 | +#. module: account_statement_base_completion |
4458 | +#: code:addons/account_statement_base_completion/statement.py:159 |
4459 | +#: code:addons/account_statement_base_completion/statement.py:179 |
4460 | +#, python-format |
4461 | +msgid "Invalid invoice type for completion: %" |
4462 | +msgstr "" |
4463 | + |
4464 | +#. module: account_statement_base_completion |
4465 | +#: field:account.statement.completion.rule,name:0 |
4466 | +msgid "Name" |
4467 | +msgstr "" |
4468 | + |
4469 | +#. module: account_statement_base_completion |
4470 | +#: model:ir.model,name:account_statement_base_completion.model_account_statement_profile |
4471 | +msgid "Statement Profile" |
4472 | +msgstr "" |
4473 | + |
4474 | +#. module: account_statement_base_completion |
4475 | +#: view:account.bank.statement:0 |
4476 | +msgid "Auto Completion" |
4477 | +msgstr "" |
4478 | + |
4479 | +#. module: account_statement_base_completion |
4480 | +#: view:account.statement.completion.rule:0 |
4481 | +#: model:ir.actions.act_window,name:account_statement_base_completion.action_st_completion_rule_tree |
4482 | +#: model:ir.ui.menu,name:account_statement_base_completion.menu_action_st_completion_rule_tree_menu |
4483 | +msgid "Statement Completion Rule" |
4484 | +msgstr "" |
4485 | + |
4486 | +#. module: account_statement_base_completion |
4487 | +#: model:ir.model,name:account_statement_base_completion.model_account_statement_completion_rule |
4488 | +msgid "account.statement.completion.rule" |
4489 | +msgstr "" |
4490 | + |
4491 | +#. module: account_statement_base_completion |
4492 | +#: help:account.bank.statement.line,additionnal_bank_fields:0 |
4493 | +msgid "" |
4494 | +"Used by completion and import system. Adds every field that is present in " |
4495 | +"your bank/office statement file" |
4496 | +msgstr "" |
4497 | + |
4498 | +#. module: account_statement_base_completion |
4499 | +#: field:account.statement.completion.rule,profile_ids:0 |
4500 | +#: field:account.statement.profile,rule_ids:0 |
4501 | +msgid "Related statement profiles" |
4502 | +msgstr "" |
4503 | + |
4504 | +#. module: account_statement_base_completion |
4505 | +#: code:addons/account_statement_base_completion/statement.py:158 |
4506 | +#: code:addons/account_statement_base_completion/statement.py:178 |
4507 | +#, python-format |
4508 | +msgid "System error" |
4509 | +msgstr "" |
4510 | + |
4511 | +#. module: account_statement_base_completion |
4512 | +#: field:account.bank.statement.line,already_completed:0 |
4513 | +msgid "Auto-Completed" |
4514 | +msgstr "" |
4515 | + |
4516 | +#. module: account_statement_base_completion |
4517 | +#: code:addons/account_statement_base_completion/statement.py:448 |
4518 | +#: code:addons/account_statement_base_completion/statement.py:466 |
4519 | +#, python-format |
4520 | +msgid "ORM bypass error" |
4521 | +msgstr "" |
4522 | + |
4523 | +#. module: account_statement_base_completion |
4524 | +#: field:account.statement.completion.rule,sequence:0 |
4525 | +msgid "Sequence" |
4526 | +msgstr "" |
4527 | + |
4528 | +#. module: account_statement_base_completion |
4529 | +#: code:addons/account_statement_base_completion/statement.py:280 |
4530 | +#, python-format |
4531 | +msgid "" |
4532 | +"Line named \"%s\" (Ref:%s) was matched by more than one partner while " |
4533 | +"looking on partner label: %s" |
4534 | +msgstr "" |
4535 | + |
4536 | +#. module: account_statement_base_completion |
4537 | +#: help:account.statement.completion.rule,sequence:0 |
4538 | +msgid "Lower means parsed first." |
4539 | +msgstr "" |
4540 | + |
4541 | +#. module: account_statement_base_completion |
4542 | +#: field:res.partner,bank_statement_label:0 |
4543 | +msgid "Bank Statement Label" |
4544 | +msgstr "" |
4545 | + |
4546 | +#. module: account_statement_base_completion |
4547 | +#: help:account.bank.statement.line,already_completed:0 |
4548 | +msgid "" |
4549 | +"When this checkbox is ticked, the auto-completion process/button will ignore " |
4550 | +"this line." |
4551 | +msgstr "" |
4552 | + |
4553 | +#. module: account_statement_base_completion |
4554 | +#: help:res.partner,bank_statement_label:0 |
4555 | +msgid "" |
4556 | +"Enter the various label found on your bank statement separated by a ; If " |
4557 | +" one of this label is include in the bank statement line, the " |
4558 | +"partner will be automatically filled (as long as you use " |
4559 | +"this method/rules in your statement profile)." |
4560 | +msgstr "" |
4561 | + |
4562 | +#. module: account_statement_base_completion |
4563 | +#: model:ir.model,name:account_statement_base_completion.model_res_partner |
4564 | +msgid "Partner" |
4565 | +msgstr "" |
4566 | + |
4567 | +#. module: account_statement_base_completion |
4568 | +#: view:account.bank.statement:0 |
4569 | +msgid "Completion Logs" |
4570 | +msgstr "" |
4571 | |
4572 | === added file 'account_statement_base_completion/i18n/account_statement_base_completion.pot' |
4573 | --- account_statement_base_completion/i18n/account_statement_base_completion.pot 1970-01-01 00:00:00 +0000 |
4574 | +++ account_statement_base_completion/i18n/account_statement_base_completion.pot 2014-04-03 07:40:14 +0000 |
4575 | @@ -0,0 +1,199 @@ |
4576 | +# Translation of OpenERP Server. |
4577 | +# This file contains the translation of the following modules: |
4578 | +# * account_statement_base_completion |
4579 | +# |
4580 | +msgid "" |
4581 | +msgstr "" |
4582 | +"Project-Id-Version: OpenERP Server 7.0\n" |
4583 | +"Report-Msgid-Bugs-To: \n" |
4584 | +"POT-Creation-Date: 2014-01-21 11:57+0000\n" |
4585 | +"PO-Revision-Date: 2014-01-21 11:57+0000\n" |
4586 | +"Last-Translator: <>\n" |
4587 | +"Language-Team: \n" |
4588 | +"MIME-Version: 1.0\n" |
4589 | +"Content-Type: text/plain; charset=UTF-8\n" |
4590 | +"Content-Transfer-Encoding: \n" |
4591 | +"Plural-Forms: \n" |
4592 | + |
4593 | +#. module: account_statement_base_completion |
4594 | +#: view:account.statement.completion.rule:0 |
4595 | +msgid "Related Profiles" |
4596 | +msgstr "" |
4597 | + |
4598 | +#. module: account_statement_base_completion |
4599 | +#: help:account.bank.statement.line,label:0 |
4600 | +msgid "Generic field to store a label given from the bank/office on which we can base the default/standard providen rule." |
4601 | +msgstr "" |
4602 | + |
4603 | +#. module: account_statement_base_completion |
4604 | +#: code:addons/account_statement_base_completion/statement.py:169 |
4605 | +#, python-format |
4606 | +msgid "Line named \"%s\" (Ref:%s) was matched by more than one partner while looking on %s invoices" |
4607 | +msgstr "" |
4608 | + |
4609 | +#. module: account_statement_base_completion |
4610 | +#: field:account.bank.statement,completion_logs:0 |
4611 | +msgid "Completion Log" |
4612 | +msgstr "" |
4613 | + |
4614 | +#. module: account_statement_base_completion |
4615 | +#: field:account.bank.statement.line,label:0 |
4616 | +msgid "Label" |
4617 | +msgstr "" |
4618 | + |
4619 | +#. module: account_statement_base_completion |
4620 | +#: model:ir.model,name:account_statement_base_completion.model_account_bank_statement |
4621 | +msgid "Bank Statement" |
4622 | +msgstr "" |
4623 | + |
4624 | +#. module: account_statement_base_completion |
4625 | +#: field:account.statement.completion.rule,function_to_call:0 |
4626 | +msgid "Method" |
4627 | +msgstr "" |
4628 | + |
4629 | +#. module: account_statement_base_completion |
4630 | +#: code:addons/account_statement_base_completion/statement.py:326 |
4631 | +#, python-format |
4632 | +msgid "Line named \"%s\" (Ref:%s) was matched by more than one partner while looking on partner by name" |
4633 | +msgstr "" |
4634 | + |
4635 | +#. module: account_statement_base_completion |
4636 | +#: code:addons/account_statement_base_completion/statement.py:504 |
4637 | +#, python-format |
4638 | +msgid "Statement ID %s auto-completed for %s lines completed" |
4639 | +msgstr "" |
4640 | + |
4641 | +#. module: account_statement_base_completion |
4642 | +#: code:addons/account_statement_base_completion/statement.py:500 |
4643 | +#, python-format |
4644 | +msgid "%s Bank Statement ID %s has %s lines completed by %s \n" |
4645 | +"%s\n" |
4646 | +"%s\n" |
4647 | +"" |
4648 | +msgstr "" |
4649 | + |
4650 | +#. module: account_statement_base_completion |
4651 | +#: model:ir.model,name:account_statement_base_completion.model_account_bank_statement_line |
4652 | +msgid "Bank Statement Line" |
4653 | +msgstr "" |
4654 | + |
4655 | +#. module: account_statement_base_completion |
4656 | +#: field:account.bank.statement.line,additionnal_bank_fields:0 |
4657 | +msgid "Additionnal infos from bank" |
4658 | +msgstr "" |
4659 | + |
4660 | +#. module: account_statement_base_completion |
4661 | +#: view:account.statement.profile:0 |
4662 | +msgid "Auto-Completion Rules" |
4663 | +msgstr "" |
4664 | + |
4665 | +#. module: account_statement_base_completion |
4666 | +#: view:account.bank.statement:0 |
4667 | +msgid "Importation related infos" |
4668 | +msgstr "" |
4669 | + |
4670 | +#. module: account_statement_base_completion |
4671 | +#: code:addons/account_statement_base_completion/statement.py:159 |
4672 | +#: code:addons/account_statement_base_completion/statement.py:179 |
4673 | +#, python-format |
4674 | +msgid "Invalid invoice type for completion: %" |
4675 | +msgstr "" |
4676 | + |
4677 | +#. module: account_statement_base_completion |
4678 | +#: field:account.statement.completion.rule,name:0 |
4679 | +msgid "Name" |
4680 | +msgstr "" |
4681 | + |
4682 | +#. module: account_statement_base_completion |
4683 | +#: model:ir.model,name:account_statement_base_completion.model_account_statement_profile |
4684 | +msgid "Statement Profile" |
4685 | +msgstr "" |
4686 | + |
4687 | +#. module: account_statement_base_completion |
4688 | +#: view:account.bank.statement:0 |
4689 | +msgid "Auto Completion" |
4690 | +msgstr "" |
4691 | + |
4692 | +#. module: account_statement_base_completion |
4693 | +#: view:account.statement.completion.rule:0 |
4694 | +#: model:ir.actions.act_window,name:account_statement_base_completion.action_st_completion_rule_tree |
4695 | +#: model:ir.ui.menu,name:account_statement_base_completion.menu_action_st_completion_rule_tree_menu |
4696 | +msgid "Statement Completion Rule" |
4697 | +msgstr "" |
4698 | + |
4699 | +#. module: account_statement_base_completion |
4700 | +#: model:ir.model,name:account_statement_base_completion.model_account_statement_completion_rule |
4701 | +msgid "account.statement.completion.rule" |
4702 | +msgstr "" |
4703 | + |
4704 | +#. module: account_statement_base_completion |
4705 | +#: help:account.bank.statement.line,additionnal_bank_fields:0 |
4706 | +msgid "Used by completion and import system. Adds every field that is present in your bank/office statement file" |
4707 | +msgstr "" |
4708 | + |
4709 | +#. module: account_statement_base_completion |
4710 | +#: field:account.statement.completion.rule,profile_ids:0 |
4711 | +#: field:account.statement.profile,rule_ids:0 |
4712 | +msgid "Related statement profiles" |
4713 | +msgstr "" |
4714 | + |
4715 | +#. module: account_statement_base_completion |
4716 | +#: code:addons/account_statement_base_completion/statement.py:158 |
4717 | +#: code:addons/account_statement_base_completion/statement.py:178 |
4718 | +#, python-format |
4719 | +msgid "System error" |
4720 | +msgstr "" |
4721 | + |
4722 | +#. module: account_statement_base_completion |
4723 | +#: field:account.bank.statement.line,already_completed:0 |
4724 | +msgid "Auto-Completed" |
4725 | +msgstr "" |
4726 | + |
4727 | +#. module: account_statement_base_completion |
4728 | +#: code:addons/account_statement_base_completion/statement.py:448 |
4729 | +#: code:addons/account_statement_base_completion/statement.py:466 |
4730 | +#, python-format |
4731 | +msgid "ORM bypass error" |
4732 | +msgstr "" |
4733 | + |
4734 | +#. module: account_statement_base_completion |
4735 | +#: field:account.statement.completion.rule,sequence:0 |
4736 | +msgid "Sequence" |
4737 | +msgstr "" |
4738 | + |
4739 | +#. module: account_statement_base_completion |
4740 | +#: code:addons/account_statement_base_completion/statement.py:280 |
4741 | +#, python-format |
4742 | +msgid "Line named \"%s\" (Ref:%s) was matched by more than one partner while looking on partner label: %s" |
4743 | +msgstr "" |
4744 | + |
4745 | +#. module: account_statement_base_completion |
4746 | +#: help:account.statement.completion.rule,sequence:0 |
4747 | +msgid "Lower means parsed first." |
4748 | +msgstr "" |
4749 | + |
4750 | +#. module: account_statement_base_completion |
4751 | +#: field:res.partner,bank_statement_label:0 |
4752 | +msgid "Bank Statement Label" |
4753 | +msgstr "" |
4754 | + |
4755 | +#. module: account_statement_base_completion |
4756 | +#: help:account.bank.statement.line,already_completed:0 |
4757 | +msgid "When this checkbox is ticked, the auto-completion process/button will ignore this line." |
4758 | +msgstr "" |
4759 | + |
4760 | +#. module: account_statement_base_completion |
4761 | +#: help:res.partner,bank_statement_label:0 |
4762 | +msgid "Enter the various label found on your bank statement separated by a ; If one of this label is include in the bank statement line, the partner will be automatically filled (as long as you use this method/rules in your statement profile)." |
4763 | +msgstr "" |
4764 | + |
4765 | +#. module: account_statement_base_completion |
4766 | +#: model:ir.model,name:account_statement_base_completion.model_res_partner |
4767 | +msgid "Partner" |
4768 | +msgstr "" |
4769 | + |
4770 | +#. module: account_statement_base_completion |
4771 | +#: view:account.bank.statement:0 |
4772 | +msgid "Completion Logs" |
4773 | +msgstr "" |
4774 | + |
4775 | |
4776 | === added file 'account_statement_base_completion/i18n/fr.po' |
4777 | --- account_statement_base_completion/i18n/fr.po 1970-01-01 00:00:00 +0000 |
4778 | +++ account_statement_base_completion/i18n/fr.po 2014-04-03 07:40:14 +0000 |
4779 | @@ -0,0 +1,216 @@ |
4780 | +# French translation for banking-addons |
4781 | +# Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 |
4782 | +# This file is distributed under the same license as the banking-addons package. |
4783 | +# FIRST AUTHOR <EMAIL@ADDRESS>, 2014. |
4784 | +# |
4785 | +msgid "" |
4786 | +msgstr "" |
4787 | +"Project-Id-Version: banking-addons\n" |
4788 | +"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" |
4789 | +"POT-Creation-Date: 2014-01-21 11:57+0000\n" |
4790 | +"PO-Revision-Date: 2014-03-21 15:17+0000\n" |
4791 | +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" |
4792 | +"Language-Team: French <fr@li.org>\n" |
4793 | +"MIME-Version: 1.0\n" |
4794 | +"Content-Type: text/plain; charset=UTF-8\n" |
4795 | +"Content-Transfer-Encoding: 8bit\n" |
4796 | +"X-Launchpad-Export-Date: 2014-03-22 07:11+0000\n" |
4797 | +"X-Generator: Launchpad (build 16967)\n" |
4798 | + |
4799 | +#. module: account_statement_base_completion |
4800 | +#: view:account.statement.completion.rule:0 |
4801 | +msgid "Related Profiles" |
4802 | +msgstr "" |
4803 | + |
4804 | +#. module: account_statement_base_completion |
4805 | +#: help:account.bank.statement.line,label:0 |
4806 | +msgid "" |
4807 | +"Generic field to store a label given from the bank/office on which we can " |
4808 | +"base the default/standard providen rule." |
4809 | +msgstr "" |
4810 | + |
4811 | +#. module: account_statement_base_completion |
4812 | +#: code:addons/account_statement_base_completion/statement.py:169 |
4813 | +#, python-format |
4814 | +msgid "" |
4815 | +"Line named \"%s\" (Ref:%s) was matched by more than one partner while " |
4816 | +"looking on %s invoices" |
4817 | +msgstr "" |
4818 | + |
4819 | +#. module: account_statement_base_completion |
4820 | +#: field:account.bank.statement,completion_logs:0 |
4821 | +msgid "Completion Log" |
4822 | +msgstr "" |
4823 | + |
4824 | +#. module: account_statement_base_completion |
4825 | +#: field:account.bank.statement.line,label:0 |
4826 | +msgid "Label" |
4827 | +msgstr "" |
4828 | + |
4829 | +#. module: account_statement_base_completion |
4830 | +#: model:ir.model,name:account_statement_base_completion.model_account_bank_statement |
4831 | +msgid "Bank Statement" |
4832 | +msgstr "" |
4833 | + |
4834 | +#. module: account_statement_base_completion |
4835 | +#: field:account.statement.completion.rule,function_to_call:0 |
4836 | +msgid "Method" |
4837 | +msgstr "" |
4838 | + |
4839 | +#. module: account_statement_base_completion |
4840 | +#: code:addons/account_statement_base_completion/statement.py:326 |
4841 | +#, python-format |
4842 | +msgid "" |
4843 | +"Line named \"%s\" (Ref:%s) was matched by more than one partner while " |
4844 | +"looking on partner by name" |
4845 | +msgstr "" |
4846 | + |
4847 | +#. module: account_statement_base_completion |
4848 | +#: code:addons/account_statement_base_completion/statement.py:504 |
4849 | +#, python-format |
4850 | +msgid "Statement ID %s auto-completed for %s lines completed" |
4851 | +msgstr "" |
4852 | + |
4853 | +#. module: account_statement_base_completion |
4854 | +#: code:addons/account_statement_base_completion/statement.py:500 |
4855 | +#, python-format |
4856 | +msgid "" |
4857 | +"%s Bank Statement ID %s has %s lines completed by %s \n" |
4858 | +"%s\n" |
4859 | +"%s\n" |
4860 | +msgstr "" |
4861 | + |
4862 | +#. module: account_statement_base_completion |
4863 | +#: model:ir.model,name:account_statement_base_completion.model_account_bank_statement_line |
4864 | +msgid "Bank Statement Line" |
4865 | +msgstr "" |
4866 | + |
4867 | +#. module: account_statement_base_completion |
4868 | +#: field:account.bank.statement.line,additionnal_bank_fields:0 |
4869 | +msgid "Additionnal infos from bank" |
4870 | +msgstr "" |
4871 | + |
4872 | +#. module: account_statement_base_completion |
4873 | +#: view:account.statement.profile:0 |
4874 | +msgid "Auto-Completion Rules" |
4875 | +msgstr "" |
4876 | + |
4877 | +#. module: account_statement_base_completion |
4878 | +#: view:account.bank.statement:0 |
4879 | +msgid "Importation related infos" |
4880 | +msgstr "" |
4881 | + |
4882 | +#. module: account_statement_base_completion |
4883 | +#: code:addons/account_statement_base_completion/statement.py:159 |
4884 | +#: code:addons/account_statement_base_completion/statement.py:179 |
4885 | +#, python-format |
4886 | +msgid "Invalid invoice type for completion: %" |
4887 | +msgstr "" |
4888 | + |
4889 | +#. module: account_statement_base_completion |
4890 | +#: field:account.statement.completion.rule,name:0 |
4891 | +msgid "Name" |
4892 | +msgstr "" |
4893 | + |
4894 | +#. module: account_statement_base_completion |
4895 | +#: model:ir.model,name:account_statement_base_completion.model_account_statement_profile |
4896 | +msgid "Statement Profile" |
4897 | +msgstr "" |
4898 | + |
4899 | +#. module: account_statement_base_completion |
4900 | +#: view:account.bank.statement:0 |
4901 | +msgid "Auto Completion" |
4902 | +msgstr "" |
4903 | + |
4904 | +#. module: account_statement_base_completion |
4905 | +#: view:account.statement.completion.rule:0 |
4906 | +#: model:ir.actions.act_window,name:account_statement_base_completion.action_st_completion_rule_tree |
4907 | +#: model:ir.ui.menu,name:account_statement_base_completion.menu_action_st_completion_rule_tree_menu |
4908 | +msgid "Statement Completion Rule" |
4909 | +msgstr "" |
4910 | + |
4911 | +#. module: account_statement_base_completion |
4912 | +#: model:ir.model,name:account_statement_base_completion.model_account_statement_completion_rule |
4913 | +msgid "account.statement.completion.rule" |
4914 | +msgstr "" |
4915 | + |
4916 | +#. module: account_statement_base_completion |
4917 | +#: help:account.bank.statement.line,additionnal_bank_fields:0 |
4918 | +msgid "" |
4919 | +"Used by completion and import system. Adds every field that is present in " |
4920 | +"your bank/office statement file" |
4921 | +msgstr "" |
4922 | + |
4923 | +#. module: account_statement_base_completion |
4924 | +#: field:account.statement.completion.rule,profile_ids:0 |
4925 | +#: field:account.statement.profile,rule_ids:0 |
4926 | +msgid "Related statement profiles" |
4927 | +msgstr "" |
4928 | + |
4929 | +#. module: account_statement_base_completion |
4930 | +#: code:addons/account_statement_base_completion/statement.py:158 |
4931 | +#: code:addons/account_statement_base_completion/statement.py:178 |
4932 | +#, python-format |
4933 | +msgid "System error" |
4934 | +msgstr "" |
4935 | + |
4936 | +#. module: account_statement_base_completion |
4937 | +#: field:account.bank.statement.line,already_completed:0 |
4938 | +msgid "Auto-Completed" |
4939 | +msgstr "" |
4940 | + |
4941 | +#. module: account_statement_base_completion |
4942 | +#: code:addons/account_statement_base_completion/statement.py:448 |
4943 | +#: code:addons/account_statement_base_completion/statement.py:466 |
4944 | +#, python-format |
4945 | +msgid "ORM bypass error" |
4946 | +msgstr "" |
4947 | + |
4948 | +#. module: account_statement_base_completion |
4949 | +#: field:account.statement.completion.rule,sequence:0 |
4950 | +msgid "Sequence" |
4951 | +msgstr "" |
4952 | + |
4953 | +#. module: account_statement_base_completion |
4954 | +#: code:addons/account_statement_base_completion/statement.py:280 |
4955 | +#, python-format |
4956 | +msgid "" |
4957 | +"Line named \"%s\" (Ref:%s) was matched by more than one partner while " |
4958 | +"looking on partner label: %s" |
4959 | +msgstr "" |
4960 | + |
4961 | +#. module: account_statement_base_completion |
4962 | +#: help:account.statement.completion.rule,sequence:0 |
4963 | +msgid "Lower means parsed first." |
4964 | +msgstr "" |
4965 | + |
4966 | +#. module: account_statement_base_completion |
4967 | +#: field:res.partner,bank_statement_label:0 |
4968 | +msgid "Bank Statement Label" |
4969 | +msgstr "" |
4970 | + |
4971 | +#. module: account_statement_base_completion |
4972 | +#: help:account.bank.statement.line,already_completed:0 |
4973 | +msgid "" |
4974 | +"When this checkbox is ticked, the auto-completion process/button will ignore " |
4975 | +"this line." |
4976 | +msgstr "" |
4977 | + |
4978 | +#. module: account_statement_base_completion |
4979 | +#: help:res.partner,bank_statement_label:0 |
4980 | +msgid "" |
4981 | +"Enter the various label found on your bank statement separated by a ; If " |
4982 | +" one of this label is include in the bank statement line, the " |
4983 | +"partner will be automatically filled (as long as you use " |
4984 | +"this method/rules in your statement profile)." |
4985 | +msgstr "" |
4986 | + |
4987 | +#. module: account_statement_base_completion |
4988 | +#: model:ir.model,name:account_statement_base_completion.model_res_partner |
4989 | +msgid "Partner" |
4990 | +msgstr "" |
4991 | + |
4992 | +#. module: account_statement_base_completion |
4993 | +#: view:account.bank.statement:0 |
4994 | +msgid "Completion Logs" |
4995 | +msgstr "" |
4996 | |
4997 | === added file 'account_statement_base_completion/partner.py' |
4998 | --- account_statement_base_completion/partner.py 1970-01-01 00:00:00 +0000 |
4999 | +++ account_statement_base_completion/partner.py 2014-04-03 07:40:14 +0000 |
5000 | @@ -0,0 +1,38 @@ |
Hi, Vincent, please make the MP against the correct branch bank-statement- reconcile- 70. You can do it from "Resubmit proposal" link on the right part.
Regards.