From ee36aa0c050e503d571eba48377ed4ab12e84ec3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Tue, 1 Apr 2008 16:25:47 +0200 Subject: [PATCH] Add trial balance and fix general ledger wizard --- account.py | 161 ++++++++++++++++++++++++++++++++++++++++++++-- account.xml | 36 +++++++++++ trial_balance.odt | Bin 0 -> 12378 bytes 3 files changed, 191 insertions(+), 6 deletions(-) create mode 100644 trial_balance.odt diff --git a/account.py b/account.py index 272130ded7..14d6729dfb 100644 --- a/account.py +++ b/account.py @@ -362,13 +362,13 @@ Partner() class PrintGeneralLegderInit(WizardOSV): _name = 'account.account.print_general_ledger.init' fiscalyear = fields.Many2One('account.fiscalyear', 'Fiscal Year', - required=True) + required=True, on_change=['fiscalyear']) start_period = fields.Many2One('account.period', 'Start Period', domain="[('fiscalyear', '=', fiscalyear), " \ - "('end_date', '<', (end_period, 'start_date'))]") + "('start_date', '<=', (end_period, 'start_date'))]") end_period = fields.Many2One('account.period', 'End Period', domain="[('fiscalyear', '=', fiscalyear), " \ - "('start_date', '>', (start_period, 'end_date'))]") + "('start_date', '>=', (start_period, 'start_date'))]") company = fields.Many2One('company.company', 'Company', required=True) posted = fields.Boolean('Posted Move', help='Only posted move') @@ -393,6 +393,12 @@ class PrintGeneralLegderInit(WizardOSV): def default_posted(self, cursor, user, context=None): return False + def on_change_fiscalyear(self, cursor, user, ids, vals, context=None): + return { + 'start_period': False, + 'end_period': False, + } + PrintGeneralLegderInit() @@ -444,7 +450,7 @@ class GeneralLegder(Report): ('company', '=', datas['form']['company']), ], order='code, id', context=context) - start_period_ids = [] + start_period_ids = [0] if datas['form']['start_period']: start_period = period_obj.browse(cursor, user, datas['form']['start_period'], context=context) @@ -452,8 +458,6 @@ class GeneralLegder(Report): ('fiscalyear', '=', datas['form']['fiscalyear']), ('end_date', '<=', start_period.start_date), ], context=context) - if not start_period_ids: - start_period_ids = [0] start_context = context.copy() start_context['fiscalyear'] = datas['form']['fiscalyear'] @@ -543,3 +547,148 @@ class GeneralLegder(Report): return res GeneralLegder() + + +class PrintTrialBalanceInit(WizardOSV): + _name = 'account.account.print_trial_balance.init' + fiscalyear = fields.Many2One('account.fiscalyear', 'Fiscal Year', + required=True, on_change=['fiscalyear']) + start_period = fields.Many2One('account.period', 'Start Period', + domain="[('fiscalyear', '=', fiscalyear), " \ + "('start_date', '<=', (end_period, 'start_date'))]") + end_period = fields.Many2One('account.period', 'End Period', + domain="[('fiscalyear', '=', fiscalyear), " \ + "('start_date', '>=', (start_period, 'start_date'))]") + company = fields.Many2One('company.company', 'Company', required=True) + posted = fields.Boolean('Posted Move', help='Only posted move') + + def default_fiscalyear(self, cursor, user, context=None): + fiscalyear_obj = self.pool.get('account.fiscalyear') + fiscalyear_id = fiscalyear_obj.find(cursor, user, exception=False, + context=context) + if fiscalyear_id: + return fiscalyear_obj.name_get(cursor, user, fiscalyear_id, + context=context)[0] + return False + + def default_company(self, cursor, user, context=None): + if context is None: + context = {} + company_obj = self.pool.get('company.company') + if context.get('company'): + return company_obj.name_get(cursor, user, context['company'], + context=context)[0] + return False + + def default_posted(self, cursor, user, context=None): + return False + + def on_change_fiscalyear(self, cursor, user, ids, vals, context=None): + return { + 'start_period': False, + 'end_period': False, + } + +PrintTrialBalanceInit() + + +class PrintTrialBalance(Wizard): + 'Print Trial Balance' + _name = 'account.account.print_trial_balance' + states = { + 'init': { + 'result': { + 'type': 'form', + 'object': 'account.account.print_trial_balance.init', + 'state': [ + ('end', 'Cancel', 'gtk-cancel'), + ('print', 'Print', 'gtk-print', True), + ], + }, + }, + 'print': { + 'result': { + 'type': 'print', + 'report': 'account.account.trial_balance', + 'state': 'end', + }, + }, + } + +PrintTrialBalance() + + +class TrialBalance(Report): + _name = 'account.account.trial_balance' + + def _get_objects(self, cursor, user, ids, model, datas, context): + return None + + def parse(self, cursor, user, content, objects, datas, context): + if context is None: + context = {} + context = context.copy() + account_obj = self.pool.get('account.account') + period_obj = self.pool.get('account.period') + company_obj = self.pool.get('company.company') + + company = company_obj.browse(cursor, user, + datas['form']['company'], context=context) + + account_ids = account_obj.search(cursor, user, [ + ('type', '!=', 'view'), + ], context=context) + + start_period_ids = [0] + if datas['form']['start_period']: + start_period = period_obj.browse(cursor, user, + datas['form']['start_period'], context=context) + start_period_ids = period_obj.search(cursor, user, [ + ('fiscalyear', '=', datas['form']['fiscalyear']), + ('end_date', '<=', start_period.start_date), + ], context=context) + + end_period_ids = [] + if datas['form']['end_period']: + end_period = period_obj.browse(cursor, user, + datas['form']['end_period'], context=context) + end_period_ids = period_obj.search(cursor, user, [ + ('fiscalyear', '=', datas['form']['fiscalyear']), + ('end_date', '<=', end_period.start_date), + ], context=context) + end_period_ids = exclude(end_period_ids, start_period_ids) + if datas['form']['end_period'] not in end_period_ids: + end_period_ids.append(datas['form']['end_period']) + else: + end_period_ids = period_obj.search(cursor, user, [ + ('fiscalyear', '=', datas['form']['fiscalyear']), + ], context=context) + end_period_ids = exclude(end_period_ids, start_period_ids) + + ctx = context.copy() + ctx['fiscalyear'] = datas['form']['fiscalyear'] + ctx['periods'] = end_period_ids + accounts = account_obj.browse(cursor, user, account_ids, + context=ctx) + + periods = period_obj.browse(cursor, user, end_period_ids, + context=context) + + context['accounts'] = accounts + context['start_period'] = periods[0] + context['end_period'] = periods[-1] + context['company'] = company + context['digits'] = company.currency.digits + context['sum'] = lambda accounts, field: self.sum(cursor, user, + accounts, field, context) + + return super(TrialBalance, self).parse(cursor, user, content, objects, + datas, context) + + def sum(self, cursor, user, accounts, field, context): + amount = Decimal('0.0') + for account in accounts: + amount += account[field] + return amount + +TrialBalance() diff --git a/account.xml b/account.xml index d363df6232..ea3cc28a6e 100644 --- a/account.xml +++ b/account.xml @@ -370,5 +370,41 @@ account.account.general_ledger account/general_ledger.odt + + + account.account.print_trial_balance.init + form + + + + + + Print Trial Balance + account.account.print_trial_balance + + + + + Trial Balance + account.account + account.account.trial_balance + account/trial_balance.odt + diff --git a/trial_balance.odt b/trial_balance.odt new file mode 100644 index 0000000000000000000000000000000000000000..5863f9da48b01992e64f10398857f6f286b9ca53 GIT binary patch literal 12378 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 literal 0 HcmV?d00001