1 ##############################################################################
3 # OpenERP, Open Source Management Solution
4 # Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
6 # This program is free software: you can redistribute it and/or modify
7 # it under the terms of the GNU Affero General Public License as
8 # published by the Free Software Foundation, either version 3 of the
9 # License, or (at your option) any later version.
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU Affero General Public License for more details.
16 # You should have received a copy of the GNU Affero General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 ##############################################################################
23 from report import report_sxw
24 from common_report_header import common_report_header
25 from tools.translate import _
27 class report_pl_account_horizontal(report_sxw.rml_parse, common_report_header):
29 def __init__(self, cr, uid, name, context=None):
30 super(report_pl_account_horizontal, self).__init__(cr, uid, name, context=context)
31 self.result_sum_dr = 0.0
32 self.result_sum_cr = 0.0
36 self.localcontext.update( {
38 'get_lines': self.get_lines,
39 'get_lines_another': self.get_lines_another,
40 'get_currency': self._get_currency,
41 'get_data': self.get_data,
42 'sum_dr': self.sum_dr,
43 'sum_cr': self.sum_cr,
44 'final_result': self.final_result,
45 'get_fiscalyear': self._get_fiscalyear,
46 'get_account': self._get_account,
47 'get_start_period': self.get_start_period,
48 'get_end_period': self.get_end_period,
49 'get_sortby': self._get_sortby,
50 'get_filter': self._get_filter,
51 'get_journal': self._get_journal,
52 'get_start_date':self._get_start_date,
53 'get_end_date':self._get_end_date,
54 'get_company':self._get_company,
55 'get_target_move': self._get_target_move,
56 'get_trans':self._get_trans
58 self.context = context
60 def set_context(self, objects, data, ids, report_type=None):
62 if (data['model'] == 'ir.ui.menu'):
63 new_ids = 'chart_account_id' in data['form'] and [data['form']['chart_account_id']] or []
64 objects = self.pool.get('account.account').browse(self.cr, self.uid, new_ids)
65 lang_dict = self.pool.get('res.users').read(self.cr,self.uid,self.uid,['context_lang'])
66 data['lang'] = lang_dict.get('context_lang') or False
67 return super(report_pl_account_horizontal, self).set_context(objects, data, new_ids, report_type=report_type)
70 def final_result(self):
74 if self.res_pl['type'] == _('Net Profit'):
75 self.result_sum_dr += self.res_pl['balance']
76 return self.result_sum_dr
79 if self.res_pl['type'] == _('Net Loss'):
80 self.result_sum_cr += self.res_pl['balance']
81 return self.result_sum_cr
83 def _get_trans(self, source):
86 def get_data(self, data):
87 cr, uid = self.cr, self.uid
88 db_pool = pooler.get_pool(self.cr.dbname)
90 account_pool = db_pool.get('account.account')
91 currency_pool = db_pool.get('res.currency')
98 ctx = self.context.copy()
99 ctx['fiscalyear'] = data['form'].get('fiscalyear_id', False)
101 if data['form']['filter'] == 'filter_period':
102 ctx['periods'] = data['form'].get('periods', False)
103 elif data['form']['filter'] == 'filter_date':
104 ctx['date_from'] = data['form'].get('date_from', False)
105 ctx['date_to'] = data['form'].get('date_to', False)
108 account_id = data['form'].get('chart_account_id', False)
109 account_ids = account_pool._get_children_and_consol(cr, uid, account_id, context=ctx)
110 accounts = account_pool.browse(cr, uid, account_ids, context=ctx)
114 for account in accounts:
115 if (account.user_type.report_type) and (account.user_type.report_type == typ):
116 currency = account.currency_id and account.currency_id or account.company_id.currency_id
117 if typ == 'expense' and account.type <> 'view' and (account.debit <> account.credit):
118 self.result_sum_dr += abs(account.debit - account.credit)
119 if typ == 'income' and account.type <> 'view' and (account.debit <> account.credit):
120 self.result_sum_cr += abs(account.debit - account.credit)
121 if data['form']['display_account'] == 'bal_movement':
122 if (not currency_pool.is_zero(self.cr, self.uid, currency, account.credit)) or (not currency_pool.is_zero(self.cr, self.uid, currency, account.debit)) or (not currency_pool.is_zero(self.cr, self.uid, currency, account.balance)):
123 accounts_temp.append(account)
124 elif data['form']['display_account'] == 'bal_solde':
125 if not currency_pool.is_zero(self.cr, self.uid, currency, account.balance):
126 accounts_temp.append(account)
128 accounts_temp.append(account)
129 if self.result_sum_dr > self.result_sum_cr:
130 self.res_pl['type'] = _('Net Loss')
131 self.res_pl['balance'] = (self.result_sum_dr - self.result_sum_cr)
133 self.res_pl['type'] = _('Net Profit')
134 self.res_pl['balance'] = (self.result_sum_cr - self.result_sum_dr)
135 self.result[typ] = accounts_temp
136 cal_list[typ] = self.result[typ]
139 for i in range(0,max(len(cal_list['expense']),len(cal_list['income']))):
140 if i < len(cal_list['expense']) and i < len(cal_list['income']):
142 'code': cal_list['expense'][i].code,
143 'name': cal_list['expense'][i].name,
144 'level': cal_list['expense'][i].level,
145 'balance':cal_list['expense'][i].balance,
146 'code1': cal_list['income'][i].code,
147 'name1': cal_list['income'][i].name,
148 'level1': cal_list['income'][i].level,
149 'balance1':cal_list['income'][i].balance,
151 self.result_temp.append(temp)
153 if i < len(cal_list['income']):
159 'code1': cal_list['income'][i].code,
160 'name1': cal_list['income'][i].name,
161 'level1': cal_list['income'][i].level,
162 'balance1':cal_list['income'][i].balance,
164 self.result_temp.append(temp)
165 if i < len(cal_list['expense']):
167 'code': cal_list['expense'][i].code,
168 'name': cal_list['expense'][i].name,
169 'level': cal_list['expense'][i].level,
170 'balance':cal_list['expense'][i].balance,
176 self.result_temp.append(temp)
180 return self.result_temp
182 def get_lines_another(self, group):
183 return self.result.get(group, [])
185 report_sxw.report_sxw('report.pl.account.horizontal', 'account.account',
186 'addons/account/report/account_profit_horizontal.rml',parser=report_pl_account_horizontal, header='internal landscape')
188 report_sxw.report_sxw('report.pl.account', 'account.account',
189 'addons/account/report/account_profit_loss.rml',parser=report_pl_account_horizontal, header='internal')
191 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: