X-Git-Url: http://git.inspyration.org/?a=blobdiff_plain;f=addons%2Faccount%2Faccount_bank_statement.py;fp=addons%2Faccount%2Faccount_bank_statement.py;h=8fbce5ef604dc5d093ccb2863c2edba758719592;hb=fcd06145dda957a83e687fd033ff294c407da5f4;hp=dab5cfd14063c6d58dece47cd7011b336e3222ea;hpb=d9610efd979c974e540353716f8d0b9ecdb9d952;p=odoo%2Fodoo.git diff --git a/addons/account/account_bank_statement.py b/addons/account/account_bank_statement.py index dab5cfd..8fbce5e 100644 --- a/addons/account/account_bank_statement.py +++ b/addons/account/account_bank_statement.py @@ -23,6 +23,7 @@ from openerp.osv import fields, osv 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 @@ -547,34 +548,51 @@ class account_bank_statement_line(osv.osv): 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) """ @@ -591,15 +609,21 @@ class account_bank_statement_line(osv.osv): 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)) @@ -834,17 +858,18 @@ class account_statement_operation_template(osv.osv): _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: