import membership
import wizard
+import report
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
'security/ir.model.access.csv',
'wizard/membership_invoice_view.xml',
'membership_view.xml',
+ 'report/report_membership_view.xml',
'wizard/membership_unpaid_invoice_view.xml',
'process/membership_process.xml'
],
- 'demo_xml': ['membership_demo.xml'],
+ 'demo_xml': ['membership_demo.xml'
+ ],
'installable': True,
'active': False,
'certificate': '0042907796381',
_inherit = 'res.partner'
def _get_partner_id(self, cr, uid, ids, context=None):
+
data_inv = self.pool.get('membership.membership_line').browse(cr, uid, ids, context)
list_partner = []
for data in data_inv:
res_state = self._membership_state(cr, uid, [partner_data.associate_member.id], name, args, context)
res[id] = res_state[partner_data.associate_member.id]
return res
-
- def _membership_start(self, cr, uid, ids, name, args, context=None):
- '''Return the start date of membership'''
- res = {}
- member_line_obj = self.pool.get('membership.membership_line')
- for partner in self.browse(cr, uid, ids):
- if partner.associate_member:
- partner_id = partner.associate_member.id
- else:
- partner_id = partner.id
- line_id = member_line_obj.search(cr, uid, [('partner', '=', partner_id)],
- limit=1, order='date_from')
- if line_id:
- res[partner.id] = member_line_obj.read(cr, uid, line_id[0],
- ['date_from'])['date_from']
- else:
- res[partner.id] = False
- return res
-
- def _membership_stop(self, cr, uid, ids, name, args, context=None):
- '''Return the stop date of membership'''
+
+ def _membership_date(self, cr, uid, ids, name, args, context=None):
+
+ '''Return date of membership'''
+
+ name = name[0]
res = {}
member_line_obj = self.pool.get('membership.membership_line')
+
for partner in self.browse(cr, uid, ids):
- cr.execute('select membership_state from res_partner where id=%s', (partner.id,))
- data_state = cr.fetchall()
+
if partner.associate_member:
- partner_id = partner.associate_member.id
- else:
- partner_id = partner.id
- line_id = member_line_obj.search(cr, uid, [('partner', '=', partner_id)],
- limit=1, order='date_to desc')
- if line_id:
- res[partner.id] = member_line_obj.read(cr, uid, line_id[0],
- ['date_to'])['date_to']
+ partner_id = partner.associate_member.id
else:
- res[partner.id] = False
- return res
-
- def _membership_cancel(self, cr, uid, ids, name, args, context=None):
- '''Return the cancel date of membership'''
- res = {}
- member_line_obj = self.pool.get('membership.membership_line')
- for partner in self.browse(cr, uid, ids, context=context):
- res[partner.id] = False
- if partner.membership_state == 'canceled':
- line_id = member_line_obj.search(cr, uid, [('partner', '=', partner.id)],limit=1, order='date_cancel')
+ partner_id = partner.id
+
+ res[partner.id]={
+ 'membership_start': False,
+ 'membership_stop': False,
+ 'membership_cancel': False
+ }
+
+ if name == 'membership_start':
+ line_id = member_line_obj.search(cr, uid, [('partner', '=', partner_id)],
+ limit=1, order='date_from')
if line_id:
- res[partner.id] = member_line_obj.read(cr, uid, line_id[0],['date_cancel'])['date_cancel']
+ res[partner.id]['membership_start'] = member_line_obj.read(cr, uid, line_id[0],
+ ['date_from'])['date_from']
+
+ if name == 'membership_stop':
+ line_id1 = member_line_obj.search(cr, uid, [('partner', '=', partner_id)],
+ limit=1, order='date_to desc')
+ if line_id1:
+ res[partner.id]['membership_stop'] = member_line_obj.read(cr, uid, line_id1[0],
+ ['date_to'])['date_to']
+ if name == 'membership_cancel':
+ if partner.membership_state == 'canceled':
+ line_id2 = member_line_obj.search(cr, uid, [('partner', '=', partner.id)],limit=1, order='date_cancel')
+ if line_id2:
+ res[partner.id]['membership_cancel'] = member_line_obj.read(cr, uid, line_id2[0],['date_cancel'])['date_cancel']
+
return res
def _get_partners(self, cr, uid, ids, context={}):
}
),
'membership_start': fields.function(
- _membership_start, method=True,
+ _membership_date, method=True, multi='membeship_start',
string = 'Start membership date', type = 'date',
store = {
'account.invoice':(_get_invoice_partner,['state'], 10),
- 'membership.membership_line':(_get_partner_id,['state'], 10),
+ 'membership.membership_line':(_get_partner_id,['state'], 10, ),
'res.partner':(lambda self,cr,uid,ids,c={}:ids, ['free_member'], 10)
}
),
'membership_stop': fields.function(
- _membership_stop, method = True,
- string = 'Stop membership date', type = 'date',
+ _membership_date, method = True,
+ string = 'Stop membership date', type = 'date', multi='membership_stop',
store = {
'account.invoice':(_get_invoice_partner,['state'], 10),
'membership.membership_line':(_get_partner_id,['state'], 10),
),
'membership_cancel': fields.function(
- _membership_cancel, method = True,
- string = 'Cancel membership date', type='date',
+ _membership_date, method = True,
+ string = 'Cancel membership date', type='date', multi='membership_cancel',
store = {
'account.invoice':(_get_invoice_partner,['state'], 11),
'membership.membership_line':(_get_partner_id,['state'], 10),
return super(Invoice, self).action_cancel(cr, uid, ids, context)
Invoice()
-
-class ReportPartnerMemberYear(osv.osv):
- '''Membership by Years'''
-
- _name = 'report.partner_member.year'
- _description = __doc__
- _auto = False
- _rec_name = 'year'
- _columns = {
- 'year': fields.char('Year', size='4', readonly=True, select=1),
- '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),
- }
-
- def init(self, cr):
- '''Create the view'''
- cr.execute("""
- CREATE OR REPLACE VIEW report_partner_member_year 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,
- year,
- 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,
- TO_CHAR(ml.date_from, 'YYYY') AS year,
- ai.currency_id AS currency,
- MIN(ml.id) AS id
- 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'), ai.state,
- ai.currency_id, ml.id) AS foo
- GROUP BY year, currency)
- """)
-
-ReportPartnerMemberYear()
-
-
-class ReportPartnerMemberYearNew(osv.osv):
- '''New Membership by Years'''
-
- _name = 'report.partner_member.year_new'
- _description = __doc__
- _auto = False
- _rec_name = 'year'
- _columns = {
- 'year': fields.char('Year', size='4', readonly=True, select=1),
- '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),
- }
-
- def init(self, cursor):
- '''Create the view'''
- cursor.execute("""
- CREATE OR REPLACE VIEW report_partner_member_year_new 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,
- year,
- currency
- FROM (SELECT
- CASE WHEN ai.state = 'cancel' THEN ml2.id END AS ncanceled,
- CASE WHEN ai.state = 'paid' THEN ml2.id END AS npaid,
- CASE WHEN ai.state = 'open' THEN ml2.id END AS ninvoiced,
- CASE WHEN (ai.state = 'draft' OR ai.state = 'proforma')
- THEN ml2.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,
- TO_CHAR(ml2.date_from, 'YYYY') AS year,
- ai.currency_id AS currency,
- MIN(ml2.id) AS id
- FROM (SELECT
- partner AS id,
- MIN(date_from) AS date_from
- FROM membership_membership_line
- GROUP BY partner
- ) AS ml1
- JOIN membership_membership_line ml2
- JOIN (account_invoice_line ail
- LEFT JOIN account_invoice ai
- ON (ail.invoice_id = ai.id))
- ON (ml2.account_invoice_line = ail.id)
- ON (ml1.id = ml2.partner AND ml1.date_from = ml2.date_from)
- JOIN res_partner p
- ON (ml2.partner = p.id)
- GROUP BY TO_CHAR(ml2.date_from, 'YYYY'), ai.state,
- ai.currency_id, ml2.id) AS foo
- GROUP BY year, currency
- )
- """)
-
-ReportPartnerMemberYearNew()
-
class account_invoice_line(osv.osv):
_inherit='account.invoice.line'
return result
account_invoice_line()
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
\ No newline at end of file
</tree>
</field>
</record>
+
<record id="view_res_partner_member_filter" model="ir.ui.view">
<field name="name">res.partner.select</field>
<field name="model">res.partner</field>
<field name="type">search</field>
<field name="arch" type="xml">
<field name="category_id" position="after">
- <field name="membership_state" select="1">
- <filter icon="terp-partner" domain="[('membership_state', '=', 'paid')]" help="Paid Members"/>
- <filter icon="terp-partner" domain="[('membership_state', '=', 'free')]" help="Free Members"/>
- <filter icon="terp-partner" domain="[('associate_member', '!=', False), ('membership_state', '!=', 'none')]" help="Associated Members"/>
- <filter icon="terp-partner" domain="[('membership_state', '=', 'invoiced')]" help="Invoiced Members"/>
- <filter icon="terp-partner" domain="[('membership_state', '=', 'waiting')]" help="Future Members"/>
- <filter icon="terp-partner" domain="[('membership_state', '=', 'old')]" help="Old Members"/>
+ <filter icon="terp-partner" domain="[('membership_state', '=', 'paid')]" string="Paid Members" />
+ <filter icon="terp-partner" domain="[('membership_state', '=', 'invoiced')]" string="Invoiced Members" />
+ <filter icon="terp-partner" domain="[('membership_state', '=', 'waiting')]" string="Future Members" />
+ <separator orientation="vertical"/>
+ <field name="membership_state">
+ <field name="membership_start"/>
</field>
+ <newline/>
+ <group expand="1" string="Group By..." position="after">
+ <filter string="Associate Members" icon="terp-partner" domain="[]" context="{'group_by': 'associate_member'}"/>
+ </group>
</field>
</field>
</record>
+
<record model="ir.actions.act_window" id="action_membership_members">
<field name="name">Members</field>
</field>
</page>
</notebook>
-
</field>
</record>
sequence="2"
id="menu_reporting"/>
- <!-- REPORTING/MEMBERSHIP BY YEAR -->
-
-
- <record model="ir.ui.view" id="view_report_partner_member_year_tree1">
- <field name="name">report.partner_member.year.tree</field>
- <field name="model">report.partner_member.year</field>
- <field name="type">tree</field>
- <field name="arch" type="xml">
- <tree string="Membership by Years">
- <field name="canceled_number"/>
- <field name="waiting_number"/>
- <field name="invoiced_number"/>
- <field name="paid_number"/>
- <field name="year"/>
- </tree>
- </field>
- </record>
-
-
- <record model="ir.ui.view" id="view_report_partner_member_year_tree2">
- <field name="name">report.partner_member.year.tree</field>
- <field name="model">report.partner_member.year</field>
- <field name="type">tree</field>
- <field name="arch" type="xml">
- <tree string="Membership by Years">
- <field name="canceled_amount"/>
- <field name="waiting_amount"/>
- <field name="invoiced_amount"/>
- <field name="paid_amount"/>
- <field name="currency"/>
- <field name="year"/>
- </tree>
- </field>
- </record>
-
- <record model="ir.ui.view" id="view_report_partner_member_year_graph1">
- <field name="name">report.partner_member.year.graph1</field>
- <field name="model">report.partner_member.year</field>
- <field name="type">graph</field>
- <field name="arch" type="xml">
- <graph string="Membership by Years" type="bar">
- <field name="year"/>
- <field name="canceled_number"/>
- <field name="waiting_number"/>
- <field name="invoiced_number"/>
- <field name="paid_number"/>
- </graph>
- </field>
- </record>
-
- <record model="ir.ui.view" id="view_report_partner_member_year_graph2">
- <field name="name">report.partner_member.year.graph2</field>
- <field name="model">report.partner_member.year</field>
- <field name="type">graph</field>
- <field name="arch" type="xml">
- <graph string="Membership by Years" type="bar">
- <field name="year"/>
- <field name="canceled_amount"/>
- <field name="waiting_amount"/>
- <field name="invoiced_amount"/>
- <field name="paid_amount"/>
- </graph>
- </field>
- </record>
-
- <record model="ir.actions.act_window" id="action_report_partner_member_year_tree">
- <field name="res_model">report.partner_member.year</field>
- <field name="view_type">form</field>
- </record>
-
- <record model="ir.actions.act_window.view" id="action_report_partner_member_year_tree_view1">
- <field name="sequence" eval="3"/>
- <field name="view_mode">tree</field>
- <field name="view_id" ref="view_report_partner_member_year_tree1"/>
- <field name="act_window_id" ref="action_report_partner_member_year_tree"/>
- </record>
-
-
- <record model="ir.actions.act_window.view" id="action_report_partner_member_year_tree_view4">
- <field name="sequence" eval="4"/>
- <field name="view_mode">tree</field>
- <field name="view_id" ref="view_report_partner_member_year_tree2"/>
- <field name="act_window_id" ref="action_report_partner_member_year_tree"/>
- </record>
-
- <record model="ir.actions.act_window.view" id="action_report_partner_member_year_tree_view2">
- <field name="sequence" eval="1"/>
- <field name="view_mode">graph</field>
- <field name="view_id" ref="view_report_partner_member_year_graph1"/>
- <field name="act_window_id" ref="action_report_partner_member_year_tree"/>
- </record>
-
- <record model="ir.actions.act_window.view" id="action_report_partner_member_year_tree_view3">
- <field name="sequence" eval="2"/>
- <field name="view_mode">graph</field>
- <field name="view_id" ref="view_report_partner_member_year_graph2"/>
- <field name="act_window_id" ref="action_report_partner_member_year_tree"/>
- </record>
-
- <menuitem name="Membership by Years" parent="menu_reporting"
- action="action_report_partner_member_year_tree"
- id="menu_report_partner_member_year"/>
-
-
- <!-- REPORTING/NEW MEMBERSHIP BY YEAR -->
-
-
-
- <record model="ir.ui.view" id="view_report_partner_member_year_new_tree1">
- <field name="name">report.partner_member.year_new.tree</field>
- <field name="model">report.partner_member.year_new</field>
- <field name="type">tree</field>
- <field name="arch" type="xml">
- <tree string="New Membership by Years">
- <field name="canceled_number"/>
- <field name="waiting_number"/>
- <field name="invoiced_number"/>
- <field name="paid_number"/>
- <field name="year"/>
- </tree>
- </field>
- </record>
-
- <record model="ir.ui.view" id="view_report_partner_member_year_new_tree2">
- <field name="name">report.partner_member.year_new.tree</field>
- <field name="model">report.partner_member.year_new</field>
- <field name="type">tree</field>
- <field name="arch" type="xml">
- <tree string="New Membership by Years">
- <field name="canceled_amount"/>
- <field name="waiting_amount"/>
- <field name="invoiced_amount"/>
- <field name="paid_amount"/>
- <field name="currency"/>
- <field name="year"/>
- </tree>
- </field>
- </record>
-
- <record model="ir.ui.view" id="view_report_partner_member_year_new_graph1">
- <field name="name">report.partner_member.year_new.graph1</field>
- <field name="model">report.partner_member.year_new</field>
- <field name="type">graph</field>
- <field name="arch" type="xml">
- <graph string="New Membership by Years" type="bar">
- <field name="year"/>
- <field name="canceled_number"/>
- <field name="waiting_number"/>
- <field name="invoiced_number"/>
- <field name="paid_number"/>
- </graph>
- </field>
- </record>
-
- <record model="ir.ui.view" id="view_report_partner_member_year_new_graph2">
- <field name="name">report.partner_member.year_new.graph2</field>
- <field name="model">report.partner_member.year_new</field>
- <field name="type">graph</field>
- <field name="arch" type="xml">
- <graph string="New Membership by Years" type="bar">
- <field name="year"/>
- <field name="canceled_amount"/>
- <field name="waiting_amount"/>
- <field name="invoiced_amount"/>
- <field name="paid_amount"/>
- </graph>
- </field>
- </record>
-
- <record model="ir.actions.act_window" id="action_report_partner_member_year_new_tree">
- <field name="res_model">report.partner_member.year_new</field>
- <field name="view_type">form</field>
- </record>
-
- <record model="ir.actions.act_window.view" id="action_report_partner_member_year_new_tree_view4">
- <field name="sequence" eval="4"/>
- <field name="view_mode">tree</field>
- <field name="view_id" ref="view_report_partner_member_year_new_tree2"/>
- <field name="act_window_id" ref="action_report_partner_member_year_new_tree"/>
- </record>
-
- <record model="ir.actions.act_window.view" id="action_report_partner_member_year_new_tree_view1">
- <field name="sequence" eval="3"/>
- <field name="view_mode">tree</field>
- <field name="view_id" ref="view_report_partner_member_year_new_tree1"/>
- <field name="act_window_id" ref="action_report_partner_member_year_new_tree"/>
- </record>
-
- <record model="ir.actions.act_window.view" id="action_report_partner_member_year_new_tree_view2">
- <field name="sequence" eval="1"/>
- <field name="view_mode">graph</field>
- <field name="view_id" ref="view_report_partner_member_year_new_graph1"/>
- <field name="act_window_id" ref="action_report_partner_member_year_new_tree"/>
- </record>
-
- <record model="ir.actions.act_window.view" id="action_report_partner_member_year_new_tree_view3">
- <field name="sequence" eval="2"/>
- <field name="view_mode">graph</field>
- <field name="view_id" ref="view_report_partner_member_year_new_graph2"/>
- <field name="act_window_id" ref="action_report_partner_member_year_new_tree"/>
- </record>
-
- <menuitem name="New Membership by Years" parent="menu_reporting"
- action="action_report_partner_member_year_new_tree"
- id="menu_report_partner_member_year_new"/>
<!-- View for product.product object inherited from product module................ -->
<record model="ir.ui.view" id="view_product_form_inherit1">
--- /dev/null
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+import report_membership
--- /dev/null
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+from osv import fields, osv
+import tools
+
+
+class ReportPartnerMemberYear(osv.osv):
+ '''Membership by Years'''
+
+ _name = 'report.partner_member.year'
+ _description = __doc__
+ _auto = False
+ _rec_name = 'year'
+ _columns = {
+ 'year': fields.char('Year', size='4', readonly=True, select=1),
+ '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),
+ }
+
+ def init(self, cr):
+ '''Create the view'''
+ cr.execute("""
+ CREATE OR REPLACE VIEW report_partner_member_year 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,
+ year,
+ 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,
+ TO_CHAR(ml.date_from, 'YYYY') AS year,
+ ai.currency_id AS currency,
+ MIN(ml.id) AS id
+ 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'), ai.state,
+ ai.currency_id, ml.id) AS foo
+ GROUP BY year, currency)
+ """)
+ReportPartnerMemberYear()
+
+class ReportPartnerMemberYearNew(osv.osv):
+ '''New Membership by Years'''
+
+ _name = 'report.partner_member.year_new'
+ _description = __doc__
+ _auto = False
+ _rec_name = 'year'
+ _columns = {
+ 'year': fields.char('Year', size='4', readonly=True, select=1),
+ '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),
+ }
+
+ def init(self, cursor):
+ '''Create the view'''
+ cursor.execute("""
+ CREATE OR REPLACE VIEW report_partner_member_year_new 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,
+ year,
+ currency
+ FROM (SELECT
+ CASE WHEN ai.state = 'cancel' THEN ml2.id END AS ncanceled,
+ CASE WHEN ai.state = 'paid' THEN ml2.id END AS npaid,
+ CASE WHEN ai.state = 'open' THEN ml2.id END AS ninvoiced,
+ CASE WHEN (ai.state = 'draft' OR ai.state = 'proforma')
+ THEN ml2.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,
+ TO_CHAR(ml2.date_from, 'YYYY') AS year,
+ ai.currency_id AS currency,
+ MIN(ml2.id) AS id
+ FROM (SELECT
+ partner AS id,
+ MIN(date_from) AS date_from
+ FROM membership_membership_line
+ GROUP BY partner
+ ) AS ml1
+ JOIN membership_membership_line ml2
+ JOIN (account_invoice_line ail
+ LEFT JOIN account_invoice ai
+ ON (ail.invoice_id = ai.id))
+ ON (ml2.account_invoice_line = ail.id)
+ ON (ml1.id = ml2.partner AND ml1.date_from = ml2.date_from)
+ JOIN res_partner p
+ ON (ml2.partner = p.id)
+ GROUP BY TO_CHAR(ml2.date_from, 'YYYY'), ai.state,
+ ai.currency_id, ml2.id) AS foo
+ GROUP BY year, currency
+ )
+ """)
+
+ReportPartnerMemberYearNew()
\ No newline at end of file
--- /dev/null
+<?xml version="1.0"?>
+<openerp>
+ <data>
+ <!-- REPORTING/MEMBERSHIP BY YEAR -->
+
+
+ <record model="ir.ui.view" id="view_report_partner_member_year_tree1">
+ <field name="name">report.partner_member.year.tree</field>
+ <field name="model">report.partner_member.year</field>
+ <field name="type">tree</field>
+ <field name="arch" type="xml">
+ <tree string="Membership by Years">
+ <field name="canceled_number"/>
+ <field name="waiting_number"/>
+ <field name="invoiced_number"/>
+ <field name="paid_number"/>
+ <field name="year"/>
+ </tree>
+ </field>
+ </record>
+
+
+ <record model="ir.ui.view" id="view_report_partner_member_year_tree2">
+ <field name="name">report.partner_member.year.tree</field>
+ <field name="model">report.partner_member.year</field>
+ <field name="type">tree</field>
+ <field name="arch" type="xml">
+ <tree string="Membership by Years">
+ <field name="canceled_amount"/>
+ <field name="waiting_amount"/>
+ <field name="invoiced_amount"/>
+ <field name="paid_amount"/>
+ <field name="currency"/>
+ <field name="year"/>
+ </tree>
+ </field>
+ </record>
+
+ <record model="ir.ui.view" id="view_report_partner_member_year_graph1">
+ <field name="name">report.partner_member.year.graph1</field>
+ <field name="model">report.partner_member.year</field>
+ <field name="type">graph</field>
+ <field name="arch" type="xml">
+ <graph string="Membership by Years" type="bar">
+ <field name="year"/>
+ <field name="canceled_number"/>
+ <field name="waiting_number"/>
+ <field name="invoiced_number"/>
+ <field name="paid_number"/>
+ </graph>
+ </field>
+ </record>
+
+ <record model="ir.ui.view" id="view_report_partner_member_year_graph2">
+ <field name="name">report.partner_member.year.graph2</field>
+ <field name="model">report.partner_member.year</field>
+ <field name="type">graph</field>
+ <field name="arch" type="xml">
+ <graph string="Membership by Years" type="bar">
+ <field name="year"/>
+ <field name="canceled_amount"/>
+ <field name="waiting_amount"/>
+ <field name="invoiced_amount"/>
+ <field name="paid_amount"/>
+ </graph>
+ </field>
+ </record>
+
+ <record model="ir.actions.act_window" id="action_report_partner_member_year_tree">
+ <field name="res_model">report.partner_member.year</field>
+ <field name="view_type">form</field>
+ </record>
+
+ <record model="ir.actions.act_window.view" id="action_report_partner_member_year_tree_view1">
+ <field name="sequence" eval="3"/>
+ <field name="view_mode">tree</field>
+ <field name="view_id" ref="view_report_partner_member_year_tree1"/>
+ <field name="act_window_id" ref="action_report_partner_member_year_tree"/>
+ </record>
+
+
+ <record model="ir.actions.act_window.view" id="action_report_partner_member_year_tree_view4">
+ <field name="sequence" eval="4"/>
+ <field name="view_mode">tree</field>
+ <field name="view_id" ref="view_report_partner_member_year_tree2"/>
+ <field name="act_window_id" ref="action_report_partner_member_year_tree"/>
+ </record>
+
+ <record model="ir.actions.act_window.view" id="action_report_partner_member_year_tree_view2">
+ <field name="sequence" eval="1"/>
+ <field name="view_mode">graph</field>
+ <field name="view_id" ref="view_report_partner_member_year_graph1"/>
+ <field name="act_window_id" ref="action_report_partner_member_year_tree"/>
+ </record>
+
+ <record model="ir.actions.act_window.view" id="action_report_partner_member_year_tree_view3">
+ <field name="sequence" eval="2"/>
+ <field name="view_mode">graph</field>
+ <field name="view_id" ref="view_report_partner_member_year_graph2"/>
+ <field name="act_window_id" ref="action_report_partner_member_year_tree"/>
+ </record>
+
+ <menuitem name="Membership by Years" parent="menu_reporting"
+ action="action_report_partner_member_year_tree"
+ id="menu_report_partner_member_year"/>
+
+
+ <!-- REPORTING/NEW MEMBERSHIP BY YEAR -->
+
+
+
+ <record model="ir.ui.view" id="view_report_partner_member_year_new_tree1">
+ <field name="name">report.partner_member.year_new.tree</field>
+ <field name="model">report.partner_member.year_new</field>
+ <field name="type">tree</field>
+ <field name="arch" type="xml">
+ <tree string="New Membership by Years">
+ <field name="canceled_number"/>
+ <field name="waiting_number"/>
+ <field name="invoiced_number"/>
+ <field name="paid_number"/>
+ <field name="year"/>
+ </tree>
+ </field>
+ </record>
+
+ <record model="ir.ui.view" id="view_report_partner_member_year_new_tree2">
+ <field name="name">report.partner_member.year_new.tree</field>
+ <field name="model">report.partner_member.year_new</field>
+ <field name="type">tree</field>
+ <field name="arch" type="xml">
+ <tree string="New Membership by Years">
+ <field name="canceled_amount"/>
+ <field name="waiting_amount"/>
+ <field name="invoiced_amount"/>
+ <field name="paid_amount"/>
+ <field name="currency"/>
+ <field name="year"/>
+ </tree>
+ </field>
+ </record>
+
+ <record model="ir.ui.view" id="view_report_partner_member_year_new_graph1">
+ <field name="name">report.partner_member.year_new.graph1</field>
+ <field name="model">report.partner_member.year_new</field>
+ <field name="type">graph</field>
+ <field name="arch" type="xml">
+ <graph string="New Membership by Years" type="bar">
+ <field name="year"/>
+ <field name="canceled_number"/>
+ <field name="waiting_number"/>
+ <field name="invoiced_number"/>
+ <field name="paid_number"/>
+ </graph>
+ </field>
+ </record>
+
+ <record model="ir.ui.view" id="view_report_partner_member_year_new_graph2">
+ <field name="name">report.partner_member.year_new.graph2</field>
+ <field name="model">report.partner_member.year_new</field>
+ <field name="type">graph</field>
+ <field name="arch" type="xml">
+ <graph string="New Membership by Years" type="bar">
+ <field name="year"/>
+ <field name="canceled_amount"/>
+ <field name="waiting_amount"/>
+ <field name="invoiced_amount"/>
+ <field name="paid_amount"/>
+ </graph>
+ </field>
+ </record>
+
+ <record model="ir.actions.act_window" id="action_report_partner_member_year_new_tree">
+ <field name="res_model">report.partner_member.year_new</field>
+ <field name="view_type">form</field>
+ </record>
+
+ <record model="ir.actions.act_window.view" id="action_report_partner_member_year_new_tree_view4">
+ <field name="sequence" eval="4"/>
+ <field name="view_mode">tree</field>
+ <field name="view_id" ref="view_report_partner_member_year_new_tree2"/>
+ <field name="act_window_id" ref="action_report_partner_member_year_new_tree"/>
+ </record>
+
+ <record model="ir.actions.act_window.view" id="action_report_partner_member_year_new_tree_view1">
+ <field name="sequence" eval="3"/>
+ <field name="view_mode">tree</field>
+ <field name="view_id" ref="view_report_partner_member_year_new_tree1"/>
+ <field name="act_window_id" ref="action_report_partner_member_year_new_tree"/>
+ </record>
+
+ <record model="ir.actions.act_window.view" id="action_report_partner_member_year_new_tree_view2">
+ <field name="sequence" eval="1"/>
+ <field name="view_mode">graph</field>
+ <field name="view_id" ref="view_report_partner_member_year_new_graph1"/>
+ <field name="act_window_id" ref="action_report_partner_member_year_new_tree"/>
+ </record>
+
+ <record model="ir.actions.act_window.view" id="action_report_partner_member_year_new_tree_view3">
+ <field name="sequence" eval="2"/>
+ <field name="view_mode">graph</field>
+ <field name="view_id" ref="view_report_partner_member_year_new_graph2"/>
+ <field name="act_window_id" ref="action_report_partner_member_year_new_tree"/>
+ </record>
+
+ <menuitem name="New Membership by Years" parent="menu_reporting"
+ action="action_report_partner_member_year_new_tree"
+ id="menu_report_partner_member_year_new"/>
+
+ </data>
+</openerp>
\ No newline at end of file