mirror of
https://github.com/OCA/account-reconcile.git
synced 2025-01-20 12:27:39 +02:00
Set as uninstallable and moved to __unported__ all modules.
This commit is contained in:
@@ -1,24 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Author: Guewen Baconnier
|
||||
# Copyright 2012 Camptocamp SA
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
# published by the Free Software Foundation, either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
import easy_reconcile
|
||||
import base_advanced_reconciliation
|
||||
import advanced_reconciliation
|
||||
@@ -1,83 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Author: Guewen Baconnier
|
||||
# Copyright 2012 Camptocamp SA
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
# published by the Free Software Foundation, either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
{'name': "Advanced Reconcile",
|
||||
'version': '1.0',
|
||||
'author': 'Camptocamp',
|
||||
'maintainer': 'Camptocamp',
|
||||
'category': 'Finance',
|
||||
'complexity': 'normal',
|
||||
'depends': ['account_easy_reconcile',
|
||||
],
|
||||
'description': """
|
||||
Advanced reconciliation methods for the module account_easy_reconcile.
|
||||
|
||||
In addition to the features implemented in account_easy_reconcile, which are:
|
||||
- reconciliation facilities for big volume of transactions
|
||||
- setup different profiles of reconciliation by account
|
||||
- each profile can use many methods of reconciliation
|
||||
- this module is also a base to create others reconciliation methods
|
||||
which can plug in the profiles
|
||||
- a profile a reconciliation can be run manually or by a cron
|
||||
- monitoring of reconcilation runs with an history
|
||||
|
||||
It implements a basis to created advanced reconciliation methods in a few lines
|
||||
of code.
|
||||
|
||||
Typically, such a method can be:
|
||||
- Reconcile Journal items if the partner and the ref are equal
|
||||
- Reconcile Journal items if the partner is equal and the ref
|
||||
is the same than ref or name
|
||||
- Reconcile Journal items if the partner is equal and the ref
|
||||
match with a pattern
|
||||
|
||||
And they allows:
|
||||
- Reconciliations with multiple credit / multiple debit lines
|
||||
- Partial reconciliations
|
||||
- Write-off amount as well
|
||||
|
||||
A method is already implemented in this module, it matches on items:
|
||||
- Partner
|
||||
- Ref on credit move lines should be case insensitive equals to the ref or
|
||||
the name of the debit move line
|
||||
|
||||
The base class to find the reconciliations is built to be as efficient as
|
||||
possible.
|
||||
|
||||
So basically, if you have an invoice with 3 payments (one per month), the first
|
||||
month, it will partial reconcile the debit move line with the first payment, the second
|
||||
month, it will partial reconcile the debit move line with 2 first payments,
|
||||
the third month, it will make the full reconciliation.
|
||||
|
||||
This module is perfectly adapted for E-Commerce business where a big volume of
|
||||
move lines and so, reconciliations, are involved and payments often come from
|
||||
many offices.
|
||||
|
||||
""",
|
||||
'website': 'http://www.camptocamp.com',
|
||||
'data': ['easy_reconcile_view.xml'],
|
||||
'test': [],
|
||||
'images': [],
|
||||
'installable': True,
|
||||
'auto_install': False,
|
||||
'license': 'AGPL-3',
|
||||
'application': True,
|
||||
}
|
||||
@@ -1,118 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Author: Guewen Baconnier
|
||||
# Copyright 2012 Camptocamp SA
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
# published by the Free Software Foundation, either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from openerp.osv import orm
|
||||
|
||||
|
||||
class easy_reconcile_advanced_ref(orm.TransientModel):
|
||||
|
||||
_name = 'easy.reconcile.advanced.ref'
|
||||
_inherit = 'easy.reconcile.advanced'
|
||||
|
||||
def _skip_line(self, cr, uid, rec, move_line, context=None):
|
||||
"""
|
||||
When True is returned on some conditions, the credit move line
|
||||
will be skipped for reconciliation. Can be inherited to
|
||||
skip on some conditions. ie: ref or partner_id is empty.
|
||||
"""
|
||||
return not (move_line.get('ref') and move_line.get('partner_id'))
|
||||
|
||||
def _matchers(self, cr, uid, rec, move_line, context=None):
|
||||
"""
|
||||
Return the values used as matchers to find the opposite lines
|
||||
|
||||
All the matcher keys in the dict must have their equivalent in
|
||||
the `_opposite_matchers`.
|
||||
|
||||
The values of each matcher key will be searched in the
|
||||
one returned by the `_opposite_matchers`
|
||||
|
||||
Must be inherited to implement the matchers for one method
|
||||
|
||||
For instance, it can return:
|
||||
return ('ref', move_line['rec'])
|
||||
|
||||
or
|
||||
return (('partner_id', move_line['partner_id']),
|
||||
('ref', "prefix_%s" % move_line['rec']))
|
||||
|
||||
All the matchers have to be found in the opposite lines
|
||||
to consider them as "opposite"
|
||||
|
||||
The matchers will be evaluated in the same order as declared
|
||||
vs the the opposite matchers, so you can gain performance by
|
||||
declaring first the partners with the less computation.
|
||||
|
||||
All matchers should match with their opposite to be considered
|
||||
as "matching".
|
||||
So with the previous example, partner_id and ref have to be
|
||||
equals on the opposite line matchers.
|
||||
|
||||
:return: tuple of tuples (key, value) where the keys are
|
||||
the matchers keys
|
||||
(must be the same than `_opposite_matchers` returns,
|
||||
and their values to match in the opposite lines.
|
||||
A matching key can have multiples values.
|
||||
"""
|
||||
return (('partner_id', move_line['partner_id']),
|
||||
('ref', move_line['ref'].lower().strip()))
|
||||
|
||||
def _opposite_matchers(self, cr, uid, rec, move_line, context=None):
|
||||
"""
|
||||
Return the values of the opposite line used as matchers
|
||||
so the line is matched
|
||||
|
||||
Must be inherited to implement the matchers for one method
|
||||
It can be inherited to apply some formatting of fields
|
||||
(strip(), lower() and so on)
|
||||
|
||||
This method is the counterpart of the `_matchers()` method.
|
||||
|
||||
Each matcher has to yield its value respecting the order
|
||||
of the `_matchers()`.
|
||||
|
||||
When a matcher does not correspond, the next matchers won't
|
||||
be evaluated so the ones which need the less computation
|
||||
have to be executed first.
|
||||
|
||||
If the `_matchers()` returns:
|
||||
(('partner_id', move_line['partner_id']),
|
||||
('ref', move_line['ref']))
|
||||
|
||||
Here, you should yield :
|
||||
yield ('partner_id', move_line['partner_id'])
|
||||
yield ('ref', move_line['ref'])
|
||||
|
||||
Note that a matcher can contain multiple values, as instance,
|
||||
if for a move line, you want to search from its `ref` in the
|
||||
`ref` or `name` fields of the opposite move lines, you have to
|
||||
yield ('partner_id', move_line['partner_id'])
|
||||
yield ('ref', (move_line['ref'], move_line['name'])
|
||||
|
||||
An OR is used between the values for the same key.
|
||||
An AND is used between the differents keys.
|
||||
|
||||
:param dict move_line: values of the move_line
|
||||
:yield: matchers as tuple ('matcher key', value(s))
|
||||
"""
|
||||
yield ('partner_id', move_line['partner_id'])
|
||||
yield ('ref', ((move_line['ref'] or '').lower().strip(),
|
||||
move_line['name'].lower().strip()))
|
||||
@@ -1,272 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Author: Guewen Baconnier
|
||||
# Copyright 2012 Camptocamp SA
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
# published by the Free Software Foundation, either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from itertools import product
|
||||
from openerp.osv import orm
|
||||
|
||||
|
||||
class easy_reconcile_advanced(orm.AbstractModel):
|
||||
|
||||
_name = 'easy.reconcile.advanced'
|
||||
_inherit = 'easy.reconcile.base'
|
||||
|
||||
def _query_debit(self, cr, uid, rec, context=None):
|
||||
"""Select all move (debit>0) as candidate. """
|
||||
select = self._select(rec)
|
||||
sql_from = self._from(rec)
|
||||
where, params = self._where(rec)
|
||||
where += " AND account_move_line.debit > 0 "
|
||||
|
||||
where2, params2 = self._get_filter(cr, uid, rec, context=context)
|
||||
|
||||
query = ' '.join((select, sql_from, where, where2))
|
||||
|
||||
cr.execute(query, params + params2)
|
||||
return cr.dictfetchall()
|
||||
|
||||
def _query_credit(self, cr, uid, rec, context=None):
|
||||
"""Select all move (credit>0) as candidate. """
|
||||
select = self._select(rec)
|
||||
sql_from = self._from(rec)
|
||||
where, params = self._where(rec)
|
||||
where += " AND account_move_line.credit > 0 "
|
||||
|
||||
where2, params2 = self._get_filter(cr, uid, rec, context=context)
|
||||
|
||||
query = ' '.join((select, sql_from, where, where2))
|
||||
|
||||
cr.execute(query, params + params2)
|
||||
return cr.dictfetchall()
|
||||
|
||||
def _matchers(self, cr, uid, rec, move_line, context=None):
|
||||
"""
|
||||
Return the values used as matchers to find the opposite lines
|
||||
|
||||
All the matcher keys in the dict must have their equivalent in
|
||||
the `_opposite_matchers`.
|
||||
|
||||
The values of each matcher key will be searched in the
|
||||
one returned by the `_opposite_matchers`
|
||||
|
||||
Must be inherited to implement the matchers for one method
|
||||
|
||||
As instance, it can return:
|
||||
return ('ref', move_line['rec'])
|
||||
|
||||
or
|
||||
return (('partner_id', move_line['partner_id']),
|
||||
('ref', "prefix_%s" % move_line['rec']))
|
||||
|
||||
All the matchers have to be found in the opposite lines
|
||||
to consider them as "opposite"
|
||||
|
||||
The matchers will be evaluated in the same order as declared
|
||||
vs the the opposite matchers, so you can gain performance by
|
||||
declaring first the partners with the less computation.
|
||||
|
||||
All matchers should match with their opposite to be considered
|
||||
as "matching".
|
||||
So with the previous example, partner_id and ref have to be
|
||||
equals on the opposite line matchers.
|
||||
|
||||
:return: tuple of tuples (key, value) where the keys are
|
||||
the matchers keys
|
||||
(must be the same than `_opposite_matchers` returns,
|
||||
and their values to match in the opposite lines.
|
||||
A matching key can have multiples values.
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def _opposite_matchers(self, cr, uid, rec, move_line, context=None):
|
||||
"""
|
||||
Return the values of the opposite line used as matchers
|
||||
so the line is matched
|
||||
|
||||
Must be inherited to implement the matchers for one method
|
||||
It can be inherited to apply some formatting of fields
|
||||
(strip(), lower() and so on)
|
||||
|
||||
This method is the counterpart of the `_matchers()` method.
|
||||
|
||||
Each matcher has to yield its value respecting the order
|
||||
of the `_matchers()`.
|
||||
|
||||
When a matcher does not correspond, the next matchers won't
|
||||
be evaluated so the ones which need the less computation
|
||||
have to be executed first.
|
||||
|
||||
If the `_matchers()` returns:
|
||||
(('partner_id', move_line['partner_id']),
|
||||
('ref', move_line['ref']))
|
||||
|
||||
Here, you should yield :
|
||||
yield ('partner_id', move_line['partner_id'])
|
||||
yield ('ref', move_line['ref'])
|
||||
|
||||
Note that a matcher can contain multiple values, as instance,
|
||||
if for a move line, you want to search from its `ref` in the
|
||||
`ref` or `name` fields of the opposite move lines, you have to
|
||||
yield ('partner_id', move_line['partner_id'])
|
||||
yield ('ref', (move_line['ref'], move_line['name'])
|
||||
|
||||
An OR is used between the values for the same key.
|
||||
An AND is used between the differents keys.
|
||||
|
||||
:param dict move_line: values of the move_line
|
||||
:yield: matchers as tuple ('matcher key', value(s))
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
@staticmethod
|
||||
def _compare_values(key, value, opposite_value):
|
||||
"""Can be inherited to modify the equality condition
|
||||
specifically according to the matcher key (maybe using
|
||||
a like operator instead of equality on 'ref' as instance)
|
||||
"""
|
||||
# consider that empty vals are not valid matchers
|
||||
# it can still be inherited for some special cases
|
||||
# where it would be allowed
|
||||
if not (value and opposite_value):
|
||||
return False
|
||||
|
||||
if value == opposite_value:
|
||||
return True
|
||||
return False
|
||||
|
||||
@staticmethod
|
||||
def _compare_matcher_values(key, values, opposite_values):
|
||||
""" Compare every values from a matcher vs an opposite matcher
|
||||
and return True if it matches
|
||||
"""
|
||||
for value, ovalue in product(values, opposite_values):
|
||||
# we do not need to compare all values, if one matches
|
||||
# we are done
|
||||
if easy_reconcile_advanced._compare_values(key, value, ovalue):
|
||||
return True
|
||||
return False
|
||||
|
||||
@staticmethod
|
||||
def _compare_matchers(matcher, opposite_matcher):
|
||||
"""
|
||||
Prepare and check the matchers to compare
|
||||
"""
|
||||
mkey, mvalue = matcher
|
||||
omkey, omvalue = opposite_matcher
|
||||
assert mkey == omkey, ("A matcher %s is compared with a matcher %s, "
|
||||
" the _matchers and _opposite_matchers are probably wrong" %
|
||||
(mkey, omkey))
|
||||
if not isinstance(mvalue, (list, tuple)):
|
||||
mvalue = mvalue,
|
||||
if not isinstance(omvalue, (list, tuple)):
|
||||
omvalue = omvalue,
|
||||
return easy_reconcile_advanced._compare_matcher_values(mkey, mvalue, omvalue)
|
||||
|
||||
def _compare_opposite(self, cr, uid, rec, move_line, opposite_move_line,
|
||||
matchers, context=None):
|
||||
""" Iterate over the matchers of the move lines vs opposite move lines
|
||||
and if they all match, return True.
|
||||
|
||||
If all the matchers match for a move line and an opposite move line,
|
||||
they are candidate for a reconciliation.
|
||||
"""
|
||||
opp_matchers = self._opposite_matchers(cr, uid, rec, opposite_move_line,
|
||||
context=context)
|
||||
for matcher in matchers:
|
||||
try:
|
||||
opp_matcher = opp_matchers.next()
|
||||
except StopIteration:
|
||||
# if you fall here, you probably missed to put a `yield`
|
||||
# in `_opposite_matchers()`
|
||||
raise ValueError("Missing _opposite_matcher: %s" % matcher[0])
|
||||
|
||||
if not self._compare_matchers(matcher, opp_matcher):
|
||||
# if any of the matcher fails, the opposite line
|
||||
# is not a valid counterpart
|
||||
# directly returns so the next yield of _opposite_matchers
|
||||
# are not evaluated
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
def _search_opposites(self, cr, uid, rec, move_line, opposite_move_lines, context=None):
|
||||
"""
|
||||
Search the opposite move lines for a move line
|
||||
|
||||
:param dict move_line: the move line for which we search opposites
|
||||
:param list opposite_move_lines: list of dict of move lines values, the move
|
||||
lines we want to search for
|
||||
:return: list of matching lines
|
||||
"""
|
||||
matchers = self._matchers(cr, uid, rec, move_line, context=context)
|
||||
return [op for op in opposite_move_lines if
|
||||
self._compare_opposite(
|
||||
cr, uid, rec, move_line, op, matchers, context=context)]
|
||||
|
||||
def _action_rec(self, cr, uid, rec, context=None):
|
||||
credit_lines = self._query_credit(cr, uid, rec, context=context)
|
||||
debit_lines = self._query_debit(cr, uid, rec, context=context)
|
||||
return self._rec_auto_lines_advanced(
|
||||
cr, uid, rec, credit_lines, debit_lines, context=context)
|
||||
|
||||
def _skip_line(self, cr, uid, rec, move_line, context=None):
|
||||
"""
|
||||
When True is returned on some conditions, the credit move line
|
||||
will be skipped for reconciliation. Can be inherited to
|
||||
skip on some conditions. ie: ref or partner_id is empty.
|
||||
"""
|
||||
return False
|
||||
|
||||
def _rec_auto_lines_advanced(self, cr, uid, rec, credit_lines, debit_lines, context=None):
|
||||
""" Advanced reconciliation main loop """
|
||||
reconciled_ids = []
|
||||
partial_reconciled_ids = []
|
||||
reconcile_groups = []
|
||||
|
||||
for credit_line in credit_lines:
|
||||
if self._skip_line(cr, uid, rec, credit_line, context=context):
|
||||
continue
|
||||
|
||||
opposite_lines = self._search_opposites(
|
||||
cr, uid, rec, credit_line, debit_lines, context=context)
|
||||
|
||||
if not opposite_lines:
|
||||
continue
|
||||
|
||||
opposite_ids = [l['id'] for l in opposite_lines]
|
||||
line_ids = opposite_ids + [credit_line['id']]
|
||||
for group in reconcile_groups:
|
||||
if any([lid in group for lid in opposite_ids]):
|
||||
group.update(line_ids)
|
||||
break
|
||||
else:
|
||||
reconcile_groups.append(set(line_ids))
|
||||
|
||||
lines_by_id = dict([(l['id'], l) for l in credit_lines + debit_lines])
|
||||
for reconcile_group_ids in reconcile_groups:
|
||||
group_lines = [lines_by_id[lid] for lid in reconcile_group_ids]
|
||||
reconciled, full = self._reconcile_lines(
|
||||
cr, uid, rec, group_lines, allow_partial=True, context=context)
|
||||
if reconciled and full:
|
||||
reconciled_ids += reconcile_group_ids
|
||||
elif reconciled:
|
||||
partial_reconciled_ids += reconcile_group_ids
|
||||
|
||||
return reconciled_ids, partial_reconciled_ids
|
||||
@@ -1,36 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Author: Guewen Baconnier
|
||||
# Copyright 2012 Camptocamp SA
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
# published by the Free Software Foundation, either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from openerp.osv import orm
|
||||
|
||||
|
||||
class account_easy_reconcile_method(orm.Model):
|
||||
|
||||
_inherit = 'account.easy.reconcile.method'
|
||||
|
||||
def _get_all_rec_method(self, cr, uid, context=None):
|
||||
methods = super(account_easy_reconcile_method, self).\
|
||||
_get_all_rec_method(cr, uid, context=context)
|
||||
methods += [
|
||||
('easy.reconcile.advanced.ref',
|
||||
'Advanced. Partner and Ref.'),
|
||||
]
|
||||
return methods
|
||||
@@ -1,19 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<openerp>
|
||||
<data noupdate="0">
|
||||
<record id="view_easy_reconcile_form" model="ir.ui.view">
|
||||
<field name="name">account.easy.reconcile.form</field>
|
||||
<field name="model">account.easy.reconcile</field>
|
||||
<field name="inherit_id" ref="account_easy_reconcile.account_easy_reconcile_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<page name="information" position="inside">
|
||||
<group colspan="2" col="2">
|
||||
<separator colspan="4" string="Advanced. Partner and Ref"/>
|
||||
<label string="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." colspan="4"/>
|
||||
</group>
|
||||
</page>
|
||||
</field>
|
||||
</record>
|
||||
</data>
|
||||
</openerp>
|
||||
@@ -1,90 +0,0 @@
|
||||
# Translation of OpenERP Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * account_advanced_reconcile
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: OpenERP Server 7.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2014-01-21 11:54+0000\n"
|
||||
"PO-Revision-Date: 2014-01-21 11:54+0000\n"
|
||||
"Last-Translator: <>\n"
|
||||
"Language-Team: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"Plural-Forms: \n"
|
||||
|
||||
#. module: account_advanced_reconcile
|
||||
#: field:easy.reconcile.advanced,partner_ids:0
|
||||
#: field:easy.reconcile.advanced.ref,partner_ids:0
|
||||
msgid "Restrict on partners"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_advanced_reconcile
|
||||
#: field:easy.reconcile.advanced,account_id:0
|
||||
#: field:easy.reconcile.advanced.ref,account_id:0
|
||||
msgid "Account"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_advanced_reconcile
|
||||
#: model:ir.model,name:account_advanced_reconcile.model_account_easy_reconcile_method
|
||||
msgid "reconcile method for account_easy_reconcile"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_advanced_reconcile
|
||||
#: field:easy.reconcile.advanced,journal_id:0
|
||||
#: field:easy.reconcile.advanced.ref,journal_id:0
|
||||
msgid "Journal"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_advanced_reconcile
|
||||
#: field:easy.reconcile.advanced,account_profit_id:0
|
||||
#: field:easy.reconcile.advanced.ref,account_profit_id:0
|
||||
msgid "Account Profit"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_advanced_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
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."
|
||||
msgstr ""
|
||||
|
||||
#. module: account_advanced_reconcile
|
||||
#: field:easy.reconcile.advanced,filter:0
|
||||
#: field:easy.reconcile.advanced.ref,filter:0
|
||||
msgid "Filter"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_advanced_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
msgid "Advanced. Partner and Ref"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_advanced_reconcile
|
||||
#: field:easy.reconcile.advanced,date_base_on:0
|
||||
#: field:easy.reconcile.advanced.ref,date_base_on:0
|
||||
msgid "Date of reconciliation"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_advanced_reconcile
|
||||
#: model:ir.model,name:account_advanced_reconcile.model_easy_reconcile_advanced
|
||||
msgid "easy.reconcile.advanced"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_advanced_reconcile
|
||||
#: field:easy.reconcile.advanced,account_lost_id:0
|
||||
#: field:easy.reconcile.advanced.ref,account_lost_id:0
|
||||
msgid "Account Lost"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_advanced_reconcile
|
||||
#: model:ir.model,name:account_advanced_reconcile.model_easy_reconcile_advanced_ref
|
||||
msgid "easy.reconcile.advanced.ref"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_advanced_reconcile
|
||||
#: field:easy.reconcile.advanced,write_off:0
|
||||
#: field:easy.reconcile.advanced.ref,write_off:0
|
||||
msgid "Write off allowed"
|
||||
msgstr ""
|
||||
|
||||
@@ -1,98 +0,0 @@
|
||||
# Spanish translation for banking-addons
|
||||
# Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014
|
||||
# This file is distributed under the same license as the banking-addons package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, 2014.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: banking-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2014-01-21 11:54+0000\n"
|
||||
"PO-Revision-Date: 2014-06-05 22:30+0000\n"
|
||||
"Last-Translator: Pedro Manuel Baeza <pedro.baeza@gmail.com>\n"
|
||||
"Language-Team: Spanish <es@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-06-06 06:36+0000\n"
|
||||
"X-Generator: Launchpad (build 17031)\n"
|
||||
|
||||
#. module: account_advanced_reconcile
|
||||
#: field:easy.reconcile.advanced,partner_ids:0
|
||||
#: field:easy.reconcile.advanced.ref,partner_ids:0
|
||||
msgid "Restrict on partners"
|
||||
msgstr "Restringir a las empresas"
|
||||
|
||||
#. module: account_advanced_reconcile
|
||||
#: field:easy.reconcile.advanced,account_id:0
|
||||
#: field:easy.reconcile.advanced.ref,account_id:0
|
||||
msgid "Account"
|
||||
msgstr "Cuenta"
|
||||
|
||||
#. module: account_advanced_reconcile
|
||||
#: model:ir.model,name:account_advanced_reconcile.model_account_easy_reconcile_method
|
||||
msgid "reconcile method for account_easy_reconcile"
|
||||
msgstr "método de conciliación para account_easy_reconcile"
|
||||
|
||||
#. module: account_advanced_reconcile
|
||||
#: field:easy.reconcile.advanced,journal_id:0
|
||||
#: field:easy.reconcile.advanced.ref,journal_id:0
|
||||
msgid "Journal"
|
||||
msgstr "Diario"
|
||||
|
||||
#. module: account_advanced_reconcile
|
||||
#: field:easy.reconcile.advanced,account_profit_id:0
|
||||
#: field:easy.reconcile.advanced.ref,account_profit_id:0
|
||||
msgid "Account Profit"
|
||||
msgstr "Cuenta de ganancias"
|
||||
|
||||
#. module: account_advanced_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
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."
|
||||
msgstr ""
|
||||
"Casa múltiples líneas del debe con múltiples líneas del haber. Permite "
|
||||
"conciliación parcial. Las líneas deben tener la empresa, la referencia de la "
|
||||
"línea del haber se casa contra la referencia de la línea del debe o el "
|
||||
"nombre."
|
||||
|
||||
#. module: account_advanced_reconcile
|
||||
#: field:easy.reconcile.advanced,filter:0
|
||||
#: field:easy.reconcile.advanced.ref,filter:0
|
||||
msgid "Filter"
|
||||
msgstr "Filtro"
|
||||
|
||||
#. module: account_advanced_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
msgid "Advanced. Partner and Ref"
|
||||
msgstr "Avanzado. Empresa y referencia"
|
||||
|
||||
#. module: account_advanced_reconcile
|
||||
#: field:easy.reconcile.advanced,date_base_on:0
|
||||
#: field:easy.reconcile.advanced.ref,date_base_on:0
|
||||
msgid "Date of reconciliation"
|
||||
msgstr "Fecha de conciliación"
|
||||
|
||||
#. module: account_advanced_reconcile
|
||||
#: model:ir.model,name:account_advanced_reconcile.model_easy_reconcile_advanced
|
||||
msgid "easy.reconcile.advanced"
|
||||
msgstr "easy.reconcile.advanced"
|
||||
|
||||
#. module: account_advanced_reconcile
|
||||
#: field:easy.reconcile.advanced,account_lost_id:0
|
||||
#: field:easy.reconcile.advanced.ref,account_lost_id:0
|
||||
msgid "Account Lost"
|
||||
msgstr "Cuenta de pérdidas"
|
||||
|
||||
#. module: account_advanced_reconcile
|
||||
#: model:ir.model,name:account_advanced_reconcile.model_easy_reconcile_advanced_ref
|
||||
msgid "easy.reconcile.advanced.ref"
|
||||
msgstr "easy.reconcile.advanced.ref"
|
||||
|
||||
#. module: account_advanced_reconcile
|
||||
#: field:easy.reconcile.advanced,write_off:0
|
||||
#: field:easy.reconcile.advanced.ref,write_off:0
|
||||
msgid "Write off allowed"
|
||||
msgstr "Desajuste permitido"
|
||||
@@ -1,98 +0,0 @@
|
||||
# Translation of OpenERP Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * account_advanced_reconcile
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: OpenERP Server 6.1\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2014-01-21 11:54+0000\n"
|
||||
"PO-Revision-Date: 2014-03-21 15:24+0000\n"
|
||||
"Last-Translator: Guewen Baconnier @ Camptocamp <Unknown>\n"
|
||||
"Language-Team: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-05-22 06:49+0000\n"
|
||||
"X-Generator: Launchpad (build 17017)\n"
|
||||
"Language: \n"
|
||||
|
||||
#. module: account_advanced_reconcile
|
||||
#: field:easy.reconcile.advanced,partner_ids:0
|
||||
#: field:easy.reconcile.advanced.ref,partner_ids:0
|
||||
msgid "Restrict on partners"
|
||||
msgstr "Restriction sur les partenaires"
|
||||
|
||||
#. module: account_advanced_reconcile
|
||||
#: field:easy.reconcile.advanced,account_id:0
|
||||
#: field:easy.reconcile.advanced.ref,account_id:0
|
||||
msgid "Account"
|
||||
msgstr "Compte"
|
||||
|
||||
#. module: account_advanced_reconcile
|
||||
#: model:ir.model,name:account_advanced_reconcile.model_account_easy_reconcile_method
|
||||
msgid "reconcile method for account_easy_reconcile"
|
||||
msgstr "Méthode de lettrage pour le module account_easy_reconcile"
|
||||
|
||||
#. module: account_advanced_reconcile
|
||||
#: field:easy.reconcile.advanced,journal_id:0
|
||||
#: field:easy.reconcile.advanced.ref,journal_id:0
|
||||
msgid "Journal"
|
||||
msgstr "Journal"
|
||||
|
||||
#. module: account_advanced_reconcile
|
||||
#: field:easy.reconcile.advanced,account_profit_id:0
|
||||
#: field:easy.reconcile.advanced.ref,account_profit_id:0
|
||||
msgid "Account Profit"
|
||||
msgstr "Compte de produit"
|
||||
|
||||
#. module: account_advanced_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
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."
|
||||
msgstr ""
|
||||
"Le Lettrage peut s'effectuer sur plusieurs écritures de débit et crédit. Le "
|
||||
"Lettrage partiel est autorisé. Les écritures doivent avoir le même "
|
||||
"partenaire et la référence sur les écritures de crédit doit se retrouver "
|
||||
"dans la référence ou la description sur les écritures de débit."
|
||||
|
||||
#. module: account_advanced_reconcile
|
||||
#: field:easy.reconcile.advanced,filter:0
|
||||
#: field:easy.reconcile.advanced.ref,filter:0
|
||||
msgid "Filter"
|
||||
msgstr "Filtre"
|
||||
|
||||
#. module: account_advanced_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
msgid "Advanced. Partner and Ref"
|
||||
msgstr "Avancé. Partenaire et Réf."
|
||||
|
||||
#. module: account_advanced_reconcile
|
||||
#: field:easy.reconcile.advanced,date_base_on:0
|
||||
#: field:easy.reconcile.advanced.ref,date_base_on:0
|
||||
msgid "Date of reconciliation"
|
||||
msgstr "Date de lettrage"
|
||||
|
||||
#. module: account_advanced_reconcile
|
||||
#: model:ir.model,name:account_advanced_reconcile.model_easy_reconcile_advanced
|
||||
msgid "easy.reconcile.advanced"
|
||||
msgstr "easy.reconcile.advanced"
|
||||
|
||||
#. module: account_advanced_reconcile
|
||||
#: field:easy.reconcile.advanced,account_lost_id:0
|
||||
#: field:easy.reconcile.advanced.ref,account_lost_id:0
|
||||
msgid "Account Lost"
|
||||
msgstr "Compte de charge"
|
||||
|
||||
#. module: account_advanced_reconcile
|
||||
#: model:ir.model,name:account_advanced_reconcile.model_easy_reconcile_advanced_ref
|
||||
msgid "easy.reconcile.advanced.ref"
|
||||
msgstr "easy.reconcile.advanced.ref"
|
||||
|
||||
#. module: account_advanced_reconcile
|
||||
#: field:easy.reconcile.advanced,write_off:0
|
||||
#: field:easy.reconcile.advanced.ref,write_off:0
|
||||
msgid "Write off allowed"
|
||||
msgstr "Écart autorisé"
|
||||
@@ -1,25 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Copyright 2012 Camptocamp SA (Guewen Baconnier)
|
||||
# Copyright (C) 2010 Sébastien Beau
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
# published by the Free Software Foundation, either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
import easy_reconcile
|
||||
import base_reconciliation
|
||||
import simple_reconciliation
|
||||
import easy_reconcile_history
|
||||
@@ -1,66 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Copyright 2012 Camptocamp SA (Guewen Baconnier)
|
||||
# Copyright (C) 2010 Sébastien Beau
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
# published by the Free Software Foundation, either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
{
|
||||
"name": "Easy Reconcile",
|
||||
"version": "1.3.0",
|
||||
"depends": ["account"],
|
||||
"author": "Akretion,Camptocamp",
|
||||
"description": """
|
||||
Easy Reconcile
|
||||
==============
|
||||
|
||||
This is a shared work between Akretion and Camptocamp
|
||||
in order to provide:
|
||||
- reconciliation facilities for big volume of transactions
|
||||
- setup different profiles of reconciliation by account
|
||||
- each profile can use many methods of reconciliation
|
||||
- this module is also a base to create others
|
||||
reconciliation methods which can plug in the profiles
|
||||
- a profile a reconciliation can be run manually
|
||||
or by a cron
|
||||
- monitoring of reconciliation runs with an history
|
||||
which keep track of the reconciled Journal items
|
||||
|
||||
2 simple reconciliation methods are integrated
|
||||
in this module, the simple reconciliations works
|
||||
on 2 lines (1 debit / 1 credit) and do not allow
|
||||
partial reconcilation, they also match on 1 key,
|
||||
partner or Journal item name.
|
||||
|
||||
You may be interested to install also the
|
||||
``account_advanced_reconciliation`` module.
|
||||
This latter add more complex reconciliations,
|
||||
allows multiple lines and partial.
|
||||
|
||||
""",
|
||||
"website": "http://www.akretion.com/",
|
||||
"category": "Finance",
|
||||
"demo_xml": [],
|
||||
"data": ["easy_reconcile.xml",
|
||||
"easy_reconcile_history_view.xml",
|
||||
"security/ir_rule.xml",
|
||||
"security/ir.model.access.csv"],
|
||||
'license': 'AGPL-3',
|
||||
"auto_install": False,
|
||||
"installable": True,
|
||||
|
||||
}
|
||||
@@ -1,208 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Copyright 2012-2013 Camptocamp SA (Guewen Baconnier)
|
||||
# Copyright (C) 2010 Sébastien Beau
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
# published by the Free Software Foundation, either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from openerp.osv import fields, orm
|
||||
from operator import itemgetter, attrgetter
|
||||
|
||||
|
||||
class easy_reconcile_base(orm.AbstractModel):
|
||||
"""Abstract Model for reconciliation methods"""
|
||||
|
||||
_name = 'easy.reconcile.base'
|
||||
|
||||
_inherit = 'easy.reconcile.options'
|
||||
|
||||
_columns = {
|
||||
'account_id': fields.many2one(
|
||||
'account.account', 'Account', required=True),
|
||||
'partner_ids': fields.many2many(
|
||||
'res.partner', string="Restrict on partners"),
|
||||
# other columns are inherited from easy.reconcile.options
|
||||
}
|
||||
|
||||
def automatic_reconcile(self, cr, uid, ids, context=None):
|
||||
""" Reconciliation method called from the view.
|
||||
|
||||
:return: list of reconciled ids, list of partially reconciled items
|
||||
"""
|
||||
if isinstance(ids, (int, long)):
|
||||
ids = [ids]
|
||||
assert len(ids) == 1, "Has to be called on one id"
|
||||
rec = self.browse(cr, uid, ids[0], context=context)
|
||||
return self._action_rec(cr, uid, rec, context=context)
|
||||
|
||||
def _action_rec(self, cr, uid, rec, context=None):
|
||||
""" Must be inherited to implement the reconciliation
|
||||
|
||||
:return: list of reconciled ids
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def _base_columns(self, rec):
|
||||
""" Mandatory columns for move lines queries
|
||||
An extra column aliased as ``key`` should be defined
|
||||
in each query."""
|
||||
aml_cols = (
|
||||
'id',
|
||||
'debit',
|
||||
'credit',
|
||||
'date',
|
||||
'period_id',
|
||||
'ref',
|
||||
'name',
|
||||
'partner_id',
|
||||
'account_id',
|
||||
'move_id')
|
||||
return ["account_move_line.%s" % col for col in aml_cols]
|
||||
|
||||
def _select(self, rec, *args, **kwargs):
|
||||
return "SELECT %s" % ', '.join(self._base_columns(rec))
|
||||
|
||||
def _from(self, rec, *args, **kwargs):
|
||||
return "FROM account_move_line"
|
||||
|
||||
def _where(self, rec, *args, **kwargs):
|
||||
where = ("WHERE account_move_line.account_id = %s "
|
||||
"AND account_move_line.reconcile_id IS NULL ")
|
||||
# it would be great to use dict for params
|
||||
# but as we use _where_calc in _get_filter
|
||||
# which returns a list, we have to
|
||||
# accomodate with that
|
||||
params = [rec.account_id.id]
|
||||
|
||||
if rec.partner_ids:
|
||||
where += " AND account_move_line.partner_id IN %s"
|
||||
params.append(tuple([l.id for l in rec.partner_ids]))
|
||||
return where, params
|
||||
|
||||
def _get_filter(self, cr, uid, rec, context):
|
||||
ml_obj = self.pool.get('account.move.line')
|
||||
where = ''
|
||||
params = []
|
||||
if rec.filter:
|
||||
dummy, where, params = ml_obj._where_calc(
|
||||
cr, uid, eval(rec.filter), context=context).get_sql()
|
||||
if where:
|
||||
where = " AND %s" % where
|
||||
return where, params
|
||||
|
||||
def _below_writeoff_limit(self, cr, uid, rec, lines,
|
||||
writeoff_limit, context=None):
|
||||
precision = self.pool.get('decimal.precision').precision_get(
|
||||
cr, uid, 'Account')
|
||||
keys = ('debit', 'credit')
|
||||
sums = reduce(
|
||||
lambda line, memo:
|
||||
dict((key, value + memo[key])
|
||||
for key, value
|
||||
in line.iteritems()
|
||||
if key in keys), lines)
|
||||
|
||||
debit, credit = sums['debit'], sums['credit']
|
||||
writeoff_amount = round(debit - credit, precision)
|
||||
return bool(writeoff_limit >= abs(writeoff_amount)), debit, credit
|
||||
|
||||
def _get_rec_date(self, cr, uid, rec, lines,
|
||||
based_on='end_period_last_credit', context=None):
|
||||
period_obj = self.pool.get('account.period')
|
||||
|
||||
def last_period(mlines):
|
||||
period_ids = [ml['period_id'] for ml in mlines]
|
||||
periods = period_obj.browse(
|
||||
cr, uid, period_ids, context=context)
|
||||
return max(periods, key=attrgetter('date_stop'))
|
||||
|
||||
def last_date(mlines):
|
||||
return max(mlines, key=itemgetter('date'))
|
||||
|
||||
def credit(mlines):
|
||||
return [l for l in mlines if l['credit'] > 0]
|
||||
|
||||
def debit(mlines):
|
||||
return [l for l in mlines if l['debit'] > 0]
|
||||
|
||||
if based_on == 'end_period_last_credit':
|
||||
return last_period(credit(lines)).date_stop
|
||||
if based_on == 'end_period':
|
||||
return last_period(lines).date_stop
|
||||
elif based_on == 'newest':
|
||||
return last_date(lines)['date']
|
||||
elif based_on == 'newest_credit':
|
||||
return last_date(credit(lines))['date']
|
||||
elif based_on == 'newest_debit':
|
||||
return last_date(debit(lines))['date']
|
||||
# reconcilation date will be today
|
||||
# when date is None
|
||||
return None
|
||||
|
||||
def _reconcile_lines(self, cr, uid, rec, lines, allow_partial=False, context=None):
|
||||
""" Try to reconcile given lines
|
||||
|
||||
:param list lines: list of dict of move lines, they must at least
|
||||
contain values for : id, debit, credit
|
||||
:param boolean allow_partial: if True, partial reconciliation will be
|
||||
created, otherwise only Full
|
||||
reconciliation will be created
|
||||
:return: tuple of boolean values, first item is wether the items
|
||||
have been reconciled or not,
|
||||
the second is wether the reconciliation is full (True)
|
||||
or partial (False)
|
||||
"""
|
||||
if context is None:
|
||||
context = {}
|
||||
|
||||
ml_obj = self.pool.get('account.move.line')
|
||||
writeoff = rec.write_off
|
||||
|
||||
line_ids = [l['id'] for l in lines]
|
||||
below_writeoff, sum_debit, sum_credit = self._below_writeoff_limit(
|
||||
cr, uid, rec, lines, writeoff, context=context)
|
||||
date = self._get_rec_date(
|
||||
cr, uid, rec, lines, rec.date_base_on, context=context)
|
||||
|
||||
rec_ctx = dict(context, date_p=date)
|
||||
if below_writeoff:
|
||||
if sum_credit < sum_debit:
|
||||
writeoff_account_id = rec.account_profit_id.id
|
||||
else:
|
||||
writeoff_account_id = rec.account_lost_id.id
|
||||
|
||||
period_id = self.pool.get('account.period').find(
|
||||
cr, uid, dt=date, context=context)[0]
|
||||
|
||||
ml_obj.reconcile(
|
||||
cr, uid,
|
||||
line_ids,
|
||||
type='auto',
|
||||
writeoff_acc_id=writeoff_account_id,
|
||||
writeoff_period_id=period_id,
|
||||
writeoff_journal_id=rec.journal_id.id,
|
||||
context=rec_ctx)
|
||||
return True, True
|
||||
elif allow_partial:
|
||||
ml_obj.reconcile_partial(
|
||||
cr, uid,
|
||||
line_ids,
|
||||
type='manual',
|
||||
context=rec_ctx)
|
||||
return True, False
|
||||
|
||||
return False, False
|
||||
@@ -1,345 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Copyright 2012-2013 Camptocamp SA (Guewen Baconnier)
|
||||
# Copyright (C) 2010 Sébastien Beau
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
# published by the Free Software Foundation, either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from openerp.osv import fields, osv, orm
|
||||
from openerp.tools.translate import _
|
||||
from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT
|
||||
from openerp.tools.translate import _
|
||||
|
||||
|
||||
class easy_reconcile_options(orm.AbstractModel):
|
||||
"""Options of a reconciliation profile
|
||||
|
||||
Columns shared by the configuration of methods
|
||||
and by the reconciliation wizards.
|
||||
This allows decoupling of the methods and the
|
||||
wizards and allows to launch the wizards alone
|
||||
"""
|
||||
|
||||
_name = 'easy.reconcile.options'
|
||||
|
||||
def _get_rec_base_date(self, cr, uid, context=None):
|
||||
return [('end_period_last_credit', 'End of period of most recent credit'),
|
||||
('newest', 'Most recent move line'),
|
||||
('actual', 'Today'),
|
||||
('end_period', 'End of period of most recent move line'),
|
||||
('newest_credit', 'Date of most recent credit'),
|
||||
('newest_debit', 'Date of most recent debit')]
|
||||
|
||||
_columns = {
|
||||
'write_off': fields.float('Write off allowed'),
|
||||
'account_lost_id': fields.many2one(
|
||||
'account.account', 'Account Lost'),
|
||||
'account_profit_id': fields.many2one(
|
||||
'account.account', 'Account Profit'),
|
||||
'journal_id': fields.many2one(
|
||||
'account.journal', 'Journal'),
|
||||
'date_base_on': fields.selection(
|
||||
_get_rec_base_date,
|
||||
required=True,
|
||||
string='Date of reconciliation'),
|
||||
'filter': fields.char('Filter', size=128),
|
||||
}
|
||||
|
||||
_defaults = {
|
||||
'write_off': 0.,
|
||||
'date_base_on': 'end_period_last_credit',
|
||||
}
|
||||
|
||||
|
||||
class account_easy_reconcile_method(orm.Model):
|
||||
|
||||
_name = 'account.easy.reconcile.method'
|
||||
_description = 'reconcile method for account_easy_reconcile'
|
||||
|
||||
_inherit = 'easy.reconcile.options'
|
||||
|
||||
_order = 'sequence'
|
||||
|
||||
def _get_all_rec_method(self, cr, uid, context=None):
|
||||
return [
|
||||
('easy.reconcile.simple.name', 'Simple. Amount and Name'),
|
||||
('easy.reconcile.simple.partner', 'Simple. Amount and Partner'),
|
||||
('easy.reconcile.simple.reference', 'Simple. Amount and Reference'),
|
||||
]
|
||||
|
||||
def _get_rec_method(self, cr, uid, context=None):
|
||||
return self._get_all_rec_method(cr, uid, context=None)
|
||||
|
||||
_columns = {
|
||||
'name': fields.selection(
|
||||
_get_rec_method, 'Type', required=True),
|
||||
'sequence': fields.integer(
|
||||
'Sequence',
|
||||
required=True,
|
||||
help="The sequence field is used to order "
|
||||
"the reconcile method"),
|
||||
'task_id': fields.many2one(
|
||||
'account.easy.reconcile',
|
||||
string='Task',
|
||||
required=True,
|
||||
ondelete='cascade'),
|
||||
'company_id': fields.related('task_id','company_id',
|
||||
relation='res.company',
|
||||
type='many2one',
|
||||
string='Company',
|
||||
store=True,
|
||||
readonly=True),
|
||||
}
|
||||
|
||||
_defaults = {
|
||||
'sequence': 1,
|
||||
}
|
||||
|
||||
def init(self, cr):
|
||||
""" Migration stuff
|
||||
|
||||
Name is not anymore methods names but the name
|
||||
of the model which does the reconciliation
|
||||
"""
|
||||
cr.execute("""
|
||||
UPDATE account_easy_reconcile_method
|
||||
SET name = 'easy.reconcile.simple.partner'
|
||||
WHERE name = 'action_rec_auto_partner'
|
||||
""")
|
||||
cr.execute("""
|
||||
UPDATE account_easy_reconcile_method
|
||||
SET name = 'easy.reconcile.simple.name'
|
||||
WHERE name = 'action_rec_auto_name'
|
||||
""")
|
||||
|
||||
|
||||
class account_easy_reconcile(orm.Model):
|
||||
|
||||
_name = 'account.easy.reconcile'
|
||||
_description = 'account easy reconcile'
|
||||
|
||||
def _get_total_unrec(self, cr, uid, ids, name, arg, context=None):
|
||||
obj_move_line = self.pool.get('account.move.line')
|
||||
res = {}
|
||||
for task in self.browse(cr, uid, ids, context=context):
|
||||
res[task.id] = len(obj_move_line.search(
|
||||
cr, uid,
|
||||
[('account_id', '=', task.account.id),
|
||||
('reconcile_id', '=', False),
|
||||
('reconcile_partial_id', '=', False)],
|
||||
context=context))
|
||||
return res
|
||||
|
||||
def _get_partial_rec(self, cr, uid, ids, name, arg, context=None):
|
||||
obj_move_line = self.pool.get('account.move.line')
|
||||
res = {}
|
||||
for task in self.browse(cr, uid, ids, context=context):
|
||||
res[task.id] = len(obj_move_line.search(
|
||||
cr, uid,
|
||||
[('account_id', '=', task.account.id),
|
||||
('reconcile_id', '=', False),
|
||||
('reconcile_partial_id', '!=', False)],
|
||||
context=context))
|
||||
return res
|
||||
|
||||
def _last_history(self, cr, uid, ids, name, args, context=None):
|
||||
result = {}
|
||||
for history in self.browse(cr, uid, ids, context=context):
|
||||
result[history.id] = False
|
||||
if history.history_ids:
|
||||
# history is sorted by date desc
|
||||
result[history.id] = history.history_ids[0].id
|
||||
return result
|
||||
|
||||
_columns = {
|
||||
'name': fields.char('Name', required=True),
|
||||
'account': fields.many2one(
|
||||
'account.account', 'Account', required=True),
|
||||
'reconcile_method': fields.one2many(
|
||||
'account.easy.reconcile.method', 'task_id', 'Method'),
|
||||
'unreconciled_count': fields.function(
|
||||
_get_total_unrec, type='integer', string='Unreconciled Items'),
|
||||
'reconciled_partial_count': fields.function(
|
||||
_get_partial_rec,
|
||||
type='integer',
|
||||
string='Partially Reconciled Items'),
|
||||
'history_ids': fields.one2many(
|
||||
'easy.reconcile.history',
|
||||
'easy_reconcile_id',
|
||||
string='History',
|
||||
readonly=True),
|
||||
'last_history':
|
||||
fields.function(
|
||||
_last_history,
|
||||
string='Last History',
|
||||
type='many2one',
|
||||
relation='easy.reconcile.history',
|
||||
readonly=True),
|
||||
'company_id': fields.many2one('res.company', 'Company'),
|
||||
}
|
||||
|
||||
def copy_data(self, cr, uid, id, default=None, context=None):
|
||||
if default is None:
|
||||
default = {}
|
||||
default = dict(default, rec_log=False)
|
||||
return super(account_easy_reconcile, self).copy_data(
|
||||
cr, uid, id, default=default, context=context)
|
||||
|
||||
def _prepare_run_transient(self, cr, uid, rec_method, context=None):
|
||||
return {'account_id': rec_method.task_id.account.id,
|
||||
'write_off': rec_method.write_off,
|
||||
'account_lost_id': (rec_method.account_lost_id and
|
||||
rec_method.account_lost_id.id),
|
||||
'account_profit_id': (rec_method.account_profit_id and
|
||||
rec_method.account_profit_id.id),
|
||||
'journal_id': (rec_method.journal_id and
|
||||
rec_method.journal_id.id),
|
||||
'date_base_on': rec_method.date_base_on,
|
||||
'filter': rec_method.filter}
|
||||
|
||||
def run_reconcile(self, cr, uid, ids, context=None):
|
||||
def find_reconcile_ids(fieldname, move_line_ids):
|
||||
if not move_line_ids:
|
||||
return []
|
||||
sql = ("SELECT DISTINCT " + fieldname +
|
||||
" FROM account_move_line "
|
||||
" WHERE id in %s "
|
||||
" AND " + fieldname + " IS NOT NULL")
|
||||
cr.execute(sql, (tuple(move_line_ids),))
|
||||
res = cr.fetchall()
|
||||
return [row[0] for row in res]
|
||||
|
||||
for rec in self.browse(cr, uid, ids, context=context):
|
||||
all_ml_rec_ids = []
|
||||
all_ml_partial_ids = []
|
||||
|
||||
for method in rec.reconcile_method:
|
||||
rec_model = self.pool.get(method.name)
|
||||
auto_rec_id = rec_model.create(
|
||||
cr, uid,
|
||||
self._prepare_run_transient(
|
||||
cr, uid, method, context=context),
|
||||
context=context)
|
||||
|
||||
ml_rec_ids, ml_partial_ids = rec_model.automatic_reconcile(
|
||||
cr, uid, auto_rec_id, context=context)
|
||||
|
||||
all_ml_rec_ids += ml_rec_ids
|
||||
all_ml_partial_ids += ml_partial_ids
|
||||
|
||||
reconcile_ids = find_reconcile_ids(
|
||||
'reconcile_id', all_ml_rec_ids)
|
||||
partial_ids = find_reconcile_ids(
|
||||
'reconcile_partial_id', all_ml_partial_ids)
|
||||
|
||||
self.pool.get('easy.reconcile.history').create(
|
||||
cr,
|
||||
uid,
|
||||
{'easy_reconcile_id': rec.id,
|
||||
'date': fields.datetime.now(),
|
||||
'reconcile_ids': [(4, rid) for rid in reconcile_ids],
|
||||
'reconcile_partial_ids': [(4, rid) for rid in partial_ids]},
|
||||
context=context)
|
||||
return True
|
||||
|
||||
def _no_history(self, cr, uid, rec, context=None):
|
||||
""" Raise an `osv.except_osv` error, supposed to
|
||||
be called when there is no history on the reconciliation
|
||||
task.
|
||||
"""
|
||||
raise osv.except_osv(
|
||||
_('Error'),
|
||||
_('There is no history of reconciled '
|
||||
'items on the task: %s.') % rec.name)
|
||||
|
||||
def _open_move_line_list(sefl, cr, uid, move_line_ids, name, context=None):
|
||||
return {
|
||||
'name': name,
|
||||
'view_mode': 'tree,form',
|
||||
'view_id': False,
|
||||
'view_type': 'form',
|
||||
'res_model': 'account.move.line',
|
||||
'type': 'ir.actions.act_window',
|
||||
'nodestroy': True,
|
||||
'target': 'current',
|
||||
'domain': unicode([('id', 'in', move_line_ids)]),
|
||||
}
|
||||
|
||||
def open_unreconcile(self, cr, uid, ids, context=None):
|
||||
""" Open the view of move line with the unreconciled move lines
|
||||
"""
|
||||
|
||||
assert len(ids) == 1 , \
|
||||
"You can only open entries from one profile at a time"
|
||||
|
||||
obj_move_line = self.pool.get('account.move.line')
|
||||
res = {}
|
||||
for task in self.browse(cr, uid, ids, context=context):
|
||||
line_ids = obj_move_line.search(
|
||||
cr, uid,
|
||||
[('account_id', '=', task.account.id),
|
||||
('reconcile_id', '=', False),
|
||||
('reconcile_partial_id', '=', False)],
|
||||
context=context)
|
||||
|
||||
name = _('Unreconciled items')
|
||||
return self._open_move_line_list(cr, uid, line_ids, name, context=context)
|
||||
|
||||
def open_partial_reconcile(self, cr, uid, ids, context=None):
|
||||
""" Open the view of move line with the unreconciled move lines
|
||||
"""
|
||||
|
||||
assert len(ids) == 1 , \
|
||||
"You can only open entries from one profile at a time"
|
||||
|
||||
obj_move_line = self.pool.get('account.move.line')
|
||||
res = {}
|
||||
for task in self.browse(cr, uid, ids, context=context):
|
||||
line_ids = obj_move_line.search(
|
||||
cr, uid,
|
||||
[('account_id', '=', task.account.id),
|
||||
('reconcile_id', '=', False),
|
||||
('reconcile_partial_id', '!=', False)],
|
||||
context=context)
|
||||
name = _('Partial reconciled items')
|
||||
return self._open_move_line_list(cr, uid, line_ids, name, context=context)
|
||||
|
||||
def last_history_reconcile(self, cr, uid, rec_id, context=None):
|
||||
""" Get the last history record for this reconciliation profile
|
||||
and return the action which opens move lines reconciled
|
||||
"""
|
||||
if isinstance(rec_id, (tuple, list)):
|
||||
assert len(rec_id) == 1, \
|
||||
"Only 1 id expected"
|
||||
rec_id = rec_id[0]
|
||||
rec = self.browse(cr, uid, rec_id, context=context)
|
||||
if not rec.last_history:
|
||||
self._no_history(cr, uid, rec, context=context)
|
||||
return rec.last_history.open_reconcile()
|
||||
|
||||
def last_history_partial(self, cr, uid, rec_id, context=None):
|
||||
""" Get the last history record for this reconciliation profile
|
||||
and return the action which opens move lines reconciled
|
||||
"""
|
||||
if isinstance(rec_id, (tuple, list)):
|
||||
assert len(rec_id) == 1, \
|
||||
"Only 1 id expected"
|
||||
rec_id = rec_id[0]
|
||||
rec = self.browse(cr, uid, rec_id, context=context)
|
||||
if not rec.last_history:
|
||||
self._no_history(cr, uid, rec, context=context)
|
||||
return rec.last_history.open_partial()
|
||||
@@ -1,162 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<openerp>
|
||||
<data>
|
||||
|
||||
<!-- account.easy.reconcile view -->
|
||||
<record id="account_easy_reconcile_form" model="ir.ui.view">
|
||||
<field name="name">account.easy.reconcile.form</field>
|
||||
<field name="priority">20</field>
|
||||
<field name="model">account.easy.reconcile</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Automatic Easy Reconcile" version="7.0">
|
||||
<header>
|
||||
<button name="run_reconcile" class="oe_highlight"
|
||||
string="Start Auto Reconciliation" type="object"/>
|
||||
<button icon="STOCK_JUMP_TO" name="last_history_reconcile"
|
||||
string="Display items reconciled on the last run"
|
||||
type="object"/>
|
||||
<button icon="STOCK_JUMP_TO" name="last_history_partial"
|
||||
string="Display items partially reconciled on the last run"
|
||||
type="object"/>
|
||||
</header>
|
||||
<sheet>
|
||||
<separator colspan="4" string="Profile Information" />
|
||||
<group>
|
||||
<group>
|
||||
<field name="name" select="1"/>
|
||||
<field name="account"/>
|
||||
<field name="company_id" groups="base.group_multi_company"/>
|
||||
</group>
|
||||
<group>
|
||||
<group>
|
||||
<field name="unreconciled_count"/>
|
||||
<button icon="STOCK_JUMP_TO" name="open_unreconcile"
|
||||
string="Go to unreconciled items" type="object"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="reconciled_partial_count"/>
|
||||
<button icon="STOCK_JUMP_TO" name="open_partial_reconcile"
|
||||
string="Go to partial reconciled items" type="object"/>
|
||||
</group>
|
||||
</group>
|
||||
</group>
|
||||
<notebook colspan="4">
|
||||
<page name="methods" string="Configuration">
|
||||
<field name="reconcile_method" colspan = "4" nolabel="1"/>
|
||||
</page>
|
||||
<page name="history" string="History">
|
||||
<field name="history_ids" nolabel="1">
|
||||
<tree string="Automatic Easy Reconcile History">
|
||||
<field name="date"/>
|
||||
<button icon="STOCK_JUMP_TO" name="open_reconcile"
|
||||
string="Go to reconciled items" type="object"/>
|
||||
<button icon="STOCK_JUMP_TO" name="open_partial"
|
||||
string="Go to partially reconciled items" type="object"/>
|
||||
</tree>
|
||||
</field>
|
||||
</page>
|
||||
<page name="information" string="Information">
|
||||
<separator colspan="4" string="Simple. Amount and Name"/>
|
||||
<label string="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." colspan="4"/>
|
||||
|
||||
<separator colspan="4" string="Simple. Amount and Partner"/>
|
||||
<label string="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." colspan="4"/>
|
||||
|
||||
<separator colspan="4" string="Simple. Amount and Reference"/>
|
||||
<label string="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." colspan="4"/>
|
||||
|
||||
</page>
|
||||
</notebook>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="account_easy_reconcile_tree" model="ir.ui.view">
|
||||
<field name="name">account.easy.reconcile.tree</field>
|
||||
<field name="priority">20</field>
|
||||
<field name="model">account.easy.reconcile</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Automatic Easy Reconcile">
|
||||
<field name="name"/>
|
||||
<field name="account"/>
|
||||
<field name="company_id" groups="base.group_multi_company"/>
|
||||
<field name="unreconciled_count"/>
|
||||
<field name="reconciled_partial_count"/>
|
||||
<button icon="gtk-ok" name="run_reconcile" colspan="4"
|
||||
string="Start Auto Reconcilation" type="object"/>
|
||||
<button icon="STOCK_JUMP_TO" name="last_history_reconcile" colspan="2"
|
||||
string="Display items reconciled on the last run" type="object"/>
|
||||
<button icon="STOCK_JUMP_TO" name="last_history_partial" colspan="2"
|
||||
string="Display items partially reconciled on the last run"
|
||||
type="object"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="action_account_easy_reconcile" model="ir.actions.act_window">
|
||||
<field name="name">Easy Automatic Reconcile</field>
|
||||
<field name="type">ir.actions.act_window</field>
|
||||
<field name="res_model">account.easy.reconcile</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="help" type="html">
|
||||
<p class="oe_view_nocontent_create">
|
||||
Click to add a reconciliation profile.
|
||||
</p><p>
|
||||
A reconciliation profile specifies, for one account, how
|
||||
the entries should be reconciled.
|
||||
You can select one or many reconciliation methods which will
|
||||
be run sequentially to match the entries between them.
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
<!-- account.easy.reconcile.method view -->
|
||||
|
||||
<record id="account_easy_reconcile_method_form" model="ir.ui.view">
|
||||
<field name="name">account.easy.reconcile.method.form</field>
|
||||
<field name="priority">20</field>
|
||||
<field name="model">account.easy.reconcile.method</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Automatic Easy Reconcile Method">
|
||||
<field name="sequence" widget="handle"/>
|
||||
<field name="name"/>
|
||||
<field name="write_off"/>
|
||||
<field name="account_lost_id" attrs="{'required':[('write_off','>',0)]}"/>
|
||||
<field name="account_profit_id" attrs="{'required':[('write_off','>',0)]}"/>
|
||||
<field name="journal_id" attrs="{'required':[('write_off','>',0)]}"/>
|
||||
<field name="date_base_on"/>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="account_easy_reconcile_method_tree" model="ir.ui.view">
|
||||
<field name="name">account.easy.reconcile.method.tree</field>
|
||||
<field name="priority">20</field>
|
||||
<field name="model">account.easy.reconcile.method</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree editable="top" string="Automatic Easy Reconcile Method">
|
||||
<field name="sequence" widget="handle"/>
|
||||
<field name="name"/>
|
||||
<field name="write_off"/>
|
||||
<field name="account_lost_id" attrs="{'required':[('write_off','>',0)]}"/>
|
||||
<field name="account_profit_id" attrs="{'required':[('write_off','>',0)]}"/>
|
||||
<field name="journal_id" attrs="{'required':[('write_off','>',0)]}"/>
|
||||
<field name="date_base_on"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- menu item -->
|
||||
|
||||
<menuitem action="action_account_easy_reconcile"
|
||||
id="menu_easy_reconcile"
|
||||
parent="account.periodical_processing_reconciliation"/>
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
@@ -1,153 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Author: Guewen Baconnier
|
||||
# Copyright 2012 Camptocamp SA
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
# published by the Free Software Foundation, either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from openerp.osv import orm, fields
|
||||
from openerp.tools.translate import _
|
||||
|
||||
|
||||
class easy_reconcile_history(orm.Model):
|
||||
""" Store an history of the runs per profile
|
||||
Each history stores the list of reconciliations done"""
|
||||
|
||||
_name = 'easy.reconcile.history'
|
||||
_rec_name = 'easy_reconcile_id'
|
||||
_order = 'date DESC'
|
||||
|
||||
def _reconcile_line_ids(self, cr, uid, ids, name, args, context=None):
|
||||
result = {}
|
||||
|
||||
for history in self.browse(cr, uid, ids, context=context):
|
||||
result[history.id] = {}
|
||||
|
||||
move_line_ids = []
|
||||
for reconcile in history.reconcile_ids:
|
||||
move_line_ids += [line.id
|
||||
for line
|
||||
in reconcile.line_id]
|
||||
result[history.id]['reconcile_line_ids'] = move_line_ids
|
||||
|
||||
move_line_ids = []
|
||||
for reconcile in history.reconcile_partial_ids:
|
||||
move_line_ids += [line.id
|
||||
for line
|
||||
in reconcile.line_partial_ids]
|
||||
result[history.id]['partial_line_ids'] = move_line_ids
|
||||
|
||||
return result
|
||||
|
||||
_columns = {
|
||||
'easy_reconcile_id': fields.many2one(
|
||||
'account.easy.reconcile', 'Reconcile Profile', readonly=True),
|
||||
'date': fields.datetime('Run date', readonly=True),
|
||||
'reconcile_ids': fields.many2many(
|
||||
'account.move.reconcile',
|
||||
'account_move_reconcile_history_rel',
|
||||
string='Reconciliations', readonly=True),
|
||||
'reconcile_partial_ids': fields.many2many(
|
||||
'account.move.reconcile',
|
||||
'account_move_reconcile_history_partial_rel',
|
||||
string='Partial Reconciliations', readonly=True),
|
||||
'reconcile_line_ids':
|
||||
fields.function(
|
||||
_reconcile_line_ids,
|
||||
string='Reconciled Items',
|
||||
type='many2many',
|
||||
relation='account.move.line',
|
||||
readonly=True,
|
||||
multi='lines'),
|
||||
'partial_line_ids':
|
||||
fields.function(
|
||||
_reconcile_line_ids,
|
||||
string='Partially Reconciled Items',
|
||||
type='many2many',
|
||||
relation='account.move.line',
|
||||
readonly=True,
|
||||
multi='lines'),
|
||||
'company_id': fields.related('easy_reconcile_id','company_id',
|
||||
relation='res.company',
|
||||
type='many2one',
|
||||
string='Company',
|
||||
store=True,
|
||||
readonly=True),
|
||||
|
||||
}
|
||||
|
||||
def _open_move_lines(self, cr, uid, history_id, rec_type='full', context=None):
|
||||
""" For an history record, open the view of move line with
|
||||
the reconciled or partially reconciled move lines
|
||||
|
||||
:param history_id: id of the history
|
||||
:param rec_type: 'full' or 'partial'
|
||||
:return: action to open the move lines
|
||||
"""
|
||||
assert rec_type in ('full', 'partial'), \
|
||||
"rec_type must be 'full' or 'partial'"
|
||||
|
||||
history = self.browse(cr, uid, history_id, context=context)
|
||||
|
||||
if rec_type == 'full':
|
||||
field = 'reconcile_line_ids'
|
||||
name = _('Reconciliations')
|
||||
else:
|
||||
field = 'partial_line_ids'
|
||||
name = _('Partial Reconciliations')
|
||||
|
||||
move_line_ids = [line.id for line in getattr(history, field)]
|
||||
|
||||
return {
|
||||
'name': name,
|
||||
'view_mode': 'tree,form',
|
||||
'view_id': False,
|
||||
'view_type': 'form',
|
||||
'res_model': 'account.move.line',
|
||||
'type': 'ir.actions.act_window',
|
||||
'nodestroy': True,
|
||||
'target': 'current',
|
||||
'domain': unicode([('id', 'in', move_line_ids)]),
|
||||
}
|
||||
|
||||
def open_reconcile(self, cr, uid, history_ids, context=None):
|
||||
""" For an history record, open the view of move line
|
||||
with the reconciled move lines
|
||||
|
||||
:param history_ids: id of the record as int or long
|
||||
Accept a list with 1 id too to be
|
||||
used from the client.
|
||||
"""
|
||||
if isinstance(history_ids, (tuple, list)):
|
||||
assert len(history_ids) == 1, "only 1 ID is accepted"
|
||||
history_ids = history_ids[0]
|
||||
return self._open_move_lines(
|
||||
cr, uid, history_ids, rec_type='full', context=None)
|
||||
|
||||
def open_partial(self, cr, uid, history_ids, context=None):
|
||||
""" For an history record, open the view of move line
|
||||
with the partially reconciled move lines
|
||||
|
||||
:param history_ids: id of the record as int or long
|
||||
Accept a list with 1 id too to be
|
||||
used from the client.
|
||||
"""
|
||||
if isinstance(history_ids, (tuple, list)):
|
||||
assert len(history_ids) == 1, "only 1 ID is accepted"
|
||||
history_ids = history_ids[0]
|
||||
return self._open_move_lines(
|
||||
cr, uid, history_ids, rec_type='partial', context=None)
|
||||
@@ -1,98 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<openerp>
|
||||
<data noupdate="0">
|
||||
|
||||
<record id="view_easy_reconcile_history_search" model="ir.ui.view">
|
||||
<field name="name">easy.reconcile.history.search</field>
|
||||
<field name="model">easy.reconcile.history</field>
|
||||
<field name="arch" type="xml">
|
||||
<search string="Automatic Easy Reconcile History">
|
||||
<filter icon="terp-go-today" string="Today"
|
||||
domain="[('date','<', time.strftime('%%Y-%%m-%%d 23:59:59')), ('date','>=', time.strftime('%%Y-%%m-%%d 00:00:00'))]"
|
||||
help="Todays' Reconcilations" />
|
||||
<filter icon="terp-go-week" string="7 Days"
|
||||
help="Reconciliations of last 7 days"
|
||||
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'))]"
|
||||
/>
|
||||
|
||||
<separator orientation="vertical"/>
|
||||
<field name="easy_reconcile_id"/>
|
||||
<field name="date"/>
|
||||
|
||||
<newline/>
|
||||
<group expand="0" string="Group By...">
|
||||
<filter string="Reconciliation Profile"
|
||||
icon="terp-stock_effects-object-colorize"
|
||||
domain="[]" context="{'group_by': 'easy_reconcile_id'}"/>
|
||||
<filter string="Date" icon="terp-go-month" domain="[]"
|
||||
context="{'group_by': 'date'}"/>
|
||||
</group>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="easy_reconcile_history_form" model="ir.ui.view">
|
||||
<field name="name">easy.reconcile.history.form</field>
|
||||
<field name="model">easy.reconcile.history</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Automatic Easy Reconcile History" version="7.0">
|
||||
<header>
|
||||
<button name="open_reconcile"
|
||||
string="Go to reconciled items"
|
||||
icon="STOCK_JUMP_TO" type="object"/>
|
||||
<button name="open_partial"
|
||||
string="Go to partially reconciled items"
|
||||
icon="STOCK_JUMP_TO" type="object"/>
|
||||
</header>
|
||||
<sheet>
|
||||
<group>
|
||||
<field name="easy_reconcile_id"/>
|
||||
<field name="date"/>
|
||||
<field name="company_id" groups="base.group_multi_company"/>
|
||||
</group>
|
||||
<group col="2">
|
||||
<separator colspan="2" string="Reconciliations"/>
|
||||
<field name="reconcile_ids" nolabel="1"/>
|
||||
</group>
|
||||
<group col="2">
|
||||
<separator colspan="2" string="Partial Reconciliations"/>
|
||||
<field name="reconcile_partial_ids" nolabel="1"/>
|
||||
</group>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="easy_reconcile_history_tree" model="ir.ui.view">
|
||||
<field name="name">easy.reconcile.history.tree</field>
|
||||
<field name="model">easy.reconcile.history</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Automatic Easy Reconcile History">
|
||||
<field name="easy_reconcile_id"/>
|
||||
<field name="date"/>
|
||||
<button icon="STOCK_JUMP_TO" name="open_reconcile"
|
||||
string="Go to reconciled items" type="object"/>
|
||||
<button icon="STOCK_JUMP_TO" name="open_partial"
|
||||
string="Go to partially reconciled items" type="object"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="action_easy_reconcile_history" model="ir.actions.act_window">
|
||||
<field name="name">Easy Automatic Reconcile History</field>
|
||||
<field name="type">ir.actions.act_window</field>
|
||||
<field name="res_model">easy.reconcile.history</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
</record>
|
||||
|
||||
<act_window
|
||||
context="{'search_default_easy_reconcile_id': [active_id], 'default_easy_reconcile_id': active_id}"
|
||||
id="act_easy_reconcile_to_history"
|
||||
name="History Details"
|
||||
groups=""
|
||||
res_model="easy.reconcile.history"
|
||||
src_model="account.easy.reconcile"/>
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
@@ -1,406 +0,0 @@
|
||||
# Translation of OpenERP Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * account_easy_reconcile
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: OpenERP Server 7.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2014-01-21 11:55+0000\n"
|
||||
"PO-Revision-Date: 2014-01-21 11:55+0000\n"
|
||||
"Last-Translator: <>\n"
|
||||
"Language-Team: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"Plural-Forms: \n"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: code:addons/account_easy_reconcile/easy_reconcile_history.py:108
|
||||
#: view:easy.reconcile.history:0
|
||||
#: field:easy.reconcile.history,reconcile_ids:0
|
||||
#, python-format
|
||||
msgid "Reconciliations"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
#: view:easy.reconcile.history:0
|
||||
msgid "Automatic Easy Reconcile History"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
msgid "Information"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
#: view:easy.reconcile.history:0
|
||||
msgid "Go to partially reconciled items"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: help:account.easy.reconcile.method,sequence:0
|
||||
msgid "The sequence field is used to order the reconcile method"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_history
|
||||
msgid "easy.reconcile.history"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: model:ir.actions.act_window,help:account_easy_reconcile.action_account_easy_reconcile
|
||||
msgid "<p class=\"oe_view_nocontent_create\">\n"
|
||||
" Click to add a reconciliation profile.\n"
|
||||
" </p><p>\n"
|
||||
" A reconciliation profile specifies, for one account, how\n"
|
||||
" the entries should be reconciled.\n"
|
||||
" You can select one or many reconciliation methods which will\n"
|
||||
" be run sequentially to match the entries between them.\n"
|
||||
" </p>\n"
|
||||
" "
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_options
|
||||
msgid "easy.reconcile.options"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:easy.reconcile.history:0
|
||||
msgid "Group By..."
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:account.easy.reconcile,unreconciled_count:0
|
||||
msgid "Unreconciled Items"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_base
|
||||
msgid "easy.reconcile.base"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:easy.reconcile.history,reconcile_line_ids:0
|
||||
msgid "Reconciled Items"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:account.easy.reconcile,reconcile_method:0
|
||||
msgid "Method"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:easy.reconcile.history:0
|
||||
msgid "7 Days"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: model:ir.actions.act_window,name:account_easy_reconcile.action_easy_reconcile_history
|
||||
msgid "Easy Automatic Reconcile History"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:easy.reconcile.history,date:0
|
||||
msgid "Run date"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
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."
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: model:ir.actions.act_window,name:account_easy_reconcile.act_easy_reconcile_to_history
|
||||
msgid "History Details"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
msgid "Display items reconciled on the last run"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:account.easy.reconcile.method,name:0
|
||||
msgid "Type"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:account.easy.reconcile,company_id:0
|
||||
#: field:account.easy.reconcile.method,company_id:0
|
||||
#: field:easy.reconcile.history,company_id:0
|
||||
msgid "Company"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:account.easy.reconcile.method,account_profit_id:0
|
||||
#: field:easy.reconcile.base,account_profit_id:0
|
||||
#: field:easy.reconcile.options,account_profit_id:0
|
||||
#: field:easy.reconcile.simple,account_profit_id:0
|
||||
#: field:easy.reconcile.simple.name,account_profit_id:0
|
||||
#: field:easy.reconcile.simple.partner,account_profit_id:0
|
||||
#: field:easy.reconcile.simple.reference,account_profit_id:0
|
||||
msgid "Account Profit"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:easy.reconcile.history:0
|
||||
msgid "Todays' Reconcilations"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
msgid "Simple. Amount and Name"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:easy.reconcile.base,partner_ids:0
|
||||
#: field:easy.reconcile.simple,partner_ids:0
|
||||
#: field:easy.reconcile.simple.name,partner_ids:0
|
||||
#: field:easy.reconcile.simple.partner,partner_ids:0
|
||||
#: field:easy.reconcile.simple.reference,partner_ids:0
|
||||
msgid "Restrict on partners"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: model:ir.actions.act_window,name:account_easy_reconcile.action_account_easy_reconcile
|
||||
#: model:ir.ui.menu,name:account_easy_reconcile.menu_easy_reconcile
|
||||
msgid "Easy Automatic Reconcile"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:easy.reconcile.history:0
|
||||
msgid "Today"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:easy.reconcile.history:0
|
||||
msgid "Date"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:account.easy.reconcile,last_history:0
|
||||
msgid "Last History"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
msgid "Configuration"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:account.easy.reconcile,reconciled_partial_count:0
|
||||
#: field:easy.reconcile.history,partial_line_ids:0
|
||||
msgid "Partially Reconciled Items"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_simple_partner
|
||||
msgid "easy.reconcile.simple.partner"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:account.easy.reconcile.method,write_off:0
|
||||
#: field:easy.reconcile.base,write_off:0
|
||||
#: field:easy.reconcile.options,write_off:0
|
||||
#: field:easy.reconcile.simple,write_off:0
|
||||
#: field:easy.reconcile.simple.name,write_off:0
|
||||
#: field:easy.reconcile.simple.partner,write_off:0
|
||||
#: field:easy.reconcile.simple.reference,write_off:0
|
||||
msgid "Write off allowed"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
msgid "Automatic Easy Reconcile"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:account.easy.reconcile,account:0
|
||||
#: field:easy.reconcile.base,account_id:0
|
||||
#: field:easy.reconcile.simple,account_id:0
|
||||
#: field:easy.reconcile.simple.name,account_id:0
|
||||
#: field:easy.reconcile.simple.partner,account_id:0
|
||||
#: field:easy.reconcile.simple.reference,account_id:0
|
||||
msgid "Account"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:account.easy.reconcile.method,task_id:0
|
||||
msgid "Task"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:account.easy.reconcile,name:0
|
||||
msgid "Name"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
msgid "Simple. Amount and Partner"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
msgid "Start Auto Reconcilation"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_simple_name
|
||||
msgid "easy.reconcile.simple.name"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:account.easy.reconcile.method,filter:0
|
||||
#: field:easy.reconcile.base,filter:0
|
||||
#: field:easy.reconcile.options,filter:0
|
||||
#: field:easy.reconcile.simple,filter:0
|
||||
#: field:easy.reconcile.simple.name,filter:0
|
||||
#: field:easy.reconcile.simple.partner,filter:0
|
||||
#: field:easy.reconcile.simple.reference,filter:0
|
||||
msgid "Filter"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
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."
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:easy.reconcile.history,easy_reconcile_id:0
|
||||
msgid "Reconcile Profile"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: model:ir.model,name:account_easy_reconcile.model_account_easy_reconcile_method
|
||||
msgid "reconcile method for account_easy_reconcile"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
msgid "Start Auto Reconciliation"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: code:addons/account_easy_reconcile/easy_reconcile.py:257
|
||||
#, python-format
|
||||
msgid "Error"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: code:addons/account_easy_reconcile/easy_reconcile.py:258
|
||||
#, python-format
|
||||
msgid "There is no history of reconciled items on the task: %s."
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
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."
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:account.easy.reconcile.method,account_lost_id:0
|
||||
#: field:easy.reconcile.base,account_lost_id:0
|
||||
#: field:easy.reconcile.options,account_lost_id:0
|
||||
#: field:easy.reconcile.simple,account_lost_id:0
|
||||
#: field:easy.reconcile.simple.name,account_lost_id:0
|
||||
#: field:easy.reconcile.simple.partner,account_lost_id:0
|
||||
#: field:easy.reconcile.simple.reference,account_lost_id:0
|
||||
msgid "Account Lost"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:easy.reconcile.history:0
|
||||
msgid "Reconciliation Profile"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
#: field:account.easy.reconcile,history_ids:0
|
||||
msgid "History"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
#: view:easy.reconcile.history:0
|
||||
msgid "Go to reconciled items"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
msgid "Profile Information"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile.method:0
|
||||
msgid "Automatic Easy Reconcile Method"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
msgid "Simple. Amount and Reference"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
msgid "Display items partially reconciled on the last run"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:account.easy.reconcile.method,sequence:0
|
||||
msgid "Sequence"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_simple
|
||||
msgid "easy.reconcile.simple"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:easy.reconcile.history:0
|
||||
msgid "Reconciliations of last 7 days"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:account.easy.reconcile.method,date_base_on:0
|
||||
#: field:easy.reconcile.base,date_base_on:0
|
||||
#: field:easy.reconcile.options,date_base_on:0
|
||||
#: field:easy.reconcile.simple,date_base_on:0
|
||||
#: field:easy.reconcile.simple.name,date_base_on:0
|
||||
#: field:easy.reconcile.simple.partner,date_base_on:0
|
||||
#: field:easy.reconcile.simple.reference,date_base_on:0
|
||||
msgid "Date of reconciliation"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: code:addons/account_easy_reconcile/easy_reconcile_history.py:111
|
||||
#: view:easy.reconcile.history:0
|
||||
#: field:easy.reconcile.history,reconcile_partial_ids:0
|
||||
#, python-format
|
||||
msgid "Partial Reconciliations"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:account.easy.reconcile.method,journal_id:0
|
||||
#: field:easy.reconcile.base,journal_id:0
|
||||
#: field:easy.reconcile.options,journal_id:0
|
||||
#: field:easy.reconcile.simple,journal_id:0
|
||||
#: field:easy.reconcile.simple.name,journal_id:0
|
||||
#: field:easy.reconcile.simple.partner,journal_id:0
|
||||
#: field:easy.reconcile.simple.reference,journal_id:0
|
||||
msgid "Journal"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_simple_reference
|
||||
msgid "easy.reconcile.simple.reference"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: model:ir.model,name:account_easy_reconcile.model_account_easy_reconcile
|
||||
msgid "account easy reconcile"
|
||||
msgstr ""
|
||||
|
||||
@@ -1,434 +0,0 @@
|
||||
# Spanish translation for banking-addons
|
||||
# Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014
|
||||
# This file is distributed under the same license as the banking-addons package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, 2014.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: banking-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2014-01-21 11:55+0000\n"
|
||||
"PO-Revision-Date: 2014-06-05 22:21+0000\n"
|
||||
"Last-Translator: Pedro Manuel Baeza <pedro.baeza@gmail.com>\n"
|
||||
"Language-Team: Spanish <es@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-06-06 06:36+0000\n"
|
||||
"X-Generator: Launchpad (build 17031)\n"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: code:addons/account_easy_reconcile/easy_reconcile_history.py:101
|
||||
#: field:easy.reconcile.history,reconcile_ids:0
|
||||
#, python-format
|
||||
msgid "Reconciliations"
|
||||
msgstr "Conciliaciones"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
#: view:easy.reconcile.history:0
|
||||
msgid "Automatic Easy Reconcile History"
|
||||
msgstr "Historial de conciliación automática sencilla"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
msgid "Information"
|
||||
msgstr "Información"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
#: view:easy.reconcile.history:0
|
||||
msgid "Go to partially reconciled items"
|
||||
msgstr "Ir a los elementos parcialmente conciliados"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: help:account.easy.reconcile.method,sequence:0
|
||||
msgid "The sequence field is used to order the reconcile method"
|
||||
msgstr ""
|
||||
"El campo de secuencia se usa para ordenar los métodos de conciliación"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_history
|
||||
msgid "easy.reconcile.history"
|
||||
msgstr "easy.reconcile.history"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: model:ir.actions.act_window,help:account_easy_reconcile.action_account_easy_reconcile
|
||||
msgid ""
|
||||
"<p class=\"oe_view_nocontent_create\">\n"
|
||||
" Click to add a reconciliation profile.\n"
|
||||
" </p><p>\n"
|
||||
" A reconciliation profile specifies, for one account, how\n"
|
||||
" the entries should be reconciled.\n"
|
||||
" You can select one or many reconciliation methods which will\n"
|
||||
" be run sequentially to match the entries between them.\n"
|
||||
" </p>\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"<p class=\"oe_view_nocontent_create\">\n"
|
||||
"Pulse para añadir un pefil de conciliación.\n"
|
||||
"</p><p>\n"
|
||||
"Un perfil de conciliación especifica, para una cuenta, como\n"
|
||||
"los apuntes deben ser conciliados.\n"
|
||||
"Puede seleccionar uno o varios métodos de conciliación que\n"
|
||||
"serán ejecutados secuencialmente para casar los apuntes\n"
|
||||
"entre ellos.\n"
|
||||
"</p>\n"
|
||||
" "
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_options
|
||||
msgid "easy.reconcile.options"
|
||||
msgstr "easy.reconcile.options"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:easy.reconcile.history:0
|
||||
msgid "Group By..."
|
||||
msgstr "Agrupar por..."
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:account.easy.reconcile,unreconciled_count:0
|
||||
msgid "Unreconciled Items"
|
||||
msgstr "Apuntes no conciliados"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_base
|
||||
msgid "easy.reconcile.base"
|
||||
msgstr "easy.reconcile.base"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:easy.reconcile.history,reconcile_line_ids:0
|
||||
msgid "Reconciled Items"
|
||||
msgstr "Elementos conciliados"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:account.easy.reconcile,reconcile_method:0
|
||||
msgid "Method"
|
||||
msgstr "Método"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:easy.reconcile.history:0
|
||||
msgid "7 Days"
|
||||
msgstr "7 días"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: model:ir.actions.act_window,name:account_easy_reconcile.action_easy_reconcile_history
|
||||
msgid "Easy Automatic Reconcile History"
|
||||
msgstr "Historial de la conciliación automática sencilla"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:easy.reconcile.history,date:0
|
||||
msgid "Run date"
|
||||
msgstr "Fecha ejecucción"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
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."
|
||||
msgstr ""
|
||||
"Casa una línea del debe con una línea del haber. No permite conciliación "
|
||||
"parcial. Las líneas deben tener el mismo importe (con el desajuste) y la "
|
||||
"misma referencia para ser conciliadas."
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: model:ir.actions.act_window,name:account_easy_reconcile.act_easy_reconcile_to_history
|
||||
msgid "History Details"
|
||||
msgstr "Detalles del historial"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
msgid "Display items reconciled on the last run"
|
||||
msgstr "Mostrar elementos conciliados en la última ejecucción"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:account.easy.reconcile.method,name:0
|
||||
msgid "Type"
|
||||
msgstr "Tipo"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:account.easy.reconcile,company_id:0
|
||||
#: field:account.easy.reconcile.method,company_id:0
|
||||
#: field:easy.reconcile.history,company_id:0
|
||||
msgid "Company"
|
||||
msgstr "Compañía"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:account.easy.reconcile.method,account_profit_id:0
|
||||
#: field:easy.reconcile.base,account_profit_id:0
|
||||
#: field:easy.reconcile.options,account_profit_id:0
|
||||
#: field:easy.reconcile.simple,account_profit_id:0
|
||||
#: field:easy.reconcile.simple.name,account_profit_id:0
|
||||
#: field:easy.reconcile.simple.partner,account_profit_id:0
|
||||
#: field:easy.reconcile.simple.reference,account_profit_id:0
|
||||
msgid "Account Profit"
|
||||
msgstr "Cuenta de ganancias"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:easy.reconcile.history:0
|
||||
msgid "Todays' Reconcilations"
|
||||
msgstr "Conciliaciones de hoy"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
msgid "Simple. Amount and Name"
|
||||
msgstr "Simple. Cantidad y nombre"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:easy.reconcile.base,partner_ids:0
|
||||
#: field:easy.reconcile.simple,partner_ids:0
|
||||
#: field:easy.reconcile.simple.name,partner_ids:0
|
||||
#: field:easy.reconcile.simple.partner,partner_ids:0
|
||||
#: field:easy.reconcile.simple.reference,partner_ids:0
|
||||
msgid "Restrict on partners"
|
||||
msgstr "Restringir en las empresas"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: model:ir.actions.act_window,name:account_easy_reconcile.action_account_easy_reconcile
|
||||
#: model:ir.ui.menu,name:account_easy_reconcile.menu_easy_reconcile
|
||||
msgid "Easy Automatic Reconcile"
|
||||
msgstr "Conciliación automática simple"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:easy.reconcile.history:0
|
||||
msgid "Today"
|
||||
msgstr "Hoy"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:easy.reconcile.history:0
|
||||
msgid "Date"
|
||||
msgstr "Fecha"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:account.easy.reconcile,last_history:0
|
||||
msgid "Last History"
|
||||
msgstr "Último historial"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
msgid "Configuration"
|
||||
msgstr "Configuración"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:easy.reconcile.history,partial_line_ids:0
|
||||
msgid "Partially Reconciled Items"
|
||||
msgstr "Elementos parcialmente conciliados"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_simple_partner
|
||||
msgid "easy.reconcile.simple.partner"
|
||||
msgstr "easy.reconcile.simple.partner"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:account.easy.reconcile.method,write_off:0
|
||||
#: field:easy.reconcile.base,write_off:0
|
||||
#: field:easy.reconcile.options,write_off:0
|
||||
#: field:easy.reconcile.simple,write_off:0
|
||||
#: field:easy.reconcile.simple.name,write_off:0
|
||||
#: field:easy.reconcile.simple.partner,write_off:0
|
||||
#: field:easy.reconcile.simple.reference,write_off:0
|
||||
msgid "Write off allowed"
|
||||
msgstr "Desajuste permitido"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
msgid "Automatic Easy Reconcile"
|
||||
msgstr "Conciliación automática sencilla"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:account.easy.reconcile,account:0
|
||||
#: field:easy.reconcile.base,account_id:0
|
||||
#: field:easy.reconcile.simple,account_id:0
|
||||
#: field:easy.reconcile.simple.name,account_id:0
|
||||
#: field:easy.reconcile.simple.partner,account_id:0
|
||||
#: field:easy.reconcile.simple.reference,account_id:0
|
||||
msgid "Account"
|
||||
msgstr "Cuenta"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:account.easy.reconcile.method,task_id:0
|
||||
msgid "Task"
|
||||
msgstr "Tarea"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:account.easy.reconcile,name:0
|
||||
msgid "Name"
|
||||
msgstr "Nombre"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
msgid "Simple. Amount and Partner"
|
||||
msgstr "Simple. Cantidad y empresa"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
msgid "Start Auto Reconcilation"
|
||||
msgstr "Iniciar conciliación automática"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_simple_name
|
||||
msgid "easy.reconcile.simple.name"
|
||||
msgstr "easy.reconcile.simple.name"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:account.easy.reconcile.method,filter:0
|
||||
#: field:easy.reconcile.base,filter:0
|
||||
#: field:easy.reconcile.options,filter:0
|
||||
#: field:easy.reconcile.simple,filter:0
|
||||
#: field:easy.reconcile.simple.name,filter:0
|
||||
#: field:easy.reconcile.simple.partner,filter:0
|
||||
#: field:easy.reconcile.simple.reference,filter:0
|
||||
msgid "Filter"
|
||||
msgstr "Filtro"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
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."
|
||||
msgstr ""
|
||||
"Casa una línea del debe con una línea del haber. No permite conciliación "
|
||||
"parcial. Las líneas deben tener el mismo importe (con el desajuste) y la "
|
||||
"misma empresa para ser conciliadas."
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:easy.reconcile.history,easy_reconcile_id:0
|
||||
msgid "Reconcile Profile"
|
||||
msgstr "Perfil de conciliación"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: model:ir.model,name:account_easy_reconcile.model_account_easy_reconcile_method
|
||||
msgid "reconcile method for account_easy_reconcile"
|
||||
msgstr "Método de conciliación para account_easy_reconcile"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
msgid "Start Auto Reconciliation"
|
||||
msgstr "Iniciar auto-conciliación"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: code:addons/account_easy_reconcile/easy_reconcile.py:233
|
||||
#, python-format
|
||||
msgid "Error"
|
||||
msgstr "Error"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: code:addons/account_easy_reconcile/easy_reconcile.py:258
|
||||
#, python-format
|
||||
msgid "There is no history of reconciled items on the task: %s."
|
||||
msgstr "No hay histórico de elementos conciliados en la tarea: %s"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
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."
|
||||
msgstr ""
|
||||
"Casa una línea del debe con una línea del haber. No permite conciliación "
|
||||
"parcial. Las líneas deben tener el mismo importe (con el desajuste) y el "
|
||||
"mismo nombre para ser conciliadas."
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:account.easy.reconcile.method,account_lost_id:0
|
||||
#: field:easy.reconcile.base,account_lost_id:0
|
||||
#: field:easy.reconcile.options,account_lost_id:0
|
||||
#: field:easy.reconcile.simple,account_lost_id:0
|
||||
#: field:easy.reconcile.simple.name,account_lost_id:0
|
||||
#: field:easy.reconcile.simple.partner,account_lost_id:0
|
||||
#: field:easy.reconcile.simple.reference,account_lost_id:0
|
||||
msgid "Account Lost"
|
||||
msgstr "Cuenta de pérdidas"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:easy.reconcile.history:0
|
||||
msgid "Reconciliation Profile"
|
||||
msgstr "Perfil de conciliación"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
#: field:account.easy.reconcile,history_ids:0
|
||||
msgid "History"
|
||||
msgstr "Historial"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
#: view:easy.reconcile.history:0
|
||||
msgid "Go to reconciled items"
|
||||
msgstr "Ir a los elementos conciliados"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
msgid "Profile Information"
|
||||
msgstr "Información del perfil"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile.method:0
|
||||
msgid "Automatic Easy Reconcile Method"
|
||||
msgstr "Método de conciliación automática sencilla"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
msgid "Simple. Amount and Reference"
|
||||
msgstr "Simple. Cantidad y referencia"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
msgid "Display items partially reconciled on the last run"
|
||||
msgstr "Mostrar elementos conciliados parcialmente en la última ejecucción"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:account.easy.reconcile.method,sequence:0
|
||||
msgid "Sequence"
|
||||
msgstr "Secuencia"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_simple
|
||||
msgid "easy.reconcile.simple"
|
||||
msgstr "easy.reconcile.simple"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:easy.reconcile.history:0
|
||||
msgid "Reconciliations of last 7 days"
|
||||
msgstr "Conciliaciones de los últimos 7 días"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:account.easy.reconcile.method,date_base_on:0
|
||||
#: field:easy.reconcile.base,date_base_on:0
|
||||
#: field:easy.reconcile.options,date_base_on:0
|
||||
#: field:easy.reconcile.simple,date_base_on:0
|
||||
#: field:easy.reconcile.simple.name,date_base_on:0
|
||||
#: field:easy.reconcile.simple.partner,date_base_on:0
|
||||
#: field:easy.reconcile.simple.reference,date_base_on:0
|
||||
msgid "Date of reconciliation"
|
||||
msgstr "Fecha de conciliación"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: code:addons/account_easy_reconcile/easy_reconcile_history.py:104
|
||||
#: field:easy.reconcile.history,reconcile_partial_ids:0
|
||||
#, python-format
|
||||
msgid "Partial Reconciliations"
|
||||
msgstr "Conciliaciones parciales"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:account.easy.reconcile.method,journal_id:0
|
||||
#: field:easy.reconcile.base,journal_id:0
|
||||
#: field:easy.reconcile.options,journal_id:0
|
||||
#: field:easy.reconcile.simple,journal_id:0
|
||||
#: field:easy.reconcile.simple.name,journal_id:0
|
||||
#: field:easy.reconcile.simple.partner,journal_id:0
|
||||
#: field:easy.reconcile.simple.reference,journal_id:0
|
||||
msgid "Journal"
|
||||
msgstr "Diario"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_simple_reference
|
||||
msgid "easy.reconcile.simple.reference"
|
||||
msgstr "easy.reconcile.simple.reference"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: model:ir.model,name:account_easy_reconcile.model_account_easy_reconcile
|
||||
msgid "account easy reconcile"
|
||||
msgstr "account easy reconcile"
|
||||
@@ -1,429 +0,0 @@
|
||||
# Translation of OpenERP Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * account_easy_reconcile
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: OpenERP Server 6.1\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2014-01-21 11:55+0000\n"
|
||||
"PO-Revision-Date: 2014-03-21 15:25+0000\n"
|
||||
"Last-Translator: Guewen Baconnier @ Camptocamp <Unknown>\n"
|
||||
"Language-Team: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2014-05-22 06:49+0000\n"
|
||||
"X-Generator: Launchpad (build 17017)\n"
|
||||
"Language: \n"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: code:addons/account_easy_reconcile/easy_reconcile_history.py:101
|
||||
#: field:easy.reconcile.history,reconcile_ids:0
|
||||
#, python-format
|
||||
msgid "Reconciliations"
|
||||
msgstr "Lettrages"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
#: view:easy.reconcile.history:0
|
||||
msgid "Automatic Easy Reconcile History"
|
||||
msgstr "Historique des lettrages automatisés"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
msgid "Information"
|
||||
msgstr "Information"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
#: view:easy.reconcile.history:0
|
||||
msgid "Go to partially reconciled items"
|
||||
msgstr "Voir les entrées partiellement lettrées"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: help:account.easy.reconcile.method,sequence:0
|
||||
msgid "The sequence field is used to order the reconcile method"
|
||||
msgstr "La séquence détermine l'ordre des méthodes de lettrage"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_history
|
||||
msgid "easy.reconcile.history"
|
||||
msgstr "easy.reconcile.history"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: model:ir.actions.act_window,help:account_easy_reconcile.action_account_easy_reconcile
|
||||
msgid ""
|
||||
"<p class=\"oe_view_nocontent_create\">\n"
|
||||
" Click to add a reconciliation profile.\n"
|
||||
" </p><p>\n"
|
||||
" A reconciliation profile specifies, for one account, how\n"
|
||||
" the entries should be reconciled.\n"
|
||||
" You can select one or many reconciliation methods which will\n"
|
||||
" be run sequentially to match the entries between them.\n"
|
||||
" </p>\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"<p class=\"oe_view_nocontent_create\">\n"
|
||||
" Cliquez pour ajouter un profil de lettrage.\n"
|
||||
" </p><p>\n"
|
||||
" Un profil de lettrage spécifie, pour un compte, comment\n"
|
||||
" les écritures doivent être lettrées.\n"
|
||||
" Vous pouvez sélectionner une ou plusieurs méthodes de lettrage\n"
|
||||
" qui seront lancées successivement pour identifier les écritures\n"
|
||||
" devant être lettrées. </p>\n"
|
||||
" "
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_options
|
||||
msgid "easy.reconcile.options"
|
||||
msgstr "lettrage automatisé.options"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:easy.reconcile.history:0
|
||||
msgid "Group By..."
|
||||
msgstr "Grouper par..."
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:account.easy.reconcile,unreconciled_count:0
|
||||
msgid "Unreconciled Items"
|
||||
msgstr "Écritures non lettrées"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_base
|
||||
msgid "easy.reconcile.base"
|
||||
msgstr "easy.reconcile.base"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:easy.reconcile.history,reconcile_line_ids:0
|
||||
msgid "Reconciled Items"
|
||||
msgstr "Écritures lettrées"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:account.easy.reconcile,reconcile_method:0
|
||||
msgid "Method"
|
||||
msgstr "Méthode"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:easy.reconcile.history:0
|
||||
msgid "7 Days"
|
||||
msgstr "7 jours"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: model:ir.actions.act_window,name:account_easy_reconcile.action_easy_reconcile_history
|
||||
msgid "Easy Automatic Reconcile History"
|
||||
msgstr "Lettrage automatisé"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:easy.reconcile.history,date:0
|
||||
msgid "Run date"
|
||||
msgstr "Date de lancement"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
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."
|
||||
msgstr ""
|
||||
"Lettre un débit avec un crédit ayant le même montant et la même référence. "
|
||||
"Le lettrage ne peut être partiel (écriture d'ajustement en cas d'écart)."
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: model:ir.actions.act_window,name:account_easy_reconcile.act_easy_reconcile_to_history
|
||||
msgid "History Details"
|
||||
msgstr "Détails de l'historique"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
msgid "Display items reconciled on the last run"
|
||||
msgstr "Voir les entrées lettrées au dernier lettrage"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:account.easy.reconcile.method,name:0
|
||||
msgid "Type"
|
||||
msgstr "Type"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:account.easy.reconcile,company_id:0
|
||||
#: field:account.easy.reconcile.method,company_id:0
|
||||
#: field:easy.reconcile.history,company_id:0
|
||||
msgid "Company"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:account.easy.reconcile.method,account_profit_id:0
|
||||
#: field:easy.reconcile.base,account_profit_id:0
|
||||
#: field:easy.reconcile.options,account_profit_id:0
|
||||
#: field:easy.reconcile.simple,account_profit_id:0
|
||||
#: field:easy.reconcile.simple.name,account_profit_id:0
|
||||
#: field:easy.reconcile.simple.partner,account_profit_id:0
|
||||
#: field:easy.reconcile.simple.reference,account_profit_id:0
|
||||
msgid "Account Profit"
|
||||
msgstr "Compte de profits"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:easy.reconcile.history:0
|
||||
msgid "Todays' Reconcilations"
|
||||
msgstr "Lettrages du jour"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
msgid "Simple. Amount and Name"
|
||||
msgstr "Simple. Montant et description"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:easy.reconcile.base,partner_ids:0
|
||||
#: field:easy.reconcile.simple,partner_ids:0
|
||||
#: field:easy.reconcile.simple.name,partner_ids:0
|
||||
#: field:easy.reconcile.simple.partner,partner_ids:0
|
||||
#: field:easy.reconcile.simple.reference,partner_ids:0
|
||||
msgid "Restrict on partners"
|
||||
msgstr "Filtrer sur des partenaires"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: model:ir.actions.act_window,name:account_easy_reconcile.action_account_easy_reconcile
|
||||
#: model:ir.ui.menu,name:account_easy_reconcile.menu_easy_reconcile
|
||||
msgid "Easy Automatic Reconcile"
|
||||
msgstr "Lettrage automatisé"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:easy.reconcile.history:0
|
||||
msgid "Today"
|
||||
msgstr "Aujourd'hui"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:easy.reconcile.history:0
|
||||
msgid "Date"
|
||||
msgstr "Date"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:account.easy.reconcile,last_history:0
|
||||
msgid "Last History"
|
||||
msgstr "Dernier historique"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
msgid "Configuration"
|
||||
msgstr "Configuration"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:easy.reconcile.history,partial_line_ids:0
|
||||
msgid "Partially Reconciled Items"
|
||||
msgstr "Écritures partiellement lettrées"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_simple_partner
|
||||
msgid "easy.reconcile.simple.partner"
|
||||
msgstr "easy.reconcile.simple.partner"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:account.easy.reconcile.method,write_off:0
|
||||
#: field:easy.reconcile.base,write_off:0
|
||||
#: field:easy.reconcile.options,write_off:0
|
||||
#: field:easy.reconcile.simple,write_off:0
|
||||
#: field:easy.reconcile.simple.name,write_off:0
|
||||
#: field:easy.reconcile.simple.partner,write_off:0
|
||||
#: field:easy.reconcile.simple.reference,write_off:0
|
||||
msgid "Write off allowed"
|
||||
msgstr "Écart autorisé"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
msgid "Automatic Easy Reconcile"
|
||||
msgstr "Lettrage automatisé"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:account.easy.reconcile,account:0
|
||||
#: field:easy.reconcile.base,account_id:0
|
||||
#: field:easy.reconcile.simple,account_id:0
|
||||
#: field:easy.reconcile.simple.name,account_id:0
|
||||
#: field:easy.reconcile.simple.partner,account_id:0
|
||||
#: field:easy.reconcile.simple.reference,account_id:0
|
||||
msgid "Account"
|
||||
msgstr "Compte"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:account.easy.reconcile.method,task_id:0
|
||||
msgid "Task"
|
||||
msgstr "Tâche"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:account.easy.reconcile,name:0
|
||||
msgid "Name"
|
||||
msgstr "Nom"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
msgid "Simple. Amount and Partner"
|
||||
msgstr "Simple. Montant et partenaire"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
msgid "Start Auto Reconcilation"
|
||||
msgstr "Lancer le lettrage automatisé"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_simple_name
|
||||
msgid "easy.reconcile.simple.name"
|
||||
msgstr "easy.reconcile.simple.name"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:account.easy.reconcile.method,filter:0
|
||||
#: field:easy.reconcile.base,filter:0
|
||||
#: field:easy.reconcile.options,filter:0
|
||||
#: field:easy.reconcile.simple,filter:0
|
||||
#: field:easy.reconcile.simple.name,filter:0
|
||||
#: field:easy.reconcile.simple.partner,filter:0
|
||||
#: field:easy.reconcile.simple.reference,filter:0
|
||||
msgid "Filter"
|
||||
msgstr "Filtre"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
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."
|
||||
msgstr ""
|
||||
"Lettre un débit avec un crédit ayant le même montant et le même partenaire. "
|
||||
"Le lettrage ne peut être partiel (écriture d'ajustement en cas d'écart)."
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:easy.reconcile.history,easy_reconcile_id:0
|
||||
msgid "Reconcile Profile"
|
||||
msgstr "Profil de réconciliation"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: model:ir.model,name:account_easy_reconcile.model_account_easy_reconcile_method
|
||||
msgid "reconcile method for account_easy_reconcile"
|
||||
msgstr "Méthode de lettrage"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
msgid "Start Auto Reconciliation"
|
||||
msgstr "Lancer le lettrage automatisé"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: code:addons/account_easy_reconcile/easy_reconcile.py:233
|
||||
#, python-format
|
||||
msgid "Error"
|
||||
msgstr "Erreur"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: code:addons/account_easy_reconcile/easy_reconcile.py:258
|
||||
#, python-format
|
||||
msgid "There is no history of reconciled items on the task: %s."
|
||||
msgstr "Il n'y a pas d'historique d'écritures lettrées sur la tâche: %s."
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
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."
|
||||
msgstr ""
|
||||
"Lettre un débit avec un crédit ayant le même montant et la même description. "
|
||||
"Le lettrage ne peut être partiel (écriture d'ajustement en cas d'écart)."
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:account.easy.reconcile.method,account_lost_id:0
|
||||
#: field:easy.reconcile.base,account_lost_id:0
|
||||
#: field:easy.reconcile.options,account_lost_id:0
|
||||
#: field:easy.reconcile.simple,account_lost_id:0
|
||||
#: field:easy.reconcile.simple.name,account_lost_id:0
|
||||
#: field:easy.reconcile.simple.partner,account_lost_id:0
|
||||
#: field:easy.reconcile.simple.reference,account_lost_id:0
|
||||
msgid "Account Lost"
|
||||
msgstr "Compte de pertes"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:easy.reconcile.history:0
|
||||
msgid "Reconciliation Profile"
|
||||
msgstr "Profil de réconciliation"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
#: field:account.easy.reconcile,history_ids:0
|
||||
msgid "History"
|
||||
msgstr "Historique"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
#: view:easy.reconcile.history:0
|
||||
msgid "Go to reconciled items"
|
||||
msgstr "Voir les entrées lettrées"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
msgid "Profile Information"
|
||||
msgstr "Information sur le profil"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile.method:0
|
||||
msgid "Automatic Easy Reconcile Method"
|
||||
msgstr "Méthode de lettrage automatisé"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
msgid "Simple. Amount and Reference"
|
||||
msgstr "Simple. Montant et référence"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:account.easy.reconcile:0
|
||||
msgid "Display items partially reconciled on the last run"
|
||||
msgstr "Afficher les entrées partiellement lettrées au dernier lettrage"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:account.easy.reconcile.method,sequence:0
|
||||
msgid "Sequence"
|
||||
msgstr "Séquence"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_simple
|
||||
msgid "easy.reconcile.simple"
|
||||
msgstr "easy.reconcile.simple"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: view:easy.reconcile.history:0
|
||||
msgid "Reconciliations of last 7 days"
|
||||
msgstr "Lettrages des 7 derniers jours"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:account.easy.reconcile.method,date_base_on:0
|
||||
#: field:easy.reconcile.base,date_base_on:0
|
||||
#: field:easy.reconcile.options,date_base_on:0
|
||||
#: field:easy.reconcile.simple,date_base_on:0
|
||||
#: field:easy.reconcile.simple.name,date_base_on:0
|
||||
#: field:easy.reconcile.simple.partner,date_base_on:0
|
||||
#: field:easy.reconcile.simple.reference,date_base_on:0
|
||||
msgid "Date of reconciliation"
|
||||
msgstr "Date de lettrage"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: code:addons/account_easy_reconcile/easy_reconcile_history.py:104
|
||||
#: field:easy.reconcile.history,reconcile_partial_ids:0
|
||||
#, python-format
|
||||
msgid "Partial Reconciliations"
|
||||
msgstr "Lettrages partiels"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: field:account.easy.reconcile.method,journal_id:0
|
||||
#: field:easy.reconcile.base,journal_id:0
|
||||
#: field:easy.reconcile.options,journal_id:0
|
||||
#: field:easy.reconcile.simple,journal_id:0
|
||||
#: field:easy.reconcile.simple.name,journal_id:0
|
||||
#: field:easy.reconcile.simple.partner,journal_id:0
|
||||
#: field:easy.reconcile.simple.reference,journal_id:0
|
||||
msgid "Journal"
|
||||
msgstr "Journal"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_simple_reference
|
||||
msgid "easy.reconcile.simple.reference"
|
||||
msgstr "easy.reconcile.simple.reference"
|
||||
|
||||
#. module: account_easy_reconcile
|
||||
#: model:ir.model,name:account_easy_reconcile.model_account_easy_reconcile
|
||||
msgid "account easy reconcile"
|
||||
msgstr "Lettrage automatisé"
|
||||
@@ -1,15 +0,0 @@
|
||||
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
|
||||
access_easy_reconcile_options_acc_user,easy.reconcile.options,model_easy_reconcile_options,account.group_account_user,1,0,0,0
|
||||
access_account_easy_reconcile_method_acc_user,account.easy.reconcile.method,model_account_easy_reconcile_method,account.group_account_user,1,0,0,0
|
||||
access_account_easy_reconcile_acc_user,account.easy.reconcile,model_account_easy_reconcile,account.group_account_user,1,1,0,0
|
||||
access_easy_reconcile_simple_name_acc_user,easy.reconcile.simple.name,model_easy_reconcile_simple_name,account.group_account_user,1,0,0,0
|
||||
access_easy_reconcile_simple_partner_acc_user,easy.reconcile.simple.partner,model_easy_reconcile_simple_partner,account.group_account_user,1,0,0,0
|
||||
access_easy_reconcile_simple_reference_acc_user,easy.reconcile.simple.reference,model_easy_reconcile_simple_reference,account.group_account_user,1,0,0,0
|
||||
access_easy_reconcile_options_acc_mgr,easy.reconcile.options,model_easy_reconcile_options,account.group_account_user,1,0,0,0
|
||||
access_account_easy_reconcile_method_acc_mgr,account.easy.reconcile.method,model_account_easy_reconcile_method,account.group_account_user,1,1,1,1
|
||||
access_account_easy_reconcile_acc_mgr,account.easy.reconcile,model_account_easy_reconcile,account.group_account_user,1,1,1,1
|
||||
access_easy_reconcile_simple_name_acc_mgr,easy.reconcile.simple.name,model_easy_reconcile_simple_name,account.group_account_user,1,0,0,0
|
||||
access_easy_reconcile_simple_partner_acc_mgr,easy.reconcile.simple.partner,model_easy_reconcile_simple_partner,account.group_account_user,1,0,0,0
|
||||
access_easy_reconcile_simple_reference_acc_mgr,easy.reconcile.simple.reference,model_easy_reconcile_simple_reference,account.group_account_user,1,0,0,0
|
||||
access_easy_reconcile_history_acc_user,easy.reconcile.history,model_easy_reconcile_history,account.group_account_user,1,1,1,0
|
||||
access_easy_reconcile_history_acc_mgr,easy.reconcile.history,model_easy_reconcile_history,account.group_account_manager,1,1,1,1
|
||||
|
@@ -1,25 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<openerp>
|
||||
<data noupdate="1">
|
||||
<record id="easy_reconcile_rule" model="ir.rule">
|
||||
<field name="name">Easy reconcile multi-company</field>
|
||||
<field name="model_id" ref="model_account_easy_reconcile"/>
|
||||
<field name="global" eval="True"/>
|
||||
<field name="domain_force">['|', ('company_id', '=', False), ('company_id', 'child_of', [user.company_id.id])]</field>
|
||||
</record>
|
||||
|
||||
<record id="easy_reconcile_history_rule" model="ir.rule">
|
||||
<field name="name">Easy reconcile history multi-company</field>
|
||||
<field name="model_id" ref="model_easy_reconcile_history"/>
|
||||
<field name="global" eval="True"/>
|
||||
<field name="domain_force">['|', ('company_id', '=', False), ('company_id', 'child_of', [user.company_id.id])]</field>
|
||||
</record>
|
||||
|
||||
<record id="easy_reconcile_method_rule" model="ir.rule">
|
||||
<field name="name">Easy reconcile method multi-company</field>
|
||||
<field name="model_id" ref="model_account_easy_reconcile_method"/>
|
||||
<field name="global" eval="True"/>
|
||||
<field name="domain_force">['|', ('company_id', '=', False), ('company_id', 'child_of', [user.company_id.id])]</field>
|
||||
</record>
|
||||
</data>
|
||||
</openerp>
|
||||
@@ -1,120 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Copyright 2012-2013 Camptocamp SA (Guewen Baconnier)
|
||||
# Copyright (C) 2010 Sébastien Beau
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
# published by the Free Software Foundation, either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from openerp.osv.orm import AbstractModel, TransientModel
|
||||
|
||||
|
||||
class easy_reconcile_simple(AbstractModel):
|
||||
|
||||
_name = 'easy.reconcile.simple'
|
||||
_inherit = 'easy.reconcile.base'
|
||||
|
||||
# has to be subclassed
|
||||
# field name used as key for matching the move lines
|
||||
_key_field = None
|
||||
|
||||
def rec_auto_lines_simple(self, cr, uid, rec, lines, context=None):
|
||||
if context is None:
|
||||
context = {}
|
||||
|
||||
if self._key_field is None:
|
||||
raise ValueError("_key_field has to be defined")
|
||||
|
||||
count = 0
|
||||
res = []
|
||||
while (count < len(lines)):
|
||||
for i in xrange(count+1, len(lines)):
|
||||
writeoff_account_id = False
|
||||
if lines[count][self._key_field] != lines[i][self._key_field]:
|
||||
break
|
||||
|
||||
check = False
|
||||
if lines[count]['credit'] > 0 and lines[i]['debit'] > 0:
|
||||
credit_line = lines[count]
|
||||
debit_line = lines[i]
|
||||
check = True
|
||||
elif lines[i]['credit'] > 0 and lines[count]['debit'] > 0:
|
||||
credit_line = lines[i]
|
||||
debit_line = lines[count]
|
||||
check = True
|
||||
if not check:
|
||||
continue
|
||||
|
||||
reconciled, dummy = self._reconcile_lines(
|
||||
cr, uid, rec, [credit_line, debit_line],
|
||||
allow_partial=False, context=context)
|
||||
if reconciled:
|
||||
res += [credit_line['id'], debit_line['id']]
|
||||
del lines[i]
|
||||
break
|
||||
count += 1
|
||||
return res, [] # empty list for partial, only full rec in "simple" rec
|
||||
|
||||
def _simple_order(self, rec, *args, **kwargs):
|
||||
return "ORDER BY account_move_line.%s" % self._key_field
|
||||
|
||||
def _action_rec(self, cr, uid, rec, context=None):
|
||||
"""Match only 2 move lines, do not allow partial reconcile"""
|
||||
select = self._select(rec)
|
||||
select += ", account_move_line.%s " % self._key_field
|
||||
where, params = self._where(rec)
|
||||
where += " AND account_move_line.%s IS NOT NULL " % self._key_field
|
||||
|
||||
where2, params2 = self._get_filter(cr, uid, rec, context=context)
|
||||
query = ' '.join((
|
||||
select,
|
||||
self._from(rec),
|
||||
where, where2,
|
||||
self._simple_order(rec)))
|
||||
|
||||
cr.execute(query, params + params2)
|
||||
lines = cr.dictfetchall()
|
||||
return self.rec_auto_lines_simple(cr, uid, rec, lines, context)
|
||||
|
||||
|
||||
class easy_reconcile_simple_name(TransientModel):
|
||||
|
||||
_name = 'easy.reconcile.simple.name'
|
||||
_inherit = 'easy.reconcile.simple'
|
||||
|
||||
# has to be subclassed
|
||||
# field name used as key for matching the move lines
|
||||
_key_field = 'name'
|
||||
|
||||
|
||||
class easy_reconcile_simple_partner(TransientModel):
|
||||
|
||||
_name = 'easy.reconcile.simple.partner'
|
||||
_inherit = 'easy.reconcile.simple'
|
||||
|
||||
# has to be subclassed
|
||||
# field name used as key for matching the move lines
|
||||
_key_field = 'partner_id'
|
||||
|
||||
|
||||
class easy_reconcile_simple_reference(TransientModel):
|
||||
|
||||
_name = 'easy.reconcile.simple.reference'
|
||||
_inherit = 'easy.reconcile.simple'
|
||||
|
||||
# has to be subclassed
|
||||
# field name used as key for matching the move lines
|
||||
_key_field = 'ref'
|
||||
Reference in New Issue
Block a user