Cleanup and fixes on delivery trip
diff --git a/erpnext/hr/doctype/vehicle/test_vehicle.js b/erpnext/hr/doctype/vehicle/test_vehicle.js
new file mode 100644
index 0000000..4d40cce
--- /dev/null
+++ b/erpnext/hr/doctype/vehicle/test_vehicle.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: Vehicle", function (assert) {
+	let done = assert.async();
+
+	// number of asserts
+	assert.expect(1);
+
+	frappe.run_serially([
+		// insert a new Vehicle
+		() => frappe.tests.make('Vehicle', [
+			// values to be set
+			{key: 'value'}
+		]),
+		() => {
+			assert.equal(cur_frm.doc.key, 'value');
+		},
+		() => done()
+	]);
+
+});
diff --git a/erpnext/hr/doctype/vehicle/vehicle.json b/erpnext/hr/doctype/vehicle/vehicle.json
index 39735e6..6f395b3 100644
--- a/erpnext/hr/doctype/vehicle/vehicle.json
+++ b/erpnext/hr/doctype/vehicle/vehicle.json
@@ -1,5 +1,6 @@
 {
  "allow_copy": 0, 
+ "allow_guest_to_view": 0, 
  "allow_import": 0, 
  "allow_rename": 0, 
  "autoname": "field:license_plate", 
@@ -12,6 +13,7 @@
  "editable_grid": 1, 
  "fields": [
   {
+   "allow_bulk_edit": 0, 
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
@@ -21,7 +23,8 @@
    "hidden": 0, 
    "ignore_user_permissions": 0, 
    "ignore_xss_filter": 0, 
-   "in_filter": 1, 
+   "in_filter": 0, 
+   "in_global_search": 0, 
    "in_list_view": 0, 
    "in_standard_filter": 0, 
    "label": "License Plate", 
@@ -40,6 +43,7 @@
    "unique": 1
   }, 
   {
+   "allow_bulk_edit": 0, 
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
@@ -50,6 +54,7 @@
    "ignore_user_permissions": 0, 
    "ignore_xss_filter": 0, 
    "in_filter": 0, 
+   "in_global_search": 0, 
    "in_list_view": 0, 
    "in_standard_filter": 0, 
    "label": "Make", 
@@ -68,6 +73,7 @@
    "unique": 0
   }, 
   {
+   "allow_bulk_edit": 0, 
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
@@ -78,6 +84,7 @@
    "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, 
@@ -95,6 +102,7 @@
    "unique": 0
   }, 
   {
+   "allow_bulk_edit": 0, 
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
@@ -104,7 +112,8 @@
    "hidden": 0, 
    "ignore_user_permissions": 0, 
    "ignore_xss_filter": 0, 
-   "in_filter": 1, 
+   "in_filter": 0, 
+   "in_global_search": 0, 
    "in_list_view": 1, 
    "in_standard_filter": 1, 
    "label": "Model", 
@@ -123,6 +132,7 @@
    "unique": 0
   }, 
   {
+   "allow_bulk_edit": 0, 
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
@@ -133,6 +143,7 @@
    "ignore_user_permissions": 0, 
    "ignore_xss_filter": 0, 
    "in_filter": 0, 
+   "in_global_search": 0, 
    "in_list_view": 0, 
    "in_standard_filter": 0, 
    "label": "Details", 
@@ -151,6 +162,7 @@
    "unique": 0
   }, 
   {
+   "allow_bulk_edit": 0, 
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
@@ -160,7 +172,8 @@
    "hidden": 0, 
    "ignore_user_permissions": 0, 
    "ignore_xss_filter": 0, 
-   "in_filter": 1, 
+   "in_filter": 0, 
+   "in_global_search": 0, 
    "in_list_view": 1, 
    "in_standard_filter": 0, 
    "label": "Odometer Value (Last)", 
@@ -179,6 +192,7 @@
    "unique": 0
   }, 
   {
+   "allow_bulk_edit": 0, 
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
@@ -188,7 +202,8 @@
    "hidden": 0, 
    "ignore_user_permissions": 0, 
    "ignore_xss_filter": 0, 
-   "in_filter": 1, 
+   "in_filter": 0, 
+   "in_global_search": 0, 
    "in_list_view": 0, 
    "in_standard_filter": 0, 
    "label": "Acquisition Date", 
@@ -207,6 +222,7 @@
    "unique": 0
   }, 
   {
+   "allow_bulk_edit": 0, 
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
@@ -217,6 +233,7 @@
    "ignore_user_permissions": 0, 
    "ignore_xss_filter": 0, 
    "in_filter": 0, 
+   "in_global_search": 0, 
    "in_list_view": 0, 
    "in_standard_filter": 0, 
    "label": "Location", 
@@ -235,6 +252,7 @@
    "unique": 0
   }, 
   {
+   "allow_bulk_edit": 0, 
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
@@ -245,6 +263,7 @@
    "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, 
@@ -262,6 +281,7 @@
    "unique": 0
   }, 
   {
+   "allow_bulk_edit": 0, 
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
@@ -272,6 +292,7 @@
    "ignore_user_permissions": 0, 
    "ignore_xss_filter": 0, 
    "in_filter": 0, 
+   "in_global_search": 0, 
    "in_list_view": 0, 
    "in_standard_filter": 0, 
    "label": "Chassis No", 
@@ -290,6 +311,7 @@
    "unique": 0
   }, 
   {
+   "allow_bulk_edit": 0, 
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
@@ -300,6 +322,7 @@
    "ignore_user_permissions": 0, 
    "ignore_xss_filter": 0, 
    "in_filter": 0, 
+   "in_global_search": 0, 
    "in_list_view": 1, 
    "in_standard_filter": 0, 
    "label": "Vehicle Value", 
@@ -319,6 +342,7 @@
    "unique": 0
   }, 
   {
+   "allow_bulk_edit": 0, 
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
@@ -329,6 +353,7 @@
    "ignore_user_permissions": 0, 
    "ignore_xss_filter": 0, 
    "in_filter": 0, 
+   "in_global_search": 0, 
    "in_list_view": 0, 
    "in_standard_filter": 1, 
    "label": "Employee", 
@@ -348,6 +373,7 @@
    "unique": 0
   }, 
   {
+   "allow_bulk_edit": 0, 
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
@@ -358,6 +384,7 @@
    "ignore_user_permissions": 0, 
    "ignore_xss_filter": 0, 
    "in_filter": 0, 
+   "in_global_search": 0, 
    "in_list_view": 0, 
    "in_standard_filter": 0, 
    "label": "Insurance Details", 
@@ -376,6 +403,7 @@
    "unique": 0
   }, 
   {
+   "allow_bulk_edit": 0, 
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
@@ -385,7 +413,8 @@
    "hidden": 0, 
    "ignore_user_permissions": 0, 
    "ignore_xss_filter": 0, 
-   "in_filter": 1, 
+   "in_filter": 0, 
+   "in_global_search": 0, 
    "in_list_view": 0, 
    "in_standard_filter": 0, 
    "label": "Insurance Company", 
@@ -404,6 +433,7 @@
    "unique": 0
   }, 
   {
+   "allow_bulk_edit": 0, 
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
@@ -413,7 +443,8 @@
    "hidden": 0, 
    "ignore_user_permissions": 0, 
    "ignore_xss_filter": 0, 
-   "in_filter": 1, 
+   "in_filter": 0, 
+   "in_global_search": 0, 
    "in_list_view": 0, 
    "in_standard_filter": 0, 
    "label": "Policy No", 
@@ -432,6 +463,7 @@
    "unique": 0
   }, 
   {
+   "allow_bulk_edit": 0, 
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
@@ -442,6 +474,7 @@
    "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, 
@@ -459,6 +492,7 @@
    "unique": 0
   }, 
   {
+   "allow_bulk_edit": 0, 
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
@@ -469,6 +503,7 @@
    "ignore_user_permissions": 0, 
    "ignore_xss_filter": 0, 
    "in_filter": 0, 
+   "in_global_search": 0, 
    "in_list_view": 0, 
    "in_standard_filter": 0, 
    "label": "Start Date", 
@@ -487,6 +522,7 @@
    "unique": 0
   }, 
   {
+   "allow_bulk_edit": 0, 
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
@@ -497,6 +533,7 @@
    "ignore_user_permissions": 0, 
    "ignore_xss_filter": 0, 
    "in_filter": 0, 
+   "in_global_search": 0, 
    "in_list_view": 0, 
    "in_standard_filter": 0, 
    "label": "End Date", 
@@ -515,6 +552,7 @@
    "unique": 0
   }, 
   {
+   "allow_bulk_edit": 0, 
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
@@ -525,6 +563,7 @@
    "ignore_user_permissions": 0, 
    "ignore_xss_filter": 0, 
    "in_filter": 0, 
+   "in_global_search": 0, 
    "in_list_view": 0, 
    "in_standard_filter": 0, 
    "label": "Additional Details", 
@@ -543,6 +582,7 @@
    "unique": 0
   }, 
   {
+   "allow_bulk_edit": 0, 
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
@@ -553,6 +593,7 @@
    "ignore_user_permissions": 0, 
    "ignore_xss_filter": 0, 
    "in_filter": 0, 
+   "in_global_search": 0, 
    "in_list_view": 1, 
    "in_standard_filter": 1, 
    "label": "Fuel Type", 
@@ -572,17 +613,19 @@
    "unique": 0
   }, 
   {
+   "allow_bulk_edit": 0, 
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
    "columns": 0, 
-   "default": "Litre", 
+   "default": "", 
    "fieldname": "uom", 
    "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": "Fuel UOM", 
@@ -602,6 +645,7 @@
    "unique": 0
   }, 
   {
+   "allow_bulk_edit": 0, 
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
@@ -612,6 +656,7 @@
    "ignore_user_permissions": 0, 
    "ignore_xss_filter": 0, 
    "in_filter": 0, 
+   "in_global_search": 0, 
    "in_list_view": 0, 
    "in_standard_filter": 0, 
    "label": "Last Carbon Check", 
@@ -630,6 +675,7 @@
    "unique": 0
   }, 
   {
+   "allow_bulk_edit": 0, 
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
@@ -640,6 +686,7 @@
    "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, 
@@ -657,6 +704,7 @@
    "unique": 0
   }, 
   {
+   "allow_bulk_edit": 0, 
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
@@ -667,6 +715,7 @@
    "ignore_user_permissions": 0, 
    "ignore_xss_filter": 0, 
    "in_filter": 0, 
+   "in_global_search": 0, 
    "in_list_view": 0, 
    "in_standard_filter": 0, 
    "label": "Color", 
@@ -685,6 +734,7 @@
    "unique": 0
   }, 
   {
+   "allow_bulk_edit": 0, 
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
@@ -695,6 +745,7 @@
    "ignore_user_permissions": 0, 
    "ignore_xss_filter": 0, 
    "in_filter": 0, 
+   "in_global_search": 0, 
    "in_list_view": 0, 
    "in_standard_filter": 0, 
    "label": "Wheels", 
@@ -713,6 +764,7 @@
    "unique": 0
   }, 
   {
+   "allow_bulk_edit": 0, 
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
@@ -723,6 +775,7 @@
    "ignore_user_permissions": 0, 
    "ignore_xss_filter": 0, 
    "in_filter": 0, 
+   "in_global_search": 0, 
    "in_list_view": 0, 
    "in_standard_filter": 0, 
    "label": "Doors", 
@@ -741,6 +794,7 @@
    "unique": 0
   }, 
   {
+   "allow_bulk_edit": 0, 
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
@@ -751,6 +805,7 @@
    "ignore_user_permissions": 0, 
    "ignore_xss_filter": 0, 
    "in_filter": 0, 
+   "in_global_search": 0, 
    "in_list_view": 0, 
    "in_standard_filter": 0, 
    "label": "Amended From", 
@@ -769,17 +824,17 @@
    "unique": 0
   }
  ], 
+ "has_web_view": 0, 
  "hide_heading": 0, 
  "hide_toolbar": 0, 
  "idx": 0, 
  "image_view": 0, 
  "in_create": 0, 
- "in_dialog": 0, 
  "is_submittable": 0, 
  "issingle": 0, 
  "istable": 0, 
  "max_attachments": 0, 
- "modified": "2017-01-09 11:10:11.678834", 
+ "modified": "2017-11-29 14:48:30.813359", 
  "modified_by": "Administrator", 
  "module": "HR", 
  "name": "Vehicle", 
@@ -796,7 +851,6 @@
    "export": 1, 
    "if_owner": 0, 
    "import": 0, 
-   "is_custom": 0, 
    "permlevel": 0, 
    "print": 1, 
    "read": 1, 
@@ -812,6 +866,7 @@
  "read_only": 0, 
  "read_only_onload": 0, 
  "search_fields": "license_plate,location,model", 
+ "show_name_in_global_search": 0, 
  "sort_field": "modified", 
  "sort_order": "DESC", 
  "title_field": "", 
diff --git a/erpnext/stock/doctype/delivery_trip/delivery_trip.js b/erpnext/stock/doctype/delivery_trip/delivery_trip.js
index 5f85530..8477fa2 100644
--- a/erpnext/stock/doctype/delivery_trip/delivery_trip.js
+++ b/erpnext/stock/doctype/delivery_trip/delivery_trip.js
@@ -2,6 +2,34 @@
 // For license information, please see license.txt
 
 frappe.ui.form.on('Delivery Trip', {
+	setup: function(frm) {
+		frm.set_query("address", "delivery_stops", function(doc, cdt, cdn) {
+			var row = locals[cdt][cdn];
+			if (row.customer) {
+				return {
+					query: 'frappe.contacts.doctype.address.address.address_query',
+					filters: {
+						link_doctype: "Customer",
+						link_name: row.customer
+					}
+				};
+			}
+		})
+
+		frm.set_query("contact", "delivery_stops", function(doc, cdt, cdn) {
+			var row = locals[cdt][cdn];
+			if (row.customer) {
+				return {
+					query: 'frappe.contacts.doctype.contact.contact.contact_query',
+					filters: {
+						link_doctype: "Customer",
+						link_name: row.customer
+					}
+				};
+			}
+		})
+	},
+
 	refresh: function (frm) {
 		if (frm.doc.docstatus == 1 && frm.doc.delivery_stops.length > 0) {
 			frm.add_custom_button(__("Notify Customers via Email"), function () {
@@ -9,6 +37,7 @@
 			});
 		}
 	},
+
 	calculate_arrival_time: function (frm) {
 		frappe.call({
 			method: 'erpnext.stock.doctype.delivery_trip.delivery_trip.calculate_time_matrix',
@@ -19,13 +48,14 @@
 			},
 			callback: function (r) {
 				if (r.message.error) {
-					frappe.throw(__("Malformatted address for " + r.message.error.destination.address + ", please fix to continue."));
-					return;
+					frappe.throw(__("Malformatted address for {0}, please fix to continue.",
+						[r.message.error.destination.address]));
 				}
 				frm.reload_doc();
 			}
 		});
 	},
+
 	notify_customers: function (frm) {
 		var owner_email = frm.doc.owner == "Administrator"
 			? frappe.user_info("Administrator").email
@@ -60,74 +90,62 @@
 	}
 });
 
-cur_frm.fields_dict['delivery_stops'].grid.get_field("address").get_query = function (doc, cdt, cdn) {
-	var row = locals[cdt][cdn];
-	if (row.customer) {
-		return {
-			query: 'frappe.contacts.doctype.address.address.address_query',
-			filters: {
-				link_doctype: "Customer",
-				link_name: row.customer
-			}
-		};
-	}
-};
 
-cur_frm.fields_dict['delivery_stops'].grid.get_field("contact").get_query = function (doc, cdt, cdn) {
-	var row = locals[cdt][cdn];
-	if (row.customer) {
-		return {
-			query: 'frappe.contacts.doctype.contact.contact.contact_query',
-			filters: {
-				link_doctype: "Customer",
-				link_name: row.customer
-			}
-		};
-	}
-};
 
 frappe.ui.form.on('Delivery Stop', {
 	customer: function (frm, cdt, cdn) {
 		var row = locals[cdt][cdn];
-		frappe.call({
-			method: "erpnext.stock.doctype.delivery_trip.delivery_trip.get_contact_and_address",
-			args: {"name": row.customer},
-			callback: function (r) {
-				if (r.message) {
-					if (r.message["shipping_address"]) {
-						frappe.model.set_value(cdt, cdn, "address", r.message["shipping_address"].parent);
-					}
-					if (r.message["contact_person"]) {
-						frappe.model.set_value(cdt, cdn, "contact", r.message["contact_person"].parent);
+		if(row.customer) {
+			frappe.call({
+				method: "erpnext.stock.doctype.delivery_trip.delivery_trip.get_contact_and_address",
+				args: {"name": row.customer},
+				callback: function (r) {
+					if (r.message) {
+						if (r.message["shipping_address"]) {
+							frappe.model.set_value(cdt, cdn, "address", r.message["shipping_address"].parent);
+						}
+						if (r.message["contact_person"]) {
+							frappe.model.set_value(cdt, cdn, "contact", r.message["contact_person"].parent);
+						}
 					}
 				}
-			}
-		});
+			});
+		}
 	},
 	address: function (frm, cdt, cdn) {
 		var row = locals[cdt][cdn];
-		frappe.call({
-			method: "frappe.contacts.doctype.address.address.get_address_display",
-			args: {"address_dict": row.address},
-			callback: function (r) {
-				if (r.message) {
-					frappe.model.set_value(cdt, cdn, "customer_address", r.message);
+		if(row.address) {
+			frappe.call({
+				method: "frappe.contacts.doctype.address.address.get_address_display",
+				args: {"address_dict": row.address},
+				callback: function (r) {
+					if (r.message) {
+						frappe.model.set_value(cdt, cdn, "customer_address", r.message);
+					}
 				}
-			}
-		});
+			});
+		} else {
+			frappe.model.set_value(cdt, cdn, "customer_address", "");
+		}
 	},
+
 	contact: function (frm, cdt, cdn) {
 		var row = locals[cdt][cdn];
-		frappe.call({
-			method: "erpnext.stock.doctype.delivery_trip.delivery_trip.get_contact_display",
-			args: {"contact": row.contact},
-			callback: function (r) {
-				if (r.message) {
-					frappe.model.set_value(cdt, cdn, "customer_contact", r.message);
+		if(row.contact) {
+			frappe.call({
+				method: "erpnext.stock.doctype.delivery_trip.delivery_trip.get_contact_display",
+				args: {"contact": row.contact},
+				callback: function (r) {
+					if (r.message) {
+						frappe.model.set_value(cdt, cdn, "customer_contact", r.message);
+					}
 				}
-			}
-		});
+			});
+		} else {
+			frappe.model.set_value(cdt, cdn, "customer_contact", "");
+		}
 	},
+
 	select_delivery_notes: function (frm, cdt, cdn) {
 		var row = locals[cdt][cdn];
 		frappe.call({
@@ -166,7 +184,8 @@
 					var delivery_notes_el = d.fields_dict.delivery_notes_html.$wrapper.html(html);
 
 					d.set_primary_action(__("Select"), function () {
-						var delivery_notes = delivery_notes_el.find('input[type=checkbox]:checked').map((i, el) => $(el).attr('data-delivery-note')).toArray();
+						var delivery_notes = delivery_notes_el.find('input[type=checkbox]:checked')
+							.map((i, el) => $(el).attr('data-delivery-note')).toArray();
 						if (!delivery_notes) return;
 						frappe.model.set_value(cdt, cdn, "delivery_notes", delivery_notes.join(","));
 						d.hide();
diff --git a/erpnext/stock/doctype/delivery_trip/delivery_trip.py b/erpnext/stock/doctype/delivery_trip/delivery_trip.py
index 6923c5f..d9c7b59 100644
--- a/erpnext/stock/doctype/delivery_trip/delivery_trip.py
+++ b/erpnext/stock/doctype/delivery_trip/delivery_trip.py
@@ -11,7 +11,7 @@
 from frappe.utils.user import get_user_fullname
 from frappe.utils import getdate
 from frappe.integrations.doctype.google_maps.google_maps import round_timedelta
-from frappe.integrations.doctype.google_maps.google_maps import customer_address_format
+from frappe.integrations.doctype.google_maps.google_maps import format_address
 
 class DeliveryTrip(Document):
 	pass
@@ -42,13 +42,13 @@
 def get_default_address(out, name):
 	shipping_addresses = frappe.db.sql(
 		"""
-			select
-				parent, (select is_shipping_address from tabAddress a where a.name=dl.parent) as is_shipping_address
+			select parent,
+				(select is_shipping_address from tabAddress a where a.name=dl.parent) as is_shipping_address
 			from `tabDynamic Link` dl
-			where link_doctype="Customer" and link_name=%s
+			where link_doctype="Customer"
+				and link_name=%s
 				and parenttype = 'Address'
-		"""
-		, (name), as_dict=1)
+		""", (name), as_dict=1)
 
 	if shipping_addresses:
 		for out.shipping_address in shipping_addresses:
@@ -76,28 +76,35 @@
 	as_dict=1)
 	contact_info.html = """ <b>%(first_name)s %(last_name)s</b> <br> %(phone)s <br> %(mobile_no)s""" % {
 		"first_name": contact_info.first_name,
-		"last_name": contact_info.last_name,
-		"phone": contact_info.phone if contact_info.phone else "",
-		"mobile_no": contact_info.mobile_no if contact_info.mobile_no else "",
+		"last_name": contact_info.last_name or "",
+		"phone": contact_info.phone or "",
+		"mobile_no": contact_info.mobile_no or "",
 	}
 	return contact_info.html
 
 
 @frappe.whitelist()
 def get_delivery_notes(customer):
-	return frappe.db.get_all(
-			"Delivery Note",
-		  	filters={'customer': customer,
-					 'docstatus': 1,
-					 'status': ('!=', 'Completed')})
+	return frappe.db.get_all("Delivery Note", filters={
+		'customer': customer,
+		'docstatus': 1,
+		'status': ('!=', 'Completed')
+	})
 
 @frappe.whitelist()
 def calculate_time_matrix(name):
 	"""Calucation and round in closest 15 minutes, delivery stops"""
 
-	gmaps_client = frappe.db.get_single_value('Google Maps', 'client_key')
-	gmaps = googlemaps.Client(key=gmaps_client)
-	home = frappe.db.get_single_value('Google Maps', 'home_address')
+	gmaps = frappe.db.get_value('Google Maps', None,
+		['client_key', 'enabled', 'home_address'], as_dict=1)
+
+	if not gmaps.enabled:
+		frappe.throw(_("Google Maps integration is not enabled"))
+
+	try:
+		gmaps_client = googlemaps.Client(key=gmaps.client_key)
+	except Exception as e:
+		frappe.throw(e.message)
 
 	secs_15min = 900
 	doc = frappe.get_doc('Delivery Trip', name)
@@ -105,38 +112,40 @@
 	matrix_duration = []
 
 	for i, stop in enumerate(doc.delivery_stop):
-
 		if i == 0:
 			# The first row is the starting pointing
-			origin = home
-			destination = customer_address_format(doc.delivery_stop[i].address)
-			distance_calc = gmaps.distance_matrix(origin, destination)
+			origin = gmaps.home_address
+			destination = format_address(doc.delivery_stop[i].address)
+			distance_calc = gmaps_client.distance_matrix(origin, destination)
 			matrix_duration.append(distance_calc)
+
 			try:
 				distance_secs = distance_calc['rows'][0]['elements'][0]['duration']['value']
 			except Exception as e:
 				frappe.throw(_("Error '{0}' occured. Arguments {1}.").format(e.message, e.args))
-			stop.estimated_arrival = round_timedelta(departure_time + datetime.timedelta(0, distance_secs + secs_15min),
-													 datetime.timedelta(minutes=15))
-			stop.save()
-			frappe.db.commit()
+
+			stop.estimated_arrival = round_timedelta(
+				departure_time + datetime.timedelta(0, distance_secs + secs_15min),
+				datetime.timedelta(minutes=15))
 		else:
 			# Calculation based on previous
-			origin = customer_address_format(doc.delivery_stop[i - 1].address)
-			destination = customer_address_format(doc.delivery_stop[i].address)
-			distance_calc = gmaps.distance_matrix(origin, destination)
+			origin = format_address(doc.delivery_stop[i - 1].address)
+			destination = format_address(doc.delivery_stop[i].address)
+			distance_calc = gmaps_client.distance_matrix(origin, destination)
 			matrix_duration.append(distance_calc)
+
 			try:
 				distance_secs = distance_calc['rows'][0]['elements'][0]['duration']['value']
 			except Exception as e:
 				frappe.throw(_("Error '{0}' occured. Arguments {1}.").format(e.message, e.args))
-			stop.estimated_arrival = round_timedelta(
-				doc.delivery_stop[i - 1].estimated_arrival + datetime.timedelta(0, distance_secs + secs_15min),
-				datetime.timedelta(minutes=15))
-			stop.save()
-			frappe.db.commit()
-	return matrix_duration
 
+			stop.estimated_arrival = round_timedelta(
+				doc.delivery_stop[i - 1].estimated_arrival +
+				datetime.timedelta(0, distance_secs + secs_15min), datetime.timedelta(minutes=15))
+		stop.save()
+		frappe.db.commit()
+
+	return matrix_duration
 
 @frappe.whitelist()
 def notify_customers(docname, date, driver, vehicle, sender_email, delivery_notification):
@@ -146,15 +155,12 @@
 
 	for delivery_stop in delivery_stops:
 		delivery_stop_info = frappe.db.get_value(
-				"Delivery Stop",
-				delivery_stop.name,
-				["notified_by_email", "estimated_arrival",
-				 "details", "contact", "delivery_notes"],
+			"Delivery Stop",
+			delivery_stop.name,
+			["notified_by_email", "estimated_arrival", "details", "contact", "delivery_notes"],
 		as_dict=1)
-		contact_info = frappe.db.get_value(
-				"Contact", delivery_stop_info.contact,
-				["first_name", "last_name", "email_id", "gender"],
-		as_dict=1)
+		contact_info = frappe.db.get_value("Contact", delivery_stop_info.contact,
+			["first_name", "last_name", "email_id", "gender"], as_dict=1)
 
 		if delivery_stop_info.delivery_notes:
 			delivery_notes = (delivery_stop_info.delivery_notes).split(",")
@@ -162,31 +168,24 @@
 			for delivery_note in delivery_notes:
 				attachments.append(
 					frappe.attach_print('Delivery Note',
-					 					 delivery_note,
-										 file_name="Delivery Note",
-										 print_format='Delivery Note'))
+	 					 delivery_note,
+						 file_name="Delivery Note",
+						 print_format='Delivery Note'))
 
 		if not delivery_stop_info.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"])
+			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"])
 
 			estimated_arrival = str(delivery_stop_info.estimated_arrival)[:-3]
-			email_template = frappe.get_doc("Standard Reply",
-											delivery_notification)
+			email_template = frappe.get_doc("Standard Reply", delivery_notification)
 			message = frappe.render_template(
-						 email_template.response,
-						 dict(contact_info=contact_info, sender_name=sender_name,
-							  details=delivery_stop_info.details,
-							  estimated_arrival=estimated_arrival,
-							  date=getdate(date).strftime('%d.%m.%y'), vehicle=vehicle,
-							  driver_info=driver_info,
-							  sender_designation=sender_designation)
+				email_template.response,
+				dict(contact_info=contact_info, sender_name=sender_name,
+					details=delivery_stop_info.details,
+					estimated_arrival=estimated_arrival,
+					date=getdate(date).strftime('%d.%m.%y'), vehicle=vehicle,
+					driver_info=driver_info,
+					sender_designation=sender_designation)
 			)
 			frappe.sendmail(
 				recipients=contact_info.email_id,
@@ -194,13 +193,9 @@
 				message=message,
 				attachments=attachments,
 				subject=_(email_template.subject).format(getdate(date).strftime('%d.%m.%y'),
-						  estimated_arrival))
+					estimated_arrival))
 
-			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.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))
\ No newline at end of file