[Fix] UX for delivery trip (#13046)

* [Fix] UX for delivery trip

* Fixed test cases
diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.js b/erpnext/stock/doctype/delivery_note/delivery_note.js
index e0ee370..e6029aa 100644
--- a/erpnext/stock/doctype/delivery_note/delivery_note.js
+++ b/erpnext/stock/doctype/delivery_note/delivery_note.js
@@ -103,6 +103,11 @@
 					me.make_sales_return() }, __("Make"));
 			}
 
+			if (doc.docstatus==1) {
+				this.frm.add_custom_button(__('Delivery Trip'), function() {
+					me.make_delivery_trip() }, __("Make"));
+			}
+
 			if(doc.docstatus==0 && !doc.__islocal) {
 				this.frm.add_custom_button(__('Packing Slip'), function() {
 					frappe.model.open_mapped_doc({
@@ -195,6 +200,13 @@
 		})
 	},
 
+	make_delivery_trip: function() {
+		frappe.model.open_mapped_doc({
+			method: "erpnext.stock.doctype.delivery_note.delivery_note.make_delivery_trip",
+			frm: this.frm
+		})
+	},
+
 	tc_name: function() {
 		this.get_terms();
 	},
diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.py b/erpnext/stock/doctype/delivery_note/delivery_note.py
index 65f384f..e7618c2 100644
--- a/erpnext/stock/doctype/delivery_note/delivery_note.py
+++ b/erpnext/stock/doctype/delivery_note/delivery_note.py
@@ -440,6 +440,33 @@
 	return doc
 
 @frappe.whitelist()
+def make_delivery_trip(source_name, target_doc=None):
+	def update_stop_details(source_doc, target_doc, source_parent):
+		target_doc.customer = source_parent.customer
+		target_doc.address = source_parent.shipping_address_name
+		target_doc.customer_address = source_parent.shipping_address
+		target_doc.contact = source_parent.contact_person
+		target_doc.customer_contact = source_parent.contact_display
+
+	doclist = get_mapped_doc("Delivery Note", source_name, {
+		"Delivery Note": {
+			"doctype": "Delivery Trip",
+			"validation": {
+				"docstatus": ["=", 1]
+			}
+		},
+		"Delivery Note Item": {
+			"doctype": "Delivery Stop",
+			"field_map": {
+				"parent": "delivery_note"
+			},
+			"postprocess": update_stop_details,
+		}
+	}, target_doc)
+
+	return doclist
+
+@frappe.whitelist()
 def make_installation_note(source_name, target_doc=None):
 	def update_item(obj, target, source_parent):
 		target.qty = flt(obj.qty) - flt(obj.installed_qty)
diff --git a/erpnext/stock/doctype/delivery_note/test_delivery_note.py b/erpnext/stock/doctype/delivery_note/test_delivery_note.py
index c3dbb8d..7433b71 100644
--- a/erpnext/stock/doctype/delivery_note/test_delivery_note.py
+++ b/erpnext/stock/doctype/delivery_note/test_delivery_note.py
@@ -12,7 +12,7 @@
 from erpnext.accounts.utils import get_balance_on
 from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt \
 	import get_gl_entries, set_perpetual_inventory
-from erpnext.stock.doctype.delivery_note.delivery_note import make_sales_invoice
+from erpnext.stock.doctype.delivery_note.delivery_note import make_sales_invoice, make_delivery_trip
 from erpnext.stock.doctype.stock_entry.test_stock_entry \
 	import make_stock_entry, make_serialized_item, get_qty_after_transaction
 from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos, SerialNoWarehouseError
@@ -564,6 +564,11 @@
 		self.assertEqual(dn.per_billed, 100)
 		self.assertEqual(dn.status, "Completed")
 
+	def test_delivery_trip(self):
+		dn = create_delivery_note()
+		dt = make_delivery_trip(dn.name)
+		self.assertEqual(dn.name, dt.delivery_stops[0].delivery_note)
+
 def create_delivery_note(**args):
 	dn = frappe.new_doc("Delivery Note")
 	args = frappe._dict(args)
diff --git a/erpnext/stock/doctype/delivery_stop/delivery_stop.json b/erpnext/stock/doctype/delivery_stop/delivery_stop.json
index 311f70e..cd71f21 100644
--- a/erpnext/stock/doctype/delivery_stop/delivery_stop.json
+++ b/erpnext/stock/doctype/delivery_stop/delivery_stop.json
@@ -41,6 +41,7 @@
    "reqd": 0, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 0
   }, 
   {
@@ -72,6 +73,7 @@
    "reqd": 1, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 0
   }, 
   {
@@ -101,6 +103,7 @@
    "reqd": 0, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 0
   }, 
   {
@@ -131,6 +134,7 @@
    "reqd": 0, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 0
   }, 
   {
@@ -160,6 +164,7 @@
    "reqd": 0, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 0
   }, 
   {
@@ -191,6 +196,7 @@
    "reqd": 0, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 0
   }, 
   {
@@ -220,6 +226,7 @@
    "reqd": 0, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 0
   }, 
   {
@@ -250,6 +257,7 @@
    "reqd": 0, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 0
   }, 
   {
@@ -279,6 +287,7 @@
    "reqd": 0, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 0
   }, 
   {
@@ -309,6 +318,7 @@
    "reqd": 0, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 0
   }, 
   {
@@ -339,6 +349,7 @@
    "reqd": 0, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 0
   }, 
   {
@@ -368,6 +379,7 @@
    "reqd": 0, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 0
   }, 
   {
@@ -376,8 +388,8 @@
    "bold": 0, 
    "collapsible": 0, 
    "columns": 0, 
-   "fieldname": "select_delivery_notes", 
-   "fieldtype": "Button", 
+   "fieldname": "delivery_note", 
+   "fieldtype": "Link", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
    "ignore_xss_filter": 0, 
@@ -385,71 +397,13 @@
    "in_global_search": 0, 
    "in_list_view": 0, 
    "in_standard_filter": 0, 
-   "label": "Select/Unselect Delivery Notes", 
+   "label": "Delivery Note", 
    "length": 0, 
-   "no_copy": 0, 
+   "no_copy": 1, 
+   "options": "Delivery Note", 
    "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, 
-   "unique": 0
-  }, 
-  {
-   "allow_bulk_edit": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "column_break_14", 
-   "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, 
-   "unique": 0
-  }, 
-  {
-   "allow_bulk_edit": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "delivery_notes", 
-   "fieldtype": "Text", 
-   "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 Notes", 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
+   "print_hide": 1, 
    "print_hide_if_no_value": 0, 
    "read_only": 1, 
    "remember_last_selected_value": 0, 
@@ -457,6 +411,7 @@
    "reqd": 0, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 0
   }, 
   {
@@ -486,6 +441,7 @@
    "reqd": 0, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 0
   }, 
   {
@@ -516,6 +472,7 @@
    "reqd": 0, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 0
   }, 
   {
@@ -545,6 +502,7 @@
    "reqd": 0, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 0
   }, 
   {
@@ -575,6 +533,7 @@
    "reqd": 0, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 0
   }
  ], 
