from openerp.tools.translate import _
import openerp.addons.decimal_precision as dp
from openerp.report import report_sxw
+from openerp.tools import float_compare, float_round
import time
mv_line['has_no_partner'] = False
return [mv_line]
- # If there is no identified partner or structured communication, don't look further
- if not st_line.partner_id.id:
- return []
-
- # Look for a move line whose amount matches the statement line's amount
- company_currency = st_line.journal_id.company_id.currency_id.id
- statement_currency = st_line.journal_id.currency.id or company_currency
- sign = 1
- if statement_currency == company_currency:
- amount_field = 'credit'
- if st_line.amount > 0:
- amount_field = 'debit'
- else:
+ # How to compare statement line amount and move lines amount
+ precision_digits = self.pool.get('decimal.precision').precision_get(cr, uid, 'Account')
+ currency_id = st_line.currency_id.id or st_line.journal_id.currency.id
+ # NB : amount can't be == 0 ; so float precision is not an issue for amount > 0 or amount < 0
+ amount = st_line.amount_currency or st_line.amount
+ domain = [('reconcile_partial_id', '=', False)]
+ if currency_id:
+ domain += [('currency_id', '=', currency_id)]
+ sign = 1 # correct the fact that st_line.amount is signed and debit/credit is not
+ amount_field = 'debit'
+ if currency_id == False:
+ if amount < 0:
+ amount_field = 'credit'
sign = -1
else:
amount_field = 'amount_currency'
- if st_line.amount < 0:
- sign = -1
- if st_line.amount_currency:
- amount = st_line.amount_currency
- else:
- amount = st_line.amount
- match_id = self.get_move_lines_for_reconciliation(cr, uid, st_line, excluded_ids=excluded_ids, offset=0, limit=1, additional_domain=[(amount_field, '=', (sign * amount))])
+ # Look for a matching amount
+ domain_exact_amount = domain + [(amount_field, '=', float_round(sign * amount, precision_digits=precision_digits))]
+ match_id = self.get_move_lines_for_reconciliation(cr, uid, st_line, excluded_ids=excluded_ids, offset=0, limit=1, additional_domain=domain_exact_amount)
if match_id:
- return [match_id[0]]
+ return match_id
- return []
+ if not st_line.partner_id.id:
+ return []
+
+ # Look for a set of move line whose amount is <= to the line's amount
+ if amount > 0: # Make sure we can't mix receivable and payable
+ domain += [('account_id.type', '=', 'receivable')]
+ else:
+ domain += [('account_id.type', '=', 'payable')]
+ if amount_field == 'amount_currency' and amount < 0:
+ domain += [(amount_field, '<', 0), (amount_field, '>', (sign * amount))]
+ else:
+ domain += [(amount_field, '>', 0), (amount_field, '<', (sign * amount))]
+ mv_lines = self.get_move_lines_for_reconciliation(cr, uid, st_line, excluded_ids=excluded_ids, limit=5, additional_domain=domain)
+ ret = []
+ total = 0
+ for line in mv_lines:
+ total += abs(line['debit'] - line['credit'])
+ if float_compare(total, abs(amount), precision_digits=precision_digits) != 1:
+ ret.append(line)
+ else:
+ break
+ return ret
def get_move_lines_for_reconciliation_by_statement_line_id(self, cr, uid, st_line_id, excluded_ids=None, str=False, offset=0, limit=None, count=False, additional_domain=None, context=None):
""" Bridge between the web client reconciliation widget and get_move_lines_for_reconciliation (which expects a browse record) """
if additional_domain is None:
additional_domain = []
# Make domain
- domain = additional_domain + [('reconcile_id', '=', False),
- ('state', '=', 'valid'),
- ('account_id.reconcile', '=', True)]
+ domain = additional_domain + [
+ ('reconcile_id', '=', False),
+ ('state', '=', 'valid'),
+ ('account_id.reconcile', '=', True)
+ ]
if st_line.partner_id.id:
domain += [('partner_id', '=', st_line.partner_id.id)]
if excluded_ids:
domain.append(('id', 'not in', excluded_ids))
if str:
- domain += ['|', ('move_id.name', 'ilike', str), ('move_id.ref', 'ilike', str)]
+ domain += [
+ '|', ('move_id.name', 'ilike', str),
+ '|', ('move_id.ref', 'ilike', str),
+ ('date_maturity', 'like', str),
+ ]
if not st_line.partner_id.id:
domain.insert(-1, '|', )
domain.append(('partner_id.name', 'ilike', str))
_description = "Preset for the lines that can be created in a bank statement reconciliation"
_columns = {
'name': fields.char('Button Label', required=True),
- 'account_id': fields.many2one('account.account', 'Account', ondelete='cascade', domain=[('type','!=','view')]),
- 'label': fields.char('Label'),
- 'amount_type': fields.selection([('fixed', 'Fixed'),('percentage_of_total','Percentage of total amount'),('percentage_of_balance', 'Percentage of open balance')],
- 'Amount type', required=True),
- 'amount': fields.float('Amount', digits_compute=dp.get_precision('Account'), help="The amount will count as a debit if it is negative, as a credit if it is positive (except if amount type is 'Percentage of open balance').", required=True),
- 'tax_id': fields.many2one('account.tax', 'Tax', ondelete='cascade'),
- 'analytic_account_id': fields.many2one('account.analytic.account', 'Analytic Account', ondelete='cascade'),
+ 'account_id': fields.many2one('account.account', 'Account', ondelete='cascade', domain=[('type', 'not in', ('view', 'closed', 'consolidation'))]),
+ 'label': fields.char('Journal Item Label'),
+ 'amount_type': fields.selection([('fixed', 'Fixed'),('percentage_of_total','Percentage of total amount'),('percentage_of_balance', 'Percentage of open balance')], 'Amount type', required=True),
+ 'amount': fields.float('Amount', digits_compute=dp.get_precision('Account'), required=True, help="The amount will count as a debit if it is negative, as a credit if it is positive (except if amount type is 'Percentage of open balance')."),
+ 'tax_id': fields.many2one('account.tax', 'Tax', ondelete='restrict', domain=[('type_tax_use','in',('purchase','all')), ('parent_id','=',False)]),
+ 'analytic_account_id': fields.many2one('account.analytic.account', 'Analytic Account', ondelete='set null', domain=[('type','!=','view'), ('state','not in',('close','cancelled'))]),
+ 'company_id': fields.many2one('res.company', 'Company', required=True),
}
_defaults = {
'amount_type': 'percentage_of_balance',
- 'amount': 100.0
+ 'amount': 100.0,
+ 'company_id': lambda self, cr, uid, c: self.pool.get('res.users').browse(cr, uid, uid, c).company_id.id,
}
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: