[IMP] Crm: Add tracking mixin to manage utm campaign and add this mixin to mass_mailing, crm_lead and sale_order

This commit is contained in:
Jeremy Kersten 2014-07-08 17:33:00 +02:00
parent 9ccdbcaca3
commit faba7cd5aa
28 changed files with 287 additions and 170 deletions

View File

@ -24,6 +24,7 @@ import crm_segmentation
import crm_lead
import sales_team
import calendar_event
import ir_http
import crm_phonecall
import report
import wizard

View File

@ -19,13 +19,8 @@
#
##############################################################################
import calendar
from datetime import date, datetime
from dateutil import relativedelta
from openerp import tools
from openerp.osv import fields
from openerp.osv import osv
from openerp.osv import osv, fields
from openerp.http import request
AVAILABLE_PRIORITIES = [
('0', 'Very Low'),
@ -35,8 +30,10 @@ AVAILABLE_PRIORITIES = [
('4', 'Very High'),
]
class crm_case_channel(osv.osv):
_name = "crm.case.channel"
class crm_tracking_medium(osv.Model):
# OLD crm.case.channel
_name = "crm.tracking.medium"
_description = "Channels"
_order = 'name'
_columns = {
@ -47,6 +44,67 @@ class crm_case_channel(osv.osv):
'active': lambda *a: 1,
}
class crm_tracking_campaign(osv.Model):
# OLD crm.case.resource.type
_name = "crm.tracking.campaign"
_description = "Campaign"
_rec_name = "name"
_columns = {
'name': fields.char('Campaign Name', required=True, translate=True),
'section_id': fields.many2one('crm.case.section', 'Sales Team'),
}
class crm_tracking_source(osv.Model):
_name = "crm.tracking.source"
_description = "Source"
_rec_name = "name"
_columns = {
'name': fields.char('Source Name', required=True, translate=True),
}
class crm_tracking_mixin(osv.AbstractModel):
"""Mixin class for objects which can be tracked by marketing. """
_name = 'crm.tracking.mixin'
_columns = {
'campaign_id': fields.many2one('crm.tracking.campaign', 'Campaign', # old domain ="['|',('section_id','=',section_id),('section_id','=',False)]"
help="This is a name that helps you keep track of your different campaign efforts Example: Fall_Drive, Christmas_Special"),
'source_id': fields.many2one('crm.tracking.source', 'Source', help="This is the source of the link Example: Search Engine, another domain, or name of email list"),
'medium_id': fields.many2one('crm.tracking.medium', 'Channel', help="This is the method of delivery. EX: Postcard, Email, or Banner Ad"),
}
def tracking_fields(self):
return [('utm_campaign', 'campaign_id'), ('utm_source', 'source_id'), ('utm_medium', 'medium_id')]
def tracking_get_values(self, cr, uid, vals, context=None):
for key, field in self.tracking_fields():
column = self._all_columns[field].column
value = vals.get(field) or (request and request.session.get(key)) # params.get sould be always in session by the dispatch from ir_http
if column._type in ['many2one'] and isinstance(value, basestring): # if we receive a string for a many2one, we search / create the id
if value:
Model = self.pool[column._obj]
rel_id = Model.name_search(cr, uid, value, context=context)
if not rel_id:
rel_id = Model.create(cr, uid, {'name': value}, context=context)
vals[field] = rel_id
# Here the code for other cases that many2one
else:
vals[field] = value
return vals
def _get_default_track(self, cr, uid, field, context=None):
return self.tracking_get_values(cr, uid, {}, context=context).get(field)
_defaults = {
'source_id': lambda self, cr, uid, ctx: self._get_default_track(cr, uid, 'source_id', ctx),
'campaign_id': lambda self, cr, uid, ctx: self._get_default_track(cr, uid, 'campaign_id', ctx),
'medium_id': lambda self, cr, uid, ctx: self._get_default_track(cr, uid, 'medium_id', ctx),
}
class crm_case_stage(osv.osv):
""" Model for case stages. This models the main stages of a document
management flow. Main CRM objects (leads, opportunities, project
@ -106,16 +164,6 @@ class crm_case_categ(osv.osv):
'object_id' : _find_object_id
}
class crm_case_resource_type(osv.osv):
""" Resource Type of case """
_name = "crm.case.resource.type"
_description = "Campaign"
_rec_name = "name"
_columns = {
'name': fields.char('Campaign Name', required=True, translate=True),
'section_id': fields.many2one('crm.case.section', 'Sales Team'),
}
class crm_payment_mode(osv.osv):
""" Payment Mode for Fund """
_name = "crm.payment.mode"

View File

@ -13,18 +13,35 @@
<field name="state">open</field>
</record>
<record model="crm.case.channel" id="crm_case_channel_website">
<!-- Crm Source -->
<record model="crm.tracking.source" id="crm_source_search_engine">
<field name="name">Search engine</field>
</record>
<record model="crm.tracking.source" id="crm_source_mailing">
<field name="name">Mailing Partner</field>
</record>
<record model="crm.tracking.source" id="crm_source_newsletter">
<field name="name">Newsletter</field>
</record>
<!-- Crm Medium -->
<record model="crm.tracking.medium" id="crm_medium_website">
<field name="name">Website</field>
</record>
<record model="crm.case.channel" id="crm_case_channel_phone">
<record model="crm.tracking.medium" id="crm_medium_phone">
<field name="name">Phone</field>
</record>
<record model="crm.case.channel" id="crm_case_channel_direct">
<record model="crm.tracking.medium" id="crm_medium_direct">
<field name="name">Direct</field>
</record>
<record model="crm.case.channel" id="crm_case_channel_email">
<record model="crm.tracking.medium" id="crm_medium_email">
<field name="name">Email</field>
</record>
<record model="crm.tracking.medium" id="crm_medium_banner">
<field name="name">Banner Ad</field>
</record>
<record model="crm.case.section" id="sales_team.section_sales_department">
<field name="use_leads">True</field>

View File

@ -32,13 +32,14 @@ from openerp.tools.translate import _
CRM_LEAD_FIELDS_TO_MERGE = ['name',
'partner_id',
'channel_id',
'campaign_id',
'company_id',
'country_id',
'section_id',
'state_id',
'stage_id',
'type_id',
'medium_id',
'source_id',
'user_id',
'title',
'city',
@ -67,7 +68,7 @@ class crm_lead(format_address, osv.osv):
_name = "crm.lead"
_description = "Lead/Opportunity"
_order = "priority,date_action,id desc"
_inherit = ['mail.thread', 'ir.needaction_mixin']
_inherit = ['mail.thread', 'ir.needaction_mixin', 'crm.tracking.mixin']
_track = {
'stage_id': {
@ -214,9 +215,6 @@ class crm_lead(format_address, osv.osv):
'write_date': fields.datetime('Update Date', readonly=True),
'categ_ids': fields.many2many('crm.case.categ', 'crm_lead_category_rel', 'lead_id', 'category_id', 'Tags', \
domain="['|', ('section_id', '=', section_id), ('section_id', '=', False), ('object_id.model', '=', 'crm.lead')]", help="Classify and analyze your lead/opportunity categories like: Training, Service"),
'type_id': fields.many2one('crm.case.resource.type', 'Campaign', \
domain="['|',('section_id','=',section_id),('section_id','=',False)]", help="From which campaign (seminar, marketing campaign, mass mailing, ...) did this contact come from?"),
'channel_id': fields.many2one('crm.case.channel', 'Channel', help="Communication channel (mail, direct, phone, ...)"),
'contact_name': fields.char('Contact Name', size=64),
'partner_name': fields.char("Customer Name", size=64,help='The name of the future partner company that will be created while converting the lead into opportunity', select=1),
'opt_out': fields.boolean('Opt-Out', oldname='optout',

View File

@ -68,39 +68,6 @@
(4, ref('stage_lead7'))]"/>
</record>
<!-- Crm campain -->
<record model="crm.case.resource.type" id="type_lead1">
<field name="name">Telesales</field>
<field name="section_id" ref="sales_team.section_sales_department"/>
</record>
<record model="crm.case.resource.type" id="type_lead2">
<field name="name">Email Campaign - Services</field>
<field name="section_id" ref="sales_team.section_sales_department"/>
</record>
<record model="crm.case.resource.type" id="type_lead3">
<field name="name">Email Campaign - Products</field>
<field name="section_id" ref="sales_team.section_sales_department"/>
</record>
<record model="crm.case.resource.type" id="type_lead4">
<field name="name">Twitter Ads</field>
<field name="section_id" ref="sales_team.section_sales_department"/>
</record>
<record model="crm.case.resource.type" id="type_lead5">
<field name="name">Google Adwords</field>
<field name="section_id" ref="sales_team.section_sales_department"/>
</record>
<record model="crm.case.resource.type" id="type_lead6">
<field name="name">Banner Ads</field>
<field name="section_id" ref="sales_team.section_sales_department"/>
</record>
<record model="crm.case.resource.type" id="type_lead7">
<field name="name">Television</field>
<field name="section_id" ref="sales_team.section_sales_department"/>
</record>
<record model="crm.case.resource.type" id="type_lead8">
<field name="name">Newsletter</field>
<field name="section_id" ref="sales_team.section_sales_department"/>
</record>
<!-- crm categories -->
<record model="crm.case.categ" id="categ_oppor1">

View File

@ -16,9 +16,7 @@
<field name="city">Paris</field>
<field name="zip">93190</field>
<field name="phone">+33 1 25 54 45 69</field>
<field name="type_id" ref="type_lead2"/>
<field name="categ_ids" eval="[(6, 0, [categ_oppor6])]"/>
<field name="channel_id" ref="crm_case_channel_email"/>
<field name="priority">1</field>
<field name="section_id" ref="sales_team.section_sales_department"/>
<field name="user_id" ref="base.user_root"/>
@ -51,9 +49,7 @@ Could you please send me the details ?</field>
<field name="function">Purchase Manager</field>
<field name="country_id" ref="base.fr"/>
<field name="city">Bordeaux</field>
<field name="type_id" ref="type_lead7"/>
<field name="categ_ids" eval="[(6, 0, [categ_oppor2])]"/>
<field name="channel_id" ref="crm_case_channel_website"/>
<field name="priority">1</field>
<field name="section_id" ref="sales_team.section_sales_department"/>
<field name="user_id" ref="base.user_root"/>
@ -80,9 +76,7 @@ Could you please send me the details ?</field>
<field name="partner_id" ref=""/>
<field name="country_id" ref="base.us"/>
<field name="city">New-York</field>
<field name="type_id" ref="type_lead5"/>
<field name="categ_ids" eval="[(6, 0, [categ_oppor4])]"/>
<field name="channel_id" ref=""/>
<field name="priority">2</field>
<field name="section_id" ref="sales_team.crm_case_section_1"/>
<field name="user_id" ref="base.user_demo"/>
@ -101,9 +95,7 @@ Could you please send me the details ?</field>
<field name="partner_id" ref=""/>
<field name="country_id" ref="base.uk"/>
<field name="city">Drury</field>
<field name="type_id" ref="type_lead8"/>
<field name="categ_ids" eval="[(6, 0, [categ_oppor5])]"/>
<field name="channel_id" ref=""/>
<field name="priority">2</field>
<field name="section_id" ref="sales_team.crm_case_section_2"/>
<field name="user_id" ref="base.user_demo"/>
@ -126,9 +118,7 @@ Could you please send me the details ?</field>
<field name="city">Franklinville</field>
<field name="zip">NJ 08322</field>
<field name="phone">+1 813 494 5005</field>
<field name="type_id" ref="type_lead3"/>
<field name="categ_ids" eval="[(6, 0, [categ_oppor1])]"/>
<field name="channel_id" ref="crm_case_channel_website"/>
<field name="priority">2</field>
<field name="section_id" ref="sales_team.crm_case_section_1"/>
<field name="user_id" ref=""/>
@ -153,9 +143,7 @@ Contact: +1 813 494 5005</field>
<field name="function">Consultant</field>
<field name="country_id" ref="base.it"/>
<field name="city">Roma</field>
<field name="type_id" ref="type_lead3"/>
<field name="categ_ids" eval="[(6, 0, [categ_oppor3,categ_oppor4])]"/>
<field name="channel_id" ref=""/>
<field name="priority">2</field>
<field name="section_id" ref="sales_team.crm_case_section_2"/>
<field name="user_id" ref=""/>
@ -171,9 +159,7 @@ Contact: +1 813 494 5005</field>
<field name="function">Journalist</field>
<field name="country_id" ref="base.ua"/>
<field name="city">Kiev</field>
<field name="type_id" ref="type_lead8"/>
<field name="categ_ids" eval="[(6, 0, [categ_oppor4])]"/>
<field name="channel_id" ref=""/>
<field name="priority">0</field>
<field name="section_id" ref="sales_team.crm_case_section_2"/>
<field name="user_id" ref="base.user_root"/>
@ -190,9 +176,7 @@ Contact: +1 813 494 5005</field>
<field name="function">Sales</field>
<field name="country_id" ref="base.uk"/>
<field name="city">Cambridge</field>
<field name="type_id" ref="type_lead5"/>
<field name="categ_ids" eval="[(6, 0, [categ_oppor6,categ_oppor8])]"/>
<field name="channel_id" ref=""/>
<field name="priority">1</field>
<field name="section_id" ref="sales_team.section_sales_department"/>
<field name="user_id" ref="base.user_root"/>
@ -209,9 +193,7 @@ Contact: +1 813 494 5005</field>
<field name="function">Sales</field>
<field name="country_id" ref="base.uk"/>
<field name="city">Oxford</field>
<field name="type_id" ref="type_lead3"/>
<field name="categ_ids" eval="[(6, 0, [categ_oppor7])]"/>
<field name="channel_id" ref="crm_case_channel_phone"/>
<field name="priority">2</field>
<field name="section_id" ref="sales_team.section_sales_department"/>
<field name="user_id" ref="base.user_demo"/>
@ -227,9 +209,7 @@ Contact: +1 813 494 5005</field>
<field name="function">Medical illustrator</field>
<field name="country_id" ref="base.es"/>
<field name="city">Sevilla</field>
<field name="type_id" ref="type_lead8"/>
<field name="categ_ids" eval="[(6, 0, [categ_oppor1])]"/>
<field name="channel_id" ref="crm_case_channel_email"/>
<field name="priority">2</field>
<field name="section_id" ref="sales_team.crm_case_section_2"/>
<field name="user_id" ref="base.user_demo"/>
@ -250,9 +230,7 @@ Andrew</field>
<field name="partner_id" ref="base.res_partner_1"/>
<field name="function">Functional Consultant</field>
<field name="country_id" ref=""/>
<field name="type_id" ref="type_lead3"/>
<field name="categ_ids" eval="[(6, 0, [categ_oppor7])]"/>
<field name="channel_id" ref="crm_case_channel_direct"/>
<field name="priority">2</field>
<field name="section_id" ref="sales_team.crm_case_section_1"/>
<field name="user_id" ref=""/>
@ -268,9 +246,7 @@ Andrew</field>
<field name="partner_id" ref="base.res_partner_1"/>
<field name="country_id" ref="base.cn"/>
<field name="city">Shenzhen</field>
<field name="type_id" ref="type_lead3"/>
<field name="categ_ids" eval="[(6, 0, [categ_oppor1])]"/>
<field name="channel_id" ref="crm_case_channel_website"/>
<field name="priority">2</field>
<field name="section_id" ref="sales_team.section_sales_department"/>
<field name="user_id" ref=""/>
@ -303,9 +279,7 @@ Andrew</field>
<field name="street">1 rue Rockfeller</field>
<field name="country_id" ref="base.at"/>
<field name="city">Melbourne</field>
<field name="type_id" ref="type_lead3"/>
<field name="categ_ids" eval="[(6, 0, [categ_oppor1])]"/>
<field name="channel_id" ref="crm_case_channel_email"/>
<field name="priority">1</field>
<field eval="time.strftime('%Y-%m-25')" name="date_deadline"/>
<field eval="time.strftime('%Y-%m-12')" name="date_action"/>
@ -328,9 +302,7 @@ Andrew</field>
<field name="country_id" ref="base.be"/>
<field name="city">Wavre</field>
<field name="zip">1300</field>
<field name="type_id" ref="type_lead3"/>
<field name="categ_ids" eval="[(6, 0, [categ_oppor2])]"/>
<field name="channel_id" ref="crm_case_channel_website"/>
<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"/>
@ -350,7 +322,6 @@ Andrew</field>
<field name="city">Wavre</field>
<field name="email_from">virginie@agrolait.com</field>
<field name="partner_id" ref="base.res_partner_2"/>
<field name="type_id" ref="type_lead8"/>
<field name="categ_ids" eval="[(6, 0, [categ_oppor1])]"/>
<field name="priority">1</field>
<field eval="time.strftime('%Y-%m-12')" name="date_deadline"/>
@ -377,7 +348,6 @@ Andrew</field>
<field name="country_id" ref="base.uk"/>
<field name="city">Liverpool</field>
<field name="zip">L25 4RL</field>
<field name="type_id" ref="type_lead5"/>
<field name="categ_ids" eval="[(6, 0, [categ_oppor5])]"/>
<field name="priority">2</field>
<field eval="time.strftime('%Y-%m-28')" name="date_deadline"/>
@ -401,9 +371,7 @@ Andrew</field>
<field name="street">Rue des Palais 51, bte 33</field>
<field name="country_id" ref="base.be"/>
<field name="city">Brussels</field>
<field name="type_id" ref="type_lead3"/>
<field name="categ_ids" eval="[(6, 0, [categ_oppor3,categ_oppor4])]"/>
<field name="channel_id" ref="crm_case_channel_website"/>
<field name="priority">1</field>
<field eval="time.strftime('%Y-%m-8')" name="date_deadline"/>
<field eval="time.strftime('%Y-%m-3')" name="date_action"/>
@ -429,7 +397,6 @@ Andrew</field>
<field name="street">3661 Station Street</field>
<field name="country_id" ref="base.uk"/>
<field name="partner_id" ref="base.res_partner_4"/>
<field name="type_id" ref="type_lead8"/>
<field name="categ_ids" eval="[(6, 0, [categ_oppor4,categ_oppor6])]"/>
<field name="priority">1</field>
<field eval="time.strftime('%Y-%m-13')" name="date_deadline"/>
@ -456,7 +423,6 @@ Andrew</field>
<field name="country_id" ref="base.uk"/>
<field name="city">Liverpool</field>
<field name="zip">L25 4RL</field>
<field name="type_id" ref="type_lead3"/>
<field name="categ_ids" eval="[(6, 0, [categ_oppor1])]"/>
<field name="priority">1</field>
<field eval="time.strftime('%Y-%m-10')" name="date_deadline"/>
@ -476,7 +442,6 @@ Andrew</field>
<field name="partner_name">Epic Technologies</field>
<field name="email_from">john.b@tech.info</field>
<field name="partner_id" ref="base.res_partner_5"/>
<field name="type_id" ref="type_lead3"/>
<field name="categ_ids" eval="[(6, 0, [categ_oppor4,categ_oppor8])]"/>
<field name="priority">2</field>
<field name="section_id" ref="sales_team.crm_case_section_1"/>
@ -489,9 +454,7 @@ Andrew</field>
<field name="name">“Resource Planning” project develpment</field>
<field eval="350" name="planned_revenue"/>
<field name="partner_id" ref="base.res_partner_7"/>
<field name="type_id" ref="type_lead2"/>
<field name="categ_ids" eval="[(6, 0, [categ_oppor7])]"/>
<field name="channel_id" ref="crm_case_channel_phone"/>
<field name="priority">2</field>
<field name="section_id" ref="sales_team.crm_case_section_2"/>
<field name="user_id" ref="base.user_root"/>
@ -507,9 +470,7 @@ Andrew</field>
<field name="contact_name">Benjamin Flores</field>
<field name="partner_name">Nebula Business</field>
<field name="partner_id" ref="base.res_partner_17"/>
<field name="type_id" ref="type_lead7"/>
<field name="categ_ids" eval="[(6, 0, [categ_oppor3])]"/>
<field name="channel_id" ref="crm_case_channel_email"/>
<field name="priority">1</field>
<field name="section_id" ref="sales_team.crm_case_section_2"/>
<field name="user_id" ref="base.user_root"/>
@ -522,9 +483,7 @@ Andrew</field>
<field eval="2000" name="planned_revenue"/>
<field eval="80.0" name="probability"/>
<field name="partner_id" ref="base.res_partner_18"/>
<field name="type_id" ref="type_lead5"/>
<field name="categ_ids" eval="[(6, 0, [categ_oppor3])]"/>
<field name="channel_id" ref="crm_case_channel_direct"/>
<field name="priority">0</field>
<field name="section_id" ref="sales_team.section_sales_department"/>
<field name="user_id" ref="base.user_demo"/>
@ -540,9 +499,7 @@ Andrew</field>
<field name="email_from">info@mycompany.net</field>
<field name="country_id" ref="base.pe"/>
<field name="city">Lima</field>
<field name="type_id" ref="type_lead8"/>
<field name="categ_ids" eval="[(6, 0, [categ_oppor7])]"/>
<field name="channel_id" ref="crm_case_channel_website"/>
<field name="priority">0</field>
<field eval="time.strftime('%Y-%m-6')" name="date_deadline"/>
<field name="section_id" ref="sales_team.section_sales_department"/>
@ -564,7 +521,6 @@ Andrew</field>
<field name="country_id" ref="base.ar"/>
<field name="city">Buenos Aires</field>
<field name="zip">B7313</field>
<field name="type_id" ref="type_lead4"/>
<field name="categ_ids" eval="[(6, 0, [categ_oppor4])]"/>
<field name="priority">2</field>
<field name="title_action">Conf call with technical service</field>
@ -585,9 +541,7 @@ Andrew</field>
<field name="country_id" ref="base.be"/>
<field name="city">Wavre</field>
<field name="zip">1300</field>
<field name="type_id" ref="type_lead3"/>
<field name="categ_ids" eval="[(6, 0, [categ_oppor2])]"/>
<field name="channel_id" ref="crm_case_channel_website"/>
<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"/>

View File

@ -230,9 +230,9 @@
<field name="partner_id" invisible="1"/>
<field name="section_id" groups="base.group_multi_salesteams"/>
<field name="probability" invisible="1"/>
<field name="type_id" invisible="1"/>
<field name="campaign_id" invisible="1"/>
<field name="referred" invisible="1"/>
<field name="channel_id" invisible="1"/>
<field name="medium_id" invisible="1"/>
<field name="message_unread" invisible="1"/>
</tree>
</field>
@ -513,8 +513,9 @@
<field name="country_id"/>
<field name="date_action"/>
<field name="title_action"/>
<field name="channel_id" invisible="1"/>
<field name="type_id" invisible="1"/>
<field name="medium_id" invisible="1"/>
<field name="campaign_id" invisible="1"/>
<field name="source_id" invisible="1"/>
<field name="stage_id"/>
<field name="planned_revenue" sum="Expected Revenues"/>
<field name="probability" avg="Avg. of Probability"/>

View File

@ -26,10 +26,10 @@
<menuitem id="base.next_id_64" name="Sales"
parent="base.menu_reporting" sequence="1"/>
<!-- crm.case.channel -->
<record id="crm_case_channel_view_tree" model="ir.ui.view">
<field name="name">crm.case.channel.tree</field>
<field name="model">crm.case.channel</field>
<!-- crm.tracking.medium -->
<record id="crm_tracking_medium_view_tree" model="ir.ui.view">
<field name="name">crm.tracking.medium.tree</field>
<field name="model">crm.tracking.medium</field>
<field name="arch" type="xml">
<tree string="Channels">
<field name="name"/>
@ -37,9 +37,9 @@
</tree>
</field>
</record>
<record id="crm_case_channel_view_form" model="ir.ui.view">
<field name="name">crm.case.channel.form</field>
<field name="model">crm.case.channel</field>
<record id="crm_tracking_medium_view_form" model="ir.ui.view">
<field name="name">crm.tracking.medium.form</field>
<field name="model">crm.tracking.medium</field>
<field name="arch" type="xml">
<form string="Channel">
<group>
@ -49,26 +49,66 @@
</form>
</field>
</record>
<record id="crm_case_channel_action" model="ir.actions.act_window">
<record id="crm_tracking_medium_action" model="ir.actions.act_window">
<field name="name">Channels</field>
<field name="res_model">crm.case.channel</field>
<field name="res_model">crm.tracking.medium</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="help" type="html">
<p class="oe_view_nocontent_create">
Click to define a new channel.
</p><p>
Use channels to track the soure of your leads and opportunities. Channels
Use channels to track the type of source of your leads and opportunities. Channels
are mostly used in reporting to analyse sales performance
related to marketing efforts.
</p><p>
Some examples of channels: company website, phone call
campaign, reseller, etc.
campaign, reseller, banner, etc.
</p>
</field>
</record>
<menuitem action="crm_case_channel_action" id="menu_crm_case_channel" parent="base.menu_crm_config_lead" sequence="4" groups="base.group_no_one"/>
<!-- crm.tracking.source -->
<record id="crm_tracking_source_view_tree" model="ir.ui.view">
<field name="name">crm.tracking.source.tree</field>
<field name="model">crm.tracking.source</field>
<field name="arch" type="xml">
<tree string="Channels">
<field name="name"/>
</tree>
</field>
</record>
<record id="crm_tracking_source_view_form" model="ir.ui.view">
<field name="name">crm.tracking.source.form</field>
<field name="model">crm.tracking.source</field>
<field name="arch" type="xml">
<form string="Channel">
<group>
<field name="name"/>
</group>
</form>
</field>
</record>
<record id="crm_tracking_source_action" model="ir.actions.act_window">
<field name="name">Source</field>
<field name="res_model">crm.tracking.source</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="help" type="html">
<p class="oe_view_nocontent_create">
Click to define a new source.
</p><p>
Use channels to track the source of your leads and opportunities. Channels
are mostly used in reporting to analyse sales performance
related to marketing efforts.
</p><p>
Some examples of channels: partner's website, google.com,
email list name, etc.
</p>
</field>
</record>
<menuitem action="crm_tracking_source_action" id="menu_crm_tracking_source" parent="base.menu_crm_config_lead" sequence="4" groups="base.group_no_one"/>
<!-- CRM Stage Tree View -->
@ -155,9 +195,9 @@
<!-- Resource Type of case Tree View -->
<record model="ir.ui.view" id="crm_case_resource_type_tree">
<field name="name">crm.case.resource.type.tree</field>
<field name="model">crm.case.resource.type</field>
<record model="ir.ui.view" id="crm_tracking_campaign_tree">
<field name="name">crm.tracking.campaign.tree</field>
<field name="model">crm.tracking.campaign</field>
<field name="arch" type="xml">
<tree string="Campaign">
<field name="name"/>
@ -168,9 +208,9 @@
<!-- Resource Type of case Form View -->
<record model="ir.ui.view" id="crm_case_resource_type_form">
<field name="name">crm.case.resource.type.form</field>
<field name="model">crm.case.resource.type</field>
<record model="ir.ui.view" id="crm_tracking_campaign_form">
<field name="name">crm.tracking.campaign.form</field>
<field name="model">crm.tracking.campaign</field>
<field name="arch" type="xml">
<form string="Campaign">
<group>
@ -183,15 +223,15 @@
<!-- Resource Type of case Action -->
<record id="crm_case_resource_type_act" model="ir.actions.act_window">
<record id="crm_tracking_campaign_act" model="ir.actions.act_window">
<field name="name">Campaigns</field>
<field name="res_model">crm.case.resource.type</field>
<field name="res_model">crm.tracking.campaign</field>
<field name="view_type">form</field>
<field name="view_id" ref="crm_case_resource_type_tree"/>
<field name="view_id" ref="crm_tracking_campaign_tree"/>
</record>
<menuitem action="crm_case_resource_type_act"
id="menu_crm_case_resource_type_act" sequence="4"
<menuitem action="crm_tracking_campaign_act"
id="menu_crm_tracking_campaign_act" sequence="4"
groups="base.group_no_one"
parent="base.menu_crm_config_lead"/>

13
addons/crm/ir_http.py Normal file
View File

@ -0,0 +1,13 @@
# -*- coding: utf-8 -*-
from openerp.http import request
from openerp.osv import orm
class ir_http(orm.AbstractModel):
_inherit = 'ir.http'
def _dispatch(self):
for var, dummy in self.pool['crm.tracking.mixin'].tracking_fields():
if var in request.params and (var not in request.session or request.session[var] != request.params[var]):
request.session[var] = request.params[var]
return super(ir_http, self)._dispatch()

View File

@ -44,6 +44,7 @@ class crm_lead_report(osv.osv):
_auto = False
_description = "CRM Lead Analysis"
_rec_name = 'date_deadline'
_inherit = ["crm.tracking.mixin"]
_columns = {
'date_deadline': fields.date('Exp. Closing', readonly=True, help="Expected Closing"),
@ -58,10 +59,8 @@ 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),
'country_id':fields.many2one('res.country', 'Country', readonly=True),
'section_id':fields.many2one('crm.case.section', 'Sales Team', readonly=True),
'channel_id':fields.many2one('crm.case.channel', 'Channel', readonly=True),
'type_id':fields.many2one('crm.case.resource.type', 'Campaign', 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),
@ -101,8 +100,9 @@ class crm_lead_report(osv.osv):
c.company_id,
c.priority,
c.section_id,
c.channel_id,
c.type_id,
c.campaign_id,
c.source_id,
c.medium_id,
c.partner_id,
c.country_id,
c.planned_revenue,

View File

@ -74,13 +74,15 @@
<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="type_id"/>
<field name="channel_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="type_id" widget="selection"/>
<field name="channel_id" widget="selection"/>
<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/>

View File

@ -3,8 +3,10 @@ access_crm_segmentation_user,crm.segmentation user,model_crm_segmentation,base.g
access_crm_segmentation_line_user,crm.segmentation.line user,model_crm_segmentation_line,base.group_sale_salesman,1,0,0,0
access_crm_segmentation,crm.segmentation,model_crm_segmentation,base.group_sale_manager,1,1,1,1
access_crm_segmentation_line,crm.segmentation.line,model_crm_segmentation_line,base.group_sale_manager,1,1,1,1
access_crm_case_channel_user,crm.case.channel user,model_crm_case_channel,base.group_sale_salesman,1,0,0,0
access_crm_case_channel_manager,crm.case.channel manager,model_crm_case_channel,base.group_sale_manager,1,1,1,1
access_crm_tracking_medium_user,crm.tracking.medium user,model_crm_tracking_medium,base.group_sale_salesman,1,0,0,0
access_crm_tracking_medium_manager,crm.tracking.medium manager,model_crm_tracking_medium,base.group_sale_manager,1,1,1,1
access_crm_tracking_source_user,crm.tracking.source user,model_crm_tracking_source,base.group_sale_salesman,1,0,0,0
access_crm_tracking_source_manager,crm.tracking.source manager,model_crm_tracking_source,base.group_sale_manager,1,1,1,1
access_crm_case_categ,crm.case.categ,model_crm_case_categ,base.group_sale_salesman,1,1,1,0
access_crm_lead_manager,crm.lead.manager,model_crm_lead,base.group_sale_manager,1,1,1,1
access_crm_phonecall_manager,crm.phonecall.manager,model_crm_phonecall,base.group_sale_manager,1,1,1,1
@ -13,8 +15,8 @@ access_crm_lead,crm.lead,model_crm_lead,base.group_sale_salesman,1,1,1,0
access_crm_phonecall,crm.phonecall,model_crm_phonecall,base.group_sale_salesman,1,1,1,0
access_crm_case_stage,crm.case.stage,model_crm_case_stage,,1,0,0,0
access_crm_case_stage_manager,crm.case.stage,model_crm_case_stage,base.group_sale_manager,1,1,1,1
access_crm_case_resource_type_user,crm_case_resource_type user,model_crm_case_resource_type,base.group_sale_salesman,1,1,1,0
access_crm_case_resource_type_manager,crm_case_resource_type manager,model_crm_case_resource_type,base.group_sale_manager,1,1,1,1
access_crm_tracking_campaign_user,crm_tracking_campaign user,model_crm_tracking_campaign,base.group_sale_salesman,1,1,1,0
access_crm_tracking_campaign_manager,crm_tracking_campaign manager,model_crm_tracking_campaign,base.group_sale_manager,1,1,1,1
access_crm_phonecall_report_user,crm.phonecall.report.user,model_crm_phonecall_report,base.group_sale_salesman,1,0,0,0
access_crm_phonecall_report_manager,crm.phonecall.report,model_crm_phonecall_report,base.group_sale_manager,1,1,1,1
access_res_partner_manager,res.partner.crm.manager,base.model_res_partner,base.group_sale_manager,1,0,0,0
@ -29,4 +31,4 @@ access_res_partner_bank_type_crm_user,res.partner.bank.type.crm.user,base.model_
access_crm_lead_partner_manager,crm.lead.partner.manager,model_crm_lead,base.group_partner_manager,1,0,0,0
access_crm_phonecall_partner_manager,crm.phonecall.partner.manager,model_crm_phonecall,base.group_partner_manager,1,1,1,1
access_crm_payment_mode_user,crm.payment.mode,model_crm_payment_mode,base.group_sale_salesman,1,0,0,0
access_crm_payment_mode,crm.payment.mode,model_crm_payment_mode,base.group_sale_manager,1,1,1,1
access_crm_payment_mode,crm.payment.mode,model_crm_payment_mode,base.group_sale_manager,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
3 access_crm_segmentation_line_user crm.segmentation.line user model_crm_segmentation_line base.group_sale_salesman 1 0 0 0
4 access_crm_segmentation crm.segmentation model_crm_segmentation base.group_sale_manager 1 1 1 1
5 access_crm_segmentation_line crm.segmentation.line model_crm_segmentation_line base.group_sale_manager 1 1 1 1
6 access_crm_case_channel_user access_crm_tracking_medium_user crm.case.channel user crm.tracking.medium user model_crm_case_channel model_crm_tracking_medium base.group_sale_salesman 1 0 0 0
7 access_crm_case_channel_manager access_crm_tracking_medium_manager crm.case.channel manager crm.tracking.medium manager model_crm_case_channel model_crm_tracking_medium base.group_sale_manager 1 1 1 1
8 access_crm_tracking_source_user crm.tracking.source user model_crm_tracking_source base.group_sale_salesman 1 0 0 0
9 access_crm_tracking_source_manager crm.tracking.source manager model_crm_tracking_source base.group_sale_manager 1 1 1 1
10 access_crm_case_categ crm.case.categ model_crm_case_categ base.group_sale_salesman 1 1 1 0
11 access_crm_lead_manager crm.lead.manager model_crm_lead base.group_sale_manager 1 1 1 1
12 access_crm_phonecall_manager crm.phonecall.manager model_crm_phonecall base.group_sale_manager 1 1 1 1
15 access_crm_phonecall crm.phonecall model_crm_phonecall base.group_sale_salesman 1 1 1 0
16 access_crm_case_stage crm.case.stage model_crm_case_stage 1 0 0 0
17 access_crm_case_stage_manager crm.case.stage model_crm_case_stage base.group_sale_manager 1 1 1 1
18 access_crm_case_resource_type_user access_crm_tracking_campaign_user crm_case_resource_type user crm_tracking_campaign user model_crm_case_resource_type model_crm_tracking_campaign base.group_sale_salesman 1 1 1 0
19 access_crm_case_resource_type_manager access_crm_tracking_campaign_manager crm_case_resource_type manager crm_tracking_campaign manager model_crm_case_resource_type model_crm_tracking_campaign base.group_sale_manager 1 1 1 1
20 access_crm_phonecall_report_user crm.phonecall.report.user model_crm_phonecall_report base.group_sale_salesman 1 0 0 0
21 access_crm_phonecall_report_manager crm.phonecall.report model_crm_phonecall_report base.group_sale_manager 1 1 1 1
22 access_res_partner_manager res.partner.crm.manager base.model_res_partner base.group_sale_manager 1 0 0 0
31 access_crm_lead_partner_manager crm.lead.partner.manager model_crm_lead base.group_partner_manager 1 0 0 0
32 access_crm_phonecall_partner_manager crm.phonecall.partner.manager model_crm_phonecall base.group_partner_manager 1 1 1 1
33 access_crm_payment_mode_user crm.payment.mode model_crm_payment_mode base.group_sale_salesman 1 0 0 0
34 access_crm_payment_mode crm.payment.mode model_crm_payment_mode base.group_sale_manager 1 1 1 1

View File

@ -28,12 +28,12 @@
Case Category2
-->
<record model="crm.case.resource.type" id="type_claim1">
<record model="crm.tracking.campaign" id="claim_source1">
<field name="name">Corrective</field>
<field name="section_id" ref="sales_team.section_sales_department"/>
</record>
<record model="crm.case.resource.type" id="type_claim2">
<record model="crm.tracking.campaign" id="claim_source2">
<field name="name">Preventive</field>
<field name="section_id" ref="sales_team.section_sales_department"/>
</record>

View File

@ -56,7 +56,7 @@ class crm_helpdesk(osv.osv):
'date': fields.datetime('Date'),
'ref': fields.reference('Reference', selection=openerp.addons.base.res.res_request.referencable_models),
'ref2': fields.reference('Reference 2', selection=openerp.addons.base.res.res_request.referencable_models),
'channel_id': fields.many2one('crm.case.channel', 'Channel', help="Communication channel."),
'channel_id': fields.many2one('crm.tracking.medium', 'Channel', help="Communication channel."),
'planned_revenue': fields.float('Planned Revenue'),
'planned_cost': fields.float('Planned Costs'),
'priority': fields.selection([('0','Low'), ('1','Normal'), ('2','High')], 'Priority'),

View File

@ -56,7 +56,7 @@ class crm_helpdesk_report(osv.osv):
'date_deadline': fields.date('Deadline', select=True),
'priority': fields.selection([('5', 'Lowest'), ('4', 'Low'), \
('3', 'Normal'), ('2', 'High'), ('1', 'Highest')], 'Priority'),
'channel_id': fields.many2one('crm.case.channel', 'Channel'),
'channel_id': fields.many2one('crm.tracking.medium', 'Channel'),
'categ_id': fields.many2one('crm.case.categ', 'Category', \
domain="[('section_id','=',section_id),\
('object_id.model', '=', 'crm.helpdesk')]"),

View File

@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2014-Today OpenERP SA (<http://www.openerp.com>).
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
import mass_mailing

View File

@ -0,0 +1,18 @@
{
'name': 'Campaign in Mass Mailing',
'version': '1.0',
'summary': 'This module allow to specify a campaign, a source and a channel for a mass mailing campaign.',
'author': 'OpenERP SA',
'description': """
Mass Mailing with Crm Marketing
================================
Link module mass mailing with the marketing mixin from crm.
""",
'depends': ['crm', 'mass_mailing'],
'data': [
'mass_mailing.xml',
],
'installable': True,
'auto_install': True,
}

View File

@ -0,0 +1,6 @@
from openerp.osv import osv
class MassMailing(osv.Model):
_name = 'mail.mass_mailing'
_inherit = ['mail.mass_mailing', 'crm.tracking.mixin']

View File

@ -0,0 +1,23 @@
<?xml version="1.0"?>
<openerp>
<data>
<record model="ir.ui.view" id="view_tracking_mass_mailing_form">
<field name="name">mail.mass_mailing.inherit.form</field>
<field name="model">mail.mass_mailing</field>
<field name="inherit_id" ref="mass_mailing.view_mail_mass_mailing_form"/>
<field name="arch" type="xml">
<xpath expr="//notebook/page[@string='Options']" position="after">
<page string="Tracking">
<group>
<field name="campaign_id" />
<field name="medium_id" />
<field name="source_id" />
</group>
</page>
</xpath>
</field>
</record>
</data>
</openerp>

View File

@ -12,9 +12,7 @@
<field name="function">Reseller</field>
<field name="country_id" ref="base.uk"/>
<field name="city">Edinburgh</field>
<field name="type_id" ref="crm.type_lead8"/>
<field name="categ_ids" eval="[(6, 0, [ref('crm.categ_oppor1')])]"/>
<field name="channel_id" ref="crm.crm_case_channel_email"/>
<field name="priority">2</field>
<field name="section_id" ref="sales_team.crm_case_section_2"/>
<field name="user_id" ref=""/>

View File

@ -15,9 +15,9 @@
<field name="email_from"/>
<field name="phone"/>
<field name="stage_id" invisible="1"/>
<field name="type_id" invisible="1"/>
<field name="campaign_id" invisible="1"/>
<field name="referred" invisible="1"/>
<field name="channel_id" invisible="1"/>
<field name="medium_id" invisible="1"/>
<field name="section_id" invisible="context.get('invisible_section', True)" groups="base.group_multi_salesteams"/>
<button string="I'm interested" name="case_interested" icon="gtk-index" type="object"/>
@ -80,8 +80,8 @@
<field name="country_id" invisible="context.get('invisible_country', True)" />
<field name="date_action"/>
<field name="title_action" />
<field name="channel_id" invisible="1"/>
<field name="type_id" invisible="1"/>
<field name="medium_id" invisible="1"/>
<field name="campaign_id" invisible="1"/>
<field name="planned_revenue" sum="Expected Revenues"/>
<field name="probability" widget="progressbar" avg="Avg. of Probability"/>
<field name="section_id" groups="base.group_multi_salesteams" invisible="context.get('invisible_section', True)" />
@ -140,8 +140,8 @@
</group>
<group col="2">
<separator string="Categorization" colspan="2"/>
<field name="type_id" readonly="1"/>
<field name="channel_id" readonly="1"/>
<field name="campaign_id" readonly="1"/>
<field name="medium_id" readonly="1"/>
</group>
</group>
<separator string="Details" />

View File

@ -12,8 +12,9 @@
<attribute name="groups"></attribute>
</xpath>
<xpath expr="//field[@name='company_id']" position="after">
<field name="type_id"/>
<field name="channel_id" widget="selection"/>
<field name="campaign_id" />
<field name="medium_id"/>
<field name="source_id" />
</xpath>
</field>
</record>
@ -25,8 +26,9 @@
<field name="arch" type="xml">
<xpath expr="//group[@name='mailings']" position="before">
<group string="Marketing">
<field name="type_id" />
<field name="channel_id" widget="selection"/>
<field name="campaign_id" />
<field name="medium_id" />
<field name="source_id" />
</group>
</xpath>
</field>

View File

@ -144,7 +144,6 @@ class MassMailingCampaign(osv.Model):
row['replied_ratio'] = 100.0 * row['replied'] / total
return results
_columns = {
'name': fields.char('Name', required=True),
'stage_id': fields.many2one('mail.mass_mailing.stage', 'Stage', required=True),
@ -326,7 +325,6 @@ class MassMailing(osv.Model):
row['replied_ratio'] = 100.0 * row['replied'] / total
return results
def _get_mailing_model(self, cr, uid, context=None):
res = []
for model_name in self.pool:

View File

@ -22,7 +22,8 @@
from openerp.osv import osv, fields
class sale_order(osv.osv):
_inherit = 'sale.order'
_name = "sale.order"
_inherit = ['sale.order', 'crm.tracking.mixin']
_columns = {
'categ_ids': fields.many2many('crm.case.categ', 'sale_order_category_rel', 'order_id', 'category_id', 'Tags', \
domain="['|', ('section_id', '=', section_id), ('section_id', '=', False), ('object_id.model', '=', 'crm.lead')]", context="{'object_name': 'crm.lead'}")

View File

@ -29,6 +29,12 @@
<field name="user_id" position="after">
<field name="categ_ids" widget="many2many_tags"/>
</field>
<field name="origin" position="after">
<field name="campaign_id" />
<field name="medium_id" />
<field name="source_id" />
</field>
</field>
</record>
</data>

View File

@ -76,7 +76,7 @@ class ir_http(orm.AbstractModel):
if self.geo_ip_resolver and request.httprequest.remote_addr:
record = self.geo_ip_resolver.record_by_addr(request.httprequest.remote_addr) or {}
request.session['geoip'] = record
if request.website_enabled:
if func:
self._authenticate(func.routing['auth'])

View File

@ -62,7 +62,7 @@ class contactus(http.Controller):
return request.website.render("website.contactus", values)
try:
values['channel_id'] = request.registry['ir.model.data'].get_object_reference(request.cr, SUPERUSER_ID, 'crm', 'crm_case_channel_website')[1]
values['medium_id'] = request.registry['ir.model.data'].get_object_reference(request.cr, SUPERUSER_ID, 'crm', 'crm_tracking_medium_website')[1]
values['section_id'] = request.registry['ir.model.data'].xmlid_to_res_id(request.cr, SUPERUSER_ID, 'website.salesteam_website_sales')
except ValueError:
pass