From 60cfccbf7730d1dc62caccda9c758b865166000d Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Tue, 17 Feb 2015 10:36:54 +0530 Subject: [PATCH] [new-module] crm --- erpnext/config/crm.py | 126 ++++++++++++++++++ erpnext/config/desktop.py | 5 + erpnext/controllers/selling_controller.py | 2 +- erpnext/crm/__init__.py | 0 erpnext/crm/doctype/__init__.py | 0 erpnext/crm/doctype/lead/.py | 9 ++ erpnext/crm/doctype/lead/__init__.py | 0 erpnext/{selling => crm}/doctype/lead/lead.js | 4 +- .../{selling => crm}/doctype/lead/lead.json | 4 +- erpnext/{selling => crm}/doctype/lead/lead.py | 0 .../doctype/lead/test_lead.py | 2 +- .../doctype/lead/test_records.json | 0 .../doctype/opportunity/README.md | 0 erpnext/crm/doctype/opportunity/__init__.py | 0 .../doctype/opportunity/opportunity.js | 10 +- .../doctype/opportunity/opportunity.json | 4 +- .../doctype/opportunity/opportunity.py | 0 .../doctype/opportunity/opportunity_list.js | 0 .../doctype/opportunity/test_opportunity.py | 0 .../doctype/opportunity/test_records.json | 0 erpnext/modules.txt | 5 +- erpnext/patches.txt | 2 + erpnext/selling/doctype/lead/README.md | 1 - erpnext/selling/doctype/lead/__init__.py | 1 - erpnext/selling/doctype/lead/lead_list.js | 9 -- .../selling/doctype/opportunity/__init__.py | 1 - .../selling/doctype/quotation/quotation.js | 4 +- .../selling/doctype/quotation/quotation.py | 2 +- .../doctype/email_digest/email_digest.py | 3 +- .../setup/doctype/item_group/item_group.json | 16 +-- 30 files changed, 171 insertions(+), 39 deletions(-) create mode 100644 erpnext/config/crm.py create mode 100644 erpnext/crm/__init__.py create mode 100644 erpnext/crm/doctype/__init__.py create mode 100644 erpnext/crm/doctype/lead/.py create mode 100644 erpnext/crm/doctype/lead/__init__.py rename erpnext/{selling => crm}/doctype/lead/lead.js (93%) rename erpnext/{selling => crm}/doctype/lead/lead.json (99%) rename erpnext/{selling => crm}/doctype/lead/lead.py (100%) rename erpnext/{selling => crm}/doctype/lead/test_lead.py (91%) rename erpnext/{selling => crm}/doctype/lead/test_records.json (100%) rename erpnext/{selling => crm}/doctype/opportunity/README.md (100%) create mode 100644 erpnext/crm/doctype/opportunity/__init__.py rename erpnext/{selling => crm}/doctype/opportunity/opportunity.js (93%) rename erpnext/{selling => crm}/doctype/opportunity/opportunity.json (99%) rename erpnext/{selling => crm}/doctype/opportunity/opportunity.py (100%) rename erpnext/{selling => crm}/doctype/opportunity/opportunity_list.js (100%) rename erpnext/{selling => crm}/doctype/opportunity/test_opportunity.py (100%) rename erpnext/{selling => crm}/doctype/opportunity/test_records.json (100%) delete mode 100644 erpnext/selling/doctype/lead/README.md delete mode 100644 erpnext/selling/doctype/lead/__init__.py delete mode 100644 erpnext/selling/doctype/lead/lead_list.js delete mode 100644 erpnext/selling/doctype/opportunity/__init__.py diff --git a/erpnext/config/crm.py b/erpnext/config/crm.py new file mode 100644 index 0000000000..74909c4f5d --- /dev/null +++ b/erpnext/config/crm.py @@ -0,0 +1,126 @@ +from frappe import _ + +def get_data(): + return [ + { + "label": _("Documents"), + "icon": "icon-star", + "items": [ + { + "type": "doctype", + "name": "Lead", + "description": _("Database of potential customers."), + }, + { + "type": "doctype", + "name": "Customer", + "description": _("Customer database."), + }, + { + "type": "doctype", + "name": "Opportunity", + "description": _("Potential opportunities for selling."), + }, + { + "type": "doctype", + "name": "Contact", + "description": _("All Contacts."), + }, + { + "type": "doctype", + "name": "Newsletter", + "description": _("Newsletters to contacts, leads."), + }, + ] + }, + { + "label": _("Tools"), + "icon": "icon-wrench", + "items": [ + { + "type": "doctype", + "name": "SMS Center", + "description":_("Send mass SMS to your contacts"), + }, + ] + }, + { + "label": _("Setup"), + "icon": "icon-cog", + "items": [ + { + "type": "doctype", + "name": "Campaign", + "description": _("Sales campaigns."), + }, + { + "type": "page", + "label": _("Customer Group"), + "name": "Sales Browser", + "icon": "icon-sitemap", + "link": "Sales Browser/Customer Group", + "description": _("Manage Customer Group Tree."), + "doctype": "Customer Group", + }, + { + "type": "page", + "label": _("Territory"), + "name": "Sales Browser", + "icon": "icon-sitemap", + "link": "Sales Browser/Territory", + "description": _("Manage Territory Tree."), + "doctype": "Territory", + }, + { + "type": "page", + "label": _("Sales Person"), + "name": "Sales Browser", + "icon": "icon-sitemap", + "link": "Sales Browser/Sales Person", + "description": _("Manage Sales Person Tree."), + "doctype": "Sales Person", + }, + { + "type": "doctype", + "name": "SMS Settings", + "description": _("Setup SMS gateway settings") + }, + ] + }, + { + "label": _("Main Reports"), + "icon": "icon-table", + "items": [ + { + "type": "page", + "name": "sales-funnel", + "label": _("Sales Funnel"), + "icon": "icon-bar-chart", + }, + ] + }, + { + "label": _("Standard Reports"), + "icon": "icon-list", + "items": [ + { + "type": "report", + "is_query_report": True, + "name": "Lead Details", + "doctype": "Lead" + }, + { + "type": "report", + "is_query_report": True, + "name": "Customer Addresses and Contacts", + "doctype": "Contact" + }, + { + "type": "report", + "is_query_report": True, + "name": "Customers Not Buying Since Long Time", + "doctype": "Sales Order" + }, + ] + }, + ] diff --git a/erpnext/config/desktop.py b/erpnext/config/desktop.py index 7d2a620f4e..dbeb8d1db7 100644 --- a/erpnext/config/desktop.py +++ b/erpnext/config/desktop.py @@ -45,6 +45,11 @@ def get_data(): "icon": "octicon octicon-tag", "type": "module" }, + "CRM": { + "color": "#EF4DB6", + "icon": "octicon octicon-broadcast", + "type": "module" + }, "Stock": { "color": "#f39c12", "icon": "icon-truck", diff --git a/erpnext/controllers/selling_controller.py b/erpnext/controllers/selling_controller.py index 0e56fc7560..4e06b6b162 100644 --- a/erpnext/controllers/selling_controller.py +++ b/erpnext/controllers/selling_controller.py @@ -55,7 +55,7 @@ class SellingController(StockController): self.update_if_missing(party_details) elif getattr(self, "lead", None): - from erpnext.selling.doctype.lead.lead import get_lead_details + from erpnext.crm.doctype.lead.lead import get_lead_details self.update_if_missing(get_lead_details(self.lead)) def set_price_list_and_item_details(self): diff --git a/erpnext/crm/__init__.py b/erpnext/crm/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/crm/doctype/__init__.py b/erpnext/crm/doctype/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/crm/doctype/lead/.py b/erpnext/crm/doctype/lead/.py new file mode 100644 index 0000000000..70a6b22a99 --- /dev/null +++ b/erpnext/crm/doctype/lead/.py @@ -0,0 +1,9 @@ +# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class Lead(Document): + pass diff --git a/erpnext/crm/doctype/lead/__init__.py b/erpnext/crm/doctype/lead/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/selling/doctype/lead/lead.js b/erpnext/crm/doctype/lead/lead.js similarity index 93% rename from erpnext/selling/doctype/lead/lead.js rename to erpnext/crm/doctype/lead/lead.js index 170e718654..b2eab162ff 100644 --- a/erpnext/selling/doctype/lead/lead.js +++ b/erpnext/crm/doctype/lead/lead.js @@ -41,14 +41,14 @@ erpnext.LeadController = frappe.ui.form.Controller.extend({ create_customer: function() { frappe.model.open_mapped_doc({ - method: "erpnext.selling.doctype.lead.lead.make_customer", + method: "erpnext.crm.doctype.lead.lead.make_customer", frm: cur_frm }) }, create_opportunity: function() { frappe.model.open_mapped_doc({ - method: "erpnext.selling.doctype.lead.lead.make_opportunity", + method: "erpnext.crm.doctype.lead.lead.make_opportunity", frm: cur_frm }) } diff --git a/erpnext/selling/doctype/lead/lead.json b/erpnext/crm/doctype/lead/lead.json similarity index 99% rename from erpnext/selling/doctype/lead/lead.json rename to erpnext/crm/doctype/lead/lead.json index de43be72c0..32b604d1f2 100644 --- a/erpnext/selling/doctype/lead/lead.json +++ b/erpnext/crm/doctype/lead/lead.json @@ -331,9 +331,9 @@ ], "icon": "icon-user", "idx": 1, - "modified": "2015-02-05 05:11:40.379661", + "modified": "2015-02-16 23:54:10.622839", "modified_by": "Administrator", - "module": "Selling", + "module": "CRM", "name": "Lead", "owner": "Administrator", "permissions": [ diff --git a/erpnext/selling/doctype/lead/lead.py b/erpnext/crm/doctype/lead/lead.py similarity index 100% rename from erpnext/selling/doctype/lead/lead.py rename to erpnext/crm/doctype/lead/lead.py diff --git a/erpnext/selling/doctype/lead/test_lead.py b/erpnext/crm/doctype/lead/test_lead.py similarity index 91% rename from erpnext/selling/doctype/lead/test_lead.py rename to erpnext/crm/doctype/lead/test_lead.py index 218e75ab4c..181d75b8f8 100644 --- a/erpnext/selling/doctype/lead/test_lead.py +++ b/erpnext/crm/doctype/lead/test_lead.py @@ -10,7 +10,7 @@ test_records = frappe.get_test_records('Lead') class TestLead(unittest.TestCase): def test_make_customer(self): - from erpnext.selling.doctype.lead.lead import make_customer + from erpnext.crm.doctype.lead.lead import make_customer frappe.delete_doc_if_exists("Customer", "_Test Lead") diff --git a/erpnext/selling/doctype/lead/test_records.json b/erpnext/crm/doctype/lead/test_records.json similarity index 100% rename from erpnext/selling/doctype/lead/test_records.json rename to erpnext/crm/doctype/lead/test_records.json diff --git a/erpnext/selling/doctype/opportunity/README.md b/erpnext/crm/doctype/opportunity/README.md similarity index 100% rename from erpnext/selling/doctype/opportunity/README.md rename to erpnext/crm/doctype/opportunity/README.md diff --git a/erpnext/crm/doctype/opportunity/__init__.py b/erpnext/crm/doctype/opportunity/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/selling/doctype/opportunity/opportunity.js b/erpnext/crm/doctype/opportunity/opportunity.js similarity index 93% rename from erpnext/selling/doctype/opportunity/opportunity.js rename to erpnext/crm/doctype/opportunity/opportunity.js index 1180793f82..a0ebcce6eb 100644 --- a/erpnext/selling/doctype/opportunity/opportunity.js +++ b/erpnext/crm/doctype/opportunity/opportunity.js @@ -7,12 +7,12 @@ frappe.ui.form.on_change("Opportunity", "customer_address", erpnext.utils.get_ad frappe.ui.form.on_change("Opportunity", "contact_person", erpnext.utils.get_contact_details); -frappe.provide("erpnext.selling"); +frappe.provide("erpnext.crm"); frappe.require("assets/erpnext/js/utils.js"); cur_frm.email_field = "contact_email"; // TODO commonify this code -erpnext.selling.Opportunity = frappe.ui.form.Controller.extend({ +erpnext.crm.Opportunity = frappe.ui.form.Controller.extend({ onload: function() { if(!this.frm.doc.enquiry_from && this.frm.doc.customer) this.frm.doc.enquiry_from = "Customer"; @@ -62,13 +62,13 @@ erpnext.selling.Opportunity = frappe.ui.form.Controller.extend({ create_quotation: function() { frappe.model.open_mapped_doc({ - method: "erpnext.selling.doctype.opportunity.opportunity.make_quotation", + method: "erpnext.crm.doctype.opportunity.opportunity.make_quotation", frm: cur_frm }) } }); -$.extend(cur_frm.cscript, new erpnext.selling.Opportunity({frm: cur_frm})); +$.extend(cur_frm.cscript, new erpnext.crm.Opportunity({frm: cur_frm})); cur_frm.cscript.refresh = function(doc, cdt, cdn) { erpnext.toggle_naming_series(); @@ -102,7 +102,7 @@ cur_frm.cscript.item_code = function(doc, cdt, cdn) { cur_frm.cscript.lead = function(doc, cdt, cdn) { cur_frm.toggle_display("contact_info", doc.customer || doc.lead); frappe.model.map_current_doc({ - method: "erpnext.selling.doctype.lead.lead.make_opportunity", + method: "erpnext.crm.doctype.lead.lead.make_opportunity", source_name: cur_frm.doc.lead, frm: cur_frm }); diff --git a/erpnext/selling/doctype/opportunity/opportunity.json b/erpnext/crm/doctype/opportunity/opportunity.json similarity index 99% rename from erpnext/selling/doctype/opportunity/opportunity.json rename to erpnext/crm/doctype/opportunity/opportunity.json index 980de56db7..751df21c50 100644 --- a/erpnext/selling/doctype/opportunity/opportunity.json +++ b/erpnext/crm/doctype/opportunity/opportunity.json @@ -391,9 +391,9 @@ "icon": "icon-info-sign", "idx": 1, "is_submittable": 1, - "modified": "2015-02-05 05:11:41.732687", + "modified": "2015-02-16 23:52:23.489259", "modified_by": "Administrator", - "module": "Selling", + "module": "CRM", "name": "Opportunity", "owner": "Administrator", "permissions": [ diff --git a/erpnext/selling/doctype/opportunity/opportunity.py b/erpnext/crm/doctype/opportunity/opportunity.py similarity index 100% rename from erpnext/selling/doctype/opportunity/opportunity.py rename to erpnext/crm/doctype/opportunity/opportunity.py diff --git a/erpnext/selling/doctype/opportunity/opportunity_list.js b/erpnext/crm/doctype/opportunity/opportunity_list.js similarity index 100% rename from erpnext/selling/doctype/opportunity/opportunity_list.js rename to erpnext/crm/doctype/opportunity/opportunity_list.js diff --git a/erpnext/selling/doctype/opportunity/test_opportunity.py b/erpnext/crm/doctype/opportunity/test_opportunity.py similarity index 100% rename from erpnext/selling/doctype/opportunity/test_opportunity.py rename to erpnext/crm/doctype/opportunity/test_opportunity.py diff --git a/erpnext/selling/doctype/opportunity/test_records.json b/erpnext/crm/doctype/opportunity/test_records.json similarity index 100% rename from erpnext/selling/doctype/opportunity/test_records.json rename to erpnext/crm/doctype/opportunity/test_records.json diff --git a/erpnext/modules.txt b/erpnext/modules.txt index 243c2d859f..255fbc5709 100644 --- a/erpnext/modules.txt +++ b/erpnext/modules.txt @@ -1,10 +1,11 @@ Accounts +CRM Buying -HR -Manufacturing Projects Selling Setup +HR +Manufacturing Stock Support Utilities diff --git a/erpnext/patches.txt b/erpnext/patches.txt index 00db68fadc..849e953f8d 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -108,3 +108,5 @@ erpnext.patches.v5_0.remove_shopping_cart_app erpnext.patches.v5_0.update_companywise_payment_account erpnext.patches.v5_0.remove_birthday_events erpnext.patches.v5_0.update_item_name_in_bom +execute:frappe.reload_doc('crm', 'doctype', 'lead') +execute:frappe.reload_doc('crm', 'doctype', 'opportunity') diff --git a/erpnext/selling/doctype/lead/README.md b/erpnext/selling/doctype/lead/README.md deleted file mode 100644 index a12dcf6b8e..0000000000 --- a/erpnext/selling/doctype/lead/README.md +++ /dev/null @@ -1 +0,0 @@ -Prospective customer / prospect database. List of all prospects that could be source of business. \ No newline at end of file diff --git a/erpnext/selling/doctype/lead/__init__.py b/erpnext/selling/doctype/lead/__init__.py deleted file mode 100644 index baffc48825..0000000000 --- a/erpnext/selling/doctype/lead/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from __future__ import unicode_literals diff --git a/erpnext/selling/doctype/lead/lead_list.js b/erpnext/selling/doctype/lead/lead_list.js deleted file mode 100644 index 9bbde6c4af..0000000000 --- a/erpnext/selling/doctype/lead/lead_list.js +++ /dev/null @@ -1,9 +0,0 @@ -frappe.listview_settings['Lead'] = { - add_fields: ["territory", "company_name", "status", "source"], - get_indicator: function(doc) { - var indicator = [__(doc.status), "darkgrey", "status,=," + doc.status]; - if(doc.status==="Open") indicator[1] = "red"; - if(doc.status==="Opportunity") indicator[1] = "green"; - return indicator; - } -}; diff --git a/erpnext/selling/doctype/opportunity/__init__.py b/erpnext/selling/doctype/opportunity/__init__.py deleted file mode 100644 index baffc48825..0000000000 --- a/erpnext/selling/doctype/opportunity/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from __future__ import unicode_literals diff --git a/erpnext/selling/doctype/quotation/quotation.js b/erpnext/selling/doctype/quotation/quotation.js index 776671ae2a..c950056ff2 100644 --- a/erpnext/selling/doctype/quotation/quotation.js +++ b/erpnext/selling/doctype/quotation/quotation.js @@ -32,7 +32,7 @@ erpnext.selling.QuotationController = erpnext.selling.SellingController.extend({ cur_frm.add_custom_button(__('From Opportunity'), function() { frappe.model.map_current_doc({ - method: "erpnext.selling.doctype.opportunity.opportunity.make_quotation", + method: "erpnext.crm.doctype.opportunity.opportunity.make_quotation", source_doctype: "Opportunity", get_query_filters: { docstatus: 1, @@ -94,7 +94,7 @@ erpnext.selling.QuotationController = erpnext.selling.SellingController.extend({ lead: function() { var me = this; frappe.call({ - method: "erpnext.selling.doctype.lead.lead.get_lead_details", + method: "erpnext.crm.doctype.lead.lead.get_lead_details", args: { "lead": this.frm.doc.lead }, callback: function(r) { if(r.message) { diff --git a/erpnext/selling/doctype/quotation/quotation.py b/erpnext/selling/doctype/quotation/quotation.py index 5a052209d1..2c2b51b2d5 100644 --- a/erpnext/selling/doctype/quotation/quotation.py +++ b/erpnext/selling/doctype/quotation/quotation.py @@ -149,7 +149,7 @@ def _make_customer(source_name, ignore_permissions=False): customer_name = frappe.db.get_value("Customer", {"lead_name": lead_name}, ["name", "customer_name"], as_dict=True) if not customer_name: - from erpnext.selling.doctype.lead.lead import _make_customer + from erpnext.crm.doctype.lead.lead import _make_customer customer_doclist = _make_customer(lead_name, ignore_permissions=ignore_permissions) customer = frappe.get_doc(customer_doclist) customer.flags.ignore_permissions = ignore_permissions diff --git a/erpnext/setup/doctype/email_digest/email_digest.py b/erpnext/setup/doctype/email_digest/email_digest.py index 96f75c0a34..4e0d76616d 100644 --- a/erpnext/setup/doctype/email_digest/email_digest.py +++ b/erpnext/setup/doctype/email_digest/email_digest.py @@ -17,7 +17,8 @@ content_sequence = [ "invoiced_amount", "payables"]], ["Bank Balance", ["bank_balance"]], ["Buying", ["new_purchase_requests", "new_supplier_quotations", "new_purchase_orders"]], - ["Selling", ["new_leads", "new_enquiries", "new_quotations", "new_sales_orders"]], + ["CRM", ["new_leads", "new_enquiries"]], + ["Selling", ["new_quotations", "new_sales_orders"]], ["Stock", ["new_delivery_notes", "new_purchase_receipts", "new_stock_entries"]], ["Support", ["new_communications", "new_support_tickets", "open_tickets"]], ["Projects", ["new_projects"]], diff --git a/erpnext/setup/doctype/item_group/item_group.json b/erpnext/setup/doctype/item_group/item_group.json index 3124e11cdd..32d0bb656e 100644 --- a/erpnext/setup/doctype/item_group/item_group.json +++ b/erpnext/setup/doctype/item_group/item_group.json @@ -8,6 +8,13 @@ "doctype": "DocType", "document_type": "Master", "fields": [ + { + "fieldname": "gs", + "fieldtype": "Section Break", + "in_list_view": 0, + "label": "General Settings", + "permlevel": 0 + }, { "fieldname": "item_group_name", "fieldtype": "Data", @@ -20,13 +27,6 @@ "reqd": 1, "search_index": 0 }, - { - "fieldname": "gs", - "fieldtype": "Section Break", - "in_list_view": 0, - "label": "General Settings", - "permlevel": 0 - }, { "description": "", "fieldname": "parent_item_group", @@ -190,7 +190,7 @@ "in_create": 1, "issingle": 0, "max_attachments": 3, - "modified": "2015-02-16 05:44:59.435380", + "modified": "2015-02-16 23:50:48.113171", "modified_by": "Administrator", "module": "Setup", "name": "Item Group",