diff options
| author | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
|---|---|---|
| committer | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
| commit | 3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch) | |
| tree | a44932296ef4a9b71d5f010906253d8c53727726 /addons/membership/report | |
| parent | 0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff) | |
initial commit 2
Diffstat (limited to 'addons/membership/report')
| -rw-r--r-- | addons/membership/report/__init__.py | 4 | ||||
| -rw-r--r-- | addons/membership/report/report_membership.py | 106 | ||||
| -rw-r--r-- | addons/membership/report/report_membership_views.xml | 80 |
3 files changed, 190 insertions, 0 deletions
diff --git a/addons/membership/report/__init__.py b/addons/membership/report/__init__.py new file mode 100644 index 00000000..5d12abb4 --- /dev/null +++ b/addons/membership/report/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import report_membership diff --git a/addons/membership/report/report_membership.py b/addons/membership/report/report_membership.py new file mode 100644 index 00000000..bab4b67a --- /dev/null +++ b/addons/membership/report/report_membership.py @@ -0,0 +1,106 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import api, fields, models, tools + +STATE = [ + ('none', 'Non Member'), + ('canceled', 'Cancelled Member'), + ('old', 'Old Member'), + ('waiting', 'Waiting Member'), + ('invoiced', 'Invoiced Member'), + ('free', 'Free Member'), + ('paid', 'Paid Member'), +] + + +class ReportMembership(models.Model): + '''Membership Analysis''' + + _name = 'report.membership' + _description = 'Membership Analysis' + _auto = False + _rec_name = 'start_date' + + start_date = fields.Date(string='Start Date', readonly=True) + date_to = fields.Date(string='End Date', readonly=True, help="End membership date") + num_waiting = fields.Integer(string='# Waiting', readonly=True) + num_invoiced = fields.Integer(string='# Invoiced', readonly=True) + num_paid = fields.Integer(string='# Paid', readonly=True) + tot_pending = fields.Float(string='Pending Amount', digits=0, readonly=True) + tot_earned = fields.Float(string='Earned Amount', digits=0, readonly=True) + partner_id = fields.Many2one('res.partner', string='Member', readonly=True) + associate_member_id = fields.Many2one('res.partner', string='Associate Member', readonly=True) + membership_id = fields.Many2one('product.product', string='Membership Product', readonly=True) + membership_state = fields.Selection(STATE, string='Current Membership State', readonly=True) + user_id = fields.Many2one('res.users', string='Salesperson', readonly=True) + company_id = fields.Many2one('res.company', string='Company', readonly=True) + quantity = fields.Integer(readonly=True) + + def init(self): + '''Create the view''' + tools.drop_view_if_exists(self._cr, self._table) + self._cr.execute(""" + CREATE OR REPLACE VIEW %s AS ( + SELECT + MIN(id) AS id, + partner_id, + count(membership_id) as quantity, + user_id, + membership_state, + associate_member_id, + membership_amount, + date_to, + start_date, + COUNT(num_waiting) AS num_waiting, + COUNT(num_invoiced) AS num_invoiced, + COUNT(num_paid) AS num_paid, + SUM(tot_pending) AS tot_pending, + SUM(tot_earned) AS tot_earned, + membership_id, + company_id + FROM + (SELECT + MIN(p.id) AS id, + p.id AS partner_id, + p.user_id AS user_id, + p.membership_state AS membership_state, + p.associate_member AS associate_member_id, + p.membership_amount AS membership_amount, + p.membership_stop AS date_to, + p.membership_start AS start_date, + 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 = 'paid' THEN ml.id END AS num_paid, + CASE WHEN ml.state IN ('waiting', 'invoiced') THEN SUM(aml.price_subtotal) ELSE 0 END AS tot_pending, + CASE WHEN ml.state = 'paid' OR p.membership_state = 'old' THEN SUM(aml.price_subtotal) ELSE 0 END AS tot_earned, + ml.membership_id AS membership_id, + p.company_id AS company_id + FROM res_partner p + LEFT JOIN membership_membership_line ml ON (ml.partner = p.id) + LEFT JOIN account_move_line aml ON (ml.account_invoice_line = aml.id) + LEFT JOIN account_move am ON (aml.move_id = am.id) + WHERE p.membership_state != 'none' and p.active = 'true' + GROUP BY + p.id, + p.user_id, + p.membership_state, + p.associate_member, + p.membership_amount, + p.membership_start, + ml.membership_id, + p.company_id, + ml.state, + ml.id + ) AS foo + GROUP BY + start_date, + date_to, + partner_id, + user_id, + membership_id, + company_id, + membership_state, + associate_member_id, + membership_amount + )""" % (self._table,)) diff --git a/addons/membership/report/report_membership_views.xml b/addons/membership/report/report_membership_views.xml new file mode 100644 index 00000000..07c14985 --- /dev/null +++ b/addons/membership/report/report_membership_views.xml @@ -0,0 +1,80 @@ +<?xml version="1.0" encoding="utf-8"?> +<odoo> + <!-- REPORTING/MEMBERSHIP BY YEAR --> + <record model="ir.ui.view" id="view_report_membership_search"> + <field name="name">report.membership.search</field> + <field name="model">report.membership</field> + <field name="arch" type="xml"> + <search string="Membership"> + <filter string="Forecast" name="forecast" context="{'waiting_invoiced_totpending_visible':0}" help="This will display waiting, invoiced and total pending columns"/> + <filter string="Revenue Done" name="Revenue" context="{'paid_old_totearned_visible':0}" help="This will display paid, old and total earned columns"/> + <separator/> + <filter name="filter_start_date" date="start_date"/> + <field name="partner_id"/> + <field name="membership_id"/> + <field name="user_id"/> + <group expand="1" string="Group By"> + <filter string="Salesperson" name="salesman" + context="{'group_by':'user_id'}"/> + <filter string="Associated Partner" name="associate_member_id" + context="{'group_by':'associate_member_id'}"/> + <filter string="Membership Product" name="product" + context="{'group_by':'membership_id'}"/> + <filter string="Current Membership State" name="membership_state" + context="{'group_by':'membership_state'}"/> + <filter string="Company" name="company" + context="{'group_by':'company_id'}" groups="base.group_multi_company"/> + <filter string="Month" name="start_date" + context="{'group_by':'start_date:month'}"/> + </group> + </search> + </field> + </record> + + <record model="ir.ui.view" id="view_report_membership_pivot"> + <field name="name">report.membership.pivot</field> + <field name="model">report.membership</field> + <field name="arch" type="xml"> + <pivot string="Membership" disable_linking="True" sample="1"> + <field name="membership_id" type="row"/> + <field name="start_date" interval="month" type="col"/> + <field name="quantity" type="measure"/> + <field name="num_paid" type="measure"/> + <field name="num_invoiced" type="measure"/> + <field name="tot_earned" type="measure"/> + </pivot> + </field> + </record> + + <record model="ir.ui.view" id="view_report_membership_graph1"> + <field name="name">report.membership.graph1</field> + <field name="model">report.membership</field> + <field name="arch" type="xml"> + <graph string="Membership" sample="1" disable_linking="1"> + <field name="membership_id" type="row"/> + <field name="start_date" interval="month" type="col"/> + <field name="quantity" type="measure"/> + </graph> + </field> + </record> + + <record model="ir.actions.act_window" id="action_report_membership_tree"> + <field name="name">Members Analysis</field> + <field name="res_model">report.membership</field> + <field name="view_mode">graph,pivot</field> + <field name="search_view_id" ref="view_report_membership_search"/> + <field name="context">{"search_default_start_date":1,"search_default_member":1, 'search_default_Revenue':1, 'search_default_this_month':1, 'search_default_salesman':1,'group_by_no_leaf':1}</field> + <field name="help" type="html"> + <p class="o_view_nocontent_smiling_face"> + No data yet! + </p> + </field> + </record> + + <menuitem name="Reporting" parent="menu_association" + sequence="99" + action="action_report_membership_tree" + id="menu_report_membership" + groups="base.group_partner_manager"/> + +</odoo> |
