[FIX] Schedule jobs even if their next time has passed.
[odoo/odoo.git] / addons / report_sale / report_sale.py
1 # -*- encoding: utf-8 -*-
2 ##############################################################################
3 #
4 #    OpenERP, Open Source Management Solution   
5 #    Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
6 #    $Id$
7 #
8 #    This program is free software: you can redistribute it and/or modify
9 #    it under the terms of the GNU General Public License as published by
10 #    the Free Software Foundation, either version 3 of the License, or
11 #    (at your option) any later version.
12 #
13 #    This program is distributed in the hope that it will be useful,
14 #    but WITHOUT ANY WARRANTY; without even the implied warranty of
15 #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 #    GNU General Public License for more details.
17 #
18 #    You should have received a copy of the GNU General Public License
19 #    along with this program.  If not, see <http://www.gnu.org/licenses/>.
20 #
21 ##############################################################################
22
23 from osv import fields,osv
24
25 class report_sale_order_product(osv.osv):
26     _name = "report.sale.order.product"
27     _description = "Sales Orders by Products"
28     _auto = False
29     _columns = {
30         'name': fields.date('Month', readonly=True),
31         'state': fields.selection([
32             ('draft','Quotation'),
33             ('waiting_date','Waiting Schedule'),
34             ('manual','Manual in progress'),
35             ('progress','In progress'),
36             ('shipping_except','Shipping Exception'),
37             ('invoice_except','Invoice Exception'),
38             ('done','Done'),
39             ('cancel','Cancel')
40         ], 'Order State', readonly=True),
41         'product_id':fields.many2one('product.product', 'Product', readonly=True),
42         'quantity': fields.float('# of Products', readonly=True),
43         'price_total': fields.float('Total Price', readonly=True),
44         'price_average': fields.float('Average Price', readonly=True),
45         'count': fields.integer('# of Lines', readonly=True),
46     }
47     _order = 'name desc,price_total desc'
48     def init(self, cr):
49         cr.execute("""
50             create or replace view report_sale_order_product as (
51                 select
52                     min(l.id) as id,
53                     to_char(s.date_order, 'YYYY-MM-01') as name,
54                     s.state,
55                     l.product_id,
56                     sum(l.product_uom_qty*u.factor) as quantity,
57                     count(*),
58                     sum(l.product_uom_qty*l.price_unit) as price_total,
59                     (sum(l.product_uom_qty*l.price_unit)/sum(l.product_uom_qty*u.factor))::decimal(16,2) as price_average
60                 from sale_order s
61                     right join sale_order_line l on (s.id=l.order_id)
62                     left join product_uom u on (u.id=l.product_uom)
63                 where l.product_uom_qty != 0
64                 group by l.product_id, to_char(s.date_order, 'YYYY-MM-01'),s.state
65             )
66         """)
67 report_sale_order_product()
68
69 class report_sale_order_category(osv.osv):
70     _name = "report.sale.order.category"
71     _description = "Sales Orders by Categories"
72     _auto = False
73     _columns = {
74         'name': fields.date('Month', readonly=True),
75         'state': fields.selection([
76             ('draft','Quotation'),
77             ('waiting_date','Waiting Schedule'),
78             ('manual','Manual in progress'),
79             ('progress','In progress'),
80             ('shipping_except','Shipping Exception'),
81             ('invoice_except','Invoice Exception'),
82             ('done','Done'),
83             ('cancel','Cancel')
84         ], 'Order State', readonly=True),
85         'category_id': fields.many2one('product.category', 'Categories', readonly=True),
86         'quantity': fields.float('# of Products', readonly=True),
87         'price_total': fields.float('Total Price', readonly=True),
88         'price_average': fields.float('Average Price', readonly=True),
89         'count': fields.integer('# of Lines', readonly=True),
90     }
91     _order = 'name desc,price_total desc'
92     def init(self, cr):
93         cr.execute("""
94             create or replace view report_sale_order_category as (
95                 select
96                     min(l.id) as id,
97                     to_char(s.date_order, 'YYYY-MM-01') as name,
98                     s.state,
99                     t.categ_id as category_id,
100                     sum(l.product_uom_qty*u.factor) as quantity,
101                     count(*),
102                     sum(l.product_uom_qty*l.price_unit) as price_total,
103                     (sum(l.product_uom_qty*l.price_unit)/sum(l.product_uom_qty*u.factor))::decimal(16,2) as price_average
104                 from sale_order s
105                     right join sale_order_line l on (s.id=l.order_id)
106                     left join product_product p on (p.id=l.product_id)
107                     left join product_template t on (t.id=p.product_tmpl_id)
108                     left join product_uom u on (u.id=l.product_uom)
109                 where l.product_uom_qty != 0    
110                 group by t.categ_id, to_char(s.date_order, 'YYYY-MM-01'),s.state
111             )
112         """)
113 report_sale_order_category()
114
115 class report_turnover_per_month(osv.osv):
116     _name = "report.turnover.per.month"
117     _description = "Turnover Per Month"
118     _auto = False
119     _columns = {
120         'name': fields.date('Month', readonly=True),
121         'turnover': fields.float('Total Turnover', readonly=True),
122     }
123     
124     def init(self, cr):
125         cr.execute("""
126             create or replace view report_turnover_per_month as (
127                 select min(am.id) as id, sum(credit) as turnover,to_char(am.date, 'YYYY-MM-01') as name from account_move_line am
128                     where am.account_id in (select distinct(account_id) from account_invoice_line) 
129                     and 
130                     am.move_id in(select distinct(aw.move_id) from account_invoice aw,account_invoice_line l where l.invoice_id=aw.id)
131                     group by to_char(am.date, 'YYYY-MM-01')
132             )
133         """)
134 report_turnover_per_month()
135
136 class report_turnover_per_product(osv.osv):
137     _name = "report.turnover.per.product"
138     _description = "Turnover Per Product"
139     _auto = False
140     _rec_name = 'product_id'
141     
142     _columns = {
143         'product_id': fields.many2one('product.product','Product', readonly=True),
144         'turnover': fields.float('Total Turnover', readonly=True),
145     }
146     
147     def init(self, cr):
148         cr.execute("""
149             create or replace view report_turnover_per_product as (
150                 select min(am.id) as id, sum(credit) as turnover,am.product_id as product_id 
151                 from account_move_line am                    
152                 group by am.product_id
153             )
154         """)
155 report_turnover_per_product()
156
157 class report_sale_order_created(osv.osv):
158     _name = "report.sale.order.created"
159     _description = "Report of Created Sale Order"
160     _auto = False
161     _columns = {
162         'date_order':fields.date('Date Ordered', readonly=True),
163         'name': fields.char('Order Reference', size=64, readonly=True),
164         'partner_id':fields.many2one('res.partner', 'Customer', readonly=True),
165         'partner_shipping_id':fields.many2one('res.partner.address', 'Shipping Address', readonly=True),
166         'amount_untaxed': fields.float('Untaxed Amount', readonly=True),
167         'state': fields.selection([
168             ('draft','Quotation'),
169             ('waiting_date','Waiting Schedule'),
170             ('manual','Manual In Progress'),
171             ('progress','In Progress'),
172             ('shipping_except','Shipping Exception'),
173             ('invoice_except','Invoice Exception'),
174             ('done','Done'),
175             ('cancel','Cancel')
176             ], 'Order State', readonly=True),
177         'create_date' : fields.datetime('Create Date', readolnly=True)
178     }
179     _order = 'create_date'
180     
181     def init(self, cr):
182         cr.execute("""create or replace view report_sale_order_created as (
183             select
184                 sale.id as id, sale.date_order as date_order, sale.name as name,
185                 sale.partner_id as partner_id, 
186                 sale.partner_shipping_id as partner_shipping_id,
187                 sale.amount_untaxed as amount_untaxed, sale.state as state,
188                 sale.create_date as create_date
189             from
190                 sale_order sale
191             where
192                 (to_date(to_char(sale.create_date, 'YYYY-MM-dd'),'YYYY-MM-dd') <= CURRENT_DATE)
193                 AND
194                 (to_date(to_char(sale.create_date, 'YYYY-MM-dd'),'YYYY-MM-dd') > (CURRENT_DATE-15))
195             )""")
196 report_sale_order_created()
197
198 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
199