Improve General Ledger to compute lines for each accounts at once

This commit is contained in:
Cédric Krier
2009-11-13 12:34:58 +01:00
parent 6399be065d
commit 2bf497ba11
2 changed files with 34 additions and 26 deletions
+2
View File
@@ -1,3 +1,5 @@
* Improve General Ledger to compute lines for each accounts at once
Version 1.4.0 - 2009-10-19
* Bug fixes (see mercurial logs for details)
* Add origin_tax field on account.tax.rule
+32 -26
View File
@@ -1288,9 +1288,10 @@ class GeneralLegder(Report):
if not datas['form']['empty_account']:
to_remove = []
account_id2lines = self.get_lines(cursor, user, account_ids,
end_period_ids, datas['form']['posted'], context)
for account_id in account_ids:
if not self.get_line_ids(cursor, user, account_id,
end_period_ids, datas['form']['posted'], context):
if account_id not in account_id2lines:
to_remove.append(account_id)
for account_id in to_remove:
account_ids.remove(account_id)
@@ -1300,51 +1301,56 @@ class GeneralLegder(Report):
context['id2start_account'] = id2start_account
context['id2end_account'] = id2end_account
context['digits'] = company.currency.digits
context['lines'] = lambda account_id: self.lines(cursor, user,
account_id, list(set(end_period_ids).difference(
set(start_period_ids))), datas['form']['posted'], context)
account_id2lines = self.lines(cursor, user, account_ids,
list(set(end_period_ids).difference(
set(start_period_ids))), datas['form']['posted'], context)
context['lines'] = lambda account_id: account_id2lines[account_id]
context['company'] = company
return super(GeneralLegder, self).parse(cursor, user, report, objects,
datas, context)
def get_line_ids(self, cursor, user, account_id, period_ids, posted,
def get_lines(self, cursor, user, account_ids, period_ids, posted,
context):
move_line_obj = self.pool.get('account.move.line')
clause = [
('account', '=', account_id),
('account', 'in', account_ids),
('period', 'in', period_ids),
('state', '!=', 'draft'),
]
if posted:
clause.append(('move.state', '=', 'posted'))
return move_line_obj.search(cursor, user, clause,
move_ids = move_line_obj.search(cursor, user, clause,
context=context)
res = {}
for move in move_line_obj.browse(cursor, user, move_ids,
context=context):
res.setdefault(move.account.id, []).append(move)
return res
def lines(self, cursor, user, account_id, period_ids, posted, context):
def lines(self, cursor, user, account_ids, period_ids, posted, context):
move_line_obj = self.pool.get('account.move.line')
move_obj = self.pool.get('account.move')
res = []
move_line_ids = self.get_line_ids(cursor, user, account_id, period_ids,
posted, context)
move_lines = move_line_obj.browse(cursor, user, move_line_ids,
context=context)
move_lines.sort(lambda x, y: cmp(x.date, y.date))
res = dict(((account_id, []) for account_id in account_ids))
account_id2lines = self.get_lines(cursor, user, account_ids,
period_ids, posted, context)
state_selections = dict(move_obj.fields_get(cursor, user,
fields_names=['state'], context=context)['state']['selection'])
balance = Decimal('0.0')
for line in move_lines:
balance += line.debit - line.credit
res.append({
'date': line.date,
'debit': line.debit,
'credit': line.credit,
'balance': balance,
'name': line.name,
'state': state_selections.get(line.move.state, line.move.state),
})
for account_id, lines in account_id2lines.iteritems():
lines.sort(lambda x, y: cmp(x.date, y.date))
balance = Decimal('0.0')
for line in lines:
balance += line.debit - line.credit
res[account_id].append({
'date': line.date,
'debit': line.debit,
'credit': line.credit,
'balance': balance,
'name': line.name,
'state': state_selections.get(line.move.state, line.move.state),
})
return res
GeneralLegder()