From 2184790bdbf2e97339707dd705ec5aef380fbbc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Tue, 15 Mar 2016 18:56:51 +0100 Subject: [PATCH] New reports design issue4996 review15891002 --- CHANGELOG | 1 + __init__.py | 20 +- account.py | 1139 ++++++++--------- account.xml | 198 ++- aged_balance.odt | Bin 13229 -> 16719 bytes general_ledger.odt | Bin 18977 -> 13138 bytes move.xml | 1 + tests/scenario_reports.rst | 38 +- trial_balance.odt | Bin 37126 -> 15825 bytes ...form.xml => aged_balance_context_form.xml} | 19 +- view/aged_balance_list.xml | 11 + ...orm.xml => balance_sheet_context_form.xml} | 2 +- ...> general_ledger_account_context_form.xml} | 12 +- view/general_ledger_account_list.xml | 11 + view/general_ledger_line_context_form.xml | 9 + view/general_ledger_line_list.xml | 16 + ....xml => income_statement_context_form.xml} | 2 +- view/print_general_legder_start_form.xml | 17 - 18 files changed, 752 insertions(+), 744 deletions(-) rename view/{open_aged_balance_start_form.xml => aged_balance_context_form.xml} (72%) create mode 100644 view/aged_balance_list.xml rename view/{open_balance_sheet_start_form.xml => balance_sheet_context_form.xml} (88%) rename view/{print_trial_balance_start_form.xml => general_ledger_account_context_form.xml} (82%) create mode 100644 view/general_ledger_account_list.xml create mode 100644 view/general_ledger_line_context_form.xml create mode 100644 view/general_ledger_line_list.xml rename view/{open_income_statement_start_form.xml => income_statement_context_form.xml} (92%) delete mode 100644 view/print_general_legder_start_form.xml diff --git a/CHANGELOG b/CHANGELOG index 68df9a59d6..5a4ebc30fc 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,4 @@ +* New reports design: General Ledger, Trial Balance and Aged Balance * Add Python3 support * Merge Third Party Balance into Aged Balance * Add date to Aged Balance diff --git a/__init__.py b/__init__.py index 2a77933b59..4a3f377dd6 100644 --- a/__init__.py +++ b/__init__.py @@ -24,16 +24,19 @@ def register(): Account, AccountDeferral, OpenChartAccountStart, - PrintGeneralLedgerStart, - PrintTrialBalanceStart, - OpenBalanceSheetStart, - OpenIncomeStatementStart, + GeneralLedgerAccount, + GeneralLedgerAccountContext, + GeneralLedgerLine, + GeneralLedgerLineContext, + BalanceSheetContext, + IncomeStatementContext, CreateChartStart, CreateChartAccount, CreateChartProperties, UpdateChartStart, UpdateChartSucceed, - OpenAgedBalanceStart, + AgedBalanceContext, + AgedBalance, Configuration, Period, JournalType, @@ -80,13 +83,8 @@ def register(): BalanceNonDeferral, CloseFiscalYear, OpenChartAccount, - PrintGeneralLedger, - PrintTrialBalance, - OpenBalanceSheet, - OpenIncomeStatement, CreateChart, UpdateChart, - OpenAgedBalance, ClosePeriod, ReOpenPeriod, OpenJournalCash, @@ -106,6 +104,6 @@ def register(): Pool.register( GeneralLedger, TrialBalance, - AgedBalance, + AgedBalanceReport, GeneralJournal, module='account', type_='report') diff --git a/account.py b/account.py index e9d0bc40de..347762fc0f 100644 --- a/account.py +++ b/account.py @@ -2,33 +2,31 @@ # this repository contains the full copyright notices and license terms. from decimal import Decimal import datetime -import operator -from itertools import izip, groupby from functools import wraps -from sql import Column, Null -from sql.aggregate import Sum +from sql import Column, Null, Window, Literal +from sql.aggregate import Sum, Max from sql.conditionals import Coalesce, Case from trytond.model import ModelView, ModelSQL, fields, Unique from trytond.wizard import Wizard, StateView, StateAction, StateTransition, \ - StateReport, Button + Button from trytond.report import Report from trytond.tools import reduce_ids, grouped_slice -from trytond.pyson import Eval, PYSONEncoder, Date +from trytond.pyson import Eval, PYSONEncoder from trytond.transaction import Transaction from trytond.pool import Pool from trytond import backend __all__ = ['TypeTemplate', 'Type', 'OpenType', 'AccountTemplate', 'Account', 'AccountDeferral', 'OpenChartAccountStart', 'OpenChartAccount', - 'PrintGeneralLedgerStart', 'PrintGeneralLedger', 'GeneralLedger', - 'PrintTrialBalanceStart', 'PrintTrialBalance', 'TrialBalance', - 'OpenBalanceSheetStart', 'OpenBalanceSheet', - 'OpenIncomeStatementStart', 'OpenIncomeStatement', + 'GeneralLedgerAccount', 'GeneralLedgerAccountContext', + 'GeneralLedgerLine', 'GeneralLedgerLineContext', + 'GeneralLedger', 'TrialBalance', + 'BalanceSheetContext', 'IncomeStatementContext', + 'AgedBalanceContext', 'AgedBalance', 'AgedBalanceReport', 'CreateChartStart', 'CreateChartAccount', 'CreateChartProperties', - 'CreateChart', 'UpdateChartStart', 'UpdateChartSucceed', 'UpdateChart', - 'OpenAgedBalanceStart', 'OpenAgedBalance', 'AgedBalance'] + 'CreateChart', 'UpdateChartStart', 'UpdateChartSucceed', 'UpdateChart'] def inactive_records(func): @@ -1000,9 +998,129 @@ class OpenChartAccount(Wizard): return 'end' -class PrintGeneralLedgerStart(ModelView): - 'Print General Ledger' - __name__ = 'account.print_general_ledger.start' +class GeneralLedgerAccount(ModelSQL, ModelView): + 'General Ledger Account' + __name__ = 'account.general_ledger.account' + + # TODO reuse rec_name of Account + name = fields.Char('Name') + code = fields.Char('Code') + active = fields.Boolean('Active') + company = fields.Many2One('company.company', 'Company') + start_debit = fields.Function(fields.Numeric('Start Debit', + digits=(16, Eval('currency_digits', 2)), + depends=['currency_digits']), 'get_account') + debit = fields.Function(fields.Numeric('Debit', + digits=(16, Eval('currency_digits', 2)), + depends=['currency_digits']), 'get_debit_credit') + end_debit = fields.Function(fields.Numeric('End Debit', + digits=(16, Eval('currency_digits', 2)), + depends=['currency_digits']), 'get_account') + start_credit = fields.Function(fields.Numeric('Start Credit', + digits=(16, Eval('currency_digits', 2)), + depends=['currency_digits']), 'get_account') + credit = fields.Function(fields.Numeric('Credit', + digits=(16, Eval('currency_digits', 2)), + depends=['currency_digits']), 'get_debit_credit') + end_credit = fields.Function(fields.Numeric('End Credit', + digits=(16, Eval('currency_digits', 2)), + depends=['currency_digits']), 'get_account') + start_balance = fields.Function(fields.Numeric('Start Balance', + digits=(16, Eval('currency_digits', 2)), + depends=['currency_digits']), 'get_account') + end_balance = fields.Function(fields.Numeric('End Balance', + digits=(16, Eval('currency_digits', 2)), + depends=['currency_digits']), 'get_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')) + + @classmethod + def table_query(cls): + pool = Pool() + context = Transaction().context + Account = pool.get('account.account') + account = Account.__table__() + columns = [] + for fname, field in cls._fields.iteritems(): + if not hasattr(field, 'set'): + columns.append(Column(account, fname).as_(fname)) + return account.select(*columns, + where=(account.company == context.get('company')) + & (account.kind != 'view')) + + @classmethod + def get_period_ids(cls, name): + pool = Pool() + Period = pool.get('account.period') + context = Transaction().context + + period = None + if name.startswith('start_'): + period_ids = [0] + if context.get('start_period'): + period = Period(context['start_period']) + elif name.startswith('end_'): + period_ids = [] + if context.get('end_period'): + period = Period(context['end_period']) + + if period: + periods = Period.search([ + ('fiscalyear', '=', context.get('fiscalyear')), + ('end_date', '<=', period.start_date), + ]) + if periods: + period_ids = [p.id for p in periods] + return period_ids + + @classmethod + def get_account(cls, records, name): + pool = Pool() + Account = pool.get('account.account') + + period_ids = cls.get_period_ids(name) + with Transaction().set_context(periods=period_ids): + accounts = Account.browse(records) + fname = name + for test in ['start_', 'end_']: + if name.startswith(test): + fname = name[len(test):] + break + return {a.id: getattr(a, fname) for a in accounts} + + @classmethod + def get_debit_credit(cls, records, name): + pool = Pool() + Account = pool.get('account.account') + + start_period_ids = cls.get_period_ids('start_%s' % name) + end_period_ids = cls.get_period_ids('end_%s' % name) + periods_ids = list( + set(end_period_ids).difference(set(start_period_ids))) + with Transaction().set_context(periods=periods_ids): + accounts = Account.browse(records) + return {a.id: getattr(a, name) for a in accounts} + + def get_currency_digits(self, name): + return self.company.currency.digits + + def get_rec_name(self, name): + # TODO add start/end balance + return self.name + + +class GeneralLedgerAccountContext(ModelView): + 'General Ledger Account Context' + __name__ = 'account.general_ledger.account.context' fiscalyear = fields.Many2One('account.fiscalyear', 'Fiscal Year', required=True) start_period = fields.Many2One('account.period', 'Start Period', @@ -1018,64 +1136,145 @@ class PrintGeneralLedgerStart(ModelView): depends=['fiscalyear', 'start_period']) company = fields.Many2One('company.company', 'Company', required=True) posted = fields.Boolean('Posted Move', help='Show only posted move') - empty_account = fields.Boolean('Empty Account', - help='With account without move') - @staticmethod - def default_fiscalyear(): - FiscalYear = Pool().get('account.fiscalyear') - return FiscalYear.find( - Transaction().context.get('company'), exception=False) + @classmethod + def default_fiscalyear(cls): + pool = Pool() + FiscalYear = pool.get('account.fiscalyear') + context = Transaction().context + return context.get( + 'fiscalyear', + FiscalYear.find(context.get('company'), exception=False)) - @staticmethod - def default_company(): + @classmethod + def default_start_period(cls): + return Transaction().context.get('start_period') + + @classmethod + def default_end_period(cls): + return Transaction().context.get('end_period') + + @classmethod + def default_company(cls): return Transaction().context.get('company') - @staticmethod - def default_posted(): - return False + @classmethod + def default_posted(cls): + return Transaction().context.get('posted', False) - @staticmethod - def default_empty_account(): - return False - - @fields.depends('fiscalyear') + @fields.depends('fiscalyear', 'start_period', 'end_period') def on_change_fiscalyear(self): - self.start_period = None - self.end_period = None + if (self.start_period + and self.start_period.fiscalyear != self.fiscalyear): + self.start_period = None + if (self.end_period + and self.end_period.fiscalyear != self.fiscalyear): + self.end_period = None -class PrintGeneralLedger(Wizard): - 'Print General Ledger' - __name__ = 'account.print_general_ledger' - start = StateView('account.print_general_ledger.start', - 'account.print_general_ledger_start_view_form', [ - Button('Cancel', 'end', 'tryton-cancel'), - Button('Print', 'print_', 'tryton-print', default=True), - ]) - print_ = StateReport('account.general_ledger') +class GeneralLedgerLine(ModelSQL, ModelView): + 'General Ledger Line' + __name__ = 'account.general_ledger.line' - def do_print_(self, action): - if self.start.start_period: - start_period = self.start.start_period.id - else: - start_period = None - if self.start.end_period: - end_period = self.start.end_period.id - else: - end_period = None - data = { - 'company': self.start.company.id, - 'fiscalyear': self.start.fiscalyear.id, - 'start_period': start_period, - 'end_period': end_period, - 'posted': self.start.posted, - 'empty_account': self.start.empty_account, - } - return action, data + move = fields.Many2One('account.move', 'Move') + date = fields.Date('Date') + account = fields.Many2One('account.general_ledger.account', 'Account') + party = fields.Many2One('party.party', 'Party', + states={ + 'invisible': ~Eval('party_required', False), + }, + depends=['party_required']) + party_required = fields.Function(fields.Boolean('Party Required'), + 'get_party_required') + company = fields.Many2One('company.company', 'Company') + debit = fields.Numeric('Debit', + digits=(16, Eval('currency_digits', 2)), + depends=['currency_digits']) + credit = fields.Numeric('Credit', + digits=(16, Eval('currency_digits', 2)), + depends=['currency_digits']) + balance = fields.Numeric('Balance', + digits=(16, Eval('currency_digits', 2)), + depends=['currency_digits']) + origin = fields.Reference('Origin', selection='get_origin') + description = fields.Char('Description') + move_description = fields.Char('Move Description') + state = fields.Selection([ + ('draft', 'Draft'), + ('posted', 'Posted'), + ], 'State') + state_string = state.translated('state') + currency_digits = fields.Function(fields.Integer('Currency Digits'), + 'get_currency_digits') - def transition_print_(self): - return 'end' + @classmethod + def __setup__(cls): + super(GeneralLedgerLine, cls).__setup__() + cls._order.insert(0, ('date', 'ASC')) + + @classmethod + def table_query(cls): + pool = Pool() + Line = pool.get('account.move.line') + Move = pool.get('account.move') + Account = pool.get('account.general_ledger.account') + context = Transaction().context + line = Line.__table__() + move = Move.__table__() + columns = [] + for fname, field in cls._fields.iteritems(): + if hasattr(field, 'set'): + continue + field_line = getattr(Line, fname, None) + if fname == 'balance': + # TODO replace the test by a generic one on backend + if backend.name() == 'postgresql': + 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') + else: + column = (line.debit - line.credit).as_('balance') + elif fname == 'move_description': + column = Column(move, 'description').as_(fname) + elif (not field_line + or fname == 'state' + or isinstance(field_line, fields.Function)): + column = Column(move, fname).as_(fname) + else: + column = Column(line, fname).as_(fname) + columns.append(column) + start_period_ids = set(Account.get_period_ids('start_balance')) + end_period_ids = set(Account.get_period_ids('end_balance')) + period_ids = list(end_period_ids.difference(start_period_ids)) + with Transaction().set_context(periods=period_ids): + line_query, fiscalyear_ids = Line.query_get(line) + return line.join(move, condition=line.move == move.id + ).select(*columns, where=line_query) + + def get_party_required(self, name): + return self.account.party_required + + def get_currency_digits(self, name): + return self.company.currency.digits + + @classmethod + def get_origin(cls): + Line = Pool().get('account.move.line') + return Line.get_origin() + + +class GeneralLedgerLineContext(GeneralLedgerAccountContext): + 'General Ledger Line Context' + __name__ = 'account.general_ledger.line.context' + + party_cumulate = fields.Boolean('Cumulate per Party') + + @classmethod + def default_party_cumulate(cls): + return False class GeneralLedger(Report): @@ -1083,326 +1282,61 @@ class GeneralLedger(Report): @classmethod def get_context(cls, records, data): + pool = Pool() + Company = pool.get('company.company') + Fiscalyear = pool.get('account.fiscalyear') + Period = pool.get('account.period') + context = Transaction().context + report_context = super(GeneralLedger, cls).get_context(records, data) - pool = Pool() - Account = pool.get('account.account') - Period = pool.get('account.period') - Company = pool.get('company.company') + report_context['company'] = Company(context['company']) + report_context['fiscalyear'] = Fiscalyear(context['fiscalyear']) - company = Company(data['company']) - - accounts = Account.search([ - ('company', '=', data['company']), - ('kind', '!=', 'view'), - ], order=[('code', 'ASC'), ('id', 'ASC')]) - - start_period_ids = [0] - start_periods = [] - if data['start_period']: - start_period = Period(data['start_period']) - start_periods = Period.search([ - ('fiscalyear', '=', data['fiscalyear']), - ('end_date', '<=', start_period.start_date), - ]) - start_period_ids += [p.id for p in start_periods] - else: - start_period = None - - with Transaction().set_context( - fiscalyear=data['fiscalyear'], - periods=start_period_ids, - posted=data['posted']): - start_accounts = Account.browse(accounts) - id2start_account = {} - for account in start_accounts: - id2start_account[account.id] = account - - end_period_ids = [] - if data['end_period']: - end_period = Period(data['end_period']) - end_periods = Period.search([ - ('fiscalyear', '=', data['fiscalyear']), - ('end_date', '<=', end_period.start_date), - ]) - if end_period not in end_periods: - end_periods.append(end_period) - else: - end_periods = Period.search([ - ('fiscalyear', '=', data['fiscalyear']), - ]) - end_period = None - end_period_ids = [p.id for p in end_periods] - - with Transaction().set_context( - fiscalyear=data['fiscalyear'], - periods=end_period_ids, - posted=data['posted']): - end_accounts = Account.browse(accounts) - id2end_account = {} - for account in end_accounts: - id2end_account[account.id] = account - - if not data['empty_account']: - account2lines = dict(cls.get_lines(accounts, - end_periods, data['posted'])) - accounts = Account.browse([a.id for a in accounts - if a in account2lines]) - - account_id2lines = cls.lines( - [a for a in accounts if not a.general_ledger_balance], - list(set(end_periods).difference(set(start_periods))), - data['posted']) - - report_context['accounts'] = accounts - report_context['id2start_account'] = id2start_account - report_context['id2end_account'] = id2end_account - report_context['digits'] = company.currency.digits - report_context['lines'] = \ - lambda account_id: account_id2lines[account_id] - report_context['company'] = company - report_context['start_period'] = start_period - report_context['end_period'] = end_period + for period in ['start_period', 'end_period']: + if context.get(period): + report_context[period] = Period(context[period]) + else: + report_context[period] = None + report_context['accounts'] = records return report_context - @classmethod - def get_lines(cls, accounts, periods, posted): - MoveLine = Pool().get('account.move.line') - clause = [ - ('account', 'in', [a.id for a in accounts]), - ('period', 'in', [p.id for p in periods]), - ('state', '!=', 'draft'), - ] - if posted: - clause.append(('move.state', '=', 'posted')) - lines = MoveLine.search(clause, - order=[ - ('account.id', 'ASC'), - ('date', 'ASC'), - ]) - return groupby(lines, operator.attrgetter('account')) - - @classmethod - def lines(cls, accounts, periods, posted): - Move = Pool().get('account.move') - res = dict((a.id, []) for a in accounts) - account2lines = cls.get_lines(accounts, periods, posted) - - state_selections = dict(Move.fields_get( - fields_names=['state'])['state']['selection']) - - for account, lines in account2lines: - balance = Decimal('0.0') - for line in lines: - balance += line.debit - line.credit - res[account.id].append({ - 'date': line.date, - 'move': line.move.rec_name, - 'debit': line.debit, - 'credit': line.credit, - 'balance': balance, - 'description': '\n'.join( - (line.move.description or '', - line.description or '')).strip(), - 'origin': (line.move.origin.rec_name - if line.move.origin else ''), - 'state': state_selections.get(line.move.state, - line.move.state), - }) - return res - - -class PrintTrialBalanceStart(ModelView): - 'Print Trial Balance' - __name__ = 'account.print_trial_balance.start' - fiscalyear = fields.Many2One('account.fiscalyear', 'Fiscal Year', - required=True) - start_period = fields.Many2One('account.period', 'Start Period', - domain=[ - ('fiscalyear', '=', Eval('fiscalyear')), - ('start_date', '<=', (Eval('end_period'), 'start_date')) - ], - depends=['end_period', 'fiscalyear']) - end_period = fields.Many2One('account.period', 'End Period', - domain=[ - ('fiscalyear', '=', Eval('fiscalyear')), - ('start_date', '>=', (Eval('start_period'), 'start_date')) - ], - depends=['start_period', 'fiscalyear']) - company = fields.Many2One('company.company', 'Company', required=True) - posted = fields.Boolean('Posted Move', help='Show only posted move') - empty_account = fields.Boolean('Empty Account', - help='With account without move') - - @staticmethod - def default_fiscalyear(): - FiscalYear = Pool().get('account.fiscalyear') - return FiscalYear.find( - Transaction().context.get('company'), exception=False) - - @staticmethod - def default_company(): - return Transaction().context.get('company') - - @staticmethod - def default_posted(): - return False - - @staticmethod - def default_empty_account(): - return False - - @fields.depends('fiscalyear') - def on_change_fiscalyear(self): - self.start_period = None - self.end_period = None - - -class PrintTrialBalance(Wizard): - 'Print Trial Balance' - __name__ = 'account.print_trial_balance' - start = StateView('account.print_trial_balance.start', - 'account.print_trial_balance_start_view_form', [ - Button('Cancel', 'end', 'tryton-cancel'), - Button('Print', 'print_', 'tryton-print', default=True), - ]) - print_ = StateReport('account.trial_balance') - - def do_print_(self, action): - if self.start.start_period: - start_period = self.start.start_period.id - else: - start_period = None - if self.start.end_period: - end_period = self.start.end_period.id - else: - end_period = None - data = { - 'company': self.start.company.id, - 'fiscalyear': self.start.fiscalyear.id, - 'start_period': start_period, - 'end_period': end_period, - 'posted': self.start.posted, - 'empty_account': self.start.empty_account, - } - return action, data - - def transition_print_(self): - return 'end' - class TrialBalance(Report): __name__ = 'account.trial_balance' @classmethod def get_context(cls, records, data): + pool = Pool() + Company = pool.get('company.company') + Fiscalyear = pool.get('account.fiscalyear') + Period = pool.get('account.period') + context = Transaction().context + report_context = super(TrialBalance, cls).get_context(records, data) - pool = Pool() - Account = pool.get('account.account') - Period = pool.get('account.period') - Company = pool.get('company.company') + report_context['company'] = Company(context['company']) + report_context['fiscalyear'] = Fiscalyear(context['fiscalyear']) - company = Company(data['company']) - - accounts = Account.search([ - ('company', '=', data['company']), - ('kind', '!=', 'view'), - ]) - - start_periods = [] - if data['start_period']: - start_period = Period(data['start_period']) - start_periods = Period.search([ - ('fiscalyear', '=', data['fiscalyear']), - ('end_date', '<=', start_period.start_date), - ]) - - if data['end_period']: - end_period = Period(data['end_period']) - end_periods = Period.search([ - ('fiscalyear', '=', data['fiscalyear']), - ('end_date', '<=', end_period.start_date), - ]) - end_periods = list(set(end_periods).difference( - set(start_periods))) - if end_period not in end_periods: - end_periods.append(end_period) - else: - end_periods = Period.search([ - ('fiscalyear', '=', data['fiscalyear']), - ]) - end_periods = list(set(end_periods).difference( - set(start_periods))) - - start_period_ids = [p.id for p in start_periods] or [0] - end_period_ids = [p.id for p in end_periods] - - with Transaction().set_context( - fiscalyear=data['fiscalyear'], - periods=start_period_ids, - posted=data['posted']): - start_accounts = Account.browse(accounts) - - with Transaction().set_context( - fiscalyear=None, - periods=end_period_ids, - posted=data['posted']): - in_accounts = Account.browse(accounts) - - with Transaction().set_context( - fiscalyear=data['fiscalyear'], - periods=start_period_ids + end_period_ids, - posted=data['posted']): - end_accounts = Account.browse(accounts) - - to_remove = set() - if not data['empty_account']: - for account in in_accounts: - if account.debit == Decimal('0.0') \ - and account.credit == Decimal('0.0'): - to_remove.add(account) - - accounts = [] - for start_account, in_account, end_account in izip( - start_accounts, in_accounts, end_accounts): - if in_account in to_remove: - continue - accounts.append({ - 'code': start_account.code, - 'name': start_account.name, - 'start_balance': start_account.balance, - 'debit': in_account.debit, - 'credit': in_account.credit, - 'end_balance': end_account.balance, - }) - - periods = end_periods - - report_context['accounts'] = accounts - periods.sort(key=operator.attrgetter('start_date')) - report_context['start_period'] = periods[0] - periods.sort(key=operator.attrgetter('end_date')) - report_context['end_period'] = periods[-1] - report_context['company'] = company - report_context['digits'] = company.currency.digits - report_context['sum'] = \ - lambda accounts, field: cls.sum(accounts, field) + for period in ['start_period', 'end_period']: + if context.get(period): + report_context[period] = Period(context[period]) + else: + report_context[period] = None + report_context['accounts'] = records + report_context['sum'] = cls.sum return report_context @classmethod def sum(cls, accounts, field): - amount = Decimal('0.0') - for account in accounts: - amount += account[field] - return amount + return sum((getattr(a, field) for a in accounts), Decimal('0')) -class OpenBalanceSheetStart(ModelView): - 'Open Balance Sheet' - __name__ = 'account.open_balance_sheet.start' +class BalanceSheetContext(ModelView): + 'Balance Sheet Context' + __name__ = 'account.balance_sheet.context' date = fields.Date('Date', required=True) company = fields.Many2One('company.company', 'Company', required=True) posted = fields.Boolean('Posted Move', help='Show only posted move') @@ -1421,45 +1355,9 @@ class OpenBalanceSheetStart(ModelView): return False -class OpenBalanceSheet(Wizard): - 'Open Balance Sheet' - __name__ = 'account.open_balance_sheet' - start = StateView('account.open_balance_sheet.start', - 'account.open_balance_sheet_start_view_form', [ - Button('Cancel', 'end', 'tryton-cancel'), - Button('Open', 'open_', 'tryton-ok', default=True), - ]) - open_ = StateAction('account.act_account_balance_sheet_tree') - - def do_open_(self, action): - pool = Pool() - Lang = pool.get('ir.lang') - - company = self.start.company - lang, = Lang.search([ - ('code', '=', Transaction().language), - ]) - - date = Lang.strftime(self.start.date, lang.code, lang.date) - - action['pyson_context'] = PYSONEncoder().encode({ - 'date': Date(self.start.date.year, - self.start.date.month, - self.start.date.day), - 'posted': self.start.posted, - 'company': company.id, - 'cumulate': True, - }) - action['name'] += ' %s - %s' % (date, company.rec_name) - return action, {} - - def transition_open_(self): - return 'end' - - -class OpenIncomeStatementStart(ModelView): - 'Open Income Statement' - __name__ = 'account.open_income_statement.start' +class IncomeStatementContext(ModelView): + 'Income Statement Context' + __name__ = 'account.income_statement.context' fiscalyear = fields.Many2One('account.fiscalyear', 'Fiscal Year', required=True) start_period = fields.Many2One('account.period', 'Start Period', @@ -1497,50 +1395,224 @@ class OpenIncomeStatementStart(ModelView): self.end_period = None -class OpenIncomeStatement(Wizard): - 'Open Income Statement' - __name__ = 'account.open_income_statement' - start = StateView('account.open_income_statement.start', - 'account.open_income_statement_start_view_form', [ - Button('Cancel', 'end', 'tryton-cancel'), - Button('Open', 'open_', 'tryton-ok', default=True), - ]) - open_ = StateAction('account.act_account_income_statement_tree') +class AgedBalanceContext(ModelView): + 'Aged Balance Context' + __name__ = 'account.aged_balance.context' + type = fields.Selection([ + ('customer', 'Customers'), + ('supplier', 'Suppliers'), + ('customer_supplier', 'Customers and Suppliers'), + ], + "Type", required=True) + date = fields.Date('Date', required=True) + term1 = fields.Integer("First Term", required=True) + term2 = fields.Integer("Second Term", required=True, + domain=[ + ('term2', '>', Eval('term1', 0)), + ], + depends=['term1']) + term3 = fields.Integer("Third Term", required=True, + domain=[ + ('term3', '>', Eval('term2', 0)), + ], + depends=['term2']) + unit = fields.Selection([ + ('day', 'Days'), + ('month', 'Months'), + ], "Unit", required=True) + company = fields.Many2One('company.company', 'Company', required=True) + posted = fields.Boolean('Posted Move', help='Show only posted move') - def do_open_(self, action): + @classmethod + def default_type(cls): + return 'customer' + + @classmethod + def default_posted(cls): + return False + + @classmethod + def default_date(cls): + return Pool().get('ir.date').today() + + @staticmethod + def default_term1(): + return 30 + + @staticmethod + def default_term2(): + return 60 + + @staticmethod + def default_term3(): + return 90 + + @staticmethod + def default_unit(): + return 'day' + + @staticmethod + def default_company(): + return Transaction().context.get('company') + + +class AgedBalance(ModelSQL, ModelView): + 'Aged Balance' + __name__ = 'account.aged_balance' + + party = fields.Many2One('party.party', 'Party') + company = fields.Many2One('company.company', 'Company') + term0 = fields.Numeric('Now', + digits=(16, Eval('currency_digits', 2)), + depends=['currency_digits']) + term1 = fields.Numeric('First Term', + digits=(16, Eval('currency_digits', 2)), + depends=['currency_digits']) + term2 = fields.Numeric('Second Term', + digits=(16, Eval('currency_digits', 2)), + depends=['currency_digits']) + term3 = fields.Numeric('Third Term', + digits=(16, Eval('currency_digits', 2)), + depends=['currency_digits']) + balance = fields.Numeric('Balance', + digits=(16, Eval('currency_digits', 2)), + depends=['currency_digits']) + currency_digits = fields.Function(fields.Integer('Currency Digits'), + 'get_currency_digits') + + @classmethod + def __setup__(cls): + super(AgedBalance, cls).__setup__() + cls._order.insert(0, ('party', 'ASC')) + + @classmethod + def table_query(cls): pool = Pool() - Period = pool.get('account.period') + context = Transaction().context + MoveLine = pool.get('account.move.line') + Move = pool.get('account.move') + Reconciliation = pool.get('account.move.reconciliation') + Account = pool.get('account.account') - start_periods = [] - if self.start.start_period: - start_periods = Period.search([ - ('fiscalyear', '=', self.start.fiscalyear.id), - ('end_date', '<=', self.start.start_period.start_date), - ]) + line = MoveLine.__table__() + move = Move.__table__() + reconciliation = Reconciliation.__table__() + account = Account.__table__() - end_periods = [] - if self.start.end_period: - end_periods = Period.search([ - ('fiscalyear', '=', self.start.fiscalyear.id), - ('end_date', '<=', self.start.end_period.start_date), - ]) - end_periods = list(set(end_periods).difference( - set(start_periods))) - if self.start.end_period not in end_periods: - end_periods.append(self.start.end_period) + company_id = context.get('company') + date = context.get('date') + with Transaction().set_context(date=None): + line_query, _ = MoveLine.query_get(line) + kind = cls.get_kind() + columns = [ + line.party.as_('id'), + Literal(0).as_('create_uid'), + Max(line.create_date).as_('create_date'), + Literal(0).as_('write_uid'), + Max(line.write_date).as_('write_date'), + line.party.as_('party'), + move.company.as_('company'), + (Sum(line.debit) - Sum(line.credit)).as_('balance'), + ] + + terms = cls.get_terms() + factor = cls.get_unit_factor() + term_values = sorted(terms.values()) + + for name, value in terms.iteritems(): + if value is None or factor is None or date is None: + columns.append(Literal(None).as_(name)) + continue + cond = line.maturity_date <= (date - value * factor) + idx = term_values.index(value) + if idx + 1 < len(terms): + cond &= line.maturity_date > ( + date - term_values[idx + 1] * factor) + else: + cond |= line.maturity_date == Null + columns.append( + Sum(Case((cond, line.debit - line.credit), else_=0)).as_(name)) + + return line.join(move, condition=line.move == move.id + ).join(account, condition=line.account == account.id + ).join(reconciliation, 'LEFT', + condition=reconciliation.id == line.reconciliation + ).select(*columns, + where=(line.party != Null) + & (account.active == True) + & account.kind.in_(kind) + & ((line.reconciliation == Null) + | (reconciliation.date > date)) + & (move.date <= date) + & (account.company == company_id) + & line_query, + group_by=(line.party, move.company)) + + @classmethod + def get_terms(cls): + context = Transaction().context + return { + 'term0': 0, + 'term1': context.get('term1'), + 'term2': context.get('term2'), + 'term3': context.get('term3'), + } + + @classmethod + def get_unit_factor(cls): + context = Transaction().context + unit = context.get('unit', 'day') + if unit == 'month': + return datetime.timedelta(days=30) + elif unit == 'day': + return datetime.timedelta(days=1) + + @classmethod + def get_kind(cls): + context = Transaction().context + type_ = context.get('type', 'customer') + if type_ == 'customer_supplier': + return ['payable', 'receivable'] + elif type_ == 'supplier': + return ['payable'] + elif type_ == 'customer': + return ['receivable'] else: - end_periods = Period.search([ - ('fiscalyear', '=', self.start.fiscalyear.id), - ]) - end_periods = list(set(end_periods).difference( - set(start_periods))) + return [] - action['pyson_context'] = PYSONEncoder().encode({ - 'periods': [p.id for p in end_periods], - 'posted': self.start.posted, - 'company': self.start.company.id, - }) - return action, {} + def get_currency_digits(self, name): + return self.company.currency.digits + + +class AgedBalanceReport(Report): + __name__ = 'account.aged_balance' + + @classmethod + def get_context(cls, records, data): + pool = Pool() + Company = pool.get('company.company') + Context = pool.get('account.aged_balance.context') + AgedBalance = pool.get('account.aged_balance') + context = Transaction().context + + report_context = super(AgedBalanceReport, cls).get_context( + records, data) + + context_fields = Context.fields_get(['type', 'unit']) + + report_context['company'] = Company(context['company']) + report_context['date'] = context['date'] + report_context['type'] = dict( + context_fields['type']['selection'])[context['type']] + report_context['unit'] = dict( + context_fields['unit']['selection'])[context['unit']] + report_context.update(AgedBalance.get_terms()) + report_context['sum'] = cls.sum + return report_context + + @classmethod + def sum(cls, records, field): + return sum((getattr(r, field) for r in records), Decimal('0')) class CreateChartStart(ModelView): @@ -1851,194 +1923,3 @@ class UpdateChart(Wizard): tax_rule_line_template.create_rule_line(template2tax, template2rule, template2rule_line=template2rule_line) return 'succeed' - - -class OpenAgedBalanceStart(ModelView): - 'Open Aged Balance' - __name__ = 'account.open_aged_balance.start' - company = fields.Many2One('company.company', 'Company', required=True) - balance_type = fields.Selection( - [('customer', 'Customer'), ('supplier', 'Supplier'), ('both', 'Both')], - "Type", required=True) - date = fields.Date('Date', required=True) - term1 = fields.Integer("First Term", required=True) - term2 = fields.Integer("Second Term", required=True, - domain=[ - ('term2', '>', Eval('term1', 0)), - ], - depends=['term1']) - term3 = fields.Integer("Third Term", required=True, - domain=[ - ('term3', '>', Eval('term2', 0)), - ], - depends=['term2']) - unit = fields.Selection( - [('day', 'Day'), ('month', 'Month')], "Unit", required=True) - posted = fields.Boolean('Posted Move', help='Show only posted move') - - @staticmethod - def default_balance_type(): - return "customer" - - @staticmethod - def default_posted(): - return False - - @classmethod - def default_date(cls): - return Pool().get('ir.date').today() - - @staticmethod - def default_term1(): - return 30 - - @staticmethod - def default_term2(): - return 60 - - @staticmethod - def default_term3(): - return 90 - - @staticmethod - def default_unit(): - return 'day' - - @staticmethod - def default_company(): - return Transaction().context.get('company') - - -class OpenAgedBalance(Wizard): - 'Open Aged Party Balance' - __name__ = 'account.open_aged_balance' - start = StateView('account.open_aged_balance.start', - 'account.open_aged_balance_start_view_form', [ - Button('Cancel', 'end', 'tryton-cancel'), - Button('Print', 'print_', 'tryton-print', default=True), - ]) - print_ = StateReport('account.aged_balance') - - @classmethod - def __setup__(cls): - super(OpenAgedBalance, cls).__setup__() - cls._error_messages.update({ - 'warning': 'Warning', - 'term_overlap_desc': 'You cannot define overlapping terms', - }) - - def do_print_(self, action): - if not (self.start.term1 < self.start.term2 < self.start.term3): - self.raise_user_error(error="warning", - error_description="term_overlap_desc") - data = { - 'company': self.start.company.id, - 'date': self.start.date, - 'term1': self.start.term1, - 'term2': self.start.term2, - 'term3': self.start.term3, - 'unit': self.start.unit, - 'posted': self.start.posted, - 'balance_type': self.start.balance_type, - } - return action, data - - def transition_print_(self): - return 'end' - - -class AgedBalance(Report): - __name__ = 'account.aged_balance' - - @classmethod - def get_context(cls, records, data): - report_context = super(AgedBalance, cls).get_context(records, data) - - pool = Pool() - Party = pool.get('party.party') - MoveLine = pool.get('account.move.line') - Move = pool.get('account.move') - Reconciliation = pool.get('account.move.reconciliation') - Account = pool.get('account.account') - Company = pool.get('company.company') - cursor = Transaction().connection.cursor() - - line = MoveLine.__table__() - move = Move.__table__() - reconciliation = Reconciliation.__table__() - account = Account.__table__() - - company = Company(data['company']) - report_context['digits'] = company.currency.digits - report_context['posted'] = data['posted'] - with Transaction().set_context(context=report_context): - line_query, _ = MoveLine.query_get(line) - - terms = (0, data['term1'], data['term2'], data['term3']) - if data['unit'] == 'month': - coef = datetime.timedelta(days=30) - else: - coef = datetime.timedelta(days=1) - - kind = { - 'both': ('payable', 'receivable'), - 'supplier': ('payable',), - 'customer': ('receivable',), - }[data['balance_type']] - - report_context['date'] = date = data['date'] - res = {} - for position, term in enumerate(terms): - term_query = line.maturity_date <= (date - term * coef) - if position + 1 < len(terms): - term_query &= line.maturity_date > ( - date - terms[position + 1] * coef) - else: - term_query |= line.maturity_date == Null - - cursor.execute(*line.join(move, condition=line.move == move.id - ).join(account, condition=line.account == account.id - ).join(reconciliation, 'LEFT', - condition=reconciliation.id == line.reconciliation - ).select(line.party, Sum(line.debit) - Sum(line.credit), - where=(line.party != Null) - & (account.active == True) - & account.kind.in_(kind) - & ((line.reconciliation == Null) - | (reconciliation.date > date)) - & (move.date <= date) - & (account.company == data['company']) - & term_query & line_query, - group_by=line.party, - having=(Sum(line.debit) - Sum(line.credit)) != 0)) - for party, solde in cursor.fetchall(): - if party in res: - res[party][position] = solde - else: - res[party] = [(i[0] == position) and solde - or Decimal("0.0") for i in enumerate(terms)] - parties = Party.search([ - ('id', 'in', [k for k in res.iterkeys()]), - ]) - - report_context['main_title'] = data['balance_type'] - report_context['unit'] = data['unit'] - total = 0 - for i in range(len(terms)): - report_context['total' + str(i)] = sum( - (v[i] for v in res.itervalues())) - total += report_context['total' + str(i)] - report_context['term' + str(i)] = terms[i] - report_context['total'] = total - - report_context['company'] = company - report_context['parties'] = [{ - 'name': p.rec_name, - 'balance': sum(res[p.id]), - 'amount0': res[p.id][0], - 'amount1': res[p.id][1], - 'amount2': res[p.id][2], - 'amount3': res[p.id][3], - } for p in parties] - - return report_context diff --git a/account.xml b/account.xml index dff06932d4..d838e22d35 100644 --- a/account.xml +++ b/account.xml @@ -417,50 +417,118 @@ this repository contains the full copyright notices and license terms. --> open_chart_start_form - - account.print_general_ledger.start - form - print_general_legder_start_form - - - - Print General Legder - account.print_general_ledger - - - General Ledger - + account.general_ledger.account account.general_ledger account/general_ledger.odt - - - account.print_trial_balance.start - form - print_trial_balance_start_form + + form_print + account.general_ledger.account,-1 + - - Print Trial Balance - account.print_trial_balance - - - Trial Balance - + account.general_ledger.account account.trial_balance account/trial_balance.odt + + form_print + account.general_ledger.account,-1 + + - - account.open_balance_sheet.start + + account.general_ledger.account + tree + general_ledger_account_list + + + + General Ledger - Accounts + account.general_ledger.account + account.general_ledger.account.context + + + + + + + + + + + + + + + + + + + + + + + + + + account.general_ledger.line + tree + general_ledger_line_list + + + + General Ledger - Lines + account.general_ledger.line + account.general_ledger.line.context + + + + + + + + + tree_open + account.general_ledger.account,-1 + + + + + + + + + + + + + + + + + + + + + + account.general_ledger.account.context form - open_balance_sheet_start_form + general_ledger_account_context_form + + + + account.general_ledger.line.context + + general_ledger_line_context_form @@ -472,9 +540,11 @@ this repository contains the full copyright notices and license terms. --> Balance Sheet account.account.type + account.balance_sheet.context + @@ -482,18 +552,13 @@ this repository contains the full copyright notices and license terms. --> - - Open Balance Sheet - account.open_balance_sheet - - + - - account.open_income_statement.start + + account.balance_sheet.context form - open_income_statement_start_form + balance_sheet_context_form @@ -505,6 +570,7 @@ this repository contains the full copyright notices and license terms. --> Income Statement account.account.type + account.income_statement.context @@ -515,31 +581,49 @@ this repository contains the full copyright notices and license terms. --> - - Open Income Statement - account.open_income_statement - - + - - account.open_aged_balance.start + + account.income_statement.context form - open_aged_balance_start_form + income_statement_context_form + + + + account.aged_balance + tree + aged_balance_list + + + Aged Balance + account.aged_balance + account.aged_balance.context + + + + + + + + + + + account.aged_balance.context + form + aged_balance_context_form Aged Balance - + account.aged_balance account.aged_balance account/aged_balance.odt - - Open Aged Balance - account.open_aged_balance + + form_print + account.aged_balance,-1 + - diff --git a/aged_balance.odt b/aged_balance.odt index c0ca768e1d9fb79acb1d157dab44d0a5996d9a92..82b91286a663d30cfa89af5cd7b587da149fad55 100644 GIT binary patch literal 16719 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 YSqbnDulvW}CVaeXKlo?x>+jnC0Y1Kz6#xJL literal 13229 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 diff --git a/general_ledger.odt b/general_ledger.odt index de55c2f4037ef34167390842a6262cb7af403446..8b85b84d6da3f3369c72b14db29da120e58d64aa 100644 GIT binary patch delta 11259 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 literal 18977 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 account.move.line,-1 + Unreconcile Lines diff --git a/tests/scenario_reports.rst b/tests/scenario_reports.rst index 01ee57ec9f..5deff0f5c6 100644 --- a/tests/scenario_reports.rst +++ b/tests/scenario_reports.rst @@ -79,18 +79,36 @@ Create a moves:: Print some reports:: - >>> print_general_ledger = Wizard('account.print_general_ledger') - >>> print_general_ledger.form.start_period = None - >>> print_general_ledger.form.end_period = None - >>> print_general_ledger.execute('print_') + >>> GeneralLedgerAccount = Model.get('account.general_ledger.account') + >>> gl_accounts = GeneralLedgerAccount.find([]) - >>> print_trial_balance = Wizard('account.print_trial_balance') - >>> print_trial_balance.form.start_period = None - >>> print_trial_balance.form.end_period = None - >>> print_trial_balance.execute('print_') + >>> general_ledger = Report('account.general_ledger', context={ + ... 'company': company.id, + ... 'fiscalyear': fiscalyear.id, + ... }) + >>> _ = general_ledger.execute(gl_accounts) - >>> aged_balance = Wizard('account.open_aged_balance') - >>> aged_balance.execute('print_') + >>> trial_balance = Report('account.trial_balance', context={ + ... 'company': company.id, + ... 'fiscalyear': fiscalyear.id, + ... }) + >>> _ = trial_balance.execute(gl_accounts) + + >>> AgedBalance = Model.get('account.aged_balance') + >>> context = { + ... 'company': company.id, + ... 'type': 'customer', + ... 'date': today, + ... 'term1': 30, + ... 'term2': 60, + ... 'term3': 90, + ... 'unit': 'day', + ... } + >>> with config.set_context(context): + ... aged_balances = AgedBalance.find([]) + + >>> aged_balance = Report('account.aged_balance', context=context) + >>> _ = aged_balance.execute(aged_balances) >>> print_general_journal = Wizard('account.move.print_general_journal') >>> print_general_journal.execute('print_') diff --git a/trial_balance.odt b/trial_balance.odt index dfc0bc79932d2dcefd8bfb3a1678f0ca59702be6..7c7b38f4f4f5755d43669a15d01427b608ff3b66 100644 GIT binary patch delta 14037 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 literal 37126 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%0AR9AiN#UQbReizbW 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 Y0XJKja&R)f_8a|$q4Q7hCB~=!0#bjCO8@`> diff --git a/view/open_aged_balance_start_form.xml b/view/aged_balance_context_form.xml similarity index 72% rename from view/open_aged_balance_start_form.xml rename to view/aged_balance_context_form.xml index 2fd86af7e5..e60b91fa67 100644 --- a/view/open_aged_balance_start_form.xml +++ b/view/aged_balance_context_form.xml @@ -1,25 +1,22 @@ -
-