Accumulate start balance on general ledger line

issue9791
review339211002
This commit is contained in:
Sergi Almacellas Abellana committed 2021-03-31 16:02:44 +02:00
1 parent 7a48d5f34b
commit 1ebe29a3b0
2 files changed
+64 -4

No files matched your search

+1
View File
@@ -1,3 +1,4 @@
* Accumulate start balance on general ledger line
* Print general journal from moves
* Add reconciliation sequence to configuration
* Add report for income statement and balance sheet
+63 -4
View File
@@ -3,6 +3,7 @@
from decimal import Decimal
import datetime
import operator
from collections import defaultdict
from itertools import zip_longest
from functools import wraps
@@ -1977,6 +1978,10 @@ class GeneralLedgerLine(ModelSQL, ModelView):
},
depends=['party_required', 'company'])
party_required = fields.Boolean('Party Required')
account_party = fields.Function(
fields.Many2One(
'account.general_ledger.account.party', "Account Party"),
'get_account_party')
company = fields.Many2One('company.company', 'Company')
debit = fields.Numeric('Debit',
digits=(16, Eval('currency_digits', 2)),
@@ -1984,9 +1989,14 @@ class GeneralLedgerLine(ModelSQL, ModelView):
credit = fields.Numeric('Credit',
digits=(16, Eval('currency_digits', 2)),
depends=['currency_digits'])
balance = fields.Numeric('Balance',
internal_balance = fields.Numeric("Internal Balance",
digits=(16, Eval('currency_digits', 2)),
depends=['currency_digits'])
balance = fields.Function(
fields.Numeric("Balance",
digits=(16, Eval('currency_digits', 2)),
depends=['currency_digits']),
'get_balance')
origin = fields.Reference('Origin', selection='get_origin')
description = fields.Char('Description')
move_description = fields.Char('Move Description')
@@ -2026,16 +2036,17 @@ class GeneralLedgerLine(ModelSQL, ModelView):
if hasattr(field, 'set'):
continue
field_line = getattr(Line, fname, None)
if fname == 'balance':
if fname == 'internal_balance':
if database.has_window_functions():
w_columns = [line.account]
if context.get('party_cumulate', False):
w_columns.append(line.party)
column = Sum(line.debit - line.credit,
window=Window(w_columns,
order_by=[move.date.asc, line.id])).as_('balance')
order_by=[move.date.asc, line.id])).as_(
'internal_balance')
else:
column = (line.debit - line.credit).as_('balance')
column = (line.debit - line.credit).as_('internal_balance')
elif fname == 'move_description':
column = Column(move, 'description').as_(fname)
elif fname == 'party_required':
@@ -2070,6 +2081,54 @@ class GeneralLedgerLine(ModelSQL, ModelView):
Line = Pool().get('account.move.line')
return Line.get_origin()
def get_balance(self, name):
transaction = Transaction()
context = transaction.context
database = transaction.database
balance = self.internal_balance
if database.has_window_functions():
if context.get('party_cumulate', False) and self.account_party:
balance += self.account_party.start_balance
else:
balance += self.account.start_balance
return balance
@classmethod
def get_account_party(cls, records, name):
pool = Pool()
AccountParty = pool.get('account.general_ledger.account.party')
account_party = AccountParty.__table__()
cursor = Transaction().connection.cursor()
account_parties = {}
account_party2ids = defaultdict(list)
account_ids, party_ids = set(), set()
for r in records:
account_parties[r.id] = None
account_party2ids[r.account.id, r.party.id].append(r.id)
account_ids.add(r.account.id)
party_ids.add(r.party.id)
query = account_party.select(
account_party.account, account_party.party, account_party.id)
for sub_account_ids in grouped_slice(account_ids):
account_where = reduce_ids(account_party.account, sub_account_ids)
for sub_party_ids in grouped_slice(party_ids):
query.where = (account_where
& reduce_ids(account_party.party, sub_party_ids))
cursor.execute(*query)
for account, party, id_ in cursor:
key = (account, party)
try:
account_party_ids = account_party2ids[key]
except KeyError:
# There can be more combinations of account-party in
# the database than from records
continue
for record_id in account_party_ids:
account_parties[record_id] = id_
return account_parties
class GeneralLedgerLineContext(GeneralLedgerAccountContext):
'General Ledger Line Context'