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 @@ + + + By Salespersons + account.invoice + + {'group_by': ['date_invoice:month', 'user_id']} + + account.invoice.select account.invoice @@ -463,14 +471,13 @@ - - - - - - - - + + + + + + + @@ -582,7 +589,7 @@

- Click to create a customer refund. + Click to create a customer refund.

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 @@ - + - - - - - - - - - + + + + + + + @@ -30,7 +28,8 @@ analytic.entries.report - + + @@ -42,8 +41,8 @@ analytic.entries.report form graph - {'search_default_year':1,'search_default_month':1, 'group_by_no_leaf':1, 'search_default_Account':1, 'search_default_Month':1, 'group_by':[]} + {'group_by_no_leaf':1, 'search_default_Account':1, 'group_by':[]} 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. 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 @@ account.entries.report - - - - + + + + + @@ -63,14 +64,14 @@ - - + + - - + + - - + + @@ -81,17 +82,13 @@ - - - - - - - - - - - + + + + + + + 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 @@ account.invoice.report - - - + @@ -58,7 +56,7 @@ - + @@ -74,19 +72,14 @@ - - - - - - - - - - - - - + + + + + + + + @@ -97,7 +90,7 @@ account.invoice.report form graph - {'search_default_current':1, 'search_default_year': 1, 'search_default_customer':1, 'group_by':[], 'group_by_no_leaf':1,} + {'search_default_current':1, 'search_default_customer':1, 'group_by':[], 'group_by_no_leaf':1,} 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. 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 @@ + + + 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 @@ asset.asset.report - - + + + - - + asset.asset.report.search asset.asset.report @@ -23,10 +23,10 @@ - - + + - + @@ -35,24 +35,25 @@ - - - - + + + + + - + - - + + Assets Analysis asset.asset.report form graph - {'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} + {'group_by':[], 'group_by_no_leaf':1}

From this report, you can have an overview on all depreciation. The @@ -61,7 +62,7 @@

- + 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 @@ account_followup.stat - + + @@ -19,19 +20,20 @@ - - - - - - - + + + + + + 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 @@ - - + sale.receipt.report.graph sale.receipt.report - + + @@ -20,9 +20,9 @@ - - - + + + @@ -31,14 +31,13 @@ - - - - - - - - + + + + + + + @@ -49,7 +48,7 @@ sale.receipt.report form graph - {'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,} + {'search_default_year':1,'search_default_month':1,'search_default_partner':1, 'search_default_customer':1, 'group_by':[], 'group_by_no_leaf':1,}

@@ -63,6 +62,6 @@ - + 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 + + opportunity + Interest in your products + + + Agrolait + info@agrolait.com + + 69 rue de Chimay + + Wavre + 1300 + + 2 + + + Send Catalogue by Email + + + + + bWlncmF0aW9uIHRlc3Q= 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 @@ kanban,tree,graph,form,calendar [('type','=','opportunity')] { - 'stage_type': 'opportunity', - 'default_type': 'opportunity', + 'stage_type': 'opportunity', + 'default_type': 'opportunity', 'default_user_id': uid } 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 @@

- - - - - - -
+ @@ -355,7 +355,7 @@ - +
@@ -384,7 +384,7 @@ - +
  • @@ -392,7 +392,7 @@
  • - +
@@ -403,7 +403,7 @@ - + Vehicles @@ -412,7 +412,7 @@ kanban,tree,form

- Click to create a new vehicle. + Click to create a new vehicle.

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 @@ tree,form,graph

- Click to create a new contract. + Click to create a new contract.

Manage all your contracts (leasing, insurances, etc.) with their related services, costs. Odoo will automatically warn @@ -600,7 +600,7 @@ - + fleet.vehicle.odometer.search fleet.vehicle.odometer @@ -622,7 +622,7 @@ fleet.vehicle.odometer - + @@ -636,7 +636,7 @@ {"search_default_groupby_vehicle" : True}

- Click to create a new odometer log. + Click to create a new odometer log.

Here you can add various odometer entries for all vehicles. @@ -692,11 +692,11 @@ fleet.vehicle.log.fuel - + - + @@ -705,7 +705,7 @@ - + fleet.vehicle.log.fuel.search fleet.vehicle.log.fuel @@ -742,7 +742,7 @@ {"search_default_groupby_vehicle" : True}

- Click to create a new fuel log. + Click to create a new fuel log.

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 @@ - + @@ -845,7 +845,7 @@ tree,form,graph

- Click to create a new service entry. + Click to create a new service entry.

Odoo helps you keeping track of all the services done on your vehicle. Services can be of many type: occasional @@ -898,15 +898,26 @@ - + fleet.vehicle.cost.graph fleet.vehicle.cost - + + + + + + + + + fleet.vehicle.cost.graph + fleet.vehicle.cost + + + - @@ -924,12 +935,13 @@ - - - - - - + + + + + + + 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 @@ - + - + - - + + + @@ -152,7 +153,7 @@

- - + -
@@ -162,5 +163,3 @@ - - 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 @@ - + @@ -19,9 +19,9 @@ hr.evaluation.report - - - + + + @@ -31,11 +31,12 @@ - - - - - + + + + + + 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 @@ - - - - + +
@@ -22,9 +20,9 @@ hr.expense.report - - - + + + @@ -36,14 +34,13 @@ - - - - - - - - + + + + + + + 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 @@ + + + hr.holidays.graph + hr.holidays + + + + + + + + + + hr.holidays.filter hr.holidays @@ -8,27 +22,26 @@ - - - + + + - + - + - + - - - - - - - - + + + + + + + @@ -40,9 +53,9 @@ Leave Request hr.holidays - + @@ -483,10 +496,10 @@ - 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 @@ - + @@ -16,23 +16,20 @@ By Recruiter hr.recruitment.report - [] - {'group_by': ['date_create:month', 'user_id']} + {'group_by': ['date_create:month', 'user_id'], 'col_group_by': ['date_create:month']} By Job hr.recruitment.report - [] - {'group_by': ['date_create:month', 'job_id']} + {'group_by': ['date_create:month', 'job_id'], 'col_group_by': ['date_create:month']} By Department hr.recruitment.report - [] - {'group_by': ['date_create:month', 'department_id']} + {'group_by': ['date_create:month', 'department_id'], 'col_group_by': ['date_create:month']} @@ -48,7 +45,7 @@ - + @@ -60,14 +57,11 @@ - - - - - + + @@ -78,7 +72,7 @@ hr.recruitment.report form graph - {'search_default_year': 1, 'group_by_no_leaf':1,'group_by':[]} + {'group_by_no_leaf':1,'group_by':[]} 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 @@ - + - + hr.timesheet.report.search hr.timesheet.report @@ -21,7 +21,7 @@ - + @@ -30,12 +30,10 @@ - - - - - - + + + + @@ -46,7 +44,7 @@ hr.timesheet.report form graph - {'search_default_group_user_id':1,'group_by_no_leaf':1,'group_by':[]} + {'group_by_no_leaf':1,'group_by':[]} - + - + @@ -17,15 +17,31 @@ + + + Internal Timesheet + hr.timesheet.report + [('state','=','done'), ('date','<=', time.strftime('%Y-%m-%d')),('date','>=',time.strftime('%Y-%m-01'))] + + {'group_by': ['user_id'], 'col_group_by': ['department_id'], 'measures': ['time']} + + + External Timesheet + hr.timesheet.report + [('state','=','done'), ('date','<=', time.strftime('%Y-%m-%d')),('date','>=',time.strftime('%Y-%m-01'))] + + {'group_by': ['company_id', 'to_invoice'], 'col_group_by': ['user_id'], 'measures': ['time','cost']} + + timesheet.report.search hr.timesheet.report - - - + + + @@ -33,14 +49,10 @@ - - - - - - - - + + + + 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 @@ - - + + - + @@ -55,16 +55,14 @@ - - + + - + - + - - - + 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 @@ - - + + - + @@ -51,19 +51,16 @@ - + - + - + - - - - + 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 @@ + + + campaign.analysis.graph + campaign.analysis + + + + + + + + campaign.analysis.tree campaign.analysis @@ -30,24 +42,21 @@ - - - + + + - - - - - - - - - + + + + + + @@ -57,8 +66,8 @@ Campaign Analysis campaign.analysis form - tree - {'search_default_year': 1,"search_default_This Month":1,'group_by': [], 'search_default_Campaign': 1, 'search_default_Segment': 1, 'group_by_no_leaf':1} + graph,tree + {'group_by': [], 'group_by_no_leaf':1} 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 @@ - + + + + @@ -419,6 +424,17 @@ + + mail.mass_mailing.graph + mail.mass_mailing + + + + + + + + Mass Mailings mail.mass_mailing @@ -438,7 +454,7 @@ form kanban,tree,form { - 'search_default_mass_mailing_campaign_id': [active_id], + 'search_default_mass_mailing_campaign_id': [active_id], 'default_mass_mailing_campaign_id': active_id, } 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 @@ + + + + + + mail.statistics.report.graph + mail.statistics.report + + + + + + + + + + + + + + mail.statistics.report.search + mail.statistics.report + + + + + + + + + + + + + + + + + + + Mass Mailing Analysis + mail.statistics.report + form + graph + 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. + + + graph + + + + + + + + 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 @@ report.membership - - + + - - - - - - + + + + + + @@ -35,7 +35,11 @@ report.membership + + + + 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 @@ mrp.workorder - + + - + + + Workload + mrp.workorder + + {'group_by': ['workcenter_id'], 'col_group_by': ['date:month'], 'measures': ['total_hours', 'total_cycles']} + + + Quantity Produced + mrp.workorder + [('state','=','done')] + + {'group_by': ['workcenter_id'], 'col_group_by': ['date:month'], 'measures': ['total_hours', 'total_cycles']} + + + Current Production + mrp.workorder + [('state','=','startworking')] + + {'group_by': ['workcenter_id'], 'col_group_by': ['product_id'], 'measures': ['product_qty', 'total_hours']} + + mrp.workorder.select mrp.workorder - - - + + + - - - - - + + + + + + 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 @@ report.pos.order - - + + - - @@ -22,22 +20,22 @@ - - + + - + - + - - - - - + + + + + @@ -49,7 +47,7 @@ form graph - {'search_default_year':1, 'group_by_no_leaf':1,'group_by':['product_id']} + {'group_by_no_leaf':1,'group_by':[]} 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 @@ - + @@ -38,12 +38,14 @@ - - - - - - + + + + + + + + @@ -54,7 +56,7 @@ project.task kanban,tree,form,calendar,gantt,graph { - 'search_default_project_id': [active_id], + 'search_default_project_id': [active_id], 'default_project_id': active_id, 'active_test': False, } @@ -98,7 +100,7 @@
- @@ -108,8 +110,8 @@
- @@ -204,9 +206,9 @@ - - - + + + @@ -383,7 +385,7 @@ options="{'fold_field': 'fold'}"/> -
+

@@ -558,7 +560,7 @@ - + @@ -602,7 +604,6 @@ - @@ -680,7 +681,7 @@ - + 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 @@ project.task.history.cumulative - + + + @@ -32,6 +34,15 @@ + + + + + + + + + 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 @@ - - - - + + Task Pipe + report.project.task.user + + {'group_by': ['project_id'], 'col_group_by': ['stage_id'], 'measures': ['nbr']} + + + Workload + report.project.task.user + + {'group_by': ['project_id'], 'measures': ['total_hours','hours_planned','remaining_hours']} + By Responsible report.project.task.user - [] {'group_by': ['project_id', 'user_id']} By Reviewer report.project.task.user - [] {'group_by': ['project_id', 'reviewer_id']} @@ -50,7 +56,7 @@ - + @@ -60,12 +66,12 @@ - - - + + + - - + + 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 @@ Issues project.issue form - kanban,tree,calendar + kanban,tree,calendar,form,graph @@ -50,6 +50,13 @@ + + + graph + + + + 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'}"/> -
+