~technofluid-team/openobject-addons/technofluid_multiple_installations

« back to all changes in this revision

Viewing changes to account/project/report/analytic_balance.py

  • Committer: pinky
  • Date: 2006-12-07 13:41:40 UTC
  • Revision ID: pinky-dedd7f8a42bd4557112a0513082691b8590ad6cc
New trunk

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
##############################################################################
 
2
#
 
3
# Copyright (c) 2004 TINY SPRL. (http://tiny.be) All Rights Reserved.
 
4
#                    Fabien Pinckaers <fp@tiny.Be>
 
5
#
 
6
# WARNING: This program as such is intended to be used by professional
 
7
# programmers who take the whole responsability of assessing all potential
 
8
# consequences resulting FROM its eventual inadequacies AND bugs
 
9
# End users who are looking for a ready-to-use solution with commercial
 
10
# garantees AND support are strongly adviced to contract a Free Software
 
11
# Service Company
 
12
#
 
13
# This program is Free Software; you can redistribute it AND/or
 
14
# modify it under the terms of the GNU General Public License
 
15
# as published by the Free Software Foundation; either version 2
 
16
# of the License, or (at your option) any later version.
 
17
#
 
18
# This program is distributed in the hope that it will be useful,
 
19
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
20
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
21
# GNU General Public License for more details.
 
22
#
 
23
# You should have received a copy of the GNU General Public License
 
24
# along with this program; if not, write to the Free Software
 
25
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
26
#
 
27
##############################################################################
 
28
 
 
29
import pooler
 
30
import time
 
31
from report import report_sxw
 
32
 
 
33
class account_analytic_balance(report_sxw.rml_parse):
 
34
        def __init__(self, cr, uid, name, context):
 
35
                super(account_analytic_balance, self).__init__(cr, uid, name, context)
 
36
                self.localcontext.update( {
 
37
                        'time': time,
 
38
                        'lines_g': self._lines_g,
 
39
                        'move_sum_debit': self._move_sum_debit,
 
40
                        'move_sum_credit': self._move_sum_credit,
 
41
                        'sum_debit': self._sum_debit,
 
42
                        'sum_credit': self._sum_credit,
 
43
                        'sum_balance': self._sum_balance,
 
44
                        'sum_quantity': self._sum_quantity,
 
45
                        'move_sum_balance': self._move_sum_balance,
 
46
                        'move_sum_quantity': self._move_sum_quantity,
 
47
                })
 
48
                
 
49
        def _lines_g(self, account_id, date1, date2):
 
50
                self.cr.execute("       SELECT aa.name AS name, aa.code AS code, sum(aal.amount) AS balance, sum(aal.unit_amount) AS quantity FROM account_analytic_line AS aal, account_account AS aa \
 
51
                                                        WHERE (aal.general_account_id=aa.id) AND (aal.account_id=%d) AND (date>=%s) AND (date<=%s) \
 
52
                                                        GROUP BY aal.general_account_id, aa.name, aa.code, aal.code ORDER BY aal.code", (account_id, date1, date2))
 
53
                res = self.cr.dictfetchall()
 
54
                
 
55
                for r in res:
 
56
                        if r['balance'] > 0:
 
57
                                r['debit'] = '%.2f' % r['balance']
 
58
                                r['credit'] = ''
 
59
                        elif r['balance'] < 0:
 
60
                                r['debit'] = ''
 
61
                                r['credit'] = '%.2f' % -r['balance']
 
62
                        else:
 
63
                                r['balance'] == 0
 
64
                                r['debit'] = ''
 
65
                                r['credit'] = ''
 
66
                return res
 
67
        
 
68
 
 
69
        def _move_sum_debit(self, account_id, date1, date2):
 
70
                self.cr.execute("SELECT sum(amount) FROM account_analytic_line WHERE account_id=%d AND date>=%s AND date<=%s AND amount>0", (account_id, date1, date2))
 
71
                return self.cr.fetchone()[0] or 0.0
 
72
 
 
73
        def _move_sum_credit(self, account_id, date1, date2):
 
74
                self.cr.execute("SELECT -sum(amount) FROM account_analytic_line WHERE account_id=%d AND date>=%s AND date<=%s AND amount<0", (account_id, date1, date2))
 
75
                return self.cr.fetchone()[0] or 0.0
 
76
        
 
77
        def _move_sum_balance(self, account_id, date1, date2):
 
78
                debit = self._move_sum_debit(account_id, date1, date2) 
 
79
                credit = self._move_sum_credit(account_id, date1, date2)
 
80
                return (debit-credit) or 0.0
 
81
        
 
82
        def _move_sum_quantity(self, account_id, date1, date2):
 
83
                self.cr.execute("SELECT sum(unit_amount) FROM account_analytic_line WHERE account_id=%d AND date>=%s AND date<=%s", (account_id, date1, date2))
 
84
                return self.cr.fetchone()[0] or 0.0
 
85
 
 
86
        
 
87
        def _sum_debit(self, accounts, date1, date2):
 
88
                ids = map(lambda x: x.id, accounts)
 
89
                if not len(ids):
 
90
                        return 0.0
 
91
                self.cr.execute("SELECT sum(amount) FROM account_analytic_line WHERE account_id IN ("+','.join(map(str, ids))+") AND date>=%s AND date<=%s AND amount>0", (date1, date2))
 
92
                return self.cr.fetchone()[0] or 0.0
 
93
                
 
94
        def _sum_credit(self, accounts, date1, date2):
 
95
                ids = map(lambda x: x.id, accounts)
 
96
                if not len(ids):
 
97
                        return 0.0
 
98
                ids = map(lambda x: x.id, accounts)
 
99
                self.cr.execute("SELECT -sum(amount) FROM account_analytic_line WHERE account_id IN ("+','.join(map(str, ids))+") AND date>=%s AND date<=%s AND amount<0", (date1, date2))
 
100
                return self.cr.fetchone()[0] or 0.0
 
101
 
 
102
        def _sum_balance(self, accounts, date1, date2):
 
103
                debit = self._sum_debit(accounts, date1, date2) or 0.0
 
104
                credit = self._sum_credit(accounts, date1, date2) or 0.0
 
105
                return (debit-credit)
 
106
 
 
107
        def _sum_quantity(self, accounts, date1, date2):
 
108
                ids = map(lambda x: x.id, accounts)
 
109
                if not len(ids):
 
110
                        return 0.0
 
111
                self.cr.execute("SELECT sum(unit_amount) FROM account_analytic_line WHERE account_id IN ("+','.join(map(str, ids))+") AND date>=%s AND date<=%s", (date1, date2))
 
112
                return self.cr.fetchone()[0] or 0.0
 
113
 
 
114
report_sxw.report_sxw('report.account.analytic.account.balance', 'account.analytic.account', 'addons/account/project/report/analytic_balance.rml',parser=account_analytic_balance)
 
115