[FIX] purchase report

bzr revid: fp@tinyerp.com-20100613090134-4hs79c7709pmhltr
This commit is contained in:
Fabien Pinckaers 2010-06-13 11:01:34 +02:00
parent 8dfe66803b
commit 1ff14e9ceb
4 changed files with 76 additions and 209 deletions

View File

@ -2,13 +2,13 @@
<openerp>
<data>
<menuitem icon="terp-graph" id="base.dashboard" name="Dashboards" sequence="2" parent="base.reporting_menu"/>
<menuitem icon="terp-graph" id="base.dashboard" name="Dashboards" sequence="2" parent="base.reporting_menu"/>
<menuitem
id="menu_purchase_deshboard"
name="Purchase"
parent="base.dashboard"/>
<record id="purchase_draft" model="ir.actions.act_window">
<record id="purchase_draft" model="ir.actions.act_window">
<field name="name">Draft Purchases</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">purchase.order</field>
@ -17,7 +17,7 @@
<field name="domain">[('date_order','&gt;',time.strftime('%Y-01-01 00:00:00')),('date_order','&lt;',time.strftime('%Y-12-31 23:59:59')), ('state','=','draft')]</field>
<field name="search_view_id" ref="purchase.purchase_order_tree"/>
</record>
<record id="purchase_waiting" model="ir.actions.act_window">
<record id="purchase_waiting" model="ir.actions.act_window">
<field name="name">Quotation Request</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">purchase.order</field>
@ -47,7 +47,7 @@
</field>
</record>
<record id="open_board_purchase" model="ir.actions.act_window">
<record id="open_board_purchase" model="ir.actions.act_window">
<field name="name">Purchase Dashboard</field>
<field name="res_model">board.board</field>
<field name="view_type">form</field>
@ -55,7 +55,7 @@
<field name="usage">menu</field>
<field name="view_id" ref="board_purchase_form"/>
</record>
<menuitem
<menuitem
action="open_board_purchase"
icon="terp-graph"
id="menu_board_purchase"

View File

