modify account_budget_crossover

- becaz all referece of budget on account is moved to account_budget_crossover

bzr revid: mra@tinyerp.com-20080911100228-kgdwn1f1xerxl126
This commit is contained in:
Mustufa Rangwala 2008-09-11 15:32:28 +05:30
parent ba1cc76ac7
commit cf7a92483b
12 changed files with 811 additions and 125 deletions

View File

@ -7,7 +7,7 @@
"category" : "Generic Modules/Accounting",
"description": """This module allow accountants to manage analytic and crossovered budgets.
Once the Master Budgets and the Budgets defined (in Financial Management/Configuration/Budgets/), the Project Managers can set the planned amount on each Analytic Account.
Once the Master Budgets and the Budgets defined (in Financial Management/Configuration/Budgets/), the Project Managers can set the planned amount on each Analytic Account.
The accountant has the possibility to see the total of amount planned for each Budget and Master Budget in order to ensure the total planned is not greater/lower than what he planned for this Budget/Master Budget. Each list of record can also be switched to a graphical view of it.
@ -23,7 +23,7 @@
"init_xml" : [],
"demo_xml" : [],
"update_xml" : [
"security/ir.model.access.csv",
"security/ir.model.access.csv","account_budget_wizard.xml",
"crossovered_budget_view.xml","crossovered_budget_report.xml","crossovered_budget_workflow.xml"
],
"active": False,

View File

@ -0,0 +1,9 @@
<?xml version="1.0"?>
<openerp>
<data>
<wizard id="wizard_budget_spread" menu="False" model="account.budget.post" name="account.budget.spread" string="Spread amount"/>
<wizard id="wizard_budget_report" keyword="client_print_multi" model="account.budget.post" name="account.budget.report" string="Budget"/>
</data>
</openerp>

View File

@ -10,6 +10,76 @@ import datetime
def strToDate(dt):
dt_date=datetime.date(int(dt[0:4]),int(dt[5:7]),int(dt[8:10]))
return dt_date
#moved from account/account.py
# ---------------------------------------------------------
# Budgets
# ---------------------------------------------------------
class account_budget_post(osv.osv):
_name = 'account.budget.post'
_description = 'Budget item'
_columns = {
'code': fields.char('Code', size=64, required=True),
'name': fields.char('Name', size=256, required=True),
'dotation_ids': fields.one2many('account.budget.post.dotation', 'post_id', 'Expenses'),
'account_ids': fields.many2many('account.account', 'account_budget_rel', 'budget_id', 'account_id', 'Accounts'),
'crossovered_budget_line': fields.one2many('crossovered.budget.lines', 'general_budget_id', 'Budget Lines'),
}
_defaults = {
}
def spread(self, cr, uid, ids, fiscalyear_id=False, amount=0.0):
dobj = self.pool.get('account.budget.post.dotation')
for o in self.browse(cr, uid, ids):
# delete dotations for this post
dobj.unlink(cr, uid, dobj.search(cr, uid, [('post_id','=',o.id)]))
# create one dotation per period in the fiscal year, and spread the total amount/quantity over those dotations
fy = self.pool.get('account.fiscalyear').browse(cr, uid, [fiscalyear_id])[0]
num = len(fy.period_ids)
for p in fy.period_ids:
dobj.create(cr, uid, {'post_id': o.id, 'period_id': p.id, 'amount': amount/num})
return True
account_budget_post()
class account_budget_post_dotation(osv.osv):
def _tot_planned(self, cr, uid, ids,name,args,context):
res={}
for line in self.browse(cr, uid, ids):
if line.period_id:
obj_period=self.pool.get('account.period').browse(cr, uid,line.period_id.id)
total_days=strToDate(obj_period.date_stop) - strToDate(obj_period.date_start)
budget_id=line.post_id and line.post_id.id or False
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 + "') OR (date_to >='" +obj_period.date_start +"' and date_to <= '"+obj_period.date_stop + "') OR (date_from <'" +obj_period.date_start +"' and date_to > '"+obj_period.date_stop + "')"
cr.execute(query)
res1=cr.fetchall()
tot_planned=0.00
for record in res1:
obj_lines = self.pool.get('crossovered.budget.lines').browse(cr, uid,record[0])
count_days = min(strToDate(obj_period.date_stop),strToDate(obj_lines.date_to)) - max(strToDate(obj_period.date_start), strToDate(obj_lines.date_from))
days_in_period = count_days.days +1
count_days = strToDate(obj_lines.date_to) - strToDate(obj_lines.date_from)
total_days_of_rec = count_days.days +1
tot_planned += obj_lines.planned_amount/total_days_of_rec* days_in_period
res[line.id]=tot_planned
else:
res[line.id]=0.00
return res
_name = 'account.budget.post.dotation'
_description = "Budget item endowment"
_columns = {
'name': fields.char('Name', size=64),
'post_id': fields.many2one('account.budget.post', 'Item', select=True),
'period_id': fields.many2one('account.period', 'Period'),
# 'quantity': fields.float('Quantity', digits=(16,2)),
'amount': fields.float('Amount', digits=(16,2)),
'tot_planned':fields.function(_tot_planned,method=True, string='Total Planned Amount',type='float',store=True),
}
account_budget_post_dotation()
#===
class crossovered_budget(osv.osv):
_name = "crossovered.budget"
@ -138,48 +208,50 @@ class crossovered_budget_lines(osv.osv):
}
crossovered_budget_lines()
class account_budget_post(osv.osv):
_name = 'account.budget.post'
_inherit = 'account.budget.post'
_columns = {
'crossovered_budget_line': fields.one2many('crossovered.budget.lines', 'general_budget_id', 'Budget Lines'),
}
account_budget_post()
class account_budget_post_dotation(osv.osv):
_name = 'account.budget.post.dotation'
_inherit = 'account.budget.post.dotation'
def _tot_planned(self, cr, uid, ids,name,args,context):
res={}
for line in self.browse(cr, uid, ids):
if line.period_id:
obj_period=self.pool.get('account.period').browse(cr, uid,line.period_id.id)
total_days=strToDate(obj_period.date_stop) - strToDate(obj_period.date_start)
budget_id=line.post_id and line.post_id.id or False
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 + "') OR (date_to >='" +obj_period.date_start +"' and date_to <= '"+obj_period.date_stop + "') OR (date_from <'" +obj_period.date_start +"' and date_to > '"+obj_period.date_stop + "')"
cr.execute(query)
res1=cr.fetchall()
tot_planned=0.00
for record in res1:
obj_lines = self.pool.get('crossovered.budget.lines').browse(cr, uid,record[0])
count_days = min(strToDate(obj_period.date_stop),strToDate(obj_lines.date_to)) - max(strToDate(obj_period.date_start), strToDate(obj_lines.date_from))
days_in_period = count_days.days +1
count_days = strToDate(obj_lines.date_to) - strToDate(obj_lines.date_from)
total_days_of_rec = count_days.days +1
tot_planned += obj_lines.planned_amount/total_days_of_rec* days_in_period
res[line.id]=tot_planned
else:
res[line.id]=0.00
return res
_columns = {
'tot_planned':fields.function(_tot_planned,method=True, string='Total Planned Amount',type='float',store=True),
}
account_budget_post_dotation()
#class account_budget_post(osv.osv): #old code
# _name = 'account.budget.post'
# _inherit = 'account.budget.post'
# _columns = {
# 'crossovered_budget_line': fields.one2many('crossovered.budget.lines', 'general_budget_id', 'Budget Lines'),
# }
#account_budget_post()
#
#class account_budget_post_dotation(osv.osv):
# _name = 'account.budget.post.dotation'
# _inherit = 'account.budget.post.dotation'
#
# def _tot_planned(self, cr, uid, ids,name,args,context):
# res={}
# for line in self.browse(cr, uid, ids):
# if line.period_id:
# obj_period=self.pool.get('account.period').browse(cr, uid,line.period_id.id)
#
# total_days=strToDate(obj_period.date_stop) - strToDate(obj_period.date_start)
# budget_id=line.post_id and line.post_id.id or False
# 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 + "') OR (date_to >='" +obj_period.date_start +"' and date_to <= '"+obj_period.date_stop + "') OR (date_from <'" +obj_period.date_start +"' and date_to > '"+obj_period.date_stop + "')"
# cr.execute(query)
# res1=cr.fetchall()
#
# tot_planned=0.00
# for record in res1:
# obj_lines = self.pool.get('crossovered.budget.lines').browse(cr, uid,record[0])
# count_days = min(strToDate(obj_period.date_stop),strToDate(obj_lines.date_to)) - max(strToDate(obj_period.date_start), strToDate(obj_lines.date_from))
# days_in_period = count_days.days +1
# count_days = strToDate(obj_lines.date_to) - strToDate(obj_lines.date_from)
# total_days_of_rec = count_days.days +1
# tot_planned += obj_lines.planned_amount/total_days_of_rec* days_in_period
# res[line.id]=tot_planned
# else:
# res[line.id]=0.00
# return res
#
# _columns = {
# 'tot_planned':fields.function(_tot_planned,method=True, string='Total Planned Amount',type='float',store=True),
# }
#
#account_budget_post_dotation()
class account_analytic_account(osv.osv):
_name = 'account.analytic.account'
@ -191,6 +263,52 @@ class account_analytic_account(osv.osv):
account_analytic_account()
#--------------------------------------------------------------
# moved from account/project/project.py
# ---------------------------------------------------------
# Budgets
# ---------------------------------------------------------
#class account_analytic_budget_post(osv.osv):
# _name = 'account.analytic.budget.post'
# _description = 'Budget item'
# _columns = {
# 'code': fields.char('Code', size=64, required=True),
# 'name': fields.char('Name', size=256, required=True),
# 'sens': fields.selection( [('charge','Charge'), ('produit','Product')], 'Direction', required=True),
# 'dotation_ids': fields.one2many('account.analytic.budget.post.dotation', 'post_id', 'Expenses'),
# 'account_ids': fields.many2many('account.analytic.account', 'account_analytic_budget_rel', 'budget_id', 'account_id', 'Accounts'),
# }
# _defaults = {
# 'sens': lambda *a: 'produit',
# }
#
# def spread(self, cr, uid, ids, fiscalyear_id=False, quantity=0.0, amount=0.0):
#
# dobj = self.pool.get('account.analytic.budget.post.dotation')
# for o in self.browse(cr, uid, ids):
# # delete dotations for this post
# dobj.unlink(cr, uid, dobj.search(cr, uid, [('post_id','=',o.id)]))
#
# # create one dotation per period in the fiscal year, and spread the total amount/quantity over those dotations
# fy = self.pool.get('account.fiscalyear').browse(cr, uid, [fiscalyear_id])[0]
# num = len(fy.period_ids)
# for p in fy.period_ids:
# dobj.create(cr, uid, {'post_id': o.id, 'period_id': p.id, 'quantity': quantity/num, 'amount': amount/num})
# return True
#account_analytic_budget_post()
#
#class account_analytic_budget_post_dotation(osv.osv):
# _name = 'account.analytic.budget.post.dotation'
# _description = "Budget item endowment"
# _columns = {
# 'name': fields.char('Name', size=64),
# 'post_id': fields.many2one('account.analytic.budget.post', 'Item', select=True),
# 'period_id': fields.many2one('account.period', 'Period'),
# 'quantity': fields.float('Quantity', digits=(16,2)),
# 'amount': fields.float('Amount', digits=(16,2)),
# }
#account_analytic_budget_post_dotation()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -40,5 +40,15 @@
rml="account_budget_crossover/report/analytic_account_budget_report.rml"
auto="False"
menu="False"/>
<!-- moved from account module -->
<report auto="False"
id="account_budget"
menu="False"
model="account.budget.post"
name="account.budget"
rml="account/report/budget_report.rml"
string="Print Budget"/>
</data>
</openerp>

View File

@ -1,6 +1,164 @@
<?xml version="1.0" ?>
<openerp>
<data>
<!-- budget form and tree view from account module *********************************** -->
<record id="action_account_budget_post_tree" model="ir.actions.act_window">
<field name="name">Budgets</field>
<field name="res_model">account.budget.post</field>
<field name="view_type">tree</field>
</record>
<menuitem action="action_account_budget_post_tree" id="menu_action_account_budget_post_tree" parent="account.menu_finance_reporting"/>
<!--
Budgets
-->
<!--<record id="view_budget_post_form" model="ir.ui.view">
<field name="name">account.budget.post.form</field>
<field name="model">account.budget.post</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Master Budget">
<notebook>
<page string="Definition">
<field name="code" select="1"/>
<field name="name" select="1"/>
</page>
<page string="Dotations">
<button name="%(wizard_budget_spread)d" string="Spread" type="action"/>
<field colspan="4" name="dotation_ids" nolabel="1"/>
</page>
<page string="Accounts">
<field colspan="4" name="account_ids" nolabel="1"/>
</page>
</notebook>
</form>
</field>
</record>-->
<record id="view_budget_post_tree" model="ir.ui.view">
<field name="name">account.budget.post.tree</field>
<field name="model">account.budget.post</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree string="Master Budget">
<field name="code"/>
<field name="name"/>
</tree>
</field>
</record>
<record id="view_budget_post_dotation_form" model="ir.ui.view">
<field name="name">account.budget.post.dotation.form</field>
<field name="model">account.budget.post.dotation</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Master Budget Expenses">
<field name="period_id"/>
<field name="amount"/>
<field name="tot_planned" />
</form>
</field>
</record>
<record id="view_budget_post_dotation_tree" model="ir.ui.view">
<field name="name">account.budget.post.dotation.tree</field>
<field name="model">account.budget.post.dotation</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree string="Master Budget Expenses">
<field name="period_id"/>
<field name="amount"/>
<field name="tot_planned" />
</tree>
</field>
</record>
<record id="open_budget_post_form" model="ir.actions.act_window">
<field name="name">Master Budgets</field>
<field name="res_model">account.budget.post</field>
<field name="view_type">form</field>
<field name="view_id" ref="view_budget_post_tree"/>
</record>
<menuitem id="next_id_31" name="Budgets" parent="account.menu_finance_accounting"/><menuitem action="open_budget_post_form" id="menu_budget_post_form" parent="next_id_31"/>
<!-- ******************************************************************************************************** -->
<!--<record model="ir.ui.view" id="view_budget_post_dotation_form_inherit">
<field name="name">account.budget.post.dotation.form.inherit</field>
<field name="type">form</field>
<field name="model">account.budget.post.dotation</field>
<field name="inherit_id" ref="account.view_budget_post_dotation_form"/>
<field name="arch" type="xml">
<field name="period_id" position="after">
<field name="tot_planned" />
</field>
</field>
</record>-->
<!--<record model="ir.ui.view" id="view_budget_post_dotation_tree_inherit">
<field name="name">account.budget.post.dotation.tree.inherit</field>
<field name="model">account.budget.post.dotation</field>
<field name="type">tree</field>
<field name="inherit_id" ref="account.view_budget_post_dotation_tree"/>
<field name="arch" type="xml">
<field name="amount" position="after">
<field name="tot_planned" />
</field>
</field>
</record>-->
<!--<record model="ir.ui.view" id="account.view_budget_post_form">-->
<record model="ir.ui.view" id="view_budget_post_form">
<field name="name">account.budget.post.form.inherit</field>
<field name="model">account.budget.post</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Master Budget">
<notebook>
<page string="Definition">
<field name="code" select="1"/>
<field name="name" select="1"/>
</page>
<page string="Dotations">
<button string="Spread" name="%(wizard_budget_spread)d" type="action"/>
<field name="dotation_ids" colspan="4" nolabel="1"/>
</page>
<page string="Accounts">
<field name="account_ids" colspan="4" nolabel="1"/>
</page>
<page string="Budget Lines">
<field name="crossovered_budget_line" widget="one2many_list" colspan="4" nolabel="1" mode="tree,graph">
<graph type="bar" string="Lines">
<field name="analytic_account_id" />
<field name="general_budget_id" operator="+" />
<field name="planned_amount" operator="+"/>
<field group="True" name="general_budget_id"/>
</graph>
<tree string="Budget Lines" editable="top">
<field name="crossovered_budget_id"/>
<field name="analytic_account_id"/>
<field name="date_from"/>
<field name="date_to"/>
<field name="paid_date"/>
<field name="planned_amount"/>
<field name="practical_amount" select="1"/>
<field name="theoritical_amount"/>
<field name="percentage"/>
</tree>
<form string="Budget Lines">
<field name="crossovered_budget_id"/>
<field name="analytic_account_id"/>
<field name="date_from"/>
<field name="date_to"/>
<field name="paid_date"/>
<field name="planned_amount"/>
<field name="practical_amount" select="1"/>
<field name="theoritical_amount"/>
<field name="percentage"/>
</form>
</field>
</page>
</notebook>
</form>
</field>
</record>
<!-- =================== -->
<record model="ir.ui.view" id="crossovered_budget_view_form">
<field name="name">crossovered.budget.view.form</field>
<field name="model">crossovered.budget</field>
@ -69,7 +227,7 @@
<field name="view_mode">tree,form</field>
<field name="view_id" ref="crossovered_budget_view_tree"/>
</record>
<menuitem parent="account.next_id_31"
<menuitem parent="next_id_31"
id="menu_act_crossovered_budget_view"
action="act_crossovered_budget_view" />
@ -119,7 +277,7 @@
<field name="view_id" ref="view_crossovered_budget_line_tree"/>
</record>
<menuitem name="Budgets" parent="account.menu_action_account_budget_post_tree"
<menuitem name="Budgets" parent="menu_action_account_budget_post_tree"
id="menu_financial_reporting_budget_budget"/>
<menuitem name="Entries" parent="menu_financial_reporting_budget_budget"
id="menu_financial_reporting_budget_budget_entries"/>
@ -134,84 +292,6 @@
src_model="account.analytic.account"
id="act_account_analytic_account_cb_lines"/>
<!--<record model="ir.ui.view" id="view_budget_post_dotation_form_inherit">
<field name="name">account.budget.post.dotation.form.inherit</field>
<field name="type">form</field>
<field name="model">account.budget.post.dotation</field>
<field name="inherit_id" ref="account.view_budget_post_dotation_form"/>
<field name="arch" type="xml">
<field name="period_id" position="after">
<field name="tot_planned" />
</field>
</field>
</record>-->
<record model="ir.ui.view" id="view_budget_post_dotation_tree_inherit">
<field name="name">account.budget.post.dotation.tree.inherit</field>
<field name="model">account.budget.post.dotation</field>
<field name="type">tree</field>
<field name="inherit_id" ref="account.view_budget_post_dotation_tree"/>
<field name="arch" type="xml">
<field name="amount" position="after">
<field name="tot_planned" />
</field>
</field>
</record>
<record model="ir.ui.view" id="account.view_budget_post_form">
<field name="name">account.budget.post.form.inherit</field>
<field name="model">account.budget.post</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Master Budget">
<notebook>
<page string="Definition">
<field name="code" select="1"/>
<field name="name" select="1"/>
</page>
<page string="Dotations">
<button string="Spread" name="%(account.wizard_budget_spread)d" type="action"/>
<field name="dotation_ids" colspan="4" nolabel="1"/>
</page>
<page string="Accounts">
<field name="account_ids" colspan="4" nolabel="1"/>
</page>
<page string="Budget Lines">
<field name="crossovered_budget_line" widget="one2many_list" colspan="4" nolabel="1" mode="tree,graph">
<graph type="bar" string="Lines">
<field name="analytic_account_id" />
<field name="general_budget_id" operator="+" />
<field name="planned_amount" operator="+"/>
<field group="True" name="general_budget_id"/>
</graph>
<tree string="Budget Lines" editable="top">
<field name="crossovered_budget_id"/>
<field name="analytic_account_id"/>
<field name="date_from"/>
<field name="date_to"/>
<field name="paid_date"/>
<field name="planned_amount"/>
<field name="practical_amount" select="1"/>
<field name="theoritical_amount"/>
<field name="percentage"/>
</tree>
<form string="Budget Lines">
<field name="crossovered_budget_id"/>
<field name="analytic_account_id"/>
<field name="date_from"/>
<field name="date_to"/>
<field name="paid_date"/>
<field name="planned_amount"/>
<field name="practical_amount" select="1"/>
<field name="theoritical_amount"/>
<field name="percentage"/>
</form>
</field>
</page>
</notebook>
</form>
</field>
</record>
<record model="ir.ui.view" id="view_account_analytic_account_form_inherit_cci">
<field name="name">account.analytic.account.form.inherot.cci</field>
@ -249,6 +329,16 @@
</notebook>
</field>
</record>
<!-- moved from account module -->
<!--Budget -->
<!--<report
id="account_analytic_budget_print"
string="Print Budget"
model="account.analytic.budget.post"
name="account.analytic.budget.print"
rml="account/project/report/account_analytic_budget_report.rml"
auto="False"
menu="False"/>-->
</data>
</openerp>

View File

@ -1,5 +1,6 @@
# -*- encoding: utf-8 -*-
import crossovered_budget_report
import analytic_account_budget_report
import budget_report
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -0,0 +1,78 @@
# -*- encoding: utf-8 -*-
##############################################################################
#
# Copyright (c) 2004-2008 TINY SPRL. (http://tiny.be) All Rights Reserved.
#
# $Id$
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsability of assessing all potential
# consequences resulting from its eventual inadequacies and bugs
# End users who are looking for a ready-to-use solution with commercial
# garantees and support are strongly adviced to contract a Free Software
# Service Company
#
# This program is Free Software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
##############################################################################
import time
from report import report_sxw
import datetime
import operator
class budget_report(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
super(budget_report, self).__init__(cr, uid, name, context)
self.localcontext.update( {
'lines': self.lines,
'budget_total': self.budget_total,
'post_total': self.post_total,
'time': time,
})
def post_total(self, post_obj, date1, date2):
def str2date(date_str):
return datetime.date.fromtimestamp(time.mktime(time.strptime(date_str, '%Y-%m-%d')))
def interval(d1str, d2str):
return (str2date(d2str) - str2date(d1str) + datetime.timedelta(days=1)).days
prev = reduce(lambda x,d: x + d.amount, post_obj.dotation_ids, 0.0)
period_days = interval(date1, date2)
for d in post_obj.dotation_ids:
i = interval(d.period_id.date_start, d.period_id.date_stop)
total_days = reduce(lambda x,d: x+interval(d.period_id.date_start, d.period_id.date_stop), post_obj.dotation_ids, 0)
achievements = reduce(lambda x,l: x+l['achievements'], self.lines(post_obj, date1, date2), 0.0)
return [{'prev': prev, 'prev_period': prev * period_days / total_days, 'achievements': achievements}]
def budget_total(self, post_objs, date1, date2):
res = {'prev': 0.0, 'prev_period': 0.0, 'achievements': 0.0}
for post_obj in post_objs:
r = self.post_total(post_obj, date1, date2)[0]
for k in r:
res[k] += r[k]
return [res]
def lines(self, post_obj, date1, date2):
res = []
for a in post_obj.account_ids:
self.cr.execute("SELECT COALESCE(SUM(debit-credit), 0) FROM account_move_line WHERE account_id=%d AND date>=%s AND date<=%s and state<>'draft'", (a.id, date1, date2))
achievements = float(self.cr.fetchone()[0]) * (post_obj.sens=='produit' and -1 or 1)
res.append({'name': a.name, 'code': a.code, 'achievements': achievements})
return res
report_sxw.report_sxw('report.account.budget', 'account.budget.post', 'addons/account/report/budget_report.rml',parser=budget_report)
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -0,0 +1,248 @@
<?xml version="1.0"?>
<document filename="test.pdf">
<template pageSize="(612.0,792.0)" title="Test" author="Martin Simon" allowSplitting="20">
<pageTemplate id="first">
<frame id="first" x1="57.0" y1="57.0" width="498" height="678"/>
</pageTemplate>
</template>
<stylesheet>
<blockTableStyle id="Standard_Outline">
<blockAlignment value="LEFT"/>
<blockValign value="TOP"/>
</blockTableStyle>
<blockTableStyle id="Table2">
<blockAlignment value="LEFT"/>
<blockValign value="TOP"/>
<blockBackground colorName="#e6e6e6" start="0,0" stop="0,0"/>
<blockBackground colorName="#e6e6e6" start="1,0" stop="1,0"/>
<blockBackground colorName="#e6e6e6" start="2,0" stop="2,0"/>
<blockBackground colorName="#e6e6e6" start="0,1" stop="0,1"/>
<blockBackground colorName="#e6e6e6" start="1,1" stop="1,1"/>
<blockBackground colorName="#e6e6e6" start="2,1" stop="2,1"/>
</blockTableStyle>
<blockTableStyle id="Table5">
<blockAlignment value="LEFT"/>
<blockValign value="TOP"/>
<lineStyle kind="GRID" colorName="black"/>
</blockTableStyle>
<blockTableStyle id="Table8">
<blockAlignment value="LEFT"/>
<blockValign value="TOP"/>
</blockTableStyle>
<blockTableStyle id="Table9">
<blockAlignment value="LEFT"/>
<blockValign value="TOP"/>
</blockTableStyle>
<blockTableStyle id="Table10">
<blockAlignment value="LEFT"/>
<blockValign value="TOP"/>
</blockTableStyle>
<blockTableStyle id="Table7">
<blockAlignment value="LEFT"/>
<blockValign value="TOP"/>
<lineStyle kind="GRID" colorName="black"/>
</blockTableStyle>
<initialize>
<paraStyle name="all" alignment="justify"/>
</initialize>
<paraStyle name="P1" fontName="Times-Roman" alignment="RIGHT" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="P2" fontName="Times-Bold" fontSize="20.0" leading="25" alignment="CENTER" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="P3" fontName="Times-Roman" fontSize="10.0" leading="13" alignment="RIGHT" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="P4" fontName="Times-Roman" alignment="LEFT" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="P5" fontName="Times-Bold" fontSize="18.0" leading="22" alignment="CENTER" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="P6" fontName="Times-Roman" alignment="CENTER"/>
<paraStyle name="P7" fontName="Times-BoldItalic" alignment="CENTER" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="P8" fontName="Times-Roman"/>
<paraStyle name="P9" fontName="Times-Bold"/>
<paraStyle name="P10" fontName="Times-Bold" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="P11" fontName="Times-Bold" fontSize="10.0" leading="13" alignment="LEFT" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="P12" fontName="Times-Roman" fontSize="10.0" leading="13" alignment="LEFT" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="P13" fontName="Times-Roman" fontSize="10.0" leading="13" alignment="RIGHT" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="P14" fontName="Times-Roman" alignment="RIGHT" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="P15" fontName="Times-Bold" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="P16" fontName="Times-Roman" alignment="RIGHT" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="P17" fontName="Times-Roman" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="P18" fontName="Times-Bold" alignment="RIGHT" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="Standard" fontName="Times-Roman"/>
<paraStyle name="Text body" fontName="Times-Roman" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="List" fontName="Times-Roman" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="Table Contents" fontName="Times-Roman" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="Table Heading" fontName="Times-Roman" alignment="CENTER" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="Caption" fontName="Times-Roman" fontSize="10.0" leading="13" spaceBefore="6.0" spaceAfter="6.0"/>
<paraStyle name="Index" fontName="Times-Roman"/>
</stylesheet>
<story>
<blockTable colWidths="145.0,189.0,164.0" repeatRows="1" style="Table2">
<tr>
<td>
<para style="P1">
<font color="white"> </font>
</para>
</td>
<td>
<para style="P2">Budget Analysis</para>
</td>
<td>
<para style="P3">From [[ data['form']['date1'] ]]</para>
<para style="P3">to [[ data['form']['date2'] ]]</para>
</td>
</tr>
<tr>
<td>
<para style="P4">[[ company.name ]]</para>
</td>
<td>
<para style="P5">
<font color="white"> </font>
</para>
</td>
<td>
<para style="P3">Currency: <font face="Times-Roman" size="11.0">[[ company.currency_id.name ]]</font></para>
</td>
</tr>
</blockTable>
<para style="Standard">
<font color="white"> </font>
</para>
<para style="P6">Printing date: [[ time.strftime('%Y-%m-%d') ]] at [[ time.strftime('%H:%M:%S') ]]</para>
<para style="P6">
<font color="white"> </font>
</para>
<blockTable colWidths="104.0,53.0,60.0,72.0,73.0,63.0,73.0" repeatRows="1" style="Table5">
<tr>
<td>
<para style="P7">Budget item detail</para>
</td>
<td>
<para style="P7">Account Number</para>
</td>
<td>
<para style="P7">Budget</para>
<para style="P7">
<font color="white"> </font>
</para>
</td>
<td>
<para style="P7">Period Budget</para>
<para style="P7">
<font color="white"> </font>
</para>
</td>
<td>
<para style="P7">Performance</para>
</td>
<td>
<para style="P7">Spread</para>
</td>
<td>
<para style="P7">% performance</para>
</td>
</tr>
</blockTable>
<para style="P8">
<font color="white"> </font>
</para>
<section>
<para style="P8">[[ repeatIn(objects, 'o') ]]</para>
<blockTable colWidths="75.0,424.0" style="Table8">
<tr>
<td>
<para style="P9">[[ o.code ]]</para>
</td>
<td>
<para style="P10">[[ o.name ]]</para>
</td>
</tr>
</blockTable>
<blockTable colWidths="103.0,53.0,61.0,72.0,72.0,66.0,71.0" style="Table9">
<tr>
<td>
<para style="P11">
<font face="Times-Roman">[[ repeatIn(lines(o, data['form']['date1'], data['form']['date2']), 'a') ]] </font>
<font face="Times-Roman">[[ a['name'] ]]</font>
</para>
</td>
<td>
<para style="P12">[[ a['code'] ]]</para>
</td>
<td>
<para style="P13">
<font color="white"> </font>
</para>
</td>
<td>
<para style="P13">
<font color="white"> </font>
</para>
</td>
<td>
<para style="P14">[[ '%.2f' % a['achievements'] ]]</para>
</td>
<td>
<para style="P13">
<font color="white"> </font>
</para>
</td>
<td>
<para style="P13">
<font color="white"> </font>
</para>
</td>
</tr>
</blockTable>
<blockTable colWidths="156.0,61.0,72.0,72.0,66.0,70.0" style="Table10">
<tr>
<td>
<para style="P15">Total [[ o.code ]]</para>
<para style="Table Contents">[[ repeatIn( post_total(o, data['form']['date1'], data['form']['date2']), 'total') ]]</para>
</td>
<td>
<para style="P16">[[ '%.2f' % total['prev'] ]]</para>
</td>
<td>
<para style="P16">[[ '%.2f' % total['prev_period'] ]]</para>
</td>
<td>
<para style="P16">[[ '%.2f' % total['achievements'] ]]</para>
</td>
<td>
<para style="P16">[[ '%.2f' % (total['prev_period'] - total['achievements']) ]]</para>
</td>
<td>
<para style="P16">[[ total['prev_period'] and ('%.2f' % (total['achievements'] / total['prev_period'] * 100.0)) or 0.0]] %</para>
</td>
</tr>
</blockTable>
<para style="Standard">
<font color="white"> </font>
</para>
</section>
<blockTable colWidths="156.0,61.0,72.0,72.0,67.0,68.0" style="Table7">
<tr>
<td>
<para style="P17">Results</para>
<para style="Table Contents">[[ repeatIn( budget_total(objects, data['form']['date1'], data['form']['date2']), 'total') ]]</para>
</td>
<td>
<para style="P18">[[ '%.2f' % total['prev'] ]]</para>
</td>
<td>
<para style="P18">[[ '%.2f' % total['prev_period'] ]]</para>
</td>
<td>
<para style="P18">[[ '%.2f' % total['achievements'] ]]</para>
</td>
<td>
<para style="P18">[[ '%.2f' % (total['prev_period'] - total['achievements']) ]]</para>
</td>
<td>
<para style="P18">[[ '%.2f' % (total['achievements'] / total['prev_period'] * 100.0) ]] %</para>
</td>
</tr>
</blockTable>
<para style="Standard">
<font color="white"> </font>
</para>
</story>
</document>

View File

@ -1,3 +1,5 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_crossovered_budget,crossovered.budget,model_crossovered_budget,account.group_account_manager,1,1,1,1
access_crossovered_budget_lines,crossovered.budget.lines,model_crossovered_budget_lines,account.group_account_manager,1,1,1,1
"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
"access_crossovered_budget","crossovered.budget","model_crossovered_budget","account.group_account_manager",1,1,1,1
"access_crossovered_budget_lines","crossovered.budget.lines","model_crossovered_budget_lines","account.group_account_manager",1,1,1,1
"access_account_budget_post","account.budget.post","model_account_budget_post","account.group_account_manager",1,1,1,1
"access_account_budget_post_dotation","account.budget.post.dotation","model_account_budget_post_dotation","account.group_account_manager",1,1,1,1

1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_crossovered_budget crossovered.budget model_crossovered_budget account.group_account_manager 1 1 1 1
3 access_crossovered_budget_lines crossovered.budget.lines model_crossovered_budget_lines account.group_account_manager 1 1 1 1
4 access_account_budget_post account.budget.post model_account_budget_post account.group_account_manager 1 1 1 1
5 access_account_budget_post_dotation account.budget.post.dotation model_account_budget_post_dotation account.group_account_manager 1 1 1 1

View File

@ -2,5 +2,8 @@
import wizard_crossovered_budget_report
import wizard_analytic_account_budget
import wizard_crossovered_budget_summary_report
import wizard_budget_spread
import wizard_budget_report
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -0,0 +1,61 @@
# -*- encoding: utf-8 -*-
##############################################################################
#
# Copyright (c) 2004-2008 TINY SPRL. (http://tiny.be) All Rights Reserved.
#
# $Id$
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsability of assessing all potential
# consequences resulting from its eventual inadequacies and bugs
# End users who are looking for a ready-to-use solution with commercial
# garantees and support are strongly adviced to contract a Free Software
# Service Company
#
# This program is Free Software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
##############################################################################
import time
import wizard
dates_form = '''<?xml version="1.0"?>
<form string="Select period">
<field name="date1"/>
<field name="date2"/>
</form>'''
dates_fields = {
'date1': {'string':'Start of period', 'type':'date', 'required':True, 'default': lambda *a: time.strftime('%Y-01-01')},
'date2': {'string':'End of period', 'type':'date', 'required':True, 'default': lambda *a: time.strftime('%Y-%m-%d')},
}
class wizard_report(wizard.interface):
states = {
'init': {
'actions': [],
'result': {'type':'form', 'arch':dates_form, 'fields':dates_fields, 'state':[('end','Cancel'),('report','Print')]}
},
'report': {
'actions': [],
'result': {'type':'print', 'report':'account.budget', 'state':'end'}
}
}
wizard_report('account.budget.report')
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -0,0 +1,66 @@
# -*- encoding: utf-8 -*-
##############################################################################
#
# Copyright (c) 2004-2008 TINY SPRL. (http://tiny.be) All Rights Reserved.
#
# $Id$
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsability of assessing all potential
# consequences resulting from its eventual inadequacies and bugs
# End users who are looking for a ready-to-use solution with commercial
# garantees and support are strongly adviced to contract a Free Software
# Service Company
#
# This program is Free Software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
##############################################################################
import wizard
import netsvc
_spread_form = '''<?xml version="1.0"?>
<form string="Spread">
<field name="fiscalyear"/>
<field name="amount"/>
</form>'''
_spread_fields = {
'fiscalyear': {'string':'Fiscal Year', 'type':'many2one', 'relation':'account.fiscalyear', 'required':True},
'amount': {'string':'Amount', 'type':'float', 'digits':(16,2)},
}
class wizard_budget_spread(wizard.interface):
def _spread(self, cr, uid, data, context):
service = netsvc.LocalService("object_proxy")
form = data['form']
res = service.execute(cr.dbname, uid, 'account.budget.post', 'spread', data['ids'], form['fiscalyear'], form['amount'])
return {}
states = {
'init': {
'actions': [],
'result': {'type':'form', 'arch':_spread_form, 'fields':_spread_fields, 'state':[('end','Cancel'),('spread','Spread')]}
},
'spread': {
'actions': [_spread],
'result': {'type':'state', 'state':'end'}
}
}
wizard_budget_spread('account.budget.spread')
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: