1
from osv import osv,fields
4
from mx import DateTime
10
dt_date=datetime.date(int(dt[0:4]),int(dt[5:7]),int(dt[8:10]))
13
class crossovered_budget(osv.osv):
14
_name = "crossovered.budget"
15
_description = "Crossovered Budget"
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)]} ),
29
'state': lambda *a: 'draft',
30
'creating_user_id': lambda self,cr,uid,context: uid,
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')
37
# wf_service.trg_create(uid, self._name, id, cr)
40
def budget_confirm(self, cr, uid, ids, *args):
42
self.write(cr, uid, ids, {
47
def budget_validate(self, cr, uid, ids, *args):
49
self.write(cr, uid, ids, {
51
'validating_user_id': uid,
55
def budget_cancel(self, cr, uid, ids, *args):
57
self.write(cr, uid, ids, {
62
def budget_done(self, cr, uid, ids, *args):
64
self.write(cr, uid, ids, {
71
class crossovered_budget_lines(osv.osv):
73
def _pra_amt(self, cr, uid, ids,name,args,context):
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])
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]
86
def _theo_amt(self, cr, uid, ids,name,args,context):
88
for line in self.browse(cr, uid, ids):
89
today=datetime.datetime.today()
90
td=today.strftime("%Y-%m-%d")
93
if strToDate(td)<=strToDate(line.paid_date):
96
theo_amt=line.planned_amount
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):
104
elapsed = strToDate(td) - strToDate(line.date_from)
106
theo_amt=float(elapsed.days/float(total.days))*line.planned_amount
108
res[line.id]=theo_amt
111
def _perc(self, cr, uid, ids,name,args,context):
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
119
_name="crossovered.budget.lines"
120
_description = "Crossovered Budget Lines"
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),
134
crossovered_budget_lines()
136
class account_budget_post(osv.osv):
137
_name = 'account.budget.post'
138
_inherit = 'account.budget.post'
140
'crossovered_budget_line': fields.one2many('crossovered.budget.lines', 'general_budget_id', 'Budget Lines'),
142
account_budget_post()
144
class account_budget_post_dotation(osv.osv):
145
_name = 'account.budget.post.dotation'
146
_inherit = 'account.budget.post.dotation'
148
def _tot_planned(self, cr, uid, ids,name,args,context):
150
for line in self.browse(cr, uid, ids):
152
obj_period=self.pool.get('account.period').browse(cr, uid,line.period_id.id)
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 + "'"
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
172
'tot_planned':fields.function(_tot_planned,method=True, string='Total Planned Amount',type='float',store=True),
175
account_budget_post_dotation()
177
class account_analytic_account(osv.osv):
178
_name = 'account.analytic.account'
179
_inherit = 'account.analytic.account'
182
'crossovered_budget_line': fields.one2many('crossovered.budget.lines', 'analytic_account_id', 'Budget Lines'),
185
account_analytic_account()