From bf9cc8f0d677fbf6226e3db1ec5e7fa7ee98beb4 Mon Sep 17 00:00:00 2001 From: Bertrand Chenal Date: Thu, 17 Jul 2008 17:02:17 +0200 Subject: [PATCH] Added Third Party Balance report --- account.py | 111 ++++++++++++++++++++++++++++++++++++++++ account.xml | 30 +++++++++++ move.py | 2 +- third_party_balance.odt | Bin 0 -> 12715 bytes 4 files changed, 142 insertions(+), 1 deletion(-) create mode 100644 third_party_balance.odt diff --git a/account.py b/account.py index 70477a8a26..5e34027f6a 100644 --- a/account.py +++ b/account.py @@ -1243,3 +1243,114 @@ class CreateChartAccount(Wizard): return {} CreateChartAccount() + + +class OpenThirdPartyBalanceInit(WizardOSV): + _name = 'account.account.open_third_party_balance.init' + company = fields.Many2One('company.company', 'Company', required=True) + fiscalyear = fields.Many2One('account.fiscalyear', 'Fiscal Year', + 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') + if context is None: + context = {} + fiscalyear_id = fiscalyear_obj.find(cursor, user, + context.get('company', False), exception=False, context=context) + if fiscalyear_id: + return fiscalyear_obj.name_get(cursor, user, fiscalyear_id, + context=context)[0] + return False + + def default_posted(self, cursor, user, context=None): + 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 + +OpenThirdPartyBalanceInit() + + +class OpenThirdPartyBalance(Wizard): + 'Open Third Party Balance' + _name = 'account.account.open_third_party_balance' + states = { + 'init': { + 'result': { + 'type': 'form', + 'object': 'account.account.open_third_party_balance.init', + 'state': [ + ('end', 'Cancel', 'tryton-cancel'), + ('print', 'Print', 'tryton-ok', True), + ], + }, + }, + 'print': { + 'result': { + 'type': 'print', + 'report': 'account.account.third_party_balance', + 'state': 'end', + }, + }, + } + +OpenThirdPartyBalance() + + +class ThirdPartyBalance(Report): + _name = 'account.account.third_party_balance' + + def _get_objects(self, cursor, user, ids, model, datas, context): + party_obj = self.pool.get('relationship.party') + move_line_obj = self.pool.get('account.move.line') + company_obj = self.pool.get('company.company') + company = company_obj.browse(cursor, user, + datas['form']['company'], context=context) + context['company'] = company + context['digits'] = company.currency.digits + context['fiscalyear'] = datas['form']['fiscalyear'] + line_query = move_line_obj.query_get(cursor, user, context=context) + if datas['form']['posted']: + posted_clause = "and m.state = 'posted' " + else: + posted_clause = "" + + cursor.execute('SELECT l.party, SUM(l.debit), SUM(l.credit) ' \ + 'FROM account_move_line l ' \ + 'JOIN account_move m on (l.move = m.id) ' + 'JOIN account_account a on (l.account = a.id) ' + 'WHERE l.party is not null '\ + 'AND a.active ' \ + 'AND a.kind in (\'payable\',\'receivable\') ' \ + 'AND l.reconciliation IS NULL ' \ + 'AND a.company = %s ' \ + 'AND (l.maturity_date <= %s ' \ + 'OR l.maturity_date IS NULL) '\ + 'AND ' + line_query + ' ' \ + + posted_clause + \ + 'GROUP BY l.party', + (datas['form']['company'],datetime.date.today())) + + res = cursor.fetchall() + party_name = dict(party_obj.name_get( + cursor, user, [x[0] for x in res], + context=context)) + objects = [{'name': party_name[x[0]], + 'debit': x[1], + 'credit': x[2], + 'solde': x[1]-x[2]} for x in res] + objects.sort(lambda x,y: cmp(x['name'],y['name'])) + context['total_debit'] = sum((o['debit'] for o in objects)) + context['total_credit'] = sum((o['credit'] for o in objects)) + context['total_solde'] = sum((o['solde'] for o in objects)) + return objects + +ThirdPartyBalance() diff --git a/account.xml b/account.xml index 6c29cada9c..282083f413 100644 --- a/account.xml +++ b/account.xml @@ -683,5 +683,35 @@ id="menu_open_income_statement" icon="tryton-tree" name="Income Statement"/> + + account.account.open_third_party_balance.init + form + + + + + Third Party Balance + relationship.partner + account.account.third_party_balance + account/third_party_balance.odt + + + Open Third Party Balance + account.account.open_third_party_balance + + + diff --git a/move.py b/move.py index bdc55d45b2..b5d45c6d4b 100644 --- a/move.py +++ b/move.py @@ -364,7 +364,7 @@ class Line(OSV): help='The second currency') party = fields.Many2One('relationship.party', 'Party', on_change=['move', 'party', 'account', 'debit', 'credit', - 'journal']) + 'journal'], select=True) blocked = fields.Boolean('Litigation', help='Mark the line as litigation with the party.') maturity_date = fields.Date('Maturity Date', diff --git a/third_party_balance.odt b/third_party_balance.odt new file mode 100644 index 0000000000000000000000000000000000000000..865370f036f6303d0843ed91ab9240bcd82a9469 GIT binary patch literal 12715 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 H-ktqF)%*$U literal 0 HcmV?d00001