@@ -588,7 +547,7 @@
  "issingle": 0, 
  "istable": 1, 
  "max_attachments": 0, 
- "modified": "2017-11-13 04:09:56.257540", 
+ "modified": "2018-02-22 16:43:55.257470", 
  "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 4091463..f7ec7e3 100644
--- a/erpnext/stock/doctype/delivery_trip/delivery_trip.js
+++ b/erpnext/stock/doctype/delivery_trip/delivery_trip.js
@@ -36,6 +36,24 @@
 				frm.trigger('notify_customers');
 			});
 		}
+
+		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",
+					source_doctype: "Delivery Note",
+					target: frm,
+					date_field: "posting_date",
+					setters: {
+						company: frm.doc.company,
+					},
+					get_query_filters: {
+						docstatus: 1,
+						company: frm.doc.company,
+					}
+				})
+			}, __("Get customers from"));
+		}
 	},
 
 	calculate_arrival_time: function (frm) {
@@ -154,58 +172,5 @@
 		} else {
 			frappe.model.set_value(cdt, cdn, "customer_contact", "");
 		}
-	},
-
-	select_delivery_notes: function (frm, cdt, cdn) {
-		var row = locals[cdt][cdn];
-		frappe.call({
-			method: "erpnext.stock.doctype.delivery_trip.delivery_trip.get_delivery_notes",
-			args: {"customer": row.customer},
-			callback: function (r) {
-				var delivery_notes = [];
-				$.each(r.message, function (field, value) {
-					delivery_notes.push(value.name);
-				});
-				if (r.message) {
-					var d = new frappe.ui.Dialog({
-						title: __("Select Delivery Notes"),
-						fields: [{fieldtype: "HTML", fieldname: "delivery_notes_html"}]
-					});
-					var html = $(`
-						<div style="border: 1px solid #d1d8dd">
-							<div class="list-item list-item--head">
-								<div class="list-item__content list-item__content--flex-2">
-									${__('Delivery Notes')}
-								</div>
-							</div>
-							${delivery_notes.map(delivery_note => `
-								<div class="list-item">
-									<div class="list-item__content list-item__content--flex-2">
-										<label>
-										<input type="checkbox" data-delivery-note="${delivery_note}" checked="checked"/>
-										${delivery_note}
-										</label>
-									</div>
-								</div>
-							`).join("")}
-						</div>
-					`);
-
-					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();
-						if (!delivery_notes) return;
-						frappe.model.set_value(cdt, cdn, "delivery_notes", delivery_notes.join(","));
-						d.hide();
-					});
-					d.show();
-				}
-				else {
-					frappe.msgprint(__("No submitted Delivery Notes found"));
-				}
-			}
-		});
 	}
 });
