From 9e41a89fb8424945d080712e76aa6b371997f8ea Mon Sep 17 00:00:00 2001 From: "qdp-launchpad@tinyerp.com" <> Date: Tue, 5 Oct 2010 12:49:59 +0200 Subject: [PATCH] [IMP] membership: membership analysis + overall improvement bzr revid: qdp-launchpad@tinyerp.com-20101005104959-qb8niv56nm2bdopc --- addons/membership/membership.py | 5 +- addons/membership/report/report_membership.py | 139 +++++++++--------- .../report/report_membership_view.xml | 47 +++--- 3 files changed, 105 insertions(+), 86 deletions(-) diff --git a/addons/membership/membership.py b/addons/membership/membership.py index 7bb84ef9ebb..1e92d3c619b 100644 --- a/addons/membership/membership.py +++ b/addons/membership/membership.py @@ -125,7 +125,7 @@ class membership_line(osv.osv): _name = 'membership.membership_line' _columns = { 'partner': fields.many2one('res.partner', 'Partner', ondelete='cascade', select=1), - 'membership_id': fields.many2one('product.product', string="Membership", required=True), + 'membership_id': fields.many2one('product.product', string="Membership Product", required=True), 'date_from': fields.date('From', readonly=True), 'date_to': fields.date('To', readonly=True), 'date_cancel' : fields.date('Cancel date'), @@ -133,7 +133,8 @@ class membership_line(osv.osv): 'member_price':fields.float('Member Price', digits_compute= dp.get_precision('Sale Price'), required=True), 'account_invoice_line': fields.many2one('account.invoice.line', 'Account Invoice line', readonly=True), 'account_invoice_id': fields.related('account_invoice_line', 'invoice_id', type='many2one', relation='account.invoice', string='Invoice', readonly=True), - 'state': fields.function(_state, method=True, string='State', type='selection', selection=STATE), + 'state': fields.function(_state, method=True, string='Membership State', type='selection', selection=STATE, store=True), + 'company_id': fields.related('account_invoice_line', 'invoice_id', 'company_id', type="many2one", relation="res.company", string="Company", readonly=True, store=True) } _rec_name = 'partner' _order = 'id desc' diff --git a/addons/membership/report/report_membership.py b/addons/membership/report/report_membership.py index 1bfdce82404..c4d31354840 100644 --- a/addons/membership/report/report_membership.py +++ b/addons/membership/report/report_membership.py @@ -21,6 +21,18 @@ from osv import fields, osv import tools +import decimal_precision as dp + + +STATE = [ + ('none', 'Non Member'), + ('canceled', 'Cancelled Member'), + ('old', 'Old Member'), + ('waiting', 'Waiting Member'), + ('invoiced', 'Invoiced Member'), + ('free', 'Free Member'), + ('paid', 'Paid Member'), +] class report_membership(osv.osv): @@ -38,27 +50,21 @@ class report_membership(osv.osv): ('07', 'July'), ('08', 'August'),\ ('09', 'September'), ('10', 'October'),\ ('11', 'November'), ('12', 'December')], 'Month', readonly=True), - 'date': fields.datetime('Create Date', readonly=True), - 'canceled_number': fields.integer('Canceled', readonly=True), - 'waiting_number': fields.integer('Waiting', readonly=True), - 'invoiced_number': fields.integer('Invoiced', readonly=True), - 'paid_number': fields.integer('Paid', readonly=True), - 'canceled_amount': fields.float('Canceled', digits=(16, 2), readonly=True), - 'waiting_amount': fields.float('Waiting', digits=(16, 2), readonly=True), - 'invoiced_amount': fields.float('Invoiced', digits=(16, 2), readonly=True), - 'paid_amount': fields.float('Paid', digits=(16, 2), readonly=True), - 'currency': fields.many2one('res.currency', 'Currency', readonly=True, - select=2), - - 'state':fields.selection([('draft', 'Non Member'), - ('cancel', 'Cancelled Member'), - ('done', 'Old Member'), - ('open', 'Invoiced Member'), - ('free', 'Free Member'), ('paid', 'Paid Member')], 'State'), - 'partner_id': fields.many2one('res.partner', 'Members', readonly=True, select=3), - 'membership_id': fields.many2one('product.product', 'Membership', readonly=True, select=3) - - + 'date_from': fields.datetime('Start Date', readonly=True, help="Start membership date"), + 'date_to': fields.datetime('End Date', readonly=True, help="End membership date"), + 'num_canceled': fields.integer('# Canceled', readonly=True), + 'num_old': fields.integer('# Old', readonly=True), + 'num_waiting': fields.integer('# Waiting', readonly=True), + 'num_invoiced': fields.integer('# Invoiced', readonly=True), + 'num_free': fields.integer('# Free', readonly=True), + 'num_paid': fields.integer('# Paid', readonly=True), + 'tot_pending': fields.float('Pending Amount', digits_compute= dp.get_precision('Account'), readonly=True), + 'tot_earned': fields.float('Earned Amount', digits_compute= dp.get_precision('Account'), readonly=True), + 'state':fields.selection(STATE, 'Membership State'), + 'partner_id': fields.many2one('res.partner', 'Members', readonly=True), + 'membership_id': fields.many2one('product.product', 'Membership Product', readonly=True), + 'user_id': fields.many2one('res.users', 'Salesman', readonly=True), + 'company_id': fields.many2one('res.company', 'Company', readonly=True) } def init(self, cr): @@ -68,58 +74,59 @@ class report_membership(osv.osv): CREATE OR REPLACE VIEW report_membership AS ( SELECT MIN(id) as id, - COUNT(ncanceled) as canceled_number, - COUNT(npaid) as paid_number, - COUNT(ninvoiced) as invoiced_number, - COUNT(nwaiting) as waiting_number, - SUM(acanceled) as canceled_amount, - SUM(apaid) as paid_amount, - SUM(ainvoiced) as invoiced_amount, - SUM(awaiting) as waiting_amount, + COUNT(num_canceled) as num_canceled, + COUNT(num_old) as num_old, + COUNT(num_waiting) as num_waiting, + COUNT(num_invoiced) as num_invoiced, + COUNT(num_free) as num_free, + COUNT(num_paid) as num_paid, + SUM(tot_pending) as tot_pending, + SUM(tot_earned) as tot_earned, year, month, - date, + date_from, + date_to, partner_id, membership_id, - state, - currency - - FROM (SELECT - CASE WHEN ai.state = 'cancel' THEN ml.id END AS ncanceled, - CASE WHEN ai.state = 'paid' THEN ml.id END AS npaid, - CASE WHEN ai.state = 'open' THEN ml.id END AS ninvoiced, - CASE WHEN (ai.state = 'draft' OR ai.state = 'proforma') - THEN ml.id END AS nwaiting, - CASE WHEN ai.state = 'cancel' - THEN SUM(ail.price_unit * ail.quantity * (1 - ail.discount / 100)) - ELSE 0 END AS acanceled, - CASE WHEN ai.state = 'paid' - THEN SUM(ail.price_unit * ail.quantity * (1 - ail.discount / 100)) - ELSE 0 END AS apaid, - CASE WHEN ai.state = 'open' - THEN SUM(ail.price_unit * ail.quantity * (1 - ail.discount / 100)) - ELSE 0 END AS ainvoiced, - CASE WHEN (ai.state = 'draft' OR ai.state = 'proforma') - THEN SUM(ail.price_unit * ail.quantity * (1 - ail.discount / 100)) - ELSE 0 END AS awaiting, + company_id, + user_id, + state + FROM + (SELECT + CASE WHEN ml.state = 'canceled' THEN ml.id END AS num_canceled, + CASE WHEN ml.state = 'old' THEN ml.id END AS num_old, + CASE WHEN ml.state = 'waiting' THEN ml.id END AS num_waiting, + CASE WHEN ml.state = 'invoiced' THEN ml.id END AS num_invoiced, + CASE WHEN ml.state = 'free' THEN ml.id END AS num_free, + CASE WHEN ml.state = 'paid' THEN ml.id END AS num_paid, + CASE WHEN ml.state IN ('waiting', 'invoiced') THEN SUM(il.price_subtotal) ELSE 0 END AS tot_pending, + CASE WHEN ml.state IN ('old', 'paid') THEN SUM(il.price_subtotal) ELSE 0 END AS tot_earned, TO_CHAR(ml.date_from, 'YYYY') AS year, - TO_CHAR(ml.date_from, 'MM')as month, - TO_CHAR(ml.date_from, 'YYYY-MM-DD') as date, - ai.partner_id AS partner_id, - ai.currency_id AS currency, - ai.state as state, + TO_CHAR(ml.date_from, 'MM') AS month, + TO_CHAR(ml.date_from, 'YYYY-MM-DD') AS date_from, + TO_CHAR(ml.date_to, 'YYYY-MM-DD') AS date_to, + ml.partner AS partner_id, MIN(ml.id) AS id, - ml.membership_id AS membership_id + ml.membership_id AS membership_id, + p.user_id AS user_id, + ml.company_id AS company_id, + ml.state AS state FROM membership_membership_line ml - JOIN (account_invoice_line ail - LEFT JOIN account_invoice ai - ON (ail.invoice_id = ai.id)) - ON (ml.account_invoice_line = ail.id) - JOIN res_partner p - ON (ml.partner = p.id) - GROUP BY TO_CHAR(ml.date_from, 'YYYY'), TO_CHAR(ml.date_from, 'MM'), TO_CHAR(ml.date_from, 'YYYY-MM-DD'), ai.state, ai.partner_id, - ai.currency_id, ml.id, ml.membership_id) AS foo - GROUP BY year, month, date, currency, partner_id, membership_id, state) + LEFT JOIN account_invoice_line il ON (ml.account_invoice_line = il.id) + LEFT JOIN account_invoice ai ON (il.invoice_id = ai.id) + LEFT JOIN res_partner p ON (ml.partner = p.id) + GROUP BY + TO_CHAR(ml.date_from, 'YYYY'), + TO_CHAR(ml.date_from, 'MM'), + TO_CHAR(ml.date_from, 'YYYY-MM-DD'), + TO_CHAR(ml.date_to, 'YYYY-MM-DD'), + ml.partner, + ml.id, + p.user_id, + ml.company_id, + ml.state, + ml.membership_id) AS foo + GROUP BY year, month, date_from, date_to, partner_id, user_id, membership_id, company_id, state) """) report_membership() diff --git a/addons/membership/report/report_membership_view.xml b/addons/membership/report/report_membership_view.xml index 90330a92a55..962345cf1ae 100644 --- a/addons/membership/report/report_membership_view.xml +++ b/addons/membership/report/report_membership_view.xml @@ -12,13 +12,21 @@ + - - - - - - + + + + + + + + + + + + + @@ -31,40 +39,43 @@ + domain="[('date_from','<=', time.strftime('%%Y-%%m-%%d')), ('date_from','>',(datetime.date.today()-datetime.timedelta(days=365)).strftime('%%Y-%%m-%%d'))]"/> + domain="[('date_from','<=', time.strftime('%%Y-%%m-%%d')), ('date_from','>',(datetime.date.today()-datetime.timedelta(days=30)).strftime('%%Y-%%m-%%d'))]"/> + domain="[('state','=','invoiced')]"/> - + domain="[('state','=', 'waiting')]"/> - - + + - + - - + + - @@ -107,7 +118,7 @@ -