Add Delivery Settings + improve 'Notify Customers' functionality (#15322)

* Add Delivery Settings + improve 'Notify Customers' functionality

* Minor improvements

* Add patch to create a default dispatch notification template

* Fix travis errors
diff --git a/erpnext/patches.txt b/erpnext/patches.txt
index 8c18d14..0c20dbd 100644
--- a/erpnext/patches.txt
+++ b/erpnext/patches.txt
@@ -566,3 +566,4 @@
 erpnext.patches.v10_0.delete_hub_documents # 12-08-2018
 erpnext.patches.v11_0.rename_healthcare_fields
 erpnext.patches.v11_0.remove_land_unit_icon
+erpnext.patches.v11_0.add_default_dispatch_notification_template
diff --git a/erpnext/patches/v11_0/add_default_dispatch_notification_template.py b/erpnext/patches/v11_0/add_default_dispatch_notification_template.py
new file mode 100644
index 0000000..08006ad
--- /dev/null
+++ b/erpnext/patches/v11_0/add_default_dispatch_notification_template.py
@@ -0,0 +1,25 @@
+import os
+
+import frappe
+from frappe import _
+
+
+def execute():
+	frappe.reload_doc("email", "doctype", "email_template")
+	frappe.reload_doc("stock", "doctype", "delivery_settings")
+
+	if not frappe.db.exists("Email Template", _("Dispatch Notification")):
+		base_path = frappe.get_app_path("erpnext", "stock", "doctype")
+		response = frappe.read_file(os.path.join(base_path, "delivery_trip/dispatch_notification_template.html"))
+
+		frappe.get_doc({
+			"doctype": "Email Template",
+			"name": _("Dispatch Notification"),
+			"response": response,
+			"subject": _("Your order is out for delivery!"),
+			"owner": frappe.session.user,
+		}).insert(ignore_permissions=True)
+
+	delivery_settings = frappe.get_doc("Delivery Settings")
+	delivery_settings.dispatch_template = _("Dispatch Notification")
+	delivery_settings.save()
diff --git a/erpnext/setup/setup_wizard/operations/defaults_setup.py b/erpnext/setup/setup_wizard/operations/defaults_setup.py
index 657905d..ff8dd75 100644
--- a/erpnext/setup/setup_wizard/operations/defaults_setup.py
+++ b/erpnext/setup/setup_wizard/operations/defaults_setup.py
@@ -55,6 +55,10 @@
 	buying_settings.allow_multiple_items = 1
 	buying_settings.save()
 
+	delivery_settings = frappe.get_doc("Delivery Settings")
+	delivery_settings.dispatch_template = _("Dispatch Notification")
+	delivery_settings.save()
+
 	hr_settings = frappe.get_doc("HR Settings")
 	hr_settings.emp_created_by = "Naming Series"
 	hr_settings.leave_approval_notification_template = _("Leave Approval Notification")
diff --git a/erpnext/setup/setup_wizard/operations/install_fixtures.py b/erpnext/setup/setup_wizard/operations/install_fixtures.py
index 59e6577..194e0dd 100644
--- a/erpnext/setup/setup_wizard/operations/install_fixtures.py
+++ b/erpnext/setup/setup_wizard/operations/install_fixtures.py
@@ -250,6 +250,12 @@
 	records += [{'doctype': 'Email Template', 'name': _("Leave Status Notification"), 'response': response,\
 		'subject': _("Leave Status Notification"), 'owner': frappe.session.user}]
 
+	base_path = frappe.get_app_path("erpnext", "stock", "doctype")
+	response = frappe.read_file(os.path.join(base_path, "delivery_trip/dispatch_notification_template.html"))
+
+	records += [{'doctype': 'Email Template', 'name': _("Dispatch Notification"), 'response': response,\
+		'subject': _("Your order is out for delivery!"), 'owner': frappe.session.user}]
+
 	# Records for the Supplier Scorecard
 	from erpnext.buying.doctype.supplier_scorecard.supplier_scorecard import make_default_records
 	make_default_records()
diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.py b/erpnext/stock/doctype/delivery_note/delivery_note.py
index 6e45273..6fec612 100644
--- a/erpnext/stock/doctype/delivery_note/delivery_note.py
+++ b/erpnext/stock/doctype/delivery_note/delivery_note.py
@@ -460,6 +460,7 @@
 		target_doc.customer_address = source_parent.shipping_address
 		target_doc.contact = source_parent.contact_person
 		target_doc.customer_contact = source_parent.contact_display
+		target_doc.grand_total = source_parent.grand_total
 
 		# Append unique Delivery Notes in Delivery Trip
 		delivery_notes.append(target_doc.delivery_note)
diff --git a/erpnext/stock/doctype/delivery_settings/__init__.py b/erpnext/stock/doctype/delivery_settings/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/stock/doctype/delivery_settings/__init__.py
diff --git a/erpnext/stock/doctype/delivery_settings/delivery_settings.js b/erpnext/stock/doctype/delivery_settings/delivery_settings.js
new file mode 100644
index 0000000..03aa192
--- /dev/null
+++ b/erpnext/stock/doctype/delivery_settings/delivery_settings.js
@@ -0,0 +1,8 @@
+// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
+// For license information, please see license.txt
+
+frappe.ui.form.on('Delivery Settings', {
+	refresh: function(frm) {
+
+	}
+});
diff --git a/erpnext/stock/doctype/delivery_settings/delivery_settings.json b/erpnext/stock/doctype/delivery_settings/delivery_settings.json
new file mode 100644
index 0000000..b70d74d
--- /dev/null
+++ b/erpnext/stock/doctype/delivery_settings/delivery_settings.json
@@ -0,0 +1,194 @@
+{
+ "allow_copy": 0, 
+ "allow_guest_to_view": 0, 
+ "allow_import": 0, 
+ "allow_rename": 0, 
+ "beta": 0, 
+ "creation": "2018-09-04 23:01:34.458550", 
+ "custom": 0, 
+ "docstatus": 0, 
+ "doctype": "DocType", 
+ "document_type": "", 
+ "editable_grid": 1, 
+ "engine": "InnoDB", 
+ "fields": [
+  {
+   "allow_bulk_edit": 0, 
+   "allow_in_quick_entry": 0, 
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "columns": 0, 
+   "fieldname": "sb_dispatch", 
+   "fieldtype": "Section Break", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_global_search": 0, 
+   "in_list_view": 0, 
+   "in_standard_filter": 0, 
+   "label": "Dispatch Settings", 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "remember_last_selected_value": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "translatable": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_bulk_edit": 0, 
+   "allow_in_quick_entry": 0, 
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "columns": 0, 
+   "fieldname": "dispatch_template", 
+   "fieldtype": "Link", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_global_search": 0, 
+   "in_list_view": 0, 
+   "in_standard_filter": 0, 
+   "label": "Dispatch Notification Template", 
+   "length": 0, 
+   "no_copy": 0, 
+   "options": "Email Template", 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "remember_last_selected_value": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "translatable": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_bulk_edit": 0, 
+   "allow_in_quick_entry": 0, 
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "columns": 0, 
+   "depends_on": "send_with_attachment", 
+   "description": "Leave blank to use the standard Delivery Note format", 
+   "fieldname": "dispatch_attachment", 
+   "fieldtype": "Link", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_global_search": 0, 
+   "in_list_view": 0, 
+   "in_standard_filter": 0, 
+   "label": "Dispatch Notification Attachment", 
+   "length": 0, 
+   "no_copy": 0, 
+   "options": "Print Format", 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "remember_last_selected_value": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "translatable": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_bulk_edit": 0, 
+   "allow_in_quick_entry": 0, 
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "columns": 0, 
+   "fieldname": "send_with_attachment", 
+   "fieldtype": "Check", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_global_search": 0, 
+   "in_list_view": 0, 
+   "in_standard_filter": 0, 
+   "label": "Send with Attachment", 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "remember_last_selected_value": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "translatable": 0, 
+   "unique": 0
+  }
+ ], 
+ "has_web_view": 0, 
+ "hide_heading": 0, 
+ "hide_toolbar": 0, 
+ "idx": 0, 
+ "image_view": 0, 
+ "in_create": 0, 
+ "is_submittable": 0, 
+ "issingle": 1, 
+ "istable": 0, 
+ "max_attachments": 0, 
+ "modified": "2018-09-05 00:16:23.569855", 
+ "modified_by": "Administrator", 
+ "module": "Stock", 
+ "name": "Delivery Settings", 
+ "name_case": "", 
+ "owner": "Administrator", 
+ "permissions": [
+  {
+   "amend": 0, 
+   "cancel": 0, 
+   "create": 1, 
+   "delete": 1, 
+   "email": 1, 
+   "export": 0, 
+   "if_owner": 0, 
+   "import": 0, 
+   "permlevel": 0, 
+   "print": 1, 
+   "read": 1, 
+   "report": 0, 
+   "role": "System Manager", 
+   "set_user_permissions": 0, 
+   "share": 1, 
+   "submit": 0, 
+   "write": 1
+  }
+ ], 
+ "quick_entry": 1, 
+ "read_only": 0, 
+ "read_only_onload": 0, 
+ "show_name_in_global_search": 0, 
+ "sort_field": "modified", 
+ "sort_order": "DESC", 
+ "track_changes": 1, 
+ "track_seen": 0, 
+ "track_views": 0
+}
\ No newline at end of file
diff --git a/erpnext/stock/doctype/delivery_settings/delivery_settings.py b/erpnext/stock/doctype/delivery_settings/delivery_settings.py
new file mode 100644
index 0000000..909efda
--- /dev/null
+++ b/erpnext/stock/doctype/delivery_settings/delivery_settings.py
@@ -0,0 +1,10 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
+# For license information, please see license.txt
+
+from __future__ import unicode_literals
+import frappe
+from frappe.model.document import Document
+
+class DeliverySettings(Document):
+	pass
diff --git a/erpnext/stock/doctype/delivery_settings/test_delivery_settings.js b/erpnext/stock/doctype/delivery_settings/test_delivery_settings.js
new file mode 100644
index 0000000..22977c0
--- /dev/null
+++ b/erpnext/stock/doctype/delivery_settings/test_delivery_settings.js
@@ -0,0 +1,23 @@
+/* eslint-disable */
+// rename this file from _test_[name] to test_[name] to activate
+// and remove above this line
+
+QUnit.test("test: Delivery Settings", function (assert) {
+	let done = assert.async();
+
+	// number of asserts
+	assert.expect(1);
+
+	frappe.run_serially([
+		// insert a new Delivery Settings
+		() => frappe.tests.make('Delivery Settings', [
+			// values to be set
+			{key: 'value'}
+		]),
+		() => {
+			assert.equal(cur_frm.doc.key, 'value');
+		},
+		() => done()
+	]);
+
+});
diff --git a/erpnext/stock/doctype/delivery_settings/test_delivery_settings.py b/erpnext/stock/doctype/delivery_settings/test_delivery_settings.py
new file mode 100644
index 0000000..4395d26
--- /dev/null
+++ b/erpnext/stock/doctype/delivery_settings/test_delivery_settings.py
@@ -0,0 +1,10 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors
+# See license.txt
+from __future__ import unicode_literals
+
+import frappe
+import unittest
+
+class TestDeliverySettings(unittest.TestCase):
+	pass
diff --git a/erpnext/stock/doctype/delivery_stop/delivery_stop.json b/erpnext/stock/doctype/delivery_stop/delivery_stop.json
index 4fe4102..023e34d 100644
--- a/erpnext/stock/doctype/delivery_stop/delivery_stop.json
+++ b/erpnext/stock/doctype/delivery_stop/delivery_stop.json
@@ -18,7 +18,7 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
-   "columns": 0, 
+   "columns": 2, 
    "fieldname": "customer", 
    "fieldtype": "Link", 
    "hidden": 0, 
@@ -85,6 +85,38 @@
    "bold": 0, 
    "collapsible": 0, 
    "columns": 0, 
+   "fieldname": "lock", 
+   "fieldtype": "Check", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_global_search": 0, 
+   "in_list_view": 1, 
+   "in_standard_filter": 0, 
+   "label": "Lock", 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "remember_last_selected_value": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "translatable": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_bulk_edit": 0, 
+   "allow_in_quick_entry": 0, 
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "columns": 0, 
    "fieldname": "column_break_6", 
    "fieldtype": "Column Break", 
    "hidden": 0, 
@@ -148,7 +180,7 @@
    "bold": 0, 
    "collapsible": 0, 
    "columns": 0, 
-   "fieldname": "section_break_7", 
+   "fieldname": "order_information_section", 
    "fieldtype": "Section Break", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
@@ -157,6 +189,71 @@
    "in_global_search": 0, 
    "in_list_view": 0, 
    "in_standard_filter": 0, 
+   "label": "Order Information", 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "remember_last_selected_value": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "translatable": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_bulk_edit": 0, 
+   "allow_in_quick_entry": 0, 
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "columns": 0, 
+   "fieldname": "delivery_note", 
+   "fieldtype": "Link", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_global_search": 0, 
+   "in_list_view": 1, 
+   "in_standard_filter": 0, 
+   "label": "Delivery Note", 
+   "length": 0, 
+   "no_copy": 1, 
+   "options": "Delivery Note", 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 1, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 1, 
+   "remember_last_selected_value": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "translatable": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_bulk_edit": 0, 
+   "allow_in_quick_entry": 0, 
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "columns": 0, 
+   "fieldname": "cb_order", 
+   "fieldtype": "Column Break", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_global_search": 0, 
+   "in_list_view": 0, 
+   "in_standard_filter": 0, 
    "length": 0, 
    "no_copy": 0, 
    "permlevel": 0, 
@@ -179,6 +276,70 @@
    "bold": 0, 
    "collapsible": 0, 
    "columns": 0, 
+   "fieldname": "grand_total", 
+   "fieldtype": "Currency", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_global_search": 0, 
+   "in_list_view": 0, 
+   "in_standard_filter": 0, 
+   "label": "Grand Total", 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 1, 
+   "remember_last_selected_value": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "translatable": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_bulk_edit": 0, 
+   "allow_in_quick_entry": 0, 
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "columns": 0, 
+   "fieldname": "section_break_7", 
+   "fieldtype": "Section Break", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_global_search": 0, 
+   "in_list_view": 0, 
+   "in_standard_filter": 0, 
+   "label": "Contact Information", 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "remember_last_selected_value": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "translatable": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_bulk_edit": 0, 
+   "allow_in_quick_entry": 0, 
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "columns": 0, 
    "fieldname": "contact", 
    "fieldtype": "Link", 
    "hidden": 0, 
@@ -186,7 +347,7 @@
    "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_global_search": 0, 
-   "in_list_view": 1, 
+   "in_list_view": 0, 
    "in_standard_filter": 0, 
    "label": "Contact Name", 
    "length": 0, 
@@ -212,6 +373,38 @@
    "bold": 0, 
    "collapsible": 0, 
    "columns": 0, 
+   "fieldname": "email_sent_to", 
+   "fieldtype": "Data", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_global_search": 0, 
+   "in_list_view": 0, 
+   "in_standard_filter": 0, 
+   "label": "Email sent to", 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 1, 
+   "remember_last_selected_value": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "translatable": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_bulk_edit": 0, 
+   "allow_in_quick_entry": 0, 
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "columns": 0, 
    "fieldname": "column_break_7", 
    "fieldtype": "Column Break", 
    "hidden": 0, 
@@ -284,6 +477,7 @@
    "in_global_search": 0, 
    "in_list_view": 0, 
    "in_standard_filter": 0, 
+   "label": "Dispatch Information", 
    "length": 0, 
    "no_copy": 0, 
    "permlevel": 0, 
@@ -362,196 +556,6 @@
    "set_only_once": 0, 
    "translatable": 0, 
    "unique": 0
-  }, 
-  {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "section_break_12", 
-   "fieldtype": "Section Break", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 0, 
-   "in_list_view": 0, 
-   "in_standard_filter": 0, 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 0, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "delivery_note", 
-   "fieldtype": "Link", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 0, 
-   "in_list_view": 0, 
-   "in_standard_filter": 0, 
-   "label": "Delivery Note", 
-   "length": 0, 
-   "no_copy": 1, 
-   "options": "Delivery Note", 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 1, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "section_break_14", 
-   "fieldtype": "Section Break", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 0, 
-   "in_list_view": 0, 
-   "in_standard_filter": 0, 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 0, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 1, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "notified_by_email", 
-   "fieldtype": "Check", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 0, 
-   "in_list_view": 0, 
-   "in_standard_filter": 0, 
-   "label": "Notified by Email", 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "column_break_18", 
-   "fieldtype": "Column Break", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 0, 
-   "in_list_view": 0, 
-   "in_standard_filter": 0, 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 0, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "email_sent_to", 
-   "fieldtype": "Data", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 0, 
-   "in_list_view": 0, 
-   "in_standard_filter": 0, 
-   "label": "Email sent to", 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
   }
  ], 
  "has_web_view": 0, 
