diff --git a/addons/crm_reveal/__init__.py b/addons/crm_reveal/__init__.py new file mode 100644 index 00000000000..7d34c7c054a --- /dev/null +++ b/addons/crm_reveal/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import controllers +from . import models diff --git a/addons/crm_reveal/__manifest__.py b/addons/crm_reveal/__manifest__.py new file mode 100644 index 00000000000..d209c6b804d --- /dev/null +++ b/addons/crm_reveal/__manifest__.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +{ + 'name': 'Lead Generation', + 'summary': 'Create Leads/Opportunities from your website\'s traffic', + 'category': 'CRM', + 'depends': ['iap', 'crm', 'website_form'], + 'data': [ + 'data/crm.reveal.industry.csv', + 'data/crm.reveal.role.csv', + 'data/crm.reveal.seniority.csv', + 'data/message_template.xml', + 'data/reveal_data.xml', + 'security/ir.model.access.csv', + 'views/crm_lead_view.xml', + 'views/crm_reveal_views.xml', + 'views/res_config_settings_views.xml' + ] +} diff --git a/addons/crm_reveal/controllers/__init__.py b/addons/crm_reveal/controllers/__init__.py new file mode 100644 index 00000000000..5d4b25db9c0 --- /dev/null +++ b/addons/crm_reveal/controllers/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import main diff --git a/addons/crm_reveal/controllers/main.py b/addons/crm_reveal/controllers/main.py new file mode 100644 index 00000000000..e824a57bbef --- /dev/null +++ b/addons/crm_reveal/controllers/main.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +import json + +from odoo import http +from odoo.addons.website_form.controllers.main import WebsiteForm +from odoo.http import request + + +class ContactController(WebsiteForm): + + @http.route('/website_form/', type='http', auth="public", methods=['POST'], website=True) + def website_form(self, model_name, **kwargs): + if model_name == 'crm.lead': + # Add the ip_address to the request in order to add this to the lead + # that will be created. With this, we avoid to create a lead from + # reveal if a lead is already created from the contact form. + request.params['reveal_ip'] = request.httprequest.remote_addr + + return super(ContactController, self).website_form(model_name, **kwargs) diff --git a/addons/crm_reveal/data/crm.reveal.industry.csv b/addons/crm_reveal/data/crm.reveal.industry.csv new file mode 100644 index 00000000000..ea365d6bb21 --- /dev/null +++ b/addons/crm_reveal/data/crm.reveal.industry.csv @@ -0,0 +1,238 @@ +"id",name,reveal_id +"crm_reveal_industry_1","3D Printing","1" +"crm_reveal_industry_2","Accounting","2" +"crm_reveal_industry_3","Aerospace & Defense","3" +"crm_reveal_industry_4","Agriculture","4" +"crm_reveal_industry_5","Airlines","5" +"crm_reveal_industry_6","Alternative Medicine","6" +"crm_reveal_industry_7","Animation","7" +"crm_reveal_industry_8","Apparel & Footwear","8" +"crm_reveal_industry_9","Architecture","9" +"crm_reveal_industry_10","Arts","10" +"crm_reveal_industry_11","Arts & Crafts","11" +"crm_reveal_industry_12","Asset Management","12" +"crm_reveal_industry_13","Audio","13" +"crm_reveal_industry_14","Automation","14" +"crm_reveal_industry_15","Automotive","15" +"crm_reveal_industry_16","Banking & Mortgages","16" +"crm_reveal_industry_17","Beverages","17" +"crm_reveal_industry_18","Biotechnology","18" +"crm_reveal_industry_19","Broadcasting","19" +"crm_reveal_industry_20","Building Materials","20" +"crm_reveal_industry_21","Business Supplies","21" +"crm_reveal_industry_22","Chemicals","22" +"crm_reveal_industry_23","Civil Engineering","23" +"crm_reveal_industry_24","Cloud Services","24" +"crm_reveal_industry_25","Communications","25" +"crm_reveal_industry_26","Computer Hardware","26" +"crm_reveal_industry_27","Construction","27" +"crm_reveal_industry_28","Construction Contractors & Services","28" +"crm_reveal_industry_29","Consulting & Professional Services","29" +"crm_reveal_industry_30","Consumer Discretionary","30" +"crm_reveal_industry_31","Consumer Electronics","31" +"crm_reveal_industry_32","Consumer Goods","32" +"crm_reveal_industry_33","Consumer Staples","33" +"crm_reveal_industry_34","Corporate & Business","34" +"crm_reveal_industry_35","Cosmetics","35" +"crm_reveal_industry_36","Design","36" +"crm_reveal_industry_37","E-Commerce & Marketplaces","37" +"crm_reveal_industry_38","E-Learning","38" +"crm_reveal_industry_39","Education","39" +"crm_reveal_industry_40","Electrical","40" +"crm_reveal_industry_41","Energy","41" +"crm_reveal_industry_42","Energy & Utilities","42" +"crm_reveal_industry_43","Entertainment & Recreation","43" +"crm_reveal_industry_44","Events","44" +"crm_reveal_industry_45","Eyewear","45" +"crm_reveal_industry_46","Facilities","46" +"crm_reveal_industry_47","Family Services","47" +"crm_reveal_industry_48","Finance","48" +"crm_reveal_industry_49","Financial Services","49" +"crm_reveal_industry_50","Fine Art","50" +"crm_reveal_industry_51","Firearms","51" +"crm_reveal_industry_52","Fishery","52" +"crm_reveal_industry_53","Food","53" +"crm_reveal_industry_54","Food Production","54" +"crm_reveal_industry_55","Forums","55" +"crm_reveal_industry_56","Fundraising","56" +"crm_reveal_industry_57","Gambling & Casinos","57" +"crm_reveal_industry_58","Government","58" +"crm_reveal_industry_59","Ground Transportation","59" +"crm_reveal_industry_60","Health & Wellness","60" +"crm_reveal_industry_61","Health Care","61" +"crm_reveal_industry_62","Higher Education","62" +"crm_reveal_industry_63","Home & Furniture","63" +"crm_reveal_industry_64","Home Improvement","64" +"crm_reveal_industry_65","Human Resources","65" +"crm_reveal_industry_66","Import & Export","66" +"crm_reveal_industry_67","Industrials & Manufacturing","67" +"crm_reveal_industry_68","Information Technology & Services","68" +"crm_reveal_industry_69","Insurance","69" +"crm_reveal_industry_70","International Relations","70" +"crm_reveal_industry_71","International Trade","71" +"crm_reveal_industry_72","Internet","72" +"crm_reveal_industry_73","Investment","73" +"crm_reveal_industry_74","Investment Banking","74" +"crm_reveal_industry_75","Investment Management","75" +"crm_reveal_industry_76","Jewelry, Watches & Luxury Goods","76" +"crm_reveal_industry_77","Judiciary","77" +"crm_reveal_industry_78","Law Enforcement","78" +"crm_reveal_industry_79","Legal Services","79" +"crm_reveal_industry_80","Libraries","80" +"crm_reveal_industry_81","Machinery","81" +"crm_reveal_industry_82","Maritime","82" +"crm_reveal_industry_83","Market Research","83" +"crm_reveal_industry_84","Marketing & Advertising","84" +"crm_reveal_industry_85","Mechanical Engineering","85" +"crm_reveal_industry_86","Media","86" +"crm_reveal_industry_87","Medicine","87" +"crm_reveal_industry_88","Military","88" +"crm_reveal_industry_89","Mining & Metals","89" +"crm_reveal_industry_90","Movies & TV","90" +"crm_reveal_industry_91","Museums","91" +"crm_reveal_industry_92","Music","92" +"crm_reveal_industry_93","Nanotechnology","93" +"crm_reveal_industry_94","Networking","94" +"crm_reveal_industry_95","Non-Profit & Philanthropy","95" +"crm_reveal_industry_96","Oil & Gas","96" +"crm_reveal_industry_97","Outsourcing","97" +"crm_reveal_industry_98","Packaging & Containers","98" +"crm_reveal_industry_99","Paper Goods","99" +"crm_reveal_industry_100","Payments","100" +"crm_reveal_industry_101","Performing Arts","101" +"crm_reveal_industry_102","Pharmaceuticals","102" +"crm_reveal_industry_103","Pharmacy","103" +"crm_reveal_industry_104","Photography","104" +"crm_reveal_industry_105","Plastics","105" +"crm_reveal_industry_106","Plumbing","106" +"crm_reveal_industry_107","Political Organization","107" +"crm_reveal_industry_108","Pornography","108" +"crm_reveal_industry_109","Primary & Secondary Education","109" +"crm_reveal_industry_110","Printing","110" +"crm_reveal_industry_111","Public Relations","111" +"crm_reveal_industry_112","Publishing","112" +"crm_reveal_industry_113","Ranching","113" +"crm_reveal_industry_114","Real Estate","114" +"crm_reveal_industry_115","Religion","115" +"crm_reveal_industry_116","Renewables & Environment","116" +"crm_reveal_industry_117","Restaurants","117" +"crm_reveal_industry_118","Retail","118" +"crm_reveal_industry_119","Sanitization Services","119" +"crm_reveal_industry_120","Scientific & Academic Research","120" +"crm_reveal_industry_121","Security","121" +"crm_reveal_industry_122","Services","122" +"crm_reveal_industry_123","Shipbuilding","123" +"crm_reveal_industry_124","Shipping & Logistics","124" +"crm_reveal_industry_125","Society","125" +"crm_reveal_industry_126","Sporting Goods","126" +"crm_reveal_industry_127","Sports & Fitness","127" +"crm_reveal_industry_128","Stores","128" +"crm_reveal_industry_129","Talent Agencies","129" +"crm_reveal_industry_130","Technology","130" +"crm_reveal_industry_131","Telecommunications","131" +"crm_reveal_industry_132","Textiles","132" +"crm_reveal_industry_133","Tobacco","133" +"crm_reveal_industry_134","Tools","134" +"crm_reveal_industry_135","Translation","135" +"crm_reveal_industry_136","Transportation","136" +"crm_reveal_industry_137","Travel & Leisure","137" +"crm_reveal_industry_138","Utilities","138" +"crm_reveal_industry_139","Venture Capital","139" +"crm_reveal_industry_140","Veterinary","140" +"crm_reveal_industry_141","Video Games","141" +"crm_reveal_industry_142","Warehousing","142" +"crm_reveal_industry_143","Web Services & Apps","143" +"crm_reveal_industry_144","Wholesale","144" +"crm_reveal_industry_145","Financials","145" +"crm_reveal_industry_146","Industrials","146" +"crm_reveal_industry_147","Information Technology","147" +"crm_reveal_industry_148","Materials","148" +"crm_reveal_industry_149","Telecommunication Services","149" +"crm_reveal_industry_150","Consumer Services","150" +"crm_reveal_industry_151","Diversified Consumer Services","151" +"crm_reveal_industry_152","Retailing","152" +"crm_reveal_industry_153","Food & Staples Retailing","153" +"crm_reveal_industry_154","Food, Beverage & Tobacco","154" +"crm_reveal_industry_155","Household & Personal Products","155" +"crm_reveal_industry_156","Energy Equipment & Services","156" +"crm_reveal_industry_157","Banks","157" +"crm_reveal_industry_158","Diversified Financial Services","158" +"crm_reveal_industry_159","Diversified Financials","159" +"crm_reveal_industry_160","Health Care Equipment & Services","160" +"crm_reveal_industry_161","Pharmaceuticals, Biotechnology & Life Sciences","161" +"crm_reveal_industry_162","Capital Goods","162" +"crm_reveal_industry_163","Commercial & Professional Services","163" +"crm_reveal_industry_164","Semiconductors & Semiconductor Equipment","164" +"crm_reveal_industry_165","Software & Services","165" +"crm_reveal_industry_166","Technology Hardware & Equipment","166" +"crm_reveal_industry_167","Construction Materials","167" +"crm_reveal_industry_168","Independent Power and Renewable Electricity Producers","168" +"crm_reveal_industry_169","Hotels, Restaurants & Leisure","169" +"crm_reveal_industry_170","Education Services","170" +"crm_reveal_industry_171","Specialized Consumer Services","171" +"crm_reveal_industry_172","Distributors","172" +"crm_reveal_industry_173","Specialty Retail","173" +"crm_reveal_industry_174","Food Products","174" +"crm_reveal_industry_175","Personal Products","175" +"crm_reveal_industry_176","Gas Utilities","176" +"crm_reveal_industry_177","Capital Markets","177" +"crm_reveal_industry_178","Health Care Equipment & Supplies","178" +"crm_reveal_industry_179","Health Care Providers & Services","179" +"crm_reveal_industry_180","Life Sciences Tools & Services","180" +"crm_reveal_industry_181","Commercial Services & Supplies","181" +"crm_reveal_industry_182","Construction & Engineering","182" +"crm_reveal_industry_183","Electrical Equipment","183" +"crm_reveal_industry_184","Industrial Conglomerates","184" +"crm_reveal_industry_185","Trading Companies & Distributors","185" +"crm_reveal_industry_186","Professional Services","186" +"crm_reveal_industry_187","Air Freight & Logistics","187" +"crm_reveal_industry_188","Marine","188" +"crm_reveal_industry_189","Road & Rail","189" +"crm_reveal_industry_190","Internet Software & Services","190" +"crm_reveal_industry_191","IT Services","191" +"crm_reveal_industry_192","Software","192" +"crm_reveal_industry_193","Communications Equipment","193" +"crm_reveal_industry_194","Electronic Equipment, Instruments & Components","194" +"crm_reveal_industry_195","Technology Hardware, Storage & Peripherals","195" +"crm_reveal_industry_196","Containers & Packaging","196" +"crm_reveal_industry_197","Metals & Mining","197" +"crm_reveal_industry_198","Paper & Forest Products","198" +"crm_reveal_industry_199","Diversified Telecommunication Services","199" +"crm_reveal_industry_200","Wireless Telecommunication Services","200" +"crm_reveal_industry_201","Renewable Electricity","201" +"crm_reveal_industry_202","Electric Utilities","202" +"crm_reveal_industry_203","Casinos & Gaming","203" +"crm_reveal_industry_204","Leisure Facilities","204" +"crm_reveal_industry_205","Advertising","205" +"crm_reveal_industry_206","Movies & Entertainment","206" +"crm_reveal_industry_207","Home Improvement Retail","207" +"crm_reveal_industry_208","Homefurnishing Retail","208" +"crm_reveal_industry_209","Food Retail","209" +"crm_reveal_industry_210","Agricultural Products","210" +"crm_reveal_industry_211","Packaged Foods & Meats","211" +"crm_reveal_industry_212","Asset Management & Custody Banks","212" +"crm_reveal_industry_213","Diversified Capital Markets","213" +"crm_reveal_industry_214","Investment Banking & Brokerage","214" +"crm_reveal_industry_215","Health Care Services","215" +"crm_reveal_industry_216","Commercial Printing","216" +"crm_reveal_industry_217","Industrial Machinery","217" +"crm_reveal_industry_218","Consulting","218" +"crm_reveal_industry_219","Human Resource & Employment Services","219" +"crm_reveal_industry_220","Research & Consulting Services","220" +"crm_reveal_industry_221","Semiconductors","221" +"crm_reveal_industry_222","Data Processing & Outsourced Services","222" +"crm_reveal_industry_223","Graphic Design","223" +"crm_reveal_industry_224","Computer Networking","224" +"crm_reveal_industry_225","Commodity Chemicals","225" +"crm_reveal_industry_226","Gold","226" +"crm_reveal_industry_227","Paper Products","227" +"crm_reveal_industry_228","Integrated Telecommunication Services","228" +"crm_reveal_industry_229","Renewable Energy","229" +"crm_reveal_industry_230","B2B","230" +"crm_reveal_industry_231","B2C","231" +"crm_reveal_industry_232","E-Commerce","232" +"crm_reveal_industry_233","Enterprise","233" +"crm_reveal_industry_234","ISP","234" +"crm_reveal_industry_235","Marketplace","235" +"crm_reveal_industry_236","Mobile","236" +"crm_reveal_industry_237","SAAS","237" \ No newline at end of file diff --git a/addons/crm_reveal/data/crm.reveal.role.csv b/addons/crm_reveal/data/crm.reveal.role.csv new file mode 100644 index 00000000000..e82b77e8876 --- /dev/null +++ b/addons/crm_reveal/data/crm.reveal.role.csv @@ -0,0 +1,23 @@ +"id",name,reveal_id +"crm_reveal_role_1","ceo","ceo" +"crm_reveal_role_2","communications","communications" +"crm_reveal_role_3","consulting","consulting" +"crm_reveal_role_4","customer_service","customer_service" +"crm_reveal_role_5","education","education" +"crm_reveal_role_6","engineering","engineering" +"crm_reveal_role_7","finance","finance" +"crm_reveal_role_8","founder","founder" +"crm_reveal_role_9","health_professional","health_professional" +"crm_reveal_role_10","human_resources","human_resources" +"crm_reveal_role_11","information_technology","information_technology" +"crm_reveal_role_12","legal","legal" +"crm_reveal_role_13","marketing","marketing" +"crm_reveal_role_14","operations","operations" +"crm_reveal_role_15","owner","owner" +"crm_reveal_role_16","president","president" +"crm_reveal_role_17","product","product" +"crm_reveal_role_18","public_relations","public_relations" +"crm_reveal_role_19","real_estate","real_estate" +"crm_reveal_role_20","recruiting","recruiting" +"crm_reveal_role_21","research","research" +"crm_reveal_role_22","sale","sale" diff --git a/addons/crm_reveal/data/crm.reveal.seniority.csv b/addons/crm_reveal/data/crm.reveal.seniority.csv new file mode 100644 index 00000000000..0f5af1170e4 --- /dev/null +++ b/addons/crm_reveal/data/crm.reveal.seniority.csv @@ -0,0 +1,4 @@ +"id",name,reveal_id +"crm_reveal_seniority_1","director","director" +"crm_reveal_seniority_2","executive","executive" +"crm_reveal_seniority_3","manager","manager" \ No newline at end of file diff --git a/addons/crm_reveal/data/message_template.xml b/addons/crm_reveal/data/message_template.xml new file mode 100644 index 00000000000..e71d0a7de21 --- /dev/null +++ b/addons/crm_reveal/data/message_template.xml @@ -0,0 +1,123 @@ + + + + + diff --git a/addons/crm_reveal/data/reveal_data.xml b/addons/crm_reveal/data/reveal_data.xml new file mode 100644 index 00000000000..ccc5ad0743d --- /dev/null +++ b/addons/crm_reveal/data/reveal_data.xml @@ -0,0 +1,40 @@ + + + + + + Lead Generation: Leads/Opportunities Generation + + code + model._process_lead_generation() + + 1 + days + -1 + + + + + IAP Lead Generation Notification + iap@odoo.com + iap@odoo.com + IAP Lead Generation Notification + + + Dear,

