From 80fc35e01dd0350c0c8d4f6efb69d9c5103b8ba3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Sat, 5 Sep 2020 22:21:38 +0200 Subject: [PATCH] Add General Ledger per account and party We define an internal AccountParty model which defines an unique ID for the couple account and party based on the first move line created. Then we define a General Ledger model based on this model. issue7438 review314091002 --- CHANGELOG | 1 + __init__.py | 3 + account.py | 313 +++++++++++++++++-- account.xml | 65 ++++ general_ledger.fodt | 344 +++++++++++++-------- tests/scenario_reports.rst | 32 +- trial_balance.fodt | 176 ++++++----- view/general_ledger_account_list.xml | 3 +- view/general_ledger_account_party_list.xml | 8 + 9 files changed, 694 insertions(+), 251 deletions(-) create mode 100644 view/general_ledger_account_party_list.xml diff --git a/CHANGELOG b/CHANGELOG index 3a118f8a6b..1ac36246d4 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,4 @@ +* Add General Ledger per account and party * Add start/end date to tax rule line * Test for lines to reconcile before showing the next account diff --git a/__init__.py b/__init__.py index bc964a884c..e31ec2bf0a 100644 --- a/__init__.py +++ b/__init__.py @@ -22,11 +22,13 @@ def register(): account.AccountTemplate, account.AccountTemplateTaxTemplate, account.Account, + account.AccountParty, account.AccountDeferral, account.AccountTax, account.OpenChartAccountStart, account.GeneralLedgerAccount, account.GeneralLedgerAccountContext, + account.GeneralLedgerAccountParty, account.GeneralLedgerLine, account.GeneralLedgerLineContext, account.BalanceSheetContext, @@ -90,6 +92,7 @@ def register(): account.OpenChartAccount, account.CreateChart, account.UpdateChart, + account.OpenGeneralLedgerAccountParty, move.OpenJournal, move.OpenAccount, move.ReconcileLines, diff --git a/account.py b/account.py index 6772683774..4cf7ad85f8 100644 --- a/account.py +++ b/account.py @@ -7,7 +7,7 @@ from functools import wraps from dateutil.relativedelta import relativedelta from sql import Column, Null, Window, Literal -from sql.aggregate import Sum, Max +from sql.aggregate import Sum, Max, Min from sql.conditionals import Coalesce, Case from trytond.i18n import gettext @@ -978,14 +978,15 @@ class Account(AccountMixin(), ActivePeriodMixin, tree(), ModelSQL, ModelView): return result @classmethod - def _cumulate(cls, fiscalyears, accounts, names, values, func): + def _cumulate( + cls, fiscalyears, accounts, names, values, func, + deferral='account.account.deferral'): """ Cumulate previous fiscalyear values into values func is the method to compute values """ pool = Pool() FiscalYear = pool.get('account.fiscalyear') - Deferral = pool.get('account.account.deferral') youngest_fiscalyear = None for fiscalyear in fiscalyears: @@ -1006,7 +1007,8 @@ class Account(AccountMixin(), ActivePeriodMixin, tree(), ModelSQL, ModelView): if not fiscalyear: return values - if fiscalyear.state == 'close': + if fiscalyear.state == 'close' and deferral: + Deferral = pool.get(deferral) id2deferral = {} ids = [a.id for a in accounts] for sub_ids in grouped_slice(ids): @@ -1234,6 +1236,195 @@ class Account(AccountMixin(), ActivePeriodMixin, tree(), ModelSQL, ModelView): return self +class AccountParty(ActivePeriodMixin, ModelSQL): + "Account Party" + __name__ = 'account.account.party' + account = fields.Many2One('account.account', "Account") + party = fields.Many2One('party.party', "Party") + name = fields.Char("Name") + code = fields.Char("Code") + company = fields.Many2One('company.company', "Company") + type = fields.Many2One('account.account.type', "Type") + debit_type = fields.Many2One('account.account.type', "Debit Type") + closed = fields.Boolean("Closed") + + balance = fields.Function(fields.Numeric( + "Balance", digits=(16, Eval('currency_digits', 2)), + depends=['currency_digits']), + 'get_balance') + credit = fields.Function(fields.Numeric( + "Credit", digits=(16, Eval('currency_digits', 2)), + depends=['currency_digits']), + 'get_credit_debit') + debit = fields.Function(fields.Numeric( + "Debit", digits=(16, Eval('currency_digits', 2)), + depends=['currency_digits']), + 'get_credit_debit') + amount_second_currency = fields.Function(fields.Numeric( + "Amount Second Currency", + digits=(16, Eval('second_currency_digits', 2)), + states={ + 'invisible': ~Eval('second_currency'), + }, + depends=['second_currency_digits', 'second_currency']), + 'get_credit_debit') + second_currency = fields.Many2One( + 'currency.currency', "Secondary Currency") + + currency_digits = fields.Function( + fields.Integer("Currency Digits"), 'get_currency_digits') + second_currency_digits = fields.Function(fields.Integer( + "Second Currency Digits"), 'get_second_currency_digits') + + @classmethod + def table_query(cls): + pool = Pool() + Line = pool.get('account.move.line') + Account = pool.get('account.account') + line = Line.__table__() + account = Account.__table__() + columns = [] + group_by = [] + for fname, field in cls._fields.items(): + if not hasattr(field, 'set'): + if fname == 'id': + column = Min(line.id) + elif fname in {'account', 'party'}: + column = Column(line, fname) + else: + column = Column(account, fname) + columns.append(column.as_(fname)) + if fname != 'id': + group_by.append(column) + return ( + line.join(account, condition=line.account == account.id) + .select( + *columns, + where=(line.party != Null) & account.party_required, + group_by=group_by)) + + @classmethod + def get_balance(cls, records, name): + pool = Pool() + Account = pool.get('account.account') + MoveLine = pool.get('account.move.line') + FiscalYear = pool.get('account.fiscalyear') + cursor = Transaction().connection.cursor() + + table_a = Account.__table__() + table_c = Account.__table__() + line = MoveLine.__table__() + ids = [a.id for a in records] + account_ids = {a.account.id for a in records} + party_ids = {a.party.id for a in records} + account_party2id = {(a.account.id, a.party.id): a.id for a in records} + balances = dict((i, Decimal(0)) for i in ids) + line_query, fiscalyear_ids = MoveLine.query_get(line) + for sub_account_ids in grouped_slice(account_ids): + account_sql = reduce_ids(table_a.id, sub_account_ids) + for sub_party_ids in grouped_slice(party_ids): + party_sql = reduce_ids(line.party, sub_party_ids) + cursor.execute(*table_a.join(table_c, + condition=(table_c.left >= table_a.left) + & (table_c.right <= table_a.right) + ).join(line, condition=line.account == table_c.id + ).select( + table_a.id, + line.party, + Sum( + Coalesce(line.debit, 0) + - Coalesce(line.credit, 0)), + where=account_sql & party_sql & line_query, + group_by=[table_a.id, line.party])) + for account_id, party_id, balance in cursor: + id_ = account_party2id[(account_id, party_id)] + balances[id_] = balance + + for record in records: + # SQLite uses float for SUM + if not isinstance(balances[record.id], Decimal): + balances[record.id] = Decimal(str(balances[record.id])) + exp = Decimal(str(10.0 ** -record.currency_digits)) + balances[record.id] = balances[record.id].quantize(exp) + + fiscalyears = FiscalYear.browse(fiscalyear_ids) + + def func(records, names): + return {names[0]: cls.get_balance(records, names[0])} + return Account._cumulate( + fiscalyears, records, [name], {name: balances}, func, + deferral=None)[name] + + @classmethod + def get_credit_debit(cls, records, names): + pool = Pool() + Account = pool.get('account.account') + MoveLine = pool.get('account.move.line') + FiscalYear = pool.get('account.fiscalyear') + cursor = Transaction().connection.cursor() + + result = {} + ids = [a.id for a in records] + for name in names: + if name not in {'credit', 'debit', 'amount_second_currency'}: + raise ValueError('Unknown name: %s' % name) + result[name] = dict((i, Decimal(0)) for i in ids) + + account_ids = {a.account.id for a in records} + party_ids = {a.party.id for a in records} + account_party2id = {(a.account.id, a.party.id): a.id for a in records} + table = Account.__table__() + line = MoveLine.__table__() + line_query, fiscalyear_ids = MoveLine.query_get(line) + columns = [table.id, line.party] + for name in names: + columns.append(Sum(Coalesce(Column(line, name), 0))) + for sub_account_ids in grouped_slice(account_ids): + account_sql = reduce_ids(table.id, sub_account_ids) + for sub_party_ids in grouped_slice(party_ids): + party_sql = reduce_ids(line.party, sub_party_ids) + cursor.execute(*table.join(line, 'LEFT', + condition=line.account == table.id + ).select(*columns, + where=account_sql & party_sql & line_query, + group_by=[table.id, line.party])) + for row in cursor: + id_ = account_party2id[tuple(row[0:2])] + for i, name in enumerate(names, 2): + # SQLite uses float for SUM + if not isinstance(row[i], Decimal): + result[name][id_] = Decimal(str(row[i])) + else: + result[name][id_] = row[i] + for record in records: + for name in names: + if name == 'amount_second_currency': + exp = Decimal(str(10.0 ** -record.second_currency_digits)) + else: + exp = Decimal(str(10.0 ** -record.currency_digits)) + result[name][record.id] = ( + result[name][record.id].quantize(exp)) + + cumulate_names = [] + if Transaction().context.get('cumulate'): + cumulate_names = names + elif 'amount_second_currency' in names: + cumulate_names = ['amount_second_currency'] + if cumulate_names: + fiscalyears = FiscalYear.browse(fiscalyear_ids) + return Account._cumulate( + fiscalyears, records, cumulate_names, result, + cls.get_credit_debit, deferral=None) + else: + return result + + def get_currency_digits(self, name): + return self.company.currency.digits + + def get_second_currency_digits(self, name): + return self.account.second_currency_digits + + class AccountDeferral(ModelSQL, ModelView): ''' Account Deferral @@ -1364,16 +1555,10 @@ class OpenChartAccount(Wizard): return 'end' -class GeneralLedgerAccount(ActivePeriodMixin, ModelSQL, ModelView): - 'General Ledger Account' - __name__ = 'account.general_ledger.account' +class _GeneralLedgerAccount(ActivePeriodMixin, ModelSQL, ModelView): - # TODO reuse rec_name of Account - name = fields.Char('Name') - code = fields.Char('Code') + account = fields.Many2One('account.account', "Account") company = fields.Many2One('company.company', 'Company') - type = fields.Many2One('account.account.type', 'Type') - debit_type = fields.Many2One('account.account.type', 'Debit Type') start_debit = fields.Function(fields.Numeric('Start Debit', digits=(16, Eval('currency_digits', 2)), depends=['currency_digits']), @@ -1406,28 +1591,28 @@ class GeneralLedgerAccount(ActivePeriodMixin, ModelSQL, ModelView): digits=(16, Eval('currency_digits', 2)), depends=['currency_digits']), 'get_account', searcher='search_account') - lines = fields.One2Many('account.general_ledger.line', 'account', 'Lines', - readonly=True) - general_ledger_balance = fields.Boolean('General Ledger Balance') currency_digits = fields.Function(fields.Integer('Currency Digits'), 'get_currency_digits') @classmethod def __setup__(cls): - super(GeneralLedgerAccount, cls).__setup__() - cls._order.insert(0, ('code', 'ASC')) - cls._order.insert(1, ('name', 'ASC')) + super().__setup__() + cls._order.insert(0, ('account', 'ASC')) @classmethod def table_query(cls): - pool = Pool() context = Transaction().context - Account = pool.get('account.account') + Account = cls._get_account() account = Account.__table__() columns = [] for fname, field in cls._fields.items(): if not hasattr(field, 'set'): - columns.append(Column(account, fname).as_(fname)) + if (isinstance(field, fields.Many2One) + and field.get_target() == Account): + column = Column(account, 'id') + else: + column = Column(account, fname) + columns.append(column.as_(fname)) return account.select(*columns, where=(account.company == context.get('company')) & (account.type != Null) @@ -1485,8 +1670,7 @@ class GeneralLedgerAccount(ActivePeriodMixin, ModelSQL, ModelView): @classmethod def get_account(cls, records, name): - pool = Pool() - Account = pool.get('account.account') + Account = cls._get_account() period_ids = cls.get_period_ids(name) from_date, to_date = cls.get_dates(name) @@ -1503,8 +1687,7 @@ class GeneralLedgerAccount(ActivePeriodMixin, ModelSQL, ModelView): @classmethod def search_account(cls, name, domain): - pool = Pool() - Account = pool.get('account.account') + Account = cls._get_account() period_ids = cls.get_period_ids(name) with Transaction().set_context(periods=period_ids): @@ -1533,8 +1716,7 @@ class GeneralLedgerAccount(ActivePeriodMixin, ModelSQL, ModelView): @classmethod def get_debit_credit(cls, records, name): - pool = Pool() - Account = pool.get('account.account') + Account = cls._get_account() start_period_ids = cls.get_period_ids('start_%s' % name) end_period_ids = cls.get_period_ids('end_%s' % name) @@ -1546,8 +1728,7 @@ class GeneralLedgerAccount(ActivePeriodMixin, ModelSQL, ModelView): @classmethod def search_debit_credit(cls, name, domain): - pool = Pool() - Account = pool.get('account.account') + Account = cls._get_account() start_period_ids = cls.get_period_ids('start_%s' % name) end_period_ids = cls.get_period_ids('end_%s' % name) @@ -1576,8 +1757,27 @@ class GeneralLedgerAccount(ActivePeriodMixin, ModelSQL, ModelView): return self.company.currency.digits def get_rec_name(self, name): - # TODO add start/end balance - return self.name + return self.account.rec_name + + @classmethod + def search_rec_name(cls, name, clause): + return [('account.rec_name',) + tuple(clause[1:])] + + +class GeneralLedgerAccount(_GeneralLedgerAccount): + 'General Ledger Account' + __name__ = 'account.general_ledger.account' + + type = fields.Many2One('account.account.type', "Type") + debit_type = fields.Many2One('account.account.type', "Debit Type") + lines = fields.One2Many( + 'account.general_ledger.line', 'account', "Lines", readonly=True) + general_ledger_balance = fields.Boolean("General Ledger Balance") + + @classmethod + def _get_account(cls): + pool = Pool() + return pool.get('account.account') class GeneralLedgerAccountContext(ModelView): @@ -1656,6 +1856,57 @@ class GeneralLedgerAccountContext(ModelView): self.end_period = None +class GeneralLedgerAccountParty(_GeneralLedgerAccount): + "General Ledger Account Party" + __name__ = 'account.general_ledger.account.party' + + party = fields.Many2One('party.party', "Party") + + @classmethod + def __setup__(cls): + super().__setup__() + cls._order.insert(2, ('party', 'ASC')) + + @classmethod + def _get_account(cls): + pool = Pool() + return pool.get('account.account.party') + + def get_rec_name(self, name): + return ' - '.join((self.account.rec_name, self.party.rec_name)) + + @classmethod + def search_rec_name(cls, name, clause): + if clause[1].startswith('!') or clause[1].startswith('not '): + bool_op = 'AND' + else: + bool_op = 'OR' + return [bool_op, + ('account.rec_name',) + tuple(clause[1:]), + ('party.rec_name',) + tuple(clause[1:]), + ] + + +class OpenGeneralLedgerAccountParty(Wizard): + "Open General Ledger Account Party" + __name__ = 'account.general_ledger.account.party.open' + start_state = 'open' + open = StateAction('account.act_general_ledger_line_form') + + def do_open(self, action): + action['name'] = '%s (%s)' % (action['name'], self.record.rec_name) + domain = [ + ('account', '=', self.record.account.id), + ('party', '=', self.record.party.id), + ] + action['pyson_domain'] = PYSONEncoder().encode(domain) + action['context_model'] = 'account.general_ledger.account.context' + action['pyson_context'] = PYSONEncoder().encode({ + 'party_cumulate': True, + }) + return action, {} + + class GeneralLedgerLine(ModelSQL, ModelView): 'General Ledger Line' __name__ = 'account.general_ledger.line' diff --git a/account.xml b/account.xml index 1dd3244c6a..6556f8cc99 100644 --- a/account.xml +++ b/account.xml @@ -537,6 +537,71 @@ this repository contains the full copyright notices and license terms. --> + + account.general_ledger.account.party + + general_ledger_account_party_list + + + + General Ledger - Account Parties + account.general_ledger.account.party + account.general_ledger.account.context + + + + + + + + + tree_open + account.general_ledger.account,-1 + + + + + Open General Ledger Account Parties + account.general_ledger.account.party.open + + + tree_open + account.general_ledger.account.party,-1 + + + + + + + + + + + + + + + + + + + + + User in company + + + + + + + + account.general_ledger.line tree diff --git a/general_ledger.fodt b/general_ledger.fodt index 1393a10b14..73768a00db 100644 --- a/general_ledger.fodt +++ b/general_ledger.fodt @@ -1,29 +1,30 @@ - - LibreOffice/5.2.7.2$Linux_X86_64 LibreOffice_project/20m0$Build-22008-06-07T15:26:412008-08-27T17:03:361PT0S + + LibreOffice/6.4.3.2$Linux_X86_64 LibreOffice_project/40$Build-22008-06-07T15:26:412008-08-27T17:03:361PT0S - 0 + 30268 0 - 23440 - 21451 + 26301 + 22994 true false view2 - 9816 - 5443 + 4452 + 34941 0 - 0 - 23439 - 21449 + 30268 + 26300 + 53261 0 0 false 100 false + false @@ -38,9 +39,15 @@ false false + false + false false false false + true + true + false + false false false false @@ -53,23 +60,22 @@ false true true - false - false - false + 2070049 false false - false true false false - false + true false false false true - 3901604 + 3965027 + + true false true false @@ -78,12 +84,18 @@ true false true + false + false + false 0 false true high-resolution false false + false + false + false false true true @@ -99,7 +111,6 @@ false false - 2070049 false 1 true @@ -120,8 +131,8 @@ - - + + @@ -129,15 +140,15 @@ - - + + - - + + @@ -149,18 +160,18 @@ - - + + - + - + @@ -176,17 +187,25 @@ - + - + + + + + + + + + - - + + @@ -197,8 +216,8 @@ - - + + @@ -207,17 +226,17 @@ - + - + - + @@ -228,123 +247,113 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - + - - - - - - + - + @@ -354,192 +363,192 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -630,12 +639,76 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -643,14 +716,14 @@ - - + + - + - + @@ -667,7 +740,7 @@ General Ledger - Print Date: <format_date(datetime.date.today(), user.language)> at <datetime.datetime.now().strftime('%H:%M:%S')> + Print Date: <format_date(datetime.date.today(), user.language)>at <datetime.datetime.now().strftime('%H:%M:%S')> @@ -696,14 +769,15 @@ + General Ledger Fiscal Year: <fiscalyear.rec_name> <if test="start_period or end_period"> - From Period: <start_period.name if start_period else ''> To <end_period.name if end_period else ''> + From Period: <start_period.name if start_period else ''>To <end_period.name if end_period else ''> </if> <if test="from_date or to_date"> - From Date: <format_date(from_date, user.language) if from_date else ''> To <format_date(to_date, user.language) if to_date else ''> + From Date: <format_date(from_date, user.language) if from_date else ''>To <format_date(to_date, user.language) if to_date else ''> </if> <for each="account in accounts"> @@ -712,11 +786,7 @@ - - Code - - - + Name @@ -724,15 +794,15 @@ + + - - <account.code or ''> + + <account.rec_name> - - <account.name or ''> - + diff --git a/tests/scenario_reports.rst b/tests/scenario_reports.rst index b564b92e44..1bee2cfddf 100644 --- a/tests/scenario_reports.rst +++ b/tests/scenario_reports.rst @@ -84,6 +84,8 @@ Create a moves:: Print some reports:: >>> GeneralLedgerAccount = Model.get('account.general_ledger.account') + >>> GeneralLedgerAccountParty = Model.get( + ... 'account.general_ledger.account.party') >>> gl_accounts = GeneralLedgerAccount.find([]) >>> _ = [(l.balance, l.party_required) for gl in gl_accounts ... for l in gl.lines] @@ -100,8 +102,12 @@ Print some reports:: ... } >>> with config.set_context(context): ... gl_revenue, = GeneralLedgerAccount.find([ - ... ('name', '=', revenue.name), + ... ('account', '=', revenue.id), ... ]) + ... glp_receivable, = GeneralLedgerAccountParty.find([ + ... ('account', '=', receivable.id), + ... ('party', '=', party.id), + ... ]) >>> gl_revenue.start_balance Decimal('0.00') >>> gl_revenue.credit @@ -110,6 +116,14 @@ Print some reports:: Decimal('0.00') >>> gl_revenue.end_balance Decimal('-10.00') + >>> glp_receivable.start_balance + Decimal('0.00') + >>> glp_receivable.credit + Decimal('10.00') + >>> glp_receivable.debit + Decimal('10.00') + >>> glp_receivable.end_balance + Decimal('0.00') >>> context = { ... 'company': company.id, @@ -119,8 +133,12 @@ Print some reports:: ... } >>> with config.set_context(context): ... gl_revenue, = GeneralLedgerAccount.find([ - ... ('name', '=', revenue.name), + ... ('account', '=', revenue.id), ... ]) + ... glp_receivable, = GeneralLedgerAccountParty.find([ + ... ('account', '=', receivable.id), + ... ('party', '=', party.id), + ... ]) >>> gl_revenue.start_balance Decimal('0.00') >>> gl_revenue.credit @@ -129,6 +147,14 @@ Print some reports:: Decimal('0.00') >>> gl_revenue.end_balance Decimal('-10.00') + >>> glp_receivable.start_balance + Decimal('0.00') + >>> glp_receivable.credit + Decimal('10.00') + >>> glp_receivable.debit + Decimal('10.00') + >>> glp_receivable.end_balance + Decimal('0.00') >>> context = { ... 'company': company.id, @@ -137,7 +163,7 @@ Print some reports:: ... } >>> with config.set_context(context): ... gl_revenue, = GeneralLedgerAccount.find([ - ... ('name', '=', revenue.name), + ... ('account', '=', revenue.id), ... ]) >>> gl_revenue.start_balance Decimal('-10.00') diff --git a/trial_balance.fodt b/trial_balance.fodt index 2d6fbf9bd5..69ef362442 100644 --- a/trial_balance.fodt +++ b/trial_balance.fodt @@ -1,29 +1,30 @@ - - LibreOffice/5.2.7.2$Linux_X86_64 LibreOffice_project/20m0$Build-22008-06-07T15:26:582008-08-27T17:08:381PT0S + + LibreOffice/6.4.3.2$Linux_X86_64 LibreOffice_project/40$Build-22008-06-07T15:26:582008-08-27T17:08:381PT0S - 0 + 4868 0 - 23440 - 21451 + 26301 + 22994 true false view2 - 3784 - 10984 + 8073 + 13226 0 - 0 - 23439 - 21449 + 4868 + 26300 + 27861 0 1 false 100 false + false @@ -38,9 +39,15 @@ false false + false + false false false false + true + true + false + false false false false @@ -53,23 +60,22 @@ false true true - false - false - false + 1253212 false false - false true false false - false + true false false false true - 1470702 + 1557078 + + true false true false @@ -78,12 +84,18 @@ true false true + false + false + false 0 false true high-resolution false false + false + false + false false true true @@ -99,7 +111,6 @@ false false - 1253212 false 1 true @@ -129,15 +140,15 @@ - - + + - - + + @@ -149,18 +160,18 @@ - + - + - + @@ -178,11 +189,19 @@ + + + + + + + + - - + + @@ -193,8 +212,8 @@ - - + + @@ -203,17 +222,17 @@ - + - + - + @@ -224,130 +243,130 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -386,14 +405,14 @@ - - + + - + - + @@ -410,7 +429,7 @@ Trial Balance - Print Date: <format_date(datetime.date.today(), user.language)> at <datetime.datetime.now().strftime('%H:%M:%S')> + Print Date: <format_date(datetime.date.today(), user.language)>at <datetime.datetime.now().strftime('%H:%M:%S')> @@ -439,14 +458,15 @@ + Trial Balance Fiscal Year: <fiscalyear.rec_name> <if test="start_period or end_period"> - From Period: <start_period.name if start_period else ''> To <end_period.name if end_period else ''> + From Period: <start_period.name if start_period else ''>To <end_period.name if end_period else ''> </if> <if test="from_date or to_date"> - From Date: <format_date(from_date, user.language) if from_date else ''> To <format_date(to_date, user.language) if to_date else ''> + From Date: <format_date(from_date, user.language) if from_date else ''>To <format_date(to_date, user.language) if to_date else ''> </if> @@ -481,7 +501,7 @@ - <account.code and account.code + ' ' or ''><account.name> + <account.rec_name> <format_currency(account.start_balance, user.language, company.currency)> diff --git a/view/general_ledger_account_list.xml b/view/general_ledger_account_list.xml index 89796ded32..07f3a9a6ef 100644 --- a/view/general_ledger_account_list.xml +++ b/view/general_ledger_account_list.xml @@ -2,8 +2,7 @@ - - + diff --git a/view/general_ledger_account_party_list.xml b/view/general_ledger_account_party_list.xml new file mode 100644 index 0000000000..858ce9cd4e --- /dev/null +++ b/view/general_ledger_account_party_list.xml @@ -0,0 +1,8 @@ + + + + + + +