Merge pull request #3681 from rmehta/sample-data

[enhancement] update to setup wizard, added users, employees, sample data
diff --git a/erpnext/__version__.py b/erpnext/__version__.py
index ef61354..9049b13 100644
--- a/erpnext/__version__.py
+++ b/erpnext/__version__.py
@@ -1,2 +1,2 @@
 from __future__ import unicode_literals
-__version__ = '5.1.6'
+__version__ = '5.2.1'
diff --git a/erpnext/accounts/doctype/account/account.json b/erpnext/accounts/doctype/account/account.json
index 8146c63..e60d9ab 100644
--- a/erpnext/accounts/doctype/account/account.json
+++ b/erpnext/accounts/doctype/account/account.json
@@ -173,7 +173,7 @@
  "icon": "icon-money", 
  "idx": 1, 
  "in_create": 0, 
- "modified": "2015-06-14 20:57:55.471334", 
+ "modified": "2015-07-20 03:54:14.297995", 
  "modified_by": "Administrator", 
  "module": "Accounts", 
  "name": "Account", 
@@ -257,5 +257,5 @@
    "write": 1
   }
  ], 
- "search_fields": "is_group"
+ "search_fields": ""
 }
\ No newline at end of file
diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.js b/erpnext/accounts/doctype/journal_entry/journal_entry.js
index 3ea92e1..1ecde64 100644
--- a/erpnext/accounts/doctype/journal_entry/journal_entry.js
+++ b/erpnext/accounts/doctype/journal_entry/journal_entry.js
@@ -109,7 +109,7 @@
 
 	against_jv: function(doc, cdt, cdn) {
 		var d = frappe.get_doc(cdt, cdn);
-		if (d.against_jv && d.party && !flt(d.credit) && !flt(d.debit)) {
+		if (d.against_jv && !flt(d.credit) && !flt(d.debit)) {
 			this.get_outstanding('Journal Entry', d.against_jv, d);
 		}
 	},
@@ -119,7 +119,8 @@
 		var args = {
 			"doctype": doctype,
 			"docname": docname,
-			"party": child.party
+			"party": child.party,
+			"account": child.account
 		}
 
 		return this.frm.call({
diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.py b/erpnext/accounts/doctype/journal_entry/journal_entry.py
index 23d4c73..dc620ed 100644
--- a/erpnext/accounts/doctype/journal_entry/journal_entry.py
+++ b/erpnext/accounts/doctype/journal_entry/journal_entry.py
@@ -545,12 +545,14 @@
 @frappe.whitelist()
 def get_outstanding(args):
 	args = eval(args)
-	if args.get("doctype") == "Journal Entry" and args.get("party"):
+	if args.get("doctype") == "Journal Entry":
+		condition = " and party=%(party)s" if args.get("party") else ""
+			
 		against_jv_amount = frappe.db.sql("""
 			select sum(ifnull(debit, 0)) - sum(ifnull(credit, 0))
-			from `tabJournal Entry Account` where parent=%s and party=%s
+			from `tabJournal Entry Account` where parent=%(docname)s and account=%(account)s {0}
 			and ifnull(against_invoice, '')='' and ifnull(against_voucher, '')=''
-			and ifnull(against_jv, '')=''""", (args['docname'], args['party']))
+			and ifnull(against_jv, '')=''""".format(condition), args)
 
 		against_jv_amount = flt(against_jv_amount[0][0]) if against_jv_amount else 0
 		if against_jv_amount > 0:
diff --git a/erpnext/accounts/report/accounts_payable/accounts_payable.json b/erpnext/accounts/report/accounts_payable/accounts_payable.json
index 71537a8..9be8d68 100644
--- a/erpnext/accounts/report/accounts_payable/accounts_payable.json
+++ b/erpnext/accounts/report/accounts_payable/accounts_payable.json
@@ -6,12 +6,12 @@
  "doctype": "Report", 
  "idx": 1, 
  "is_standard": "Yes", 
- "modified": "2014-06-03 07:18:10.985354", 
+ "modified": "2015-07-23 01:08:20.996267", 
  "modified_by": "Administrator", 
  "module": "Accounts", 
  "name": "Accounts Payable", 
  "owner": "Administrator", 
  "ref_doctype": "Purchase Invoice", 
  "report_name": "Accounts Payable", 
- "report_type": "Report Builder"
+ "report_type": "Query Report"
 }
\ No newline at end of file
diff --git a/erpnext/accounts/report/general_ledger/general_ledger.html b/erpnext/accounts/report/general_ledger/general_ledger.html
index 0d3170a..f22e721 100644
--- a/erpnext/accounts/report/general_ledger/general_ledger.html
+++ b/erpnext/accounts/report/general_ledger/general_ledger.html
@@ -1,5 +1,5 @@
 <div style="margin-bottom: 7px;" class="text-center">
-	{%= frappe.boot.letter_heads[frappe.defaults.get_default("letter_head")] %}
+	{%= frappe.boot.letter_heads[filters.letter_head || frappe.defaults.get_default("letter_head")] %}
 </div>
 <h2 class="text-center">{%= __("Statement of Account") %}</h2>
 <h4 class="text-center">{%= (filters.party || filters.account) && ((filters.party || filters.account) + ", ")  || "" %} {%= filters.company %}</h4>
diff --git a/erpnext/accounts/report/general_ledger/general_ledger.js b/erpnext/accounts/report/general_ledger/general_ledger.js
index de7027b..b4d9b9f 100644
--- a/erpnext/accounts/report/general_ledger/general_ledger.js
+++ b/erpnext/accounts/report/general_ledger/general_ledger.js
@@ -80,6 +80,13 @@
 			"fieldname":"group_by_account",
 			"label": __("Group by Account"),
 			"fieldtype": "Check",
+		},
+		{
+			"fieldname":"letter_head",
+			"label": __("Letter Head"),
+			"fieldtype": "Link",
+			"options": "Letter Head",
+			"default": frappe.defaults.get_default("letter_head"),
 		}
 	]
 }
diff --git a/erpnext/change_log/current/learn.md b/erpnext/change_log/current/learn.md
deleted file mode 100644
index f91c0a4..0000000
--- a/erpnext/change_log/current/learn.md
+++ /dev/null
@@ -1 +0,0 @@
-- New help videos for Selling, Buying, Human Resource, Manufacturing and Buying
diff --git a/erpnext/change_log/current/paranthesis_in_images.md b/erpnext/change_log/current/paranthesis_in_images.md
deleted file mode 100644
index 4859e96..0000000
--- a/erpnext/change_log/current/paranthesis_in_images.md
+++ /dev/null
@@ -1 +0,0 @@
-- Display images in website's Item and Item List pages when the filename has paranthesis in its name
diff --git a/erpnext/change_log/current/rename.md b/erpnext/change_log/current/rename.md
deleted file mode 100644
index 54efb50..0000000
--- a/erpnext/change_log/current/rename.md
+++ /dev/null
@@ -1,3 +0,0 @@
-- Role rename: **Material User** is now **Stock User**
-- Role rename: **Material Manager** is now **Stock Manager**
-- Role rename: **Material Master Manager** is now **Item Manager**
diff --git a/erpnext/change_log/current/shopping_cart.md b/erpnext/change_log/current/shopping_cart.md
deleted file mode 100644
index 77a5e5d..0000000
--- a/erpnext/change_log/current/shopping_cart.md
+++ /dev/null
@@ -1,3 +0,0 @@
-- Fixed inconsistent visibility of 'Add to Cart' button
-- Use Customer's Price List in Shopping Cart if found
-- Fixed Address creation from Shopping Cart
diff --git a/erpnext/change_log/current/sms.md b/erpnext/change_log/current/sms.md
new file mode 100644
index 0000000..bac293f
--- /dev/null
+++ b/erpnext/change_log/current/sms.md
@@ -0,0 +1 @@
+- Now system will give SMS delivery message and maintain a log
\ No newline at end of file
diff --git a/erpnext/change_log/v5/v5_2_0.md b/erpnext/change_log/v5/v5_2_0.md
new file mode 100644
index 0000000..5884595
--- /dev/null
+++ b/erpnext/change_log/v5/v5_2_0.md
@@ -0,0 +1,9 @@
+- New help videos for Selling, Buying, Human Resource, Manufacturing and Buying
+- Role rename: **Material User** is now **Stock User**
+- Role rename: **Material Manager** is now **Stock Manager**
+- Role rename: **Material Master Manager** is now **Item Manager**
+- Fixed inconsistent visibility of 'Add to Cart' button
+- Use Customer's Price List in Shopping Cart
+- Fixed Address creation from Shopping Cart
+- Display images in website's Item and Item List pages when the filename has paranthesis in its name
+
diff --git a/erpnext/config/crm.py b/erpnext/config/crm.py
index 3a7ab18..d7a6b2e 100644
--- a/erpnext/config/crm.py
+++ b/erpnext/config/crm.py
@@ -42,6 +42,11 @@
 					"name": "SMS Center",
 					"description":_("Send mass SMS to your contacts"),
 				},
+				{
+					"type": "doctype",
+					"name": "SMS Log",
+					"description":_("Logs for maintaining sms delivery status"),
+				}
 			]
 		},
 		{
diff --git a/erpnext/config/desktop.py b/erpnext/config/desktop.py
index b0c7345..498d100 100644
--- a/erpnext/config/desktop.py
+++ b/erpnext/config/desktop.py
@@ -64,7 +64,7 @@
 			"type": "module"
 		},
 		"Learn": {
-			"color": "#7272FF",
+			"color": "#FCB868",
 			"force_show": True,
 			"icon": "icon-facetime-video",
 			"type": "module",
diff --git a/erpnext/config/selling.py b/erpnext/config/selling.py
index 5433964..62dfe23 100644
--- a/erpnext/config/selling.py
+++ b/erpnext/config/selling.py
@@ -50,6 +50,11 @@
 				},
 				{
 					"type": "doctype",
+					"name": "SMS Log",
+					"description":_("Logs for maintaining sms delivery status"),
+				},
+				{
+					"type": "doctype",
 					"name": "Newsletter",
 					"description": _("Newsletters to contacts, leads."),
 				},
diff --git a/erpnext/contacts/__init__.py b/erpnext/contacts/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/contacts/__init__.py
+++ /dev/null
diff --git a/erpnext/contacts/doctype/__init__.py b/erpnext/contacts/doctype/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/contacts/doctype/__init__.py
+++ /dev/null
diff --git a/erpnext/contacts/doctype/party_type/__init__.py b/erpnext/contacts/doctype/party_type/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/contacts/doctype/party_type/__init__.py
+++ /dev/null
diff --git a/erpnext/contacts/doctype/party_type/party_type.json b/erpnext/contacts/doctype/party_type/party_type.json
deleted file mode 100644
index 19ffefb..0000000
--- a/erpnext/contacts/doctype/party_type/party_type.json
+++ /dev/null
@@ -1,92 +0,0 @@
-{
- "allow_rename": 1, 
- "autoname": "field:party_type_name", 
- "creation": "2014-04-07 12:32:18.010384", 
- "docstatus": 0, 
- "doctype": "DocType", 
- "document_type": "Master", 
- "fields": [
-  {
-   "fieldname": "party_type_name", 
-   "fieldtype": "Data", 
-   "in_list_view": 1, 
-   "label": "Party Type Name", 
-   "permlevel": 0, 
-   "reqd": 1
-  }, 
-  {
-   "fieldname": "parent_party_type", 
-   "fieldtype": "Link", 
-   "label": "Parent Party Type", 
-   "options": "Party Type", 
-   "permlevel": 0
-  }, 
-  {
-   "default": "Yes", 
-   "fieldname": "allow_children", 
-   "fieldtype": "Select", 
-   "label": "Allow Children", 
-   "options": "Yes\nNo", 
-   "permlevel": 0
-  }, 
-  {
-   "fieldname": "default_price_list", 
-   "fieldtype": "Link", 
-   "ignore_user_permissions": 1, 
-   "label": "Default Price List", 
-   "options": "Price List", 
-   "permlevel": 0
-  }, 
-  {
-   "fieldname": "lft", 
-   "fieldtype": "Int", 
-   "hidden": 1, 
-   "label": "LFT", 
-   "permlevel": 0, 
-   "read_only": 1, 
-   "search_index": 1
-  }, 
-  {
-   "fieldname": "rgt", 
-   "fieldtype": "Int", 
-   "hidden": 1, 
-   "label": "RGT", 
-   "permlevel": 0, 
-   "read_only": 1, 
-   "search_index": 1
-  }, 
-  {
-   "fieldname": "old_parent", 
-   "fieldtype": "Data", 
-   "hidden": 1, 
-   "label": "Old Parent", 
-   "permlevel": 0, 
-   "read_only": 1
-  }
- ], 
- "modified": "2015-02-05 05:11:42.046004", 
- "modified_by": "Administrator", 
- "module": "Contacts", 
- "name": "Party Type", 
- "owner": "Administrator", 
- "permissions": [
-  {
-   "apply_user_permissions": 1, 
-   "create": 1, 
-   "permlevel": 0, 
-   "read": 1, 
-   "role": "Sales User", 
-   "share": 1, 
-   "write": 1
-  }, 
-  {
-   "apply_user_permissions": 1, 
-   "create": 1, 
-   "permlevel": 0, 
-   "read": 1, 
-   "role": "Purchase User", 
-   "share": 1, 
-   "write": 1
-  }
- ]
-}
\ No newline at end of file
diff --git a/erpnext/contacts/doctype/party_type/party_type.py b/erpnext/contacts/doctype/party_type/party_type.py
deleted file mode 100644
index d21216f..0000000
--- a/erpnext/contacts/doctype/party_type/party_type.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
-# For license information, please see license.txt
-
-from __future__ import unicode_literals
-import frappe
-from frappe.utils.nestedset import NestedSet
-
-class PartyType(NestedSet):
-	nsm_parent_field = 'parent_party_type';
diff --git a/erpnext/controllers/selling_controller.py b/erpnext/controllers/selling_controller.py
index c709326..b2a9f03 100644
--- a/erpnext/controllers/selling_controller.py
+++ b/erpnext/controllers/selling_controller.py
@@ -171,9 +171,6 @@
 				frappe.throw(_("Row {0}: Qty is mandatory").format(d.idx))
 
 			if self.doctype == "Sales Order":
-				if (frappe.db.get_value("Item", d.item_code, "is_stock_item") == 'Yes' or
-					self.has_product_bundle(d.item_code)) and not d.warehouse:
-						frappe.throw(_("Reserved Warehouse required for stock Item {0} in row {1}").format(d.item_code, d.idx))
 				reserved_warehouse = d.warehouse
 				if flt(d.qty) > flt(d.delivered_qty):
 					reserved_qty_for_main_item = flt(d.qty) - flt(d.delivered_qty)
diff --git a/erpnext/crm/doctype/newsletter/newsletter.json b/erpnext/crm/doctype/newsletter/newsletter.json
index f2baf2e..715a97f 100644
--- a/erpnext/crm/doctype/newsletter/newsletter.json
+++ b/erpnext/crm/doctype/newsletter/newsletter.json
@@ -52,7 +52,7 @@
    "fieldtype": "Text Editor", 
    "label": "Message", 
    "permlevel": 0, 
-   "reqd": 0
+   "reqd": 1
   }, 
   {
    "description": "", 
@@ -78,7 +78,7 @@
  ], 
  "icon": "icon-envelope", 
  "idx": 1, 
- "modified": "2015-03-20 05:27:31.613881", 
+ "modified": "2015-07-20 05:43:33.818567", 
  "modified_by": "Administrator", 
  "module": "CRM", 
  "name": "Newsletter", 
diff --git a/erpnext/hooks.py b/erpnext/hooks.py
index 30032f8..91ba19a 100644
--- a/erpnext/hooks.py
+++ b/erpnext/hooks.py
@@ -1,11 +1,34 @@
 from __future__ import unicode_literals
 app_name = "erpnext"
 app_title = "ERPNext"
-app_publisher = "Frappe Technologies Pvt. Ltd. and Contributors"
-app_description = "Open Source Enterprise Resource Planning for Small and Midsized Organizations"
+app_publisher = "Frappe Technologies Pvt. Ltd."
+app_description = """## ERPNext
+
+ERPNext is a fully featured ERP system designed for Small and Medium Sized
+business. ERPNext covers a wide range of features including Accounting, CRM,
+Inventory management, Selling, Purchasing, Manufacturing, Projects, HR &
+Payroll, Website, E-Commerce and much more.
+
+ERPNext is based on the Frappe Framework is highly customizable and extendable.
+You can create Custom Form, Fields, Scripts and can also create your own Apps
+to extend ERPNext functionality.
+
+ERPNext is Open Source under the GNU General Public Licence v3 and has been
+listed as one of the Best Open Source Softwares in the world by my online
+blogs.
+
+### Links
+
+- Website: [https://erpnext.com](https://erpnext.com)
+- GitHub: [https://github.com/frappe/erpnext](https://github.com/frappe/erpnext)
+- Forum: [https://discuss.erpnext.com](https://discuss.erpnext.com)
+- Frappe Framework: [https://frappe.io](https://frappe.io)
+
+"""
 app_icon = "icon-th"
 app_color = "#e74c3c"
-app_version = "5.1.6"
+app_version = "5.2.1"
+github_link = "https://github.com/frappe/erpnext"
 
 error_report_email = "support@erpnext.com"
 
diff --git a/erpnext/hr/doctype/expense_claim/expense_claim.js b/erpnext/hr/doctype/expense_claim/expense_claim.js
index b556172..a56929d 100644
--- a/erpnext/hr/doctype/expense_claim/expense_claim.js
+++ b/erpnext/hr/doctype/expense_claim/expense_claim.js
@@ -19,10 +19,13 @@
 				jv.company = cur_frm.doc.company;
 				jv.remark = 'Payment against Expense Claim: ' + cur_frm.doc.name;
 				jv.fiscal_year = cur_frm.doc.fiscal_year;
-
-				var d1 = frappe.model.add_child(jv, 'Journal Entry Account', 'accounts');
-				d1.debit = cur_frm.doc.total_sanctioned_amount;
-				d1.against_expense_claim = cur_frm.doc.name;
+				var expense = cur_frm.doc.expenses || [];
+				for(var i = 0; i < expense.length; i++){
+					var d1 = frappe.model.add_child(jv, 'Journal Entry Account', 'accounts');
+					d1.debit = expense[i].sanctioned_amount;
+					d1.account = expense[i].default_account;
+					d1.against_expense_claim = cur_frm.doc.name;
+				}
 
 				// credit to bank
 				var d1 = frappe.model.add_child(jv, 'Journal Entry Account', 'accounts');
@@ -43,6 +46,7 @@
 
 cur_frm.add_fetch('employee', 'company', 'company');
 cur_frm.add_fetch('employee','employee_name','employee_name');
+cur_frm.add_fetch('expense_type', 'default_account', 'default_account');
 
 cur_frm.cscript.onload = function(doc,cdt,cdn) {
 	if(!doc.approval_status)
diff --git a/erpnext/hr/doctype/expense_claim_detail/expense_claim_detail.json b/erpnext/hr/doctype/expense_claim_detail/expense_claim_detail.json
index c6123ee..9522d94 100644
--- a/erpnext/hr/doctype/expense_claim_detail/expense_claim_detail.json
+++ b/erpnext/hr/doctype/expense_claim_detail/expense_claim_detail.json
@@ -35,6 +35,18 @@
    "width": "150px"
   }, 
   {
+   "depends_on": "expense_type", 
+   "fieldname": "default_account", 
+   "fieldtype": "Link", 
+   "hidden": 1, 
+   "label": "Default Account", 
+   "options": "Account", 
+   "permlevel": 0, 
+   "precision": "", 
+   "read_only": 1, 
+   "unique": 0
+  }, 
+  {
    "fieldname": "section_break_4", 
    "fieldtype": "Section Break", 
    "permlevel": 0, 
@@ -93,7 +105,7 @@
  ], 
  "idx": 1, 
  "istable": 1, 
- "modified": "2015-04-08 06:18:47.539134", 
+ "modified": "2015-07-16 06:13:32.090048", 
  "modified_by": "Administrator", 
  "module": "HR", 
  "name": "Expense Claim Detail", 
diff --git a/erpnext/hr/doctype/expense_claim_type/expense_claim_type.json b/erpnext/hr/doctype/expense_claim_type/expense_claim_type.json
index fc7e604..0b0d304 100644
--- a/erpnext/hr/doctype/expense_claim_type/expense_claim_type.json
+++ b/erpnext/hr/doctype/expense_claim_type/expense_claim_type.json
@@ -18,6 +18,14 @@
    "search_index": 0
   }, 
   {
+   "fieldname": "default_account", 
+   "fieldtype": "Link", 
+   "label": "Default Account", 
+   "options": "Account", 
+   "permlevel": 0, 
+   "precision": ""
+  }, 
+  {
    "fieldname": "description", 
    "fieldtype": "Small Text", 
    "label": "Description", 
@@ -29,7 +37,7 @@
  ], 
  "icon": "icon-flag", 
  "idx": 1, 
- "modified": "2015-07-13 04:46:38.897484", 
+ "modified": "2015-07-15 08:57:23.069980", 
  "modified_by": "Administrator", 
  "module": "HR", 
  "name": "Expense Claim Type", 
@@ -55,7 +63,7 @@
    "print": 0, 
    "read": 1, 
    "report": 0, 
-   "role": "Employee", 
+   "role": "All", 
    "share": 0, 
    "write": 0
   }
diff --git a/erpnext/hr/report/employee_leave_balance/employee_leave_balance.py b/erpnext/hr/report/employee_leave_balance/employee_leave_balance.py
index 1a70f45..d6f865b 100644
--- a/erpnext/hr/report/employee_leave_balance/employee_leave_balance.py
+++ b/erpnext/hr/report/employee_leave_balance/employee_leave_balance.py
@@ -9,8 +9,13 @@
 def execute(filters=None):
 	if not filters: filters = {}
 
-	employee_filters = filters.get("company") and \
-		[["Employee", "company", "=", filters.get("company")]] or None
+	employee_filters = {
+		"status": "Active"
+	}
+	
+	if filters.get("company"):
+		filters["company"] = filters.company
+
 	employees = runreport(doctype="Employee", fields=["name", "employee_name", "department"],
 		filters=employee_filters, limit_page_length=None)
 
diff --git a/erpnext/manufacturing/doctype/bom/bom.py b/erpnext/manufacturing/doctype/bom/bom.py
index f550a8a..fe67ed8 100644
--- a/erpnext/manufacturing/doctype/bom/bom.py
+++ b/erpnext/manufacturing/doctype/bom/bom.py
@@ -181,15 +181,12 @@
 			if item.default_bom != self.name:
 				item.default_bom = self.name
 				item.save()
-
 		else:
-			if not self.is_active:
-				frappe.db.set(self, "is_default", 0)
-
-				item = frappe.get_doc("Item", self.item)
-				if item.default_bom == self.name:
-					item.default_bom = None
-					item.save()
+			frappe.db.set(self, "is_default", 0)
+			item = frappe.get_doc("Item", self.item)
+			if item.default_bom == self.name:
+				item.default_bom = None
+				item.save()
 
 	def clear_operations(self):
 		if not self.with_operations:
diff --git a/erpnext/modules.txt b/erpnext/modules.txt
index 67c856d..dfca2f2 100644
--- a/erpnext/modules.txt
+++ b/erpnext/modules.txt
@@ -9,6 +9,5 @@
 Stock
 Support
 Utilities
-Contacts
 Shopping Cart
 Hub Node
diff --git a/erpnext/patches.txt b/erpnext/patches.txt
index f5ae5b7..c735507 100644
--- a/erpnext/patches.txt
+++ b/erpnext/patches.txt
@@ -100,6 +100,7 @@
 execute:frappe.reload_doc('crm', 'doctype', 'lead')
 execute:frappe.reload_doc('crm', 'doctype', 'opportunity')
 erpnext.patches.v5_0.rename_taxes_and_charges_master
+erpnext.patches.v5_1.sales_bom_rename
 erpnext.patches.v5_0.rename_table_fieldnames
 execute:frappe.db.sql("update `tabJournal Entry` set voucher_type='Journal Entry' where ifnull(voucher_type, '')=''")
 erpnext.patches.v5_0.is_group
@@ -173,6 +174,7 @@
 erpnext.patches.v5_1.fix_against_account
 erpnext.patches.v5_1.fix_credit_days_based_on
 erpnext.patches.v5_1.track_operations
-erpnext.patches.v5_1.sales_bom_rename
 execute:frappe.rename_doc("DocType", "Salary Manager", "Process Payroll", force=True)
 erpnext.patches.v5_1.rename_roles
+erpnext.patches.v5_1.default_bom
+execute:frappe.delete_doc("DocType", "Party Type")
\ No newline at end of file
diff --git a/erpnext/patches/v4_0/fields_to_be_renamed.py b/erpnext/patches/v4_0/fields_to_be_renamed.py
index 2baab97..cc17697 100644
--- a/erpnext/patches/v4_0/fields_to_be_renamed.py
+++ b/erpnext/patches/v4_0/fields_to_be_renamed.py
@@ -3,7 +3,7 @@
 
 from __future__ import unicode_literals
 import frappe
-from frappe.model import rename_field
+from frappe.model.utils.rename_field import rename_field
 from frappe.modules import scrub, get_doctype_module
 
 rename_map = {
diff --git a/erpnext/patches/v5_0/rename_table_fieldnames.py b/erpnext/patches/v5_0/rename_table_fieldnames.py
index 758280f..05d5c91 100644
--- a/erpnext/patches/v5_0/rename_table_fieldnames.py
+++ b/erpnext/patches/v5_0/rename_table_fieldnames.py
@@ -2,7 +2,7 @@
 # License: GNU General Public License v3. See license.txt
 
 import frappe
-from frappe.model import rename_field
+from frappe.model.utils.rename_field import rename_field
 from frappe.modules import scrub, get_doctype_module
 
 rename_map = {
@@ -111,7 +111,6 @@
 		["installed_item_details", "items"]
 	],
 	"Item": [
-		["item_variants", "variants"],
 		["item_reorder", "reorder_levels"],
 		["uom_conversion_details", "uoms"],
 		["item_supplier_details", "supplier_items"],
@@ -168,7 +167,7 @@
 		["earning_details", "earnings"],
 		["deduction_details", "deductions"]
 	],
-	"Sales BOM": [
+	"Product Bundle": [
 		["sales_bom_items", "items"]
 	],
 	"SMS Settings": [
diff --git a/erpnext/patches/v5_0/rename_total_fields.py b/erpnext/patches/v5_0/rename_total_fields.py
index cf95caa..6657dd8 100644
--- a/erpnext/patches/v5_0/rename_total_fields.py
+++ b/erpnext/patches/v5_0/rename_total_fields.py
@@ -3,7 +3,7 @@
 
 from __future__ import unicode_literals
 import frappe
-from frappe.model import rename_field
+from frappe.model.utils.rename_field import rename_field
 from frappe.modules import scrub, get_doctype_module
 
 selling_doctypes = ("Quotation", "Sales Order", "Delivery Note", "Sales Invoice")
diff --git a/erpnext/patches/v5_1/default_bom.py b/erpnext/patches/v5_1/default_bom.py
new file mode 100644
index 0000000..6484edd
--- /dev/null
+++ b/erpnext/patches/v5_1/default_bom.py
@@ -0,0 +1,7 @@
+from __future__ import unicode_literals
+
+import frappe
+
+def execute():
+	frappe.db.sql("""Update `tabItem` as item set default_bom = NULL where 
+		not exists(select name from `tabBOM` as bom where item.default_bom = bom.name and bom.docstatus =1 )""")
\ No newline at end of file
diff --git a/erpnext/projects/doctype/task/task.js b/erpnext/projects/doctype/task/task.js
index d9a611e..4e870fa 100644
--- a/erpnext/projects/doctype/task/task.js
+++ b/erpnext/projects/doctype/task/task.js
@@ -5,42 +5,59 @@
 
 cur_frm.add_fetch("project", "company", "company");
 
-erpnext.projects.Task = frappe.ui.form.Controller.extend({
-	setup: function() {
-		this.frm.fields_dict.project.get_query = function() {
+frappe.ui.form.on("Task", {
+	refresh: function(frm) {
+		var doc = frm.doc;
+		if(!doc.__islocal) {
+			if(frappe.model.can_read("Time Log")) {
+				frm.add_custom_button(__("Time Logs"), function() {
+					frappe.route_options = {"project": doc.project, "task": doc.name}
+					frappe.set_route("List", "Time Log");
+				}, "icon-list", true);
+			}
+			if(frappe.model.can_read("Expense Claim")) {
+				frm.add_custom_button(__("Expense Claims"), function() {
+					frappe.route_options = {"project": doc.project, "task": doc.name}
+					frappe.set_route("List", "Expense Claim");
+				}, "icon-list", true);
+			}
+
+			if(frm.perm[0].write) {
+				if(frm.doc.status==="Open") {
+					frm.add_custom_button("Close", function() {
+						frm.set_value("status", "Closed");
+						frm.save();
+					});
+				} else {
+					frm.add_custom_button("Reopen", function() {
+						frm.set_value("status", "Open");
+						frm.save();
+					});
+				}
+			}
+		}
+	},
+
+	setup: function(frm) {
+		frm.fields_dict.project.get_query = function() {
 			return {
 				query: "erpnext.projects.doctype.task.task.get_project"
 			}
 		};
 	},
 
-	project: function() {
-		if(this.frm.doc.project) {
-			return get_server_fields('get_project_details', '','', this.frm.doc, this.frm.doc.doctype, 
-				this.frm.doc.name, 1);
+	project: function(frm) {
+		if(frm.doc.project) {
+			return get_server_fields('get_project_details', '','', frm.doc, frm.doc.doctype,
+				frm.doc.name, 1);
 		}
 	},
 
-	validate: function() {
-		this.frm.doc.project && frappe.model.remove_from_locals("Project",
-			this.frm.doc.project);
+	validate: function(frm) {
+		frm.doc.project && frappe.model.remove_from_locals("Project",
+			frm.doc.project);
 	},
-	
-	refresh: function(doc) {
-		if(!doc.__islocal) {
-			cur_frm.add_custom_button(__("Time Logs"), function() {
-				frappe.route_options = {"project": doc.project, "task": doc.name}
-				frappe.set_route("List", "Time Log");
-			}, "icon-list", true);
-			cur_frm.add_custom_button(__("Expense Claims"), function() {
-				frappe.route_options = {"project": doc.project, "task": doc.name}
-				frappe.set_route("List", "Expense Claim");
-			}, "icon-list", true);
-		}
-	}
+
 });
 
 cur_frm.add_fetch('task', 'subject', 'subject');
-
-cur_frm.cscript = new erpnext.projects.Task({frm: cur_frm});
-
diff --git a/erpnext/public/css/erpnext.css b/erpnext/public/css/erpnext.css
index b5f2a2d..3c286b1 100644
--- a/erpnext/public/css/erpnext.css
+++ b/erpnext/public/css/erpnext.css
@@ -96,3 +96,8 @@
 .pos .tax-table {
   margin-bottom: 10px;
 }
+.erpnext-icon {
+  width: 24px;
+  margin-right: 0px;
+  margin-top: -3px;
+}
diff --git a/erpnext/public/images/erp-icon.svg b/erpnext/public/images/erp-icon.svg
new file mode 100644
index 0000000..b4e2a24
--- /dev/null
+++ b/erpnext/public/images/erp-icon.svg
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>

+<!-- Generator: Adobe Illustrator 16.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->

+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"

+	 width="512px" height="512px" viewBox="0 0 512 512" enable-background="new 0 0 512 512" xml:space="preserve">

+<g>

+	<path fill="#7574FF" d="M512,448c0,35.2-28.8,64-64,64H64c-35.2,0-64-28.8-64-64V64C0,28.8,28.8,0,64,0h384c35.2,0,64,28.8,64,64

+		V448z"/>

+</g>

+<g>

+	<path fill="#FFFFFF" d="M150.483,371.684V141.15c0-15.167,9.534-25.133,23.833-25.133h162.5c13.866,0,20.8,6.933,20.8,18.633v2.6

+		c0,12.133-6.934,18.633-20.8,18.633h-141.7v78.434h109.634c14.3,0,20.8,6.066,20.8,17.767v1.3c0,12.133-6.934,18.633-20.8,18.633

+		H195.117v84.934h144.3c13.867,0,20.367,6.066,20.367,17.767v2.167c0,12.566-6.5,19.5-20.367,19.5h-165.1

+		C160.017,396.384,150.483,386.851,150.483,371.684z"/>

+</g>

+<g>

+</g>

+<g>

+</g>

+<g>

+</g>

+<g>

+</g>

+<g>

+</g>

+<g>

+</g>

+<g>

+</g>

+<g>

+</g>

+<g>

+</g>

+<g>

+</g>

+<g>

+</g>

+<g>

+</g>

+<g>

+</g>

+<g>

+</g>

+<g>

+</g>

+</svg>

diff --git a/erpnext/public/js/conf.js b/erpnext/public/js/conf.js
index 6264019..af06b33 100644
--- a/erpnext/public/js/conf.js
+++ b/erpnext/public/js/conf.js
@@ -11,7 +11,7 @@
 		href="https://discuss.erpnext.com">Feedback</a></p>'
 
 
-	$('.navbar-home').html('ERPNext');
+	$('.navbar-home').html('<img class="erpnext-icon" src="/assets/erpnext/images/erp-icon.svg" />');
 
 	$('[data-link="docs"]').attr("href", "https://manual.erpnext.com")
 });
diff --git a/erpnext/public/less/erpnext.less b/erpnext/public/less/erpnext.less
index 830902a..3f839ee 100644
--- a/erpnext/public/less/erpnext.less
+++ b/erpnext/public/less/erpnext.less
@@ -120,3 +120,8 @@
 	margin-bottom: 10px;
 }
 
+.erpnext-icon {
+	width: 24px;
+	margin-right: 0px;
+	margin-top: -3px;
+}
diff --git a/erpnext/selling/doctype/sales_order/sales_order.js b/erpnext/selling/doctype/sales_order/sales_order.js
index 7f0b386..fcdae4d 100644
--- a/erpnext/selling/doctype/sales_order/sales_order.js
+++ b/erpnext/selling/doctype/sales_order/sales_order.js
@@ -46,7 +46,6 @@
 
 			} else {
 				// un-stop
-				cur_frm.dashboard.set_headline_alert(__("Stopped"), "alert-danger", "icon-stop");
 				cur_frm.add_custom_button(__('Unstop'), cur_frm.cscript['Unstop Sales Order'], "icon-check");
 			}
 		}
diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py
index e8a772a..d45fbba 100644
--- a/erpnext/selling/doctype/sales_order/sales_order.py
+++ b/erpnext/selling/doctype/sales_order/sales_order.py
@@ -272,6 +272,10 @@
 	def postprocess(source, doc):
 		doc.material_request_type = "Purchase"
 
+	so = frappe.get_doc("Sales Order", source_name)
+	
+	item_table = "Packed Item" if so.packed_items else "Sales Order Item"
+	
 	doc = get_mapped_doc("Sales Order", source_name, {
 		"Sales Order": {
 			"doctype": "Material Request",
@@ -279,7 +283,7 @@
 				"docstatus": ["=", 1]
 			}
 		},
-		"Sales Order Item": {
+		item_table: {
 			"doctype": "Material Request Item",
 			"field_map": {
 				"parent": "sales_order_no",
diff --git a/erpnext/setup/doctype/sms_settings/sms_settings.py b/erpnext/setup/doctype/sms_settings/sms_settings.py
index a9201e7..9099863 100644
--- a/erpnext/setup/doctype/sms_settings/sms_settings.py
+++ b/erpnext/setup/doctype/sms_settings/sms_settings.py
@@ -2,10 +2,10 @@
 # License: GNU General Public License v3. See license.txt
 
 from __future__ import unicode_literals
-import frappe, json
+import frappe
 
 from frappe import _, throw, msgprint
-from frappe.utils import cstr, nowdate
+from frappe.utils import nowdate
 
 from frappe.model.document import Document
 
@@ -63,8 +63,7 @@
 	}
 
 	if frappe.db.get_value('SMS Settings', None, 'sms_gateway_url'):
-		ret = send_via_gateway(arg)
-		msgprint(ret)
+		send_via_gateway(arg)
 	else:
 		msgprint(_("Please Update SMS Settings"))
 
@@ -74,12 +73,17 @@
 	for d in ss.get("parameters"):
 		args[d.parameter] = d.value
 
-	resp = []
+	success_list = []
 	for d in arg.get('receiver_list'):
 		args[ss.receiver_parameter] = d
-		resp.append(send_request(ss.sms_gateway_url, args))
+		status = send_request(ss.sms_gateway_url, args)
+		if status == 200:
+			success_list.append(d)
 
-	return resp
+	if len(success_list) > 0:
+		args.update(arg)
+		create_sms_log(args, success_list)
+		frappe.msgprint(_("SMS sent to following numbers: {0}").format("\n" + "\n".join(success_list)))
 
 # Send Request
 # =========================================================
@@ -90,9 +94,8 @@
 	headers = {}
 	headers['Accept'] = "text/plain, text/html, */*"
 	conn.request('GET', api_url + urllib.urlencode(args), headers = headers)    # send request
-	resp = conn.getresponse()     # get response
-	resp = resp.read()
-	return resp
+	resp = conn.getresponse()     # get response		
+	return resp.status
 
 # Split gateway url to server and api url
 # =========================================================
@@ -107,12 +110,13 @@
 
 # Create SMS Log
 # =========================================================
-def create_sms_log(arg, sent_sms):
-	sl = frappe.get_doc('SMS Log')
-	sl.sender_name = arg['sender_name']
+def create_sms_log(args, sent_to):
+	sl = frappe.new_doc('SMS Log')
+	sl.sender_name = args['sender_name']
 	sl.sent_on = nowdate()
-	sl.receiver_list = cstr(arg['receiver_list'])
-	sl.message = arg['message']
-	sl.no_of_requested_sms = len(arg['receiver_list'])
-	sl.no_of_sent_sms = sent_sms
+	sl.message = args['message']
+	sl.no_of_requested_sms = len(args['receiver_list'])
+	sl.requested_numbers = "\n".join(args['receiver_list'])
+	sl.no_of_sent_sms = len(sent_to)
+	sl.sent_to = "\n".join(sent_to)
 	sl.save()
diff --git a/erpnext/stock/doctype/item/item.js b/erpnext/stock/doctype/item/item.js
index 58b1adb..3bd5657 100644
--- a/erpnext/stock/doctype/item/item.js
+++ b/erpnext/stock/doctype/item/item.js
@@ -86,8 +86,12 @@
 	},
 	
 	manage_variants: function(frm) {
-		frappe.route_options = {"item_code": frm.doc.name };
-		frappe.set_route("List", "Manage Variants");
+		if (cur_frm.doc.__unsaved==1) {
+			frappe.throw(__("You have unsaved changes. Please save."))
+		} else {
+			frappe.route_options = {"item_code": frm.doc.name };
+			frappe.set_route("List", "Manage Variants");
+		}
 	}
 });
 
diff --git a/erpnext/stock/doctype/item/item.py b/erpnext/stock/doctype/item/item.py
index a2e0ade..d3d8e9c 100644
--- a/erpnext/stock/doctype/item/item.py
+++ b/erpnext/stock/doctype/item/item.py
@@ -325,7 +325,8 @@
 			for d in variants:
 				update_variant(self.name, d)
 				updated.append(d.item_code)
-			frappe.msgprint(_("Item Variants {0} updated").format(", ".join(updated)))
+			if updated:
+				frappe.msgprint(_("Item Variants {0} updated").format(", ".join(updated)))
 				
 	def validate_has_variants(self):
 		if not self.has_variants and frappe.db.get_value("Item", self.name, "has_variants"):
diff --git a/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py b/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
index ff027d7..010f5ea 100644
--- a/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
+++ b/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
@@ -57,7 +57,12 @@
 	def validate_item(self):
 		item_det = frappe.db.sql("""select name, has_batch_no, docstatus,
 			is_stock_item, has_variants, stock_uom
-			from tabItem where name=%s""", self.item_code, as_dict=True)[0]
+			from tabItem where name=%s""", self.item_code, as_dict=True)
+
+		if not item_det:
+			frappe.throw(_("Item {0} not found").format(self.item_code))
+
+		item_det = item_det[0]
 
 		if item_det.is_stock_item != 'Yes':
 			frappe.throw(_("Item {0} must be a stock Item").format(self.item_code))
@@ -97,7 +102,7 @@
 	def scrub_posting_time(self):
 		if not self.posting_time or self.posting_time == '00:0':
 			self.posting_time = '00:00'
-			
+
 	def validate_batch(self):
 		if self.batch_no and self.voucher_type != "Stock Entry":
 			expiry_date = frappe.db.get_value("Batch", self.batch_no, "expiry_date")
diff --git a/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py b/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py
index 413f820..efa6a8a 100644
--- a/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py
+++ b/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py
@@ -11,6 +11,7 @@
 from erpnext.stock.utils import get_stock_balance
 
 class OpeningEntryAccountError(frappe.ValidationError): pass
+class EmptyStockReconciliationItemsError(frappe.ValidationError): pass
 
 class StockReconciliation(StockController):
 	def __init__(self, arg1, arg2=None):
@@ -51,7 +52,11 @@
 
 		items = filter(lambda d: _changed(d), self.items)
 
-		if len(items) != len(self.items):
+		if not items:
+			frappe.throw(_("None of the items have any change in quantity or value."),
+				EmptyStockReconciliationItemsError)
+
+		elif len(items) != len(self.items):
 			self.items = items
 			for i, item in enumerate(self.items):
 				item.idx = i + 1
diff --git a/erpnext/stock/report/stock_ledger/stock_ledger.py b/erpnext/stock/report/stock_ledger/stock_ledger.py
index 0651ae8..c2c6d1a 100644
--- a/erpnext/stock/report/stock_ledger/stock_ledger.py
+++ b/erpnext/stock/report/stock_ledger/stock_ledger.py
@@ -9,8 +9,13 @@
 	columns = get_columns()
 	sl_entries = get_stock_ledger_entries(filters)
 	item_details = get_item_details(filters)
-
+	opening_row = get_opening_balance(filters, columns)
+	
 	data = []
+	
+	if opening_row:
+		data.append(opening_row)
+
 	for sle in sl_entries:
 		item_detail = item_details[sle.item_code]
 
@@ -20,7 +25,7 @@
 			(sle.incoming_rate if sle.actual_qty > 0 else 0.0),
 			sle.valuation_rate, sle.stock_value, sle.voucher_type, sle.voucher_no,
 			sle.batch_no, sle.serial_no, sle.company])
-
+			
 	return columns, data
 
 def get_columns():
@@ -40,7 +45,7 @@
 		where company = %(company)s and
 			posting_date between %(from_date)s and %(to_date)s
 			{sle_conditions}
-			order by posting_date desc, posting_time desc, name desc"""\
+			order by posting_date asc, posting_time asc, name asc"""\
 		.format(sle_conditions=get_sle_conditions(filters)), filters, as_dict=1)
 
 def get_item_details(filters):
@@ -73,3 +78,22 @@
 		conditions.append("voucher_no=%(voucher_no)s")
 
 	return "and {}".format(" and ".join(conditions)) if conditions else ""
+
+def get_opening_balance(filters, columns):
+	if not (filters.item_code and filters.warehouse and filters.from_date):
+		return
+
+	from erpnext.stock.stock_ledger import get_previous_sle
+	last_entry = get_previous_sle({
+		"item_code": filters.item_code,
+		"warehouse": filters.warehouse,
+		"posting_date": filters.from_date,
+		"posting_time": "00:00:00"
+	})
+	
+	row = [""]*len(columns)
+	row[1] = _("'Opening'")
+	for i, v in ((9, 'qty_after_transaction'), (11, 'valuation_rate'), (12, 'stock_value')):
+			row[i] = last_entry.get(v, 0)
+		
+	return row
\ No newline at end of file
diff --git a/erpnext/templates/includes/macros.html b/erpnext/templates/includes/macros.html
index 0967e97..6748a5e 100644
--- a/erpnext/templates/includes/macros.html
+++ b/erpnext/templates/includes/macros.html
@@ -1,6 +1,6 @@
 {% macro product_image_square(website_image, css_class="") %}
 <div class="product-image product-image-square {% if not website_image -%} missing-image {%- endif %} {{ css_class }}"
-	{% if website_image -%} style="background-image: url('{{ frappe.utils.quoted(website_image) }}');" {%- endif %}>
+	{% if website_image -%} style="background-image: url('{{ frappe.utils.quoted(website_image) | abs_url }}');" {%- endif %}>
 	{% if not website_image -%}<i class="centered octicon octicon-device-camera"></i>{%- endif %}
 </div>
 {% endmacro %}
@@ -8,7 +8,7 @@
 {% macro product_image(website_image, css_class="") %}
 <div class="product-image {% if not website_image -%} missing-image {%- endif %} {{ css_class }}">
 	{% if website_image -%}
-		<img src="{{ frappe.utils.quoted(website_image) }}" class="img-responsive">
+		<img src="{{ frappe.utils.quoted(website_image) | abs_url }}" class="img-responsive">
 	{%- else -%}
 		<i class="centered octicon octicon-device-camera"></i>
 	{%- endif %}
diff --git a/erpnext/utilities/doctype/sms_log/sms_log.json b/erpnext/utilities/doctype/sms_log/sms_log.json
index e3c7741..ba88c62 100644
--- a/erpnext/utilities/doctype/sms_log/sms_log.json
+++ b/erpnext/utilities/doctype/sms_log/sms_log.json
@@ -1,32 +1,58 @@
 {
  "autoname": "SMSLOG/.########", 
- "creation": "2012-03-27 14:36:47.000000", 
+ "creation": "2012-03-27 14:36:47", 
  "docstatus": 0, 
  "doctype": "DocType", 
  "fields": [
   {
-   "fieldname": "column_break0", 
-   "fieldtype": "Column Break", 
-   "permlevel": 0, 
-   "width": "50%"
-  }, 
-  {
    "fieldname": "sender_name", 
    "fieldtype": "Data", 
    "label": "Sender Name", 
-   "permlevel": 0
+   "permlevel": 0, 
+   "read_only": 1
   }, 
   {
    "fieldname": "sent_on", 
    "fieldtype": "Date", 
    "label": "Sent On", 
-   "permlevel": 0
+   "permlevel": 0, 
+   "read_only": 1
   }, 
   {
-   "fieldname": "receiver_list", 
+   "fieldname": "column_break0", 
+   "fieldtype": "Column Break", 
+   "permlevel": 0, 
+   "read_only": 0, 
+   "width": "50%"
+  }, 
+  {
+   "fieldname": "message", 
    "fieldtype": "Small Text", 
-   "label": "Receiver List", 
-   "permlevel": 0
+   "label": "Message", 
+   "permlevel": 0, 
+   "read_only": 1
+  }, 
+  {
+   "fieldname": "sec_break1", 
+   "fieldtype": "Section Break", 
+   "options": "Simple", 
+   "permlevel": 0, 
+   "precision": "", 
+   "read_only": 0
+  }, 
+  {
+   "fieldname": "no_of_requested_sms", 
+   "fieldtype": "Int", 
+   "label": "No of Requested SMS", 
+   "permlevel": 0, 
+   "read_only": 1
+  }, 
+  {
+   "fieldname": "requested_numbers", 
+   "fieldtype": "Small Text", 
+   "label": "Requested Numbers", 
+   "permlevel": 0, 
+   "read_only": 1
   }, 
   {
    "fieldname": "column_break1", 
@@ -35,27 +61,24 @@
    "width": "50%"
   }, 
   {
-   "fieldname": "no_of_requested_sms", 
-   "fieldtype": "Int", 
-   "label": "No of Requested SMS", 
-   "permlevel": 0
-  }, 
-  {
    "fieldname": "no_of_sent_sms", 
    "fieldtype": "Int", 
    "label": "No of Sent SMS", 
-   "permlevel": 0
+   "permlevel": 0, 
+   "read_only": 1
   }, 
   {
-   "fieldname": "message", 
+   "fieldname": "sent_to", 
    "fieldtype": "Small Text", 
-   "label": "Message", 
-   "permlevel": 0
+   "label": "Sent To", 
+   "permlevel": 0, 
+   "precision": "", 
+   "read_only": 1
   }
  ], 
  "icon": "icon-mobile-phone", 
  "idx": 1, 
- "modified": "2013-12-20 19:24:35.000000", 
+ "modified": "2015-07-22 11:53:25.998578", 
  "modified_by": "Administrator", 
  "module": "Utilities", 
  "name": "SMS Log", 
diff --git a/setup.py b/setup.py
index e7702e4..9cb39e1 100644
--- a/setup.py
+++ b/setup.py
@@ -1,6 +1,6 @@
 from setuptools import setup, find_packages
 
-version = "5.1.6"
+version = "5.2.1"
 
 with open("requirements.txt", "r") as f:
 	install_requires = f.readlines()