@@ -564,7 +568,7 @@
  "issingle": 0, 
  "istable": 1, 
  "max_attachments": 0, 
- "modified": "2018-08-21 22:25:53.276548", 
+ "modified": "2018-09-05 00:51:55.275009", 
  "modified_by": "Administrator", 
  "module": "Stock", 
  "name": "Delivery Stop", 
diff --git a/erpnext/stock/doctype/delivery_trip/delivery_trip.js b/erpnext/stock/doctype/delivery_trip/delivery_trip.js
index f3c0f75..9c31e05 100755
--- a/erpnext/stock/doctype/delivery_trip/delivery_trip.js
+++ b/erpnext/stock/doctype/delivery_trip/delivery_trip.js
@@ -2,8 +2,8 @@
 // For license information, please see license.txt
 
 frappe.ui.form.on('Delivery Trip', {
-	setup: function(frm) {
-		frm.set_query("driver", function() {
+	setup: function (frm) {
+		frm.set_query("driver", function () {
 			return {
 				filters: {
 					"status": "Active"
@@ -11,7 +11,7 @@
 			};
 		});
 
-		frm.set_query("address", "delivery_stops", function(doc, cdt, cdn) {
+		frm.set_query("address", "delivery_stops", function (doc, cdt, cdn) {
 			var row = locals[cdt][cdn];
 			if (row.customer) {
 				return {
@@ -24,7 +24,7 @@
 			}
 		})
 
-		frm.set_query("contact", "delivery_stops", function(doc, cdt, cdn) {
+		frm.set_query("contact", "delivery_stops", function (doc, cdt, cdn) {
 			var row = locals[cdt][cdn];
 			if (row.customer) {
 				return {
@@ -45,7 +45,7 @@
 			});
 		}
 
-		if (frm.doc.docstatus===0) {
+		if (frm.doc.docstatus === 0) {
 			frm.add_custom_button(__('Delivery Note'), () => {
 				erpnext.utils.map_current_doc({
 					method: "erpnext.stock.doctype.delivery_note.delivery_note.make_delivery_trip",
@@ -93,12 +93,8 @@
 	},
 
 	notify_customers: function (frm) {
-		var owner_email = frm.doc.owner == "Administrator"
-			? frappe.user_info("Administrator").email
-			: frm.doc.owner;
-
 		$.each(frm.doc.delivery_stops || [], function (i, delivery_stop) {
-			if (!delivery_stop.delivery_notes) {
+			if (!delivery_stop.delivery_note) {
 				frappe.msgprint({
 					"message": __("No Delivery Note selected for Customer {}", [delivery_stop.customer]),
 					"title": __("Warning"),
@@ -107,34 +103,37 @@
 				});
 			}
 		});
-		frappe.confirm(__("Do you want to notify all the customers by email?"), function () {
-			frappe.call({
-				method: "erpnext.stock.doctype.delivery_trip.delivery_trip.notify_customers",
-				args: {
-					"docname": frm.doc.name,
-					"date": frm.doc.date,
-					"driver": frm.doc.driver,
-					"vehicle": frm.doc.vehicle,
-					"sender_email": owner_email,
-					"sender_name": frappe.user.full_name(owner_email),
-					"delivery_notification": frm.doc.delivery_notification
-				}
-			});
-			frm.doc.email_notification_sent = true;
-			frm.refresh_field('email_notification_sent');
+
+		frappe.db.get_value("Delivery Settings", { name: "Delivery Settings" }, "dispatch_template", (r) => {
+			if (!r.dispatch_template) {
+				frappe.throw(__("Missing email template for dispatch. Please set one in Delivery Settings."));
+			} else {
+				frappe.confirm(__("Do you want to notify all the customers by email?"), function () {
+					frappe.call({
+						method: "erpnext.stock.doctype.delivery_trip.delivery_trip.notify_customers",
+						args: {
+							"delivery_trip": frm.doc.name
+						},
+						callback: function (r) {
+							if (!r.exc) {
+								frm.doc.email_notification_sent = true;
+								frm.refresh_field('email_notification_sent');
+							}
+						}
+					});
+				});
+			}
 		});
 	}
 });
 
-
-
 frappe.ui.form.on('Delivery Stop', {
 	customer: function (frm, cdt, cdn) {
 		var row = locals[cdt][cdn];
-		if(row.customer) {
+		if (row.customer) {
 			frappe.call({
 				method: "erpnext.stock.doctype.delivery_trip.delivery_trip.get_contact_and_address",
-				args: {"name": row.customer},
+				args: { "name": row.customer },
 				callback: function (r) {
 					if (r.message) {
 						if (r.message["shipping_address"]) {
@@ -158,12 +157,13 @@
 			});
 		}
 	},
+
 	address: function (frm, cdt, cdn) {
 		var row = locals[cdt][cdn];
-		if(row.address) {
+		if (row.address) {
 			frappe.call({
 				method: "frappe.contacts.doctype.address.address.get_address_display",
-				args: {"address_dict": row.address},
+				args: { "address_dict": row.address },
 				callback: function (r) {
 					if (r.message) {
 						frappe.model.set_value(cdt, cdn, "customer_address", r.message);
@@ -177,10 +177,10 @@
 
 	contact: function (frm, cdt, cdn) {
 		var row = locals[cdt][cdn];
-		if(row.contact) {
+		if (row.contact) {
 			frappe.call({
 				method: "erpnext.stock.doctype.delivery_trip.delivery_trip.get_contact_display",
-				args: {"contact": row.contact},
+				args: { "contact": row.contact },
 				callback: function (r) {
 					if (r.message) {
 						frappe.model.set_value(cdt, cdn, "customer_contact", r.message);
diff --git a/erpnext/stock/doctype/delivery_trip/delivery_trip.json b/erpnext/stock/doctype/delivery_trip/delivery_trip.json
index 364bc6b..3cb19af 100644
--- a/erpnext/stock/doctype/delivery_trip/delivery_trip.json
+++ b/erpnext/stock/doctype/delivery_trip/delivery_trip.json
@@ -114,7 +114,7 @@
   {
    "allow_bulk_edit": 0, 
    "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
+   "allow_on_submit": 1, 
    "bold": 0, 
    "collapsible": 0, 
    "columns": 0, 
@@ -437,7 +437,7 @@
   {
    "allow_bulk_edit": 0, 
    "allow_in_quick_entry": 0, 
-   "allow_on_submit": 1, 
+   "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
    "columns": 0, 
@@ -507,7 +507,7 @@
    "bold": 0, 
    "collapsible": 0, 
    "columns": 0, 
-   "fieldname": "section_break_13", 
+   "fieldname": "section_break_15", 
    "fieldtype": "Section Break", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
@@ -538,40 +538,6 @@
    "bold": 0, 
    "collapsible": 0, 
    "columns": 0, 
-   "default": "", 
-   "fieldname": "delivery_notification", 
-   "fieldtype": "Link", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 0, 
-   "in_list_view": 0, 
-   "in_standard_filter": 0, 
-   "label": "Delivery Notification", 
-   "length": 0, 
-   "no_copy": 0, 
-   "options": "Email Template", 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 0, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 1, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
    "fieldname": "amended_from", 
    "fieldtype": "Link", 
    "hidden": 0, 
@@ -608,7 +574,7 @@
  "issingle": 0, 
  "istable": 0, 
  "max_attachments": 0, 
- "modified": "2018-08-30 02:31:49.400138", 
+ "modified": "2018-09-05 01:20:34.165834", 
  "modified_by": "Administrator", 
  "module": "Stock", 
  "name": "Delivery Trip", 
diff --git a/erpnext/stock/doctype/delivery_trip/delivery_trip.py b/erpnext/stock/doctype/delivery_trip/delivery_trip.py
index 5f291c3..e932b14 100644
--- a/erpnext/stock/doctype/delivery_trip/delivery_trip.py
+++ b/erpnext/stock/doctype/delivery_trip/delivery_trip.py
@@ -10,8 +10,7 @@
 from frappe import _
 from frappe.contacts.doctype.address.address import get_address_display
 from frappe.model.document import Document
-from frappe.utils import cstr, get_datetime, getdate, get_link_to_form
-from frappe.utils.user import get_user_fullname
+from frappe.utils import get_datetime, get_link_to_form
 
 
 class DeliveryTrip(Document):
@@ -169,59 +168,50 @@
 
 
 @frappe.whitelist()
-def notify_customers(docname, date, driver, vehicle, sender_email, delivery_notification):
-	sender_name = get_user_fullname(sender_email)
-	attachments = []
+def notify_customers(delivery_trip):
+	delivery_trip = frappe.get_doc("Delivery Trip", delivery_trip)
 
-	parent_doc = frappe.get_doc('Delivery Trip', docname)
-	args = parent_doc.as_dict()
+	context = delivery_trip.as_dict()
 
-	for delivery_stop in parent_doc.delivery_stops:
-		contact_info = frappe.db.get_value("Contact", delivery_stop.contact,
-			["first_name", "last_name", "email_id", "gender"], as_dict=1)
+	if delivery_trip.driver:
+		context.update(frappe.db.get_value("Driver", delivery_trip.driver, "cell_number", as_dict=1))
 
-		args.update(delivery_stop.as_dict())
-		args.update(contact_info)
+	email_recipients = []
 
-		if delivery_stop.delivery_note:
-			default_print_format = frappe.get_meta('Delivery Note').default_print_format
-			attachments = frappe.attach_print('Delivery Note',
-				delivery_stop.delivery_note,
-				file_name="Delivery Note",
-				print_format=default_print_format or "Standard")
+	for stop in delivery_trip.delivery_stops:
+		contact_info = frappe.db.get_value("Contact", stop.contact,
+											["first_name", "last_name", "email_id", "gender"], as_dict=1)
 
-		if not delivery_stop.notified_by_email and contact_info.email_id:
-			driver_info = frappe.db.get_value("Driver", driver, ["full_name", "cell_number"], as_dict=1)
-			sender_designation = frappe.db.get_value("Employee", sender_email, ["designation"])
+		if contact_info and contact_info.email_id:
+			context.update(stop.as_dict())
+			context.update(contact_info)
 
-			estimated_arrival = cstr(delivery_stop.estimated_arrival)[:-3]
-			email_template = frappe.get_doc("Email Template", delivery_notification)
-			message = frappe.render_template(email_template.response, args)
+			dispatch_template_name = frappe.db.get_single_value("Delivery Settings", "dispatch_template")
+			dispatch_template = frappe.get_doc("Email Template", dispatch_template_name)
 
-			frappe.sendmail(
-				recipients=contact_info.email_id,
-				sender=sender_email,
-				message=message,
-				attachments=attachments,
-				subject=_(email_template.subject).format(getdate(date).strftime('%d.%m.%y'),
-					estimated_arrival))
+			frappe.sendmail(recipients=contact_info.email_id,
+							subject=dispatch_template.subject,
+							message=frappe.render_template(dispatch_template.response, context),
+							attachments=get_attachments(stop))
 
-			frappe.db.set_value("Delivery Stop", delivery_stop.name, "notified_by_email", 1)
-			frappe.db.set_value("Delivery Stop", delivery_stop.name,
-				"email_sent_to", contact_info.email_id)
-			frappe.msgprint(_("Email sent to {0}").format(contact_info.email_id))
+			stop.db_set("email_sent_to", contact_info.email_id)
+			email_recipients.append(contact_info.email_id)
 
-def round_timedelta(td, period):
-	"""Round timedelta"""
-	period_seconds = period.total_seconds()
-	half_period_seconds = period_seconds / 2
-	remainder = td.total_seconds() % period_seconds
-	if remainder >= half_period_seconds:
-		return datetime.timedelta(seconds=td.total_seconds() + (period_seconds - remainder))
+	if email_recipients:
+		frappe.msgprint(_("Email sent to {0}").format(", ".join(email_recipients)))
+		delivery_trip.db_set("email_notification_sent", True)
 	else:
-		return datetime.timedelta(seconds=td.total_seconds() - remainder)
+		frappe.msgprint(_("No contacts with email IDs found."))
 
-def format_address(address):
-	"""Customer Address format """
-	address = frappe.get_doc('Address', address)
-	return '{}, {}, {}, {}'.format(address.address_line1, address.city, address.pincode, address.country)
+
+def get_attachments(delivery_stop):
+	if not (frappe.db.get_single_value("Delivery Settings", "send_with_attachment") and delivery_stop.delivery_note):
+		return []
+
+	dispatch_attachment = frappe.db.get_single_value("Delivery Settings", "dispatch_attachment")
+	attachments = frappe.attach_print("Delivery Note",
+										delivery_stop.delivery_note,
+										file_name="Delivery Note",
+										print_format=dispatch_attachment)
+
+	return [attachments]
diff --git a/erpnext/stock/doctype/delivery_trip/dispatch_notification_template.html b/erpnext/stock/doctype/delivery_trip/dispatch_notification_template.html
new file mode 100644
index 0000000..90a5c50
--- /dev/null
+++ b/erpnext/stock/doctype/delivery_trip/dispatch_notification_template.html
@@ -0,0 +1,50 @@
+<h1>Dispatch Notification</h1>
+<h3>Details:</h3>
+<table class="table table-bordered small" style="max-width: 500px;">
+    <tbody>
+        <tr>
+            <td>Customer's Name</td>
+            <td>{{ customer }}</td>
+        </tr>
+        <tr>
+            <td>Contact's Name</td>
+            <td>{{ first_name }} {{ last_name }}</td>
+        </tr>
+        <tr>
+            <td>Address Name</td>
+            <td>{{ address }}</td>
+        </tr>
+        <tr>
+            <td>Address Details</td>
+            <td>{{ customer_address }}</td>
+        </tr>
+        <tr>
+            <td>Order Number</td>
+            <td>{{ delivery_note }}</td>
+        </tr>
+        <tr>
+            <td>Order Total</td>
+            <td>{{ grand_total }}</td>
+        </tr>
+        <tr>
+            <td>Departure Time</td>
+            <td>{{ cstr(departure_time) }}</td>
+        </tr>
+        <tr>
+            <td>Estimated Arrival</td>
+            <td>{{ cstr(estimated_arrival) }}</td>
+        </tr>
+        <tr>
+            <td>Driver's Name</td>
+            <td>{{ driver_name }}</td>
+        </tr>
+        <tr>
+            <td>Driver's Number</td>
+            <td>{{ cell_number }}</td>
+        </tr>
+        <tr>
+            <td>Vehicle Number</td>
+            <td>{{ vehicle }}</td>
+        </tr>
+    </tbody>
+</table>
\ No newline at end of file
diff --git a/erpnext/stock/doctype/delivery_trip/test_delivery_trip.py b/erpnext/stock/doctype/delivery_trip/test_delivery_trip.py
index aad36c1..4f7fcd8 100644
--- a/erpnext/stock/doctype/delivery_trip/test_delivery_trip.py
+++ b/erpnext/stock/doctype/delivery_trip/test_delivery_trip.py
@@ -3,60 +3,70 @@
 # See license.txt
 from __future__ import unicode_literals
 
-import frappe
-import erpnext
 import unittest
-from frappe.utils import nowdate, add_days
+
+import erpnext
+import frappe
+from erpnext.stock.doctype.delivery_trip.delivery_trip import get_contact_and_address, notify_customers
 from erpnext.tests.utils import create_test_contact_and_address
-from erpnext.stock.doctype.delivery_trip.delivery_trip import notify_customers, get_contact_and_address
+from frappe.utils import add_days, now_datetime
+
 
 class TestDeliveryTrip(unittest.TestCase):
 	def setUp(self):
 		create_driver()
 		create_vehicle()
-		create_delivery_notfication()
+		create_delivery_notification()
 		create_test_contact_and_address()
 
 	def test_delivery_trip(self):
 		contact = get_contact_and_address("_Test Customer")
 
 		if not frappe.db.exists("Delivery Trip", "TOUR-00000"):
-			delivery_trip = frappe.new_doc("Delivery Trip")
-			delivery_trip.company = erpnext.get_default_company()
-			delivery_trip.date = add_days(nowdate(), 5)
-			delivery_trip.driver = "DRIVER-00001"
-			delivery_trip.vehicle = "JB 007"
-			delivery_trip.append("delivery_stops", {
-				"customer": "_Test Customer",
-				"address": contact.shipping_address.parent,
-				"contact": contact.contact_person.parent
+			delivery_trip = frappe.get_doc({
+				"doctype": "Delivery Trip",
+				"company": erpnext.get_default_company(),
+				"departure_time": add_days(now_datetime(), 5),
+				"driver": "DRIVER-00001",
+				"vehicle": "JB 007",
+				"delivery_stops": [{
+					"customer": "_Test Customer",
+					"address": contact.shipping_address.parent,
+					"contact": contact.contact_person.parent
+				}]
 			})
-			delivery_trip.delivery_notification = 'Delivery Notification'
 			delivery_trip.insert()
-			sender_email = frappe.db.get_value("User", frappe.session.user, "email")
-			notify_customers(docname=delivery_trip.name, date=delivery_trip.date, driver=delivery_trip.driver,
-							 vehicle=delivery_trip.vehicle,
-							 sender_email=sender_email, delivery_notification=delivery_trip.delivery_notification)
 
-			self.assertEqual(delivery_trip.get("delivery_stops")[0].notified_by_email, 0)
+			notify_customers(delivery_trip=delivery_trip.name)
+			delivery_trip.load_from_db()
+			self.assertEqual(delivery_trip.email_notification_sent, 1)
+
 
 def create_driver():
 	if not frappe.db.exists("Driver", "Newton Scmander"):
-		driver = frappe.new_doc("Driver")
-		driver.full_name = "Newton Scmander"
-		driver.cell_number = "98343424242"
-		driver.license_number = "B809"
+		driver = frappe.get_doc({
+			"doctype": "Driver",
+			"full_name": "Newton Scmander",
+			"cell_number": "98343424242",
+			"license_number": "B809"
+		})
 		driver.insert()
 
-def create_delivery_notfication():
+
+def create_delivery_notification():
 	if not frappe.db.exists("Email Template", "Delivery Notification"):
-		frappe.get_doc({
+		dispatch_template = frappe.get_doc({
 			'doctype': 'Email Template',
 			'name': 'Delivery Notification',
 			'response': 'Test Delivery Trip',
 			'subject': 'Test Subject',
 			'owner': frappe.session.user
-		}).insert()
+		})
+		dispatch_template.insert()
+
+	delivery_settings = frappe.get_single("Delivery Settings")
+	delivery_settings.dispatch_template = 'Delivery Notification'
+
 
 def create_vehicle():
 	if not frappe.db.exists("Vehicle", "JB 007"):