diff options
| author | Christophe Matthieu <chm@openerp.com> | 2013-05-27 11:30:36 +0200 |
|---|---|---|
| committer | Christophe Matthieu <chm@openerp.com> | 2013-05-27 11:30:36 +0200 |
| commit | 4e7b20dfb6eb2af87f6b664c514aa0fa17a78d67 (patch) | |
| tree | 2640dea4cdd7d0638acab20ccf30d5bab4076f99 /addons | |
| parent | 15c9537eb1b89ce0e994b990ff8e65ac0237a804 (diff) | |
[IMP] salesteams: duration only by month
bzr revid: chm@openerp.com-20130527093036-bn4kjnre9vhxf76k
Diffstat (limited to 'addons')
| -rw-r--r-- | addons/crm/crm.py | 68 | ||||
| -rw-r--r-- | addons/crm/crm_case_section_view.xml | 8 | ||||
| -rw-r--r-- | addons/sale_crm/sale_crm.py | 70 | ||||
| -rw-r--r-- | addons/sale_crm/sale_crm_view.xml | 18 |
4 files changed, 50 insertions, 114 deletions
diff --git a/addons/crm/crm.py b/addons/crm/crm.py index 92e6584fbd5..5866167ee8b 100644 --- a/addons/crm/crm.py +++ b/addons/crm/crm.py @@ -23,7 +23,7 @@ from openerp import tools from openerp.osv import fields from openerp.osv import osv from openerp.tools.translate import _ -from datetime import date +from datetime import date, datetime from dateutil.relativedelta import relativedelta MAX_LEVEL = 15 @@ -43,20 +43,6 @@ AVAILABLE_PRIORITIES = [ ('5', 'Lowest'), ] -DURATION_TXT = { - "monthly": _("month"), - "quarterly": _("quarter"), - "semesterly": _("semester"), - "annually": _("year") -} - -MONTHS = { - "monthly": 1, - "quarterly": 3, - "semesterly": 6, - "annually": 12 -} - class crm_case_channel(osv.osv): _name = "crm.case.channel" _description = "Channels" @@ -123,45 +109,30 @@ class crm_case_section(osv.osv): def get_full_name(self, cr, uid, ids, field_name, arg, context=None): return dict(self.name_get(cr, uid, ids, context=context)) - def _get_target_duration_txt(self, cr, uid, ids, field_name, arg, context=None): - res = dict.fromkeys(ids, "") - for section in self.browse(cr, uid, ids, context=context): - res[section.id] = DURATION_TXT[section.target_duration] - return res - def _get_open_lead_per_duration(self, cr, uid, ids, field_name, arg, context=None): res = dict.fromkeys(ids, []) - lead_obj = self.pool.get('crm.lead') - first_day = date.today().replace(day=1) - + obj = self.pool.get('crm.lead') + today = date.today().replace(day=1) + begin = (today + relativedelta(months=-5)).strftime(tools.DEFAULT_SERVER_DATE_FORMAT) for section in self.browse(cr, uid, ids, context=context): - dates = [first_day + relativedelta(months=-(MONTHS[section.target_duration]*(key+1)-1)) for key in range(0, 5)] - nb_leads = [] - for when in range(0, 5): - domain = [("section_id", "=", section.id), '|', ('type', '=', 'lead'), ('date_open', '!=', None), ('create_date', '>=', dates[when].strftime(tools.DEFAULT_SERVER_DATE_FORMAT))] - if when: - domain += [('create_date', '<', dates[when-1].strftime(tools.DEFAULT_SERVER_DATE_FORMAT))] - nb_leads.append(lead_obj.search(cr, uid, domain, context=context, count=True)) - nb_leads.reverse() - res[section.id] = nb_leads + domain = [("section_id", "=", section.id), '|', ('type', '=', 'lead'), ('date_open', '!=', None), ('create_date', '>=', begin)] + group_obj = obj.read_group(cr, uid, domain, ["create_date"], "create_date", context=context) + group_list = [group['create_date_count'] for group in group_obj] + nb_month = group_obj and relativedelta(today, datetime.strptime(group_obj[-1]['__domain'][0][2], '%Y-%m-%d')).months or 0 + res[section.id] = [0]*(5 - len(group_list) - nb_month) + group_list + [0]*nb_month return res def _get_won_opportunity_per_duration(self, cr, uid, ids, field_name, arg, context=None): res = dict.fromkeys(ids, []) obj = self.pool.get('crm.lead') - first_day = date.today().replace(day=1) - + today = date.today().replace(day=1) + begin = (today + relativedelta(months=-5)).strftime(tools.DEFAULT_SERVER_DATE_FORMAT) for section in self.browse(cr, uid, ids, context=context): - dates = [first_day + relativedelta(months=-(MONTHS[section.target_duration]*(key+1)-1)) for key in range(0, 5)] - rates = [] - for when in range(0, 5): - domain = [("section_id", "=", section.id), ('state', '=', 'done'), ('type', '=', 'opportunity'), ('date_closed', '>=', dates[when].strftime(tools.DEFAULT_SERVER_DATE_FORMAT))] - if when: - domain += [('date_closed', '<', dates[when-1].strftime(tools.DEFAULT_SERVER_DATE_FORMAT))] - group_obj = obj.read_group(cr, uid, domain, ['planned_revenue', 'section_id'], "section_id", context=context) - rates.append(group_obj and group_obj[0]['planned_revenue'] or 0) - rates.reverse() - res[section.id] = rates + domain = [("section_id", "=", section.id), '|', ('type', '=', 'opportunity'), ('date_open', '!=', None), ('create_date', '>=', begin)] + group_obj = obj.read_group(cr, uid, domain, ['planned_revenue', "create_date"], "create_date", context=context) + group_list = [group['planned_revenue'] for group in group_obj] + nb_month = group_obj and relativedelta(today, datetime.strptime(group_obj[-1]['__domain'][0][2], '%Y-%m-%d')).months or 0 + res[section.id] = [0]*(5 - len(group_list) - nb_month) + group_list + [0]*nb_month return res _columns = { @@ -187,12 +158,6 @@ class crm_case_section(osv.osv): 'use_leads': fields.boolean('Leads', help="The first contact you get with a potential customer is a lead you qualify before converting it into a real business opportunity. Check this box to manage leads in this sales team."), - 'target_duration': fields.selection([("monthly", "Monthly"), ("quarterly", "Quarterly"), ("semesterly", "Semesterly"), ("annually", "Annually")], - string='Report Duration', required=True), - 'target_duration_txt': fields.function(_get_target_duration_txt, - string='Duration', - type="string", readonly=True), - 'open_lead_per_duration': fields.function(_get_open_lead_per_duration, string='Open Leads per duration', type="string", readonly=True), 'won_opportunity_per_duration': fields.function(_get_won_opportunity_per_duration, string='Revenue of opporunities whon per duration', type="string", readonly=True) } @@ -205,7 +170,6 @@ class crm_case_section(osv.osv): 'active': 1, 'stage_ids': _get_stage_common, 'use_leads': True, - 'target_duration': "monthly", } _sql_constraints = [ diff --git a/addons/crm/crm_case_section_view.xml b/addons/crm/crm_case_section_view.xml index 05169b97541..7f33d7c2b5c 100644 --- a/addons/crm/crm_case_section_view.xml +++ b/addons/crm/crm_case_section_view.xml @@ -78,7 +78,6 @@ <field name="note"/> <field name="alias_id"/> <field name="color"/> - <field name="target_duration_txt"/> <field name="open_lead_per_duration"/> <field name="won_opportunity_per_duration"/> <templates> @@ -100,10 +99,10 @@ <div class="oe_items_list"> <div class="oe_salesteams_leads" t-if="record.use_leads.raw_value"> <a name="%(crm_case_form_view_salesteams_lead)d" type="action">Leads</a> - <a name="%(action_report_crm_lead)d" type="action" class="oe_sparkline_bar_link"><field name="open_lead_per_duration" widget="sparkline_bar">Number of opening leads per duration.<br/>(last one is <t t-esc="record.target_duration_txt.value"/>).<br/>Click to see a detailed analysis of leads.</field></a> + <a name="%(action_report_crm_lead)d" type="action" class="oe_sparkline_bar_link"><field name="open_lead_per_duration" widget="sparkline_bar">Number of opening leads per month.<br/>Click to see a detailed analysis of leads.</field></a> </div><div class="oe_salesteams_opportunities"> <a name="%(crm_case_form_view_salesteams_opportunity)d" type="action">Opportunities</a> - <a name="%(action_report_crm_opportunity)d" type="action"><field name="won_opportunity_per_duration" widget="sparkline_bar">Revenue of won opportunities per duration.<br/>(last one is <t t-esc="record.target_duration_txt.value"/>).<br/>Click to see a detailed analysis of opportunities.</field></a> + <a name="%(action_report_crm_opportunity)d" type="action"><field name="won_opportunity_per_duration" widget="sparkline_bar">Revenue of won opportunities per month.<br/>Click to see a detailed analysis of opportunities.</field></a> </div> </div> </div> @@ -190,9 +189,6 @@ <field name="user_id"/> <field name="change_responsible"/> </group> - <group colspan="4" col="2"> - <field name="target_duration" widget="radio"/> - </group> <group colspan="4" attrs="{'invisible': [('use_leads', '=', False)]}"> </group> diff --git a/addons/sale_crm/sale_crm.py b/addons/sale_crm/sale_crm.py index 5b189d01db0..b753438ee60 100644 --- a/addons/sale_crm/sale_crm.py +++ b/addons/sale_crm/sale_crm.py @@ -19,17 +19,11 @@ # ############################################################################## -from datetime import date +from datetime import date, datetime from openerp import tools from dateutil.relativedelta import relativedelta from openerp.osv import osv, fields -MONTHS = { - "monthly": 1, - "semesterly": 3, - "semiannually": 6, - "annually": 12 -} class sale_order(osv.osv): _inherit = 'sale.order' @@ -57,60 +51,40 @@ class crm_case_section(osv.osv): def _get_created_quotation_per_duration(self, cr, uid, ids, field_name, arg, context=None): res = dict.fromkeys(ids, []) obj = self.pool.get('sale.order') - first_day = date.today().replace(day=1) - + today = date.today().replace(day=1) + begin = (today + relativedelta(months=-5)).strftime(tools.DEFAULT_SERVER_DATE_FORMAT) for section in self.browse(cr, uid, ids, context=context): - dates = [first_day + relativedelta(months=-(MONTHS[section.target_duration]*(key+1)-1)) for key in range(0, 5)] - rates = [] - for when in range(0, 5): - domain = [("section_id", "=", section.id), ('state', 'in', ['draft', 'sent']), ('date_order', '>=', dates[when].strftime(tools.DEFAULT_SERVER_DATE_FORMAT))] - if when: - domain += [('date_order', '<', dates[when-1].strftime(tools.DEFAULT_SERVER_DATE_FORMAT))] - # rate = 0 - # order_ids = obj.search(cr, uid, domain, context=context) - # for order in obj.browse(cr, uid, order_ids, context=context): - # rate += order.amount_total - # rates.append(rate) - group_obj = obj.read_group(cr, uid, domain, ['amount_total', 'section_id'], "section_id", context=context) - rates.append(group_obj and group_obj[0]['amount_total'] or 0) - rates.reverse() - res[section.id] = rates + domain = [("section_id", "=", section.id), ('state', 'in', ['draft', 'sent']), ('date_order', '>=', begin)] + group_obj = obj.read_group(cr, uid, domain, ['amount_total', "date_order"], "date_order", context=context) + group_list = [group['amount_total'] for group in group_obj] + nb_month = group_obj and relativedelta(today, datetime.strptime(group_obj[-1]['__domain'][0][2], '%Y-%m-%d')).months or 0 + res[section.id] = [0]*(5 - len(group_list) - nb_month) + group_list + [0]*nb_month return res def _get_validate_saleorder_per_duration(self, cr, uid, ids, field_name, arg, context=None): res = dict.fromkeys(ids, []) obj = self.pool.get('sale.order') - first_day = date.today().replace(day=1) - + today = date.today().replace(day=1) + begin = (today + relativedelta(months=-5)).strftime(tools.DEFAULT_SERVER_DATE_FORMAT) for section in self.browse(cr, uid, ids, context=context): - dates = [first_day + relativedelta(months=-(MONTHS[section.target_duration]*(key+1)-1)) for key in range(0, 5)] - rates = [] - for when in range(0, 5): - domain = [("section_id", "=", section.id), ('state', 'not in', ['draft', 'sent']), ('date_confirm', '>=', dates[when].strftime(tools.DEFAULT_SERVER_DATE_FORMAT))] - if when: - domain += [('date_confirm', '<', dates[when-1].strftime(tools.DEFAULT_SERVER_DATE_FORMAT))] - group_obj = obj.read_group(cr, uid, domain, ['amount_total', 'section_id'], "section_id", context=context) - rates.append(group_obj and group_obj[0]['amount_total'] or 0) - rates.reverse() - res[section.id] = rates + domain = [("section_id", "=", section.id), ('state', 'not in', ['draft', 'sent']), ('date_confirm', '>=', begin)] + group_obj = obj.read_group(cr, uid, domain, ['amount_total', "date_confirm"], "date_confirm", context=context) + group_list = [group['amount_total'] for group in group_obj] + nb_month = group_obj and relativedelta(today, datetime.strptime(group_obj[-1]['__domain'][0][2], '%Y-%m-%d')).months or 0 + res[section.id] = [0]*(5 - len(group_list) - nb_month) + group_list + [0]*nb_month return res def _get_sent_invoice_per_duration(self, cr, uid, ids, field_name, arg, context=None): res = dict.fromkeys(ids, []) obj = self.pool.get('account.invoice.report') - first_day = date.today().replace(day=1) - + today = date.today().replace(day=1) + begin = (today + relativedelta(months=-5)).strftime(tools.DEFAULT_SERVER_DATE_FORMAT) for section in self.browse(cr, uid, ids, context=context): - dates = [first_day + relativedelta(months=-(MONTHS[section.target_duration]*(key+1)-1)) for key in range(0, 5)] - rates = [] - for when in range(0, 5): - domain = [("section_id", "=", section.id), ('state', 'not in', ['draft', 'cancel']), ('date', '>=', dates[when].strftime(tools.DEFAULT_SERVER_DATE_FORMAT))] - if when: - domain += [('date', '<', dates[when-1].strftime(tools.DEFAULT_SERVER_DATE_FORMAT))] - group_obj = obj.read_group(cr, uid, domain, ['price_total', 'section_id'], "section_id", context=context) - rates.append(group_obj and group_obj[0]['price_total'] or 0) - rates.reverse() - res[section.id] = rates + domain = [("section_id", "=", section.id), ('state', 'not in', ['draft', 'cancel']), ('date', '>=', begin)] + group_obj = obj.read_group(cr, uid, domain, ['price_total', "date"], "date", context=context) + group_list = [group['price_total'] for group in group_obj] + nb_month = group_obj and relativedelta(today, datetime.strptime(group_obj[-1]['__domain'][0][2], '%Y-%m-%d')).months or 0 + res[section.id] = [0]*(5 - len(group_list) - nb_month) + group_list + [0]*nb_month return res _columns = { diff --git a/addons/sale_crm/sale_crm_view.xml b/addons/sale_crm/sale_crm_view.xml index 6b4d5f16c0e..32ddad3bd8f 100644 --- a/addons/sale_crm/sale_crm_view.xml +++ b/addons/sale_crm/sale_crm_view.xml @@ -217,9 +217,11 @@ <field name="inherit_id" ref="crm.crm_case_section_view_form"/> <field name="arch" type="xml"> <data> - <field name="target_duration" position="before"> - <field name="target_invoice"/> - </field> + <xpath expr="//group" position="inside"> + <group> + <field name="target_invoice"/> + </group> + </xpath> </data> </field> </record> @@ -240,19 +242,19 @@ </xpath> <xpath expr="//div[@class='oe_salesteams_leads']" position="after"><div class="oe_salesteams_orders"> <a name="%(action_orders_salesteams)d" type="action">Sales Orders</a> - <a name="%(sale.action_order_report_all)d" type="action" class="oe_sparkline_bar_link"><field name="validate_saleorder_per_duration" widget="sparkline_bar">Revenue of confirmed sales orders per <t t-esc="record.target_duration_txt.value"/>).<br/>Click the acces to Sales Analysis</field></a> + <a name="%(sale.action_order_report_all)d" type="action" class="oe_sparkline_bar_link"><field name="validate_saleorder_per_duration" widget="sparkline_bar">Revenue of confirmed sales orders per month.<br/>Click the acces to Sales Analysis</field></a> </div></xpath> <xpath expr="//div[@class='oe_salesteams_opportunities']" position="after"><div class="oe_salesteams_invoices"> <a name="%(action_invoice_salesteams)d" type="action" groups="account.group_account_invoice">Invoices</a> - <a name="%(account.action_account_invoice_report_all)d" type="action" class="oe_sparkline_bar_link"><field name="sent_invoice_per_duration" widget="sparkline_bar">Revenue of sent invoices per <t t-esc="record.target_duration_txt.value"/>.<br/>Click to see a detailed analysis of invoices.</field></a> + <a name="%(account.action_account_invoice_report_all)d" type="action" class="oe_sparkline_bar_link"><field name="sent_invoice_per_duration" widget="sparkline_bar">Revenue of sent invoices per month.<br/>Click to see a detailed analysis of invoices.</field></a> </div><div class="oe_salesteams_quotations"> <a name="%(action_quotations_salesteams)d" type="action" class="oe_sparkline_bar_link">Quotations</a> - <a name="%(sale.action_order_report_all)d" type="action" class="oe_sparkline_bar_link"><field name="created_quotation_per_duration" widget="sparkline_bar">Revenue of created quotation per <t t-esc="record.target_duration_txt.value"/>.<br/>Click to see a detailed analysis of sales.</field></a> + <a name="%(sale.action_order_report_all)d" type="action" class="oe_sparkline_bar_link"><field name="created_quotation_per_duration" widget="sparkline_bar">Revenue of created quotation per month.<br/>Click to see a detailed analysis of sales.</field></a> </div></xpath> <xpath expr="//div[@class='oe_items_list']" position="after"> <div class="oe_center" t-if="record.target_invoice.raw_value"> - <field name="sent_invoice_per_duration" widget="gage" style="width:160px; height: 120px;" options="{'max_field': 'target_invoice', 'label_field': 'target_duration_txt'}">Invoiced</field> - <field name="forecast" widget="gage" style="width:160px; height: 120px;" options="{'max_field': 'target_invoice', 'label_field': 'target_duration_txt', 'action_change': 'action_forecast'}">Forecast</field> + <field name="sent_invoice_per_duration" widget="gage" style="width:160px; height: 120px;" options="{'max_field': 'target_invoice'}">Invoiced</field> + <field name="forecast" widget="gage" style="width:160px; height: 120px;" options="{'max_field': 'target_invoice', 'action_change': 'action_forecast'}">Forecast</field> </div> <div class="oe_center" style="color:#bbbbbb;" t-if="!record.target_invoice.raw_value"> <br/>Define an invoicing target in the sales team settings to see the period's achievement and forecast at a glance. |