\ No newline at end of file
diff --git a/erpnext/stock/doctype/delivery_trip/delivery_trip.json b/erpnext/stock/doctype/delivery_trip/delivery_trip.json
index 98aaa1c..d6872da 100644
--- a/erpnext/stock/doctype/delivery_trip/delivery_trip.json
+++ b/erpnext/stock/doctype/delivery_trip/delivery_trip.json
@@ -42,6 +42,7 @@
    "reqd": 0, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 0
   }, 
   {
@@ -73,6 +74,7 @@
    "reqd": 1, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 0
   }, 
   {
@@ -102,6 +104,7 @@
    "reqd": 0, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 0
   }, 
   {
@@ -132,6 +135,7 @@
    "reqd": 0, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 0
   }, 
   {
@@ -161,6 +165,7 @@
    "reqd": 0, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 0
   }, 
   {
@@ -191,6 +196,7 @@
    "reqd": 1, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 0
   }, 
   {
@@ -221,6 +227,7 @@
    "reqd": 1, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 0
   }, 
   {
@@ -250,6 +257,7 @@
    "reqd": 0, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 0
   }, 
   {
@@ -281,6 +289,7 @@
    "reqd": 1, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 0
   }, 
   {
@@ -312,6 +321,7 @@
    "reqd": 0, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 0
   }, 
   {
@@ -343,6 +353,7 @@
    "reqd": 1, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 0
   }, 
   {
@@ -373,6 +384,7 @@
    "reqd": 0, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 0
   }, 
   {
@@ -404,6 +416,7 @@
    "reqd": 0, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 0
   }, 
   {
@@ -435,6 +448,7 @@
    "reqd": 0, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 0
   }, 
   {
@@ -464,6 +478,7 @@
    "reqd": 0, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 0
   }, 
   {
@@ -472,7 +487,7 @@
    "bold": 0, 
    "collapsible": 0, 
    "columns": 0, 
-   "default": "Delivery Notification", 
+   "default": "", 
    "fieldname": "delivery_notification", 
    "fieldtype": "Link", 
    "hidden": 0, 
@@ -496,6 +511,7 @@
    "reqd": 1, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 0
   }, 
   {
@@ -526,6 +542,7 @@
    "reqd": 0, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 0
   }
  ], 
@@ -539,8 +556,8 @@
  "issingle": 0, 
  "istable": 0, 
  "max_attachments": 0, 
- "modified": "2017-12-19 12:00:49.226226", 
- "modified_by": "nabinhait@gmail.com", 
+ "modified": "2018-02-22 17:36:05.521302", 
+ "modified_by": "Administrator", 
  "module": "Stock", 
  "name": "Delivery Trip", 
  "name_case": "", 
diff --git a/erpnext/stock/doctype/delivery_trip/delivery_trip.py b/erpnext/stock/doctype/delivery_trip/delivery_trip.py
index 45de5e7..471e1a3 100644
--- a/erpnext/stock/doctype/delivery_trip/delivery_trip.py
+++ b/erpnext/stock/doctype/delivery_trip/delivery_trip.py
@@ -82,14 +82,6 @@
 	}
 	return contact_info.html
 
-
-@frappe.whitelist()
-def get_delivery_notes(customer):
-	return frappe.db.get_all("Delivery Note", filters={
-		'customer': customer,
-		'docstatus': 1
-	})
-
 @frappe.whitelist()
 def calculate_time_matrix(name):
 	"""Calucation and round in closest 15 minutes, delivery stops"""
@@ -156,21 +148,17 @@
 		delivery_stop_info = frappe.db.get_value(
 			"Delivery Stop",
 			delivery_stop.name,
-			["notified_by_email", "estimated_arrival", "details", "contact", "delivery_notes"],
+			["notified_by_email", "estimated_arrival", "details", "contact", "delivery_note"],
 		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(",")
+		if delivery_stop_info.delivery_note:
 			default_print_format = frappe.get_meta('Delivery Note').default_print_format
-			attachments = []
-			for delivery_note in delivery_notes:
-				attachments.append(
-					frappe.attach_print('Delivery Note',
-	 					 delivery_note,
-						 file_name="Delivery Note",
-						 print_format=default_print_format or "Standard"))
+			attachments = frappe.attach_print('Delivery Note',
+				delivery_stop_info.delivery_note,
+				file_name="Delivery Note",
+				print_format=default_print_format or "Standard")
 
 		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)