@ -65,7 +65,6 @@ class purchase_order(osv.osv):
res[order.id]['amount_tax']=cur_obj.round(cr, uid, cur, val)
res[order.id]['amount_untaxed']=cur_obj.round(cr, uid, cur, val1)
res[order.id]['amount_total']=res[order.id]['amount_untaxed'] + res[order.id]['amount_tax']
print res
return res
def _set_minimum_planned_date(self, cr, uid, ids, name, value, arg, context):
@ -172,9 +171,11 @@ class purchase_order(osv.osv):
'invoice_id': fields.many2one('account.invoice', 'Invoice', readonly=True),
'picking_ids': fields.one2many('stock.picking', 'purchase_id', 'Picking List', readonly=True, help="This is the list of picking list that have been generated for this purchase"),
'shipped':fields.boolean('Received', readonly=True, select=True),
'shipped_rate': fields.function(_shipped_rate, method=True, string='Received', type='float'),
'shipped_rate': fields.function(_shipped_rate, method=True, string='Received', type='float',
store=True), # Improve the store=True or remove from report
'invoiced': fields.function(_invoiced, method=True, string='Invoiced & Paid', type='boolean'),
'invoiced_rate': fields.function(_invoiced_rate, method=True, string='Invoiced', type='float'),
'invoiced_rate': fields.function(_invoiced_rate, method=True, string='Invoiced', type='float',
store=True), # Improve the store=True or remove from report
'invoice_method': fields.selection([('manual','Manual'),('order','From Order'),('picking','From Picking')], 'Invoicing Control', required=True,
help="From Order: a draft invoice will be pre-generated based on the purchase order. The accountant " \
"will just have to validate this invoice for control.\n" \

View File

@ -31,7 +31,7 @@ class purchase_report(osv.osv):
_description = "Purchases Orders"
_auto = False
_columns = {
'date': fields.date('Date order', readonly=True),
'date': fields.date('Order Date', readonly=True),
'name': fields.char('Year',size=64,required=False, readonly=True),
'day': fields.char('Day', size=128, readonly=True),
'state': fields.selection([
@ -44,32 +44,26 @@ class purchase_report(osv.osv):
('done','Done'),
('cancel','Cancel')
], 'Order State', readonly=True),
'invoice_method': fields.selection([
('manual','Manual'),
('order','From Order'),
('picking','From Picking')
],'Invoicing Control', readonly=True),
'product_id':fields.many2one('product.product', 'Product', readonly=True),
'warehouse_id': fields.many2one('stock.warehouse', 'Warehouse', readonly=True),
'location_id': fields.many2one('stock.location', 'Destination', readonly=True),
'fiscal_position': fields.many2one('account.fiscal.position', 'Fiscal Position',readonly=True),
'partner_id':fields.many2one('res.partner', 'Partner', readonly=True),
'partner_address_id':fields.many2one('res.partner.address', 'Address Contact Name', readonly=True),
'dest_address_id':fields.many2one('res.partner.address', 'Dest. Address Contact Name',readonly=True),
'pricelist_id':fields.many2one('product.pricelist', 'Pricelist', readonly=True),
'date_approve':fields.date('Date Approved', readonly=True),
'expected_date':fields.date('Expected Date', readonly=True),
'validator' : fields.many2one('res.users', 'Validated by', readonly=True),
'validator' : fields.many2one('res.users', 'Validated By', readonly=True),
'company_id':fields.many2one('res.company', 'Company', readonly=True),
'shipped_qty':fields.integer('Received Qty', readonly=True),
'invoiced_qty':fields.integer('Invoiced Qty', readonly=True),
'user_id':fields.many2one('res.users', 'Responsible', readonly=True),
'delay':fields.float('Days to Close', digits=(16,2), readonly=True),
'delay_pass':fields.float('Overpassed expected', digits=(16,2), readonly=True),
'shipped_qty':fields.float('Received', digits=(16,2), readonly=True, group_operator='avg'),
'invoiced_qty':fields.float('Invoiced', digits=(16,2), readonly=True, group_operator='avg'),
'delay':fields.float('Days to Validate', digits=(16,2), readonly=True, group_operator="avg"),
'delay_pass':fields.float('Days to Deliver', digits=(16,2), readonly=True, group_operator="avg"),
'quantity': fields.float('# of Products', readonly=True),
'price_total': fields.float('Total Price', readonly=True),
'price_average': fields.float('Average Price', readonly=True),
'nbr': fields.integer('# of Ordered Lines', readonly=True),
'price_average': fields.float('Unit Price', readonly=True, group_operator="avg"),
'nbr': fields.integer('# of PO Lines', readonly=True),
'month':fields.selection([('01','January'), ('02','February'), ('03','March'), ('04','April'), ('05','May'), ('06','June'),
('07','July'), ('08','August'), ('09','September'), ('10','October'), ('11','November'), ('12','December')],'Month',readonly=True),
@ -94,17 +88,15 @@ class purchase_report(osv.osv):
s.validator,
s.warehouse_id as warehouse_id,
s.partner_id as partner_id,
s.fiscal_position,
s.create_uid as user_id,
s.company_id as company_id,
s.invoice_method,
s.shipped::integer as shipped_qty,
l.invoiced::integer as invoiced_qty,
avg(s.shipped_rate) as shipped_qty,
avg(s.invoiced_rate) as invoiced_qty,
l.product_id,
s.location_id as location_id,
sum(l.product_qty*u.factor) as quantity,
extract(epoch from age(s.date_approve,s.date_order))/(24*60*60)::decimal(16,2) as delay,
extract(epoch from age(s.minimum_planned_date,s.date_order))/(24*60*60)::decimal(16,2) as delay_pass,
extract(epoch from age(l.date_planned,s.date_order))/(24*60*60)::decimal(16,2) as delay_pass,
count(*) as nbr,
l.price_unit*l.product_qty*u.factor as price_total,
(sum(l.product_qty*l.price_unit)/sum(l.product_qty*u.factor))::decimal(16,2) as price_average
@ -115,15 +107,13 @@ class purchase_report(osv.osv):
group by
s.company_id,
s.create_uid,
s.shipped,
l.invoiced,
s.partner_id,
l.product_qty,
u.factor,
s.location_id,
l.price_unit,
s.date_approve,
s.minimum_planned_date,
l.date_planned,
date_trunc('day',s.minimum_planned_date),
s.partner_address_id,
s.pricelist_id,
@ -135,74 +125,8 @@ class purchase_report(osv.osv):
to_char(s.date_order, 'MM'),
to_char(s.date_order, 'YYYY-MM-DD'),
s.state,
s.warehouse_id,
s.fiscal_position,
s.invoice_method
s.warehouse_id
)
""")
purchase_report()
class purchase_order_qty_amount(osv.osv):
_name = "purchase.order.qty.amount"
_description = "Quantity and amount per month"
_auto = False
_columns = {
'month':fields.selection([('01','January'), ('02','February'), ('03','March'), ('04','April'), ('05','May'), ('06','June'),
('07','July'), ('08','August'), ('09','September'), ('10','October'), ('11','November'), ('12','December')],'Month',readonly=True),
'total_qty' : fields.float('Total Qty'),
'total_amount' : fields.float('Total Amount'),
}
def init(self, cr):
tools.sql.drop_view_if_exists(cr, 'purchase_order_qty_amount')
cr.execute("""
create or replace view purchase_order_qty_amount as (
select
min(id) as id,
to_char(create_date, 'MM') as month,
sum(product_qty) as total_qty,
sum(price_unit*product_qty) as total_amount
from
purchase_order_line
where
to_char(create_date,'YYYY') = to_char(current_date,'YYYY')
group by
to_char(create_date, 'MM')
)
""")
purchase_order_qty_amount()
class purchase_order_by_user(osv.osv):
_name = "purchase.order.by.user"
_description = "Purchase Order by user per month"
_auto = False
_columns = {
'name' : fields.char('User',size=64,required=True),
'month':fields.selection([('01','January'), ('02','February'), ('03','March'), ('04','April'), ('05','May'), ('06','June'),
('07','July'), ('08','August'), ('09','September'), ('10','October'), ('11','November'), ('12','December')],'Month',readonly=True),
'nbr' : fields.integer('Total Orders'),
}
_order = 'name desc'
def init(self, cr):
tools.sql.drop_view_if_exists(cr, 'purchase_order_by_user')
cr.execute("""
create or replace view purchase_order_by_user as (
select
min(po.id) as id,
rs.name as name,
count(po.id) as nbr,
to_char(po.date_order, 'MM') as month
from
purchase_order as po,res_users as rs
where
po.create_uid = rs.id
group by
rs.name,po.date_order
)
""")
purchase_order_by_user()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -8,7 +8,6 @@
<field name="arch" type="xml">
<graph string="Purchase Orders Statistics" type="bar">
<field name="product_id"/>
<field name="quantity" operator="+"/>
<field name="price_total" operator="+"/>
</graph>
</field>
@ -20,13 +19,13 @@
<field name="type">tree</field>
<field name="arch" type="xml">
<tree string="Purchase Orders Statistics">
<field name="date" invisible="1"/>
<field name="date_approve" invisible="1"/>
<field name="expected_date" invisible="1"/>
<field name="user_id" invisible="1"/>
<field name="partner_id" invisible="1"/>
<field name="date" invisible="1"/>
<field name="date_approve" invisible="1"/>
<field name="expected_date" invisible="1"/>
<field name="user_id" invisible="1"/>
<field name="partner_id" invisible="1"/>
<field name="product_id" invisible="1"/>
<field name="day" invisible="1"/>
<field name="day" invisible="1"/>
<field name="name" invisible="1"/>
<field name="month" invisible="1"/>
<field name="warehouse_id" invisible="1"/>
@ -34,14 +33,14 @@
<field name="company_id" invisible="1"/>
<field name="state" invisible="1"/>
<field name="location_id" invisible="1"/>
<field name="nbr" sum="# of Lines"/>
<field name="shipped_qty" sum="# of received"/>
<field name="invoiced_qty" sum="# of invoiced"/>
<field name="quantity" sum="# Qty"/>
<field name="nbr"/>
<field name="shipped_qty" widget="progressbar"/>
<field name="invoiced_qty" widget="progressbar"/>
<field name="quantity" sum="# of Products"/>
<field name="price_average" avg="Average Price"/>
<field name="price_total" sum="Total Price"/>
<field name="delay" sum="# Days to close"/>
<field name="delay_pass" sum="Total Price"/>
<field name="price_total" sum="Total Price"/>
<field name="delay"/>
<field name="delay_pass"/>
</tree>
</field>
</record>
@ -53,65 +52,56 @@
<field name="arch" type="xml">
<search string="Purchase Orders">
<group colspan="10" col="12">
<filter icon="terp-purchase" string="This Year"
domain="[('date','&lt;=', time.strftime('%%Y-%%m-%%d')),('date','&gt;',(datetime.date.today()-datetime.timedelta(days=365)).strftime('%%Y-%%m-%%d'))]"
help="Tasks performed in this year"/>
<filter icon="terp-purchase" string="This Year"
domain="[('date','&lt;=', time.strftime('%%Y-%%m-%%d')),('date','&gt;',(datetime.date.today()-datetime.timedelta(days=365)).strftime('%%Y-%%m-%%d'))]"
help="Tasks performed in this year"/>
<filter icon="terp-purchase" string="This Month"
name="month"
domain="[('date','&lt;=', time.strftime('%%Y-%%m-%%d')), ('date','&gt;',(datetime.date.today()-datetime.timedelta(days=30)).strftime('%%Y-%%m-%%d'))]"
help="Tasks performed in this month"/>
name="month"
domain="[('date','&lt;=', time.strftime('%%Y-%%m-%%d')), ('date','&gt;',(datetime.date.today()-datetime.timedelta(days=30)).strftime('%%Y-%%m-%%d'))]"
help="Tasks performed in this month"/>
<filter icon="gtk-media-rewind"
string=" 7 Days "
string="7 Days"
separator="1"
domain="[('date','&lt;=', time.strftime('%%Y-%%m-%%d')), ('date','&gt;',(datetime.date.today()-datetime.timedelta(days=7)).strftime('%%Y-%%m-%%d'))]"
help="Tasks during last 7 days"/>
<separator orientation="vertical"/>
<filter icon="terp-purchase"
string="Quotations"
domain="[('state','=','draft')]"/>
string="Quotations"
name="quotes"
domain="[('state','=','draft')]"/>
<filter icon="terp-purchase"
string="Waiting Schedule"
domain="[('state','=','waiting_date')]"/>
<filter icon="terp-purchase"
string="Manual in progress"
domain="[('state','=','manual')]"/>
<filter icon="terp-purchase" string="Done" domain="[('state','=','done')]"/>
string="Orders"
name="orders"
domain="[('state','&lt;&gt;','draft'),('state','&lt;&gt;','cancel')]"/>
<separator orientation="vertical"/>
<field name="partner_id" string="Supplier"/>
<field name="partner_id"/>
<field name="product_id"/>
<field name="user_id" widget="selection">
<filter icon="terp-purchase"
string="Purchase Non User"
help="Purchase Non User"
domain="[('user_id','=',False)]"/>
</field>
</group>
<newline/>
<field name="user_id"/>
<field name="company_id" groups="base.group_multi_company"/>
</group>
<newline/>
<group expand="1" string="Group By..." colspan="10" col="12">
<filter string="Supplier" name="group_partner_id" icon="terp-purchase" context="{'group_by':'partner_id'}"/>
<filter string="Product" name="group_product_id" icon="terp-purchase" context="{'group_by':'product_id'}"/>
<separator orientation="vertical"/>
<filter string="Responsible" name="Responsible" icon="terp-purchase" context="{'group_by':'user_id'}"/>
<filter string="Supplier" name="partner_id" icon="terp-purchase" context="{'group_by':'partner_id'}"/>
<filter string="Validated by" icon="terp-purchase" context="{'group_by':'validator'}"/>
<separator orientation="vertical"/>
<filter string="Product" icon="terp-purchase" context="{'group_by':'product_id'}"/>
<separator orientation="vertical"/>
<filter string="State" icon="terp-purchase" context="{'group_by':'state'}"/>
<separator orientation="vertical"/>
<filter string="Company" icon="terp-purchase" context="{'group_by':'company_id'}" groups="base.group_multi_company"/>
<filter string="Warehouse" icon="terp-purchase" context="{'group_by':'warehouse_id'}"/>
<filter string="Destination" icon="terp-purchase" context="{'group_by':'location_id'}"/>
<filter string="Company" icon="terp-purchase" context="{'group_by':'company_id'}" groups="base.group_multi_company"/>
<separator orientation="vertical"/>
<filter string="State" icon="terp-purchase" context="{'group_by':'state'}"/>
<filter string="Day" icon="terp-purchase" context="{'group_by':'day'}"/>
<filter string="Month" icon="terp-purchase" context="{'group_by':'month'}"/>
<filter string="Year" icon="terp-purchase" context="{'group_by':'name'}"/>
</group>
<newline/>
<newline/>
<group expand="0" string="Extended filters..." colspan="10" col="12" groups="base.group_extended">
<field name="date"/>
<field name="date_approve"/>
<field name="expected_date"/>
<newline/>
<field name="invoice_method"/>
<field name="warehouse_id" widget="selection"/>
<field name="validator" widget="selection"/>
<separator orientation="vertical"/>
@ -127,77 +117,29 @@
<field name="res_model">purchase.report</field>
<field name="view_type">form</field>
<field name="view_mode">tree,graph</field>
<field name="search_view_id" ref="view_purchase_order_search"/>
<field name="context">{'search_default_month':1,'search_default_Responsible':1,'group_by_no_leaf':1,'group_by':[]}</field>
<field name="context">{'search_default_month':1,'search_default_group_partner_id':1,'search_default_group_product_id': 1, 'search_default_orders': 1, 'group_by_no_leaf':1,'group_by':[]}</field>
</record>
<menuitem id="base.next_id_73" name="Reporting" parent="base.menu_purchase_root" sequence="8"/>
<menuitem action="action_purchase_order_report_all" id="menu_action_purchase_order_report_all" parent="base.next_id_73" sequence="3"/>
<record model="ir.ui.view" id="view_purchase_order_qty_amount_graph">
<field name="name">purchase.order.qty.amount.graph</field>
<field name="model">purchase.order.qty.amount</field>
<field name="type">graph</field>
<field name="arch" type="xml">
<graph string="Total Qty and Amount by month" type="bar">
<field name="month"/>
<field name="total_qty" operator="+"/>
<field name="total_amount" operator="+"/>
</graph>
</field>
</record>
<record id="action_purchase_order_qty_amount_all" model="ir.actions.act_window">
<field name="name">Purchase Orders by Month</field>
<field name="res_model">purchase.report</field>
<field name="view_type">form</field>
<field name="view_mode">graph,tree</field>
<field name="context">{'group_by_no_leaf': 1, 'group_by': ['month']}</field>
<field name="domain">[('date','>=',time.strftime('%Y-01-01'))]</field>
</record>
<record model="ir.ui.view" id="view_purchase_order_qty_amount_tree">
<field name="name">purchase.order.qty.amount.tree</field>
<field name="model">purchase.order.qty.amount</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree string="Total Qty and Amount by month" >
<field name="month"/>
<field name="total_qty" />
<field name="total_amount"/>
</tree>
</field>
</record>
<record id="action_purchase_order_by_user_all" model="ir.actions.act_window">
<field name="name">Purchase Orders by Supplier</field>
<field name="res_model">purchase.report</field>
<field name="view_type">form</field>
<field name="view_mode">graph,tree</field>
<field name="context">{'group_by_no_leaf': 1, 'group_by': ['partner_id']}</field>
<field name="domain">[('date','>=',time.strftime('%Y-01-01'))]</field>
</record>
<record id="action_purchase_order_qty_amount_all" model="ir.actions.act_window">
<field name="name">Total Qty and Amount by month</field>
<field name="res_model">purchase.order.qty.amount</field>
<field name="view_type">form</field>
<field name="view_mode">graph,tree</field>
</record>
<record model="ir.ui.view" id="view_purchase_order_by_user_graph">
<field name="name">purchase.order.by.user.graph</field>
<field name="model">purchase.order.by.user</field>
<field name="type">graph</field>
<field name="arch" type="xml">
<graph string="Total Orders by User per month" type="bar">
<field name="name" />
<field name="month" group="True" />
<field name="nbr" operator="+"/>
</graph>
</field>
</record>
<record model="ir.ui.view" id="view_purchase_order_by_user_tree">
<field name="name">purchase.order.by.user.tree</field>
<field name="model">purchase.order.by.user</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree string="Total Orders by User per month" >
<field name="name"/>
<field name="month"/>
<field name="nbr" />
</tree>
</field>
</record>
<record id="action_purchase_order_by_user_all" model="ir.actions.act_window">
<field name="name">Total Orders by User per month</field>
<field name="res_model">purchase.order.by.user</field>
<field name="view_type">form</field>
<field name="view_mode">graph,tree</field>
</record>
</data>
</openerp>