[FIX] correct various date issues in reporting
[odoo/odoo.git] / addons / membership / report / report_membership.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 from openerp import tools
24 import openerp.addons.decimal_precision as dp
25
26 STATE = [
27     ('none', 'Non Member'),
28     ('canceled', 'Cancelled Member'),
29     ('old', 'Old Member'),
30     ('waiting', 'Waiting Member'),
31     ('invoiced', 'Invoiced Member'),
32     ('free', 'Free Member'),
33     ('paid', 'Paid Member'),
34 ]
35
36 class report_membership(osv.osv):
37     '''Membership Analysis'''
38
39     _name = 'report.membership'
40     _description = __doc__
41     _auto = False
42     _rec_name = 'start_date'
43     _columns = {
44         'start_date': fields.date('Start Date', readonly=True),
45         'date_to': fields.date('End Date', readonly=True, help="End membership date"),
46         'num_waiting': fields.integer('# Waiting', readonly=True),
47         'num_invoiced': fields.integer('# Invoiced', readonly=True),
48         'num_paid': fields.integer('# Paid', readonly=True),
49         'tot_pending': fields.float('Pending Amount', digits_compute= dp.get_precision('Account'), readonly=True),
50         'tot_earned': fields.float('Earned Amount', digits_compute= dp.get_precision('Account'), readonly=True),
51         'partner_id': fields.many2one('res.partner', 'Member', readonly=True),
52         'associate_member_id': fields.many2one('res.partner', 'Associate Member', readonly=True),
53         'membership_id': fields.many2one('product.product', 'Membership Product', readonly=True),
54         'membership_state': fields.selection(STATE, 'Current Membership State', readonly=True),
55         'user_id': fields.many2one('res.users', 'Salesperson', readonly=True),
56         'company_id': fields.many2one('res.company', 'Company', readonly=True)
57         }
58
59     def init(self, cr):
60         '''Create the view'''
61         tools.drop_view_if_exists(cr, 'report_membership')
62         cr.execute("""
63         CREATE OR REPLACE VIEW report_membership AS (
64         SELECT
65         MIN(id) AS id,
66         partner_id,
67         user_id,
68         membership_state,
69         associate_member_id,
70         membership_amount,
71         date_to,
72         start_date,
73         COUNT(num_waiting) AS num_waiting,
74         COUNT(num_invoiced) AS num_invoiced,
75         COUNT(num_paid) AS num_paid,
76         SUM(tot_pending) AS tot_pending,
77         SUM(tot_earned) AS tot_earned,
78         membership_id,
79         company_id
80         FROM
81         (SELECT
82             MIN(p.id) AS id,
83             p.id AS partner_id,
84             p.user_id AS user_id,
85             p.membership_state AS membership_state,
86             p.associate_member AS associate_member_id,
87             p.membership_amount AS membership_amount,
88             p.membership_stop AS date_to,
89             p.membership_start AS start_date,
90             CASE WHEN ml.state = 'waiting'  THEN ml.id END AS num_waiting,
91             CASE WHEN ml.state = 'invoiced' THEN ml.id END AS num_invoiced,
92             CASE WHEN ml.state = 'paid'     THEN ml.id END AS num_paid,
93             CASE WHEN ml.state IN ('waiting', 'invoiced') THEN SUM(il.price_subtotal) ELSE 0 END AS tot_pending,
94             CASE WHEN ml.state = 'paid' OR p.membership_state = 'old' THEN SUM(il.price_subtotal) ELSE 0 END AS tot_earned,
95             ml.membership_id AS membership_id,
96             p.company_id AS company_id
97             FROM res_partner p
98             LEFT JOIN membership_membership_line ml ON (ml.partner = p.id)
99             LEFT JOIN account_invoice_line il ON (ml.account_invoice_line = il.id)
100             LEFT JOIN account_invoice ai ON (il.invoice_id = ai.id)
101             WHERE p.membership_state != 'none' and p.active = 'true'
102             GROUP BY
103               p.id,
104               p.user_id,
105               p.membership_state,
106               p.associate_member,
107               p.membership_amount,
108               p.membership_start,
109               ml.membership_id,
110               p.company_id,
111               ml.state,
112               ml.id
113         ) AS foo
114         GROUP BY
115             start_date,
116             date_to,
117             partner_id,
118             user_id,
119             membership_id,
120             company_id,
121             membership_state,
122             associate_member_id,
123             membership_amount
124         )""")
125
126
127 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: