~openerp-commiter/openobject-addons/trunk-extra-addons

« back to all changes in this revision

Viewing changes to account_budget_crossover/crossovered_budget.py

  • Committer: Jay vora
  • Date: 2008-05-20 11:35:25 UTC
  • Revision ID: jvo@tinyerp.com-03a2449166812d882b00fbed4ab6e013486d0833

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
from osv import osv,fields
 
2
import tools
 
3
import netsvc
 
4
from mx import DateTime
 
5
import time
 
6
import datetime
 
7
 
 
8
 
 
9
def strToDate(dt):
 
10
                dt_date=datetime.date(int(dt[0:4]),int(dt[5:7]),int(dt[8:10]))
 
11
                return dt_date
 
12
 
 
13
class crossovered_budget(osv.osv):
 
14
        _name = "crossovered.budget"
 
15
        _description = "Crossovered Budget"
 
16
 
 
17
        _columns = {
 
18
                'name': fields.char('Name', size=50, required=True,states={'done':[('readonly',True)]}),
 
19
                'code': fields.char('Code', size=20, required=True,states={'done':[('readonly',True)]}),
 
20
                'creating_user_id': fields.many2one('res.users','Responsible User'),
 
21
                'validating_user_id': fields.many2one('res.users','Validate User', readonly=True),
 
22
                'date_from': fields.date('Start Date',required=True,states={'done':[('readonly',True)]}),
 
23
                'date_to': fields.date('End Date',required=True,states={'done':[('readonly',True)]}),
 
24
                'state' : fields.selection([('draft','Draft'),('confirm','Confirmed'),('validate','Validated'),('done','Done'),('cancel', 'Cancelled')], 'state', select=True, required=True, readonly=True),
 
25
                'crossovered_budget_line': fields.one2many('crossovered.budget.lines', 'crossovered_budget_id', 'Budget Lines',states={'done':[('readonly',True)]} ),
 
26
        }
 
27
 
 
28
        _defaults = {
 
29
                'state': lambda *a: 'draft',
 
30
                'creating_user_id': lambda self,cr,uid,context: uid,
 
31
        }
 
32
 
 
33
#       def action_set_to_draft(self, cr, uid, ids, *args):
 
34
#               self.write(cr, uid, ids, {'state': 'draft'})
 
35
#               wf_service = netsvc.LocalService('workflow')
 
36
#               for id in ids:
 
37
#                       wf_service.trg_create(uid, self._name, id, cr)
 
38
#               return True
 
39
 
 
40
        def budget_confirm(self, cr, uid, ids, *args):
 
41
 
 
42
                self.write(cr, uid, ids, {
 
43
                        'state':'confirm'
 
44
                })
 
45
                return True
 
46
 
 
47
        def budget_validate(self, cr, uid, ids, *args):
 
48
 
 
49
                self.write(cr, uid, ids, {
 
50
                        'state':'validate',
 
51
                        'validating_user_id': uid,
 
52
                })
 
53
                return True
 
54
 
 
55
        def budget_cancel(self, cr, uid, ids, *args):
 
56
 
 
57
                self.write(cr, uid, ids, {
 
58
                        'state':'cancel'
 
59
                })
 
60
                return True
 
61
 
 
62
        def budget_done(self, cr, uid, ids, *args):
 
63
 
 
64
                self.write(cr, uid, ids, {
 
65
                        'state':'done'
 
66
                })
 
67
                return True
 
68
 
 
69
crossovered_budget()
 
70
 
 
71
class crossovered_budget_lines(osv.osv):
 
72
 
 
73
        def _pra_amt(self, cr, uid, ids,name,args,context):
 
74
                res = {}
 
75
                for line in self.browse(cr, uid, ids):
 
76
                        acc_ids = ','.join([str(x.id) for x in line.general_budget_id.account_ids])
 
77
                        if not acc_ids:
 
78
                                raise osv.except_osv('Error!',"The General Budget '" + str(line.general_budget_id.name) + "' has no Accounts!" )
 
79
                        cr.execute("select sum(amount) from account_analytic_line where account_id=%d and (date between to_date('%s','yyyy-mm-dd') and to_date('%s','yyyy-mm-dd')) and general_account_id in (%s)"%(line.analytic_account_id.id,line.date_from,line.date_to,acc_ids))
 
80
                        result=cr.fetchone()[0]
 
81
                        if result==None:
 
82
                                result=0.00
 
83
                        res[line.id]=result
 
84
                return res
 
85
 
 
86
        def _theo_amt(self, cr, uid, ids,name,args,context):
 
87
                res = {}
 
88
                for line in self.browse(cr, uid, ids):
 
89
                        today=datetime.datetime.today()
 
90
                        td=today.strftime("%Y-%m-%d")
 
91
 
 
92
                        if line.paid_date:
 
93
                                if strToDate(td)<=strToDate(line.paid_date):
 
94
                                        theo_amt=0.00
 
95
                                else:
 
96
                                        theo_amt=line.planned_amount
 
97
                        else:
 
98
                                total=strToDate(line.date_to) - strToDate(line.date_from)
 
99
                                if strToDate(td) < strToDate(line.date_from):
 
100
                                        elapsed = strToDate(td) - strToDate(td)
 
101
                                elif strToDate(line.date_to) < strToDate(td):
 
102
                                        elapsed=total
 
103
                                else:
 
104
                                        elapsed = strToDate(td) - strToDate(line.date_from)
 
105
 
 
106
                                theo_amt=float(elapsed.days/float(total.days))*line.planned_amount
 
107
 
 
108
                        res[line.id]=theo_amt
 
109
                return res
 
110
 
 
111
        def _perc(self, cr, uid, ids,name,args,context):
 
112
                res = {}
 
113
                for line in self.browse(cr, uid, ids):
 
114
                        if line.theoritical_amount<>0.00:
 
115
                                res[line.id]=float(line.practical_amount / line.theoritical_amount)*100
 
116
                        else:
 
117
                                res[line.id]=0.00
 
118
                return res
 
119
        _name="crossovered.budget.lines"
 
120
        _description = "Crossovered Budget Lines"
 
121
        _columns = {
 
122
                'crossovered_budget_id': fields.many2one('crossovered.budget', 'Crossovered Budget Ref', ondelete='cascade', select=True, required=True),
 
123
                'analytic_account_id': fields.many2one('account.analytic.account', 'Analytic Account Ref',required=True),
 
124
                'general_budget_id': fields.many2one('account.budget.post', 'General Budget Ref',required=True),
 
125
                'date_from': fields.date('Start Date',required=True),
 
126
                'date_to': fields.date('End Date',required=True),
 
127
                'paid_date': fields.date('Paid Date'),
 
128
                'planned_amount':fields.float('Planned Amount',required=True),
 
129
                'practical_amount':fields.function(_pra_amt,method=True, string='Practical Amount',type='float',store=True),
 
130
                'theoritical_amount':fields.function(_theo_amt,method=True, string='Theoritical Amount',type='float',store=True),
 
131
                'percentage':fields.function(_perc,method=True, string='Percentage',type='float',store=True),
 
132
 
 
133
         }
 
134
crossovered_budget_lines()
 
135
 
 
136
class account_budget_post(osv.osv):
 
137
        _name = 'account.budget.post'
 
138
        _inherit = 'account.budget.post'
 
139
        _columns = {
 
140
        'crossovered_budget_line': fields.one2many('crossovered.budget.lines', 'general_budget_id', 'Budget Lines'),
 
141
        }
 
142
account_budget_post()
 
143
 
 
144
class account_budget_post_dotation(osv.osv):
 
145
        _name = 'account.budget.post.dotation'
 
146
        _inherit = 'account.budget.post.dotation'
 
147
 
 
148
        def _tot_planned(self, cr, uid, ids,name,args,context):
 
149
                res={}
 
150
                for line in self.browse(cr, uid, ids):
 
151
                        if line.period_id:
 
152
                                obj_period=self.pool.get('account.period').browse(cr, uid,line.period_id.id)
 
153
 
 
154
                                total_days=strToDate(obj_period.date_stop) - strToDate(obj_period.date_start)
 
155
                                budget_id=line.post_id and line.post_id.id or False
 
156
                                query="select id from crossovered_budget_lines where  general_budget_id= '"+ str(budget_id) + "' and date_from  >='"  +obj_period.date_start +"'  and date_from <= '"+obj_period.date_stop + "'"
 
157
                                cr.execute(query)
 
158
                                res1=cr.fetchall()
 
159
 
 
160
                                tot_planned=0.00
 
161
                                for record in res1:
 
162
                                        obj_lines=self.pool.get('crossovered.budget.lines').browse(cr, uid,record[0])
 
163
                                        count_days=strToDate(obj_period.date_stop) - strToDate(obj_lines.date_from)
 
164
                                        counted=count_days.days
 
165
                                        tot_planned +=float((counted +1)/float(total_days.days+1))*obj_lines.planned_amount
 
166
                                res[line.id]=tot_planned
 
167
                        else:
 
168
                                res[line.id]=0.00
 
169
                return res
 
170
 
 
171
        _columns = {
 
172
        'tot_planned':fields.function(_tot_planned,method=True, string='Total Planned Amount',type='float',store=True),
 
173
        }
 
174
 
 
175
account_budget_post_dotation()
 
176
 
 
177
class account_analytic_account(osv.osv):
 
178
        _name = 'account.analytic.account'
 
179
        _inherit = 'account.analytic.account'
 
180
 
 
181
        _columns = {
 
182
        'crossovered_budget_line': fields.one2many('crossovered.budget.lines', 'analytic_account_id', 'Budget Lines'),
 
183
        }
 
184
 
 
185
account_analytic_account()
 
186
 
 
187
 
 
188