[FIX] stock: use correct vals in grouped invoice (opw 606535)
[odoo/odoo.git] / addons / point_of_sale / report / pos_report.py
1 # -*- coding: utf-8 -*-
2 ##############################################################################
3 #
4 #    OpenERP, Open Source Management Solution
5 #    Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
6 #
7 #    This program is free software: you can redistribute it and/or modify
8 #    it under the terms of the GNU Affero General Public License as
9 #    published by the Free Software Foundation, either version 3 of the
10 #    License, or (at your option) any later version.
11 #
12 #    This program is distributed in the hope that it will be useful,
13 #    but WITHOUT ANY WARRANTY; without even the implied warranty of
14 #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 #    GNU Affero General Public License for more details.
16 #
17 #    You should have received a copy of the GNU Affero General Public License
18 #    along with this program.  If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##############################################################################
21
22 from openerp.osv import fields, osv
23 import time
24 from openerp import netsvc
25 from openerp import tools
26
27 class report_transaction_pos(osv.osv):
28     _name = "report.transaction.pos"
29     _description = "transaction for the pos"
30     _auto = False
31     _columns = {
32         'date_create': fields.char('Date', size=16, readonly=True),
33         'journal_id': fields.many2one('account.journal', 'Sales Journal', readonly=True),
34         'jl_id': fields.many2one('account.journal', 'Cash Journals', readonly=True),
35         'user_id': fields.many2one('res.users', 'User', readonly=True),
36         'no_trans': fields.float('Number of Transaction', readonly=True),
37         'amount': fields.float('Amount', readonly=True),
38         'invoice_id': fields.float('Nbr Invoice', readonly=True),
39         'invoice_am': fields.float('Invoice Amount', readonly=True),
40         'product_nb': fields.float('Product Nb.', readonly=True),
41         'disc': fields.float('Disc.', readonly=True),
42     }
43
44     def init(self, cr):
45         tools.drop_view_if_exists(cr, 'report_transaction_pos')
46         cr.execute("""
47             create or replace view report_transaction_pos as (
48                select
49                     min(absl.id) as id,
50                     count(absl.id) as no_trans,
51                     sum(absl.amount) as amount,
52                     sum((100.0-line.discount) * line.price_unit * line.qty / 100.0) as disc,
53                     to_char(date_trunc('day',absl.create_date),'YYYY-MM-DD')::text as date_create,
54                     po.user_id as user_id,
55                     po.sale_journal as journal_id,
56                     abs.journal_id as jl_id,
57                     count(po.invoice_id) as invoice_id,
58                     count(p.id) as product_nb
59                 from
60                     account_bank_statement_line as absl,
61                     account_bank_statement as abs,
62                     product_product as p,
63                     pos_order_line as line,
64                     pos_order as po
65                 where
66                     absl.pos_statement_id = po.id and
67                     line.order_id=po.id and
68                     line.product_id=p.id and
69                     absl.statement_id=abs.id
70
71                 group by
72                     po.user_id,po.sale_journal, abs.journal_id,
73                     to_char(date_trunc('day',absl.create_date),'YYYY-MM-DD')::text
74                 )
75         """)
76                     #to_char(date_trunc('day',absl.create_date),'YYYY-MM-DD')
77                     #to_char(date_trunc('day',absl.create_date),'YYYY-MM-DD')::text as date_create,
78 report_transaction_pos()
79
80 class report_sales_by_user_pos(osv.osv):
81     _name = "report.sales.by.user.pos"
82     _description = "Sales by user"
83     _auto = False
84     _columns = {
85         'date_order': fields.date('Order Date',required=True, select=True),
86         'amount': fields.float('Total', readonly=True, select=True),
87         'qty': fields.float('Quantity', readonly=True, select=True),
88         'user_id': fields.many2one('res.users', 'User', readonly=True, select=True),
89     }
90
91     def init(self, cr):
92         tools.drop_view_if_exists(cr, 'report_sales_by_user_pos')
93         cr.execute("""
94             create or replace view report_sales_by_user_pos as (
95                 select
96                     min(po.id) as id,
97                     to_char(date_trunc('day',po.date_order),'YYYY-MM-DD')::text as date_order,
98                     po.user_id as user_id,
99                     sum(pol.qty)as qty,
100                     sum((pol.price_unit * pol.qty * (1 - (pol.discount) / 100.0))) as amount
101                 from
102                     pos_order as po,pos_order_line as pol,product_product as pp,product_template as pt
103                 where
104                     pt.id=pp.product_tmpl_id and pp.id=pol.product_id and po.id = pol.order_id
105                group by
106                     to_char(date_trunc('day',po.date_order),'YYYY-MM-DD')::text,
107                     po.user_id
108
109                 )
110         """)
111 report_sales_by_user_pos()
112
113 class report_sales_by_user_pos_month(osv.osv):
114     _name = "report.sales.by.user.pos.month"
115     _description = "Sales by user monthly"
116     _auto = False
117     _columns = {
118         'date_order': fields.date('Order Date',required=True, select=True),
119         'amount': fields.float('Total', readonly=True, select=True),
120         'qty': fields.float('Quantity', readonly=True, select=True),
121         'user_id': fields.many2one('res.users', 'User', readonly=True, select=True),
122     }
123
124     def init(self, cr):
125         tools.drop_view_if_exists(cr, 'report_sales_by_user_pos_month')
126         cr.execute("""
127             create or replace view report_sales_by_user_pos_month as (
128                 select
129                     min(po.id) as id,
130                     to_char(date_trunc('month',po.date_order),'YYYY-MM-DD')::text as date_order,
131                     po.user_id as user_id,
132                     sum(pol.qty)as qty,
133                     sum((pol.price_unit * pol.qty * (1 - (pol.discount) / 100.0))) as amount
134                 from
135                     pos_order as po,pos_order_line as pol,product_product as pp,product_template as pt
136                 where
137                     pt.id=pp.product_tmpl_id and pp.id=pol.product_id and po.id = pol.order_id
138                group by
139                     to_char(date_trunc('month',po.date_order),'YYYY-MM-DD')::text,
140                     po.user_id
141
142                 )
143         """)
144 report_sales_by_user_pos_month()
145
146 class report_sales_by_margin_pos(osv.osv):
147     _name = "report.sales.by.margin.pos"
148     _description = "Sales by margin"
149     _auto = False
150     _columns = {
151         'product_name':fields.char('Product Name', size=64, readonly=True),
152         'date_order': fields.date('Order Date',required=True, select=True),
153         'user_id': fields.many2one('res.users', 'User', readonly=True, select=True),
154         'qty': fields.float('Qty', readonly=True, select=True),
155         'net_margin_per_qty':fields.float('Net margin per Qty', readonly=True, select=True),
156         'total':fields.float('Margin', readonly=True, select=True),
157
158     }
159
160     def init(self, cr):
161         tools.drop_view_if_exists(cr, 'report_sales_by_margin_pos')
162         cr.execute("""
163             create or replace view report_sales_by_margin_pos as (
164                 select
165                     min(pol.id) as id,
166                     po.user_id as user_id,
167                     pt.name as product_name,
168                     to_char(date_trunc('day',po.date_order),'YYYY-MM-DD')::text as date_order,
169                     sum(pol.qty) as qty,
170                     pt.list_price-pt.standard_price as net_margin_per_qty,
171                     (pt.list_price-pt.standard_price) *sum(pol.qty) as total
172                 from
173                     product_template as pt,
174                     product_product as pp,
175                     pos_order_line as pol,
176                     pos_order as po
177                 where
178                     pol.product_id = pp.product_tmpl_id and
179                     pp.product_tmpl_id = pt.id and
180                     po.id = pol.order_id
181
182                 group by
183                     pt.name,
184                     pt.list_price,
185                     pt.standard_price,
186                     po.user_id,
187                     to_char(date_trunc('day',po.date_order),'YYYY-MM-DD')::text
188
189                 )
190         """)
191 report_sales_by_margin_pos()
192
193 class report_sales_by_margin_pos_month(osv.osv):
194     _name = "report.sales.by.margin.pos.month"
195     _description = "Sales by margin monthly"
196     _auto = False
197     _columns = {
198         'product_name':fields.char('Product Name', size=64, readonly=True),
199         'date_order': fields.date('Order Date',required=True, select=True),
200         'user_id': fields.many2one('res.users', 'User', readonly=True, select=True),
201         'qty': fields.float('Qty', readonly=True, select=True),
202         'net_margin_per_qty':fields.float('Net margin per Qty', readonly=True, select=True),
203         'total':fields.float('Margin', readonly=True, select=True),
204     }
205
206     def init(self, cr):
207         tools.drop_view_if_exists(cr, 'report_sales_by_margin_pos_month')
208         cr.execute("""
209             create or replace view report_sales_by_margin_pos_month as (
210                 select
211                     min(pol.id) as id,
212                     po.user_id as user_id,
213                     pt.name as product_name,
214                     to_char(date_trunc('month',po.date_order),'YYYY-MM-DD')::text as date_order,
215                     sum(pol.qty) as qty,
216                     pt.list_price-pt.standard_price as net_margin_per_qty,
217                     (pt.list_price-pt.standard_price) *sum(pol.qty) as total
218                 from
219                     product_template as pt,
220                     product_product as pp,
221                     pos_order_line as pol,
222                     pos_order as po
223                 where
224                     pol.product_id = pp.product_tmpl_id and
225                     pp.product_tmpl_id = pt.id and
226                     po.id = pol.order_id
227
228                 group by
229                     pt.name,
230                     pt.list_price,
231                     pt.standard_price,
232                     po.user_id,
233                     to_char(date_trunc('month',po.date_order),'YYYY-MM-DD')::text
234
235                 )
236         """)
237 report_sales_by_margin_pos_month()
238
239 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: