diff options
| author | qdc <qdc@openerp.com> | 2014-08-21 12:53:47 +0200 |
|---|---|---|
| committer | Thibault Delavallée <tde@openerp.com> | 2014-08-26 11:56:49 +0200 |
| commit | f57787e07ee48268015cd088bfc3dafef7001558 (patch) | |
| tree | 5de5a170aefd5434f90fa0a1e5fb9726f8590b83 | |
| parent | 20d366595c303df29f72cc2016de5341d8827720 (diff) | |
[IMP] Cleaning of reporting (group_by, filters), adding new favourites and default views, some renaming (py and xml files)
78 files changed, 1202 insertions, 693 deletions
diff --git a/addons/account/account_invoice_view.xml b/addons/account/account_invoice_view.xml index 93dd7bf2e41..250c8e26fdf 100644 --- a/addons/account/account_invoice_view.xml +++ b/addons/account/account_invoice_view.xml @@ -446,6 +446,14 @@ </field> </record> + <!-- Custom reports (aka filters) --> + <record id="filter_invoice_salespersons" model="ir.filters"> + <field name="name">By Salespersons</field> + <field name="model_id">account.invoice</field> + <field name="user_id" eval="False"/> + <field name="context">{'group_by': ['date_invoice:month', 'user_id']}</field> + </record> + <record id="view_account_invoice_filter" model="ir.ui.view"> <field name="name">account.invoice.select</field> <field name="model">account.invoice</field> @@ -463,14 +471,13 @@ <separator/> <filter domain="[('user_id','=',uid)]" help="My Invoices"/> <group expand="0" string="Group By"> - <filter name="group_by_partner_id" string="Partner" domain="[]" context="{'group_by':'partner_id'}"/> - <filter name="commercial_partner_id" string="Commercial Partner" domain="[]" context="{'group_by':'commercial_partner_id'}"/> - <filter string="Responsible" icon="terp-personal" domain="[]" context="{'group_by':'user_id'}"/> - <filter string="Journal" icon="terp-folder-orange" domain="[]" context="{'group_by':'journal_id'}"/> - <filter string="Status" icon="terp-stock_effects-object-colorize" domain="[]" context="{'group_by':'state'}"/> - <filter string="Period" icon="terp-go-month" domain="[]" context="{'group_by':'period_id'}"/> - <filter string="Invoice Month" icon="terp-go-month" domain="[]" context="{'group_by':'date_invoice'}"/> - <filter string="Due Month" icon="terp-go-month" domain="[]" context="{'group_by':'date_due'}"/> + <filter name="group_by_partner_id" string="Partner" context="{'group_by':'partner_id'}"/> + <filter string="Salesperson" context="{'group_by':'user_id'}"/> + <filter string="Category of Product" name="category_product" context="{'group_by':'categ_id','residual_invisible':True}"/> + <filter string="Status" context="{'group_by':'state'}"/> + <separator/> + <filter string="Period" context="{'group_by':'period_id'}"/> + <filter string="Due Month" context="{'group_by':'date_due'}"/> </group> </search> </field> @@ -582,7 +589,7 @@ <field name="search_view_id" ref="view_account_invoice_filter"/> <field name="help" type="html"> <p class="oe_view_nocontent_create"> - Click to create a customer refund. + Click to create a customer refund. </p><p> A refund is a document that credits an invoice completely or partially. diff --git a/addons/account/report/account_analytic_entries_report.py b/addons/account/report/account_analytic_entries_report.py index 1cd0f4c9026..26da4078d61 100644 --- a/addons/account/report/account_analytic_entries_report.py +++ b/addons/account/report/account_analytic_entries_report.py @@ -40,8 +40,8 @@ class analytic_entries_report(osv.osv): 'product_id': fields.many2one('product.product', 'Product', required=True), 'product_uom_id': fields.many2one('product.uom', 'Product Unit of Measure', required=True), 'amount': fields.float('Amount', readonly=True), - 'unit_amount': fields.float('Quantity', readonly=True), - 'nbr': fields.integer('#Entries', readonly=True), + 'unit_amount': fields.integer('Unit Amount', readonly=True), + 'nbr': fields.integer('# Entries', readonly=True), # TDE FIXME master: rename into nbr_entries } def init(self, cr): tools.drop_view_if_exists(cr, 'analytic_entries_report') diff --git a/addons/account/report/account_analytic_entries_report_view.xml b/addons/account/report/account_analytic_entries_report_view.xml index 2020b56d1fe..d18a0ba5f71 100644 --- a/addons/account/report/account_analytic_entries_report_view.xml +++ b/addons/account/report/account_analytic_entries_report_view.xml @@ -7,20 +7,18 @@ <field name="arch" type="xml"> <search string="Analytic Entries Analysis"> <field name="date"/> - <filter string="My Entries" icon="terp-personal" domain="[('user_id','=',uid)]" help="My Entries"/> + <filter string="My Entries" domain="[('user_id','=',uid)]" help="My Entries"/> <field name="account_id" groups="analytic.group_analytic_accounting"/> <field name="product_id" /> <field name="user_id"/> <group expand="0" string="Group By"> - <filter string="User" name="User" icon="terp-personal" context="{'group_by':'user_id'}"/> - <filter string="Partner" icon="terp-partner" context="{'group_by':'partner_id'}"/> - <filter string="Account" name="Account" icon="terp-folder-green" context="{'group_by':'account_id'}" groups="analytic.group_analytic_accounting"/> - <filter string="General Account" icon="terp-folder-orange" context="{'group_by':'general_account_id'}"/> - <filter string="Journal" icon="terp-folder-orange" context="{'group_by':'journal_id'}"/> - <filter string="Product" icon="terp-accessories-archiver" context="{'group_by':'product_id'}"/> - <filter string="Product Unit of Measure" icon="terp-mrp" context="{'group_by':'product_uom_id'}"/> - <filter string="Company" icon="terp-go-home" context="{'group_by':'company_id'}" groups="base.group_multi_company"/> - <filter string="Date" name="Month" icon="terp-go-month" context="{'group_by':'date:month'}"/> + <filter string="Partner" context="{'group_by':'partner_id'}"/> + <filter string="Account" name="Account" context="{'group_by':'account_id'}" groups="analytic.group_analytic_accounting"/> + <filter string="General Account" context="{'group_by':'general_account_id'}"/> + <filter string="Journal" context="{'group_by':'journal_id'}"/> + <filter string="Company" context="{'group_by':'company_id'}" groups="base.group_multi_company"/> + <separator/> + <filter string="Month" name="Month" context="{'group_by':'date:month'}"/> </group> </search> </field> @@ -30,7 +28,8 @@ <field name="model">analytic.entries.report</field> <field name="arch" type="xml"> <graph string="Analytic Entries Analysis" type="pivot"> - <field name="user_id" type="row"/> + <field name="account_id" type="row"/> + <field name="date" interval="month" type="col"/> <field name="nbr" type="measure"/> <field name="unit_amount" type="measure"/> <field name="amount" type="measure"/> @@ -42,8 +41,8 @@ <field name="res_model">analytic.entries.report</field> <field name="view_type">form</field> <field name="view_mode">graph</field> - <field name="context">{'search_default_year':1,'search_default_month':1, 'group_by_no_leaf':1, 'search_default_Account':1, 'search_default_Month':1, 'group_by':[]}</field> <field name="search_view_id" ref="view_analytic_entries_report_search"/> + <field name="context">{'group_by_no_leaf':1, 'search_default_Account':1, 'group_by':[]}</field> <field name="help">From this view, have an analysis of your different analytic entries following the analytic account you defined matching your business need. Use the tool search to analyse information about analytic entries generated in the system.</field> </record> diff --git a/addons/account/report/account_entries_report.py b/addons/account/report/account_entries_report.py index 2a8049ba403..755c0bcf28b 100644 --- a/addons/account/report/account_entries_report.py +++ b/addons/account/report/account_entries_report.py @@ -29,7 +29,7 @@ class account_entries_report(osv.osv): _auto = False _rec_name = 'date' _columns = { - 'date': fields.date('Effective Date', readonly=True), + 'date': fields.date('Effective Date', readonly=True), # TDE FIXME master: rename into date_effective 'date_created': fields.date('Date Created', readonly=True), 'date_maturity': fields.date('Date Maturity', readonly=True), 'ref': fields.char('Reference', readonly=True), @@ -50,7 +50,7 @@ class account_entries_report(osv.osv): 'reconcile_id': fields.many2one('account.move.reconcile', 'Reconciliation number', readonly=True), 'partner_id': fields.many2one('res.partner','Partner', readonly=True), 'analytic_account_id': fields.many2one('account.analytic.account', 'Analytic Account', readonly=True), - 'quantity': fields.float('Products Quantity', digits=(16,2), readonly=True), + 'quantity': fields.float('Products Quantity', digits=(16,2), readonly=True), # TDE FIXME master: rename into product_quantity 'user_type': fields.many2one('account.account.type', 'Account Type', readonly=True), 'type': fields.selection([ ('receivable', 'Receivable'), diff --git a/addons/account/report/account_entries_report_view.xml b/addons/account/report/account_entries_report_view.xml index f52717d5c73..dbd6b324a95 100644 --- a/addons/account/report/account_entries_report_view.xml +++ b/addons/account/report/account_entries_report_view.xml @@ -36,10 +36,11 @@ <field name="model">account.entries.report</field> <field name="arch" type="xml"> <graph string="Entries Analysis" type="pivot"> - <field name="partner_id" type="row"/> - <field name="debit" operator="+"/> - <field name="credit" operator="+"/> - <field name="balance" operator="+"/> + <field name="user_type" type="row"/> + <field name="period_id" type="col"/> + <field name="debit" type="measure"/> + <field name="credit" type="measure"/> + <field name="balance" type="measure"/> </graph> </field> </record> @@ -63,14 +64,14 @@ <field name="date"/> <field name="date_created"/> <field name="date_maturity"/> - <filter icon="terp-go-year" string="This F.Year" name="thisyear" context="{'year':'current_year'}" help="Journal Entries with period in current year"/> - <filter icon="terp-go-month" string="This Period" name="period" context="{'period':'current_period'}" help="Journal Entries with period in current period"/> + <filter string="This F.Year" name="thisyear" domain="['|', ('date', '=', False), '&',('date','<=', time.strftime('%%Y-12-31')),('date','>=',time.strftime('%%Y-01-01'))]" help="Journal Entries with period in current year"/> + <filter string="This Period" name="period" context="{'period':'current_period'}" help="Journal Entries with period in current period"/> <separator/> - <filter string="Unposted" icon="terp-document-new" domain="[('move_state','=','draft')]" help = "entries"/> - <filter string="Posted" icon="terp-camera_test" domain="[('move_state','=','posted')]" help = "Posted entries"/> + <filter string="Unposted" domain="[('move_state','=','draft')]" help = "entries"/> + <filter string="Posted" domain="[('move_state','=','posted')]" help = "Posted entries"/> <separator/> - <filter string="Unreconciled" icon="terp-dolar_ok!" domain="[('reconcile_id','=',False), ('account_id.reconcile','=',True)]" help = "Unreconciled entries"/> - <filter string="Reconciled" icon="terp-dolar" domain="[('reconcile_id','!=',False)]" help = "Reconciled entries"/> + <filter string="Unreconciled" domain="[('reconcile_id','=',False), ('account_id.reconcile','=',True)]" help = "Unreconciled entries"/> + <filter string="Reconciled" domain="[('reconcile_id','!=',False)]" help = "Reconciled entries"/> <field name="account_id"/> <field name="journal_id"/> <field name="period_id"/> @@ -81,17 +82,13 @@ <field name="company_id" groups="base.group_multi_company"/> </group> <group expand="1" string="Group By"> - <filter string="Partner" icon="terp-partner" context="{'group_by':'partner_id'}"/> - <filter string="Product" icon="terp-accessories-archiver" context="{'group_by':['product_id','product_uom_id'], 'quantity_visible':1}"/> - <filter string="Currency" name="group_currency" icon="terp-dolar" context="{'group_by':'currency_id', 'currency_id_visible':1, 'amount_currency_visible':1}"/> - <filter string="Journal" name="group_journal" icon="terp-folder-orange" context="{'group_by':'journal_id'}"/> - <filter string="Account" name="group_account" icon="terp-folder-green" context="{'group_by':'account_id'}"/> - <filter string="Acc.Type" icon="terp-stock_symbol-selection" context="{'group_by':'user_type'}" name="usertype"/> - <filter string="Int.Type" icon="terp-stock_symbol-selection" context="{'group_by':'type'}"/> - <filter string="Company" icon="terp-go-home" context="{'group_by':'company_id'}" groups="base.group_multi_company"/> - <filter string="Entries Month" icon="terp-go-today" context="{'group_by':'date'}" help="Entries Date by Month"/> - <filter string="Period" icon="terp-go-month" name="group_period" context="{'group_by':'period_id'}"/> - <filter string="Fiscal Year" icon="terp-go-year" context="{'group_by':'fiscalyear_id'}"/> + <filter string="Partner" context="{'group_by':'partner_id'}"/> + <filter string="Journal" name="group_journal" context="{'group_by':'journal_id'}"/> + <filter string="Acc.Type" context="{'group_by':'user_type'}" name="usertype"/> + <filter string="Int.Type" context="{'group_by':'type'}"/> + <filter string="Company" context="{'group_by':'company_id'}" groups="base.group_multi_company"/> + <separator/> + <filter string="Entries Month" context="{'group_by':'date:month'}" help="Entries Date by Month"/> </group> </search> </field> diff --git a/addons/account/report/account_invoice_report.py b/addons/account/report/account_invoice_report.py index 7a5ce9c0fb1..0639bfca203 100644 --- a/addons/account/report/account_invoice_report.py +++ b/addons/account/report/account_invoice_report.py @@ -56,7 +56,7 @@ class account_invoice_report(osv.osv): _columns = { 'date': fields.date('Date', readonly=True), 'product_id': fields.many2one('product.product', 'Product', readonly=True), - 'product_qty':fields.float('Qty', readonly=True), + 'product_qty':fields.float('Product Quantity', readonly=True), 'uom_name': fields.char('Reference Unit of Measure', size=128, readonly=True), 'payment_term': fields.many2one('account.payment.term', 'Payment Term', readonly=True), 'period_id': fields.many2one('account.period', 'Force Period', domain=[('state','<>','done')], readonly=True), @@ -73,7 +73,7 @@ class account_invoice_report(osv.osv): 'price_average': fields.float('Average Price', readonly=True, group_operator="avg"), 'user_currency_price_average': fields.function(_compute_amounts_in_user_currency, string="Average Price", type='float', digits_compute=dp.get_precision('Account'), multi="_compute_amounts"), 'currency_rate': fields.float('Currency Rate', readonly=True), - 'nbr':fields.integer('# of Lines', readonly=True), + 'nbr': fields.integer('# of Invoices', readonly=True), # TDE FIXME master: rename into nbr_lines 'type': fields.selection([ ('out_invoice','Customer Invoice'), ('in_invoice','Supplier Invoice'), @@ -226,7 +226,7 @@ class account_invoice_report(osv.osv): OR (sub.date IS NULL AND cr2.name <= NOW())) ORDER BY name DESC LIMIT 1) )""" % ( - self._table, + self._table, self._select(), self._sub_select(), self._from(), self._group_by())) diff --git a/addons/account/report/account_invoice_report_view.xml b/addons/account/report/account_invoice_report_view.xml index 1983d7ec9fc..6818d075e7f 100644 --- a/addons/account/report/account_invoice_report_view.xml +++ b/addons/account/report/account_invoice_report_view.xml @@ -6,10 +6,8 @@ <field name="model">account.invoice.report</field> <field name="arch" type="xml"> <graph string="Invoices Analysis" type="pivot"> - <field name="period_id" type="row"/> <field name="categ_id" type="row"/> - <field name="nbr" type="measure"/> - <field name="product_qty" type="measure"/> + <field name="period_id" type="col"/> <field name="price_total" type="measure"/> </graph> </field> @@ -58,7 +56,7 @@ <field name="arch" type="xml"> <search string="Invoices Analysis"> <field name="date"/> - <filter string="This Year" name="year" domain="['|', ('date', '=', False), '&',('date','<=', time.strftime('%%Y-12-31')),('date','>=',time.strftime('%%Y-01-01'))]"/> + <filter string="This Year" name="thisyear" domain="['|', ('date', '=', False), '&',('date','<=', time.strftime('%%Y-12-31')),('date','>=',time.strftime('%%Y-01-01'))]" help="Journal invoices with period in current year"/> <separator/> <filter string="To Invoice" domain="[('state','=','draft')]" help = "Draft Invoices"/> <filter string="Pro-forma" domain="['|', ('state','=','proforma'),('state','=','proforma2')]"/> @@ -74,19 +72,14 @@ <field name="categ_id" filter_domain="[('categ_id', 'child_of', self)]"/> <group expand="1" string="Group By"> <filter string="Partner" name="partner_id" context="{'group_by':'partner_id','residual_visible':True}"/> - <filter string="Commercial Partner" name="commercial_partner_id" context="{'group_by':'commercial_partner_id','residual_visible':True}"/> - <filter string="Commercial Partner's Country" name="country_id" context="{'group_by':'country_id'}"/> - <filter string="Salesperson" name='user' icon="terp-personal" context="{'group_by':'user_id'}"/> - <filter string="Due Month" icon="terp-go-today" context="{'group_by':'date_due'}"/> - <filter string="Period" icon="terp-go-month" context="{'group_by':'period_id'}"/> - <filter string="Product" icon="terp-accessories-archiver" context="{'group_by':'product_id','set_visible':True,'residual_invisible':True}"/> - <filter string="Category of Product" name="category_product" icon="terp-stock_symbol-selection" context="{'group_by':'categ_id','residual_invisible':True}"/> - <filter string="Status" icon="terp-stock_effects-object-colorize" context="{'group_by':'state'}"/> - <filter string="Type" icon="terp-stock_symbol-selection" context="{'group_by':'type'}"/> - <filter string="Journal" icon="terp-folder-orange" context="{'group_by':'journal_id'}"/> - <filter string="Account" icon="terp-folder-orange" context="{'group_by':'account_line_id'}"/> - <filter string="Company" icon="terp-go-home" context="{'group_by':'company_id'}" groups="base.group_multi_company"/> - <filter string="Invoice Date" name="month" icon="terp-go-month" context="{'group_by':'date'}" help="Group by month of Invoice Date"/> + <filter string="Salesperson" name='user' context="{'group_by':'user_id'}"/> + <filter string="Sales Team" domain="[]" context="{'group_by':'section_id'}" groups="base.group_multi_salesteams"/> + <filter string="Category of Product" name="category_product" context="{'group_by':'categ_id','residual_invisible':True}"/> + <filter string="Status" context="{'group_by':'state'}"/> + <filter string="Company" context="{'group_by':'company_id'}" groups="base.group_multi_company"/> + <separator orientation="vertical" /> + <filter string="Period" context="{'group_by':'period_id'}"/> + <filter string="Due Month" context="{'group_by':'date_due:month'}"/> </group> </search> </field> @@ -97,7 +90,7 @@ <field name="res_model">account.invoice.report</field> <field name="view_type">form</field> <field name="view_mode">graph</field> - <field name="context">{'search_default_current':1, 'search_default_year': 1, 'search_default_customer':1, 'group_by':[], 'group_by_no_leaf':1,}</field> + <field name="context">{'search_default_current':1, 'search_default_customer':1, 'group_by':[], 'group_by_no_leaf':1,}</field> <field name="search_view_id" ref="view_account_invoice_report_search"/> <field name="help">From this report, you can have an overview of the amount invoiced to your customer. The tool search can also be used to personalise your Invoices reports and so, match this analysis to your needs.</field> diff --git a/addons/account/report/account_treasury_report_view.xml b/addons/account/report/account_treasury_report_view.xml index f1c84849831..91357c01b8b 100644 --- a/addons/account/report/account_treasury_report_view.xml +++ b/addons/account/report/account_treasury_report_view.xml @@ -38,6 +38,9 @@ <field name="fiscalyear_id"/> <field name="period_id"/> <field name="company_id" groups="base.group_multi_company"/> + <group expand="1" string="Group By"> + <filter string="Month" context="{'group_by':'date:month'}"/> + </group> </search> </field> </record> diff --git a/addons/account_asset/report/account_asset_report_view.xml b/addons/account_asset/report/account_asset_report_view.xml index ff6f0b0d52d..c3b22f7374d 100644 --- a/addons/account_asset/report/account_asset_report_view.xml +++ b/addons/account_asset/report/account_asset_report_view.xml @@ -7,15 +7,15 @@ <field name="model">asset.asset.report</field> <field name="arch" type="xml"> <graph string="Assets Analysis" type="pivot"> - <field name="asset_id" type="row"/> - <field name="nbr" type="measure"/> + <field name="asset_category_id" type="row"/> + <field name="purchase_date" type="col"/> + <field name="posted_value" type="measure"/> <field name="gross_value" type="measure"/> <field name="depreciation_value" type="measure"/> - <field name="posted_value" type="measure"/> </graph> </field> </record> - + <record id="view_asset_asset_report_search" model="ir.ui.view"> <field name="name">asset.asset.report.search</field> <field name="model">asset.asset.report</field> @@ -23,10 +23,10 @@ <search string="Assets Analysis"> <field name="purchase_date"/> <field name="depreciation_date"/> - <filter string="Draft" icon="terp-document-new" domain="[('state','=','draft')]" help="Assets in draft state"/> - <filter string="Running" icon="terp-check" domain="[('state','=','open')]" help="Assets in running state"/> + <filter string="Draft" domain="[('state','=','draft')]" help="Assets in draft state"/> + <filter string="Running" domain="[('state','=','open')]" help="Assets in running state"/> <separator/> - <filter string="Posted" name="posted" icon="terp-camera_test" domain="[('move_check','=',True)]" help="Posted depreciation lines" context="{'unposted_value_visible': 0}"/> + <filter string="Posted" name="posted" domain="[('move_check','=',True)]" help="Posted depreciation lines" context="{'unposted_value_visible': 0}"/> <field name="asset_id"/> <field name="asset_category_id"/> <group expand="0" string="Extended Filters..."> @@ -35,24 +35,25 @@ </group> <group expand="1" string="Group By"> <filter string="Asset" name="asset" context="{'group_by':'asset_id'}"/> - <filter string="Asset Category" name="asset_category" icon="terp-stock_symbol-selection" context="{'group_by':'asset_category_id'}"/> - <filter string="Company" icon="terp-go-home" context="{'group_by':'company_id'}" groups="base.group_multi_company"/> - <filter string="Purchase Month" icon="terp-go-month" - domain="[]" context="{'group_by':'purchase_date'}" help="Date of asset purchase"/> - <filter string="Depreciation Month" icon="terp-go-today" - domain="[]" context="{'group_by':'depreciation_date'}" help="Date of depreciation"/> + <filter string="Asset Category" name="asset_category" context="{'group_by':'asset_category_id'}"/> + <filter string="Company" context="{'group_by':'company_id'}" groups="base.group_multi_company"/> + <separator/> + <filter string="Purchase Month" help="Date of asset purchase" + context="{'group_by':'purchase_date:month'}"/> + <filter string="Depreciation Month" help="Date of depreciation" + context="{'group_by':'depreciation_date:month'}"/> </group> - </search> + </search> </field> </record> - - <record model="ir.actions.act_window" id="action_asset_asset_report"> + + <record model="ir.actions.act_window" id="action_asset_asset_report"> <field name="name">Assets Analysis</field> <field name="res_model">asset.asset.report</field> <field name="view_type">form</field> <field name="view_mode">graph</field> <field name="search_view_id" ref="view_asset_asset_report_search"/> - <field name="context">{'search_default_year':1,'search_default_this_month':1,'search_default_asset_category':1, 'search_default_posted':1, 'group_by':[], 'group_by_no_leaf':1}</field> + <field name="context">{'group_by':[], 'group_by_no_leaf':1}</field> <field name="help" type="html"> <p> From this report, you can have an overview on all depreciation. The @@ -61,7 +62,7 @@ </p> </field> </record> - + <menuitem action="action_asset_asset_report" id="menu_action_asset_asset_report" parent="account.menu_finance_reporting"/> diff --git a/addons/account_followup/report/account_followup_report.xml b/addons/account_followup/report/account_followup_report.xml index e3f4ec6f8e9..e7d7aba14a8 100644 --- a/addons/account_followup/report/account_followup_report.xml +++ b/addons/account_followup/report/account_followup_report.xml @@ -7,7 +7,8 @@ <field name="model">account_followup.stat</field> <field name="arch" type="xml"> <graph string="Follow-up lines" type="pivot"> - <field name="partner_id" type="row"/> + <field name="followup_id" type="row"/> + <field name="date_followup" type="col"/> <field name="balance" type="measure"/> </graph> </field> @@ -19,19 +20,20 @@ <search string="Follow-ups Sent"> <field name="date_move"/> <field name="date_move_last"/> - <filter icon="terp-go-year" string="This Fiscal year" name="fiscalyear" domain="[('period_id','in','current_year')]" + <filter string="This Fiscal year" name="fiscalyear" domain="[('period_id','in','current_year')]" help="Follow-up Entries with period in current year"/> <separator/> - <filter icon="terp-camera_test" string="Not Litigation" domain="[('blocked','=', False)]" + <filter string="Not Litigation" domain="[('blocked','=', False)]" help = "Including journal entries marked as a litigation"/> <field name="partner_id"/> <field name="balance"/> <group expand="1" string="Group By"> - <filter string="Partner" icon="terp-partner" context="{'group_by':'partner_id'}" /> - <filter string="Litigation" icon="terp-camera_test" context="{'group_by':'blocked'}" /> - <filter string="Follow-up Level" icon="terp-stock_effects-object-colorize" name="followup_level" context="{'group_by':'followup_id'}" /> - <filter string="Latest Follow-up Month" icon="terp-go-month" context="{'group_by':'date_followup'}" /> - <filter string="Company" groups="base.group_multi_company" icon="terp-go-home" context="{'group_by':'company_id'}" /> + <filter string="Partner" context="{'group_by':'partner_id'}" /> + <filter string="Litigation" context="{'group_by':'blocked'}" /> + <filter string="Follow-up Level" name="followup_level" context="{'group_by':'followup_id'}" /> + <filter string="Company" groups="base.group_multi_company" context="{'group_by':'company_id'}" /> + <separator/> + <filter string="Latest Follow-up Month" context="{'group_by':'date_followup:month'}" /> </group> </search> </field> diff --git a/addons/account_voucher/report/account_voucher_sales_receipt_view.xml b/addons/account_voucher/report/account_voucher_sales_receipt_view.xml index 78af9d28fc5..5621da68d05 100644 --- a/addons/account_voucher/report/account_voucher_sales_receipt_view.xml +++ b/addons/account_voucher/report/account_voucher_sales_receipt_view.xml @@ -1,13 +1,13 @@ <?xml version="1.0" encoding="UTF-8"?> <openerp> - <data> - + <data> <record id="view_sale_receipt_report_graph" model="ir.ui.view"> <field name="name">sale.receipt.report.graph</field> <field name="model">sale.receipt.report</field> <field name="arch" type="xml"> <graph string="Sales Receipts Analysis" type="pivot"> - <field name="account_id"/> + <field name="partner_id" type="row"/> + <field name="date_due" type="col"/> <field name="price_total" type="measure"/> </graph> </field> @@ -20,9 +20,9 @@ <search string="Sales Receipts Analysis"> <field name="date"/> <field name="date_due"/> - <filter string="Draft" icon="terp-document-new" domain="[('state','=','draft')]" help = "Draft Vouchers"/> - <filter string="Pro-forma" icon="terp-gtk-media-pause" domain="[('state','=','proforma')]" help = "Pro-forma Vouchers"/> - <filter string="Posted" name="current" icon="terp-check" domain="[('state','not in', ('draft','cancel'))]" help = "Validated Vouchers"/> + <filter string="Draft" domain="[('state','=','draft')]" help = "Draft Vouchers"/> + <filter string="Pro-forma" domain="[('state','=','proforma')]" help = "Pro-forma Vouchers"/> + <filter string="Posted" name="current" domain="[('state','not in', ('draft','cancel'))]" help = "Validated Vouchers"/> <field name="partner_id"/> <group expand="0" string="Extended Filters..."> <field name="journal_id"/> @@ -31,14 +31,13 @@ <field name="company_id" groups="base.group_multi_company"/> </group> <group expand="1" string="Group By"> - <filter string="Partner" name="partner" icon="terp-partner" context="{'group_by':'partner_id'}"/> - <filter string="Salesperson" name='user' icon="terp-personal" context="{'group_by':'user_id'}"/> - <filter string="Status" icon="terp-stock_effects-object-colorize" context="{'group_by':'state'}"/> - <filter string="Type" icon="terp-stock_symbol-selection" context="{'group_by':'type'}"/> - <filter string="Journal" icon="terp-folder-orange" context="{'group_by':'journal_id'}"/> - <filter string="Due Month" icon="terp-go-today" context="{'group_by':'date_due'}"/> - <filter string="Company" icon="terp-go-home" context="{'group_by':'company_id'}" groups="base.group_multi_company"/> - <filter string="Invoice Date" name="month" icon="terp-go-month" context="{'group_by':'date'}" help="Group by month of Invoice Date"/> + <filter string="Partner" name="partner" context="{'group_by':'partner_id'}"/> + <filter string="Status" context="{'group_by':'state'}"/> + <filter string="Type" context="{'group_by':'type'}"/> + <filter string="Journal" context="{'group_by':'journal_id'}"/> + <filter string="Company" context="{'group_by':'company_id'}" groups="base.group_multi_company"/> + <separator/> + <filter string="Due Month" context="{'group_by':'date_due:month'}"/> </group> </search> </field> @@ -49,7 +48,7 @@ <field name="res_model">sale.receipt.report</field> <field name="view_type">form</field> <field name="view_mode">graph</field> - <field name="context">{'search_default_year':1,'search_default_month':1,'search_default_current':1, 'search_default_partner':1, 'search_default_customer':1, 'group_by':[], 'group_by_no_leaf':1,}</field> + <field name="context">{'search_default_year':1,'search_default_month':1,'search_default_partner':1, 'search_default_customer':1, 'group_by':[], 'group_by_no_leaf':1,}</field> <field name="search_view_id" ref="view_sale_receipt_report_search"/> <field name="help" type="html"> <p> @@ -63,6 +62,6 @@ </record> <menuitem action="action_sale_receipt_report_all" id="menu_action_sale_receipt_report_all" parent="account.menu_finance_reporting" sequence="3"/> - + </data> </openerp> diff --git a/addons/crm/__openerp__.py b/addons/crm/__openerp__.py index 15544dc3dff..f5b5240cea6 100644 --- a/addons/crm/__openerp__.py +++ b/addons/crm/__openerp__.py @@ -74,7 +74,7 @@ Dashboard for CRM will include: 'wizard/crm_merge_opportunities_view.xml', 'crm_view.xml', - + 'crm_phonecall_view.xml', 'crm_phonecall_menu.xml', @@ -84,6 +84,7 @@ Dashboard for CRM will include: 'calendar_event_menu.xml', 'report/crm_lead_report_view.xml', + 'report/crm_opportunity_report_view.xml', 'report/crm_phonecall_report_view.xml', 'res_partner_view.xml', diff --git a/addons/crm/crm_lead_demo.xml b/addons/crm/crm_lead_demo.xml index f5b38f8078b..48b62a7b0bf 100644 --- a/addons/crm/crm_lead_demo.xml +++ b/addons/crm/crm_lead_demo.xml @@ -552,6 +552,28 @@ Andrew</field> <!-- <field name="date_closed" eval="(DateTime.today() - relativedelta(hours=1)).strftime('%Y-%m-%d %H:%M')"/> --> </record> + <record id="crm_case_27" model="crm.lead"> + <field name="type">opportunity</field> + <field name="name">Interest in your products</field> + <field eval="20000" name="planned_revenue"/> + <field eval="0.0" name="probability"/> + <field name="partner_name">Agrolait</field> + <field name="email_from">info@agrolait.com</field> + <field name="partner_id" ref="base.res_partner_2"/> + <field name="street">69 rue de Chimay</field> + <field name="country_id" ref="base.be"/> + <field name="city">Wavre</field> + <field name="zip">1300</field> + <field name="categ_ids" eval="[(6, 0, [categ_oppor2])]"/> + <field name="priority">2</field> + <field eval="time.strftime('%Y-%m-23')" name="date_deadline"/> + <field eval="time.strftime('%Y-%m-10')" name="date_action"/> + <field name="title_action">Send Catalogue by Email</field> + <field name="section_id" ref="sales_team.crm_case_section_2"/> + <field name="user_id" ref="base.user_demo"/> + <field name="stage_id" ref="crm.stage_lead1"/> + </record> + <!-- Some messages linked to the previous opportunities --> <record id="msg_case15_attach1" model="ir.attachment"> <field name="datas">bWlncmF0aW9uIHRlc3Q=</field> diff --git a/addons/crm/crm_lead_menu.xml b/addons/crm/crm_lead_menu.xml index f02f9305c4b..2569b85972d 100644 --- a/addons/crm/crm_lead_menu.xml +++ b/addons/crm/crm_lead_menu.xml @@ -36,8 +36,8 @@ <field name="view_mode">kanban,tree,graph,form,calendar</field> <field name="domain">[('type','=','opportunity')]</field> <field name="context">{ - 'stage_type': 'opportunity', - 'default_type': 'opportunity', + 'stage_type': 'opportunity', + 'default_type': 'opportunity', 'default_user_id': uid } </field> diff --git a/addons/crm/crm_lead_view.xml b/addons/crm/crm_lead_view.xml index a567be10619..e1a7d8443c7 100644 --- a/addons/crm/crm_lead_view.xml +++ b/addons/crm/crm_lead_view.xml @@ -101,7 +101,7 @@ </header> <sheet> <div class="oe_right oe_button_box" name="buttons"> - <button class="oe_inline oe_stat_button" type="action" + <button class="oe_inline oe_stat_button" type="action" context="{'default_opportunity_id': active_id, 'search_default_opportunity_id': active_id, 'default_partner_id': partner_id, 'default_duration': 1.0}" name="%(crm.crm_case_categ_phone_incoming0)d" icon="fa-phone"> <div>Schedule/Log<br/>Calls</div> @@ -380,12 +380,12 @@ </header> <sheet> <div class="oe_right oe_button_box"> - <button class="oe_inline oe_stat_button" type="action" + <button class="oe_inline oe_stat_button" type="action" name="%(crm.crm_case_categ_phone_incoming0)d" icon="fa-phone" context="{'default_opportunity_id': active_id, 'search_default_opportunity_id': active_id, 'default_partner_id': partner_id, 'default_duration': 1.0}"> <div>Schedule/Log<br/>Calls</div> </button> - <button class="oe_inline oe_stat_button" type="object" + <button class="oe_inline oe_stat_button" type="object" context="{'partner_id': partner_id}" name="action_schedule_meeting" icon="fa-calendar"> <field string="Meetings" name="meeting_count" widget="statinfo"/> @@ -533,7 +533,6 @@ </field> </record> - <!-- Opportunities Search View --> <record id="view_crm_case_opportunities_filter" model="ir.ui.view"> <field name="name">CRM - Opportunities Search</field> @@ -548,6 +547,8 @@ <field name="stage_id" domain="[]"/> <field name="probability"/> <separator/> + <filter string="New" name="new" + domain="[('probability', '=', 0), ('stage_id.sequence', '<=', 1)]"/> <filter string="Won" name="won" domain="[('probability', '=', 100), ('stage_id.fold', '=', True)]"/> <filter string="Lost" name="lost" @@ -561,12 +562,14 @@ <separator/> <filter string="New Mail" name="message_unread" domain="[('message_unread','=',True)]"/> <group expand="0" string="Group By" colspan="16"> - <filter string="Salesperson" domain="[]" context="{'group_by':'user_id'}"/> - <filter string="Team" domain="[]" context="{'group_by':'section_id'}" groups="base.group_multi_salesteams"/> - <filter string="Stage" domain="[]" context="{'group_by':'stage_id'}"/> - <filter string="Customer" help="Partner" domain="[]" context="{'group_by':'partner_id'}"/> - <filter string="Expected Closing" domain="[]" context="{'group_by':'date_deadline'}"/> - <filter string="Last Message" name="group_message_last_post" domain="[]" context="{'group_by':'message_last_post:week'}"/> + <filter string="Salesperson" context="{'group_by':'user_id'}"/> + <filter string="Sales Team" context="{'group_by':'section_id'}" groups="base.group_multi_salesteams"/> + <filter string="Country" context="{'group_by':'country_id'}" /> + <filter string="Company" context="{'group_by':'company_id'}" groups="base.group_multi_company"/> + <filter string="Stage" context="{'group_by':'stage_id'}"/> + <separator orientation="vertical" /> + <filter string="Creation Month" context="{'group_by':'create_date:month'}" name="month"/> + <filter string="Expected Closing" context="{'group_by':'date_deadline'}"/> </group> </search> </field> diff --git a/addons/crm/report/__init__.py b/addons/crm/report/__init__.py index 0ce743bc859..7b4e4e89377 100644 --- a/addons/crm/report/__init__.py +++ b/addons/crm/report/__init__.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- ############################################################################## -# +# # OpenERP, Open Source Management Solution # Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>). # @@ -15,12 +15,12 @@ # 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/>. +# along with this program. If not, see <http://www.gnu.org/licenses/>. # ############################################################################## import crm_lead_report +import crm_opportunity_report import crm_phonecall_report # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: - diff --git a/addons/crm/report/crm_lead_report.py b/addons/crm/report/crm_lead_report.py index 82c68be92fe..6f74cad074e 100644 --- a/addons/crm/report/crm_lead_report.py +++ b/addons/crm/report/crm_lead_report.py @@ -19,26 +19,11 @@ # ############################################################################## +from openerp.addons.crm import crm from openerp.osv import fields, osv from openerp import tools -from openerp.addons.crm import crm - -MONTHS = [ - ('01', 'January'), - ('02', 'February'), - ('03', 'March'), - ('04', 'April'), - ('05', 'May'), - ('06', 'June'), - ('07', 'July'), - ('08', 'August'), - ('09', 'September'), - ('10', 'October'), - ('11', 'November'), - ('12', 'December') -] -class crm_lead_report(osv.osv): +class crm_lead_report(osv.Model): """ CRM Lead Analysis """ _name = "crm.lead.report" _auto = False @@ -49,9 +34,10 @@ class crm_lead_report(osv.osv): _columns = { 'date_deadline': fields.date('Exp. Closing', readonly=True, help="Expected Closing"), 'create_date': fields.datetime('Creation Date', readonly=True), - 'opening_date': fields.date('Assignation Date', readonly=True), - 'date_closed': fields.date('Close Date', readonly=True), + 'opening_date': fields.datetime('Assignation Date', readonly=True), + 'date_closed': fields.datetime('Close Date', readonly=True), 'date_last_stage_update': fields.datetime('Last Stage Update', readonly=True), + 'nbr_cases': fields.integer("# of Cases", readonly=True), # durations 'delay_open': fields.float('Delay to Assign',digits=(16,2),readonly=True, group_operator="avg",help="Number of Days to open the case"), @@ -59,12 +45,12 @@ class crm_lead_report(osv.osv): 'delay_expected': fields.float('Overpassed Deadline',digits=(16,2),readonly=True, group_operator="avg"), 'user_id':fields.many2one('res.users', 'User', readonly=True), - 'section_id':fields.many2one('crm.case.section', 'Sales Team', readonly=True), + 'section_id':fields.many2one('crm.case.section', 'Sales Team', readonly=True), 'country_id':fields.many2one('res.country', 'Country', readonly=True), 'company_id': fields.many2one('res.company', 'Company', readonly=True), 'probability': fields.float('Probability',digits=(16,2),readonly=True, group_operator="avg"), - 'planned_revenue': fields.float('Planned Revenue',digits=(16,2),readonly=True), - 'probable_revenue': fields.float('Probable Revenue', digits=(16,2),readonly=True), + 'planned_revenue': fields.float('Total Revenue',digits=(16,2),readonly=True), # TDE FIXME master: rename into total_revenue + 'probable_revenue': fields.float('Expected Revenue', digits=(16,2),readonly=True), # TDE FIXME master: rename into expected_revenue 'stage_id': fields.many2one ('crm.case.stage', 'Stage', readonly=True, domain="[('section_ids', '=', section_id)]"), 'partner_id': fields.many2one('res.partner', 'Partner' , readonly=True), 'company_id': fields.many2one('res.company', 'Company', readonly=True), @@ -87,9 +73,10 @@ class crm_lead_report(osv.osv): SELECT id, c.date_deadline, + count(id) as nbr_cases, - date(c.date_open) as opening_date, - date(c.date_closed) as date_closed, + c.date_open as opening_date, + c.date_closed as date_closed, c.date_last_stage_update as date_last_stage_update, @@ -105,7 +92,7 @@ class crm_lead_report(osv.osv): c.medium_id, c.partner_id, c.country_id, - c.planned_revenue, + c.planned_revenue as planned_revenue, c.planned_revenue*(c.probability/100) as probable_revenue, c.create_date as create_date, extract('epoch' from (c.date_closed-c.create_date))/(3600*24) as delay_close, @@ -114,6 +101,7 @@ class crm_lead_report(osv.osv): FROM crm_lead c WHERE c.active = 'true' + GROUP BY c.id )""") diff --git a/addons/crm/report/crm_lead_report_view.xml b/addons/crm/report/crm_lead_report_view.xml index 7551a00c381..4c3fa310e49 100644 --- a/addons/crm/report/crm_lead_report_view.xml +++ b/addons/crm/report/crm_lead_report_view.xml @@ -8,8 +8,10 @@ <field name="model">crm.lead.report</field> <field name="arch" type="xml"> <graph string="Leads Analysis" type="pivot" stacked="True"> - <field name="user_id" type="row"/> - <field name="create_date" interval="year" type="col"/> + <field name="section_id" type="row"/> + <field name="create_date" interval="month" type="col"/> + <field name="nbr_cases" type="measure"/> + <field name="probable_revenue" type="measure"/> </graph> </field> </record> @@ -25,30 +27,34 @@ </field> </record> - <record id="view_report_crm_opportunity_graph" model="ir.ui.view"> - <field name="name">crm.opportunity.report.graph</field> - <field name="model">crm.lead.report</field> - <field name="arch" type="xml"> - <graph string="Leads Analysis" type="pivot" stacked="True"> - <field name="date_deadline" type="row"/> - <field name="stage_id" type="col"/> - <field name="planned_revenue" type="measure"/> - </graph> - </field> - </record> - <!-- Custom reports (aka filters) --> + <record id="filter_leads_long_term_revenue" model="ir.filters"> + <field name="name">Long Term Revenue</field> + <field name="model_id">crm.lead.report</field> + <field name="user_id" eval="False"/> + <field name="context">{'group_by': ['country_id', 'section_id'], 'col_group_by': ['date_deadline'], 'measures': ['planned_revenue']}</field> + </record> + <record id="filter_leads_revenue_per_lead" model="ir.filters"> + <field name="name">Revenue Per Lead</field> + <field name="model_id">crm.lead.report</field> + <field name="user_id" eval="False"/> + <field name="context">{'group_by': ['partner_id'], 'col_group_by': ['date_deadline:month'], 'measures': ['planned_revenue']}</field> + </record> + <record id="filter_leads_overpassed_deadline" model="ir.filters"> + <field name="name">Overpassed Deadline</field> + <field name="model_id">crm.lead.report</field> + <field name="user_id" eval="False"/> + <field name="context">{'group_by': ['section_id'], 'col_group_by': ['partner_id'], 'measures': ['delay_expected']}</field> + </record> <record id="filter_leads_salesperson" model="ir.filters"> <field name="name">By Salespersons</field> <field name="model_id">crm.lead.report</field> - <field name="domain">[]</field> <field name="user_id" eval="False"/> - <field name="context">{'group_by': ['create_date:month', user_id']}</field> + <field name="context">{'group_by': ['create_date:month', 'user_id']}</field> </record> <record id="filter_leads_country" model="ir.filters"> <field name="name">By Country</field> <field name="model_id">crm.lead.report</field> - <field name="domain">[]</field> <field name="user_id" eval="False"/> <field name="context">{'group_by': ['create_date:month', 'country_id']}</field> </record> @@ -91,19 +97,13 @@ <field name="date_closed"/> </group> <group expand="1" string="Group By"> - <filter string="Salesperson" domain="[]" context="{'group_by':'user_id'}" /> - <filter string="Sales Team" domain="[]" context="{'group_by':'section_id'}" groups="base.group_multi_salesteams"/> - <filter string="Partner" context="{'group_by':'partner_id'}" /> + <filter string="Salesperson" context="{'group_by':'user_id'}" /> + <filter string="Sales Team" context="{'group_by':'section_id'}" groups="base.group_multi_salesteams"/> <filter string="Country" context="{'group_by':'country_id'}" /> - <filter string="Company" domain="[]" context="{'group_by':'company_id'}" groups="base.group_multi_company"/> - <filter string="Type" domain="[]" context="{'group_by':'type'}"/> - <filter string="Stage" domain="[]" context="{'group_by':'stage_id'}"/> - <filter string="Priority" domain="[]" context="{'group_by':'priority'}" /> - <separator orientation="vertical" /> - <filter string="Creation date" domain="[]" context="{'group_by':'create_date'}" name="month"/> + <filter string="Company" context="{'group_by':'company_id'}" groups="base.group_multi_company"/> + <filter string="Stage" context="{'group_by':'stage_id'}"/> <separator orientation="vertical" /> - <filter string="Exp. Closing" domain="[]" context="{'group_by':'date_deadline'}"/> - <filter string="Last Stage Update" context="{'group_by':'date_last_stage_update'}" /> + <filter string="Creation Month" context="{'group_by':'create_date:month'}" name="month"/> </group> </search> </field> @@ -115,7 +115,7 @@ <field name="res_model">crm.lead.report</field> <field name="view_type">form</field> <field name="view_mode">graph</field> - <field name="context">{'search_default_lead': 1}</field> + <field name="context">{}</field> <field name="domain">[]</field> <field name="help">Leads Analysis allows you to check different CRM related information like the treatment delays or number of leads per state. You can sort out your leads analysis by different groups to get accurate grained analysis.</field> </record> @@ -129,23 +129,5 @@ groups="base.group_sale_manager" parent="base.next_id_64" action="action_report_crm_lead" sequence="1"/> - <record id="action_report_crm_opportunity" model="ir.actions.act_window"> - <field name="name">Opportunities Analysis</field> - <field name="res_model">crm.lead.report</field> - <field name="view_type">form</field> - <field name="view_mode">graph</field> - <field name="context">{'search_default_opportunity': 1}</field> - <field name="domain">[]</field> - <field name="help">Opportunities Analysis gives you an instant access to your opportunities with information such as the expected revenue, planned cost, missed deadlines or the number of interactions per opportunity. This report is mainly used by the sales manager in order to do the periodic review with the teams of the sales pipeline.</field> - </record> - <record model="ir.actions.act_window.view" id="action_report_crm_opportunity_graph"> - <field name="sequence" eval="2"/> - <field name="view_mode">graph</field> - <field name="view_id" ref="view_report_crm_opportunity_graph"/> - <field name="act_window_id" ref="action_report_crm_opportunity"/> - </record> - <menuitem name="Opportunities Analysis" id="menu_report_crm_opportunities_tree" - parent="base.next_id_64" action="action_report_crm_opportunity" sequence="5"/> - </data> </openerp> diff --git a/addons/crm/report/crm_opportunity_report.py b/addons/crm/report/crm_opportunity_report.py new file mode 100644 index 00000000000..8300448124e --- /dev/null +++ b/addons/crm/report/crm_opportunity_report.py @@ -0,0 +1,101 @@ +# -*- 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 openerp.addons.crm import crm +from openerp.osv import fields, osv +from openerp import tools + + +class crm_opportunity_report(osv.Model): + """ CRM Opportunity Analysis """ + _name = "crm.opportunity.report" + _auto = False + _description = "CRM Opportunity Analysis" + _rec_name = 'date_deadline' + _inherit = ["crm.tracking.mixin"] + + _columns = { + 'date_deadline': fields.date('Exp. Closing', readonly=True, help="Expected Closing"), + 'create_date': fields.datetime('Creation Date', readonly=True), + 'opening_date': fields.datetime('Assignation Date', readonly=True), + 'date_closed': fields.datetime('Close Date', readonly=True), + 'date_last_stage_update': fields.datetime('Last Stage Update', readonly=True), + 'nbr_cases': fields.integer("# of Cases", readonly=True), + + # durations + 'delay_open': fields.float('Delay to Assign',digits=(16,2),readonly=True, group_operator="avg",help="Number of Days to open the case"), + 'delay_close': fields.float('Delay to Close',digits=(16,2),readonly=True, group_operator="avg",help="Number of Days to close the case"), + 'delay_expected': fields.float('Overpassed Deadline',digits=(16,2),readonly=True, group_operator="avg"), + + 'user_id':fields.many2one('res.users', 'User', readonly=True), + 'section_id':fields.many2one('crm.case.section', 'Sales Team', readonly=True), + 'country_id':fields.many2one('res.country', 'Country', readonly=True), + 'company_id': fields.many2one('res.company', 'Company', readonly=True), + 'probability': fields.float('Probability',digits=(16,2),readonly=True, group_operator="avg"), + 'total_revenue': fields.float('Total Revenue',digits=(16,2),readonly=True), + 'expected_revenue': fields.float('Expected Revenue', digits=(16,2),readonly=True), + 'stage_id': fields.many2one ('crm.case.stage', 'Stage', readonly=True, domain="[('section_ids', '=', section_id)]"), + 'partner_id': fields.many2one('res.partner', 'Partner' , readonly=True), + 'company_id': fields.many2one('res.company', 'Company', readonly=True), + 'priority': fields.selection(crm.AVAILABLE_PRIORITIES, 'Priority'), + 'type':fields.selection([ + ('lead','Lead'), + ('opportunity','Opportunity'), + ],'Type', help="Type is used to separate Leads and Opportunities"), + } + + def init(self, cr): + tools.drop_view_if_exists(cr, 'crm_opportunity_report') + cr.execute(""" + CREATE OR REPLACE VIEW crm_opportunity_report AS ( + SELECT + id, + c.date_deadline, + count(id) as nbr_cases, + + c.date_open as opening_date, + c.date_closed as date_closed, + + c.date_last_stage_update as date_last_stage_update, + + c.user_id, + c.probability, + c.stage_id, + c.type, + c.company_id, + c.priority, + c.section_id, + c.campaign_id, + c.source_id, + c.medium_id, + c.partner_id, + c.country_id, + c.planned_revenue as total_revenue, + c.planned_revenue*(c.probability/100) as expected_revenue, + c.create_date as create_date, + extract('epoch' from (c.date_closed-c.create_date))/(3600*24) as delay_close, + abs(extract('epoch' from (c.date_deadline - c.date_closed))/(3600*24)) as delay_expected, + extract('epoch' from (c.date_open-c.create_date))/(3600*24) as delay_open + FROM + crm_lead c + WHERE c.active = 'true' + GROUP BY c.id + )""") diff --git a/addons/crm/report/crm_opportunity_report_view.xml b/addons/crm/report/crm_opportunity_report_view.xml new file mode 100644 index 00000000000..0b58e103e48 --- /dev/null +++ b/addons/crm/report/crm_opportunity_report_view.xml @@ -0,0 +1,123 @@ +<?xml version="1.0" encoding="utf-8"?> +<openerp> + <data> + + <!-- Opportunities by user and section Graph View --> + <record id="view_report_crm_opportunity_graph" model="ir.ui.view"> + <field name="name">crm.opportunity.report.graph</field> + <field name="model">crm.opportunity.report</field> + <field name="arch" type="xml"> + <graph string="Leads Analysis" type="pivot" stacked="True"> + <field name="create_date" interval="month" type="col"/> + <field name="stage_id" type="row"/> + <field name="nbr_cases" type="measure"/> + <field name="total_revenue" type="measure"/> + </graph> + </field> + </record> + + <!-- Custom reports (aka filters) --> + <record id="filter_opportunity_opportunities_cohort" model="ir.filters"> + <field name="name">Opportunities Cohort</field> + <field name="model_id">crm.opportunity.report</field> + <field name="domain">[('type','=','opportunity'), ('probability', '=', 100), ('stage_id.on_change', '=', 1)]</field> + <field name="user_id" eval="False"/> + <field name="context">{'group_by': ['date_closed:month'],'col_group_by': ['create_date:month'], 'measures': ['nbr_cases']}</field> + </record> + <record id="filter_opportunity_opportunities_won_per_team" model="ir.filters"> + <field name="name">Opportunities Won Per Team</field> + <field name="model_id">crm.opportunity.report</field> + <field name="domain">[('type','=','opportunity'), ('probability', '=', 100), ('stage_id.on_change', '=', 1)]</field> + <field name="user_id" eval="False"/> + <field name="context">{'group_by': ['section_id'], 'col_group_by': ['date_last_stage_update:month'], 'measures': ['nbr_cases', 'delay_close']}</field> + </record> + <record id="filter_opportunity_top_opportunities" model="ir.filters"> + <field name="name">Top Opportunities</field> + <field name="model_id">crm.opportunity.report</field> + <field name="domain">[('type','=','opportunity')]</field> + <field name="user_id" eval="False"/> + <field name="context">{'group_by': ['partner_id'], 'col_group_by': ['date_deadline:month'], 'measures': ['nbr_cases','probability','total_revenue']}</field> + </record> + <record id="filter_opportunity_salesperson" model="ir.filters"> + <field name="name">By Salespersons</field> + <field name="model_id">crm.opportunity.report</field> + <field name="user_id" eval="False"/> + <field name="context">{'group_by': ['create_date:month', 'user_id']}</field> + </record> + <record id="filter_opportunity_country" model="ir.filters"> + <field name="name">By Country</field> + <field name="model_id">crm.opportunity.report</field> + <field name="user_id" eval="False"/> + <field name="context">{'group_by': ['create_date:month', 'country_id']}</field> + </record> + + <!-- Opportunities by user and section Search View --> + <record id="view_report_crm_opportunity_filter" model="ir.ui.view"> + <field name="name">crm.opportunity.report.select</field> + <field name="model">crm.opportunity.report</field> + <field name="arch" type="xml"> + <search string="Opportunities Analysis"> + <filter name="lead" string="Lead" domain="[('type','=', 'lead')]" help="Show only lead"/> + <filter name="opportunity" string="Opportunity" domain="[('type','=','opportunity')]" help="Show only opportunity"/> + <separator/> + <filter string="New" name="new" + domain="[('probability', '=', 0), ('stage_id.sequence', '<=', 1)]"/> + <filter string="Won" name="won" + domain="[('probability', '=', 100), ('stage_id.on_change', '=', 1)]"/> + <filter string="Lost" name="lost" + domain="[('probability', '=', 0), ('stage_id.sequence', '!=', 1)]"/> + <field name="section_id" context="{'invisible_section': False}" + groups="base.group_multi_salesteams"/> + <field name="user_id" string="Salesperson"/> + <group expand="0" string="Extended Filters"> + <field name="partner_id" filter_domain="[('partner_id','child_of',self)]"/> + <field name="stage_id" domain="[('section_ids', '=', 'section_id')]" /> + <field name="campaign_id"/> + <field name="medium_id"/> + <field name="source_id"/> + <field name="company_id" groups="base.group_multi_company"/> + <separator orientation="vertical"/> + <field name="stage_id" widget="selection" domain="[('section_ids', '=', 'section_id')]" /> + <field name="campaign_id" widget="selection"/> + <field name="medium_id" widget="selection"/> + <field name="source_id" widget="selection"/> + <separator orientation="vertical"/> + <field name="company_id" widget="selection" groups="base.group_multi_company"/> + <newline/> + <field name="create_date"/> + <field name="opening_date"/> + <field name="date_closed"/> + </group> + <group expand="1" string="Group By"> + <filter string="Salesperson" context="{'group_by':'user_id'}" /> + <filter string="Sales Team" context="{'group_by':'section_id'}" groups="base.group_multi_salesteams"/> + <filter string="Country" context="{'group_by':'country_id'}" /> + <filter string="Company" context="{'group_by':'company_id'}" groups="base.group_multi_company"/> + <filter string="Stage" context="{'group_by':'stage_id'}"/> + <separator orientation="vertical" /> + <filter string="Creation Month" context="{'group_by':'create_date:month'}" name="month"/> + <filter string="Expiration Closing" context="{'group_by':'date_deadline:month'}" name="month" help="Expiration Closing Month"/> + </group> + </search> + </field> + </record> + + <record id="action_report_crm_opportunity" model="ir.actions.act_window"> + <field name="name">Opportunities Analysis</field> + <field name="res_model">crm.opportunity.report</field> + <field name="view_type">form</field> + <field name="view_mode">graph</field> + <field name="context">{'search_default_opportunity': 1}</field> + <field name="help">Opportunities Analysis gives you an instant access to your opportunities with information such as the expected revenue, planned cost, missed deadlines or the number of interactions per opportunity. This report is mainly used by the sales manager in order to do the periodic review with the teams of the sales pipeline.</field> + </record> + <record model="ir.actions.act_window.view" id="action_report_crm_opportunity_graph"> + <field name="sequence" eval="2"/> + <field name="view_mode">graph</field> + <field name="view_id" ref="view_report_crm_opportunity_graph"/> + <field name="act_window_id" ref="action_report_crm_opportunity"/> + </record> + <menuitem name="Opportunities Analysis" id="menu_report_crm_opportunities_tree" + parent="base.next_id_64" action="action_report_crm_opportunity" sequence="5"/> + + </data> +</openerp> diff --git a/addons/crm/report/crm_phonecall_report.py b/addons/crm/report/crm_phonecall_report.py index ac22130964b..4df59c301ab 100644 --- a/addons/crm/report/crm_phonecall_report.py +++ b/addons/crm/report/crm_phonecall_report.py @@ -38,12 +38,12 @@ class crm_phonecall_report(osv.osv): _name = "crm.phonecall.report" _description = "Phone calls by user and section" _auto = False - + _columns = { 'user_id':fields.many2one('res.users', 'User', readonly=True), 'section_id':fields.many2one('crm.case.section', 'Section', readonly=True), 'priority': fields.selection([('0','Low'), ('1','Normal'), ('2','High')], 'Priority'), - 'nbr': fields.integer('# of Cases', readonly=True), + 'nbr': fields.integer('# of Cases', readonly=True), # TDE FIXME master: rename into nbr_cases 'state': fields.selection(AVAILABLE_STATES, 'Status', readonly=True), 'create_date': fields.datetime('Create Date', readonly=True, select=True), 'delay_close': fields.float('Delay to close', digits=(16,2),readonly=True, group_operator="avg",help="Number of Days to close the case"), @@ -54,8 +54,8 @@ class crm_phonecall_report(osv.osv): ('object_id.model', '=', 'crm.phonecall')]"), 'partner_id': fields.many2one('res.partner', 'Partner' , readonly=True), 'company_id': fields.many2one('res.company', 'Company', readonly=True), - 'opening_date': fields.date('Opening Date', readonly=True, select=True), - 'date_closed': fields.date('Close Date', readonly=True, select=True), + 'opening_date': fields.datetime('Opening Date', readonly=True, select=True), + 'date_closed': fields.datetime('Close Date', readonly=True, select=True), } def init(self, cr): @@ -68,8 +68,8 @@ class crm_phonecall_report(osv.osv): create or replace view crm_phonecall_report as ( select id, - date(c.date_open) as opening_date, - date(c.date_closed) as date_closed, + c.date_open as opening_date, + c.date_closed as date_closed, c.state, c.user_id, c.section_id, diff --git a/addons/crm/report/crm_phonecall_report_view.xml b/addons/crm/report/crm_phonecall_report_view.xml index acadbd9c029..d9f35646d98 100644 --- a/addons/crm/report/crm_phonecall_report_view.xml +++ b/addons/crm/report/crm_phonecall_report_view.xml @@ -9,14 +9,38 @@ <field name="model">crm.phonecall.report</field> <field name="arch" type="xml"> <graph orientation="horizontal" string="Phone calls" type="pivot" stacked="True"> - <field name="user_id" type="row"/> - <!-- <field name="state" type="col"/> --> + <field name="section_id" type="row"/> + <field name="create_date" interval="month" type="col"/> <field name="nbr" type="measure"/> <field name="duration" type="measure"/> </graph> </field> </record> +<!-- Custom reports (aka filters) --> + <record id="filter_crm_phonecall_sales_team" model="ir.filters"> + <field name="name">By Sales Team</field> + <field name="model_id">crm.phonecall.report</field> + <field name="domain">[('state','=','done')]</field> + <field name="user_id" eval="False"/> + <field name="context">{'group_by': ['section_id'], 'col_group_by': ['categ_id'], 'measures': ['nbr', 'duration']}</field> + </record> + <record id="filter_crm_phonecall_delay_to_close" model="ir.filters"> + <field name="name">Delay To Close</field> + <field name="model_id">crm.phonecall.report</field> + <field name="domain">[('state','=','done')]</field> + <field name="user_id" eval="False"/> + <field name="context">{'group_by': ['section_id'], 'col_group_by': ['categ_id'], 'measures': ['delay_close']}</field> + </record> + <record id="filter_crm_phonecall_phone_call_to_do" model="ir.filters"> + <field name="name">Phone Calls To Do</field> + <field name="model_id">crm.phonecall.report</field> + <field name="domain">[('state','in',('draft','open'))]</field> + <field name="user_id" eval="False"/> + <field name="context">{'group_by': ['section_id'], 'measures': ['nbr']}</field> + </record> + + <!-- Phone calls by user and section Search View --> <record id="view_report_crm_phonecall_filter" model="ir.ui.view"> @@ -24,17 +48,17 @@ <field name="model">crm.phonecall.report</field> <field name="arch" type="xml"> <search string="Search"> - <filter icon="terp-gtk-go-back-rtl" string="Todo" domain="[('state','in',('draft','open'))]" + <filter string="Todo" name="todo" domain="[('state','in',('draft','open'))]" help="Phone calls which are in draft and open state"/> - <filter icon="terp-camera_test" string="Held" domain="[('state','=','done')]" + <filter string="Held" name="held" domain="[('state','=','done')]" help="Phone calls which are in closed state"/> - <filter icon="gtk-media-pause" string="Not Held" domain="[('state','=','pending')]" + <filter string="Not Held" domain="[('state','=','pending')]" help="Phone calls which are in pending state"/> <separator/> - <filter string="My Sales Team(s)" icon="terp-personal+" context="{'invisible_section': False}" domain="[('section_id.user_id','=',uid)]" + <filter string="My Sales Team(s)" context="{'invisible_section': False}" domain="[('section_id.user_id','=',uid)]" help="Phone calls that are assigned to one of the sale teams I manage" groups="base.group_multi_salesteams"/> <separator/> - <filter icon="terp-personal" string="My Phone Calls" help="Phone Calls that are assigned to me" domain="[('user_id','=',uid)]" /> + <filter string="My Phone Calls" help="Phone Calls that are assigned to me" domain="[('user_id','=',uid)]" /> <field name="section_id" string="Sales Team" context="{'invisible_section': False}" groups="base.group_multi_salesteams"/> <field name="user_id" string="Salesperson"/> @@ -45,14 +69,12 @@ <field name="date_closed"/> </group> <group expand="1" string="Group By"> - <filter string="Salesperson" name="Salesperson" icon="terp-personal" domain="[]" context="{'group_by':'user_id'}" /> - <filter string="Sales Team" icon="terp-personal+" domain="[]" context="{'group_by':'section_id'}" groups="base.group_multi_salesteams"/> - <filter string="Partner" icon="terp-partner" context="{'group_by':'partner_id'}" /> - <filter string="Priority" icon="terp-rating-rated" domain="[]" context="{'group_by':'priority'}" /> - <filter string="Category" icon="terp-stock_symbol-selection" domain="[]" context="{'group_by':'categ_id'}" /> - <filter string="Status" icon="terp-stock_effects-object-colorize" domain="[]" context="{'group_by':'state'}" /> - <filter string="Company" icon="terp-go-home" domain="[]" context="{'group_by':'company_id'}" groups="base.group_multi_company"/> - <filter string="Creation Date" icon="terp-go-month" domain="[]" context="{'group_by':'create_date:month'}" help="Month of call"/> + <filter string="Salesperson" name="Salesperson" context="{'group_by':'user_id'}" /> + <filter string="Sales Team" context="{'group_by':'section_id'}" groups="base.group_multi_salesteams"/> + <filter string="Customer" context="{'group_by':'partner_id'}" /> + <filter string="Status" context="{'group_by':'state'}" /> + <separator/> + <filter string="Creation Month" context="{'group_by':'create_date:month'}" help="Month of call"/> </group> </search> </field> @@ -65,7 +87,7 @@ <field name="res_model">crm.phonecall.report</field> <field name="view_type">form</field> <field name="view_mode">graph</field> - <field name="context">{"search_default_year":1,"search_default_Salesperson":1,"search_default_This Month":1,'group_by_no_leaf':1,'group_by':[]}</field> + <field name="context">{'group_by_no_leaf':1,'group_by':[]}</field> <field name="view_id" ref="view_report_crm_phonecall_graph"/> <field name="search_view_id" ref="view_report_crm_phonecall_filter"/> <field name="help">From this report, you can analyse the performance of your sales team, based on their phone calls. You can group or filter the information according to several criteria and drill down the information, by adding more groups in the report.</field> diff --git a/addons/crm_claim/report/crm_claim_report.py b/addons/crm_claim/report/crm_claim_report.py index 2855cc427a0..711cce0a6c1 100644 --- a/addons/crm_claim/report/crm_claim_report.py +++ b/addons/crm_claim/report/crm_claim_report.py @@ -39,7 +39,7 @@ class crm_claim_report(osv.osv): _columns = { 'user_id':fields.many2one('res.users', 'User', readonly=True), 'section_id':fields.many2one('crm.case.section', 'Section', readonly=True), - 'nbr': fields.integer('# of Cases', readonly=True), + 'nbr': fields.integer('# of Claims', readonly=True), # TDE FIXME master: rename into nbr_claims 'company_id': fields.many2one('res.company', 'Company', readonly=True), 'create_date': fields.datetime('Create Date', readonly=True, select=True), 'claim_date': fields.datetime('Claim Date', readonly=True), @@ -52,10 +52,11 @@ class crm_claim_report(osv.osv): 'company_id': fields.many2one('res.company', 'Company', readonly=True), 'priority': fields.selection(AVAILABLE_PRIORITIES, 'Priority'), 'type_action': fields.selection([('correction','Corrective Action'),('prevention','Preventive Action')], 'Action Type'), - 'date_closed': fields.date('Close Date', readonly=True, select=True), + 'date_closed': fields.datetime('Close Date', readonly=True, select=True), 'date_deadline': fields.date('Deadline', readonly=True, select=True), 'delay_expected': fields.float('Overpassed Deadline',digits=(16,2),readonly=True, group_operator="avg"), - 'email': fields.integer('# Emails', size=128, readonly=True) + 'email': fields.integer('# Emails', size=128, readonly=True), + 'subject': fields.char('Claim Subject', readonly=True) } def init(self, cr): @@ -70,7 +71,7 @@ class crm_claim_report(osv.osv): select min(c.id) as id, c.date as claim_date, - date(c.date_closed) as date_closed, + c.date_closed as date_closed, c.date_deadline as date_deadline, c.user_id, c.stage_id, @@ -78,6 +79,7 @@ class crm_claim_report(osv.osv): c.partner_id, c.company_id, c.categ_id, + c.name as subject, count(*) as nbr, c.priority as priority, c.type_action as type_action, diff --git a/addons/crm_claim/report/crm_claim_report_view.xml b/addons/crm_claim/report/crm_claim_report_view.xml index cf365d06df6..d4a7c978a5a 100644 --- a/addons/crm_claim/report/crm_claim_report_view.xml +++ b/addons/crm_claim/report/crm_claim_report_view.xml @@ -10,12 +10,20 @@ <field name="arch" type="xml"> <graph string="Claims" type="pivot" stacked="True"> <field name="stage_id" type="row"/> - <field name="user_id" type="col"/> + <field name="section_id" type="col"/> <field name="nbr" type="measure"/> </graph> </field> </record> +<!-- CRM Claim Report Custom reports (aka filters) --> + <record id="filter_report_crm_claim_workload" model="ir.filters"> + <field name="name">Workload</field> + <field name="model_id">crm.claim.report</field> + <field name="user_id" eval="False"/> + <field name="context">{'group_by': ['subject'], 'measures': ['email', 'delay_close']}</field> + </record> + <!-- CRM Claim Report Search View --> <record id="view_report_crm_claim_filter" model="ir.ui.view"> @@ -23,13 +31,11 @@ <field name="model">crm.claim.report</field> <field name="arch" type="xml"> <search string="Search"> - <filter string="My Sales Team(s)" icon="terp-personal+" context="{'invisible_section': False}" domain="[('section_id.user_id','=',uid)]" help="My Sales Team(s)" groups="base.group_multi_salesteams"/> + <filter string="My Case(s)" help="My Case(s)" domain="[('user_id','=',uid)]" /> + <filter string="My Sales Team(s)" context="{'invisible_section': False}" domain="[('section_id.user_id','=',uid)]" help="My Sales Team(s)" groups="base.group_multi_salesteams"/> <separator/> - <!-- A 'My Company' filter makes no sense regarding record rules, and is not possible to do (uid is not a company): remove me in 8.0 --> - <filter string="My Company" icon="terp-go-home" context="{'invisible_section': False}" domain="[]" help="My company" - invisible="1"/> + <filter string="My Company" context="{'invisible_section': False}" domain="[('company_id.user_ids','=',uid)]" help="My Company"/> <separator/> - <filter icon="terp-personal" string="My Case(s)" help="My Case(s)" domain="[('user_id','=',uid)]" /> <field name="company_id" groups="base.group_multi_company"/> <field name="user_id" string="Salesperson"/> <field name="section_id" string="Sales Team" context="{'invisible_section': False}" @@ -45,15 +51,14 @@ <field name="date_deadline" /> </group> <group expand="1" string="Group By"> - <filter string="Salesperson" name="Salesperson" icon="terp-personal" domain="[]" context="{'group_by':'user_id'}" /> - <filter string="Sales Team" icon="terp-personal+" domain="[]" context="{'group_by':'section_id'}" groups="base.group_multi_salesteams"/> - <filter string="Partner" name="partner" icon="terp-partner" domain="[]" context="{'group_by':'partner_id'}" /> - <filter string="Stage" icon="terp-stage" domain="[]" context="{'group_by':'stage_id'}" /> - <filter string="Priority" icon="terp-rating-rated" domain="[]" context="{'group_by':'priority'}" /> - <filter string="Category" icon="terp-stock_symbol-selection" domain="[]" context="{'group_by':'categ_id'}" /> - <filter string="Type" icon="terp-stock_symbol-selection" domain="[]" context="{'group_by':'type_action'}" help="Action Type"/> - <filter string="Company" icon="terp-go-home" domain="[]" context="{'group_by':'company_id'}" groups="base.group_multi_company"/> - <filter string="Claim Date" icon="terp-go-month" domain="[]" context="{'group_by':'claim_date'}" help="Month of claim"/> + <filter string="Salesperson" name="Salesperson" context="{'group_by':'user_id'}" /> + <filter string="Sales Team" context="{'group_by':'section_id'}" groups="base.group_multi_salesteams"/> + <filter string="Partner" name="partner" context="{'group_by':'partner_id'}" /> + <filter string="Stage" context="{'group_by':'stage_id'}" /> + <filter string="Category" context="{'group_by':'categ_id'}" /> + <filter string="Company" context="{'group_by':'company_id'}" groups="base.group_multi_company"/> + <separator/> + <filter string="Claim Month" context="{'group_by':'claim_date:month'}" help="Month of claim"/> </group> </search> </field> diff --git a/addons/crm_helpdesk/report/crm_helpdesk_report.py b/addons/crm_helpdesk/report/crm_helpdesk_report.py index 590cadb0fed..355daee5d7e 100644 --- a/addons/crm_helpdesk/report/crm_helpdesk_report.py +++ b/addons/crm_helpdesk/report/crm_helpdesk_report.py @@ -42,7 +42,7 @@ class crm_helpdesk_report(osv.osv): 'date': fields.datetime('Date', readonly=True), 'user_id':fields.many2one('res.users', 'User', readonly=True), 'section_id':fields.many2one('crm.case.section', 'Section', readonly=True), - 'nbr': fields.integer('# of Cases', readonly=True), + 'nbr': fields.integer('# of Requests', readonly=True), # TDE FIXME master: rename into nbr_requests 'state': fields.selection(AVAILABLE_STATES, 'Status', readonly=True), 'delay_close': fields.float('Delay to Close',digits=(16,2),readonly=True, group_operator="avg"), 'partner_id': fields.many2one('res.partner', 'Partner' , readonly=True), @@ -55,8 +55,8 @@ class crm_helpdesk_report(osv.osv): domain="[('section_id','=',section_id),\ ('object_id.model', '=', 'crm.helpdesk')]"), 'planned_cost': fields.float('Planned Costs'), - 'create_date': fields.date('Creation Date' , readonly=True, select=True), - 'date_closed': fields.date('Close Date', readonly=True, select=True), + 'create_date': fields.datetime('Creation Date' , readonly=True, select=True), + 'date_closed': fields.datetime('Close Date', readonly=True, select=True), 'delay_expected': fields.float('Overpassed Deadline',digits=(16,2),readonly=True, group_operator="avg"), 'email': fields.integer('# Emails', size=128, readonly=True), } @@ -74,8 +74,8 @@ class crm_helpdesk_report(osv.osv): select min(c.id) as id, c.date as date, - date(c.create_date) as create_date, - date(c.date_closed) as date_closed, + c.create_date, + c.date_closed, c.state, c.user_id, c.section_id, diff --git a/addons/crm_helpdesk/report/crm_helpdesk_report_view.xml b/addons/crm_helpdesk/report/crm_helpdesk_report_view.xml index e37d9970c05..b64a9fade61 100644 --- a/addons/crm_helpdesk/report/crm_helpdesk_report_view.xml +++ b/addons/crm_helpdesk/report/crm_helpdesk_report_view.xml @@ -10,7 +10,8 @@ <field name="arch" type="xml"> <graph orientation="horizontal" string="Helpdesk" type="pivot" stacked="True"> <field name="state" type="row"/> - <field name="user_id" type="row"/> + <field name="section_id" type="col"/> + <field name="date" interval="month" type="col"/> <field name="nbr" type="measure"/> </graph> </field> @@ -23,17 +24,17 @@ <field name="model">crm.helpdesk.report</field> <field name="arch" type="xml"> <search string="Search"> - <filter string="New" icon="terp-check" domain="[('state','=','draft')]" /> - <filter string="Open" icon="terp-camera_test" domain="[('state','=','open')]" /> - <filter string="Closed" icon="terp-dialog-close" domain="[('state','=','cancel')]" /> + <filter string="New" domain="[('state','=','draft')]" /> + <filter string="Open" domain="[('state','=','open')]" /> + <filter string="Closed" domain="[('state','=','cancel')]" /> <separator/> - <filter icon="terp-personal" string="My Case(s)" help="My Case(s)" domain="[('user_id','=',uid)]" /> + <filter string="My Case(s)" help="My Case(s)" domain="[('user_id','=',uid)]" /> <separator/> - <filter string="My Sales Team(s)" icon="terp-personal+" context="{'invisible_section': False}" domain="[('section_id.user_id','=',uid)]" help="My Sales Team(s)" groups="base.group_multi_salesteams"/> + <filter string="My Sales Team(s)" context="{'invisible_section': False}" domain="[('section_id.user_id','=',uid)]" help="My Sales Team(s)" groups="base.group_multi_salesteams"/> <separator/> - <filter string="My Company" icon="terp-go-home" context="{'invisible_section': False}" domain="[('section_id.user_id.company_id','=',uid)]" help="My company"/> + <filter string="My Company" context="{'invisible_section': False}" domain="[('company_id.user_ids','=',uid)]" help="My Company"/> <field name="user_id" string="Salesperson"/> - <field name="section_id" string="Sales Team" context="{'invisible_section': False}" groups="base.group_multi_salesteams"/> + <field name="section_id" string="Sales Team" context="{'invisible_section': False}" groups="base.group_multi_salesteams"/> <field name="company_id" groups="base.group_multi_company"/> <field name="partner_id" filter_domain="[('partner_id','child_of',self)]"/> <group expand="0" string="Extended Filters..." groups="base.group_no_one"> @@ -43,13 +44,13 @@ <field name="date_closed" string="Close Date"/> </group> <group expand="1" string="Group By"> - <filter string="Salesperson" icon="terp-personal" domain="[]" context="{'group_by':'user_id'}"/> - <filter string="Sales Team" icon="terp-personal+" domain="[]" context="{'group_by':'section_id'}" groups="base.group_multi_salesteams"/> - <filter string="Partner" icon="terp-partner" domain="[]" context="{'group_by':'partner_id'}" /> - <filter string="Channel" icon="terp-call-start" domain="[]" context="{'group_by':'channel_id'}" /> - <filter string="Status" icon="terp-stock_effects-object-colorize" domain="[]" context="{'group_by':'state'}" /> - <filter string="Company" icon="terp-go-home" domain="[]" groups="base.group_multi_company" context="{'group_by':'company_id'}" /> - <filter string="Date" icon="terp-go-month" domain="[]" context="{'group_by':'date'}" help="Month of helpdesk requests"/> + <filter string="Salesperson" context="{'group_by':'user_id'}"/> + <filter string="Sales Team" context="{'group_by':'section_id'}" groups="base.group_multi_salesteams"/> + <filter string="Partner" context="{'group_by':'partner_id'}" /> + <filter string="Status" context="{'group_by':'state'}" /> + <filter string="Company" groups="base.group_multi_company" context="{'group_by':'company_id'}" /> + <separator/> + <filter string="Month" context="{'group_by':'date:month'}" help="Month of helpdesk requests"/> </group> </search> </field> @@ -80,4 +81,3 @@ </data> </openerp> - diff --git a/addons/crm_partner_assign/crm_lead_view.xml b/addons/crm_partner_assign/crm_lead_view.xml index aefc5aef000..d14e7862a95 100644 --- a/addons/crm_partner_assign/crm_lead_view.xml +++ b/addons/crm_partner_assign/crm_lead_view.xml @@ -59,7 +59,7 @@ <field name="model">crm.lead</field> <field name="inherit_id" ref="crm.view_crm_case_opportunities_filter"/> <field name="arch" type="xml"> - <filter string="Customer" position="after"> + <filter string="Stage" position="after"> <filter string="Assigned Partner" domain="[]" context="{'group_by':'partner_assigned_id'}"/> </filter> <filter name="unassigned" position="after"> @@ -148,7 +148,7 @@ if context.get('active_model') == 'crm.lead': ids = [] if context.get('active_domain'): - ids = self.search(cr, uid, context['active_domain'], context=context) + ids = self.search(cr, uid, context['active_domain'], context=context) elif context.get('active_ids'): ids = context['active_ids'] if ids: diff --git a/addons/crm_partner_assign/report/crm_lead_report.py b/addons/crm_partner_assign/report/crm_lead_report.py index 58ef013d60d..1492a79de3d 100644 --- a/addons/crm_partner_assign/report/crm_lead_report.py +++ b/addons/crm_partner_assign/report/crm_lead_report.py @@ -47,14 +47,14 @@ class crm_lead_report_assign(osv.osv): 'probable_revenue': fields.float('Probable Revenue', digits=(16,2),readonly=True), 'stage_id': fields.many2one ('crm.case.stage', 'Stage', domain="[('section_ids', '=', section_id)]"), 'partner_id': fields.many2one('res.partner', 'Customer' , readonly=True), - 'opening_date': fields.date('Opening Date', readonly=True), - 'date_closed': fields.date('Close Date', readonly=True), - 'nbr': fields.integer('# of Cases', readonly=True), + 'opening_date': fields.datetime('Opening Date', readonly=True), + 'date_closed': fields.datetime('Close Date', readonly=True), + 'nbr': fields.integer('# of Cases', readonly=True), # TDE FIXME master: rename into nbr_cases 'company_id': fields.many2one('res.company', 'Company', readonly=True), 'priority': fields.selection(crm.AVAILABLE_PRIORITIES, 'Priority'), 'type':fields.selection([ ('lead','Lead'), - ('opportunity','Opportunity') + ('opportunity','Opportunity') ],'Type', help="Type is used to separate Leads and Opportunities"), } def init(self, cr): @@ -68,8 +68,8 @@ class crm_lead_report_assign(osv.osv): CREATE OR REPLACE VIEW crm_lead_report_assign AS ( SELECT c.id, - date(c.date_open) as opening_date, - date(c.date_closed) as date_closed, + c.date_open as opening_date, + c.date_closed as date_closed, c.date_assign, c.user_id, c.probability, @@ -85,7 +85,7 @@ class crm_lead_report_assign(osv.osv): c.partner_assigned_id, p.grade_id, p.date as partner_date, - c.planned_revenue*(c.probability/100) as probable_revenue, + c.planned_revenue*(c.probability/100) as probable_revenue, 1 as nbr, c.create_date as create_date, extract('epoch' from (c.write_date-c.create_date))/(3600*24) as delay_close, diff --git a/addons/crm_partner_assign/report/crm_lead_report_view.xml b/addons/crm_partner_assign/report/crm_lead_report_view.xml index 22897962b7b..37f42d97341 100644 --- a/addons/crm_partner_assign/report/crm_lead_report_view.xml +++ b/addons/crm_partner_assign/report/crm_lead_report_view.xml @@ -22,19 +22,15 @@ <field name="date_closed"/> </group> <group expand="1" string="Group By"> - <filter string="Salesperson" name="user" icon="terp-personal" - domain="[]" context="{'group_by':'user_id'}" /> - <filter string="Partner" icon="terp-partner" context="{'group_by':'partner_assigned_id'}" /> - <filter string="Country" icon="terp-go-home" context="{'group_by':'country_id'}" /> - <filter string="Sales Team" icon="terp-personal+" - domain="[]" - context="{'group_by':'section_id'}" groups="base.group_multi_salesteams"/> - <filter string="Grade" name="group_grade" icon="terp-stock_symbol-selection" - domain="[]" context="{'group_by':'grade_id'}" /> - <filter string="Stage" icon="terp-stage" domain="[]" context="{'group_by':'stage_id'}"/> - <filter string="Priority" icon="terp-rating-rated" domain="[]" context="{'group_by':'priority'}" /> - <filter string="Company" icon="terp-go-home" domain="[]" context="{'group_by':'company_id'}" /> - <filter string="Assign Date" icon="terp-go-month" domain="[]" context="{'group_by':'date_assign:month'}"/> + <filter string="Salesperson" name="user" + context="{'group_by':'user_id'}" /> + <filter string="Sales Team" context="{'group_by':'section_id'}" + groups="base.group_multi_salesteams"/> + <filter string="Country" context="{'group_by':'country_id'}" /> + <filter string="Stage" context="{'group_by':'stage_id'}"/> + <filter string="Company" context="{'group_by':'company_id'}" /> + <separator/> + <filter string="Assign Month" context="{'group_by':'date_assign:month'}"/> </group> </search> </field> @@ -47,10 +43,10 @@ <field name="model">crm.lead.report.assign</field> <field name="arch" type="xml"> <graph string="Lead Assign" type="pivot" stacked="True"> - <field name="grade_id" type="row"/> - <field name="date_assign" interval="month" type="row"/> - <field name="nbr" type="measure"/> - <field name="probable_revenue" type="measure"/> + <field name="stage_id" type="row"/> + <field name="date_assign" interval="month" type="col"/> + <field name="delay_open" type="measure"/> + <field name="probability" type="measure"/> </graph> </field> </record> diff --git a/addons/crm_partner_assign/report/crm_partner_report.py b/addons/crm_partner_assign/report/crm_partner_report.py index 6f07a8ce03a..4f0fe14297d 100644 --- a/addons/crm_partner_assign/report/crm_partner_report.py +++ b/addons/crm_partner_assign/report/crm_partner_report.py @@ -36,7 +36,7 @@ class crm_partner_report_assign(osv.osv): 'date_partnership' : fields.date('Partnership Date'), 'country_id':fields.many2one('res.country', 'Country', readonly=True), 'section_id':fields.many2one('crm.case.section', 'Sales Team', readonly=True), - 'opp': fields.integer('# of Opportunity', readonly=True), + 'opp': fields.integer('# of Opportunity', readonly=True), # TDE FIXME master: rename into nbr_opportunities 'turnover': fields.float('Turnover', readonly=True), 'period_id': fields.many2one('account.period', 'Invoice Period', readonly=True), } diff --git a/addons/crm_partner_assign/report/crm_partner_report_view.xml b/addons/crm_partner_assign/report/crm_partner_report_view.xml index a054d4d7605..ba24a771768 100644 --- a/addons/crm_partner_assign/report/crm_partner_report_view.xml +++ b/addons/crm_partner_assign/report/crm_partner_report_view.xml @@ -13,23 +13,17 @@ <field name="grade_id"/> <field name="activation"/> <group expand="1" string="Group By"> - <filter string="Salesperson" name="user" icon="terp-personal" - domain="[]" context="{'group_by':'user_id'}" /> - <filter string="Country" icon="terp-go-home" name="group_country" context="{'group_by':'country_id'}" /> - <filter string="Sales Team" icon="terp-personal+" - domain="[]" context="{'group_by':'section_id'}" groups="base.group_multi_salesteams"/> - <filter string="Activation" name="group_activation" icon="terp-stock_symbol-selection" - domain="[]" context="{'group_by':'activation'}" /> - <filter string="Grade" name="group_grade" icon="terp-stock_symbol-selection" - domain="[]" context="{'group_by':'grade_id'}" /> - <filter string="Partner" name="" icon="terp-stock_symbol-selection" - domain="[]" context="{'group_by':'partner_id'}" /> - <filter string="Invoice Period" name="group_period_id" icon="terp-stock_symbol-selection" - domain="[]" context="{'group_by':'period_id'}" /> - <filter string="Date Partnership" name="group_date_partnership" icon="terp-stock_symbol-selection" - domain="[]" context="{'group_by':'date_partnership'}" /> - <filter string="Date Review" name="group_date_review" icon="terp-stock_symbol-selection" - domain="[]" context="{'group_by':'date_review'}" /> + <filter string="Salesperson" name="user" + context="{'group_by':'user_id'}" /> + <filter string="Sales Team" + context="{'group_by':'section_id'}" groups="base.group_multi_salesteams"/> + <filter string="Partner" name="" + context="{'group_by':'partner_id'}" /> + <separator/> + <filter string="Date Partnership" name="group_date_partnership" + context="{'group_by':'date_partnership'}" /> + <filter string="Date Review" name="group_date_review" + context="{'group_by':'date_review'}" /> </group> </search> </field> diff --git a/addons/event/report/report_event_registration.py b/addons/event/report/report_event_registration.py index 7eb1d122846..5e56ce5cb2f 100644 --- a/addons/event/report/report_event_registration.py +++ b/addons/event/report/report_event_registration.py @@ -34,7 +34,8 @@ class report_event_registration(models.Model): draft_state = fields.Integer(' # No of Draft Registrations') confirm_state = fields.Integer(' # No of Confirmed Registrations') seats_max = fields.Integer('Max Seats') - nbevent = fields.Integer('Number of Registrations') + nbevent = fields.Integer('Number of Events') + nbregistration = fields.Integer('Number of Registrations') event_type = fields.Many2one('event.type', 'Event Type') registration_state = fields.Selection([('draft', 'Draft'), ('confirm', 'Confirmed'), ('done', 'Attended'), ('cancel', 'Cancelled')], 'Registration State', readonly=True, required=True) event_state = fields.Selection([('draft', 'Draft'), ('confirm', 'Confirmed'), ('done', 'Done'), ('cancel', 'Cancelled')], 'Event State', readonly=True, required=True) @@ -58,6 +59,7 @@ class report_event_registration(models.Model): e.company_id AS company_id, e.date_begin AS event_date, count(r.id) AS nbevent, + sum(r.nb_register) AS nbregistration, CASE WHEN r.state IN ('draft') THEN r.nb_register ELSE 0 END AS draft_state, CASE WHEN r.state IN ('open','done') THEN r.nb_register ELSE 0 END AS confirm_state, e.type AS event_type, diff --git a/addons/event/report/report_event_registration_view.xml b/addons/event/report/report_event_registration_view.xml index 8df4a032fee..07711af5722 100644 --- a/addons/event/report/report_event_registration_view.xml +++ b/addons/event/report/report_event_registration_view.xml @@ -9,7 +9,7 @@ <graph string="Event on Registration" type="pivot" > <field name="event_type" type="row"/> <field name="event_date" interval="month" type="col"/> - <field name="nbevent" type="measure"/> + <field name="nbregistration" type="measure"/> <field name="confirm_state" type="measure"/> </graph> </field> @@ -21,10 +21,10 @@ <field name="model">report.event.registration</field> <field name="arch" type="xml"> <search string="Event on Registration"> - <filter icon="terp-document-new" string="New" domain="[('event_state','=','draft')]" help="Events which are in New state"/> - <filter icon="terp-check" string="Confirm" domain="[('event_state','=','confirm')]" help="Events which are in confirm state"/> + <filter string="New" domain="[('event_state','=','draft')]" help="Events which are in New state"/> + <filter string="Confirm" domain="[('event_state','=','confirm')]" help="Events which are in confirm state"/> <separator/> - <filter icon="terp-personal" string="My Events" help="My Events" domain="[('user_id','=',uid)]"/> + <filter string="My Events" help="My Events" domain="[('user_id','=',uid)]"/> <field name="event_id" string="Event"/> <field name="user_id"/> <group expand="0" string="Extended Filters..."> @@ -33,18 +33,16 @@ </group> <newline/> <group expand="1" string="Group By"> - <filter string="Participant / Contact" icon="terp-personal" context="{'group_by':'name_registration'}" help="Registration contact"/> - <filter string="Register" icon="terp-personal" context="{'group_by':'user_id_registration'}" help="Registration contact" groups="base.group_no_one"/> - <filter string="Event Responsible" name="user_id" icon="terp-personal" context="{'group_by': 'user_id'}"/> - <filter string="Event" name="event" icon="terp-crm" context="{'group_by':'event_id', 'max_reg_event_visible':0}"/> - <filter string="Event Type" icon="terp-crm" context="{'group_by':'event_type'}"/> - <filter string="Event State" icon="terp-stock_effects-object-colorize" context="{'group_by':'event_state'}"/> - <filter string="Registration State" icon="terp-stock_effects-object-colorize" context="{'group_by':'registration_state'}"/> - <filter string="Company" icon="terp-go-home" domain="[]" context="{'group_by':'company_id'}" groups="base.group_multi_company"/> - <filter string="Event Date" domain="[]" context="{'group_by':'event_date'}" help="Event Beginning Date"/> + <filter string="Participant" context="{'group_by':'name_registration'}" help="Registration contact"/> + <filter string="Event Type" context="{'group_by':'event_type'}"/> + <filter string="Event" name="event" context="{'group_by':'event_id', 'max_reg_event_visible':0}"/> + <filter string="Event State" context="{'group_by':'event_state'}"/> + <filter string="Company" context="{'group_by':'company_id'}" groups="base.group_multi_company"/> + <separator/> + <filter string="Event Month" context="{'group_by':'event_date:month'}" help="Event Beginning Date"/> </group> <group expand="0" string="Display"> - <filter icon="terp-camera_test" string="Show Confirmed Registrations" + <filter string="Show Confirmed Registrations" domain="[('event_state','<>','draft')]" help="Registrations in confirmed or done state" context="{'no_of_draft_invisible':1}"/> </group> </search> diff --git a/addons/fleet/fleet_board_view.xml b/addons/fleet/fleet_board_view.xml index fd02739b68e..4775990f222 100644 --- a/addons/fleet/fleet_board_view.xml +++ b/addons/fleet/fleet_board_view.xml @@ -4,10 +4,10 @@ <record model="ir.actions.act_window" id="action_fleet_reporting_costs"> <field name="name">Costs Analysis</field> <field name="res_model">fleet.vehicle.cost</field> - <field name="view_id" ref="fleet_vehicle_costs_report"></field> + <field name="view_id" ref="fleet_vehicle_effective_costs_report"></field> <field name="view_type">form</field> <field name="view_mode">graph</field> - <field name="context">{"search_default_parent_false" : True,"search_default_groupby_year" : True, "search_default_groupby_cost_subtype" : True,"search_default_groupby_vehicle_id" : True}</field> + <field name="context">{"search_default_parent_false" : True,}</field> <field name="help" type="html"> <p> Odoo helps you managing the costs for your different vehicles @@ -23,10 +23,10 @@ <record model="ir.actions.act_window" id="action_fleet_reporting_costs_non_effective"> <field name="name">Indicative Costs Analysis</field> <field name="res_model">fleet.vehicle.cost</field> - <field name="view_id" ref="fleet_vehicle_costs_report"></field> + <field name="view_id" ref="fleet_vehicle_indicative_costs_report"></field> <field name="view_type">form</field> <field name="view_mode">graph</field> - <field name="context">{"search_default_parent_true" : True,"search_default_groupby_cost_subtype" : True,"search_default_groupby_parent_id" : True,}</field> + <field name="context">{"search_default_parent_true" : True,}</field> <field name="help" type="html"> <p> Odoo helps you managing the costs for your different vehicles @@ -38,17 +38,17 @@ </p> </field> </record> - + <menuitem name="Fleet" parent="base.menu_reporting" id="menu_fleet_reporting" sequence="50" groups="group_fleet_manager"/> - <menuitem id="menu_fleet_reporting_costs" - parent="menu_fleet_reporting" - action="action_fleet_reporting_costs" + <menuitem id="menu_fleet_reporting_costs" + parent="menu_fleet_reporting" + action="action_fleet_reporting_costs" sequence="1" groups="group_fleet_manager"/> - <menuitem id="menu_fleet_reporting_indicative_costs" - parent="menu_fleet_reporting" - action="action_fleet_reporting_costs_non_effective" + <menuitem id="menu_fleet_reporting_indicative_costs" + parent="menu_fleet_reporting" + action="action_fleet_reporting_costs_non_effective" sequence="2" groups="group_fleet_manager"/> </data> diff --git a/addons/fleet/fleet_view.xml b/addons/fleet/fleet_view.xml index 9c418bacc90..fe767728ade 100644 --- a/addons/fleet/fleet_view.xml +++ b/addons/fleet/fleet_view.xml @@ -82,7 +82,7 @@ </p> </field> </record> - + <record model='ir.ui.view' id='fleet_vehicle_model_brand_tree'> <field name="name">fleet.vehicle.model.brand.tree</field> <field name="model">fleet.vehicle.model.brand</field> @@ -162,7 +162,7 @@ <tree string="State" editable="bottom"> <field name="sequence" widget="handler" invisible="1"/> <field name="name" /> - + </tree> </field> </record> @@ -196,8 +196,8 @@ <header> <field name="state_id" widget="statusbar" clickable="True" /> </header> - <sheet> - <field name="image_medium" widget='image' class="oe_left oe_avatar"/> + <sheet> + <field name="image_medium" widget='image' class="oe_left oe_avatar"/> <div class="oe_title"> <label for="model_id" class="oe_edit_only"/> <h1> @@ -211,47 +211,47 @@ <field name="tag_ids" widget="many2many_tags" /> </div> <div class="oe_right oe_button_box"> - <button name="return_action_to_open" + <button name="return_action_to_open" type="object" class="oe_stat_button" - icon="fa-book" - context="{'xml_id':'fleet_vehicle_log_contract_act'}" + icon="fa-book" + context="{'xml_id':'fleet_vehicle_log_contract_act'}" help="show the contract for this vehicle"> <field name="contract_count" widget="statinfo" string="Contracts"/> </button> - <button name="act_show_log_cost" + <button name="act_show_log_cost" type="object" class="oe_stat_button" - icon="fa-usd" - help="show all the costs for this vehicle" + icon="fa-usd" + help="show all the costs for this vehicle" groups="fleet.group_fleet_manager"> <field name="cost_count" widget="statinfo" string="Costs"/> </button> - <button name="return_action_to_open" + <button name="return_action_to_open" type="object" class="oe_stat_button" - icon="fa-wrench" - context="{'xml_id':'fleet_vehicle_log_services_act'}" + icon="fa-wrench" + context="{'xml_id':'fleet_vehicle_log_services_act'}" help="show the services logs for this vehicle" > <field name="service_count" widget="statinfo" string="Services"/> </button> - <button name="return_action_to_open" + <button name="return_action_to_open" type="object" class="oe_stat_button" - icon="fa-flask" - context="{'xml_id':'fleet_vehicle_log_fuel_act'}" + icon="fa-flask" + context="{'xml_id':'fleet_vehicle_log_fuel_act'}" help="show the fuel logs for this vehicle" > <field name="fuel_logs_count" widget="statinfo" string="Fuel"/> </button> - <button name="return_action_to_open" - type="object" + <button name="return_action_to_open" + type="object" class="oe_stat_button" icon="fa-tachometer" - context="{'xml_id':'fleet_vehicle_odometer_act'}" + context="{'xml_id':'fleet_vehicle_odometer_act'}" help="show the odometer logs for this vehicle" > <field name="odometer_count" widget="statinfo" string="Odometer"/> </button> - </div> + </div> <group col="2" string="General Properties"> <group > <field name="driver_id" /> @@ -355,7 +355,7 @@ <field name="contract_renewal_overdue" /> <field name="contract_renewal_name" /> <field name="contract_renewal_total" /> - + <templates> <t t-name="kanban-box"> <div class="oe_kanban_vignette oe_semantic_html_override"> @@ -384,7 +384,7 @@ </span> </a> </t> - + <ul> <li> <t t-if="record.driver_id.raw_value"><field name="driver_id"/></t> @@ -392,7 +392,7 @@ <li> <t t-if="record.location.raw_value"><field name="location"/></t> </li> - + </ul> <field name="tag_ids"/> @@ -403,7 +403,7 @@ </kanban> </field> </record> - + <record model='ir.actions.act_window' id='fleet_vehicle_act'> <field name="name">Vehicles</field> @@ -412,7 +412,7 @@ <field name="view_mode">kanban,tree,form</field> <field name="help" type="html"> <p class="oe_view_nocontent_create"> - Click to create a new vehicle. + Click to create a new vehicle. </p><p> You will be able to manage your fleet by keeping track of the contracts, services, fixed and recurring costs, odometers and @@ -507,7 +507,7 @@ </record> <act_window - + id="act_renew_contract" name="Renew Contract" res_model="fleet.vehicle.log.contract" @@ -555,7 +555,7 @@ <field name="view_mode">tree,form,graph</field> <field name="help" type="html"> <p class="oe_view_nocontent_create"> - Click to create a new contract. + Click to create a new contract. </p><p> Manage all your contracts (leasing, insurances, etc.) with their related services, costs. Odoo will automatically warn @@ -600,7 +600,7 @@ </tree> </field> </record> - + <record model='ir.ui.view' id='fleet_vehicle_odometer_search'> <field name="name">fleet.vehicle.odometer.search</field> <field name="model">fleet.vehicle.odometer</field> @@ -622,7 +622,7 @@ <field name="model">fleet.vehicle.odometer</field> <field name="arch" type="xml"> <graph string="Odometer Values Per Vehicle"> - <field name="vehicle_id" type="row"/> + <field name="vehicle_id" type="row"/> <field name="value" type="measure"/> </graph> </field> @@ -636,7 +636,7 @@ <field name="context">{"search_default_groupby_vehicle" : True}</field> <field name="help" type="html"> <p class="oe_view_nocontent_create"> - Click to create a new odometer log. + Click to create a new odometer log. </p> <p> Here you can add various odometer entries for all vehicles. @@ -692,11 +692,11 @@ <field name="model">fleet.vehicle.log.fuel</field> <field name="arch" type="xml"> <tree string="Fuel Logs"> - <field name="date" /> + <field name="date" /> <field name="vehicle_id" /> <field name="odometer" invisible="1"/> <field name="odometer_unit" invisible="1"/> - <field name="purchaser_id" /> + <field name="purchaser_id" /> <field name="inv_ref" invisible="1"/> <field name="vendor_id" invisible="1"/> <field name="liter" /> @@ -705,7 +705,7 @@ </tree> </field> </record> - + <record model='ir.ui.view' id='fleet_vehicle_log_fuel_search'> <field name="name">fleet.vehicle.log.fuel.search</field> <field name="model">fleet.vehicle.log.fuel</field> @@ -742,7 +742,7 @@ <field name="context">{"search_default_groupby_vehicle" : True}</field> <field name="help" type="html"> <p class="oe_view_nocontent_create"> - Click to create a new fuel log. + Click to create a new fuel log. </p><p> Here you can add refuelling entries for all vehicles. You can also filter logs of a particular vehicle using the search @@ -821,7 +821,7 @@ <field name="arch" type="xml"> <graph string="Services Costs Per Month" stacked="True"> <field name="date" type="row"/> - <field name="vehicle_id" type="row"/> + <field name="vehicle_id" type="row"/> <field name="cost_amount" type="measure"/> </graph> </field> @@ -845,7 +845,7 @@ <field name="view_mode">tree,form,graph</field> <field name="help" type="html"> <p class="oe_view_nocontent_create"> - Click to create a new service entry. + Click to create a new service entry. </p><p> Odoo helps you keeping track of all the services done on your vehicle. Services can be of many type: occasional @@ -898,15 +898,26 @@ </field> </record> - <record model='ir.ui.view' id='fleet_vehicle_costs_report'> + <record model='ir.ui.view' id='fleet_vehicle_effective_costs_report'> <field name="name">fleet.vehicle.cost.graph</field> <field name="model">fleet.vehicle.cost</field> <field name="arch" type="xml"> <graph string="Vehicles costs" type="pivot"> - <field name="date" interval="year" type="row"/> <field name="vehicle_id" type="row"/> + <field name="cost_type" type="row"/> + <field name="date" interval="year" type="col"/> + <field name="amount" type="measure"/> + </graph> + </field> + </record> + + <record model='ir.ui.view' id='fleet_vehicle_indicative_costs_report'> + <field name="name">fleet.vehicle.cost.graph</field> + <field name="model">fleet.vehicle.cost</field> + <field name="arch" type="xml"> + <graph string="Vehicles costs" type="pivot"> + <field name="parent_id" type="row"/> <field name="cost_type" type="col"/> - <!-- <field name="cost_subtype_id"/> --> <field name="amount" type="measure"/> </graph> </field> @@ -924,12 +935,13 @@ <filter name="parent_false" domain="[('parent_id','=',False)]" string="Effective Costs"/> <filter name="parent_true" domain="[('parent_id','!=',False)]" string="Indicative Costs"/> <group expand="1" string="Group By"> - <filter name="groupby_year" context="{'group_by' : 'date:year'}" string="Year"/> - <filter name="groupby_date" context="{'group_by' : 'date'}" string="Vehicle Costs Month" help="Vehicle Costs by Month"/> - <filter name="groupby_cost_type" context="{'group_by' : 'cost_type'}" string="Cost Type"/> - <filter name="groupby_cost_subtype_id" context="{'group_by' : 'cost_subtype_id'}" string="Cost Subtype"/> - <filter name="groupby_vehicle_id" context="{'group_by' : 'vehicle_id'}" string="Vehicle"/> - <filter name="groupby_parent_id" context="{'group_by' : 'parent_id'}" string="Parent"/> + <filter name="groupby_cost_type" context="{'group_by': 'cost_type'}" string="Cost Type"/> + <filter name="groupby_cost_subtype_id" context="{'group_by': 'cost_subtype_id'}" string="Cost Subtype"/> + <filter name="groupby_vehicle_id" context="{'group_by': 'vehicle_id'}" string="Vehicle"/> + <filter name="groupby_parent_id" context="{'group_by': 'parent_id'}" string="Parent"/> + <separator/> + <filter name="groupby_date" context="{'group_by': 'date:month'}" string="Month" help="Vehicle Costs by Month"/> + <filter name="groupby_year" context="{'group_by': 'date:year'}" string="Year"/> </group> </search> </field> diff --git a/addons/hr_attendance/hr_attendance_view.xml b/addons/hr_attendance/hr_attendance_view.xml index 5075cc13501..50040c718a7 100644 --- a/addons/hr_attendance/hr_attendance_view.xml +++ b/addons/hr_attendance/hr_attendance_view.xml @@ -51,14 +51,15 @@ <search string="Hr Attendance Search"> <field name="name" string="Attendance"/> <field name="action"/> - <filter icon="terp-go-today" string="Today" name="today" domain="[('name','>=',current_date),('name','<=',current_date)]" /> + <filter string="Today" name="today" domain="[('name','>=',current_date),('name','<=',current_date)]" /> <filter string="Current Month" domain="[('name','>=', datetime.datetime.now().strftime('%Y-%m-01'))]" /> <separator/> - <filter icon="terp-stock_align_left_24" string="My Attendance" domain="[('employee_id.user_id.id', '=', uid)]" /> + <filter string="My Attendance" domain="[('employee_id.user_id.id', '=', uid)]" /> <field name="employee_id"/> <group expand="0" string="Group By"> - <filter name="employee" string="Employee" icon="terp-personal" domain="[]" context="{'group_by':'employee_id'}"/> - <filter name="name" string="Date" icon="terp-personal" domain="[]" context="{'group_by':'name'}"/> + <filter name="employee" string="Employee" context="{'group_by':'employee_id'}"/> + <separator/> + <filter name="name" string="Month" context="{'group_by':'name'}"/> </group> </search> </field> @@ -152,7 +153,7 @@ <field name="active" position="before"> <label for="state" groups="base.group_hr_attendance"/> <div groups="base.group_hr_attendance"> - <field name="state" class="oe_inline"/> - + <field name="state" class="oe_inline"/> - <button class="oe_link" name="attendance_action_change" states="present" string="Sign Out" type="object" context="{'type':'sign_out'}" groups="base.group_hr_user"/> <button class="oe_link" name="attendance_action_change" states="absent" string="Sign In" type="object" context="{'type':'sign_in'}" groups="base.group_hr_user"/> </div> @@ -162,5 +163,3 @@ </data> </openerp> - - diff --git a/addons/hr_evaluation/report/hr_evaluation_report.py b/addons/hr_evaluation/report/hr_evaluation_report.py index 163562bfc72..3a62b62f3e8 100644 --- a/addons/hr_evaluation/report/hr_evaluation_report.py +++ b/addons/hr_evaluation/report/hr_evaluation_report.py @@ -28,12 +28,12 @@ class hr_evaluation_report(osv.Model): _description = "Evaluations Statistics" _auto = False _columns = { - 'create_date': fields.date('Create Date', readonly=True), + 'create_date': fields.datetime('Create Date', readonly=True), 'delay_date': fields.float('Delay to Start', digits=(16, 2), readonly=True), 'overpass_delay': fields.float('Overpassed Deadline', digits=(16, 2), readonly=True), 'deadline': fields.date("Deadline", readonly=True), - 'request_id': fields.many2one('survey.user_input', 'Request_id', readonly=True), - 'closed': fields.date("closed", readonly=True), + 'request_id': fields.many2one('survey.user_input', 'Request ID', readonly=True), + 'closed': fields.date("Close Date", readonly=True), # TDE FIXME master: rename into date_close 'plan_id': fields.many2one('hr_evaluation.plan', 'Plan', readonly=True), 'employee_id': fields.many2one('hr.employee', "Employee", readonly=True), 'rating': fields.selection([ @@ -43,7 +43,7 @@ class hr_evaluation_report(osv.Model): ('3', 'Exceeds expectations'), ('4', 'Significantly exceeds expectations'), ], "Overall Rating", readonly=True), - 'nbr': fields.integer('# of Requests', readonly=True), + 'nbr': fields.integer('# of Requests', readonly=True), # TDE FIXME master: rename into nbr_requests 'state': fields.selection([ ('draft', 'Draft'), ('wait', 'Plan In Progress'), @@ -68,7 +68,7 @@ class hr_evaluation_report(osv.Model): create or replace view hr_evaluation_report as ( select min(l.id) as id, - date(s.create_date) as create_date, + s.create_date as create_date, s.employee_id, l.request_id, s.plan_id, @@ -97,4 +97,3 @@ class hr_evaluation_report(osv.Model): # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: - diff --git a/addons/hr_evaluation/report/hr_evaluation_report_view.xml b/addons/hr_evaluation/report/hr_evaluation_report_view.xml index 5793aa6d206..a93853be41c 100644 --- a/addons/hr_evaluation/report/hr_evaluation_report_view.xml +++ b/addons/hr_evaluation/report/hr_evaluation_report_view.xml @@ -8,7 +8,7 @@ <field name="arch" type="xml"> <graph string="Appraisal Analysis" type="pivot" stacked="True"> <field name="employee_id" type="row"/> - <field name="state" type="col"/> + <field name="create_date" interval="month" type="col"/> <field name="nbr" type="measure"/> </graph> </field> @@ -19,9 +19,9 @@ <field name="model">hr.evaluation.report</field> <field name="arch" type="xml"> <search string="Appraisal Analysis"> - <filter string="In Progress" icon="terp-camera_test" domain="[('state', '=' ,'wait')]" help = "In progress Evaluations"/> - <filter string="Final Validation" icon="terp-camera_test" domain="[('state','=','progress')]" help = "Final Validation Evaluations"/> - <filter icon="terp-dialog-close" string="Done" domain="[('state','=','done')]"/> + <filter string="In Progress" domain="[('state', '=' ,'wait')]" help = "In progress Evaluations"/> + <filter string="Final Validation" domain="[('state','=','progress')]" help = "Final Validation Evaluations"/> + <filter string="Done" domain="[('state','=','done')]"/> <field name="employee_id"/> <field name="plan_id"/> <group expand="0" string="Extended Filters..."> @@ -31,11 +31,12 @@ <field name="create_date"/> </group> <group expand="1" string="Group By"> - <filter string="Employee" name="employee" icon="terp-personal" context="{'group_by':'employee_id'}"/> - <filter string="Plan" icon="terp-stock_align_left_24" context="{'group_by':'plan_id'}"/> - <filter string="Appreciation" icon="terp-face-plain" context="{'group_by':'rating'}"/> - <filter string="Status" icon="terp-stock_effects-object-colorize" context="{'group_by':'state'}"/> - <filter string="Creation Date" icon="terp-go-month" context="{'group_by':'create_date'}" help="Creation Date"/> + <filter string="Employee" name="employee" context="{'group_by':'employee_id'}"/> + <filter string="Plan" context="{'group_by':'plan_id'}"/> + <filter string="Appreciation" context="{'group_by':'rating'}"/> + <filter string="Status" context="{'group_by':'state'}"/> + <separator/> + <filter string="Month" context="{'group_by':'create_date:month'}" help="Creation Month"/> </group> </search> </field> diff --git a/addons/hr_expense/report/hr_expense_report.py b/addons/hr_expense/report/hr_expense_report.py index 531f5348357..23f27b8cdaf 100644 --- a/addons/hr_expense/report/hr_expense_report.py +++ b/addons/hr_expense/report/hr_expense_report.py @@ -35,7 +35,7 @@ class hr_expense_report(osv.osv): 'create_date': fields.datetime('Creation Date', readonly=True), 'product_id':fields.many2one('product.product', 'Product', readonly=True), 'journal_id': fields.many2one('account.journal', 'Force Journal', readonly=True), - 'product_qty':fields.float('Qty', readonly=True), + 'product_qty':fields.float('Product Quantity', readonly=True), 'employee_id': fields.many2one('hr.employee', "Employee's Name", readonly=True), 'date_confirm': fields.date('Confirmation Date', readonly=True), 'date_valid': fields.date('Validation Date', readonly=True), @@ -48,7 +48,7 @@ class hr_expense_report(osv.osv): 'delay_confirm':fields.float('Delay to Confirm', readonly=True), 'analytic_account': fields.many2one('account.analytic.account','Analytic account',readonly=True), 'price_average':fields.float('Average Price', readonly=True, digits_compute=dp.get_precision('Account')), - 'nbr':fields.integer('# of Lines', readonly=True), + 'nbr':fields.integer('# of Lines', readonly=True), # TDE FIXME master: rename into nbr_lines 'no_of_products':fields.integer('# of Products', readonly=True), 'no_of_account':fields.integer('# of Accounts', readonly=True), 'state': fields.selection([ diff --git a/addons/hr_expense/report/hr_expense_report_view.xml b/addons/hr_expense/report/hr_expense_report_view.xml index bf44d5e27a2..aaade0fa274 100644 --- a/addons/hr_expense/report/hr_expense_report_view.xml +++ b/addons/hr_expense/report/hr_expense_report_view.xml @@ -8,11 +8,9 @@ <field name="arch" type="xml"> <graph string="Expenses Analysis" type="pivot" stacked="True"> <field name="employee_id" type="row"/> - <field name="state" type="row"/> - <field name="nbr" type="measure"/> - <field name="no_of_products" type="measure"/> - <field name="price_average" type="measure"/> + <field name="create_date" interval="month" type="col"/> <field name="price_total" type="measure"/> + <field name="price_average" type="measure"/> </graph> </field> </record> @@ -22,9 +20,9 @@ <field name="model">hr.expense.report</field> <field name="arch" type="xml"> <search string="Expenses Analysis"> - <filter string="Waiting" icon="terp-gtk-media-pause" domain="[('state', '=' ,'confirm')]" help = "Confirm Expenses"/> - <filter string="Approved" icon="terp-check" domain="[('state','=','accepted')]" help = "Approved Expenses"/> - <filter string="Done" icon="terp-dolar" domain="[('state','=', 'done')]" help = "Done Expenses"/> + <filter string="Waiting" domain="[('state', '=' ,'confirm')]" help="Confirm Expenses"/> + <filter string="Approved" domain="[('state','=','accepted')]" help="Approved Expenses"/> + <filter string="Done" domain="[('state','=', 'done')]" help="Done Expenses"/> <field name="employee_id"/> <field name="department_id"/> <group expand="0" string="Extended Filters..."> @@ -36,14 +34,13 @@ <field name="date_valid"/> </group> <group expand="1" string="Group By"> - <filter string="Employee" name="employee" icon="terp-personal" context="{'group_by':'employee_id'}"/> - <filter string="Validation User" name="User" icon="terp-personal" context="{'group_by':'user_id'}"/> - <filter string="Department" icon="terp-personal+" context="{'group_by':'department_id'}"/> - <filter string="Product" icon="terp-accessories-archiver" context="{'group_by':'product_id'}"/> - <filter string="Analytic account" icon="terp-folder-green" context="{'group_by':'analytic_account'}" groups="analytic.group_analytic_accounting"/> - <filter string="Status" icon="terp-stock_effects-object-colorize" context="{'group_by':'state'}"/> - <filter string="Company" icon="terp-go-home" context="{'group_by':'company_id'}" groups="base.group_multi_company"/> - <filter string="Create Date" icon="terp-go-month" context="{'group_by':'create_date'}" help="Creation Date"/> + <filter string="Validation User" name="User" context="{'group_by':'user_id'}"/> + <filter string="Department" context="{'group_by':'department_id'}"/> + <filter string="Product" context="{'group_by':'product_id'}"/> + <filter string="Status" context="{'group_by':'state'}"/> + <filter string="Company" context="{'group_by':'company_id'}" groups="base.group_multi_company"/> + <separator/> + <filter string="Create Month" context="{'group_by':'create_date:month'}" help="Creation Date"/> </group> </search> </field> diff --git a/addons/hr_holidays/hr_holidays_view.xml b/addons/hr_holidays/hr_holidays_view.xml index 5ee1ec8f7c2..f871bf8207d 100644 --- a/addons/hr_holidays/hr_holidays_view.xml +++ b/addons/hr_holidays/hr_holidays_view.xml @@ -1,6 +1,20 @@ <openerp> <data> + <!-- Graph report --> + <record id="view_evaluation_report_graph" model="ir.ui.view"> + <field name="name">hr.holidays.graph</field> + <field name="model">hr.holidays</field> + <field name="arch" type="xml"> + <graph string="Appraisal Analysis" type="pivot" stacked="True"> + <field name="employee_id" type="row"/> + <field name="holiday_status_id" type="row"/> + <field name="date_from" type="col"/> + <field name="number_of_days" type="measure"/> + </graph> + </field> + </record> + <record id="view_hr_holidays_filter" model="ir.ui.view"> <field name="name">hr.holidays.filter</field> <field name="model">hr.holidays</field> @@ -8,27 +22,26 @@ <search string="Search Leave"> <field name="name"/> <separator/> - <filter icon="terp-check" domain="[('state','=','draft')]" string="To Confirm"/> - <filter icon="terp-camera_test" domain="[('state','in',('confirm','validate1'))]" string="To Approve" name="approve"/> - <filter icon="terp-camera_test" domain="[('state','=','validate')]" string="Validated" name="validated"/> + <filter domain="[('state','=','draft')]" string="To Confirm"/> + <filter domain="[('state','in',('confirm','validate1'))]" string="To Approve" name="approve"/> + <filter domain="[('state','=','validate')]" string="Validated" name="validated"/> <separator/> - <filter icon="terp-go-year" name="year" string="Year" domain="[('holiday_status_id.active','=',True)]" help="Filters only on allocations and requests that belong to an holiday type that is 'active' (active field is True)"/> + <filter name="year" string="Year" domain="[('holiday_status_id.active','=',True)]" help="Filters only on allocations and requests that belong to an holiday type that is 'active' (active field is True)"/> <separator/> - <filter string="My Requests" icon="terp-personal" name="my_leaves" domain="[('employee_id.user_id','=', uid)]" help="My Leave Requests"/> + <filter string="My Requests" name="my_leaves" domain="[('employee_id.user_id','=', uid)]" help="My Leave Requests"/> <separator/> - <filter string="My Department Leaves" icon="terp-personal+" help="My Department Leaves" domain="[('department_id.manager_id','=',uid)]"/> + <filter string="My Department Leaves" help="My Department Leaves" domain="[('department_id.manager_id','=',uid)]"/> <field name="employee_id"/> <field name="department_id"/> <field name="holiday_status_id"/> <group expand="0" string="Group By"> - <filter name="group_name" string="Description" domain="[]" context="{'group_by':'name'}"/> - <filter name="group_date_from" string="Start Month" icon="terp-personal" domain="[]" context="{'group_by':'date_from'}"/> - <filter name="group_employee" string="Employee" icon="terp-personal" domain="[]" context="{'group_by':'employee_id'}"/> - <filter name="group_category" string="Category" icon="terp-stock_symbol-selection" domain="[]" context="{'group_by':'category_id'}"/> - <filter string="Manager" icon="terp-personal" domain="[]" context="{'group_by':'manager_id'}"/> - <filter string="Department" icon="terp-personal+" domain="[]" context="{'group_by':'department_id','set_visible':True}"/> - <filter name="group_type" string="Type" icon="terp-stock_symbol-selection" domain="[]" context="{'group_by':'holiday_status_id'}"/> - <filter string="Status" icon="terp-stock_effects-object-colorize" domain="[]" context="{'group_by':'state'}"/> + <filter name="group_name" string="Description" context="{'group_by':'name'}"/> + <filter name="group_employee" string="Employee" context="{'group_by':'employee_id'}"/> + <filter name="group_category" string="Category" context="{'group_by':'category_id'}"/> + <filter string="Manager" context="{'group_by':'manager_id'}"/> + <filter name="group_type" string="Type" context="{'group_by':'holiday_status_id'}"/> + <separator/> + <filter name="group_date_from" string="Start Month" context="{'group_by':'date_from:month'}"/> </group> </search> </field> @@ -40,9 +53,9 @@ <field name="name">Leave Request</field> <field name="model">hr.holidays</field> <field name="arch" type="xml"> - <calendar string="Leave Request" color="employee_id" - date_start="date_from" date_stop="date_to" - quick_add="False" avatar_model="hr.employee"> + <calendar string="Leave Request" color="employee_id" + date_start="date_from" date_stop="date_to" + quick_add="False" avatar_model="hr.employee"> <field name="employee_id"/> <field name="holiday_status_id"/> </calendar> @@ -483,10 +496,10 @@ </group> </xpath> <xpath expr="//div[@name='button_box']" position="inside"> - <button name="%(act_hr_employee_holiday_request)d" + <button name="%(act_hr_employee_holiday_request)d" type="action" class="oe_stat_button" - icon="fa-calendar" + icon="fa-calendar" groups="base.group_hr_user"> <field name="leaves_count" widget="statinfo" string="Leaves"/> </button> diff --git a/addons/hr_recruitment/report/hr_recruitment_report_view.xml b/addons/hr_recruitment/report/hr_recruitment_report_view.xml index 633d53c3728..9a396531446 100644 --- a/addons/hr_recruitment/report/hr_recruitment_report_view.xml +++ b/addons/hr_recruitment/report/hr_recruitment_report_view.xml @@ -7,7 +7,7 @@ <field name="arch" type="xml"> <graph string="Recruitment Analysis" type="pivot"> <field name="stage_id" type="row"/> - <field name="date_create" interval="week" type="col"/> + <field name="job_id" type="col"/> </graph> </field> </record> @@ -16,23 +16,20 @@ <record id="filter_recruitment_report_recruiter" model="ir.filters"> <field name="name">By Recruiter</field> <field name="model_id">hr.recruitment.report</field> - <field name="domain">[]</field> <field name="user_id" eval="False"/> - <field name="context">{'group_by': ['date_create:month', 'user_id']}</field> + <field name="context">{'group_by': ['date_create:month', 'user_id'], 'col_group_by': ['date_create:month']}</field> </record> <record id="filter_recruitment_report_job" model="ir.filters"> <field name="name">By Job</field> <field name="model_id">hr.recruitment.report</field> - <field name="domain">[]</field> <field name="user_id" eval="False"/> - <field name="context">{'group_by': ['date_create:month', 'job_id']}</field> + <field name="context">{'group_by': ['date_create:month', 'job_id'], 'col_group_by': ['date_create:month']}</field> </record> <record id="filter_recruitment_report_departmnet" model="ir.filters"> <field name="name">By Department</field> <field name="model_id">hr.recruitment.report</field> - <field name="domain">[]</field> <field name="user_id" eval="False"/> - <field name="context">{'group_by': ['date_create:month', 'department_id']}</field> + <field name="context">{'group_by': ['date_create:month', 'department_id'], 'col_group_by': ['date_create:month']}</field> </record> <record id="view_hr_recruitment_report_search" model="ir.ui.view"> @@ -48,7 +45,7 @@ <filter string="Unassigned" domain="[('user_id', '=', False)]"/> <filter string="My" domain="[('user_id', '=', uid)]"/> <separator/> - <filter string="New" domain="[('sequence', '=', 1)]"/> + <filter string="New" domain="[('stage_id.sequence', '=', 1)]"/> <separator/> <group expand="0" string="Extended Filters"> <field name="priority"/> @@ -60,14 +57,11 @@ <group expand="1" string="Group By"> <filter string="Responsible" name='User' context="{'group_by':'user_id'}"/> <filter string="Company" context="{'group_by':'company_id'}" groups="base.group_multi_company"/> - <filter string="Partner" context="{'group_by':'partner_id'}" /> <filter string="Jobs" name="job" context="{'group_by':'job_id'}"/> <filter string="Department" name="department" context="{'group_by':'department_id'}"/> - <filter string="Degree" name="degree" context="{'group_by':'type_id'}"/> - <filter string="Last Stage" help="Match this group by with a specific stage filter in order to analyse the recruitment process" context="{'group_by':'last_stage_id'}"/> <filter string="Stage" context="{'group_by':'stage_id'}" /> - <filter string="Last Stage Update" context="{'group_by':'date_last_stage_update'}" /> - <filter string="Creation Date" context="{'group_by':'date_create'}" help="Creation Date"/> + <separator/> + <filter string="Creation Week" context="{'group_by':'date_create:week'}" help="Creation Week"/> </group> </search> </field> @@ -78,7 +72,7 @@ <field name="res_model">hr.recruitment.report</field> <field name="view_type">form</field> <field name="view_mode">graph</field> - <field name="context">{'search_default_year': 1, 'group_by_no_leaf':1,'group_by':[]}</field> + <field name="context">{'group_by_no_leaf':1,'group_by':[]}</field> <field name="search_view_id" ref="view_hr_recruitment_report_search"/> </record> <menuitem action="action_hr_recruitment_report_all" id="menu_hr_recruitment_report_all" parent="hr.menu_hr_reporting" sequence="0"/> diff --git a/addons/hr_timesheet/report/hr_timesheet_report.py b/addons/hr_timesheet/report/hr_timesheet_report.py index 9b20f6978e7..89a599c7539 100644 --- a/addons/hr_timesheet/report/hr_timesheet_report.py +++ b/addons/hr_timesheet/report/hr_timesheet_report.py @@ -16,8 +16,8 @@ class hr_timesheet_report(osv.osv): 'user_id': fields.many2one('res.users', 'User',readonly=True), 'account_id': fields.many2one('account.analytic.account', 'Analytic Account',readonly=True), 'company_id': fields.many2one('res.company', 'Company',readonly=True), - 'cost': fields.float('#Cost',readonly=True, digits_compute=dp.get_precision('Account')), - 'quantity': fields.float('Time',readonly=True), + 'cost': fields.float('Cost', readonly=True, digits_compute=dp.get_precision('Account')), + 'quantity': fields.float('Time', readonly=True), # TDE FIXME master: rename into time } def _select(self): diff --git a/addons/hr_timesheet/report/hr_timesheet_report_view.xml b/addons/hr_timesheet/report/hr_timesheet_report_view.xml index 0c9b5560ca4..bfcd467fb44 100644 --- a/addons/hr_timesheet/report/hr_timesheet_report_view.xml +++ b/addons/hr_timesheet/report/hr_timesheet_report_view.xml @@ -7,13 +7,13 @@ <field name="arch" type="xml"> <graph string="Timesheet" type="pivot"> <field name="user_id" type="row"/> - <field name="date" interval="day" type="col"/> + <field name="date" interval="month" type="col"/> <field name="quantity" type="measure"/> - <field name="cost" type="measure"/> </graph> </field> </record> + <record id="view_hr_timesheet_report_search" model="ir.ui.view"> <field name="name">hr.timesheet.report.search</field> <field name="model">hr.timesheet.report</field> @@ -21,7 +21,7 @@ <search string="Timesheet"> <field name="account_id"/> <field name="user_id"/> - <filter string="This Month" name="month" icon="terp-go-year" domain="[('date','<=', time.strftime('%Y-%m-%d')),('date','>=',time.strftime('%Y-%m-01'))]" help="month"/> + <filter string="This Month" name="month" domain="[('date','<=', time.strftime('%Y-%m-%d')),('date','>=',time.strftime('%Y-%m-01'))]" help="month"/> <group expand="0" string="Extended Filters..."> <field name="general_account_id"/> <field name="product_id"/> @@ -30,12 +30,10 @@ <field name="date"/> </group> <group expand="1" string="Group By"> - <filter string="User" name="group_user_id" icon="terp-personal" context="{'group_by':'user_id'}"/> - <filter string="Product" name="product" icon="terp-accessories-archiver" context="{'group_by':'product_id'}"/> - <filter string="Analytic Account" name="analytic_account" icon="terp-folder-green" context="{'group_by':'account_id'}"/> - <filter string="General Account" name="general_account" icon="terp-folder-orange" context="{'group_by':'general_account_id'}"/> - <filter string="Company" icon="terp-go-home" context="{'group_by':'company_id'}" groups="base.group_multi_company"/> - <filter string="Date" icon="terp-go-month" context="{'group_by':'date'}" help="Group by month of date"/> + <filter string="User" name="group_user_id" context="{'group_by':'user_id'}"/> + <filter string="Company" context="{'group_by':'company_id'}" groups="base.group_multi_company"/> + <separator/> + <filter string="Month" context="{'group_by':'date:month'}" help="Group by month of date"/> </group> </search> </field> @@ -46,7 +44,7 @@ <field name="res_model">hr.timesheet.report</field> <field name="view_type">form</field> <field name="view_mode">graph</field> - <field name="context">{'search_default_group_user_id':1,'group_by_no_leaf':1,'group_by':[]}</field> + <field name="context">{'group_by_no_leaf':1,'group_by':[]}</field> </record> <menuitem action="action_hr_timesheet_report_stat_all" id="menu_hr_timesheet_report_all" diff --git a/addons/hr_timesheet_sheet/report/hr_timesheet_report.py b/addons/hr_timesheet_sheet/report/hr_timesheet_report.py index 74192027f3a..062a3010e05 100644 --- a/addons/hr_timesheet_sheet/report/hr_timesheet_report.py +++ b/addons/hr_timesheet_sheet/report/hr_timesheet_report.py @@ -26,10 +26,10 @@ class hr_timesheet_report(osv.osv): _inherit = "hr.timesheet.report" _columns = { 'to_invoice': fields.many2one('hr_timesheet_invoice.factor', 'Type of Invoicing',readonly=True), - 'nbr': fields.integer('#Nbr',readonly=True), - 'total_diff': fields.float('#Total Diff',readonly=True), - 'total_timesheet': fields.float('#Total Timesheet',readonly=True), - 'total_attendance': fields.float('#Total Attendance',readonly=True), + 'nbr': fields.integer('# Nbr Timesheet',readonly=True), + 'total_diff': fields.float('# Total Diff',readonly=True), + 'total_timesheet': fields.float('# Total Timesheet',readonly=True), + 'total_attendance': fields.float('# Total Attendance',readonly=True), 'department_id':fields.many2one('hr.department','Department',readonly=True), 'date_from': fields.date('Date from',readonly=True,), 'date_to': fields.date('Date to',readonly=True), @@ -47,16 +47,16 @@ class hr_timesheet_report(osv.osv): htss.date_to, count(*) as nbr, (SELECT sum(day.total_difference) - FROM hr_timesheet_sheet_sheet AS sheet - LEFT JOIN hr_timesheet_sheet_sheet_day AS day + FROM hr_timesheet_sheet_sheet AS sheet + LEFT JOIN hr_timesheet_sheet_sheet_day AS day ON (sheet.id = day.sheet_id) where sheet.id=htss.id) as total_diff, (SELECT sum(day.total_timesheet) - FROM hr_timesheet_sheet_sheet AS sheet - LEFT JOIN hr_timesheet_sheet_sheet_day AS day + FROM hr_timesheet_sheet_sheet AS sheet + LEFT JOIN hr_timesheet_sheet_sheet_day AS day ON (sheet.id = day.sheet_id) where sheet.id=htss.id) as total_timesheet, (SELECT sum(day.total_attendance) - FROM hr_timesheet_sheet_sheet AS sheet - LEFT JOIN hr_timesheet_sheet_sheet_day AS day + FROM hr_timesheet_sheet_sheet AS sheet + LEFT JOIN hr_timesheet_sheet_sheet_day AS day ON (sheet.id = day.sheet_id) where sheet.id=htss.id) as total_attendance, aal.to_invoice, htss.department_id, diff --git a/addons/hr_timesheet_sheet/report/hr_timesheet_report_view.xml b/addons/hr_timesheet_sheet/report/hr_timesheet_report_view.xml index 6c735123efe..bd28f835fc7 100644 --- a/addons/hr_timesheet_sheet/report/hr_timesheet_report_view.xml +++ b/addons/hr_timesheet_sheet/report/hr_timesheet_report_view.xml @@ -7,9 +7,9 @@ <field name="inherit_id" ref="hr_timesheet.view_hr_timesheet_report_graph"/> <field name="arch" type="xml"> <field name="user_id" position="after"> - <field name="state" type="row"/> + <field name="to_invoice" type="row"/> </field> - <field name="cost" position="after"> + <field name="quantity" position="after"> <field name="total_diff" type="measure"/> <field name="total_timesheet" type="measure"/> <field name="total_attendance" type="measure"/> @@ -17,15 +17,31 @@ </field> </record> + <!-- Custom reports (aka filters) --> + <record id="filter_hr_timesheet_report_internal_timesheets" model="ir.filters"> + <field name="name">Internal Timesheet</field> + <field name="model_id">hr.timesheet.report</field> + <field name="domain">[('state','=','done'), ('date','<=', time.strftime('%Y-%m-%d')),('date','>=',time.strftime('%Y-%m-01'))]</field> + <field name="user_id" eval="False"/> + <field name="context">{'group_by': ['user_id'], 'col_group_by': ['department_id'], 'measures': ['time']}</field> + </record> + <record id="filter_hr_timesheet_report_external_timesheets" model="ir.filters"> + <field name="name">External Timesheet</field> + <field name="model_id">hr.timesheet.report</field> + <field name="domain">[('state','=','done'), ('date','<=', time.strftime('%Y-%m-%d')),('date','>=',time.strftime('%Y-%m-01'))]</field> + <field name="user_id" eval="False"/> + <field name="context">{'group_by': ['company_id', 'to_invoice'], 'col_group_by': ['user_id'], 'measures': ['time','cost']}</field> + </record> + <record id="view_timesheet_report_search" model="ir.ui.view"> <field name="name">timesheet.report.search</field> <field name="model">hr.timesheet.report</field> <field name="inherit_id" ref="hr_timesheet.view_hr_timesheet_report_search"/> <field name="arch" type="xml"> <field name="account_id" position="before"> - <filter icon="terp-document-new" string="Draft" domain="[('state','=','draft')]"/> - <filter icon="terp-camera_test" string="Confirmed" domain="[('state','=','confirm')]"/> - <filter icon="terp-dialog-close" string="Done" domain="[('state','=','done')]"/> + <filter string="Draft" domain="[('state','=','draft')]"/> + <filter string="Confirmed" domain="[('state','=','confirm')]"/> + <filter string="Done" domain="[('state','=','done')]"/> </field> <field name="general_account_id" position="after"> <field name="to_invoice"/> @@ -33,14 +49,10 @@ <field name="date_to"/> <field name="date_from"/> </field> - <filter name="product" position="before"> - <filter string="Department" icon="terp-personal+" context="{'group_by':'department_id'}"/> - </filter> - <filter name="analytic_account" position="before"> - <filter string="Type of Invoicing" icon="terp-stock_symbol-selection" context="{'group_by':'to_invoice'}"/> - </filter> - <filter name="general_account" position="after"> - <filter string="Status" icon="terp-stock_effects-object-colorize" context="{'group_by':'state'}"/> + <filter name="group_user_id" position="after"> + <filter string="Department" context="{'group_by':'department_id'}"/> + <filter string="Type of Invoicing" context="{'group_by':'to_invoice'}"/> + <filter string="Status" context="{'group_by':'state'}"/> </filter> </field> </record> diff --git a/addons/l10n_in_hr_payroll/report/payment_advice_report_view.xml b/addons/l10n_in_hr_payroll/report/payment_advice_report_view.xml index 300d7932bc3..78b1d2e26ad 100644 --- a/addons/l10n_in_hr_payroll/report/payment_advice_report_view.xml +++ b/addons/l10n_in_hr_payroll/report/payment_advice_report_view.xml @@ -33,10 +33,10 @@ <field name="arch" type="xml"> <search string="Advices Analysis"> <group> - <filter icon="terp-document-new" string="Draft" domain="[('state','=','draft')]" help="Payment Advices which are in draft state"/> - <filter icon="terp-check" string="Confirm" name="confirm" domain="[('state','=','confirm')]" help="Payment Advices which are in confirm state"/> + <filter string="Draft" domain="[('state','=','draft')]" help="Payment Advices which are in draft state"/> + <filter string="Confirm" name="confirm" domain="[('state','=','confirm')]" help="Payment Advices which are in confirm state"/> <separator orientation="vertical"/> - <filter icon="terp-camera_test" string="NEFT" domain="[('neft','=',True)]" help="Advices which are paid using NEFT transfer"/> + <filter string="NEFT" domain="[('neft','=',True)]" help="Advices which are paid using NEFT transfer"/> <separator orientation="vertical"/> <field name="date"/> <separator orientation="vertical"/> @@ -55,16 +55,14 @@ </group> <newline/> <group expand="1" string="Group By"> - <filter string="Employee" icon="terp-personal" context="{'group_by':'employee_id'}" /> - <filter string="Bank" icon="terp-go-home" context="{'group_by':'bank_id'}"/> + <filter string="Employee" context="{'group_by':'employee_id'}" /> + <filter string="Bank" context="{'group_by':'bank_id'}"/> <separator orientation="vertical"/> - <filter string="Status" icon="terp-stock_effects-object-colorize" context="{'group_by':'state'}"/> + <filter string="Status" context="{'group_by':'state'}"/> <separator orientation="vertical"/> - <filter string="Company" icon="terp-go-home" groups="base.group_multi_company" context="{'group_by':'company_id'}"/> + <filter string="Company" groups="base.group_multi_company" context="{'group_by':'company_id'}"/> <separator orientation="vertical"/> - <filter string="Day" icon="terp-go-today" context="{'group_by':'day'}" help="Day of Payment Advices"/> - <filter string="Month" name="order_month" icon="terp-go-month" context="{'group_by':'month'}" help="Month of Payment Advices"/> - <filter string="Year" icon="terp-go-year" context="{'group_by':'year'}" help="Year of Payment Advices"/> + <filter string="Month" name="order_month" context="{'group_by':'month'}" help="Month of Payment Advices"/> </group> </search> </field> diff --git a/addons/l10n_in_hr_payroll/report/payslip_report_view.xml b/addons/l10n_in_hr_payroll/report/payslip_report_view.xml index 8293b26a7f3..f2bbfdb3e5b 100644 --- a/addons/l10n_in_hr_payroll/report/payslip_report_view.xml +++ b/addons/l10n_in_hr_payroll/report/payslip_report_view.xml @@ -32,10 +32,10 @@ <field name="arch" type="xml"> <search string="Payslip Analysis"> <group> - <filter icon="terp-document-new" string="Draft" domain="[('state','=','draft')]" help="Payslips which are in draft state"/> - <filter icon="terp-check" string="Done" name="done" domain="[('state','=','done')]" help="Payslips which are in done state"/> + <filter string="Draft" domain="[('state','=','draft')]" help="Payslips which are in draft state"/> + <filter string="Done" name="done" domain="[('state','=','done')]" help="Payslips which are in done state"/> <separator orientation="vertical"/> - <filter icon="terp-camera_test" string="Paid" domain="[('paid','=',True)]" help="Payslips which are paid"/> + <filter string="Paid" domain="[('paid','=',True)]" help="Payslips which are paid"/> <separator orientation="vertical"/> <field name="date_from"/> <field name="date_to"/> @@ -51,19 +51,16 @@ </group> <newline/> <group expand="1" string="Group By"> - <filter string="Employee" name="employee" icon="terp-personal" context="{'group_by':'employee_id'}" /> + <filter string="Employee" name="employee" context="{'group_by':'employee_id'}" /> <filter string="Structure" context="{'group_by':'struct_id'}" /> <filter string="Category" name="category" context="{'group_by':'category_id'}" /> <filter string="Payslip Line" context="{'group_by':'name'}" /> <separator orientation="vertical"/> - <filter string="Status" icon="terp-stock_effects-object-colorize" context="{'group_by':'state'}"/> + <filter string="Status" context="{'group_by':'state'}"/> <separator orientation="vertical"/> - <filter string="Company" icon="terp-go-home" groups="base.group_multi_company" context="{'group_by':'company_id'}"/> + <filter string="Company" groups="base.group_multi_company" context="{'group_by':'company_id'}"/> <separator orientation="vertical"/> - <filter string="Day" icon="terp-go-today" context="{'group_by':'day'}" help="Day of Payslip"/> - <filter string="Month" name="order_month" icon="terp-go-month" context="{'group_by':'month'}" help="Month of Payslip"/> - <filter string="Year" icon="terp-go-year" context="{'group_by':'year'}" help="Year of Payslip"/> - + <filter string="Month" name="order_month" context="{'group_by':'month'}" help="Month of Payslip"/> </group> </search> </field> diff --git a/addons/marketing_campaign/report/campaign_analysis_view.xml b/addons/marketing_campaign/report/campaign_analysis_view.xml index be12935b27d..1ee0eacb5ca 100644 --- a/addons/marketing_campaign/report/campaign_analysis_view.xml +++ b/addons/marketing_campaign/report/campaign_analysis_view.xml @@ -1,6 +1,18 @@ <?xml version="1.0"?> <openerp> <data> + + <record id="view_report_campaign_analysis_graph" model="ir.ui.view"> + <field name="name">campaign.analysis.graph</field> + <field name="model">campaign.analysis</field> + <field name="arch" type="xml"> + <graph string="Marketing Reports" type="pivot" stacked="True"> + <field name="segment_id" type="row"/> + <field name="month" type="col"/> + </graph> + </field> + </record> + <record id="view_campaign_analysis_tree" model="ir.ui.view"> <field name="name">campaign.analysis.tree</field> <field name="model">campaign.analysis</field> @@ -30,24 +42,21 @@ <field name="arch" type="xml"> <search string="Campaign Analysis"> <field name="date"/> - <filter icon="terp-gtk-go-back-rtl" string="To Do" domain="[('state','=','todo')]"/> - <filter icon="terp-dialog-close" string="Done" domain="[('state','=','done')]"/> - <filter icon="terp-emblem-important" string="Exceptions" domain="[('state','=','exception')]"/> + <filter string="To Do" domain="[('state','=','todo')]"/> + <filter string="Done" domain="[('state','=','done')]"/> + <filter string="Exceptions" domain="[('state','=','exception')]"/> <field name="campaign_id"/> <field name="activity_id"/> <field name="segment_id"/> <field name="partner_id"/> <field name="country_id"/> <group expand="0" string="Group By"> - <filter string="Campaign" name="Campaign" icon="terp-gtk-jump-to-rtl" context="{'group_by':'campaign_id'}" /> - <filter string="Segment" name="Segment" icon="terp-stock_symbol-selection" context="{'group_by':'segment_id'}"/> - <filter string="Activity" name="activity" icon="terp-stock_align_left_24" context="{'group_by':'activity_id'}"/> - <filter string="Resource" icon="terp-accessories-archiver" context="{'group_by':'res_id'}"/> - <filter string="Status" icon="terp-stock_effects-object-colorize" context="{'group_by':'state'}"/> - <filter string="Partner" icon="terp-partner" context="{'group_by':'partner_id'}"/> - <filter string="Day" icon="terp-go-today" context="{'group_by':'day'}"/> - <filter string="Month" icon="terp-go-month" context="{'group_by':'month'}"/> - <filter string="Year" icon="terp-go-year" context="{'group_by':'year'}"/> + <filter string="Campaign" name="Campaign" context="{'group_by':'campaign_id'}" /> + <filter string="Segment" name="Segment" context="{'group_by':'segment_id'}"/> + <filter string="Activity" name="activity" context="{'group_by':'activity_id'}"/> + <filter string="Status" context="{'group_by':'state'}"/> + <separator/> + <filter string="Month" context="{'group_by':'month'}"/> </group> </search> </field> @@ -57,8 +66,8 @@ <field name="name">Campaign Analysis</field> <field name="res_model">campaign.analysis</field> <field name="view_type">form</field> - <field name="view_mode">tree</field> - <field name="context">{'search_default_year': 1,"search_default_This Month":1,'group_by': [], 'search_default_Campaign': 1, 'search_default_Segment': 1, 'group_by_no_leaf':1}</field> + <field name="view_mode">graph,tree</field> + <field name="context">{'group_by': [], 'group_by_no_leaf':1}</field> <field name="search_view_id" ref="view_campaign_analysis_search"/> </record> diff --git a/addons/mass_mailing/__openerp__.py b/addons/mass_mailing/__openerp__.py index e0a8ab041fe..397c04e82e4 100644 --- a/addons/mass_mailing/__openerp__.py +++ b/addons/mass_mailing/__openerp__.py @@ -44,6 +44,7 @@ professional emails and reuse templates in a few clicks. 'data/mass_mailing_data.xml', 'wizard/mail_compose_message_view.xml', 'wizard/test_mailing.xml', + 'views/mass_mailing_report.xml', 'views/mass_mailing.xml', 'views/res_config.xml', 'views/res_partner.xml', diff --git a/addons/mass_mailing/models/__init__.py b/addons/mass_mailing/models/__init__.py index 2cffe48642b..702da268d84 100644 --- a/addons/mass_mailing/models/__init__.py +++ b/addons/mass_mailing/models/__init__.py @@ -5,3 +5,4 @@ import mass_mailing_stats import mail_mail import mail_thread import res_config +import mass_mailing_report diff --git a/addons/mass_mailing/models/mass_mailing.py b/addons/mass_mailing/models/mass_mailing.py index 17731500d3c..bee3e8528f9 100644 --- a/addons/mass_mailing/models/mass_mailing.py +++ b/addons/mass_mailing/models/mass_mailing.py @@ -30,6 +30,7 @@ class MassMailingContact(osv.Model): be able to deal with large contact list to email without bloating the partner base.""" _name = 'mail.mass_mailing.contact' + _inherit = 'mail.thread' _description = 'Mass Mailing Contact' _order = 'email' _rec_name = 'email' diff --git a/addons/mass_mailing/models/mass_mailing_report.py b/addons/mass_mailing/models/mass_mailing_report.py new file mode 100644 index 00000000000..9d91be2759f --- /dev/null +++ b/addons/mass_mailing/models/mass_mailing_report.py @@ -0,0 +1,52 @@ +# -*- coding: utf-8 -*- + +from openerp.osv import fields, osv +from openerp import tools + + +class MassMailingReport(osv.Model): + _name = 'mail.statistics.report' + _auto = False + _description = 'Mass Mailing Statistics' + + _columns = { + 'scheduled_date': fields.datetime('Scheduled Date', readonly=True), + 'name': fields.char('Mass Mail', readonly=True), + 'campaign': fields.char('Mass Mail Campaign', readonly=True), + 'sent': fields.integer('Sent', readonly=True), + 'delivered': fields.integer('Delivered', readonly=True), + 'opened': fields.integer('Opened', readonly=True), + 'bounced': fields.integer('Bounced', readonly=True), + 'replied': fields.integer('Replied', readonly=True), + 'state': fields.selection( + [('draft', 'Draft'), ('test', 'Tested'), ('done', 'Sent')], + string='Status', readonly=True, + ), + 'email_from': fields.char('From', readonly=True), + } + + def init(self, cr): + """Mass Mail Statistical Report: based on mail.mail.statistics that models the various + statistics collected for each mailing, and mail.mass_mailing model that models the + various mailing performed. """ + tools.drop_view_if_exists(cr, 'mail_statistics_report') + cr.execute(""" + CREATE OR REPLACE VIEW mail_statistics_report AS ( + SELECT + min(ms.id) as id, + ms.scheduled as scheduled_date, + mm.name as name, + mc.name as campaign, + count(ms.bounced) as bounced, + count(ms.sent) as sent, + (count(ms.sent) - count(ms.bounced)) as delivered, + count(ms.opened) as opened, + count(ms.replied) as replied, + mm.state, + mm.email_from + FROM + mail_mail_statistics as ms + left join mail_mass_mailing as mm ON (ms.mass_mailing_id=mm.id) + left join mail_mass_mailing_campaign as mc ON (ms.mass_mailing_campaign_id=mc.id) + GROUP BY ms.scheduled, mm.name, mc.name, mm.state, mm.email_from + )""") diff --git a/addons/mass_mailing/security/ir.model.access.csv b/addons/mass_mailing/security/ir.model.access.csv index d5c76b9f69d..5aac6639fbd 100644 --- a/addons/mass_mailing/security/ir.model.access.csv +++ b/addons/mass_mailing/security/ir.model.access.csv @@ -7,4 +7,5 @@ access_mass_mailing_campaign,mail.mass_mailing.campaign,model_mail_mass_mailing_ access_mass_mailing_campaign_system,mail.mass_mailing.campaign.system,model_mail_mass_mailing_campaign,base.group_system,1,1,1,1
access_mass_mailing,mail.mass_mailing,model_mail_mass_mailing,base.group_user,1,1,1,0
access_mass_mailing_system,mail.mass_mailing.system,model_mail_mass_mailing,base.group_system,1,1,1,1
-access_mail_mail_statistics,mail.mail.statistics,model_mail_mail_statistics,base.group_user,1,1,1,1
\ No newline at end of file +access_mail_mail_statistics,mail.mail.statistics,model_mail_mail_statistics,base.group_user,1,1,1,1
+access_mail_statistics_report,mail.statistics.report,model_mail_statistics_report,base.group_user,1,1,1,1
diff --git a/addons/mass_mailing/views/mass_mailing.xml b/addons/mass_mailing/views/mass_mailing.xml index 559bcbf7d95..f1ed063d221 100644 --- a/addons/mass_mailing/views/mass_mailing.xml +++ b/addons/mass_mailing/views/mass_mailing.xml @@ -228,11 +228,16 @@ <field name="name" string="Mailings"/> <field name="mass_mailing_campaign_id"/> <group expand="0" string="Group By"> - <filter string="State" name="group_state" - context="{'group_by': 'state'}"/> <filter string="Campaign" name="group_mass_mailing_campaign_id" groups="mass_mailing.group_mass_mailing_campaign" context="{'group_by': 'mass_mailing_campaign_id'}"/> + <filter string="State" name="group_state" + context="{'group_by': 'state'}"/> + <filter string="Sent By" domain="[]" + context="{'group_by':'email_from'}"/> + <separator/> + <filter string="Sent Month" + domain="[]" context="{'group_by':'sent_date:month'}"/> </group> </search> </field> @@ -419,6 +424,17 @@ </field> </record> + <record id="view_mail_mass_mailing_graph" model="ir.ui.view"> + <field name="name">mail.mass_mailing.graph</field> + <field name="model">mail.mass_mailing</field> + <field name="arch" type="xml"> + <graph string="Mass Mailing" type="bar" stacked="True"> + <field name="mass_mailing_campaign_id" type="row"/> + <field name="sent_date" interval="month" type="col"/> + </graph> + </field> + </record> + <record id="action_view_mass_mailings" model="ir.actions.act_window"> <field name="name">Mass Mailings</field> <field name="res_model">mail.mass_mailing</field> @@ -438,7 +454,7 @@ <field name="view_type">form</field> <field name="view_mode">kanban,tree,form</field> <field name="context">{ - 'search_default_mass_mailing_campaign_id': [active_id], + 'search_default_mass_mailing_campaign_id': [active_id], 'default_mass_mailing_campaign_id': active_id, } </field> diff --git a/addons/mass_mailing/views/mass_mailing_report.xml b/addons/mass_mailing/views/mass_mailing_report.xml new file mode 100644 index 00000000000..e52a6f7e0a2 --- /dev/null +++ b/addons/mass_mailing/views/mass_mailing_report.xml @@ -0,0 +1,61 @@ +<?xml version="1.0" encoding="utf-8"?> +<openerp> + <data> + + <record id="view_mail_statistics_report_graph" model="ir.ui.view"> + <field name="name">mail.statistics.report.graph</field> + <field name="model">mail.statistics.report</field> + <field name="arch" type="xml"> + <graph string="Mass Mailing Statistics" type="pivot" stacked="True"> + <field name="campaign" type="row"/> + <field name="sent" type="measure"/> + <field name="delivered" type="measure"/> + <field name="opened" type="measure"/> + <field name="bounced" type="measure"/> + <field name="replied" type="measure"/> + </graph> + </field> + </record> + + <record id="view_mail_statistics_report_search" model="ir.ui.view"> + <field name="name">mail.statistics.report.search</field> + <field name="model">mail.statistics.report</field> + <field name="arch" type="xml"> + <search string="Mass Mailing Statistics"> + <group expand="0" string="Extended Filters..."> + <field name="scheduled_date"/> + </group> + <group expand="1" string="Group By..."> + <filter string="Mass Mailing Campaign" + domain="[]" context="{'group_by':'campaign'}"/> + <filter string="State" domain="[]" + context="{'group_by':'state'}"/> + <filter string="Sent By" domain="[]" + context="{'group_by':'email_from'}"/> + <separator/> + <filter string="Scheduled Month" + domain="[]" context="{'group_by':'scheduled_date:month'}"/> + </group> + </search> + </field> + </record> + + <!-- Actions and Menuitems --> + <record id="action_mail_statistics_report" model="ir.actions.act_window"> + <field name="name">Mass Mailing Analysis</field> + <field name="res_model">mail.statistics.report</field> + <field name="view_type">form</field> + <field name="view_mode">graph</field> + <field name="help">Mass Mailing Statistics allows you to check different mailing related information like number of bounced mails, opened mails, replied mails. You can sort out your analysis by different groups to get accurate grained analysis.</field> + </record> + <record id="action_mail_mass_mailing_report_graph" model="ir.actions.act_window.view"> + <field name="view_mode">graph</field> + <field name="view_id" ref="view_mail_statistics_report_graph"/> + <field name="act_window_id" ref="action_mail_statistics_report"/> + </record> + + <menuitem name="Mass Mailing Analysis" id="menu_mass_mailing_report" sequence="1" + parent="base.marketing_reporting_menu" action="action_mail_statistics_report"/> + + </data> +</openerp> diff --git a/addons/mass_mailing/wizard/test_mailing.py b/addons/mass_mailing/wizard/test_mailing.py index bd1124a8cdc..80b84de3deb 100644 --- a/addons/mass_mailing/wizard/test_mailing.py +++ b/addons/mass_mailing/wizard/test_mailing.py @@ -30,11 +30,15 @@ class TestMassMailing(osv.TransientModel): 'reply_to': mailing.reply_to, 'email_to': test_mail, 'subject': mailing.name, - 'body_html': mailing.body_html, - 'auto_delete': True, - 'mailing_id': wizard.mass_mailing_id.id, + 'body_html': '', + 'notification': True, + 'mailing_id': mailing.id, } - mail_ids.append(Mail.create(cr, uid, mail_values, context=context)) + mail_mail_obj = Mail.browse(cr, uid, Mail.create(cr, uid, mail_values, context=context), context=context) + unsubscribe_url = Mail._get_unsubscribe_url(cr, uid, mail_mail_obj, test_mail, context=context) + body = tools.append_content_to_html(mailing.body_html, unsubscribe_url, plaintext=False, container_tag='p') + Mail.write(cr, uid, mail_mail_obj.id, {'body_html': mailing.body_html}, context=context) + mail_ids.append(mail_mail_obj.id) Mail.send(cr, uid, mail_ids, context=context) self.pool['mail.mass_mailing'].write(cr, uid, [mailing.id], {'state': 'test'}, context=context) return True diff --git a/addons/membership/report/report_membership.py b/addons/membership/report/report_membership.py index 536edde0903..6867feaa952 100644 --- a/addons/membership/report/report_membership.py +++ b/addons/membership/report/report_membership.py @@ -53,7 +53,8 @@ class report_membership(osv.osv): 'membership_id': fields.many2one('product.product', 'Membership Product', readonly=True), 'membership_state': fields.selection(STATE, 'Current Membership State', readonly=True), 'user_id': fields.many2one('res.users', 'Salesperson', readonly=True), - 'company_id': fields.many2one('res.company', 'Company', readonly=True) + 'company_id': fields.many2one('res.company', 'Company', readonly=True), + 'quantity': fields.integer("Quantity", readonly=True), } def init(self, cr): @@ -64,6 +65,7 @@ class report_membership(osv.osv): SELECT MIN(id) AS id, partner_id, + count(membership_id) as quantity, user_id, membership_state, associate_member_id, diff --git a/addons/membership/report/report_membership_view.xml b/addons/membership/report/report_membership_view.xml index 625693c455c..ca4f786e11c 100644 --- a/addons/membership/report/report_membership_view.xml +++ b/addons/membership/report/report_membership_view.xml @@ -7,24 +7,24 @@ <field name="model">report.membership</field> <field name="arch" type="xml"> <search string="Membership"> - <filter string="Forecast" icon="terp-gtk-jump-to-ltr" context="{'waiting_invoiced_totpending_visible':0}" help="This will display waiting, invoiced and total pending columns"/> - <filter string="Revenue Done" name="Revenue" icon="terp-dolar" context="{'paid_old_totearned_visible':0}" help="This will display paid, old and total earned columns"/> + <filter string="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"/> <field name="partner_id"/> <field name="membership_id"/> <field name="user_id"/> <group expand="1" string="Group By"> - <filter string="Salesperson" icon="terp-personal" name="salesman" - domain="[]" context="{'group_by':'user_id'}"/> - <filter string="Associated Partner" icon="terp-partner" name="associate_member_id" - domain="[]" context="{'group_by':'associate_member_id'}"/> - <filter string="Membership Product" icon="terp-accessories-archiver" name="product" - domain="[]" context="{'group_by':'membership_id'}"/> - <filter string="Current Membership State" icon="terp-stock_effects-object-colorize" - domain="[]" context="{'group_by':'membership_state'}"/> - <filter string="Company" icon="terp-go-home" - domain="[]" context="{'group_by':'company_id'}" groups="base.group_multi_company"/> - <filter string="Date" name="start_date" icon="terp-go-year" - domain="[]" context="{'group_by':'start_date:year'}"/> + <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" + context="{'group_by':'membership_state'}"/> + <filter string="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> @@ -35,7 +35,11 @@ <field name="model">report.membership</field> <field name="arch" type="xml"> <graph string="Membership" type="pivot"> + <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"/> </graph> </field> diff --git a/addons/mrp_operations/report/mrp_workorder_analysis.py b/addons/mrp_operations/report/mrp_workorder_analysis.py index 37699ad0d47..cc701e2ae33 100644 --- a/addons/mrp_operations/report/mrp_workorder_analysis.py +++ b/addons/mrp_operations/report/mrp_workorder_analysis.py @@ -28,7 +28,7 @@ class mrp_workorder(osv.osv): _description = "Work Order Report" _auto = False _columns = { - 'nbr': fields.integer('# of Lines', readonly=True), + 'nbr': fields.integer('# of Lines', readonly=True), # TDE FIXME master: rename into nbr_lines 'date': fields.date('Date', readonly=True), 'product_id': fields.many2one('product.product', 'Product', readonly=True), 'product_qty': fields.float('Product Qty', digits_compute=dp.get_precision('Product Unit of Measure'), readonly=True), diff --git a/addons/mrp_operations/report/mrp_workorder_analysis_view.xml b/addons/mrp_operations/report/mrp_workorder_analysis_view.xml index 13b4e794283..0d469524e9e 100644 --- a/addons/mrp_operations/report/mrp_workorder_analysis_view.xml +++ b/addons/mrp_operations/report/mrp_workorder_analysis_view.xml @@ -9,32 +9,55 @@ <field name="model">mrp.workorder</field> <field name="arch" type="xml"> <graph string="Work Orders" type="pivot"> - <field name="state" type="row"/> + <field name="workcenter_id" type="row"/> + <field name="date" interval="month" type="col"/> <field name="product_qty" type="measure"/> - <field name="nbr" type="measure"/> <field name="total_hours" type="measure"/> <field name="total_cycles" type="measure"/> </graph> </field> </record> + <!-- Custom reports (aka filters) --> + <record id="filter_mrp_workorder_workload" model="ir.filters"> + <field name="name">Workload</field> + <field name="model_id">mrp.workorder</field> + <field name="user_id" eval="False"/> + <field name="context">{'group_by': ['workcenter_id'], 'col_group_by': ['date:month'], 'measures': ['total_hours', 'total_cycles']}</field> + </record> + <record id="filter_mrp_workorder_quantity_produced" model="ir.filters"> + <field name="name">Quantity Produced</field> + <field name="model_id">mrp.workorder</field> + <field name="domain">[('state','=','done')]</field> + <field name="user_id" eval="False"/> + <field name="context">{'group_by': ['workcenter_id'], 'col_group_by': ['date:month'], 'measures': ['total_hours', 'total_cycles']}</field> + </record> + <record id="filter_mrp_workorder_current_production" model="ir.filters"> + <field name="name">Current Production</field> + <field name="model_id">mrp.workorder</field> + <field name="domain">[('state','=','startworking')]</field> + <field name="user_id" eval="False"/> + <field name="context">{'group_by': ['workcenter_id'], 'col_group_by': ['product_id'], 'measures': ['product_qty', 'total_hours']}</field> + </record> + <record id="view_report_mrp_workorder_filter" model="ir.ui.view"> <field name="name">mrp.workorder.select</field> <field name="model">mrp.workorder</field> <field name="arch" type="xml"> <search string="Search"> <field name="date"/> - <filter string="Current" icon="terp-check" domain="[('state','not in',('draft','cancel','done'))]"/> - <filter icon="terp-check" string="Started" domain="[('state','=','startworking')]"/> - <filter icon="terp-camera_test" string="Done" domain="[('state','=','done')]"/> + <filter string="Current" domain="[('state','not in',('draft','cancel','done'))]"/> + <filter string="Started" name="started" domain="[('state','=','startworking')]"/> + <filter string="Done" name="done" domain="[('state','=','done')]"/> <field name="product_id" /> <field name="workcenter_id"/> <group expand="1" string="Group By"> - <filter string="Product" name="Product" icon="terp-accessories-archiver" context="{'group_by':'product_id'}" /> - <filter string="Work Center" name="Workcenter" icon="terp-go-home" context="{'group_by':'workcenter_id'}" /> - <filter string="Production" icon="terp-accessories-archiver" domain="[]" context="{'group_by':'production_id'}"/> - <filter string="Status" icon="terp-stock_effects-object-colorize" context="{'group_by':'state'}"/> - <filter string="Date Planned" name="terp-go-month" icon="terp-go-month" context="{'group_by':'date:month'}" help="Planned Month"/> + <filter string="Work Center" name="Workcenter" context="{'group_by':'workcenter_id'}" /> + <filter string="Production" context="{'group_by':'production_id'}"/> + <filter string="Status" context="{'group_by':'state'}"/> + <filter string="Product" name="Product" context="{'group_by':'product_id'}" /> + <separator/> + <filter string="Month Planned" name="terp-go-month" context="{'group_by':'date:month'}" help="Planned Month"/> </group> </search> </field> diff --git a/addons/point_of_sale/report/pos_order_report.py b/addons/point_of_sale/report/pos_order_report.py index 4ffe19bd23b..822759075e1 100644 --- a/addons/point_of_sale/report/pos_order_report.py +++ b/addons/point_of_sale/report/pos_order_report.py @@ -26,6 +26,7 @@ class pos_order_report(osv.osv): _name = "report.pos.order" _description = "Point of Sale Orders Statistics" _auto = False + _columns = { 'date': fields.datetime('Date Order', readonly=True), 'partner_id':fields.many2one('res.partner', 'Partner', readonly=True), @@ -38,10 +39,11 @@ class pos_order_report(osv.osv): 'average_price': fields.float('Average Price', readonly=True,group_operator="avg"), 'location_id':fields.many2one('stock.location', 'Location', readonly=True), 'company_id':fields.many2one('res.company', 'Company', readonly=True), - 'nbr':fields.integer('# of Lines', readonly=True), - 'product_qty':fields.integer('# of Qty', readonly=True), + 'nbr':fields.integer('# of Lines', readonly=True), # TDE FIXME master: rename into nbr_lines + 'product_qty':fields.integer('Product Quantity', readonly=True), 'journal_id': fields.many2one('account.journal', 'Journal'), 'delay_validation': fields.integer('Delay Validation'), + 'product_categ_id': fields.many2one('product.category', 'Product Category', readonly=True), } _order = 'date desc' @@ -64,14 +66,15 @@ class pos_order_report(osv.osv): s.location_id as location_id, s.company_id as company_id, s.sale_journal as journal_id, - l.product_id as product_id + l.product_id as product_id, + pt.categ_id as product_categ_id from pos_order_line as l left join pos_order s on (s.id=l.order_id) left join product_product p on (p.id=l.product_id) left join product_template pt on (pt.id=p.product_tmpl_id) left join product_uom u on (u.id=pt.uom_id) group by - s.date_order, s.partner_id,s.state, + s.date_order, s.partner_id,s.state, pt.categ_id, s.user_id,s.location_id,s.company_id,s.sale_journal,l.product_id,s.create_date having sum(l.qty * u.factor) != 0)""") diff --git a/addons/point_of_sale/report/pos_order_report_view.xml b/addons/point_of_sale/report/pos_order_report_view.xml index 281c39f8fbc..d184971cf3b 100644 --- a/addons/point_of_sale/report/pos_order_report_view.xml +++ b/addons/point_of_sale/report/pos_order_report_view.xml @@ -6,11 +6,9 @@ <field name="model">report.pos.order</field> <field name="arch" type="xml"> <graph string="Point of Sale Analysis" type="pivot"> - <field name="date" interval="day" type="row"/> - <field name="nbr" type="measure"/> + <field name="product_categ_id" type="row"/> + <field name="date" interval="month" type="col"/> <field name="product_qty" type="measure"/> - <field name="average_price" type="measure"/> - <field name="total_discount" type="measure"/> <field name="price_total" type="measure"/> </graph> </field> @@ -22,22 +20,22 @@ <field name="arch" type="xml"> <search string="Point of Sale Analysis"> <field name="date"/> - <filter icon="terp-dolar" string="Invoiced" domain="[('state','=',('invoiced'))]"/> - <filter icon="terp-dolar" string="Not Invoiced" domain="[('state','=',('paid'))]"/> + <filter string="Invoiced" domain="[('state','=',('invoiced'))]"/> + <filter string="Not Invoiced" domain="[('state','=',('paid'))]"/> <separator/> - <filter icon="terp-go-year" string="Year" name="year" domain="[('date','<=', time.strftime('%%Y-%%m-%%d')),('date','>=',time.strftime('%%Y-01-01'))]" help="POS ordered created during current year"/> + <filter string="Year" name="year" domain="[('date','<=', time.strftime('%%Y-%%m-%%d')),('date','>=',time.strftime('%%Y-01-01'))]" help="POS ordered created during current year"/> <separator/> - <filter icon="terp-personal" string="My Sales" help="My Sales" domain="[('user_id','=',uid)]"/> + <filter string="My Sales" help="My Sales" domain="[('user_id','=',uid)]"/> <field name="partner_id"/> <field name="user_id"/> <field name="partner_id"/> <field name="user_id"/> <group expand="1" string="Group By"> - <filter string="Salesperson" icon="terp-personal" name="User" context="{'group_by':'user_id'}"/> - <filter string="Customer" icon="terp-personal" context="{'group_by':'partner_id'}"/> - <filter string="Product" icon="terp-accessories-archiver" context="{'group_by':'product_id'}"/> - <filter string="Stock Location" context="{'group_by': 'location_id'}"/> - <filter string="Order Date" icon="terp-go-month" context="{'group_by':'date:month'}" help="Month of order date"/> + <filter string="Salesperson" name="User" context="{'group_by':'user_id'}"/> + <filter string="Product Category" context="{'group_by':'product_categ_id'}"/> + <filter string="Product" context="{'group_by':'product_id'}"/> + <separator/> + <filter string="Order Month" context="{'group_by':'date:month'}" help="Month of order date"/> </group> </search> </field> @@ -49,7 +47,7 @@ <field name="view_type">form</field> <field name="view_mode">graph</field> <field name="search_view_id" ref="view_report_pos_order_search"/> - <field name="context">{'search_default_year':1, 'group_by_no_leaf':1,'group_by':['product_id']}</field> + <field name="context">{'group_by_no_leaf':1,'group_by':[]}</field> </record> <menuitem action="action_report_pos_order_all" id="menu_report_pos_order_all" parent="menu_point_rep" sequence="3"/> diff --git a/addons/project/project.py b/addons/project/project.py index 2e3943189ea..6389a7bcc92 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -699,10 +699,10 @@ class task(osv.osv): if default is None: default = {} if not default.get('name'): - current = self.browse(cr, uid, id, context=context) + current = self.browse(cr, uid, id, context=context) default['name'] = _("%s (copy)") % current.name return super(task, self).copy_data(cr, uid, id, default, context) - + def _is_template(self, cr, uid, ids, field_name, arg, context=None): res = {} for task in self.browse(cr, uid, ids, context=context): @@ -1313,6 +1313,7 @@ class project_task_history_cumulative(osv.osv): _columns = { 'end_date': fields.date('End Date'), + 'nbr_tasks': fields.integer('# of Tasks', readonly=True), 'project_id': fields.many2one('project.project', 'Project'), } @@ -1329,11 +1330,16 @@ class project_task_history_cumulative(osv.osv): h.id AS history_id, h.date+generate_series(0, CAST((coalesce(h.end_date, DATE 'tomorrow')::date - h.date) AS integer)-1) AS date, h.task_id, h.type_id, h.user_id, h.kanban_state, + count(h.task_id) as nbr_tasks, greatest(h.remaining_hours, 1) AS remaining_hours, greatest(h.planned_hours, 1) AS planned_hours, t.project_id FROM project_task_history AS h JOIN project_task AS t ON (h.task_id = t.id) + GROUP BY + h.id, + h.task_id, + t.project_id ) AS history ) diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index 5823f2cab05..c35954d251d 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -30,7 +30,7 @@ <field name="project_id"/> <field name="reviewer_id"/> <field name="user_id"/> - <field name="stage_id" domain="[]"/> + <field name="stage_id"/> <filter string="My Tasks" domain="[('user_id','=',uid)]"/> <filter string="Unassigned" name="unassigned" domain="[('user_id', '=', False)]"/> <separator/> @@ -38,12 +38,14 @@ <separator/> <filter string="New Mail" name="message_unread" domain="[('message_unread','=',True)]"/> <group expand="0" string="Group By"> - <filter string="Reviewers" name="group_reviewer_id" domain="[]" context="{'group_by':'reviewer_id'}"/> - <filter string="Users" name="group_user_id" icon="terp-personal" domain="[]" context="{'group_by':'user_id'}"/> - <filter string="Project" name="group_project_id" icon="terp-folder-violet" domain="[]" context="{'group_by':'project_id'}"/> - <filter string="Stage" name="group_stage_id" icon="terp-stage" domain="[]" context="{'group_by':'stage_id'}"/> - <filter string="Last Stage Update" icon="terp-go-month" domain="[]" context="{'group_by':'date_last_stage_update'}"/> - <filter string="Last Message" name="group_message_last_post" domain="[]" context="{'group_by':'message_last_post:week'}"/> + <filter string="Project" name="project" context="{'group_by':'project_id'}"/> + <filter string="Task" context="{'group_by':'name'}"/> + <filter string="Assigned to" name="User" context="{'group_by':'user_id'}"/> + <filter string="Stage" name="Stage" context="{'group_by':'stage_id'}"/> + <filter string="Company" context="{'group_by':'company_id'}" groups="base.group_multi_company"/> + <separator/> + <filter string="Last Message" name="group_message_last_post" context="{'group_by':'message_last_post:week'}"/> + <filter string="Assignation Month" context="{'group_by':'date_start:month'}" help="Creation Date"/> </group> </search> </field> @@ -54,7 +56,7 @@ <field name="res_model">project.task</field> <field name="view_mode">kanban,tree,form,calendar,gantt,graph</field> <field name="context">{ - 'search_default_project_id': [active_id], + 'search_default_project_id': [active_id], 'default_project_id': active_id, 'active_test': False, }</field> @@ -98,7 +100,7 @@ </div> </div> <div class="oe_right oe_button_box" name="buttons" groups="base.group_user"> - <button class="oe_inline oe_stat_button" type="action" attrs="{'invisible':[('use_tasks','=', 0)]}" + <button class="oe_inline oe_stat_button" type="action" attrs="{'invisible':[('use_tasks','=', 0)]}" name="%(act_project_project_2_project_task_all)d" icon="fa-tasks"> <field string="Tasks" name="task_count" widget="statinfo"/> </button> @@ -108,8 +110,8 @@ </div> <group> <group col="4"> - <field name="user_id" string="Project Manager" - attrs="{'readonly':[('state','in',['close', 'cancelled'])]}" + <field name="user_id" string="Project Manager" + attrs="{'readonly':[('state','in',['close', 'cancelled'])]}" context="{'default_groups_ref': ['base.group_user', 'base.group_partner_manager', 'project.group_project_manager']}"/> <newline/> <field name="partner_id" on_change="onchange_partner_id(partner_id)"/> @@ -204,9 +206,9 @@ <field name="user_id" string="Project Manager"/> <field name="partner_id" string="Contact" filter_domain="[('partner_id', 'child_of', self)]"/> <group expand="0" string="Group By"> - <filter string="Manager" name="Manager" icon="terp-personal" domain="[]" context="{'group_by':'user_id'}"/> - <filter string="Contact" name="Partner" icon="terp-partner" domain="[]" context="{'group_by':'partner_id'}"/> - <filter string="Parent" name="Parent" help="Parent" icon="terp-folder-blue" domain = "[]" context="{'group_by':'parent_id'}"/> + <filter string="Manager" name="Manager" context="{'group_by':'user_id'}"/> + <filter string="Contact" name="Partner" context="{'group_by':'partner_id'}"/> + <filter string="Parent" name="Parent" help="Parent" context="{'group_by':'parent_id'}"/> </group> </search> </field> @@ -383,7 +385,7 @@ options="{'fold_field': 'fold'}"/> </header> <sheet string="Task"> - <div class="oe_right"> + <div class="oe_right"> <field name="kanban_state" class="oe_inline" widget="kanban_state_selection"/> </div> <h1> @@ -558,7 +560,7 @@ <field name="message_unread" invisible="1"/> <field name="sequence" invisible="not context.get('seq_visible', False)"/> <field name="name"/> - <field name="project_id" icon="gtk-indent" invisible="context.get('user_invisible', False)"/> + <field name="project_id" invisible="context.get('user_invisible', False)"/> <field name="user_id" invisible="context.get('user_invisible', False)"/> <field name="delegated_user_id" invisible="context.get('show_delegated', True)"/> <field name="total_hours" invisible="1"/> @@ -602,7 +604,6 @@ <field name="arch" type="xml"> <graph string="Project Tasks" type="bar"> <field name="project_id" type="row"/> - <field name="planned_hours" type="measure"/> </graph> </field> </record> @@ -680,7 +681,7 @@ <field name="arch" type="xml"> <search string="Tasks Stages"> <field name="name" string="Tasks Stages"/> - <filter icon="terp-check" string="Common" name="common" domain="[('case_default', '=', 1)]" help="Stages common to all projects"/> + <filter string="Common" name="common" domain="[('case_default', '=', 1)]" help="Stages common to all projects"/> </search> </field> </record> diff --git a/addons/project/report/project_cumulative.xml b/addons/project/report/project_cumulative.xml index e85d9d80138..c9d77deee92 100644 --- a/addons/project/report/project_cumulative.xml +++ b/addons/project/report/project_cumulative.xml @@ -7,8 +7,10 @@ <field name="model">project.task.history.cumulative</field> <field name="arch" type="xml"> <graph string="Project Tasks" type="bar" stacked="True"> - <field name="date" type="row"/> <field name="type_id" type="row"/> + <field name="kanban_state" type="row"/> + <field name="date" interval="month" type="col"/> + <field name="nbr_tasks" type="measure"/> <field name="planned_hours" type="measure"/> <field name="remaining_hours" type="measure"/> </graph> @@ -32,6 +34,15 @@ <filter string="Unassigned Tasks" domain="[('user_id','=',False)]"/> <separator/> <filter string="My Projects" domain="[('project_id.user_id','=',uid)]"/> + <group expand="1" string="Group By"> + <filter string="Project" name="project" context="{'group_by':'project_id'}"/> + <filter string="Task" context="{'group_by':'task_id'}"/> + <filter string="Assigned to" name="User" context="{'group_by':'user_id'}"/> + <filter string="Stage" context="{'group_by':'type_id'}"/> + <filter string="Status" context="{'group_by':'kanban_state'}"/> + <separator/> + <filter string="Month" context="{'group_by':'date:month'}" help="Creation Date"/> + </group> </search> </field> </record> diff --git a/addons/project/report/project_report.py b/addons/project/report/project_report.py index 1356a1ed007..e1e68050056 100644 --- a/addons/project/report/project_report.py +++ b/addons/project/report/project_report.py @@ -31,11 +31,11 @@ class report_project_task_user(osv.osv): 'name': fields.char('Task Summary', readonly=True), 'user_id': fields.many2one('res.users', 'Assigned To', readonly=True), 'reviewer_id': fields.many2one('res.users', 'Reviewer', readonly=True), - 'date_start': fields.date('Assignation Date', readonly=True), + 'date_start': fields.datetime('Assignation Date', readonly=True), 'no_of_days': fields.integer('# of Days', size=128, readonly=True), - 'date_end': fields.date('Ending Date', readonly=True), + 'date_end': fields.datetime('Ending Date', readonly=True), 'date_deadline': fields.date('Deadline', readonly=True), - 'date_last_stage_update': fields.date('Last Stage Update', readonly=True), + 'date_last_stage_update': fields.datetime('Last Stage Update', readonly=True), 'project_id': fields.many2one('project.project', 'Project', readonly=True), 'hours_planned': fields.float('Planned Hours', readonly=True), 'hours_effective': fields.float('Effective Hours', readonly=True), @@ -48,9 +48,10 @@ class report_project_task_user(osv.osv): 'opening_days': fields.float('Days to Assign', digits=(16,2), readonly=True, group_operator="avg", help="Number of Days to Open the task"), 'delay_endings_days': fields.float('Overpassed Deadline', digits=(16,2), readonly=True), - 'nbr': fields.integer('# of tasks', readonly=True), + 'nbr': fields.integer('# of Tasks', readonly=True), # TDE FIXME master: rename into nbr_tasks 'priority': fields.selection([('0','Low'), ('1','Normal'), ('2','High')], string='Priority', size=1, readonly=True), + 'state': fields.selection([('normal', 'In Progress'),('blocked', 'Blocked'),('done', 'Ready for next stage')],'Status', readonly=True), 'company_id': fields.many2one('res.company', 'Company', readonly=True), 'partner_id': fields.many2one('res.partner', 'Contact', readonly=True), 'stage_id': fields.many2one('project.task.type', 'Stage'), @@ -64,9 +65,9 @@ class report_project_task_user(osv.osv): SELECT (select 1 ) AS nbr, t.id as id, - date(t.date_start) as date_start, - date(t.date_end) as date_end, - date(t.date_last_stage_update) as date_last_stage_update, + t.date_start as date_start, + t.date_end as date_end, + t.date_last_stage_update as date_last_stage_update, t.date_deadline as date_deadline, abs((extract('epoch' from (t.write_date-t.date_start)))/(3600*24)) as no_of_days, t.user_id, @@ -79,6 +80,7 @@ class report_project_task_user(osv.osv): t.company_id, t.partner_id, t.stage_id as stage_id, + t.kanban_state as state, remaining_hours as remaining_hours, total_hours as total_hours, t.delay_hours as hours_delay, diff --git a/addons/project/report/project_report_view.xml b/addons/project/report/project_report_view.xml index 408d0001482..b441a592c54 100644 --- a/addons/project/report/project_report_view.xml +++ b/addons/project/report/project_report_view.xml @@ -13,26 +13,32 @@ <graph string="Tasks Analysis" type="pivot"> <field name="project_id" type="row"/> <field name="nbr" type="measure"/> - <field name="no_of_days" type="measure"/> - <field name="total_hours" type="measure"/> - <field name="hours_planned" type="measure"/> - <field name="remaining_hours" type="measure"/> </graph> </field> </record> <!-- Custom reports (aka filters) --> + <record id="filter_task_report_task_pipe" model="ir.filters"> + <field name="name">Task Pipe</field> + <field name="model_id">report.project.task.user</field> + <field name="user_id" eval="False"/> + <field name="context">{'group_by': ['project_id'], 'col_group_by': ['stage_id'], 'measures': ['nbr']}</field> + </record> + <record id="filter_task_report_workload" model="ir.filters"> + <field name="name">Workload</field> + <field name="model_id">report.project.task.user</field> + <field name="user_id" eval="False"/> + <field name="context">{'group_by': ['project_id'], 'measures': ['total_hours','hours_planned','remaining_hours']}</field> + </record> <record id="filter_task_report_responsible" model="ir.filters"> <field name="name">By Responsible</field> <field name="model_id">report.project.task.user</field> - <field name="domain">[]</field> <field name="user_id" eval="False"/> <field name="context">{'group_by': ['project_id', 'user_id']}</field> </record> <record id="filter_task_report_reviewer" model="ir.filters"> <field name="name">By Reviewer</field> <field name="model_id">report.project.task.user</field> - <field name="domain">[]</field> <field name="user_id" eval="False"/> <field name="context">{'group_by': ['project_id', 'reviewer_id']}</field> </record> @@ -50,7 +56,7 @@ <field name="user_id"/> <field name="partner_id" filter_domain="[('partner_id', 'child_of', self)]"/> <field name="stage_id"/> - <filter string="My Task" domain="[('user_id','=',uid)]" /> + <filter string="My Task" domain="[('user_id','=',uid)]"/> <filter string="Unassigned" name="unassigned" domain="[('user_id','=',False)]"/> <separator/> <filter string="New" name="new" domain="[('stage_id.sequence', '<=', 1)]"/> @@ -60,12 +66,12 @@ </group> <group expand="1" string="Group By"> <filter string="Project" name="project" context="{'group_by':'project_id'}"/> - <filter string="Task" context="{'group_by':'name'}" /> - <filter string="Contact" context="{'group_by':'partner_id'}" /> - <filter string="Assigned to" name="User" context="{'group_by':'user_id'}" /> + <filter string="Task" context="{'group_by':'name'}"/> + <filter string="Assigned to" name="User" context="{'group_by':'user_id'}"/> + <filter string="Stage" name="Stage" context="{'group_by':'stage_id'}"/> <filter string="Company" context="{'group_by':'company_id'}" groups="base.group_multi_company"/> - <filter string="Assignation date" context="{'group_by':'date_start:month'}" help="Creation Date"/> - <filter string="Last Stage Update" context="{'group_by':'date_last_stage_update'}" help="Last Stage Update"/> + <separator/> + <filter string="Assignation Month" context="{'group_by':'date_start:month'}" help="Creation Date"/> </group> </search> </field> diff --git a/addons/project_issue/project_issue_menu.xml b/addons/project_issue/project_issue_menu.xml index 26981256c7f..18acc21b74e 100644 --- a/addons/project_issue/project_issue_menu.xml +++ b/addons/project_issue/project_issue_menu.xml @@ -9,7 +9,7 @@ <field name="name">Issues</field> <field name="res_model">project.issue</field> <field name="view_type">form</field> - <field name="view_mode">kanban,tree,calendar</field> + <field name="view_mode">kanban,tree,calendar,form,graph</field> <field name="view_id" eval="False"/> <field name="domain" eval=""/> <field name="search_view_id" ref="view_project_issue_filter"/> @@ -50,6 +50,13 @@ <field name="act_window_id" ref="project_issue_categ_act0"/> </record> + <record model="ir.actions.act_window.view" id="action_crm_tag_graph_view0"> + <field name="sequence" eval="4"/> + <field name="view_mode">graph</field> + <field name="view_id" ref="project_issue_graph_view"/> + <field name="act_window_id" ref="project_issue_categ_act0"/> + </record> + <menuitem name="Issues" id="menu_project_issue_track" parent="project.menu_project_management" action="project_issue_categ_act0" sequence="15"/> </data> diff --git a/addons/project_issue/project_issue_view.xml b/addons/project_issue/project_issue_view.xml index 620c612ecf1..de81db8dfaf 100644 --- a/addons/project_issue/project_issue_view.xml +++ b/addons/project_issue/project_issue_view.xml @@ -52,7 +52,7 @@ options="{'fold_field': 'fold'}"/> </header> <sheet string="Issue"> - <div class="oe_right"> + <div class="oe_right"> <field name="kanban_state" class="oe_inline" widget="kanban_state_selection"/> </div> <label for="name" class="oe_edit_only"/> @@ -63,7 +63,7 @@ <field name="categ_ids" widget="many2many_tags"/> <group> <group> - <field name="user_id" + <field name="user_id" context="{'default_groups_ref': ['base.group_user', 'base.group_partner_manager', 'project.group_project_user']}"/> <field name="partner_id" on_change="onchange_partner_id(partner_id)"/> <field name="email_from"/> @@ -155,12 +155,15 @@ <separator/> <filter string="New Mail" name="message_unread" domain="[('message_unread','=',True)]"/> <group expand="0" string="Group By" > - <filter string="Responsible" name="group_user_id" icon="terp-personal" domain="[]" context="{'group_by':'user_id'}"/> - <filter string="Contact" name="group_partner_id" icon="terp-partner" domain="[]" context="{'group_by':'partner_id'}"/> - <filter string="Project" name="group_project_id" icon="terp-folder-violet" domain="[]" context="{'group_by':'project_id'}"/> - <filter string="Stage" name="group_stage_id" icon="terp-stage" domain="[]" context="{'group_by':'stage_id'}"/> - <filter string="Creation Month" name="group_create_date" icon="terp-go-month" domain="[]" context="{'group_by':'create_date'}"/> - <filter string="Last Message" name="group_message_last_post" domain="[]" context="{'group_by':'message_last_post:week'}"/> + <filter string="Assigned to" name="Responsible" context="{'group_by':'user_id'}" /> + <filter string="Project" name="project" context="{'group_by':'project_id'}" /> + <filter string="Task" context="{'group_by':'task_id'}"/> + <filter string="Priority" context="{'group_by':'priority'}" /> + <filter string="Stage" context="{'group_by':'stage_id'}"/> + <filter string="Company" context="{'group_by':'company_id'}" groups="base.group_multi_company"/> + <separator/> + <filter string="Create Day" context="{'group_by':'create_date:day'}" help="Create Date"/> + <filter string="Last Message" name="group_message_last_post" context="{'group_by':'message_last_post:week'}"/> </group> </search> </field> @@ -237,6 +240,17 @@ </field> </record> + <record model="ir.ui.view" id="project_issue_graph_view"> + <field name="name">Project Issue Tracker Graph</field> + <field name="model">project.issue</field> + <field name="arch" type="xml"> + <graph string="Project Issues" type="bar"> + <field name="project_id" type="row"/> + <field name="create_date" interval="month" type="col"/> + </graph> + </field> + </record> + <!-- Feature Requests --> <record model="ir.ui.view" id="project_feature_tree_view"> @@ -262,7 +276,7 @@ <field name="name">Issues</field> <field name="view_mode">kanban,tree,form,calendar,graph</field> <field name="context">{ - 'search_default_project_id': [active_id], + 'search_default_project_id': [active_id], 'default_project_id': active_id, } </field> @@ -287,7 +301,7 @@ <label for="use_issues"/> </xpath> <xpath expr='//div[@name="buttons"]' position='inside'> - <button class="oe_inline oe_stat_button" type="action" attrs="{'invisible':[('use_issues','=', 0)]}" + <button class="oe_inline oe_stat_button" type="action" attrs="{'invisible':[('use_issues','=', 0)]}" name="%(act_project_project_2_project_issue_all)d" icon="fa-bug"> <field string="Issues" name="issue_count" widget="statinfo"/> </button> @@ -357,14 +371,14 @@ <field name="priority" eval="50"/> <field name="arch" type="xml"> <xpath expr="//div[@name='buttons']" position="inside"> - <button class="oe_inline oe_stat_button" type="action" name="%(action_view_issues)d" + <button class="oe_inline oe_stat_button" type="action" name="%(action_view_issues)d" context="{'search_default_partner_id': active_id, 'default_partner_id': active_id}" attrs="{'invisible': [('customer', '=', False)]}" icon="fa-bug" groups="project.group_project_user"> <field string="Issues" name="issue_count" widget="statinfo"/> - </button> - - + </button> + + </xpath> </field> </record> diff --git a/addons/project_issue/report/project_issue_report.py b/addons/project_issue/report/project_issue_report.py index 2ab9b1a0da4..77894b0be81 100644 --- a/addons/project_issue/report/project_issue_report.py +++ b/addons/project_issue/report/project_issue_report.py @@ -31,12 +31,12 @@ class project_issue_report(osv.osv): _columns = { 'section_id':fields.many2one('crm.case.section', 'Sale Team', readonly=True), 'company_id': fields.many2one('res.company', 'Company', readonly=True), - 'opening_date': fields.date('Date of Opening', readonly=True), - 'create_date': fields.date('Create Date', readonly=True), - 'date_closed': fields.date('Date of Closing', readonly=True), - 'date_last_stage_update': fields.date('Last Stage Update', readonly=True), + 'opening_date': fields.datetime('Date of Opening', readonly=True), + 'create_date': fields.datetime('Create Date', readonly=True), + 'date_closed': fields.datetime('Date of Closing', readonly=True), + 'date_last_stage_update': fields.datetime('Last Stage Update', readonly=True), 'stage_id': fields.many2one('project.task.type', 'Stage'), - 'nbr': fields.integer('# of Issues', readonly=True), + 'nbr': fields.integer('# of Issues', readonly=True), # TDE FIXME master: rename into nbr_issues 'working_hours_open': fields.float('Avg. Working Hours to Open', readonly=True, group_operator="avg"), 'working_hours_close': fields.float('Avg. Working Hours to Close', readonly=True, group_operator="avg"), 'delay_open': fields.float('Avg. Delay to Open', digits=(16,2), readonly=True, group_operator="avg", @@ -52,6 +52,7 @@ class project_issue_report(osv.osv): 'channel': fields.char('Channel', readonly=True, help="Communication Channel."), 'task_id': fields.many2one('project.task', 'Task'), 'email': fields.integer('# Emails', size=128, readonly=True), + 'reviewer_id': fields.many2one('res.users', 'Reviewer', readonly=True), } def init(self, cr): @@ -60,9 +61,9 @@ class project_issue_report(osv.osv): CREATE OR REPLACE VIEW project_issue_report AS ( SELECT c.id as id, - date(c.date_open) as opening_date, - date(c.create_date) as create_date, - date(c.date_last_stage_update) as date_last_stage_update, + c.date_open as opening_date, + c.create_date as create_date, + c.date_last_stage_update as date_last_stage_update, c.user_id, c.working_hours_open, c.working_hours_close, @@ -79,10 +80,12 @@ class project_issue_report(osv.osv): c.task_id, c.day_open as delay_open, c.day_close as delay_close, - (SELECT count(id) FROM mail_message WHERE model='project.issue' AND res_id=c.id) AS email + (SELECT count(id) FROM mail_message WHERE model='project.issue' AND res_id=c.id) AS email, + t.reviewer_id FROM project_issue c + LEFT JOIN project_task t on c.task_id = t.id WHERE c.active= 'true' )""") diff --git a/addons/project_issue/report/project_issue_report_view.xml b/addons/project_issue/report/project_issue_report_view.xml index 67473875134..fb42c506235 100644 --- a/addons/project_issue/report/project_issue_report_view.xml +++ b/addons/project_issue/report/project_issue_report_view.xml @@ -6,18 +6,23 @@ <field name="model">project.issue.report</field> <field name="arch" type="xml"> <graph orientation="horizontal" string="Project Issue" type="pivot" stacked="True"> + <field name="project_id" type="row"/> + <field name="create_date" interval="month" type="col"/> <field name="nbr" type="measure"/> - <field name="user_id" type="row"/> - <field name="stage_id" type="row"/> </graph> </field> </record> <!-- Custom reports (aka filters) --> + <record id="filter_issue_report_delay" model="ir.filters"> + <field name="name">Delay</field> + <field name="model_id">project.issue.report</field> + <field name="user_id" eval="False"/> + <field name="context">{'group_by': ['project_id'], 'measures': ['delay_close', 'delay_open']}</field> + </record> <record id="filter_issue_report_responsible" model="ir.filters"> <field name="name">By Responsible</field> <field name="model_id">project.issue.report</field> - <field name="domain">[]</field> <field name="user_id" eval="False"/> <field name="context">{'group_by': ['project_id', 'user_id']}</field> </record> @@ -32,22 +37,19 @@ <field name="partner_id" filter_domain="[('partner_id', 'child_of', self)]"/> <field name="version_id"/> <field name="stage_id"/> - <filter string="My Task" domain="[('user_id','=',uid)]" /> + <filter string="My Issues" domain="[('user_id','=',uid)]" /> <filter string="Unassigned" name="unassigned" domain="[('user_id','=',False)]"/> <separator/> <filter string="New" name="new" domain="[('stage_id.sequence', '<=', 1)]"/> <group expand="1" string="Group By"> - <filter string="Assigned to" name="Responsible" icon="terp-personal" domain="[]" context="{'group_by':'user_id'}" /> - <filter string="Contact" icon="terp-partner" context="{'group_by':'partner_id'}" /> - <filter string="Sale Team" icon="terp-personal+" domain="[]" context="{'group_by':'section_id'}" groups="base.group_multi_salesteams"/> - <filter string="Project" name="project" icon="terp-folder-violet" context="{'group_by':'project_id'}" /> - <filter string="Task" icon="terp-stock_align_left_24" domain="[]" context="{'group_by':'task_id'}"/> - <filter string="Version" icon="terp-stock_symbol-selection" domain="[]" context="{'group_by':'version_id'}"/> - <filter string="Priority" icon="terp-rating-rated" domain="[]" context="{'group_by':'priority'}" /> - <filter string="Stage" icon="terp-stage" domain="[]" context="{'group_by':'stage_id'}"/> - <filter string="Company" icon="terp-go-home" domain="[]" context="{'group_by':'company_id'}" groups="base.group_multi_company"/> - <filter string="Create Date" icon="terp-go-month" domain="[]" context="{'group_by':'create_date'}" help="Create Date"/> - <filter string="Last Stage Update" context="{'group_by':'date_last_stage_update'}"/> + <filter string="Assigned to" name="Responsible" context="{'group_by':'user_id'}" /> + <filter string="Project" name="project" context="{'group_by':'project_id'}" /> + <filter string="Task" context="{'group_by':'task_id'}"/> + <filter string="Priority" context="{'group_by':'priority'}" /> + <filter string="Stage" context="{'group_by':'stage_id'}"/> + <filter string="Company" context="{'group_by':'company_id'}" groups="base.group_multi_company"/> + <separator/> + <filter string="Create Day" context="{'group_by':'create_date:day'}" help="Create Date"/> </group> </search> </field> diff --git a/addons/purchase/report/purchase_report.py b/addons/purchase/report/purchase_report.py index d5a660667a6..263084f8fe9 100644 --- a/addons/purchase/report/purchase_report.py +++ b/addons/purchase/report/purchase_report.py @@ -31,7 +31,7 @@ class purchase_report(osv.osv): _description = "Purchases Orders" _auto = False _columns = { - 'date': fields.date('Order Date', readonly=True, help="Date on which this document has been created"), + 'date': fields.datetime('Order Date', readonly=True, help="Date on which this document has been created"), # TDE FIXME master: rename into date_order 'state': fields.selection([('draft', 'Request for Quotation'), ('confirmed', 'Waiting Supplier Ack'), ('approved', 'Approved'), @@ -52,12 +52,12 @@ class purchase_report(osv.osv): 'user_id':fields.many2one('res.users', 'Responsible', readonly=True), 'delay':fields.float('Days to Validate', digits=(16,2), readonly=True), 'delay_pass':fields.float('Days to Deliver', digits=(16,2), readonly=True), - 'quantity': fields.float('Quantity', readonly=True), + 'quantity': fields.integer('Unit Quantity', readonly=True), # TDE FIXME master: rename into unit_quantity 'price_total': fields.float('Total Price', readonly=True), 'price_average': fields.float('Average Price', readonly=True, group_operator="avg"), 'negociation': fields.float('Purchase-Standard Price', readonly=True, group_operator="avg"), 'price_standard': fields.float('Products Value', readonly=True, group_operator="sum"), - 'nbr': fields.integer('# of Lines', readonly=True), + 'nbr': fields.integer('# of Lines', readonly=True), # TDE FIXME master: rename into nbr_lines 'category_id': fields.many2one('product.category', 'Category', readonly=True) } @@ -68,7 +68,7 @@ class purchase_report(osv.osv): create or replace view purchase_report as ( select min(l.id) as id, - date(s.date_order) as date, + s.date_order as date, s.state, s.date_approve, s.minimum_planned_date as expected_date, diff --git a/addons/purchase/report/purchase_report_view.xml b/addons/purchase/report/purchase_report_view.xml index 3db4144a9a3..32164cfc703 100644 --- a/addons/purchase/report/purchase_report_view.xml +++ b/addons/purchase/report/purchase_report_view.xml @@ -7,23 +7,45 @@ <field name="arch" type="xml"> <graph string="Purchase Orders Statistics" type="pivot"> <field name="partner_id" type="row"/> - <field name="product_id" type="row"/> - <field name="nbr" type="measure"/> + <field name="date" interval="month" type="col"/> + <field name="price_total" type="measure"/> <field name="quantity" type="measure"/> <field name="price_average" type="measure"/> - <field name="price_standard" type="measure"/> - <field name="price_total" type="measure"/> </graph> </field> </record> + <!-- Custom reports (aka filters) --> + <record id="filter_purchase_order_monthly_purchases" model="ir.filters"> + <field name="name">Monthly Purchases</field> + <field name="model_id">purchase.report</field> + <field name="domain">[('state','<>','cancel')]</field> + <field name="user_id" eval="False"/> + <field name="context">{'group_by': ['category_id'], 'col_group_by': ['date:month'], 'measures': ['quantity']}</field> + </record> + <record id="filter_purchase_order_price_per_supplier" model="ir.filters"> + <field name="name">Price Per Supplier</field> + <field name="model_id">purchase.report</field> + <field name="domain">[('state','<>','draft'),('state','<>','cancel')]</field> + <field name="user_id" eval="False"/> + <field name="context">{'group_by': ['partner_id'], 'col_group_by': ['product_id'], 'measures': ['price_average']}</field> + </record> + <record id="filter_purchase_order_average_delivery_time" model="ir.filters"> + <field name="name">Average Delivery Time</field> + <field name="model_id">purchase.report</field> + <field name="domain">[('state','<>','draft'),('state','<>','cancel')]</field> + <field name="user_id" eval="False"/> + <field name="context">{'group_by': ['partner_id'], 'measures': ['delay_pass']}</field> + </record> + + <record id="view_purchase_order_search" model="ir.ui.view"> <field name="name">report.purchase.order.search</field> <field name="model">purchase.report</field> <field name="arch" type="xml"> <search string="Purchase Orders"> - <filter icon="terp-document-new" string="Quotations" name="quotes" domain="[('state','=','draft')]"/> - <filter icon="terp-gtk-jump-to-rtl" string="Orders" name="orders" domain="[('state','<>','draft'),('state','<>','cancel')]"/> + <filter string="Quotations" name="quotes" domain="[('state','=','draft')]"/> + <filter string="Orders" name="orders" domain="[('state','<>','draft'),('state','<>','cancel')]"/> <field name="partner_id"/> <field name="product_id"/> <group expand="0" string="Extended Filters"> @@ -37,17 +59,13 @@ <field name="expected_date"/> </group> <group expand="1" string="Group By"> - <filter string="Supplier" name="group_partner_id" icon="terp-personal" context="{'group_by':'partner_id'}"/> - <filter string="Responsible" name="Responsible" icon="terp-personal" context="{'group_by':'user_id'}"/> - <filter string="Validated by" icon="terp-personal" context="{'group_by':'validator'}"/> - <filter string="Product" name="group_product_id" icon="terp-accessories-archiver" context="{'group_by':'product_id'}"/> - <filter string="Category" name="group_category_id" icon="terp-stock_symbol-selection" context="{'group_by':'category_id'}"/> - <filter string="Warehouse" icon="terp-go-home" context="{'group_by':'picking_type_id'}"/> - <filter string="Reference UOM" name="group_product_uom" icon="terp-mrp" context="{'group_by':'product_uom'}"/> - <filter string="Destination" icon="terp-gtk-jump-to-ltr" context="{'group_by':'location_id'}"/> - <filter string="Status" icon="terp-stock_effects-object-colorize" context="{'group_by':'state'}"/> - <filter string="Company" icon="terp-go-home" context="{'group_by':'company_id'}" groups="base.group_multi_company"/> - <filter string="Order Date" icon="terp-go-month" context="{'group_by':'date:month'}" help="Order of Day"/> + <filter string="Supplier" name="group_partner_id" context="{'group_by':'partner_id'}"/> + <filter string="Responsible" name="Responsible" context="{'group_by':'user_id'}"/> + <filter string="Category of product" name="group_category_id" context="{'group_by':'category_id'}"/> + <filter string="Status" context="{'group_by':'state'}"/> + <filter string="Company" context="{'group_by':'company_id'}" groups="base.group_multi_company"/> + <separator/> + <filter string="Order Month" context="{'group_by':'date:month'}" help="Order of Day"/> </group> </search> </field> @@ -59,7 +77,7 @@ <field name="view_type">form</field> <field name="view_mode">graph</field> <field name="view_id" ref="view_purchase_order_graph"></field> - <field name="context">{'search_default_year':1,'search_default_month':1, 'search_default_orders': 1, 'group_by_no_leaf':1,'group_by':[]}</field> + <field name="context">{'search_default_orders': 1, 'group_by_no_leaf':1,'group_by':[]}</field> <field name="help">Purchase Analysis allows you to easily check and analyse your company purchase history and performance. From this menu you can track your negotiation performance, the delivery performance of your suppliers, etc.</field> </record> diff --git a/addons/sale/report/sale_report.py b/addons/sale/report/sale_report.py index 7ea14ba1ee6..731a326010e 100644 --- a/addons/sale/report/sale_report.py +++ b/addons/sale/report/sale_report.py @@ -29,7 +29,7 @@ class sale_report(osv.osv): _rec_name = 'date' _columns = { - 'date': fields.datetime('Date Order', readonly=True), + 'date': fields.datetime('Date Order', readonly=True), # TDE FIXME master: rename into date_order 'date_confirm': fields.date('Date Confirm', readonly=True), 'product_id': fields.many2one('product.product', 'Product', readonly=True), 'product_uom': fields.many2one('product.uom', 'Unit of Measure', readonly=True), @@ -41,7 +41,7 @@ class sale_report(osv.osv): 'price_total': fields.float('Total Price', readonly=True), 'delay': fields.float('Commitment Delay', digits=(16,2), readonly=True), 'categ_id': fields.many2one('product.category','Category of Product', readonly=True), - 'nbr': fields.integer('# of Lines', readonly=True), + 'nbr': fields.integer('# of Lines', readonly=True), # TDE FIXME master: rename into nbr_lines 'state': fields.selection([ ('draft', 'Quotation'), ('waiting_date', 'Waiting Schedule'), @@ -82,7 +82,7 @@ class sale_report(osv.osv): def _from(self): from_str = """ sale_order_line l - join sale_order s on (l.order_id=s.id) + join sale_order s on (l.order_id=s.id) left join product_product p on (l.product_id=p.id) left join product_template t on (p.product_tmpl_id=t.id) left join product_uom u on (u.id=l.product_uom) diff --git a/addons/sale/report/sale_report_view.xml b/addons/sale/report/sale_report_view.xml index f2be545a28b..a9d6b6067a4 100644 --- a/addons/sale/report/sale_report_view.xml +++ b/addons/sale/report/sale_report_view.xml @@ -7,7 +7,7 @@ <field name="model">sale.report</field> <field name="arch" type="xml"> <graph string="Sales Analysis" type="pivot" stacked="True"> - <field name="user_id" type="row"/> + <field name="section_id" type="row"/> <field name="date" interval="month" type="col"/> <field name="price_total" type="measure"/> </graph> @@ -15,24 +15,28 @@ </record> <!-- Custom reports (aka filters) --> + <record id="filter_sale_report_sales_funnel" model="ir.filters"> + <field name="name">Sales Funnel</field> + <field name="model_id">sale.report</field> + <field name="domain">['&', ('date','<=', time.strftime('%%Y-12-31')), '&', ('date','>=',time.strftime('%%Y-01-01')), '|', ('state','in',('draft','sent')), ('state','not in',('draft','sent','cancel'))]</field> + <field name="user_id" eval="False"/> + <field name="context">{'group_by': ['state'], 'measures': ['price_total']}</field> + </record> <record id="filter_sale_report_salespersons" model="ir.filters"> <field name="name">By Salespersons</field> <field name="model_id">sale.report</field> - <field name="domain">[]</field> <field name="user_id" eval="False"/> <field name="context">{'group_by': ['date:month', 'user_id']}</field> </record> <record id="filter_sale_report_salesteam" model="ir.filters"> <field name="name">By Salesteam</field> <field name="model_id">sale.report</field> - <field name="domain">[]</field> <field name="user_id" eval="False"/> <field name="context">{'group_by': ['date:month', 'section_id']}</field> </record> <record id="filter_isale_report_product" model="ir.filters"> <field name="name">By Product</field> <field name="model_id">sale.report</field> - <field name="domain">[]</field> <field name="user_id" eval="False"/> <field name="context">{'group_by': ['date:month', 'product_id']}</field> </record> @@ -44,8 +48,7 @@ <search string="Sales Analysis"> <field name="date"/> <field name="date_confirm"/> - <filter string="This Year" name="year" domain="[('date','<=', time.strftime('%%Y-12-31')),('date','>=',time.strftime('%%Y-01-01'))]"/> - <separator/> + <filter string="This Year" name="year" invisible="1" domain="[('date','<=', time.strftime('%%Y-12-31')),('date','>=',time.strftime('%%Y-01-01'))]"/> <filter name="Quotations" domain="[('state','in',('draft','sent'))]"/> <filter name="Sales" string="Sales" domain="[('state','not in',('draft','sent','cancel'))]"/> <separator/> @@ -58,16 +61,14 @@ <field name="company_id" groups="base.group_multi_company"/> </group> <group expand="1" string="Group By"> - <filter string="Salesperson" icon="terp-personal" name="User" context="{'group_by':'user_id'}"/> + <filter string="Salesperson" name="User" context="{'group_by':'user_id'}"/> <filter string="Sales Team" context="{'group_by':'section_id'}" groups="base.group_multi_salesteams"/> - <filter string="Partner" icon="terp-partner" name="Customer" context="{'group_by':'partner_id'}"/> - <filter string="Product" icon="terp-accessories-archiver" context="{'group_by':'product_id','set_visible':True}"/> - <filter string="Reference Unit of Measure" icon="terp-mrp" context="{'group_by':'product_uom'}"/> - <filter string="Category of Product" icon="terp-stock_symbol-selection" name="Category" context="{'group_by':'categ_id'}"/> - <filter string="Analytic Account" icon="terp-folder-green" context="{'group_by':'analytic_account_id'}" groups="analytic.group_analytic_accounting"/> - <filter string="Status" icon="terp-stock_effects-object-colorize" context="{'group_by':'state'}"/> - <filter string="Company" icon="terp-go-home" groups="base.group_multi_company" context="{'group_by':'company_id'}"/> - <filter string="Order Date" icon="terp-go-today" context="{'group_by':'date'}" help="Ordered date of the sales order"/> + <filter string="Customer" name="Customer" context="{'group_by':'partner_id'}"/> + <filter string="Category of Product" name="Category" context="{'group_by':'categ_id'}"/> + <filter string="Status" context="{'group_by':'state'}"/> + <filter string="Company" groups="base.group_multi_company" context="{'group_by':'company_id'}"/> + <separator/> + <filter string="Order Month" context="{'group_by':'date:month'}" help="Ordered date of the sales order"/> </group> </search> </field> @@ -80,7 +81,7 @@ <field name="view_mode">graph</field> <field name="search_view_id" ref="view_order_product_search"/> <field name="view_id" ref="view_order_product_graph"/> - <field name="context">{'search_default_Sales':1, 'search_default_year': 1, 'group_by_no_leaf':1,'group_by':[]}</field> + <field name="context">{'search_default_Sales':1, 'group_by_no_leaf':1,'group_by':[]}</field> <field name="help">This report performs analysis on your quotations and sales orders. Analysis check your sales revenues and sort it by different group criteria (salesman, partner, product, etc.) Use this report to perform analysis on sales not having invoiced yet. If you want to analyse your turnover, you should use the Invoice Analysis report in the Accounting application.</field> </record> diff --git a/addons/sale/sale_view.xml b/addons/sale/sale_view.xml index b2c89ef8c21..a54ddc95465 100644 --- a/addons/sale/sale_view.xml +++ b/addons/sale/sale_view.xml @@ -167,7 +167,7 @@ <field name="th_weight" invisible="1"/> <field name="product_id" context="{'partner_id':parent.partner_id, 'quantity':product_uom_qty, 'pricelist':parent.pricelist_id, 'uom':product_uom}" - groups="base.group_user" + groups="base.group_user" on_change="product_id_change(parent.pricelist_id, product_id, product_uom_qty, False, product_uos_qty, False, name, parent.partner_id, False, True, parent.date_order, False, parent.fiscal_position, False, context)"/> <field name="name"/> <field name="product_uom_qty" @@ -500,7 +500,7 @@ <field name="inherit_id" ref="product.product_normal_form_view"/> <field name="arch" type="xml"> <xpath expr="//div[@name='buttons']" position="inside"> - <button class="oe_inline oe_stat_button" name="%(action_order_line_product_tree)d" + <button class="oe_inline oe_stat_button" name="%(action_order_line_product_tree)d" type="action" groups="base.group_sale_salesman" icon="fa-strikethrough"> <field string="Sales" name="sales_count" widget="statinfo" /> </button> @@ -514,7 +514,7 @@ <field name="inherit_id" ref="product.product_template_only_form_view"/> <field name="arch" type="xml"> <xpath expr="//div[@name='buttons']" position="inside"> - <button class="oe_inline oe_stat_button" name="action_view_sales" + <button class="oe_inline oe_stat_button" name="action_view_sales" type="object" groups="base.group_sale_salesman" icon="fa-strikethrough"> <field string="Sales" name="sales_count" widget="statinfo" /> </button> @@ -535,7 +535,7 @@ </xpath> </field> </record> - + <!-- Update account invoice list view!--> <record model="ir.ui.view" id="account_invoice_tree"> <field name="name">Account Invoice</field> @@ -559,7 +559,7 @@ <xpath expr="//field[@name='user_id']" position="after"> <field name="section_id" groups="base.group_multi_salesteams"/> </xpath> - <xpath expr="//group/filter[@string='Due Month']" position="after"> + <xpath expr="//group/filter[@string='Status']" position="after"> <filter string="Sales Team" domain="[]" context="{'group_by':'section_id'}" groups="base.group_multi_salesteams"/> </xpath> </field> diff --git a/addons/sale_stock/report/sale_report_view.xml b/addons/sale_stock/report/sale_report_view.xml index 5e5ab042e9a..9628af9d8d1 100644 --- a/addons/sale_stock/report/sale_report_view.xml +++ b/addons/sale_stock/report/sale_report_view.xml @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="utf-8"?> <openerp> <data> + <!-- Filters too specific to propose directly to the user <record id="view_order_product_search_sale_stock_inherit" model="ir.ui.view"> <field name="name">sale.report.search.sale.stock</field> <field name="model">sale.report</field> @@ -15,5 +16,6 @@ </xpath> </field> </record> + --> </data> -</openerp>
\ No newline at end of file +</openerp> |