+

There is no more credits on your IAP Lead Generation account.
+ You can charge your IAP Lead Generation account in the settings of the CRM app.
+ +

Best regards,

+

Odoo S.A.

+ ]]> +
+
+
+ + + crm.lead + + +
diff --git a/addons/crm_reveal/i18n/crm_reveal.pot b/addons/crm_reveal/i18n/crm_reveal.pot new file mode 100644 index 00000000000..beaac368e4d --- /dev/null +++ b/addons/crm_reveal/i18n/crm_reveal.pot @@ -0,0 +1,1892 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * crm_reveal +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-07-04 06:10+0000\n" +"PO-Revision-Date: 2018-07-04 06:10+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: crm_reveal +#: model:mail.template,body_html:crm_reveal.reveal_no_credits +msgid "\n" +" \n" +"

Dear,

\n" +"

There is no more credits on your IAP Leads Generation account.
\n" +" You can charge your IAP Leads Generation account in the settings of the CRM app.
\n" +"\n" +"

Best regards,

\n" +"

Odoo S.A.

\n" +" \n" +" " +msgstr "" + +#. module: crm_reveal +#: model:ir.ui.view,arch_db:crm_reveal.lead_message_template +msgid "(Time Now)" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_1 +msgid "3D Printing" +msgstr "" + +#. module: crm_reveal +#: model:ir.ui.view,arch_db:crm_reveal.lead_message_template +msgid "Contacts" +msgstr "" + +#. module: crm_reveal +#: model:ir.ui.view,arch_db:crm_reveal.lead_message_template +msgid "Phone :" +msgstr "" + +#. module: crm_reveal +#: model:ir.ui.view,arch_db:crm_reveal.lead_message_template +msgid "Timezone : " +msgstr "" + +#. module: crm_reveal +#: model:ir.ui.view,arch_db:crm_reveal.crm_reveal_rule_form +msgid " Leads " +msgstr "" + +#. module: crm_reveal +#: model:ir.ui.view,arch_db:crm_reveal.crm_reveal_rule_form +msgid " Opportunities " +msgstr "" + +#. module: crm_reveal +#: model:ir.ui.view,arch_db:crm_reveal.crm_reveal_rule_form +msgid " people " +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_2 +msgid "Accounting" +msgstr "" + +#. module: crm_reveal +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_rule_active +msgid "Active" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_205 +msgid "Advertising" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_3 +msgid "Aerospace & Defense" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_210 +msgid "Agricultural Products" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_4 +msgid "Agriculture" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_187 +msgid "Air Freight & Logistics" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_5 +msgid "Airlines" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_6 +msgid "Alternative Medicine" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_7 +msgid "Animation" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_8 +msgid "Apparel & Footwear" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_9 +msgid "Architecture" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_10 +msgid "Arts" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_11 +msgid "Arts & Crafts" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_12 +msgid "Asset Management" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_212 +msgid "Asset Management & Custody Banks" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_13 +msgid "Audio" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_14 +msgid "Automation" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_15 +msgid "Automotive" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_230 +msgid "B2B" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_231 +msgid "B2C" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_16 +msgid "Banking & Mortgages" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_157 +msgid "Banks" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_17 +msgid "Beverages" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_18 +msgid "Biotechnology" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_19 +msgid "Broadcasting" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_20 +msgid "Building Materials" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_21 +msgid "Business Supplies" +msgstr "" + +#. module: crm_reveal +#: model:ir.ui.view,arch_db:crm_reveal.res_config_settings_view_form +msgid "Buy IAP Credits" +msgstr "" + +#. module: crm_reveal +#: model:ir.model,name:crm_reveal.model_crm_reveal_rule +msgid "CRM Leads Generation Rules" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_162 +msgid "Capital Goods" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_177 +msgid "Capital Markets" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_203 +msgid "Casinos & Gaming" +msgstr "" + +#. module: crm_reveal +#: model:ir.ui.view,arch_db:crm_reveal.res_config_settings_view_form +msgid "Charge your IAP account to generate Leads/Opportunities from your website's traffic" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_22 +msgid "Chemicals" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_23 +msgid "Civil Engineering" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_24 +msgid "Cloud Services" +msgstr "" + +#. module: crm_reveal +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_industry_color +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_role_color +msgid "Color Index" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_163 +msgid "Commercial & Professional Services" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_216 +msgid "Commercial Printing" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_181 +msgid "Commercial Services & Supplies" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_225 +msgid "Commodity Chemicals" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_25 +msgid "Communications" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_193 +msgid "Communications Equipment" +msgstr "" + +#. module: crm_reveal +#: selection:crm.reveal.rule,lead_for:0 +msgid "Companies" +msgstr "" + +#. module: crm_reveal +#: selection:crm.reveal.rule,lead_for:0 +msgid "Companies + Contacts" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_26 +msgid "Computer Hardware" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_224 +msgid "Computer Networking" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_27 +msgid "Construction" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_182 +msgid "Construction & Engineering" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_28 +msgid "Construction Contractors & Services" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_167 +msgid "Construction Materials" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_218 +msgid "Consulting" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_29 +msgid "Consulting & Professional Services" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_30 +msgid "Consumer Discretionary" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_31 +msgid "Consumer Electronics" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_32 +msgid "Consumer Goods" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_150 +msgid "Consumer Services" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_33 +msgid "Consumer Staples" +msgstr "" + +#. module: crm_reveal +#: model:ir.ui.view,arch_db:crm_reveal.crm_reveal_rule_form +msgid "Contact Filter" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_196 +msgid "Containers & Packaging" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_34 +msgid "Corporate & Business" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_35 +msgid "Cosmetics" +msgstr "" + +#. module: crm_reveal +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_rule_country_ids +msgid "Countries" +msgstr "" + +#. module: crm_reveal +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_view_create_date +msgid "Create Date" +msgstr "" + +#. module: crm_reveal +#: model:ir.actions.act_window,help:crm_reveal.crm_reveal_rule_action +msgid "Create rules to generate B2B leads/opportunities by tracking data of your website visitors." +msgstr "" + +#. module: crm_reveal +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_industry_create_uid +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_role_create_uid +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_rule_create_uid +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_seniority_create_uid +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_view_create_uid +msgid "Created by" +msgstr "" + +#. module: crm_reveal +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_industry_create_date +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_role_create_date +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_rule_create_date +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_seniority_create_date +msgid "Created on" +msgstr "" + +#. module: crm_reveal +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_rule_calculate_credits +msgid "Credit Used" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_222 +msgid "Data Processing & Outsourced Services" +msgstr "" + +#. module: crm_reveal +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_rule_lead_for +msgid "Data Tracking" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_36 +msgid "Design" +msgstr "" + +#. module: crm_reveal +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_industry_display_name +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_role_display_name +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_rule_display_name +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_seniority_display_name +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_view_display_name +msgid "Display Name" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_172 +msgid "Distributors" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_213 +msgid "Diversified Capital Markets" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_151 +msgid "Diversified Consumer Services" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_158 +msgid "Diversified Financial Services" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_159 +msgid "Diversified Financials" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_199 +msgid "Diversified Telecommunication Services" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_232 +msgid "E-Commerce" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_37 +msgid "E-Commerce & Marketplaces" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_38 +msgid "E-Learning" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_39 +msgid "Education" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_170 +msgid "Education Services" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_202 +msgid "Electric Utilities" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_40 +msgid "Electrical" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_183 +msgid "Electrical Equipment" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_194 +msgid "Electronic Equipment, Instruments & Components" +msgstr "" + +#. module: crm_reveal +#: model:ir.ui.view,arch_db:crm_reveal.lead_message_template +msgid "Email" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_41 +msgid "Energy" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_42 +msgid "Energy & Utilities" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_156 +msgid "Energy Equipment & Services" +msgstr "" + +#. module: crm_reveal +#: code:private/crm_reveal/models/crm_reveal_rule.py:73 +#, python-format +msgid "Enter Valid Regex." +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_233 +msgid "Enterprise" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_43 +msgid "Entertainment & Recreation" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_44 +msgid "Events" +msgstr "" + +#. module: crm_reveal +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_rule_extra_contacts +msgid "Extra Contacts" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_45 +msgid "Eyewear" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_46 +msgid "Facilities" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_47 +msgid "Family Services" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_48 +msgid "Finance" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_49 +msgid "Financial Services" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_145 +msgid "Financials" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_50 +msgid "Fine Art" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_51 +msgid "Firearms" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_52 +msgid "Fishery" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_53 +msgid "Food" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_153 +msgid "Food & Staples Retailing" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_54 +msgid "Food Production" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_174 +msgid "Food Products" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_209 +msgid "Food Retail" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_154 +msgid "Food, Beverage & Tobacco" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_55 +msgid "Forums" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_56 +msgid "Fundraising" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_57 +msgid "Gambling & Casinos" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_176 +msgid "Gas Utilities" +msgstr "" + +#. module: crm_reveal +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_rule_lead_ids +msgid "Generated Lead / Opportunity" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_226 +msgid "Gold" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_58 +msgid "Government" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_223 +msgid "Graphic Design" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_59 +msgid "Ground Transportation" +msgstr "" + +#. module: crm_reveal +#: model:ir.model,name:crm_reveal.model_ir_http +msgid "HTTP routing" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_60 +msgid "Health & Wellness" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_61 +msgid "Health Care" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_160 +msgid "Health Care Equipment & Services" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_178 +msgid "Health Care Equipment & Supplies" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_179 +msgid "Health Care Providers & Services" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_215 +msgid "Health Care Services" +msgstr "" + +#. module: crm_reveal +#: selection:crm.reveal.rule,priority:0 +msgid "High" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_62 +msgid "Higher Education" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_63 +msgid "Home & Furniture" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_64 +msgid "Home Improvement" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_207 +msgid "Home Improvement Retail" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_208 +msgid "Homefurnishing Retail" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_169 +msgid "Hotels, Restaurants & Leisure" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_155 +msgid "Household & Personal Products" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_219 +msgid "Human Resource & Employment Services" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_65 +msgid "Human Resources" +msgstr "" + +#. module: crm_reveal +#: model:ir.model.fields,field_description:crm_reveal.field_crm_lead_reveal_iap_credits +msgid "IAP Credits" +msgstr "" + +#. module: crm_reveal +#: model:mail.template,subject:crm_reveal.reveal_no_credits +msgid "IAP Leads Generation Notification" +msgstr "" + +#. module: crm_reveal +#: model:ir.ui.view,arch_db:crm_reveal.res_config_settings_view_form +msgid "IAP Leads Generations" +msgstr "" + +#. module: crm_reveal +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_industry_id +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_role_id +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_rule_id +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_seniority_id +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_view_id +msgid "ID" +msgstr "" + +#. module: crm_reveal +#: model:ir.model.fields,field_description:crm_reveal.field_crm_lead_reveal_ip +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_view_reveal_ip +msgid "IP Address" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_234 +msgid "ISP" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_191 +msgid "IT Services" +msgstr "" + +#. module: crm_reveal +#: model:ir.model.fields,help:crm_reveal.field_crm_reveal_rule_lead_for +msgid "If you track company data, one credit will be consumed per lead/opportunity created. If you track company and contacts data, two credits will be consumed. Such data will be visible in the lead/opportunity." +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_66 +msgid "Import & Export" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_168 +msgid "Independent Power and Renewable Electricity Producers" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_184 +msgid "Industrial Conglomerates" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_217 +msgid "Industrial Machinery" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_146 +msgid "Industrials" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_67 +msgid "Industrials & Manufacturing" +msgstr "" + +#. module: crm_reveal +#: model:ir.model,name:crm_reveal.model_crm_reveal_industry +msgid "Industry Tag" +msgstr "" + +#. module: crm_reveal +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_rule_industry_tag_ids +msgid "Industry Tags" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_147 +msgid "Information Technology" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_68 +msgid "Information Technology & Services" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_69 +msgid "Insurance" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_228 +msgid "Integrated Telecommunication Services" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_70 +msgid "International Relations" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_71 +msgid "International Trade" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_72 +msgid "Internet" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_190 +msgid "Internet Software & Services" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_73 +msgid "Investment" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_74 +msgid "Investment Banking" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_214 +msgid "Investment Banking & Brokerage" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_75 +msgid "Investment Management" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_76 +msgid "Jewelry, Watches & Luxury Goods" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_77 +msgid "Judiciary" +msgstr "" + +#. module: crm_reveal +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_industry___last_update +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_role___last_update +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_rule___last_update +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_seniority___last_update +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_view___last_update +msgid "Last Modified on" +msgstr "" + +#. module: crm_reveal +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_industry_write_uid +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_role_write_uid +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_rule_write_uid +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_seniority_write_uid +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_view_write_uid +msgid "Last Updated by" +msgstr "" + +#. module: crm_reveal +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_industry_write_date +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_role_write_date +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_rule_write_date +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_seniority_write_date +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_view_write_date +msgid "Last Updated on" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_78 +msgid "Law Enforcement" +msgstr "" + +#. module: crm_reveal +#: selection:crm.reveal.rule,lead_type:0 +msgid "Lead" +msgstr "" + +#. module: crm_reveal +#: model:ir.ui.view,arch_db:crm_reveal.crm_reveal_rule_form +msgid "Lead Data" +msgstr "" + +#. module: crm_reveal +#: model:ir.model,name:crm_reveal.model_crm_lead +msgid "Lead/Opportunity" +msgstr "" + +#. module: crm_reveal +#: model:ir.ui.view,arch_db:crm_reveal.crm_reveal_lead_form +#: model:ir.ui.view,arch_db:crm_reveal.crm_reveal_lead_opportunity_form +msgid "Leads Generation Information" +msgstr "" + +#. module: crm_reveal +#: model:ir.model.fields,field_description:crm_reveal.field_crm_lead_reveal_rule_id +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_view_reveal_rule_id +msgid "Leads Generation Rule" +msgstr "" + +#. module: crm_reveal +#: model:ir.actions.act_window,name:crm_reveal.crm_reveal_rule_action +#: model:ir.ui.menu,name:crm_reveal.crm_reveal_rule_menu_action +msgid "Leads Generation Rules" +msgstr "" + +#. module: crm_reveal +#: model:ir.actions.act_window,name:crm_reveal.crm_reveal_view_action +#: model:ir.ui.menu,name:crm_reveal.crm_reveal_view_menu_action +msgid "Leads Generation Views" +msgstr "" + +#. module: crm_reveal +#: model:ir.actions.server,name:crm_reveal.ir_cron_crm_reveal_lead_ir_actions_server +#: model:ir.cron,cron_name:crm_reveal.ir_cron_crm_reveal_lead +#: model:ir.cron,name:crm_reveal.ir_cron_crm_reveal_lead +msgid "Leads Generation: Leads/Opportunities Generation" +msgstr "" + +#. module: crm_reveal +#: model:ir.model.fields,help:crm_reveal.field_crm_reveal_rule_industry_tag_ids +msgid "Leave empty to always match. Odoo will not create lead if no match" +msgstr "" + +#. module: crm_reveal +#: model:ir.model.fields,help:crm_reveal.field_crm_reveal_rule_company_size_max +#: model:ir.model.fields,help:crm_reveal.field_crm_reveal_rule_company_size_min +msgid "Leave it as 0 if you don't want to use this filter." +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_79 +msgid "Legal Services" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_204 +msgid "Leisure Facilities" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_80 +msgid "Libraries" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_180 +msgid "Life Sciences Tools & Services" +msgstr "" + +#. module: crm_reveal +#: selection:crm.reveal.rule,priority:0 +msgid "Low" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_81 +msgid "Machinery" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_188 +msgid "Marine" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_82 +msgid "Maritime" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_83 +msgid "Market Research" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_84 +msgid "Marketing & Advertising" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_235 +msgid "Marketplace" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_148 +msgid "Materials" +msgstr "" + +#. module: crm_reveal +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_rule_company_size_max +msgid "Max Company Size" +msgstr "" + +#. module: crm_reveal +#: sql_constraint:crm.reveal.rule:0 +msgid "Maximum 5 extra contacts are allowed!" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_85 +msgid "Mechanical Engineering" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_86 +msgid "Media" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_87 +msgid "Medicine" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_197 +msgid "Metals & Mining" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_88 +msgid "Military" +msgstr "" + +#. module: crm_reveal +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_rule_company_size_min +msgid "Min Company Size" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_89 +msgid "Mining & Metals" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_236 +msgid "Mobile" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_206 +msgid "Movies & Entertainment" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_90 +msgid "Movies & TV" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_91 +msgid "Museums" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_92 +msgid "Music" +msgstr "" + +#. module: crm_reveal +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_seniority_name +#: model:ir.ui.view,arch_db:crm_reveal.lead_message_template +msgid "Name" +msgstr "" + +#. module: crm_reveal +#: sql_constraint:crm.reveal.seniority:0 +msgid "Name already exists!" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_93 +msgid "Nanotechnology" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_94 +msgid "Networking" +msgstr "" + +#. module: crm_reveal +#: model:ir.ui.view,arch_db:crm_reveal.crm_reveal_rule_form +msgid "No credit is consumed if the company is not found.
\n" +" 1 credit is consumed if the company is found.
" +msgstr "" + +#. module: crm_reveal +#: model:ir.actions.act_window,help:crm_reveal.crm_reveal_rule_action +msgid "No rule found" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_95 +msgid "Non-Profit & Philanthropy" +msgstr "" + +#. module: crm_reveal +#: selection:crm.reveal.rule,priority:0 +msgid "Normal" +msgstr "" + +#. module: crm_reveal +#: selection:crm.reveal.view,reveal_state:0 +msgid "Not Found" +msgstr "" + +#. module: crm_reveal +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_rule_leads_count +msgid "Number of Generated Leads" +msgstr "" + +#. module: crm_reveal +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_rule_opportunity_count +msgid "Number of Generated Opportunity" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_96 +msgid "Oil & Gas" +msgstr "" + +#. module: crm_reveal +#: model:ir.model.fields,help:crm_reveal.field_crm_reveal_rule_country_ids +msgid "Only visitors of following countries will be converted into leads/opportunities (using GeoIP)." +msgstr "" + +#. module: crm_reveal +#: selection:crm.reveal.rule,lead_type:0 +msgid "Opportunity" +msgstr "" + +#. module: crm_reveal +#: model:ir.ui.view,arch_db:crm_reveal.crm_reveal_rule_form +msgid "Opportunity Data" +msgstr "" + +#. module: crm_reveal +#: model:ir.ui.view,arch_db:crm_reveal.crm_reveal_rule_form +msgid "Opportunity Generation Conditions" +msgstr "" + +#. module: crm_reveal +#: model:ir.ui.view,arch_db:crm_reveal.lead_message_template +msgid "Opportunity created by Odoo Leads Generation" +msgstr "" + +#. module: crm_reveal +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_rule_other_role_ids +msgid "Other Roles" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_97 +msgid "Outsourcing" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_211 +msgid "Packaged Foods & Meats" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_98 +msgid "Packaging & Containers" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_198 +msgid "Paper & Forest Products" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_99 +msgid "Paper Goods" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_227 +msgid "Paper Products" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_100 +msgid "Payments" +msgstr "" + +#. module: crm_reveal +#: model:ir.model,name:crm_reveal.model_crm_reveal_role +msgid "People Role" +msgstr "" + +#. module: crm_reveal +#: model:ir.model,name:crm_reveal.model_crm_reveal_seniority +msgid "People Seniority" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_101 +msgid "Performing Arts" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_175 +msgid "Personal Products" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_102 +msgid "Pharmaceuticals" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_161 +msgid "Pharmaceuticals, Biotechnology & Life Sciences" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_103 +msgid "Pharmacy" +msgstr "" + +#. module: crm_reveal +#: model:ir.ui.view,arch_db:crm_reveal.lead_message_template +msgid "Phone" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_104 +msgid "Photography" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_105 +msgid "Plastics" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_106 +msgid "Plumbing" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_107 +msgid "Political Organization" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_108 +msgid "Pornography" +msgstr "" + +#. module: crm_reveal +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_rule_preferred_role_id +msgid "Preferred Role" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_109 +msgid "Primary & Secondary Education" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_110 +msgid "Printing" +msgstr "" + +#. module: crm_reveal +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_rule_priority +msgid "Priority" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_186 +msgid "Professional Services" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_111 +msgid "Public Relations" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_112 +msgid "Publishing" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_113 +msgid "Ranching" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_114 +msgid "Real Estate" +msgstr "" + +#. module: crm_reveal +#: model:ir.model.fields,help:crm_reveal.field_crm_reveal_rule_regex_url +msgid "Regex to track website pages. Leave empty to track the entire website, or / to target the homepage. Example: /page* to track all the pages which begin with /page" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_115 +msgid "Religion" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_201 +msgid "Renewable Electricity" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_229 +msgid "Renewable Energy" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_116 +msgid "Renewables & Environment" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_220 +msgid "Research & Consulting Services" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_117 +msgid "Restaurants" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_118 +msgid "Retail" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_152 +msgid "Retailing" +msgstr "" + +#. module: crm_reveal +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_industry_reveal_id +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_role_reveal_id +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_seniority_reveal_id +msgid "Reveal" +msgstr "" + +#. module: crm_reveal +#: model:ir.model.fields,field_description:crm_reveal.field_crm_lead_reveal_id +msgid "Reveal ID" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_189 +msgid "Road & Rail" +msgstr "" + +#. module: crm_reveal +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_role_name +msgid "Role Name" +msgstr "" + +#. module: crm_reveal +#: sql_constraint:crm.reveal.role:0 +msgid "Role name already exists!" +msgstr "" + +#. module: crm_reveal +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_rule_name +msgid "Rule Name" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_237 +msgid "SAAS" +msgstr "" + +#. module: crm_reveal +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_rule_team_id +msgid "Sales Channel" +msgstr "" + +#. module: crm_reveal +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_rule_user_id +msgid "Salesperson" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_119 +msgid "Sanitization Services" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_120 +msgid "Scientific & Academic Research" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_121 +msgid "Security" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_221 +msgid "Semiconductors" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_164 +msgid "Semiconductors & Semiconductor Equipment" +msgstr "" + +#. module: crm_reveal +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_rule_seniority_id +msgid "Seniority" +msgstr "" + +#. module: crm_reveal +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_rule_sequence +msgid "Sequence" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_122 +msgid "Services" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_123 +msgid "Shipbuilding" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_124 +msgid "Shipping & Logistics" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_125 +msgid "Society" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_192 +msgid "Software" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_165 +msgid "Software & Services" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_171 +msgid "Specialized Consumer Services" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_173 +msgid "Specialty Retail" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_126 +msgid "Sporting Goods" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_127 +msgid "Sports & Fitness" +msgstr "" + +#. module: crm_reveal +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_view_reveal_state +msgid "State" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_128 +msgid "Stores" +msgstr "" + +#. module: crm_reveal +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_rule_suffix +msgid "Suffix" +msgstr "" + +#. module: crm_reveal +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_industry_name +msgid "Tag Name" +msgstr "" + +#. module: crm_reveal +#: sql_constraint:crm.reveal.industry:0 +msgid "Tag name already exists!" +msgstr "" + +#. module: crm_reveal +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_rule_tag_ids +msgid "Tags" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_129 +msgid "Talent Agencies" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_130 +msgid "Technology" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_166 +msgid "Technology Hardware & Equipment" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_195 +msgid "Technology Hardware, Storage & Peripherals" +msgstr "" + +#. module: crm_reveal +#: model:ir.ui.view,arch_db:crm_reveal.lead_message_template +msgid "Technology Used :" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_149 +msgid "Telecommunication Services" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_131 +msgid "Telecommunications" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_132 +msgid "Textiles" +msgstr "" + +#. module: crm_reveal +#: model:ir.model.fields,help:crm_reveal.field_crm_reveal_rule_extra_contacts +msgid "This is the number of extra contacts to track if their role and seniority match your criteria.Their details will show up in the history thread of generated leads/opportunities. One credit is consumed per tracked contact." +msgstr "" + +#. module: crm_reveal +#: model:ir.model.fields,help:crm_reveal.field_crm_reveal_rule_suffix +msgid "This will be appended in name of generated lead so you can identify lead/opportunity is generated with this rule" +msgstr "" + +#. module: crm_reveal +#: model:ir.ui.view,arch_db:crm_reveal.lead_message_template +msgid "Title" +msgstr "" + +#. module: crm_reveal +#: selection:crm.reveal.view,reveal_state:0 +msgid "To Process" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_133 +msgid "Tobacco" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_134 +msgid "Tools" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_185 +msgid "Trading Companies & Distributors" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_135 +msgid "Translation" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_136 +msgid "Transportation" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_137 +msgid "Travel & Leisure" +msgstr "" + +#. module: crm_reveal +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_rule_lead_type +msgid "Type" +msgstr "" + +#. module: crm_reveal +#: model:ir.model.fields,field_description:crm_reveal.field_crm_reveal_rule_regex_url +msgid "URL Expression" +msgstr "" + +#. module: crm_reveal +#: model:ir.model.fields,help:crm_reveal.field_crm_reveal_rule_sequence +msgid "Used to order the rules with same URL and countries. Rules with a lower sequence number will be processed first." +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_138 +msgid "Utilities" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_139 +msgid "Venture Capital" +msgstr "" + +#. module: crm_reveal +#: selection:crm.reveal.rule,priority:0 +msgid "Very High" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_140 +msgid "Veterinary" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_141 +msgid "Video Games" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_142 +msgid "Warehousing" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_143 +msgid "Web Services & Apps" +msgstr "" + +#. module: crm_reveal +#: model:ir.ui.view,arch_db:crm_reveal.crm_reveal_rule_form +msgid "Website Traffic Conditions" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_144 +msgid "Wholesale" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.industry,name:crm_reveal.crm_reveal_industry_200 +msgid "Wireless Telecommunication Services" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.role,name:crm_reveal.crm_reveal_role_1 +msgid "ceo" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.role,name:crm_reveal.crm_reveal_role_2 +msgid "communications" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.role,name:crm_reveal.crm_reveal_role_3 +msgid "consulting" +msgstr "" + +#. module: crm_reveal +#: model:ir.ui.view,arch_db:crm_reveal.crm_reveal_rule_form +msgid "credits are consumed if the company matches the rule." +msgstr "" + +#. module: crm_reveal +#: model:ir.model,name:crm_reveal.model_crm_reveal_view +msgid "crm.reveal.view" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.role,name:crm_reveal.crm_reveal_role_4 +msgid "customer_service" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.seniority,name:crm_reveal.crm_reveal_seniority_1 +msgid "director" +msgstr "" + +#. module: crm_reveal +#: model:ir.ui.view,arch_db:crm_reveal.crm_reveal_rule_form +msgid "e.g. US Visitors" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.role,name:crm_reveal.crm_reveal_role_5 +msgid "education" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.role,name:crm_reveal.crm_reveal_role_6 +msgid "engineering" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.seniority,name:crm_reveal.crm_reveal_seniority_2 +msgid "executive" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.role,name:crm_reveal.crm_reveal_role_7 +msgid "finance" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.role,name:crm_reveal.crm_reveal_role_8 +msgid "founder" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.role,name:crm_reveal.crm_reveal_role_9 +msgid "health_professional" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.role,name:crm_reveal.crm_reveal_role_10 +msgid "human_resources" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.role,name:crm_reveal.crm_reveal_role_11 +msgid "information_technology" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.role,name:crm_reveal.crm_reveal_role_12 +msgid "legal" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.seniority,name:crm_reveal.crm_reveal_seniority_3 +msgid "manager" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.role,name:crm_reveal.crm_reveal_role_13 +msgid "marketing" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.role,name:crm_reveal.crm_reveal_role_14 +msgid "operations" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.role,name:crm_reveal.crm_reveal_role_15 +msgid "owner" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.role,name:crm_reveal.crm_reveal_role_16 +msgid "president" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.role,name:crm_reveal.crm_reveal_role_17 +msgid "product" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.role,name:crm_reveal.crm_reveal_role_18 +msgid "public_relations" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.role,name:crm_reveal.crm_reveal_role_19 +msgid "real_estate" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.role,name:crm_reveal.crm_reveal_role_20 +msgid "recruiting" +msgstr "" + +#. module: crm_reveal +#: model:ir.model,name:crm_reveal.model_res_config_settings +msgid "res.config.settings" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.role,name:crm_reveal.crm_reveal_role_21 +msgid "research" +msgstr "" + +#. module: crm_reveal +#: model:crm.reveal.role,name:crm_reveal.crm_reveal_role_22 +msgid "sale" +msgstr "" + diff --git a/addons/crm_reveal/models/__init__.py b/addons/crm_reveal/models/__init__.py new file mode 100644 index 00000000000..3e82a35b377 --- /dev/null +++ b/addons/crm_reveal/models/__init__.py @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. +from . import crm_lead +from . import crm_reveal_rule +from . import crm_reveal_view +from . import ir +from . import res_config_settings diff --git a/addons/crm_reveal/models/crm_lead.py b/addons/crm_reveal/models/crm_lead.py new file mode 100644 index 00000000000..559ca19a8ba --- /dev/null +++ b/addons/crm_reveal/models/crm_lead.py @@ -0,0 +1,13 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import fields, models + + +class Lead(models.Model): + _inherit = 'crm.lead' + + reveal_ip = fields.Char(string='IP Address') + reveal_iap_credits = fields.Integer(string='IAP Credits') + reveal_rule_id = fields.Many2one('crm.reveal.rule', string='Lead Generation Rule', index=True) + reveal_id = fields.Char(string='Reveal ID', index=True) diff --git a/addons/crm_reveal/models/crm_reveal_rule.py b/addons/crm_reveal/models/crm_reveal_rule.py new file mode 100644 index 00000000000..b62d498dd54 --- /dev/null +++ b/addons/crm_reveal/models/crm_reveal_rule.py @@ -0,0 +1,517 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +import datetime +import itertools +import logging +import re +from dateutil.relativedelta import relativedelta +from math import floor, log10 + +from odoo import api, fields, models, tools, _ +from odoo.addons.iap import jsonrpc +from odoo.addons.crm.models import crm_stage +from odoo.exceptions import ValidationError + +_logger = logging.getLogger(__name__) + +DEFAULT_ENDPOINT = 'https://iap-services.odoo.com' +DEFAULT_REVEAL_BATCH_LIMIT = 25 +DEFAULT_REVEAL_MONTH_VALID = 6 + +class CRMRevealRule(models.Model): + _name = 'crm.reveal.rule' + _description = 'CRM Lead Generation Rules' + _order = 'sequence' + + name = fields.Char(string='Rule Name', required=True) + active = fields.Boolean(default=True) + + # Website Traffic Filter + country_ids = fields.Many2many('res.country', string='Countries', help='Only visitors of following countries will be converted into leads/opportunities (using GeoIP).') + regex_url = fields.Char(string='URL Expression', help='Regex to track website pages. Leave empty to track the entire website, or / to target the homepage. Example: /page* to track all the pages which begin with /page') + sequence = fields.Integer(help='Used to order the rules with same URL and countries. ' + 'Rules with a lower sequence number will be processed first.') + + # Company Criteria Filter + industry_tag_ids = fields.Many2many('crm.reveal.industry', string='Industry Tags', help='Leave empty to always match. Odoo will not create lead if no match') + company_size_min = fields.Integer(string='Min Company Size', help="Leave it as 0 if you don't want to use this filter.") + company_size_max = fields.Integer(string='Max Company Size', help="Leave it as 0 if you don't want to use this filter.") + + # Contact Generation Filter + preferred_role_id = fields.Many2one('crm.reveal.role', string='Preferred Role') + other_role_ids = fields.Many2many('crm.reveal.role', string='Other Roles') + seniority_id = fields.Many2one('crm.reveal.seniority', string='Seniority') + extra_contacts = fields.Integer(string='Extra Contacts', help='This is the number of extra contacts to track if their role and seniority match your criteria.Their details will show up in the history thread of generated leads/opportunities. One credit is consumed per tracked contact.') + + calculate_credits = fields.Integer(compute='_compute_credit_count', string='Credit Used', readonly=True) + + # Lead / Opportunity Data + lead_for = fields.Selection([('companies', 'Companies'), ('people', 'Companies + Contacts')], string='Data Tracking', required=True, default='companies', help='If you track company data, one credit will be consumed per lead/opportunity created. If you track company and contacts data, two credits will be consumed. Such data will be visible in the lead/opportunity.') + lead_type = fields.Selection([('lead', 'Lead'), ('opportunity', 'Opportunity')], string='Type', required=True, default='opportunity') + suffix = fields.Char(string='Suffix', help='This will be appended in name of generated lead so you can identify lead/opportunity is generated with this rule') + team_id = fields.Many2one('crm.team', string='Sales Channel') + tag_ids = fields.Many2many('crm.lead.tag', string='Tags') + user_id = fields.Many2one('res.users', string='Salesperson') + priority = fields.Selection(crm_stage.AVAILABLE_PRIORITIES, string='Priority') + lead_ids = fields.One2many('crm.lead', 'reveal_rule_id', string='Generated Lead / Opportunity') + leads_count = fields.Integer(compute='_compute_leads_count', string='Number of Generated Leads') + opportunity_count = fields.Integer(compute='_compute_leads_count', string='Number of Generated Opportunity') + + # This limits the number of extra contact. + # Even if more than 5 extra contacts provided service will return only 5 contacts (see service module for more) + _sql_constraints = [ + ('limit_extra_contacts', 'check(extra_contacts >= 0 and extra_contacts <= 5)', 'Maximum 5 extra contacts are allowed!'), + ] + + @api.constrains('regex_url') + def _check_regex_url(self): + try: + if self.regex_url: + re.compile(self.regex_url) + except Exception: + raise ValidationError(_('Enter Valid Regex.')) + + @api.model + def create(self, vals): + self.clear_caches() # Clear the cache in order to recompute _get_active_rules + return super(CRMRevealRule, self).create(vals) + + def write(self, vals): + fields_set = { + 'country_ids', 'regex_url', 'active' + } + if set(vals.keys()) & fields_set: + self.clear_caches() # Clear the cache in order to recompute _get_active_rules + return super(CRMRevealRule, self).write(vals) + + def unlink(self): + self.clear_caches() # Clear the cache in order to recompute _get_active_rules + return super(CRMRevealRule, self).unlink() + + @api.depends('extra_contacts', 'lead_for') + def _compute_credit_count(self): + """ Computes maximum IAP credit can be consumed per lead """ + credit = 1 + if self.lead_for == 'people': + credit += 1 + if self.extra_contacts: + credit += self.extra_contacts + self.calculate_credits = credit + + def _compute_leads_count(self): + leads = self.env['crm.lead'].read_group([ + ('reveal_rule_id', 'in', self.ids) + ], fields=['reveal_rule_id', 'type'], groupby=['reveal_rule_id', 'type'], lazy=False) + mapping = {(lead['reveal_rule_id'][0], lead['type']): lead['__count'] for lead in leads} + for rule in self: + rule.leads_count = mapping.get((rule.id, 'lead'), 0) + rule.opportunity_count = mapping.get((rule.id, 'opportunity'), 0) + + def action_get_lead_tree_view(self): + action = self.env.ref('crm.crm_lead_all_leads').read()[0] + action['domain'] = [('id', 'in', self.lead_ids.ids), ('type', '=', 'lead')] + return action + + def action_get_opportunity_tree_view(self): + action = self.env.ref('crm.crm_lead_opportunities').read()[0] + action['domain'] = [('id', 'in', self.lead_ids.ids), ('type', '=', 'opportunity')] + return action + + @api.model + @tools.ormcache() + def _get_active_rules(self): + """ + Returns informations about the all rules. + The return is in the form : + { + 'country_rules': { + 'BE': [0, 1], + 'US': [0] + }, + 'rules': [ + { + 'id': 0, + 'url': ***, + 'country_codes': ['BE', 'US'] + }, + { + 'id': 1, + 'url': ***, + 'country_codes': ['BE'] + } + ] + } + """ + country_rules = {} + rules_records = self.search([]) + rules = [] + # Fixes for special cases + for rule in rules_records: + regex_url = rule['regex_url'] + if not regex_url: + regex_url = '.*' # for all pages if url not given + elif regex_url == '/': + regex_url = '.*/$' # for home + countries = rule.country_ids.mapped('code') + rules.append({ + 'id': rule.id, + 'regex': regex_url, + 'country_codes': countries + }) + for country in countries: + country_rules = self._add_to_country(country_rules, country, len(rules) - 1) + return { + 'country_rules': country_rules, + 'rules': rules, + } + + def _add_to_country(self, country_rules, country, rule_index): + """ + Add the rule index to the country code in the country_rules + """ + if country not in country_rules: + country_rules[country] = [] + country_rules[country].append(rule_index) + return country_rules + + def _match_url(self, url, country_code, rules_excluded): + """ + Return the matching rule based on the country and URL. + """ + all_rules = self._get_active_rules() + rules_id = all_rules['country_rules'].get(country_code, []) + rules_matched = [] + for rule_index in rules_id: + rule = all_rules['rules'][rule_index] + if str(rule['id']) not in rules_excluded and re.search(rule['regex'], url): + rules_matched.append(rule) + return rules_matched + + @api.model + def _process_lead_generation(self, autocommit=True): + """ Cron Job for lead generation from page view """ + _logger.info('Start Reveal Lead Generation') + self.env['crm.reveal.view']._clean_reveal_views() + self._unlink_unrelevant_reveal_view() + reveal_views = self._get_reveal_views_to_process() + view_count = 0 + while reveal_views: + view_count += len(reveal_views) + server_payload = self._prepare_iap_payload(dict(reveal_views)) + enough_credit = self._perform_reveal_service(server_payload) + if autocommit: + # auto-commit for batch processing + self._cr.commit() + if enough_credit: + reveal_views = self._get_reveal_views_to_process() + else: + reveal_views = False + _logger.info('End Reveal Lead Generation - %s views processed', view_count) + + @api.model + def _unlink_unrelevant_reveal_view(self): + """ + We don't want to create the lead if in past (<6 months) we already + created lead with given IP. So, we unlink crm.reveal.view with same IP + as a already created lead. + """ + months_valid = self.env['ir.config_parameter'].sudo().get_param('reveal.lead_month_valid', DEFAULT_REVEAL_MONTH_VALID) + try: + months_valid = int(months_valid) + except ValueError: + months_valid = DEFAULT_REVEAL_MONTH_VALID + domain = [] + domain.append(('reveal_ip', '!=', False)) + domain.append(('create_date', '>', fields.Datetime.to_string(datetime.date.today() - relativedelta(months=months_valid)))) + leads = self.env['crm.lead'].with_context(active_test=False).search(domain) + self.env['crm.reveal.view'].search([('reveal_ip', 'in', [lead.reveal_ip for lead in leads])]).unlink() + + @api.model + def _get_reveal_views_to_process(self): + """ Return list of reveal rule ids grouped by IPs """ + batch_limit = self.env['ir.config_parameter'].sudo().get_param('reveal.fetch_limit', DEFAULT_REVEAL_BATCH_LIMIT) + try: + batch_limit = int(batch_limit) + except ValueError: + batch_limit = DEFAULT_REVEAL_BATCH_LIMIT + + query = """ + SELECT v.reveal_ip, array_agg(v.reveal_rule_id ORDER BY r.sequence) + FROM crm_reveal_view v + INNER JOIN crm_reveal_rule r + ON v.reveal_rule_id = r.id + WHERE v.reveal_state='to_process' + GROUP BY v.reveal_ip + LIMIT %d + """ % batch_limit + + self.env.cr.execute(query) + return self.env.cr.fetchall() + + def _prepare_iap_payload(self, pgv): + """ This will prepare the page view and returns payload + Payload sample + { + ips: { + '192.168.1.1': [1,4], + '192.168.1.6': [2,4] + }, + rules: { + 1: {rule_data}, + 2: {rule_data}, + 4: {rule_data} + } + } + """ + new_list = list(set(itertools.chain.from_iterable(pgv.values()))) + rule_records = self.browse(new_list) + return { + 'ips': pgv, + 'rules': rule_records._get_rules_payload() + } + + def _get_rules_payload(self): + company_country = self.env.user.company_id.country_id + rule_payload = {} + for rule in self: + data = { + 'rule_id': rule.id, + 'lead_for': rule.lead_for, + 'countries': rule.country_ids.mapped('code'), + 'company_size_min': rule.company_size_min, + 'company_size_max': rule.company_size_max, + 'industry_tags': rule.industry_tag_ids.mapped('reveal_id'), + 'user_country': company_country and company_country.code or False + } + if rule.lead_for == 'people': + data.update({ + 'preferred_role': rule.preferred_role_id.reveal_id or '', + 'other_roles': rule.other_role_ids.mapped('reveal_id'), + 'seniority': rule.seniority_id.reveal_id or '', + 'extra_contacts': rule.extra_contacts + }) + rule_payload[rule.id] = data + return rule_payload + + def _perform_reveal_service(self, server_payload): + result = False + account_token = self.env['iap.account'].get('reveal') + endpoint = self.env['ir.config_parameter'].sudo().get_param('reveal.endpoint', DEFAULT_ENDPOINT) + '/iap/clearbit/1/reveal' + params = { + 'account_token': account_token.account_token, + 'data': server_payload + } + result = jsonrpc(endpoint, params=params) + for res in result.get('reveal_data', []): + if not res.get('not_found'): + lead = self._create_lead_from_response(res) + self.env['crm.reveal.view'].search([('reveal_ip', '=', res['ip'])]).unlink() + else: + self.env['crm.reveal.view'].search([('reveal_ip', '=', res['ip'])]).write({ + 'reveal_state': 'not_found' + }) + if result.get('credit_error'): + self._notify_no_more_credit() + return False + else: + self.env['ir.config_parameter'].sudo().set_param('reveal.already_notified', False) + return True + + def _notify_no_more_credit(self): + """ + Notify about the number of credit. + In order to avoid to spam people each hour, an ir.config_parameter is set + """ + already_notified = self.env['ir.config_parameter'].sudo().get_param('reveal.already_notified', False) + if already_notified: + return + mail_template = self.env.ref('crm_reveal.reveal_no_credits') + iap_account = self.env['iap.account'].search([('service_name', '=', 'reveal')], limit=1) + # Get the email address of the creators of the Lead Generation Rules + res = self.env['crm.reveal.rule'].search_read([], ['create_uid']) + uids = set(r['create_uid'][0] for r in res if r.get('create_uid')) + res = self.env['res.users'].search_read([('id', 'in', list(uids))], ['email']) + emails = set(r['email'] for r in res if r.get('email')) + + mail_values = mail_template.generate_email(iap_account.id) + mail_values['email_to'] = ','.join(emails) + mail = self.env['mail.mail'].create(mail_values) + mail.send() + self.env['ir.config_parameter'].sudo().set_param('reveal.already_notified', True) + + + def _create_lead_from_response(self, result): + """ This method will get response from service and create the lead accordingly """ + if result['rule_id']: + rule = self.browse(result['rule_id']) + else: + # Not create a lead if the information match no rule + # If there is no match, the service still returns all informations + # in order to let custom code use it. + return False + if not result['clearbit_id']: + return False + already_created_lead = self.env['crm.lead'].search([('reveal_id', '=', result['clearbit_id'])]) + if already_created_lead: + _logger.info('Existing lead for this clearbit_id [%s]', result['clearbit_id']) + # Does not create a lead if the reveal_id is already known + return False + lead_vals = rule._lead_vals_from_response(result) + lead = self.env['crm.lead'].create(lead_vals) + lead.message_post_with_view( + 'crm_reveal.lead_message_template', + values=self._format_data_for_message_post(result), + subtype_id=self.env.ref('mail.mt_note').id + ) + return lead + + # Methods responsible for format response data in to valid odoo lead data + def _lead_vals_from_response(self, result): + self.ensure_one() + reveal_data = result['reveal_data'] + people_data = result.get('people_data') + country_id = self.env['res.country'].search([('code', '=', reveal_data['country_code'])]).id + website_url = 'https://www.%s' % reveal_data['domain'] if reveal_data['domain'] else False + lead_vals = { + # Lead vals from rule itself + 'type': self.lead_type, + 'team_id': self.team_id.id, + 'tag_ids': [(6, 0, self.tag_ids.ids)], + 'priority': self.priority, + 'user_id': self.user_id.id, + 'reveal_ip': result['ip'], + 'reveal_rule_id': self.id, + 'reveal_id': result['clearbit_id'], + 'referred': 'Website Visitor', + # Lead vals from response + 'name': reveal_data['name'], + 'reveal_iap_credits': result['credit'], + 'partner_name': reveal_data['legal_name'] or reveal_data['name'], + 'email_from': ",".join(reveal_data['email'] or []), + 'phone': reveal_data['phone'] or (reveal_data['phone_numbers'] and reveal_data['phone_numbers'][0]) or '', + 'website': website_url, + 'street': reveal_data['location'], + 'city': reveal_data['city'], + 'zip': reveal_data['postal_code'], + 'country_id': country_id, + 'state_id': self._find_state_id(reveal_data['state_name'], reveal_data['state_code'], country_id), + 'description': self._prepare_lead_description(reveal_data), + } + + if self.suffix: + lead_vals['name'] = '%s - %s' % (lead_vals['name'], self.suffix) + + # If type is people then add first contact in lead data + if people_data: + lead_vals.update({ + 'contact_name': people_data[0]['full_name'], + 'email_from': people_data[0]['email'], + 'function': people_data[0]['title'], + }) + return lead_vals + + def _find_state_id(self, state_code, state_name, country_id): + state_id = self.env['res.country.state'].search([('code', '=', state_code), ('country_id', '=', country_id)]) + if state_id: + return state_id.id + return False + + def _prepare_lead_description(self, reveal_data): + description = '' + if reveal_data['sector']: + description += reveal_data['sector'] + if reveal_data['website_title']: + description += '\n' + reveal_data['website_title'] + if reveal_data['twitter_bio']: + description += '\n' + "Twitter Bio: " + reveal_data['twitter_bio'] + if reveal_data['twitter_followers']: + description += ('\nTwitter %s followers, %s \n') % (reveal_data['twitter_followers'], reveal_data['twitter_location'] or '') + + numbers = ['raised', 'market_cap', 'employees', 'estimated_annual_revenue'] + millnames = ['', ' K', ' M', ' B', 'T'] + + def millify(n): + try: + n = float(n) + millidx = max(0, min(len(millnames) - 1, int(floor(0 if n == 0 else log10(abs(n)) / 3)))) + return '{:.0f}{}'.format(n / 10**(3 * millidx), millnames[millidx]) + except Exception: + return n + + for key in numbers: + if reveal_data.get(key): + description += ' %s : %s,' % (key.replace('_', ' ').title(), millify(reveal_data[key])) + return description + + def _format_data_for_message_post(self, result): + reveal_data = result['reveal_data'] + people_data = result.get('people_data') + log_data = { + 'twitter': reveal_data['twitter'], + 'description': reveal_data['description'], + 'logo': reveal_data['logo'], + 'name': reveal_data['name'], + 'phone_numbers': reveal_data['phone_numbers'], + 'facebook': reveal_data['facebook'], + 'linkedin': reveal_data['linkedin'], + 'crunchbase': reveal_data['crunchbase'], + 'tech': [t.replace('_', ' ').title() for t in reveal_data['tech']], + 'people_data': people_data, + } + timezone = result['ip_time_zone'] or reveal_data['timezone'] + if timezone: + log_data.update({ + 'timezone': timezone.replace('_', ' ').title(), + 'timezone_link': timezone.lower().replace('_', '-'), + }) + return log_data + + +class IndustryTag(models.Model): + """ Industry Tags of Acquisition Rules """ + _name = 'crm.reveal.industry' + _description = 'Industry Tag' + + name = fields.Char(string='Tag Name', required=True, translate=True) + reveal_id = fields.Char(required=True) + color = fields.Integer(string='Color Index') + + _sql_constraints = [ + ('name_uniq', 'unique (name)', 'Tag name already exists!'), + ] + + +class PeopleRole(models.Model): + """ CRM Reveal People Roles for People """ + _name = 'crm.reveal.role' + _description = 'People Role' + + name = fields.Char(string='Role Name', required=True, translate=True) + reveal_id = fields.Char(required=True) + color = fields.Integer(string='Color Index') + + _sql_constraints = [ + ('name_uniq', 'unique (name)', 'Role name already exists!'), + ] + + @api.depends('name') + def name_get(self): + return [(role.id, role.name.replace('_', ' ').title()) for role in self] + + +class PeopleSeniority(models.Model): + """ Seniority for People Rules """ + _name = 'crm.reveal.seniority' + _description = 'People Seniority' + + name = fields.Char(string='Name', required=True, translate=True) + reveal_id = fields.Char(required=True) + + _sql_constraints = [ + ('name_uniq', 'unique (name)', 'Name already exists!'), + ] + + @api.depends('name') + def name_get(self): + return [(seniority.id, seniority.name.replace('_', ' ').title()) for seniority in self] diff --git a/addons/crm_reveal/models/crm_reveal_view.py b/addons/crm_reveal/models/crm_reveal_view.py new file mode 100644 index 00000000000..7a732f8ff2f --- /dev/null +++ b/addons/crm_reveal/models/crm_reveal_view.py @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +import datetime +from dateutil.relativedelta import relativedelta +from odoo import api, fields, models + +DEFAULT_REVEAL_VIEW_WEEKS_VALID = 5 + +class CRMRevealView(models.Model): + _name = 'crm.reveal.view' + _order = 'id desc' + + reveal_ip = fields.Char(string='IP Address', index=True) + reveal_rule_id = fields.Many2one('crm.reveal.rule', string='Lead Generation Rule', index=True) + reveal_state = fields.Selection([('to_process', 'To Process'), ('not_found', 'Not Found')], default='to_process', string="State", index=True) + create_date = fields.Datetime(index=True) + + @api.model_cr + def init(self): + self._cr.execute('SELECT indexname FROM pg_indexes WHERE indexname = %s', ('crm_reveal_view_ip_rule_id',)) + if not self._cr.fetchone(): + self._cr.execute('CREATE UNIQUE INDEX crm_reveal_view_ip_rule_id ON crm_reveal_view (reveal_rule_id,reveal_ip)') + self._cr.execute('SELECT indexname FROM pg_indexes WHERE indexname = %s', ('crm_reveal_view_state_create_date',)) + if not self._cr.fetchone(): + self._cr.execute('CREATE INDEX crm_reveal_view_state_create_date ON crm_reveal_view (reveal_state,create_date)') + + + @api.model + def _clean_reveal_views(self): + """ Remove old views (> 1 month) """ + weeks_valid = self.env['ir.config_parameter'].sudo().get_param('reveal.view_weeks_valid', DEFAULT_REVEAL_VIEW_WEEKS_VALID) + try: + weeks_valid = int(weeks_valid) + except ValueError: + weeks_valid = DEFAULT_REVEAL_VIEW_WEEKS_VALID + domain = [] + domain.append(('reveal_state', '=', 'not_found')) + domain.append(('create_date', '<', fields.Datetime.to_string(datetime.date.today() - relativedelta(weeks=weeks_valid)))) + self.search(domain).unlink() + + def _create_reveal_view(self, url, ip_address, country_code, rules_excluded): + # we are avoiding reveal if reveal_view already created for this IP + rules = self.env['crm.reveal.rule']._match_url(url, country_code, rules_excluded) + if rules: + query = """ + INSERT INTO crm_reveal_view (reveal_ip, reveal_rule_id, reveal_state, create_date) + VALUES (%s, %s, 'to_process', now() at time zone 'UTC') + ON CONFLICT DO NOTHING; + """ * len(rules) + params = [] + for rule in rules: + params += [ip_address, rule['id']] + rules_excluded.append(str(rule['id'])) + self.env.cr.execute(query, params) + return rules_excluded + return False \ No newline at end of file diff --git a/addons/crm_reveal/models/ir.py b/addons/crm_reveal/models/ir.py new file mode 100644 index 00000000000..fcc3eac46c7 --- /dev/null +++ b/addons/crm_reveal/models/ir.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +import logging +import time + +from odoo import models +from odoo.http import request + +_logger = logging.getLogger(__name__) + +class IrHttp(models.AbstractModel): + _inherit = 'ir.http' + + @classmethod + def _serve_page(cls): + response = super(IrHttp, cls)._serve_page() + if response and getattr(response, 'status_code', 0) == 200 and request.env.user._is_public(): + lead_id = request.httprequest.cookies.get('lead_id') + # We are avoiding to create a reveal_view if a lead is already + # created from another module, e.g. website_form + if not lead_id: + country_code = 'geoip' in request.session and request.session['geoip'].get('country_code') + if country_code: + try: + url = request.httprequest.url + ip_address = request.httprequest.remote_addr + rules_excluded = (request.httprequest.cookies.get('rule_ids') or '').split(',') + before = time.time() + new_rules_excluded = request.env['crm.reveal.view'].sudo()._create_reveal_view(url, ip_address, country_code, rules_excluded) + # even when we match, no view may have been created if this is a duplicate + _logger.info('Reveal process time: [%s], match rule: [%s?], country code: [%s], ip: [%s]', + time.time() - before, new_rules_excluded == rules_excluded, country_code, + ip_address) + if new_rules_excluded: + response.set_cookie('rule_ids', ','.join(new_rules_excluded)) + except Exception: + # just in case - we never want to crash a page view + _logger.exception("Failed to process reveal rules") + return response diff --git a/addons/crm_reveal/models/res_config_settings.py b/addons/crm_reveal/models/res_config_settings.py new file mode 100644 index 00000000000..981533b36cd --- /dev/null +++ b/addons/crm_reveal/models/res_config_settings.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import api, fields, models + +class ResConfigSettings(models.TransientModel): + _inherit = 'res.config.settings' + + @api.multi + def action_buy_reveal_iap_credits(self): + url = self.env['iap.account'].get_credits_url('reveal', 'https://iap.odoo.com/iap/1/credit', 0) + return { + 'type': 'ir.actions.act_url', + 'url': url, + 'target': 'new', + } diff --git a/addons/crm_reveal/security/ir.model.access.csv b/addons/crm_reveal/security/ir.model.access.csv new file mode 100644 index 00000000000..cf928b4b1c3 --- /dev/null +++ b/addons/crm_reveal/security/ir.model.access.csv @@ -0,0 +1,6 @@ +id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink +access_crm_reveal_rule,access_crm_reveal_rule,model_crm_reveal_rule,sales_team.group_sale_manager,1,1,1,1 +access_crm_reveal_view,access_crm_reveal_view,model_crm_reveal_view,sales_team.group_sale_manager,1,1,1,1 +access_crm_reveal_industry,access_crm_reveal_industry,model_crm_reveal_industry,sales_team.group_sale_manager,1,1,1,1 +access_crm_reveal_role,access_crm_reveal_role,model_crm_reveal_role,sales_team.group_sale_manager,1,1,1,1 +access_crm_reveal_seniority,access_crm_reveal_seniority,model_crm_reveal_seniority,sales_team.group_sale_manager,1,1,1,1 diff --git a/addons/crm_reveal/views/crm_lead_view.xml b/addons/crm_reveal/views/crm_lead_view.xml new file mode 100644 index 00000000000..dceca922350 --- /dev/null +++ b/addons/crm_reveal/views/crm_lead_view.xml @@ -0,0 +1,33 @@ + + + + + crm.lead.form + crm.lead + + + + + + + + + + + + + + crm.lead.opportunity.inherited.crm + crm.lead + + + + + + + + + + + + diff --git a/addons/crm_reveal/views/crm_reveal_views.xml b/addons/crm_reveal/views/crm_reveal_views.xml new file mode 100644 index 00000000000..45bc19b2f1f --- /dev/null +++ b/addons/crm_reveal/views/crm_reveal_views.xml @@ -0,0 +1,165 @@ + + + + crm.reveal.rule.form + crm.reveal.rule + +
+ +
+ + + +
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + + crm.reveal.rule.tree + crm.reveal.rule + + + + + + + + + + + Lead Generation Rules + crm.reveal.rule + tree,form + +

+ No rule found +

+ Create rules to generate B2B leads/opportunities by tracking data of your website visitors. +

+
+
+ + + crm.reveal.view.form + crm.reveal.view + +
+
+ +
+ + + + + + + + +
+
+
+ + + crm.reveal.view.tree + crm.reveal.view + + + + + + + + + + + + Lead Generation Views + crm.reveal.view + tree,form + + + + + + + +
diff --git a/addons/crm_reveal/views/res_config_settings_views.xml b/addons/crm_reveal/views/res_config_settings_views.xml new file mode 100644 index 00000000000..e1c2945430a --- /dev/null +++ b/addons/crm_reveal/views/res_config_settings_views.xml @@ -0,0 +1,23 @@ + + + + res.config.settings.view.form.inherit.crm.reveal + res.config.settings + + +
+
+
+
+
+
+
+
+