[new-module] crm
diff --git a/erpnext/config/crm.py b/erpnext/config/crm.py
new file mode 100644
index 0000000..74909c4
--- /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 7d2a620..dbeb8d1 100644
--- a/erpnext/config/desktop.py
+++ b/erpnext/config/desktop.py
@@ -45,6 +45,11 @@
"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 0e56fc7..4e06b6b 100644
--- a/erpnext/controllers/selling_controller.py
+++ b/erpnext/controllers/selling_controller.py
@@ -55,7 +55,7 @@
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 0000000..e69de29
--- /dev/null
+++ b/erpnext/crm/__init__.py
diff --git a/erpnext/crm/doctype/__init__.py b/erpnext/crm/doctype/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/crm/doctype/__init__.py
diff --git a/erpnext/crm/doctype/lead/.py b/erpnext/crm/doctype/lead/.py
new file mode 100644
index 0000000..70a6b22
--- /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 0000000..e69de29
--- /dev/null
+++ b/erpnext/crm/doctype/lead/__init__.py
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 170e718..b2eab16 100644
--- a/erpnext/selling/doctype/lead/lead.js
+++ b/erpnext/crm/doctype/lead/lead.js
@@ -41,14 +41,14 @@
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 98%
rename from erpnext/selling/doctype/lead/lead.json
rename to erpnext/crm/doctype/lead/lead.json
index de43be7..32b604d 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 90%
rename from erpnext/selling/doctype/lead/test_lead.py
rename to erpnext/crm/doctype/lead/test_lead.py
index 218e75a..181d75b 100644
--- a/erpnext/selling/doctype/lead/test_lead.py
+++ b/erpnext/crm/doctype/lead/test_lead.py
@@ -10,7 +10,7 @@
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 0000000..e69de29
--- /dev/null
+++ b/erpnext/crm/doctype/opportunity/__init__.py
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 1180793..a0ebcce 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", "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 @@
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.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 980de56..751df21 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 243c2d8..255fbc5 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 00db68f..849e953 100644
--- a/erpnext/patches.txt
+++ b/erpnext/patches.txt
@@ -108,3 +108,5 @@
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 a12dcf6..0000000
--- 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 baffc48..0000000
--- 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 9bbde6c..0000000
--- 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 baffc48..0000000
--- 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 776671a..c950056 100644
--- a/erpnext/selling/doctype/quotation/quotation.js
+++ b/erpnext/selling/doctype/quotation/quotation.js
@@ -32,7 +32,7 @@
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 @@
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 5a05220..2c2b51b 100644
--- a/erpnext/selling/doctype/quotation/quotation.py
+++ b/erpnext/selling/doctype/quotation/quotation.py
@@ -149,7 +149,7 @@
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 96f75c0..4e0d766 100644
--- a/erpnext/setup/doctype/email_digest/email_digest.py
+++ b/erpnext/setup/doctype/email_digest/email_digest.py
@@ -17,7 +17,8 @@
"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 3124e11..32d0bb6 100644
--- a/erpnext/setup/doctype/item_group/item_group.json
+++ b/erpnext/setup/doctype/item_group/item_group.json
@@ -9,6 +9,13 @@
"document_type": "Master",
"fields": [
{
+ "fieldname": "gs",
+ "fieldtype": "Section Break",
+ "in_list_view": 0,
+ "label": "General Settings",
+ "permlevel": 0
+ },
+ {
"fieldname": "item_group_name",
"fieldtype": "Data",
"in_list_view": 1,
@@ -21,13 +28,6 @@
"search_index": 0
},
{
- "fieldname": "gs",
- "fieldtype": "Section Break",
- "in_list_view": 0,
- "label": "General Settings",
- "permlevel": 0
- },
- {
"description": "",
"fieldname": "parent_item_group",
"fieldtype": "Link",
@@ -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",