[REM] website_crm_score: moved to enterprise
This commit is contained in:
@@ -1042,11 +1042,6 @@ file_filter = addons/website_crm_partner_assign/i18n/<lang>.po
|
||||
source_file = addons/website_crm_partner_assign/i18n/website_crm_partner_assign.pot
|
||||
source_lang = en
|
||||
|
||||
[odoo-9.website_crm_score]
|
||||
file_filter = addons/website_crm_score/i18n/<lang>.po
|
||||
source_file = addons/website_crm_score/i18n/website_crm_score.pot
|
||||
source_lang = en
|
||||
|
||||
[odoo-9.website_customer]
|
||||
file_filter = addons/website_customer/i18n/<lang>.po
|
||||
source_file = addons/website_customer/i18n/website_customer.pot
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import models
|
||||
import controllers
|
||||
@@ -1,29 +0,0 @@
|
||||
{
|
||||
'name': "Lead Scoring",
|
||||
'category': "CRM",
|
||||
'version': "1.0",
|
||||
'depends': ['base', 'sales_team', 'marketing', 'website_crm'],
|
||||
'author': "Odoo S.A.",
|
||||
'description': """\
|
||||
Lead Scoring
|
||||
===================
|
||||
|
||||
This module allows you to...
|
||||
- Track specific page view on your website.
|
||||
- Assign score on lead: sort your lead automatically and consider the more important at first.
|
||||
- Assign lead to salesteams: define your own filters and sort automatically your leads by saleteam.
|
||||
- Assign lead to salesmen: define filter by saleman and dispatch automatically your leads to the right saleman.
|
||||
""",
|
||||
'data': [
|
||||
'views/website_crm_score.xml',
|
||||
'views/reporting.xml',
|
||||
'views/sales.xml',
|
||||
'views/marketing.xml',
|
||||
'security/ir.model.access.csv',
|
||||
],
|
||||
'demo': [
|
||||
'demo/website_crm_score_demo.xml',
|
||||
],
|
||||
'installable': True,
|
||||
'application': False,
|
||||
}
|
||||
@@ -1,2 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import main
|
||||
@@ -1,131 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import simplejson
|
||||
from openerp import http, SUPERUSER_ID, fields
|
||||
from openerp.http import request
|
||||
from openerp.tools import html_escape
|
||||
from openerp.addons.website.controllers.main import Website
|
||||
from openerp.addons.website_form.controllers.main import WebsiteForm
|
||||
|
||||
class PageController(Website):
|
||||
|
||||
@http.route('/page/<page:page>', auth="public", website=True)
|
||||
def page(self, page, **opt):
|
||||
response = super(PageController, self).page(page, **opt)
|
||||
# duplication of ir_http.py
|
||||
|
||||
if getattr(response, 'status_code', 0) == 200:
|
||||
try:
|
||||
view = request.website.get_template(page)
|
||||
except:
|
||||
pass # view not found
|
||||
else:
|
||||
if view.track: # avoid tracking redirected page
|
||||
cr, uid, context = request.cr, request.uid, request.context
|
||||
lead_id = request.env["crm.lead"].decode(request)
|
||||
url = request.httprequest.url
|
||||
vals = {'lead_id': lead_id, 'user_id': request.session.get('uid'), 'url': url}
|
||||
|
||||
if not lead_id or request.registry['website.crm.pageview'].create_pageview(cr, uid, vals, context=context):
|
||||
# create_pageview failed
|
||||
response.delete_cookie('lead_id')
|
||||
request.session.setdefault('pages_viewed', {})[url] = fields.Datetime.now()
|
||||
request.session.modified = True
|
||||
|
||||
return response
|
||||
|
||||
|
||||
class ContactController(WebsiteForm):
|
||||
|
||||
@http.route('/website_form/<string:model_name>', type='http', auth="public", methods=['POST'], website=True)
|
||||
def website_form(self, model_name, **kwargs):
|
||||
response = super(ContactController, self).website_form(model_name, **kwargs)
|
||||
if model_name != 'crm.lead':
|
||||
return response
|
||||
|
||||
# the cookie is written here because the response is not available in the create_lead function
|
||||
response_data = simplejson.loads(response.data) # controller is json now
|
||||
if 'id' in response_data: # a new lead has been created
|
||||
lead_model = request.registry['crm.lead']
|
||||
# sign the lead_id
|
||||
sign = lead_model.encode(response_data['id'])
|
||||
response.set_cookie('lead_id', sign, domain=lead_model.get_score_domain_cookies())
|
||||
return response
|
||||
|
||||
def create_real_lead(self, request, model, values, custom, meta=None):
|
||||
""" Make this function overridable to create a lead with another function than insert_record from website_form """
|
||||
return super(ContactController, self).insert_record(request, model, values, custom, meta)
|
||||
|
||||
def insert_record(self, request, model, values, custom, meta=None):
|
||||
if model.model != 'crm.lead':
|
||||
return super(ContactController, self).insert_record(request, model, values, custom, meta)
|
||||
|
||||
cr, context = request.cr, request.context
|
||||
|
||||
lead_model = request.registry["crm.lead"]
|
||||
lead_id = lead_model.decode(request)
|
||||
|
||||
# domain: leads that are still open:
|
||||
# NOT [ on_change AND (proba = 0 OR proba = 100) ]
|
||||
# the condition on the lead_id is prepended
|
||||
domain = [
|
||||
('id', '=', lead_id),
|
||||
'|',
|
||||
('stage_id.on_change', '=', False),
|
||||
'&',
|
||||
('stage_id.probability', '!=', 0),
|
||||
('stage_id.probability', '!=', 100)
|
||||
]
|
||||
lead_instance = lead_model.search(cr, SUPERUSER_ID, domain, context=context)
|
||||
|
||||
if lead_instance:
|
||||
# a lead_id cookie exists and it has not been altered and the lead is not closed
|
||||
lead = lead_model.browse(cr, SUPERUSER_ID, lead_id, context=context)
|
||||
|
||||
# NOTE: the following should be changed when dynamic forms exist
|
||||
changed_values = {}
|
||||
for fieldname, fieldvalue in values.items():
|
||||
if fieldname in lead._all_columns and fieldvalue:
|
||||
if lead[fieldname] and lead[fieldname] != fieldvalue:
|
||||
changed_values[fieldname] = fieldvalue
|
||||
else:
|
||||
lead[fieldname] = fieldvalue
|
||||
# Post a message to indicate the updated field (if any)
|
||||
if changed_values:
|
||||
body = 'Other value given for field '
|
||||
for fieldname in changed_values.keys():
|
||||
body += '<br/><b>%s</b>: <b>%s</b>' % (fieldname, html_escape(changed_values[fieldname]))
|
||||
request.registry['crm.lead'].message_post(cr, SUPERUSER_ID, [lead_id], body=body, subject="Field value changed", context=context)
|
||||
|
||||
return lead_id
|
||||
|
||||
else:
|
||||
# either no lead_id cookie OR the lead_id doesn't exist in db OR the current one is closed -> a lead is created
|
||||
lang = context.get('lang', False)
|
||||
lang_id = request.registry["res.lang"].search(cr, SUPERUSER_ID, [('code', '=', lang)], context=context)
|
||||
lang_id = lang_id and lang_id[0] or False
|
||||
values['lang_id'] = lang_id
|
||||
body = None
|
||||
|
||||
if 'pages_viewed' in request.session:
|
||||
score_pageview_ids = []
|
||||
url_list = []
|
||||
pages_viewed = request.session['pages_viewed']
|
||||
for url, date in pages_viewed.iteritems():
|
||||
vals = {'user_id': request.session.get('uid'), 'url': url, 'view_date': date}
|
||||
score_pageview_ids.append((0, 0, vals))
|
||||
url_list.append(url)
|
||||
del request.session['pages_viewed']
|
||||
values['score_pageview_ids'] = score_pageview_ids
|
||||
urls = []
|
||||
for url in url_list:
|
||||
url_encoded = html_escape(url)
|
||||
urls.append('<a href="%s" target="_blank"><b>%s</b></a>' % (url_encoded, url_encoded))
|
||||
body = '<br/>'.join(urls)
|
||||
|
||||
new_lead_id = self.create_real_lead(request, model, values, custom, meta)
|
||||
|
||||
# if pages were seen, a message is posted
|
||||
if body:
|
||||
request.registry['crm.lead'].message_post(cr, SUPERUSER_ID, [new_lead_id], body=body, subject="Pages visited", context=context)
|
||||
|
||||
return new_lead_id
|
||||
@@ -1,279 +0,0 @@
|
||||
<?xml version="1.0"?>
|
||||
<openerp>
|
||||
<data>
|
||||
|
||||
<record model="crm.team" id="sales_team.team_sales_department">
|
||||
<field name="score_team_domain">[['country_id', '=', 'France']]</field>
|
||||
</record>
|
||||
<record model="crm.team" id="website.salesteam_website_sales">
|
||||
<field name="score_team_domain">[['country_id', '=', 'Belgium']]</field>
|
||||
</record>
|
||||
|
||||
<!-- Creating salesmen -->
|
||||
<record id="website_crm_score_partner_0" model="res.partner">
|
||||
<field name="name">Toni Buchanan</field>
|
||||
<field name="email">Toni.Buchanan@yourcompany.com</field>
|
||||
<field name="supplier" eval="False"/>
|
||||
<field name="customer" eval="False"/>
|
||||
<field name="notify_email">none</field>
|
||||
<field name="city">Vivegnis</field>
|
||||
<field name="zip">4683</field>
|
||||
<field name="country_id" ref="base.be"/>
|
||||
<field name="street">Rue Cesar de Paepe, 43</field>
|
||||
</record>
|
||||
<record id="website_crm_score_user_0" model="res.users" context="{'no_reset_password': True}">
|
||||
<field name="partner_id" ref="website_crm_score_partner_0"/>
|
||||
<field name="login">tbuchanan</field>
|
||||
<field name="password">tbuchanan</field>
|
||||
<field name="groups_id" eval="[(5,)]"/>
|
||||
</record>
|
||||
|
||||
<record id="website_crm_score_partner_1" model="res.partner">
|
||||
<field name="name">Frances Pierce</field>
|
||||
<field name="email">Frances.Pierce@yourcompany.com</field>
|
||||
<field name="supplier" eval="False"/>
|
||||
<field name="customer" eval="False"/>
|
||||
<field name="notify_email">none</field>
|
||||
<field name="city">Oakland</field>
|
||||
<field name="zip">94612</field>
|
||||
<field name="country_id" ref="base.be"/>
|
||||
<field name="street">4850 Clifford Street</field>
|
||||
</record>
|
||||
<record id="website_crm_score_user_1" model="res.users" context="{'no_reset_password': True}">
|
||||
<field name="partner_id" ref="website_crm_score_partner_1"/>
|
||||
<field name="login">fpierce</field>
|
||||
<field name="password">fpierce</field>
|
||||
<field name="groups_id" eval="[(5,)]"/>
|
||||
</record>
|
||||
|
||||
<record id="website_crm_score_partner_2" model="res.partner">
|
||||
<field name="name">Camille Watkins</field>
|
||||
<field name="email">Camille.Watkins@yourcompany.com</field>
|
||||
<field name="supplier" eval="False"/>
|
||||
<field name="customer" eval="False"/>
|
||||
<field name="notify_email">none</field>
|
||||
<field name="city">Houston</field>
|
||||
<field name="zip">77036</field>
|
||||
<field name="country_id" ref="base.be"/>
|
||||
<field name="street">181 Swick Hill Street</field>
|
||||
</record>
|
||||
<record id="website_crm_score_user_2" model="res.users" context="{'no_reset_password': True}">
|
||||
<field name="partner_id" ref="website_crm_score_partner_2"/>
|
||||
<field name="login">cwatkins</field>
|
||||
<field name="password">cwatkins</field>
|
||||
<field name="groups_id" eval="[(5,)]"/>
|
||||
</record>
|
||||
|
||||
<record id="website_crm_score_partner_3" model="res.partner">
|
||||
<field name="name">Judy Garza</field>
|
||||
<field name="email">Judy.Garza@yourcompany.example.com</field>
|
||||
<field name="supplier" eval="False"/>
|
||||
<field name="customer" eval="False"/>
|
||||
<field name="notify_email">none</field>
|
||||
<field name="city">Daytona Beach</field>
|
||||
<field name="zip">32114</field>
|
||||
<field name="country_id" ref="base.be"/>
|
||||
<field name="street">763 Melm Street</field>
|
||||
</record>
|
||||
<record id="website_crm_score_user_3" model="res.users" context="{'no_reset_password': True}">
|
||||
<field name="partner_id" ref="website_crm_score_partner_3"/>
|
||||
<field name="login">jgarza</field>
|
||||
<field name="password">jgarza</field>
|
||||
<field name="groups_id" eval="[(5,)]"/>
|
||||
</record>
|
||||
|
||||
|
||||
<!-- Assigning salesmen to salesteams -->
|
||||
<!-- Team 0 -->
|
||||
<record id="website_crm_score_team_user_0" model="team.user">
|
||||
<field name="user_id" ref="website_crm_score_user_0"/>
|
||||
<field name="team_id" ref="sales_team.team_sales_department"/>
|
||||
<field name="maximum_user_leads">2</field>
|
||||
<field name="team_user_domain">['|', ['country_id', '=', 'Belgium'], ['country_id', '=', 'France']]</field>
|
||||
</record>
|
||||
<record id="website_crm_score_team_user_1" model="team.user">
|
||||
<field name="user_id" ref="website_crm_score_user_2"/>
|
||||
<field name="team_id" ref="sales_team.team_sales_department"/>
|
||||
<field name="maximum_user_leads">1</field>
|
||||
<field name="team_user_domain">[['country_id', '!=', 'Belgium']]</field>
|
||||
</record>
|
||||
|
||||
<!-- Team 1 -->
|
||||
<record id="website_crm_score_team_user_3" model="team.user">
|
||||
<field name="user_id" ref="website_crm_score_user_1"/>
|
||||
<field name="team_id" ref="website.salesteam_website_sales"/>
|
||||
<field name="maximum_user_leads">1</field>
|
||||
</record>
|
||||
<record id="website_crm_score_team_user_4" model="team.user">
|
||||
<field name="user_id" ref="website_crm_score_user_3"/>
|
||||
<field name="team_id" ref="website.salesteam_website_sales"/>
|
||||
<field name="maximum_user_leads">2</field>
|
||||
<field name="team_user_domain">['&', ['lang_id', '=', 'English'], ['country_id', '=', 'Belgium']]</field>
|
||||
</record>
|
||||
|
||||
<!-- Team 3 -->
|
||||
<record id="website_crm_score_team_user_6" model="team.user">
|
||||
<field name="user_id" ref="website_crm_score_user_3"/>
|
||||
<field name="team_id" ref="sales_team.crm_team_1"/>
|
||||
<field name="maximum_user_leads">1</field>
|
||||
</record>
|
||||
|
||||
<!-- Team 4 -->
|
||||
<record id="website_crm_score_team_user_7" model="team.user">
|
||||
<field name="user_id" ref="website_crm_score_user_2"/>
|
||||
<field name="team_id" ref="sales_team.crm_team_1"/>
|
||||
<field name="maximum_user_leads">3</field>
|
||||
<field name="team_user_domain">[['country_id', '=', 'France']]</field>
|
||||
</record>
|
||||
|
||||
|
||||
<!-- Leads -->
|
||||
<record id="crm.crm_case_1" model="crm.lead">
|
||||
<field name="team_id" />
|
||||
<field name="user_id" />
|
||||
</record>
|
||||
<record id="crm.crm_case_2" model="crm.lead">
|
||||
<field name="team_id" />
|
||||
<field name="user_id" />
|
||||
</record>
|
||||
<record id="crm.crm_case_3" model="crm.lead">
|
||||
<field name="team_id" />
|
||||
<field name="user_id" />
|
||||
</record>
|
||||
<record id="crm.crm_case_4" model="crm.lead">
|
||||
<field name="team_id" />
|
||||
<field name="user_id" />
|
||||
</record>
|
||||
<record id="crm.crm_case_5" model="crm.lead">
|
||||
<field name="team_id" />
|
||||
<field name="user_id" />
|
||||
</record>
|
||||
<record id="crm.crm_case_6" model="crm.lead">
|
||||
<field name="team_id" />
|
||||
<field name="user_id" />
|
||||
</record>
|
||||
<record id="crm.crm_case_7" model="crm.lead">
|
||||
<field name="team_id" />
|
||||
<field name="user_id" />
|
||||
</record>
|
||||
<record id="crm.crm_case_8" model="crm.lead">
|
||||
<field name="team_id" />
|
||||
<field name="user_id" />
|
||||
</record>
|
||||
<record id="crm.crm_case_9" model="crm.lead">
|
||||
<field name="team_id" />
|
||||
<field name="user_id" />
|
||||
</record>
|
||||
<record id="crm.crm_case_10" model="crm.lead">
|
||||
<field name="team_id" />
|
||||
<field name="user_id" />
|
||||
</record>
|
||||
<record id="crm.crm_case_11" model="crm.lead">
|
||||
<field name="team_id" />
|
||||
<field name="user_id" />
|
||||
</record>
|
||||
<record id="crm.crm_case_12" model="crm.lead">
|
||||
<field name="team_id" />
|
||||
<field name="user_id" />
|
||||
</record>
|
||||
<record id="crm.crm_case_13" model="crm.lead">
|
||||
<field name="team_id" />
|
||||
<field name="user_id" />
|
||||
</record>
|
||||
<record id="crm.crm_case_14" model="crm.lead">
|
||||
<field name="team_id" />
|
||||
<field name="user_id" />
|
||||
</record>
|
||||
<record id="crm.crm_case_15" model="crm.lead">
|
||||
<field name="team_id" />
|
||||
<field name="user_id" />
|
||||
</record>
|
||||
<record id="crm.crm_case_16" model="crm.lead">
|
||||
<field name="team_id" />
|
||||
<field name="user_id" />
|
||||
</record>
|
||||
<record id="crm.crm_case_17" model="crm.lead">
|
||||
<field name="team_id" />
|
||||
<field name="user_id" />
|
||||
</record>
|
||||
<record id="crm.crm_case_18" model="crm.lead">
|
||||
<field name="team_id" />
|
||||
<field name="user_id" />
|
||||
</record>
|
||||
<record id="crm.crm_case_19" model="crm.lead">
|
||||
<field name="team_id" />
|
||||
<field name="user_id" />
|
||||
</record>
|
||||
<record id="crm.crm_case_20" model="crm.lead">
|
||||
<field name="team_id" />
|
||||
<field name="user_id" />
|
||||
</record>
|
||||
<record id="crm.crm_case_21" model="crm.lead">
|
||||
<field name="team_id" />
|
||||
<field name="user_id" />
|
||||
</record>
|
||||
<record id="crm.crm_case_22" model="crm.lead">
|
||||
<field name="team_id" />
|
||||
<field name="user_id" />
|
||||
</record>
|
||||
<record id="crm.crm_case_23" model="crm.lead">
|
||||
<field name="team_id" />
|
||||
<field name="user_id" />
|
||||
</record>
|
||||
<record id="crm.crm_case_24" model="crm.lead">
|
||||
<field name="team_id" />
|
||||
<field name="user_id" />
|
||||
</record>
|
||||
<record id="crm.crm_case_25" model="crm.lead">
|
||||
<field name="team_id" />
|
||||
<field name="user_id" />
|
||||
</record>
|
||||
<record id="crm.crm_case_26" model="crm.lead">
|
||||
<field name="team_id" />
|
||||
<field name="user_id" />
|
||||
</record>
|
||||
|
||||
<!-- Scores -->
|
||||
<record id="website_crm_score_score_0" model="website.crm.score">
|
||||
<field name="name">Belgium Score</field>
|
||||
<field name="value">8</field>
|
||||
<field name="domain">[['country_id', '=', 'Belgium']]</field>
|
||||
</record>
|
||||
<record id="website_crm_score_score_1" model="website.crm.score">
|
||||
<field name="name">English Score</field>
|
||||
<field name="value">4</field>
|
||||
<field name="domain">[['lang_id', '=', 'English']]</field>
|
||||
</record>
|
||||
<record id="website_crm_score_score_2" model="website.crm.score">
|
||||
<field name="name">France Score</field>
|
||||
<field name="value">2</field>
|
||||
<field name="domain">[['country_id', '=', 'France']]</field>
|
||||
</record>
|
||||
<record id="website_crm_score_score_3" model="website.crm.score">
|
||||
<field name="name">Anti-China Score</field>
|
||||
<field name="value">1</field>
|
||||
<field name="domain">[['country_id', '!=', 'China']]</field>
|
||||
</record>
|
||||
<record id="website_crm_score_score_4" model="website.crm.score">
|
||||
<field name="name">Homepage Score</field>
|
||||
<field name="value">2</field>
|
||||
<field name="domain">[['score_pageview_ids.url', 'ilike', '%/page/homepage']]</field>
|
||||
</record>
|
||||
<record id="website_crm_score_score_5" model="website.crm.score">
|
||||
<field name="name">Aboutus Score</field>
|
||||
<field name="value">8</field>
|
||||
<field name="domain">[['score_pageview_ids.url', 'ilike', '%/page/website.aboutus']]</field>
|
||||
</record>
|
||||
<record id="website_crm_score_score_6" model="website.crm.score">
|
||||
<field name="name">Email</field>
|
||||
<field name="value">8</field>
|
||||
<field name="domain">[['email_from', '!=', False]]</field>
|
||||
</record>
|
||||
<record id="website_crm_score_score_7" model="website.crm.score">
|
||||
<field name="name">US Score</field>
|
||||
<field name="value">4</field>
|
||||
<field name="domain">[['country_id', '=', 'United States']]</field>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
@@ -1,436 +0,0 @@
|
||||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * website_crm_score
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 9.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2015-08-25 09:00+0000\n"
|
||||
"PO-Revision-Date: 2015-08-25 09:00+0000\n"
|
||||
"Last-Translator: <>\n"
|
||||
"Language-Team: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"Plural-Forms: \n"
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_crm_lead_pageviews_count
|
||||
msgid "# Page Views"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#. openerp-web
|
||||
#: code:addons/website_crm_score/static/src/xml/track_page.xml:9
|
||||
#, python-format
|
||||
msgid "4. Track Page"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_website_crm_score_running
|
||||
msgid "Active"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.model.fields,help:website_crm_score.field_ir_ui_view_track
|
||||
msgid "Allow to specify for one page of the website to be trackable or not"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.actions.server,name:website_crm_score.action_score_now
|
||||
msgid "Apply marked scores"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_crm_lead_assign_date
|
||||
msgid "Assign Date"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.ui.view,arch_db:website_crm_score.sales_team_form_view_assign
|
||||
msgid "Assignation"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.ui.view,arch_db:website_crm_score.view_crm_lead_dry_run_form
|
||||
#: model:ir.ui.view,arch_db:website_crm_score.view_lead_dry_run_tree
|
||||
msgid "Assignation Dry Run"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.actions.act_window,name:website_crm_score.lead_dry_run_action
|
||||
#: model:ir.ui.menu,name:website_crm_score.leads_dry_run
|
||||
msgid "Assignation dry run"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_team_user_leads_count
|
||||
msgid "Assigned Leads"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.model.fields,help:website_crm_score.field_team_user_leads_count
|
||||
msgid "Assigned Leads this last month"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_crm_team_assigned_leads
|
||||
msgid "Assigned leads"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_crm_team_capacity
|
||||
msgid "Capacity"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.actions.act_window,help:website_crm_score.team_user_action
|
||||
msgid "Click to create a salesmen."
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_crm_leads_dry_run_create_uid
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_team_user_create_uid
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_website_crm_pageview_create_uid
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_website_crm_score_create_uid
|
||||
msgid "Created by"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_crm_leads_dry_run_create_date
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_team_user_create_date
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_website_crm_pageview_create_date
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_website_crm_score_create_date
|
||||
msgid "Created on"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.model.fields,help:website_crm_score.field_crm_lead_assign_date
|
||||
msgid "Date when the lead has been assigned via the auto-assignation mechanism"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_crm_leads_dry_run_display_name
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_team_user_display_name
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_website_crm_pageview_display_name
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_website_crm_score_display_name
|
||||
msgid "Display Name"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_crm_team_score_team_domain
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_team_user_team_user_domain
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_website_crm_score_domain
|
||||
msgid "Domain"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_website_crm_score_event_based
|
||||
msgid "Event-based rule"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.model,name:website_crm_score.model_ir_http
|
||||
msgid "HTTP routing"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_crm_leads_dry_run_id
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_team_user_id
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_website_crm_pageview_id
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_website_crm_score_id
|
||||
msgid "ID"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_crm_lead_lang_id
|
||||
msgid "Language"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.model.fields,help:website_crm_score.field_crm_lead_lang_id
|
||||
msgid "Language from the website when lead has been created"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_crm_leads_dry_run___last_update
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_team_user___last_update
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_website_crm_pageview___last_update
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_website_crm_score___last_update
|
||||
msgid "Last Modified on"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_crm_leads_dry_run_write_uid
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_team_user_write_uid
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_website_crm_pageview_write_uid
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_website_crm_score_write_uid
|
||||
msgid "Last Updated by"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_crm_leads_dry_run_write_date
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_team_user_write_date
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_website_crm_pageview_write_date
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_website_crm_score_write_date
|
||||
msgid "Last Updated on"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_crm_leads_dry_run_lead_id
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_website_crm_pageview_lead_id
|
||||
msgid "Lead"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.actions.server,name:website_crm_score.action_lead_dry_run
|
||||
msgid "Lead Dry Run"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.model,name:website_crm_score.model_crm_lead
|
||||
msgid "Lead/Opportunity"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.actions.act_window,name:website_crm_score.score_leads
|
||||
#: model:ir.ui.view,arch_db:website_crm_score.view_crm_score_form
|
||||
msgid "Leads"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.ui.menu,name:website_crm_score.team_user
|
||||
msgid "Leads Assignation"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.ui.menu,name:website_crm_score.leads_menu
|
||||
msgid "Leads Management"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_team_user_maximum_user_leads
|
||||
msgid "Leads Per Month"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_crm_team_leads_count
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_website_crm_score_leads_count
|
||||
msgid "Leads count"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.actions.act_window,help:website_crm_score.team_user_action
|
||||
msgid "Link users to salesteam, set a per 30 days lead capacity for each of them and set filters to auto assign your leads."
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.model.fields,help:website_crm_score.field_crm_lead_score_pageview_ids
|
||||
msgid "List of (tracked) pages seen by the owner of this lead"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_crm_team_min_for_assign
|
||||
msgid "Minimum score"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.model.fields,help:website_crm_score.field_crm_team_min_for_assign
|
||||
msgid "Minimum score to be automatically assign (>=)"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_team_user_name
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_website_crm_score_name
|
||||
msgid "Name"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.actions.act_window,name:website_crm_score.crm_score_views_action_table
|
||||
#: model:ir.ui.view,arch_db:website_crm_score.crm_case_graph_view_leads_sales
|
||||
#: model:ir.ui.view,arch_db:website_crm_score.crm_case_table_view_leads_sales
|
||||
#: model:ir.ui.view,arch_db:website_crm_score.sales_team_form_view_assign
|
||||
msgid "Opportunities"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_crm_lead_score_pageview_ids
|
||||
#: model:ir.ui.view,arch_db:website_crm_score.crm_score_pageview_form
|
||||
#: model:ir.ui.view,arch_db:website_crm_score.crm_score_pageview_graph
|
||||
#: model:ir.ui.view,arch_db:website_crm_score.website_crm_pageview_tree
|
||||
msgid "Page Views"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.ui.view,arch_db:website_crm_score.lead_score_form
|
||||
msgid "Page views"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_team_user_percentage_leads
|
||||
msgid "Percentage leads"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_crm_team_ratio
|
||||
msgid "Ratio"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_team_user_running
|
||||
msgid "Running"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_crm_leads_dry_run_team_id
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_team_user_team_id
|
||||
msgid "SaleTeam"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_crm_leads_dry_run_user_id
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_team_user_user_id
|
||||
msgid "Saleman"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.actions.act_window,name:website_crm_score.team_user_action
|
||||
#: model:ir.ui.view,arch_db:website_crm_score.view_crm_team_user_form
|
||||
#: model:ir.ui.view,arch_db:website_crm_score.view_crm_team_user_tree
|
||||
msgid "Sales Men"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.model,name:website_crm_score.model_crm_team
|
||||
msgid "Sales Team"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.actions.act_window,name:website_crm_score.team_action
|
||||
msgid "Sales Teams"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_crm_team_team_user_ids
|
||||
msgid "Salesman"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_crm_lead_score
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_crm_lead_score_ids
|
||||
msgid "Score"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.ui.view,arch_db:website_crm_score.view_crm_score_form
|
||||
msgid "Score Now"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.actions.act_window,name:website_crm_score.score_action
|
||||
#: model:ir.ui.view,arch_db:website_crm_score.view_crm_score_form
|
||||
#: model:ir.ui.view,arch_db:website_crm_score.view_crm_score_tree
|
||||
msgid "Scores"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.ui.view,arch_db:website_crm_score.lead_score_form
|
||||
#: model:ir.ui.view,arch_db:website_crm_score.score_opp_form_view
|
||||
msgid "Scoring"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.ui.menu,name:website_crm_score.pageview_menu
|
||||
msgid "Scoring Page Views"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.ui.menu,name:website_crm_score.scores_menu
|
||||
msgid "Scoring Rules"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.ui.view,arch_db:website_crm_score.crm_score_pageview_filter
|
||||
msgid "Search PageViews"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.ui.menu,name:website_crm_score.team
|
||||
msgid "Teams Assignation"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_ir_ui_view_track
|
||||
msgid "Track"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.actions.act_window,name:website_crm_score.crm_score_views_action_graph
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_crm_team_unassigned_leads
|
||||
#: model:ir.ui.view,arch_db:website_crm_score.sales_team_form_view_assign
|
||||
msgid "Unassigned leads"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_website_crm_pageview_url
|
||||
msgid "Url"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_website_crm_pageview_user_id
|
||||
msgid "User"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_website_crm_score_value
|
||||
msgid "Value"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.model.fields,field_description:website_crm_score.field_website_crm_pageview_view_date
|
||||
msgid "Viewing Date"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.actions.act_window,name:website_crm_score.website_crm_score_pageviews
|
||||
msgid "Website Pages"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.model.fields,help:website_crm_score.field_website_crm_score_event_based
|
||||
msgid "When checked, the rule will be re-evaluated every time, even for leads that have already been checked previously. This option incurs a large performance penalty, so it should be checked only for rules that depend on dynamic events"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.model,name:website_crm_score.model_crm_leads_dry_run
|
||||
msgid "crm.leads.dry.run"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.model,name:website_crm_score.model_ir_ui_view
|
||||
msgid "ir.ui.view"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.model,name:website_crm_score.model_team_user
|
||||
msgid "team.user"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#. openerp-web
|
||||
#: code:addons/website_crm_score/static/src/xml/track_page.xml:9
|
||||
#, python-format
|
||||
msgid "to better score your leads:"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.model,name:website_crm_score.model_website_crm_pageview
|
||||
msgid "website.crm.pageview"
|
||||
msgstr ""
|
||||
|
||||
#. module: website_crm_score
|
||||
#: model:ir.model,name:website_crm_score.model_website_crm_score
|
||||
msgid "website.crm.score"
|
||||
msgstr ""
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import website_crm_score
|
||||
import crm_lead
|
||||
import ir
|
||||
import sales_team
|
||||
import pageview
|
||||
import leads_dry_run
|
||||
@@ -1,90 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from openerp.http import request
|
||||
from openerp import api, fields, models, SUPERUSER_ID
|
||||
import md5
|
||||
|
||||
|
||||
class Lead(models.Model):
|
||||
_inherit = 'crm.lead'
|
||||
|
||||
@api.one
|
||||
def _count_pageviews(self):
|
||||
self.pageviews_count = len(self.score_pageview_ids)
|
||||
|
||||
@api.depends('score_ids', 'score_ids.value')
|
||||
def _compute_score(self):
|
||||
self._cr.execute("""
|
||||
SELECT
|
||||
lead_id, COALESCE(sum(s.value), 0) as sum
|
||||
FROM
|
||||
crm_lead_score_rel rel
|
||||
LEFT JOIN
|
||||
website_crm_score s ON (s.id = rel.score_id)
|
||||
WHERE lead_id = any(%s)
|
||||
GROUP BY lead_id
|
||||
""", (self.ids,))
|
||||
scores = dict(self._cr.fetchall())
|
||||
for lead in self:
|
||||
lead.score = scores.get(lead.id, 0)
|
||||
|
||||
score = fields.Float(compute='_compute_score', store=True)
|
||||
score_ids = fields.Many2many('website.crm.score', 'crm_lead_score_rel', 'lead_id', 'score_id', string='Score')
|
||||
score_pageview_ids = fields.One2many('website.crm.pageview', 'lead_id', string='Page Views', help="List of (tracked) pages seen by the owner of this lead")
|
||||
assign_date = fields.Datetime(string='Assign Date', help="Date when the lead has been assigned via the auto-assignation mechanism")
|
||||
pageviews_count = fields.Integer('# Page Views', compute='_count_pageviews')
|
||||
lang_id = fields.Many2one('res.lang', string='Language', help="Language from the website when lead has been created")
|
||||
|
||||
def encode(self, lead_id):
|
||||
md5_lead_id = md5.new("%s%s" % (lead_id, self.get_key())).hexdigest()
|
||||
return "%s-%s" % (str(lead_id), md5_lead_id)
|
||||
|
||||
def decode(self, request):
|
||||
# opens the cookie, verifies the signature of the lead_id
|
||||
# returns lead_id if the verification passes and None otherwise
|
||||
cookie_content = request.httprequest.cookies.get('lead_id')
|
||||
if cookie_content:
|
||||
lead_id, md5_lead_id = cookie_content.split('-', 1)
|
||||
expected_encryped_lead_id = md5.new("%s%s" % (lead_id, self.get_key())).hexdigest()
|
||||
if md5_lead_id == expected_encryped_lead_id:
|
||||
return int(lead_id)
|
||||
else:
|
||||
return None
|
||||
|
||||
def get_key(self):
|
||||
return self.pool['ir.config_parameter'].get_param(request.cr, SUPERUSER_ID, 'database.secret')
|
||||
|
||||
def get_score_domain_cookies(self):
|
||||
return request.httprequest.host
|
||||
|
||||
@api.model
|
||||
def _merge_pageviews(self, opportunity_id, opportunities):
|
||||
crmpv = self.env['website.crm.pageview']
|
||||
lead_ids = [opp.id for opp in opportunities if opp.id != opportunity_id]
|
||||
pv_ids = crmpv.sudo().search([('lead_id', 'in', lead_ids)])
|
||||
pv_ids.write({'lead_id': opportunity_id})
|
||||
|
||||
@api.model
|
||||
def _merge_scores(self, opportunity_id, opportunities):
|
||||
# We needs to delete score from opportunity_id, to be sure that all rules will be re-evaluated.
|
||||
self.sudo().browse(opportunity_id).write({'score_ids': [(6, 0, [])]})
|
||||
|
||||
@api.model
|
||||
def merge_dependences(self, highest, opportunities):
|
||||
self._merge_pageviews(highest, opportunities)
|
||||
self._merge_scores(highest, opportunities)
|
||||
|
||||
# Call default merge function
|
||||
super(Lead, self).merge_dependences(highest, opportunities)
|
||||
|
||||
# Overwritte ORM to add or remove the assign date
|
||||
@api.model
|
||||
def create(self, vals):
|
||||
if vals.get('user_id'):
|
||||
vals['assign_date'] = fields.datetime.now()
|
||||
return super(Lead, self).create(vals)
|
||||
|
||||
@api.multi
|
||||
def write(self, vals):
|
||||
if 'user_id' in vals:
|
||||
vals['assign_date'] = vals.get('user_id') and fields.datetime.now() or False
|
||||
return super(Lead, self).write(vals)
|
||||
@@ -1,30 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from openerp import fields, models
|
||||
from openerp.http import request
|
||||
from openerp.osv import osv
|
||||
|
||||
|
||||
class ir_http(models.AbstractModel):
|
||||
_inherit = 'ir.http'
|
||||
|
||||
def _dispatch(self):
|
||||
response = super(ir_http, self)._dispatch()
|
||||
|
||||
if getattr(response, 'status_code', 0) == 200:
|
||||
if request.endpoint and request.endpoint.routing and request.endpoint.routing.get('track'):
|
||||
lead_id = request.env["crm.lead"].decode(request)
|
||||
url = request.httprequest.url
|
||||
vals = {'lead_id': lead_id, 'user_id': request.session.get('uid'), 'url': url}
|
||||
if not lead_id or request.env['website.crm.pageview'].create_pageview(vals):
|
||||
# create_pageview was fail
|
||||
response.delete_cookie('lead_id')
|
||||
request.session.setdefault('pages_viewed', {})[url] = fields.Datetime.now()
|
||||
request.session.modified = True
|
||||
|
||||
return response
|
||||
|
||||
|
||||
class view(osv.osv):
|
||||
_inherit = "ir.ui.view"
|
||||
|
||||
track = fields.Boolean(string='Track', default=False, help="Allow to specify for one page of the website to be trackable or not")
|
||||
@@ -1,32 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from openerp import fields, models, api
|
||||
|
||||
|
||||
class crm_leads_dry_run(models.TransientModel):
|
||||
_name = "crm.leads.dry.run"
|
||||
|
||||
lead_id = fields.Many2one('crm.lead', string='Lead', required=True)
|
||||
team_id = fields.Many2one('crm.team', string='SaleTeam', required=True, oldname='section_id')
|
||||
user_id = fields.Many2one('res.users', string='Saleman')
|
||||
|
||||
@api.model
|
||||
def assign_leads(self, ids=[]):
|
||||
# Allow to assign the result from a previous dry run.
|
||||
# Once the user agrees with the result shown by a dry run
|
||||
# It differs from launching the assignement process again,
|
||||
# because salemen would be selected at random again
|
||||
all_dry_run = self.search([('user_id', '!=', False)])
|
||||
for dry_run in all_dry_run:
|
||||
lead_record = dry_run.lead_id
|
||||
values = {
|
||||
'team_id': dry_run.team_id.id,
|
||||
'user_id': dry_run.user_id.id,
|
||||
'assign_date': fields.Datetime.now()
|
||||
}
|
||||
lead_record.write(values)
|
||||
lead_record.convert_opportunity(partner_id=None)
|
||||
|
||||
# Avoid to re-assign the same leads for nothing
|
||||
self._cr.execute("""
|
||||
TRUNCATE TABLE crm_leads_dry_run;
|
||||
""")
|
||||
@@ -1,50 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from openerp import fields, models, SUPERUSER_ID, tools, api
|
||||
from psycopg2 import IntegrityError
|
||||
from openerp.tools import html_escape
|
||||
|
||||
|
||||
class pageview(models.Model):
|
||||
_name = "website.crm.pageview"
|
||||
|
||||
view_date = fields.Datetime(string='Viewing Date')
|
||||
lead_id = fields.Many2one('crm.lead', string='Lead')
|
||||
user_id = fields.Many2one('res.users', string='User', oldname='partner_id')
|
||||
url = fields.Char(string='Url')
|
||||
|
||||
@api.model
|
||||
def create_pageview(self, vals, test=False):
|
||||
# returns True if the operation in the db was successful, False otherwise
|
||||
lead_id = vals.get('lead_id', 0)
|
||||
user_id = vals.get('user_id')
|
||||
url = vals.get('url', '')
|
||||
view_date = fields.Datetime.now()
|
||||
|
||||
with self.pool.cursor() as pv_cr:
|
||||
if test:
|
||||
pv_cr = self._cr
|
||||
pv_cr.execute('''
|
||||
UPDATE website_crm_pageview SET view_date=%s WHERE lead_id=%s AND url=%s RETURNING id;
|
||||
''', (view_date, lead_id, url))
|
||||
fetch = pv_cr.fetchone()
|
||||
if fetch:
|
||||
return True
|
||||
else:
|
||||
# update failed
|
||||
try:
|
||||
with tools.mute_logger('openerp.sql_db'):
|
||||
pv_cr.execute('''
|
||||
INSERT INTO website_crm_pageview (lead_id, user_id, url, view_date)
|
||||
SELECT %s,%s,%s,%s
|
||||
RETURNING id;
|
||||
''', (lead_id, user_id, url, view_date))
|
||||
fetch = pv_cr.fetchone()
|
||||
if fetch:
|
||||
# a new pageview has been created, a message is posted
|
||||
url = html_escape(url)
|
||||
body = '<a href="%s" target="_blank"><b>%s</b></a>' % (url, url)
|
||||
ctx = dict(self._context, mail_notify_noemail=True)
|
||||
self.pool['crm.lead'].message_post(self._cr, SUPERUSER_ID, [lead_id], body=body, subject="Page visited", context=ctx)
|
||||
return True
|
||||
except IntegrityError:
|
||||
return False
|
||||
@@ -1,266 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from openerp import fields, api, models
|
||||
from openerp.osv import osv
|
||||
from openerp.tools.safe_eval import safe_eval
|
||||
from random import randint, shuffle
|
||||
import datetime
|
||||
import logging
|
||||
import math
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
evaluation_context = {
|
||||
'datetime': datetime,
|
||||
'context_today': datetime.datetime.now,
|
||||
}
|
||||
|
||||
try:
|
||||
from flanker.addresslib import address
|
||||
|
||||
def checkmail(mail):
|
||||
return bool(address.validate_address(mail))
|
||||
|
||||
except ImportError:
|
||||
_logger.warning('flanker not found, email validation disabled.')
|
||||
|
||||
def checkmail(mail):
|
||||
return True
|
||||
|
||||
|
||||
class team_user(models.Model):
|
||||
_name = 'team.user'
|
||||
|
||||
@api.one
|
||||
def _count_leads(self):
|
||||
if self.id:
|
||||
limit_date = datetime.datetime.now() - datetime.timedelta(days=30)
|
||||
domain = [('user_id', '=', self.user_id.id),
|
||||
('team_id', '=', self.team_id.id),
|
||||
('assign_date', '>', fields.Datetime.to_string(limit_date))
|
||||
]
|
||||
self.leads_count = self.env['crm.lead'].search_count(domain)
|
||||
else:
|
||||
self.leads_count = 0
|
||||
|
||||
@api.one
|
||||
def _get_percentage(self):
|
||||
try:
|
||||
self.percentage_leads = round(100 * self.leads_count / float(self.maximum_user_leads), 2)
|
||||
except ZeroDivisionError:
|
||||
self.percentage_leads = 0.0
|
||||
|
||||
@api.one
|
||||
@api.constrains('team_user_domain')
|
||||
def _assert_valid_domain(self):
|
||||
try:
|
||||
domain = safe_eval(self.team_user_domain or '[]', evaluation_context)
|
||||
self.env['crm.lead'].search(domain)
|
||||
except Exception:
|
||||
raise Warning('The domain is incorrectly formatted')
|
||||
|
||||
team_id = fields.Many2one('crm.team', string='SaleTeam', required=True, oldname='section_id')
|
||||
user_id = fields.Many2one('res.users', string='Saleman', required=True)
|
||||
name = fields.Char(related='user_id.partner_id.display_name')
|
||||
running = fields.Boolean(string='Running', default=True)
|
||||
team_user_domain = fields.Char('Domain')
|
||||
maximum_user_leads = fields.Integer('Leads Per Month')
|
||||
leads_count = fields.Integer('Assigned Leads', compute='_count_leads', help='Assigned Leads this last month')
|
||||
percentage_leads = fields.Float(compute='_get_percentage', string='Percentage leads')
|
||||
|
||||
@api.one
|
||||
def toggle_active(self):
|
||||
if isinstance(self.id, int): # if already saved
|
||||
self.running = not self.running
|
||||
|
||||
|
||||
class crm_team(osv.osv):
|
||||
_inherit = "crm.team"
|
||||
|
||||
@api.model
|
||||
def _get_default_team_id(self, user_id=None):
|
||||
team_id = super(crm_team, self)._get_default_team_id(user_id=user_id)
|
||||
if user_id is None:
|
||||
user_id = self.env.user.id
|
||||
if not team_id:
|
||||
team_id = self.search([('team_user_ids.user_id', '=', user_id)], limit=1).id
|
||||
return team_id
|
||||
|
||||
@api.one
|
||||
def _count_leads(self):
|
||||
if self.id:
|
||||
self.leads_count = self.env['crm.lead'].search_count([('team_id', '=', self.id)])
|
||||
else:
|
||||
self.leads_count = 0
|
||||
|
||||
@api.one
|
||||
def _assigned_leads(self):
|
||||
limit_date = datetime.datetime.now() - datetime.timedelta(days=30)
|
||||
domain = [('assign_date', '>=', fields.Datetime.to_string(limit_date)),
|
||||
('team_id', '=', self.id),
|
||||
('user_id', '!=', False)
|
||||
]
|
||||
self.assigned_leads = self.env['crm.lead'].search_count(domain)
|
||||
|
||||
@api.one
|
||||
def _unassigned_leads(self):
|
||||
self.unassigned_leads = self.env['crm.lead'].search_count(
|
||||
[('team_id', '=', self.id), ('user_id', '=', False), ('assign_date', '=', False)]
|
||||
)
|
||||
|
||||
@api.one
|
||||
def _capacity(self):
|
||||
self.capacity = sum(s.maximum_user_leads for s in self.team_user_ids)
|
||||
|
||||
@api.one
|
||||
@api.constrains('score_team_domain')
|
||||
def _assert_valid_domain(self):
|
||||
try:
|
||||
domain = safe_eval(self.score_team_domain or '[]', evaluation_context)
|
||||
self.env['crm.lead'].search(domain)
|
||||
except Exception:
|
||||
raise Warning('The domain is incorrectly formatted')
|
||||
|
||||
ratio = fields.Float(string='Ratio')
|
||||
score_team_domain = fields.Char('Domain')
|
||||
leads_count = fields.Integer(compute='_count_leads')
|
||||
assigned_leads = fields.Integer(compute='_assigned_leads')
|
||||
unassigned_leads = fields.Integer(compute='_unassigned_leads')
|
||||
capacity = fields.Integer(compute='_capacity')
|
||||
team_user_ids = fields.One2many('team.user', 'team_id', string='Salesman')
|
||||
min_for_assign = fields.Integer("Minimum score", help="Minimum score to be automatically assign (>=)", default=0, required=True)
|
||||
|
||||
@api.model
|
||||
def direct_assign_leads(self, ids=[]):
|
||||
ctx = dict(self._context, mail_notify_noemail=True)
|
||||
self.with_context(ctx)._assign_leads()
|
||||
|
||||
@api.model
|
||||
def dry_assign_leads(self, ids=[]):
|
||||
self._assign_leads(dry=True)
|
||||
|
||||
@api.model
|
||||
# Note: The dry mode assign only 50 leads per salesteam for speed issues
|
||||
def assign_leads_to_salesteams(self, all_salesteams, dry=False):
|
||||
shuffle(all_salesteams)
|
||||
haslead = True
|
||||
|
||||
while haslead:
|
||||
haslead = False
|
||||
for salesteam in all_salesteams:
|
||||
domain = safe_eval(salesteam['score_team_domain'], evaluation_context)
|
||||
domain.extend([('team_id', '=', False), ('user_id', '=', False)])
|
||||
domain.extend(['|', ('stage_id.on_change', '=', False), '&', ('stage_id.probability', '!=', 0), ('stage_id.probability', '!=', 100)])
|
||||
leads = self.env["crm.lead"].search(domain, limit=50)
|
||||
haslead = haslead or (len(leads) == 50 and not dry)
|
||||
|
||||
if not leads.exists():
|
||||
continue
|
||||
|
||||
if dry:
|
||||
for lead in leads:
|
||||
values = {'lead_id': lead.id, 'team_id': salesteam['id']}
|
||||
self.env['crm.leads.dry.run'].create(values)
|
||||
else:
|
||||
leads.write({'team_id': salesteam['id']})
|
||||
|
||||
# Erase fake/false email
|
||||
spams = map(lambda x: x.id, filter(lambda x: x.email_from and not checkmail(x.email_from), leads))
|
||||
|
||||
if spams:
|
||||
self.env["crm.lead"].browse(spams).write({'email_from': False})
|
||||
|
||||
# Merge duplicated lead
|
||||
leads_done = set()
|
||||
for lead in leads:
|
||||
if lead.id not in leads_done:
|
||||
leads_duplicated = lead.get_duplicated_leads(False)
|
||||
if len(leads_duplicated) > 1:
|
||||
self.env["crm.lead"].browse(leads_duplicated).merge_opportunity(False, False)
|
||||
leads_done.update(leads_duplicated)
|
||||
self._cr.commit()
|
||||
self._cr.commit()
|
||||
|
||||
@api.model
|
||||
def assign_leads_to_salesmen(self, all_team_users, dry=False):
|
||||
users = []
|
||||
for su in all_team_users:
|
||||
if (su.maximum_user_leads - su.leads_count) <= 0:
|
||||
continue
|
||||
domain = safe_eval(su.team_user_domain or '[]', evaluation_context)
|
||||
domain.extend([
|
||||
('user_id', '=', False),
|
||||
('assign_date', '=', False),
|
||||
('score', '>=', su.team_id.min_for_assign)
|
||||
])
|
||||
|
||||
# assignation rythm: 2 days of leads if a lot of leads should be assigned
|
||||
limit = int(math.ceil(su.maximum_user_leads / 15.0))
|
||||
|
||||
if dry:
|
||||
dry_leads = self.env["crm.leads.dry.run"].search([('team_id', '=', su.team_id.id)])
|
||||
domain.append(['id', 'in', dry_leads.mapped('lead_id.id')])
|
||||
else:
|
||||
domain.append(('team_id', '=', su.team_id.id))
|
||||
|
||||
leads = self.env["crm.lead"].search(domain, order='score desc', limit=limit * len(su.team_id.team_user_ids))
|
||||
users.append({
|
||||
"su": su,
|
||||
"nbr": min(su.maximum_user_leads - su.leads_count, limit),
|
||||
"leads": leads
|
||||
})
|
||||
|
||||
assigned = set()
|
||||
while users:
|
||||
i = 0
|
||||
|
||||
# statistically select the user that should receive the next lead
|
||||
idx = randint(0, reduce(lambda nbr, x: nbr + x['nbr'], users, 0) - 1)
|
||||
|
||||
while idx > users[i]['nbr']:
|
||||
idx -= users[i]['nbr']
|
||||
i += 1
|
||||
user = users[i]
|
||||
|
||||
# Get the first unassigned leads available for this user
|
||||
while user['leads'] and user['leads'][0] in assigned:
|
||||
user['leads'] = user['leads'][1:]
|
||||
if not user['leads']:
|
||||
del users[i]
|
||||
continue
|
||||
|
||||
# lead convert for this user
|
||||
lead = user['leads'][0]
|
||||
assigned.add(lead)
|
||||
if dry:
|
||||
values = {'lead_id': lead.id, 'team_id': user['su'].team_id.id, 'user_id': user['su'].user_id.id}
|
||||
self.env['crm.leads.dry.run'].create(values)
|
||||
else:
|
||||
# Assign date will be setted by write function
|
||||
data = {'user_id': user['su'].user_id.id}
|
||||
lead.write(data)
|
||||
|
||||
lead.convert_opportunity(lead.partner_id and lead.partner_id.id or None)
|
||||
self._cr.commit()
|
||||
|
||||
user['nbr'] -= 1
|
||||
if not user['nbr']:
|
||||
del users[i]
|
||||
|
||||
@api.model
|
||||
def _assign_leads(self, dry=False):
|
||||
# Emptying the table
|
||||
self._cr.execute("""
|
||||
TRUNCATE TABLE crm_leads_dry_run;
|
||||
""")
|
||||
|
||||
all_salesteams = self.search_read(fields=['score_team_domain'], domain=[('score_team_domain', '!=', False)])
|
||||
|
||||
all_team_users = self.env['team.user'].search([('running', '=', True)])
|
||||
|
||||
self.env['website.crm.score'].assign_scores_to_leads()
|
||||
|
||||
self.assign_leads_to_salesteams(all_salesteams, dry=dry)
|
||||
|
||||
# Compute score after assign to salesteam, because if a merge has been done, the score for leads is removed.
|
||||
self.env['website.crm.score'].assign_scores_to_leads()
|
||||
|
||||
self.assign_leads_to_salesmen(all_team_users, dry=dry)
|
||||
@@ -1,91 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from openerp import fields, models, api
|
||||
from openerp.tools.safe_eval import safe_eval
|
||||
from openerp.osv.expression import expression
|
||||
import datetime
|
||||
import logging
|
||||
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
evaluation_context = {
|
||||
'datetime': datetime,
|
||||
'context_today': datetime.datetime.now,
|
||||
}
|
||||
|
||||
|
||||
class website_crm_score(models.Model):
|
||||
_name = 'website.crm.score'
|
||||
|
||||
@api.one
|
||||
def _count_leads(self):
|
||||
if self.id:
|
||||
self._cr.execute("""
|
||||
SELECT COUNT(1)
|
||||
FROM crm_lead_score_rel
|
||||
WHERE score_id = %s
|
||||
""", (self.id,))
|
||||
self.leads_count = self._cr.fetchone()[0]
|
||||
else:
|
||||
self.leads_count = 0
|
||||
|
||||
@api.one
|
||||
@api.constrains('domain')
|
||||
def _assert_valid_domain(self):
|
||||
try:
|
||||
domain = safe_eval(self.domain or '[]', evaluation_context)
|
||||
self.env['crm.lead'].search(domain)
|
||||
except Exception as e:
|
||||
_logger.warning('Exception: %s' % (e,))
|
||||
raise Warning('The domain is incorrectly formatted')
|
||||
|
||||
name = fields.Char('Name', required=True)
|
||||
value = fields.Float('Value', required=True)
|
||||
domain = fields.Char('Domain', required=True)
|
||||
event_based = fields.Boolean(
|
||||
'Event-based rule',
|
||||
help='When checked, the rule will be re-evaluated every time, even for leads '
|
||||
'that have already been checked previously. This option incurs a large '
|
||||
'performance penalty, so it should be checked only for rules that depend '
|
||||
'on dynamic events',
|
||||
default=False
|
||||
)
|
||||
running = fields.Boolean('Active', default=True)
|
||||
leads_count = fields.Integer(compute='_count_leads')
|
||||
|
||||
# the default [] is needed for the function to be usable by the cron
|
||||
@api.model
|
||||
def assign_scores_to_leads(self, ids=[]):
|
||||
domain = [('running', '=', True)]
|
||||
if ids:
|
||||
domain.append(('id', 'in', ids))
|
||||
scores = self.search_read(domain=domain, fields=['domain'])
|
||||
for score in scores:
|
||||
domain = safe_eval(score['domain'], evaluation_context)
|
||||
|
||||
# Don't replace the domain with a 'not in' like below... that doesn't make the same thing !!!
|
||||
# domain.extend(['|', ('stage_id.on_change', '=', False), ('stage_id.probability', 'not in', [0,100])])
|
||||
domain.extend(['|', ('stage_id.on_change', '=', False), '&', ('stage_id.probability', '!=', 0), ('stage_id.probability', '!=', 100)])
|
||||
|
||||
e = expression(self._cr, self._uid, domain, self.pool['crm.lead'], self._context)
|
||||
where_clause, where_params = e.to_sql()
|
||||
|
||||
where_clause += """ AND (id NOT IN (SELECT lead_id FROM crm_lead_score_rel WHERE score_id = %s)) """
|
||||
where_params.append(score['id'])
|
||||
|
||||
if not self.event_based:
|
||||
# Only check leads that are newer than the last matching lead.
|
||||
# Could be based on a "last run date" for a more precise optimization
|
||||
where_clause += """ AND (id > (SELECT COALESCE(max(lead_id), 0)
|
||||
FROM crm_lead_score_rel WHERE score_id = %s)) """
|
||||
where_params.append(score['id'])
|
||||
|
||||
self._cr.execute("""INSERT INTO crm_lead_score_rel
|
||||
SELECT crm_lead.id as lead_id, %s as score_id
|
||||
FROM crm_lead
|
||||
WHERE %s RETURNING lead_id""" % (score['id'], where_clause), where_params)
|
||||
|
||||
# Force recompute of fields that depends on score_ids
|
||||
lead_ids = [resp[0] for resp in self._cr.fetchall()]
|
||||
leads = self.env["crm.lead"].browse(lead_ids)
|
||||
leads.modified(['score_ids'])
|
||||
leads.recompute()
|
||||
@@ -1,7 +0,0 @@
|
||||
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
|
||||
access_website_crm_score,access_website_crm_score,model_website_crm_score,,1,0,0,0
|
||||
access_website_crm_score_manager,access_website_crm_score_manager,model_website_crm_score,base.group_website_designer,1,1,1,1
|
||||
access_team_user,access_team_user,model_team_user,,1,0,0,0
|
||||
access_team_user_manager,access_team_user_manager,model_team_user,marketing.group_lead_automation_manager,1,1,1,1
|
||||
access_website_crm_pageview,access_website_crm_pageview,model_website_crm_pageview,,1,0,0,0
|
||||
access_website_crm_pageview_manager,access_website_crm_pageview_manager,model_website_crm_pageview,marketing.group_lead_automation_manager,1,1,1,1
|
||||
|
Binary file not shown.
|
Before Width: | Height: | Size: 22 KiB |
@@ -1,100 +0,0 @@
|
||||
odoo.define('website_crm_score.filters', function (require) {
|
||||
"use strict";
|
||||
|
||||
var kanban_widgets = require('web_kanban.widgets');
|
||||
|
||||
|
||||
var Filters = kanban_widgets.AbstractField.extend({
|
||||
/**
|
||||
bnf grammar of a filter:
|
||||
<filter> ::= <expr>
|
||||
<expr> ::= <tuple> | '!' <expr> | <bin_op> <expr> <expr>
|
||||
<bin_op> ::= '&' | '|'
|
||||
<tuple> ::= '(' <field_name> ',' <operator> ',' <field_value> ')'
|
||||
<operator> ::= '=' | '!=' | '<=' | '<' | '>' | '>=' | '=?' |
|
||||
'=like' | '=ilike' | 'like' | 'not like' |
|
||||
'ilike' | 'not ilike' | 'in' | 'not in' | 'child_of'
|
||||
some operators are negative
|
||||
*/
|
||||
NEG_OP: ['!=', 'not like', 'not ilike', 'not in'],
|
||||
MAX_LEN: 5,
|
||||
start: function() {
|
||||
var val = this.field.raw_value;
|
||||
var self = this;
|
||||
if (val) {
|
||||
// This widget is temporary
|
||||
// To keep only while the widget domain filter doesn't exist !
|
||||
|
||||
// Ugly hack to have (more) python domains which can be evaluated in JS
|
||||
val = val.replace('(', '[').replace(')', ']').replace('False', 'false').replace('True', 'true')
|
||||
try {
|
||||
val = eval(val);
|
||||
}
|
||||
catch(err) {
|
||||
// don't block UI if domain is not evaluable in JS
|
||||
console.debug(err.message);
|
||||
val = [['error','=', err.message]];
|
||||
}
|
||||
if (val.length <= this.MAX_LEN) {
|
||||
var i = 0;
|
||||
while (i < val.length) {
|
||||
var res = this.interpret(val, i);
|
||||
i = res[0];
|
||||
var $span = res[1];
|
||||
self.$el.append($span);
|
||||
}
|
||||
}
|
||||
else {
|
||||
var $span = '<span class="badge" style="background-color:#fce9e9;">Domain too big<span>';
|
||||
self.$el.append($span);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
interpret: function(val, i) {
|
||||
var a = val[i];
|
||||
if(typeof a !== 'string'){
|
||||
// a is a tuple (field, op, value)
|
||||
var tag = a[0]; // field name
|
||||
var tip = a[2]; // field value
|
||||
if (this.NEG_OP.indexOf(a[1]) !== -1){
|
||||
// op in NEG_OP
|
||||
tip = 'not ' + tip;
|
||||
}
|
||||
var span = '<span class="badge" title="' + tip + '">'+ tag +'</span>';
|
||||
return [i+1, span];
|
||||
}
|
||||
else if (a === '!'){
|
||||
var res = this.interpret(val, i+1);
|
||||
var span = '<span class="badge">!</span>' + res[1];
|
||||
return [res[0], span];
|
||||
}
|
||||
else {
|
||||
// binary operator
|
||||
var res = this.binary_operator(val, i);
|
||||
return res;
|
||||
}
|
||||
return [i+1, ''];
|
||||
},
|
||||
|
||||
binary_operator: function(val, i) {
|
||||
var resA = this.interpret(val, i+1);
|
||||
var resB = this.interpret(val, resA[0]);
|
||||
var label = '';
|
||||
var op = '';
|
||||
if (val[i] === '|') {
|
||||
label = 'label-success';
|
||||
op = ' or ';
|
||||
}
|
||||
else if (val[i] === '&') {
|
||||
label = 'label-primary';
|
||||
op = ' and ';
|
||||
}
|
||||
var span = resA[1] + resB[1];
|
||||
return [resB[0], span];
|
||||
}
|
||||
});
|
||||
|
||||
kanban_widgets.registry.add('filters', Filters);
|
||||
|
||||
});
|
||||
@@ -1,66 +0,0 @@
|
||||
odoo.define('website_crm_score.set_score', function (require) {
|
||||
"use strict";
|
||||
|
||||
var ajax = require('web.ajax');
|
||||
var Model = require('web.Model');
|
||||
var seo = require('website.seo');
|
||||
var base = require('web_editor.base');
|
||||
var core = require('web.core');
|
||||
|
||||
var qweb = core.qweb;
|
||||
|
||||
ajax.loadXML('/website_crm_score/static/src/xml/track_page.xml', qweb);
|
||||
|
||||
seo.Configurator.include({
|
||||
track: null,
|
||||
start: function() {
|
||||
this._super.apply(this, arguments);
|
||||
var self = this;
|
||||
var obj = seo.Configurator.prototype.getMainObject();
|
||||
// only display checkbox for website page
|
||||
if (obj && obj.model === 'ir.ui.view') {
|
||||
this.is_tracked().then(function(data){
|
||||
var add = $('<input type="checkbox" required="required"/>');
|
||||
if (data[0]['track']) {
|
||||
add.attr('checked','checked');
|
||||
self.track = true;
|
||||
}
|
||||
else {
|
||||
self.track = false;
|
||||
}
|
||||
self.$el.find('h3[class="track-page"]').append(add);
|
||||
});
|
||||
}
|
||||
},
|
||||
is_tracked: function(val) {
|
||||
var obj = seo.Configurator.prototype.getMainObject();
|
||||
if (!obj) {
|
||||
return $.Deferred().reject();
|
||||
} else {
|
||||
return new Model(obj.model).call('read', [[obj.id], ['track'], base.get_context()]);
|
||||
}
|
||||
},
|
||||
update: function () {
|
||||
var self = this;
|
||||
var mysuper = this._super;
|
||||
var checkbox_value = this.$el.find('input[type="checkbox"]').is(':checked');
|
||||
if (checkbox_value != self.track) {
|
||||
this.trackPage(checkbox_value).then(function() {
|
||||
mysuper.call(self);
|
||||
});
|
||||
}
|
||||
else {
|
||||
mysuper.call(self);
|
||||
}
|
||||
},
|
||||
trackPage: function(val) {
|
||||
var obj = seo.Configurator.prototype.getMainObject();
|
||||
if (!obj) {
|
||||
return $.Deferred().reject();
|
||||
} else {
|
||||
return new Model(obj.model).call('write', [[obj.id], { track: val }, base.get_context()]);
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
});
|
||||
@@ -1,18 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<templates id="template" xml:space="preserve">
|
||||
|
||||
|
||||
<t t-extend="website.seo_configuration">
|
||||
<t t-jquery="div.modal-body" t-operation="append">
|
||||
<t t-if="widget.getMainObject() && widget.getMainObject().model === 'ir.ui.view'">
|
||||
<section class="set_score">
|
||||
<h3 class="track-page">4. Track Page <small>to better score your leads: </small>
|
||||
<!-- checkbox is added in js in set_score.js -->
|
||||
</h3>
|
||||
</section>
|
||||
</t>
|
||||
</t>
|
||||
</t>
|
||||
|
||||
</templates>
|
||||
|
||||
@@ -1,2 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from . import test_assign, test_dry_run, test_pageview
|
||||
@@ -1,153 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from openerp.tests import common
|
||||
|
||||
from mock import Mock
|
||||
|
||||
|
||||
class TestScoring(common.TransactionCase):
|
||||
|
||||
def setUp(self):
|
||||
|
||||
|
||||
super(TestScoring, self).setUp()
|
||||
cr, uid = self.cr, self.uid
|
||||
|
||||
cr.commit = Mock(return_value=None)
|
||||
|
||||
# empty tables before testing to only use test records
|
||||
cr.execute("""
|
||||
UPDATE res_partner SET team_id=NULL;
|
||||
""")
|
||||
cr.execute("""
|
||||
TRUNCATE TABLE team_user;
|
||||
""")
|
||||
cr.execute("""
|
||||
DELETE FROM crm_team;
|
||||
""")
|
||||
cr.execute("""
|
||||
DELETE FROM crm_lead;
|
||||
""")
|
||||
cr.execute("""
|
||||
DELETE FROM website_crm_score;
|
||||
""")
|
||||
cr.execute("""
|
||||
DELETE FROM website_crm_pageview;
|
||||
""")
|
||||
|
||||
# Usefull models
|
||||
self.crm_lead = self.registry('crm.lead')
|
||||
self.crm_leads_dry_run = self.registry('crm.leads.dry.run')
|
||||
self.pageview = self.registry('website.crm.pageview')
|
||||
self.website_crm_score = self.registry('website.crm.score')
|
||||
self.team = self.registry('crm.team')
|
||||
self.res_users = self.registry('res.users')
|
||||
self.team_user = self.registry('team.user')
|
||||
self.country = self.registry('res.country')
|
||||
self.crm_stage = self.registry('crm.stage')
|
||||
|
||||
self.belgium = self.country.search(cr, uid, [('name', '=', 'Belgium')])[0]
|
||||
self.france = self.country.search(cr, uid, [('name', '=', 'France')])[0]
|
||||
|
||||
self.stage = self.crm_stage.create(cr, uid, {
|
||||
'name': 'testing',
|
||||
'probability': '50',
|
||||
'on_change': False,
|
||||
})
|
||||
|
||||
# Lead Data
|
||||
self.lead0 = self.crm_lead.create(cr, uid, {
|
||||
'name': 'lead0',
|
||||
'country_id': self.belgium,
|
||||
'email_from': 'lead0@test.com',
|
||||
'user_id': None,
|
||||
'team_id': False,
|
||||
'stage_id': self.stage,
|
||||
|
||||
})
|
||||
self.lead1 = self.crm_lead.create(cr, uid, {
|
||||
'name': 'lead1',
|
||||
'country_id': self.france,
|
||||
'email_from': 'lead1@test.com',
|
||||
'user_id': None,
|
||||
'team_id': False,
|
||||
'stage_id': self.stage,
|
||||
})
|
||||
self.lead2 = self.crm_lead.create(cr, uid, {
|
||||
'name': 'lead2',
|
||||
'email_from': 'lead2@test.com',
|
||||
'user_id': None,
|
||||
'team_id': False,
|
||||
'stage_id': self.stage,
|
||||
})
|
||||
|
||||
# PageView
|
||||
self.pageview0 = self.pageview.create(cr, uid, {
|
||||
'lead_id': self.lead0,
|
||||
'url': 'url0',
|
||||
})
|
||||
self.pageview0 = self.pageview.create(cr, uid, {
|
||||
'lead_id': self.lead1,
|
||||
'url': 'url1',
|
||||
})
|
||||
|
||||
# Salesteam
|
||||
self.team0 = self.team.create(cr, uid, {
|
||||
'name': 'team0',
|
||||
'code': 'S0',
|
||||
'score_team_domain': [('country_id', '=', 'Belgium')],
|
||||
})
|
||||
self.team1 = self.team.create(cr, uid, {
|
||||
'name': 'team1',
|
||||
'code': 'S1',
|
||||
'score_team_domain': [('country_id', '=', 'France')],
|
||||
})
|
||||
|
||||
# Salesmen
|
||||
self.salesmen0 = self.res_users.create(cr, uid, {
|
||||
'name': 'salesmen0',
|
||||
'login': 'salesmen0',
|
||||
'alias_name': 'salesmen0',
|
||||
'email': 'salesmen0@example.com',
|
||||
# 'groups_id': [(6, 0, [self.group_employee_id])]
|
||||
}, {'no_reset_password': True})
|
||||
self.salesmen1 = self.res_users.create(cr, uid, {
|
||||
'name': 'salesmen1',
|
||||
'login': 'salesmen1',
|
||||
'alias_name': 'salesmen1',
|
||||
'email': 'salesmen1@example.com',
|
||||
# 'groups_id': [(6, 0, [self.group_employee_id])]
|
||||
}, {'no_reset_password': True})
|
||||
|
||||
# team_user
|
||||
self.team_user0 = self.team_user.create(cr, uid, {
|
||||
'user_id': self.salesmen0,
|
||||
'team_id': self.team0,
|
||||
'maximum_user_leads': 1,
|
||||
'team_user_domain': [('country_id', '=', 'Belgium')],
|
||||
})
|
||||
self.team_user1 = self.team_user.create(cr, uid, {
|
||||
'user_id': self.salesmen1,
|
||||
'team_id': self.team0,
|
||||
'maximum_user_leads': 0,
|
||||
'team_user_domain': [('country_id', '=', 'France')],
|
||||
})
|
||||
self.team_user2 = self.team_user.create(cr, uid, {
|
||||
'user_id': self.salesmen1,
|
||||
'team_id': self.team1,
|
||||
'maximum_user_leads': 1,
|
||||
})
|
||||
|
||||
# Score
|
||||
self.score0 = self.website_crm_score.create(cr, uid, {
|
||||
'name': 'score0',
|
||||
'value': 1000,
|
||||
'domain': "[('score_pageview_ids.url', '=', 'url0')]",
|
||||
})
|
||||
self.score1 = self.website_crm_score.create(cr, uid, {
|
||||
'name': 'score1',
|
||||
'value': 900,
|
||||
'domain': "[('score_pageview_ids.url', '=', 'url1')]",
|
||||
})
|
||||
|
||||
def tearDown(self):
|
||||
super(TestScoring, self).tearDown()
|
||||
@@ -1,35 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from openerp.addons.website_crm_score.tests.common import TestScoring
|
||||
from openerp.tools import mute_logger
|
||||
|
||||
|
||||
class test_assign(TestScoring):
|
||||
|
||||
@mute_logger('openerp.addons.base.ir.ir_model', 'openerp.models')
|
||||
def test_00_assign(self):
|
||||
cr, uid = self.cr, self.uid
|
||||
# scoring
|
||||
self.website_crm_score.assign_scores_to_leads(cr, uid)
|
||||
|
||||
l0 = self.crm_lead.read(cr, uid, self.lead0, ['score'], None)
|
||||
l1 = self.crm_lead.read(cr, uid, self.lead1, ['score'], None)
|
||||
l2 = self.crm_lead.read(cr, uid, self.lead2, ['score'], None)
|
||||
|
||||
self.assertEqual(l0['score'], 1000, 'scoring failed')
|
||||
self.assertEqual(l1['score'], 900, 'scoring failed')
|
||||
self.assertEqual(l2['score'], 0, 'scoring failed')
|
||||
|
||||
# assignation
|
||||
self.team.direct_assign_leads(cr, uid, None)
|
||||
|
||||
l0 = self.crm_lead.read(cr, uid, self.lead0, ['team_id', 'user_id'], None)
|
||||
l1 = self.crm_lead.read(cr, uid, self.lead1, ['team_id', 'user_id'], None)
|
||||
l2 = self.crm_lead.read(cr, uid, self.lead2, ['team_id', 'user_id'], None)
|
||||
|
||||
self.assertEqual(l0['team_id'][0], self.team0, 'assignation failed')
|
||||
self.assertEqual(l1['team_id'][0], self.team1, 'assignation failed')
|
||||
self.assertEqual(l2['team_id'], False, 'assignation failed')
|
||||
|
||||
self.assertEqual(l0['user_id'][0], self.salesmen0, 'assignation failed')
|
||||
self.assertEqual(l1['user_id'][0], self.salesmen1, 'assignation failed')
|
||||
self.assertEqual(l2['user_id'], False, 'assignation failed')
|
||||
@@ -1,66 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from openerp.addons.website_crm_score.tests.common import TestScoring
|
||||
from openerp.tools import mute_logger
|
||||
|
||||
|
||||
class test_dry_run(TestScoring):
|
||||
|
||||
@mute_logger('openerp.addons.base.ir.ir_model', 'openerp.models')
|
||||
def test_00_dry_run(self):
|
||||
cr, uid = self.cr, self.uid
|
||||
|
||||
# scoring
|
||||
self.website_crm_score.assign_scores_to_leads(cr, uid)
|
||||
|
||||
l0 = self.crm_lead.read(cr, uid, self.lead0, ['score'], None)
|
||||
l1 = self.crm_lead.read(cr, uid, self.lead1, ['score'], None)
|
||||
l2 = self.crm_lead.read(cr, uid, self.lead2, ['score'], None)
|
||||
|
||||
self.assertEqual(l0['score'], 1000, 'scoring failed')
|
||||
self.assertEqual(l1['score'], 900, 'scoring failed')
|
||||
self.assertEqual(l2['score'], 0, 'scoring failed')
|
||||
|
||||
# dry run
|
||||
self.team.dry_assign_leads(cr, uid, None)
|
||||
|
||||
fields = ['team_id', 'user_id', 'lead_id']
|
||||
|
||||
dr0_sect = self.crm_leads_dry_run.search_read(cr, uid, [('lead_id', '=', self.lead0), ('user_id', '=', False)], fields)[0]
|
||||
dr0_user = self.crm_leads_dry_run.search_read(cr, uid, [('lead_id', '=', self.lead0), ('user_id', '!=', False)], fields)[0]
|
||||
|
||||
dr1_sect = self.crm_leads_dry_run.search_read(cr, uid, [('lead_id', '=', self.lead1), ('user_id', '=', False)], fields)[0]
|
||||
dr1_user = self.crm_leads_dry_run.search_read(cr, uid, [('lead_id', '=', self.lead1), ('user_id', '!=', False)], fields)[0]
|
||||
|
||||
dr2 = self.crm_leads_dry_run.search_read(cr, uid, [('lead_id', '=', self.lead2)], fields)
|
||||
|
||||
self.assertEqual(dr0_sect['team_id'][0], self.team0, 'dry run failed')
|
||||
self.assertEqual(dr0_user['team_id'][0], self.team0, 'dry run failed')
|
||||
self.assertEqual(dr0_user['user_id'][0], self.salesmen0, 'dry run failed')
|
||||
|
||||
self.assertEqual(dr1_sect['team_id'][0], self.team1, 'dry run failed')
|
||||
self.assertEqual(dr1_user['team_id'][0], self.team1, 'dry run failed')
|
||||
self.assertEqual(dr1_user['user_id'][0], self.salesmen1, 'dry run failed')
|
||||
|
||||
self.assertEqual(dr2, [], 'dry run failed')
|
||||
|
||||
ldr = self.crm_leads_dry_run.search_count(cr, uid, [], None)
|
||||
self.assertEqual(ldr, 4, 'wrong number of dry run created')
|
||||
|
||||
# assignement after dry run
|
||||
self.crm_leads_dry_run.assign_leads(cr, uid, None)
|
||||
|
||||
l0 = self.crm_lead.read(cr, uid, self.lead0, ['team_id', 'user_id'], None)
|
||||
l1 = self.crm_lead.read(cr, uid, self.lead1, ['team_id', 'user_id'], None)
|
||||
l2 = self.crm_lead.read(cr, uid, self.lead2, ['team_id', 'user_id'], None)
|
||||
|
||||
self.assertEqual(l0['team_id'][0], self.team0, 'assignation failed')
|
||||
self.assertEqual(l1['team_id'][0], self.team1, 'assignation failed')
|
||||
self.assertEqual(l2['team_id'], False, 'assignation failed')
|
||||
|
||||
self.assertEqual(l0['user_id'][0], self.salesmen0, 'assignation failed')
|
||||
self.assertEqual(l1['user_id'][0], self.salesmen1, 'assignation failed')
|
||||
self.assertEqual(l2['user_id'], False, 'assignation failed')
|
||||
|
||||
ldr = self.crm_leads_dry_run.search_count(cr, uid, [], None)
|
||||
|
||||
self.assertEqual(ldr, 0, 'dry run not removed correctly')
|
||||
@@ -1,26 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from openerp.addons.website_crm_score.tests.common import TestScoring
|
||||
from psycopg2 import IntegrityError
|
||||
from openerp.tools import mute_logger
|
||||
|
||||
|
||||
class test_assign(TestScoring):
|
||||
|
||||
@mute_logger('openerp.addons.base.ir.ir_model', 'openerp.models')
|
||||
def test_00_pageview(self):
|
||||
cr, uid = self.cr, self.uid
|
||||
|
||||
right_lead = self.pageview.create_pageview(cr, uid, {'lead_id': self.lead0, 'url': 'url2'}, test=True)
|
||||
self.assertTrue(right_lead, 'create_pageview should have succeded')
|
||||
|
||||
pg0 = self.pageview.search_read(cr, uid, [('lead_id', '=', self.lead0), ('url', '=', 'url2')], ['view_date'])
|
||||
self.assertNotEqual(pg0, [], 'pageview was not created')
|
||||
|
||||
update_lead = self.pageview.create_pageview(cr, uid, {'lead_id': self.lead0, 'url': 'url2'}, test=True)
|
||||
self.assertTrue(update_lead, 'create_pageview should have updated the lead')
|
||||
|
||||
|
||||
self.assertFalse(
|
||||
self.pageview.create_pageview(cr, uid, {'lead_id': -1, 'url': 'url2'}, test=True),
|
||||
'create_pageview should not works with unexisting lead id'
|
||||
)
|
||||
@@ -1,307 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<openerp>
|
||||
|
||||
<data>
|
||||
|
||||
<!-- Scheduler for Lead Scoring and Assignation -->
|
||||
<record forcecreate="True" id="ir_cron_lead_assign" model="ir.cron">
|
||||
<field name="name">Lead Assignation</field>
|
||||
<field eval="False" name="active" />
|
||||
<field name="user_id" ref="base.user_root" />
|
||||
<field name="interval_number">1</field>
|
||||
<field name="interval_type">days</field>
|
||||
<field name="numbercall">-1</field>
|
||||
<field eval="False" name="doall" />
|
||||
<field eval="'crm.team'" name="model" />
|
||||
<field eval="'direct_assign_leads'" name="function" />
|
||||
</record>
|
||||
|
||||
<!-- Scheduler for Lead Scoring -->
|
||||
<record forcecreate="True" id="ir_cron_lead_scoring" model="ir.cron">
|
||||
<field name="name">Lead Scoring </field>
|
||||
<field eval="False" name="active" />
|
||||
<field name="user_id" ref="base.user_root" />
|
||||
<field name="interval_number">1</field>
|
||||
<field name="interval_type">hours</field>
|
||||
<field name="numbercall">-1</field>
|
||||
<field eval="False" name="doall" />
|
||||
<field eval="'website.crm.score'" name="model" />
|
||||
<field eval="'assign_scores_to_leads'" name="function" />
|
||||
</record>
|
||||
|
||||
<record id="action_score_now" model="ir.actions.server">
|
||||
<field name="name">Apply marked scores</field>
|
||||
<field name="model_id" ref="model_website_crm_score"/>
|
||||
<field name="state">code</field>
|
||||
<field name="code">
|
||||
self.assign_scores_to_leads(cr, uid, context['active_ids'], context)
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="ir_action_score_now" model="ir.values">
|
||||
<field eval="'client_action_multi'" name="key2"/>
|
||||
<field eval="'website.crm.score'" name="model"/>
|
||||
<field name="name">Apply marked scores</field>
|
||||
<field eval="'ir.actions.server,%d'%action_score_now" name="value"/>
|
||||
</record>
|
||||
|
||||
<!-- Score Menu Item -->
|
||||
<menuitem id="leads_menu" name="Leads Management" parent="base.menu_base_partner" groups="marketing.group_lead_automation_manager" sequence="98"/>
|
||||
|
||||
<!-- Action to display the leads that have a particular score -->
|
||||
<record model="ir.actions.act_window" id="score_leads">
|
||||
<field name="name">Leads</field>
|
||||
<field name="res_model">crm.lead</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="domain">[('score_ids', 'in', active_id)]</field>
|
||||
</record>
|
||||
|
||||
<!-- Score Form View -->
|
||||
<record model="ir.ui.view" id="view_crm_score_form">
|
||||
<field name="name">Website Crm Score Form</field>
|
||||
<field name="model">website.crm.score</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Scores">
|
||||
<sheet>
|
||||
<div class="oe_button_box" name="button_box">
|
||||
<button class="oe_stat_button" type="action"
|
||||
name="%(score_leads)d" icon="fa-tags"
|
||||
>
|
||||
<field string="Leads" name="leads_count" widget="statinfo"/>
|
||||
</button>
|
||||
</div>
|
||||
<div class="oe_title">
|
||||
<h1>
|
||||
<field name="name"/>
|
||||
</h1>
|
||||
</div>
|
||||
<group>
|
||||
<field name="value"/>
|
||||
<field name="domain"/>
|
||||
<field name="event_based"/>
|
||||
<field name="running"/>
|
||||
</group>
|
||||
<button name="assign_scores_to_leads" type="object" string=" Score Now" class="oe_link"/>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- Score Tree View -->
|
||||
<record model="ir.ui.view" id="view_crm_score_tree">
|
||||
<field name="name">Website Crm Score Tree</field>
|
||||
<field name="model">website.crm.score</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Scores">
|
||||
<field name="name"/>
|
||||
<field name="value"/>
|
||||
<field name="leads_count"/>
|
||||
<field name="domain"/>
|
||||
<field name="running"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- Score Action - tree - form -->
|
||||
<record model="ir.actions.act_window" id="score_action">
|
||||
<field name="name">Scores</field>
|
||||
<field name="res_model">website.crm.score</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
</record>
|
||||
|
||||
<!-- Score Menu Item -->
|
||||
<menuitem id="scores_menu" name="Scoring Rules" parent="leads_menu" action="score_action" />
|
||||
|
||||
<!--
|
||||
TEAM USER
|
||||
-->
|
||||
<!-- Team User From View -->
|
||||
<record model="ir.ui.view" id="view_crm_team_user_form">
|
||||
<field name="name">Team User Form</field>
|
||||
<field name="model">team.user</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Sales Men">
|
||||
<sheet>
|
||||
<h1>
|
||||
<field name="user_id"/>
|
||||
</h1>
|
||||
<group>
|
||||
<field name="team_id" readonly="context.get('ro_team', False)"/>
|
||||
<label for="maximum_user_leads" String="Maximum Leads / 30 days" />
|
||||
<div>
|
||||
<field name="maximum_user_leads" class="oe_inline"/>
|
||||
</div>
|
||||
<!--<field name="team_user_domain" widget="char_domain" options="{'model': 'crm.lead'}"/>-->
|
||||
<field name="team_user_domain" />
|
||||
</group>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- team User Tree View -->
|
||||
<record model="ir.ui.view" id="view_crm_team_user_tree">
|
||||
<field name="name">Team User Tree</field>
|
||||
<field name="model">team.user</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Sales Men">
|
||||
<field name="team_id"/>
|
||||
<field name="user_id"/>
|
||||
<field name="maximum_user_leads"/>
|
||||
<field name="leads_count"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- Team User Kanban View -->
|
||||
<record model="ir.ui.view" id="team_user_kanban">
|
||||
<field name="name">team.user.kanban</field>
|
||||
<field name="model">team.user</field>
|
||||
<field name="arch" type="xml">
|
||||
<kanban quick_create="false" create="true">
|
||||
<field name="user_id"/>
|
||||
<field name="running"/>
|
||||
<templates>
|
||||
<t t-name="kanban-box">
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<ul>
|
||||
<li>
|
||||
<a type="open">
|
||||
<img t-att-src="kanban_image('res.users', 'image_small', record.user_id.raw_value)" class="oe_kanban_image"/>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<div style='text-align: center; padding: 4px;'>
|
||||
<t t-if="record.running.raw_value === true">
|
||||
<button name="toggle_active" type="object" style="
|
||||
color: #eeeeee;
|
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#3faf3f), to(#1a721a));">
|
||||
<span class="fa fa-check"/>
|
||||
</button>
|
||||
</t>
|
||||
<t t-if="record.running.raw_value === false">
|
||||
<button name="toggle_active" type="object" style="
|
||||
color: #eeeeee;
|
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#df3f3f), to(#a21a1a));">
|
||||
<span class="fa fa-times"/>
|
||||
</button>
|
||||
</t>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</td>
|
||||
<td>
|
||||
<div class="oe_kanban_details">
|
||||
<table>
|
||||
<tr>
|
||||
<td style='width: 240px'>
|
||||
<ul>
|
||||
<li><a type="open">
|
||||
<b><field name="name"/></b>
|
||||
</a></li>
|
||||
<li><a type="open">
|
||||
<field name="team_id"/>
|
||||
</a></li>
|
||||
</ul>
|
||||
</td>
|
||||
<td>
|
||||
<field name="maximum_user_leads" invisible="1"/>
|
||||
<field name="leads_count" widget="gauge"
|
||||
style="width:108px; height: 81px; cursor: pointer;"
|
||||
options="{'max_field': 'maximum_user_leads'}"/>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</t>
|
||||
</templates>
|
||||
</kanban>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- Team User Action - form - tree -->
|
||||
<record model="ir.actions.act_window" id="team_user_action">
|
||||
<field name="name">Sales Men</field>
|
||||
<field name="res_model">team.user</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">kanban,tree,form</field>
|
||||
<field name="help" type="html">
|
||||
<p class="oe_view_nocontent_create">
|
||||
Click to create a salesmen.
|
||||
</p>
|
||||
<p>
|
||||
Link users to salesteam, set a per 30 days lead capacity for each of them and set filters to auto assign your leads.
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- Team User Menu Item -->
|
||||
<menuitem id="team_user" name="Leads Assignation" parent="leads_menu" action="team_user_action" />
|
||||
|
||||
<!-- TEAM -->
|
||||
<!-- Team Action - form - tree -->
|
||||
<record model="ir.actions.act_window" id="team_action">
|
||||
<field name="name">Sales Teams</field>
|
||||
<field name="res_model">crm.team</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
</record>
|
||||
|
||||
<!-- Team User Menu Item -->
|
||||
<menuitem id="team" name="Teams Assignation" parent="leads_menu" action="team_action" />
|
||||
|
||||
|
||||
<!-- LEAD DRY RUN -->
|
||||
<!-- Lead dry run From View -->
|
||||
<record model="ir.ui.view" id="view_crm_lead_dry_run_form">
|
||||
<field name="name">Assignation Dry Run Form</field>
|
||||
<field name="model">crm.leads.dry.run</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Assignation Dry Run">
|
||||
<sheet>
|
||||
<h1>
|
||||
<field name="lead_id"/>
|
||||
</h1>
|
||||
<group>
|
||||
<field name="team_id"/>
|
||||
<field name="user_id"/>
|
||||
</group>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- Lead dry run Tree View -->
|
||||
<record model="ir.ui.view" id="view_lead_dry_run_tree">
|
||||
<field name="name">Assignation Dry Run tree</field>
|
||||
<field name="model">crm.leads.dry.run</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Assignation Dry Run">
|
||||
<field name="lead_id"/>
|
||||
<field name="team_id"/>
|
||||
<field name="user_id"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- Lead dry run Action - form - tree -->
|
||||
<record model="ir.actions.act_window" id="lead_dry_run_action">
|
||||
<field name="name">Assignation dry run</field>
|
||||
<field name="res_model">crm.leads.dry.run</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
</record>
|
||||
|
||||
<!-- Team User Menu Item -->
|
||||
<menuitem id="leads_dry_run" name="Assignation dry run" parent="leads_menu" action="lead_dry_run_action" groups="base.group_no_one"/>
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
@@ -1,79 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<openerp>
|
||||
|
||||
<data>
|
||||
|
||||
<!--
|
||||
PAGEVIEW
|
||||
-->
|
||||
<!-- PageView Search Filter on lead_id -->
|
||||
<record id="crm_score_pageview_filter" model="ir.ui.view">
|
||||
<field name="name">Website crm score pageviews</field>
|
||||
<field name="model">website.crm.pageview</field>
|
||||
<field name="arch" type="xml">
|
||||
<search string="Search PageViews">
|
||||
<field name="lead_id"/>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- PageView Form View -->
|
||||
<record model="ir.ui.view" id="crm_score_pageview_form">
|
||||
<field name="name">website.crm.pageview.form</field>
|
||||
<field name="model">website.crm.pageview</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Page Views">
|
||||
<sheet>
|
||||
<h1>
|
||||
<field name="url"/>
|
||||
</h1>
|
||||
<group>
|
||||
<field name="lead_id"/>
|
||||
<field name="user_id"/>
|
||||
<field name="view_date"/>
|
||||
</group>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- PageView Graph View -->
|
||||
<record model="ir.ui.view" id="crm_score_pageview_graph">
|
||||
<field name="name">website.crm.pageview.graph</field>
|
||||
<field name="model">website.crm.pageview</field>
|
||||
<field name="arch" type="xml">
|
||||
<graph string="Page Views" type="bar">
|
||||
<field name="url"/>
|
||||
</graph>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- PageView Tree View -->
|
||||
<record model="ir.ui.view" id="website_crm_pageview_tree">
|
||||
<field name="name">Website Pages Tree</field>
|
||||
<field name="model">website.crm.pageview</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Page Views">
|
||||
<field name="lead_id"/>
|
||||
<field name="user_id"/>
|
||||
<field name="url"/>
|
||||
<field name="view_date"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- PageView Action - tree - form - graph -->
|
||||
<record model="ir.actions.act_window" id="website_crm_score_pageviews">
|
||||
<field name="name">Website Pages</field>
|
||||
<field name="res_model">website.crm.pageview</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree,form,graph</field>
|
||||
<field name="search_view_id" ref="crm_score_pageview_filter"/>
|
||||
</record>
|
||||
|
||||
<!-- PageView Menu Item -->
|
||||
<menuitem id="pageview_menu" name="Scoring Page Views" parent="base.menu_sale_report" action="website_crm_score_pageviews" sequence="99"/>
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
@@ -1,259 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<openerp>
|
||||
|
||||
<data>
|
||||
|
||||
<!--
|
||||
LEADS
|
||||
-->
|
||||
<!-- Crm Lead Search Filter - Language added -->
|
||||
<record model="ir.ui.view" id="view_crm_case_leads_filter_inherit">
|
||||
<field name="name">crm.lead.search.inherit</field>
|
||||
<field name="model">crm.lead</field>
|
||||
<field name="inherit_id" ref="crm.view_crm_case_leads_filter" />
|
||||
<field name="arch" type="xml">
|
||||
<field name="country_id" position="after">
|
||||
<field name="lang_id"/>
|
||||
<field name="score_ids"/>
|
||||
</field>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- Crm Lead Tree View - Score and Salesman added -->
|
||||
<record model="ir.ui.view" id="lead_tree_view">
|
||||
<field name="name">crm.lead.tree.inherit</field>
|
||||
<field name="model">crm.lead</field>
|
||||
<field name="inherit_id" ref="crm.crm_case_tree_view_leads" />
|
||||
<field name="arch" type="xml">
|
||||
<field name="phone" position="after">
|
||||
<field name="score" />
|
||||
</field>
|
||||
<field name="team_id" position="after">
|
||||
<field name="user_id" />
|
||||
</field>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- Crm Lead Form View - PageViews, Score and Language added -->
|
||||
<record model="ir.ui.view" id="lead_score_form">
|
||||
<field name="name">crm.lead.form.inherit</field>
|
||||
<field name="model">crm.lead</field>
|
||||
<field name="inherit_id" ref="crm.crm_case_form_view_leads" />
|
||||
<field name="arch" type="xml">
|
||||
<div name="button_box" position="inside">
|
||||
<button class="oe_stat_button" type="action"
|
||||
name="%(website_crm_score_pageviews)d" icon="fa-tags"
|
||||
context="{'search_default_lead_id': active_id, 'default_lead_id': active_id}">
|
||||
<field string="Page views" name="pageviews_count" widget="statinfo"/>
|
||||
</button>
|
||||
</div>
|
||||
<field name="priority" position="after">
|
||||
<field name="score" />
|
||||
</field>
|
||||
<xpath expr="//group[@name='misc']" position="after">
|
||||
<group string="Scoring">
|
||||
<field name="score_ids"
|
||||
widget="many2many_tags"
|
||||
domain="[('object_id.model','=','crm.lead')]"
|
||||
context="{'object_name': 'crm.lead'}"
|
||||
readonly="1"
|
||||
/>
|
||||
<field name="lang_id" readonly="1"/>
|
||||
</group>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="score_opp_tree_view">
|
||||
<field name="name">crm.lead.tree.opp.score.inherit</field>
|
||||
<field name="model">crm.lead</field>
|
||||
<field name="inherit_id" ref="crm.crm_case_tree_view_oppor" />
|
||||
<field name="arch" type="xml">
|
||||
<field name="team_id" position="after">
|
||||
<field name="score" />
|
||||
</field>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="score_opp_form_view">
|
||||
<field name="name">crm.lead.form.opp.score.inherit</field>
|
||||
<field name="model">crm.lead</field>
|
||||
<field name="inherit_id" ref="crm.crm_case_form_view_oppor" />
|
||||
<field name="arch" type="xml">
|
||||
<field name="priority" position="after">
|
||||
<field name="score" />
|
||||
</field>
|
||||
<xpath expr="//group[@name='Misc']" position="after">
|
||||
<group string="Scoring">
|
||||
<field name="score_ids"
|
||||
widget="many2many_tags"
|
||||
domain="[('object_id.model','=','crm.lead')]"
|
||||
context="{'object_name': 'crm.lead'}"
|
||||
readonly="1"
|
||||
/>
|
||||
<field name="lang_id" readonly="1"/>
|
||||
</group>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- SALESTEAM -->
|
||||
|
||||
<!-- Graph view of leads via SalesTeam -->
|
||||
<record model="ir.ui.view" id="crm_case_graph_view_leads_sales">
|
||||
<field name="name">Unassigned leads</field>
|
||||
<field name="model">crm.lead</field>
|
||||
<field name="arch" type="xml">
|
||||
<graph string="Opportunities" type="line">
|
||||
<field name="create_date" type="row"/>
|
||||
</graph>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.actions.act_window" id="crm_score_views_action_graph">
|
||||
<field name="name">Unassigned leads</field>
|
||||
<field name="res_model">crm.lead</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">graph,tree,form</field>
|
||||
<field name="view_id" ref="crm_case_graph_view_leads_sales"/>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="crm_case_table_view_leads_sales">
|
||||
<field name="name">Opportunities</field>
|
||||
<field name="model">crm.lead</field>
|
||||
<field name="arch" type="xml">
|
||||
<graph string="Opportunities" type="pivot">
|
||||
<field name="stage_id" type="col"/>
|
||||
<field name="user_id" type="row"/>
|
||||
</graph>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.actions.act_window" id="crm_score_views_action_table">
|
||||
<field name="name">Opportunities</field>
|
||||
<field name="res_model">crm.lead</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">graph,tree,form</field>
|
||||
<field name="view_id" ref="crm_case_table_view_leads_sales"/>
|
||||
</record>
|
||||
|
||||
<!-- SalesTeam Form View - Lead information and page Assignation added -->
|
||||
<record model="ir.ui.view" id="sales_team_form_view_assign">
|
||||
<field name="name">crm.team.form.inherit</field>
|
||||
<field name="model">crm.team</field>
|
||||
<field name="inherit_id" ref="sales_team.crm_team_view_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//div[@class='oe_title']" position="before">
|
||||
<div class="oe_button_box" name="button_box">
|
||||
<button class="oe_stat_button" type="action"
|
||||
name="%(crm_score_views_action_graph)d" icon="fa-tags"
|
||||
context="{'search_default_team_id': active_id, 'search_default_unassigned': 1 }"
|
||||
>
|
||||
<field string="Unassigned leads" name="unassigned_leads" widget="statinfo"/>
|
||||
</button>
|
||||
<button class="oe_stat_button" type="action"
|
||||
name="%(crm_score_views_action_table)d" icon="fa-tags"
|
||||
context="{'search_default_team_id': active_id}"
|
||||
>
|
||||
<field string="Opportunities" name="leads_count" widget="statinfo"/>
|
||||
</button>
|
||||
</div>
|
||||
</xpath>
|
||||
<xpath expr="//group[@name='right']" position="inside">
|
||||
<field name="score_team_domain" options="{'model': 'crm.lead'}"/>
|
||||
<label for="assigned_leads"/>
|
||||
<div>
|
||||
<field name="assigned_leads" class="oe_inline"/> /
|
||||
<field name="capacity" class="oe_inline"/>
|
||||
</div>
|
||||
<field name="min_for_assign" class="oe_inline"/>
|
||||
</xpath>
|
||||
<xpath expr="//page[@name='members']" position="replace">
|
||||
<page string="Assignation">
|
||||
<field name="team_user_ids" widget="one2many" mode="kanban" context="{'default_team_id':active_id, 'ro_team':True}">
|
||||
<kanban>
|
||||
<field name="user_id"/>
|
||||
<field name="running"/>
|
||||
<templates>
|
||||
<t t-name="kanban-box">
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<ul>
|
||||
<li>
|
||||
<a type="open">
|
||||
<img t-att-src="kanban_image('res.users', 'image_small', record.user_id.raw_value)" class="oe_kanban_image"/>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<div style='text-align: center; padding: 4px;'>
|
||||
<t t-if="record.running.raw_value === true">
|
||||
<button name="toggle_active" type="object" style="
|
||||
color: #eeeeee;
|
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#3faf3f), to(#1a721a));">
|
||||
<span class="fa fa-check"/>
|
||||
</button>
|
||||
</t>
|
||||
<t t-if="record.running.raw_value === false">
|
||||
<button name="toggle_active" type="object" style="
|
||||
color: #eeeeee;
|
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#df3f3f), to(#a21a1a));">
|
||||
<span class="fa fa-times"/>
|
||||
</button>
|
||||
</t>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</td>
|
||||
<td>
|
||||
<div class="oe_kanban_details">
|
||||
<table>
|
||||
<tr>
|
||||
<td style='width: 240px'>
|
||||
<ul>
|
||||
<li><a type="open">
|
||||
<b><field name="name"/></b>
|
||||
</a></li>
|
||||
<li><field name="team_user_domain" widget='filters'/></li>
|
||||
</ul>
|
||||
</td>
|
||||
<td>
|
||||
<field name="maximum_user_leads" invisible="1"/>
|
||||
<field name="leads_count" widget="gauge"
|
||||
style="width:108px; height: 81px; cursor: pointer;"
|
||||
options="{'max_field': 'maximum_user_leads'}"/>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</t>
|
||||
</templates>
|
||||
</kanban>
|
||||
</field>
|
||||
</page>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="action_lead_dry_run" model="ir.actions.server">
|
||||
<field name="name">Lead Dry Run</field>
|
||||
<field name="model_id" ref="model_team_user"/>
|
||||
<field name="state">code</field>
|
||||
<field name="code">
|
||||
self.pool['crm.leads.dry.run'].assign_leads(cr, uid, None, context=context)
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="ir_lead_dry_run" model="ir.values">
|
||||
<field eval="'client_action_multi'" name="key2"/>
|
||||
<field eval="'team.user'" name="model"/>
|
||||
<field name="name">Launch Lead Dry Run</field>
|
||||
<field eval="'ir.actions.server,%d'%action_lead_dry_run" name="value"/>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
@@ -1,18 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<openerp>
|
||||
<data>
|
||||
<template id="assets_editor" name="website_crm_score assets" inherit_id="website.assets_editor">
|
||||
<xpath expr="." position="inside">
|
||||
<script type="text/javascript" src="/website_crm_score/static/src/js/set_score.js"></script>
|
||||
</xpath>
|
||||
</template>
|
||||
|
||||
<template id="assets_backend" name="website_crm_score assets" inherit_id="web.assets_backend">
|
||||
<xpath expr="." position="inside">
|
||||
<script type="text/javascript" src="/website_crm_score/static/src/js/display_filters.js"></script>
|
||||
</xpath>
|
||||
</template>
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
Reference in New Issue
Block a user