fix: Add logic to set batch no [WIP]

- Add pick ticket reference item
diff --git a/erpnext/stock/doctype/pick_ticket/pick_ticket.json b/erpnext/stock/doctype/pick_ticket/pick_ticket.json
index 392786f..fe331ac 100644
--- a/erpnext/stock/doctype/pick_ticket/pick_ticket.json
+++ b/erpnext/stock/doctype/pick_ticket/pick_ticket.json
@@ -8,6 +8,8 @@
   "company",
   "column_break_4",
   "group_warehouse",
+  "section_break_4",
+  "reference_document_items",
   "section_break_6",
   "items"
  ],
@@ -15,8 +17,9 @@
   {
    "fieldname": "items",
    "fieldtype": "Table",
-   "label": "Items",
-   "options": "Pick Ticket Item"
+   "label": "Items Locations",
+   "options": "Pick Ticket Item",
+   "read_only": 1
   },
   {
    "description": "Items under this warehouse will be suggested",
@@ -38,9 +41,21 @@
   {
    "fieldname": "section_break_6",
    "fieldtype": "Section Break"
+  },
+  {
+   "collapsible": 1,
+   "fieldname": "section_break_4",
+   "fieldtype": "Section Break",
+   "label": "Reference Items"
+  },
+  {
+   "fieldname": "reference_document_items",
+   "fieldtype": "Table",
+   "label": "Reference Document Items",
+   "options": "Pick Ticket Reference Item"
   }
  ],
- "modified": "2019-07-24 14:59:44.542987",
+ "modified": "2019-07-24 16:13:51.668880",
  "modified_by": "Administrator",
  "module": "Stock",
  "name": "Pick Ticket",
diff --git a/erpnext/stock/doctype/pick_ticket/pick_ticket.py b/erpnext/stock/doctype/pick_ticket/pick_ticket.py
index 8982688..4c5fdb8 100644
--- a/erpnext/stock/doctype/pick_ticket/pick_ticket.py
+++ b/erpnext/stock/doctype/pick_ticket/pick_ticket.py
@@ -14,11 +14,8 @@
 	reference_doc = frappe.get_doc(reference_doctype, reference_name)
 	doc.company = reference_doc.company
 	items = reference_doc.get(items_field)
-
 	add_picklist_items(items, doc, reference_doc)
-
-	doc.insert()
-
+	doc.save()
 	return doc
 
 def get_available_items(item):
@@ -34,10 +31,12 @@
 def get_items_with_warehouse_and_quantity(item_doc, reference_doc):
 	items = []
 	item_locations = get_available_items(item_doc.item_code)
-	if not item_locations: return items
-
 	remaining_qty = item_doc.qty
 
+	if not item_locations:
+		print('{} qty of {} is out of stock. Skipping...'.format(remaining_qty, item_doc.item))
+		return items
+
 	while remaining_qty > 0 and item_locations:
 		item_location = item_locations.pop(0)
 		qty = remaining_qty if item_location.qty >= remaining_qty else item_location.qty
@@ -59,17 +58,30 @@
 		for item_info in data:
 			doc.append('items', item_info)
 
+	doc.insert()
+
 	for item in doc.get('items'):
 		if item.has_serial_no:
-			serial_nos = frappe.get_all('Serial No', {
-				'item_code': item.item,
-				'warehouse': item.warehouse
-			}, limit=item.qty, order_by='purchase_date')
-			item.serial_no = '\n'.join([serial_no.name for serial_no in serial_nos])
+			set_serial_nos(item)
+		elif item.has_batch_no:
+			set_batch_no(item, doc)
 
-		# if item.has_batch_no:
-		# 	serial_nos = frappe.get_all('Batch', {
-		# 		'item_code': item.item,
-		# 		'warehouse': item.warehouse
-		# 	}, limit=item.qty, order_by='purchase_date')
-		# 	item.serial_no = '\n'.join([serial_no.name for serial_no in serial_nos])
\ No newline at end of file
+def set_serial_nos(item):
+	serial_nos = frappe.get_all('Serial No', {
+		'item_code': item.item,
+		'warehouse': item.warehouse
+	}, limit=item.qty, order_by='purchase_date')
+	item.serial_no = '\n'.join([serial_no.name for serial_no in serial_nos])
+
+def set_batch_no(item, doc):
+	batches = frappe.get_all('Stock Ledger Entry',
+		fields=['batch_no', 'sum(actual_qty) as qty'],
+		filters={
+			'item_code': item.item,
+			'warehouse': item.warehouse
+		},
+		group_by='warehouse, batch_no, item_code')
+
+	if batches:
+		# TODO: check expiry and split item if batch is more than 1
+		item.batch_no = batches[0].batch_no
\ No newline at end of file
diff --git a/erpnext/stock/doctype/pick_ticket_item/pick_ticket_item.json b/erpnext/stock/doctype/pick_ticket_item/pick_ticket_item.json
index 33a4273..6db3284 100644
--- a/erpnext/stock/doctype/pick_ticket_item/pick_ticket_item.json
+++ b/erpnext/stock/doctype/pick_ticket_item/pick_ticket_item.json
@@ -33,7 +33,8 @@
    "fieldname": "qty",
    "fieldtype": "Float",
    "in_list_view": 1,
-   "label": "Qty"
+   "label": "Qty",
+   "read_only": 1
   },
   {
    "fieldname": "picked_qty",
@@ -46,7 +47,8 @@
    "fieldtype": "Link",
    "in_list_view": 1,
    "label": "Warehouse",
-   "options": "Warehouse"
+   "options": "Warehouse",
+   "read_only": 1
   },
   {
    "fetch_from": "item.item_name",
@@ -66,20 +68,22 @@
    "fieldname": "reference_document_item",
    "fieldtype": "Data",
    "hidden": 1,
-   "label": "Reference Document Item"
+   "label": "Reference Document Item",
+   "read_only": 1
   },
   {
    "depends_on": "has_serial_no",
    "fieldname": "serial_no",
    "fieldtype": "Small Text",
-   "label": "Serial No"
+   "label": "Serial No",
+   "read_only": 1
   },
   {
-   "depends_on": "has_batch_no",
    "fieldname": "batch_no",
    "fieldtype": "Link",
    "label": "Batch No",
-   "options": "Batch"
+   "options": "Batch",
+   "read_only": 1
   },
   {
    "default": "0",
@@ -106,13 +110,15 @@
    "fieldname": "reference_doctype",
    "fieldtype": "Select",
    "label": "Reference Document Type",
-   "options": "Sales Order\nWork Order"
+   "options": "Sales Order\nWork Order",
+   "read_only": 1
   },
   {
    "fieldname": "reference_name",
    "fieldtype": "Dynamic Link",
    "label": "Reference Document",
-   "options": "reference_doctype"
+   "options": "reference_doctype",
+   "read_only": 1
   },
   {
    "fieldname": "column_break_2",
@@ -124,7 +130,7 @@
   }
  ],
  "istable": 1,
- "modified": "2019-07-24 15:09:35.712289",
+ "modified": "2019-07-25 11:18:58.478250",
  "modified_by": "Administrator",
  "module": "Stock",
  "name": "Pick Ticket Item",
diff --git a/erpnext/stock/doctype/pick_ticket_reference_item/pick_ticket_reference_item.js b/erpnext/stock/doctype/pick_ticket_reference_item/pick_ticket_reference_item.js
new file mode 100644
index 0000000..a3f9096
--- /dev/null
+++ b/erpnext/stock/doctype/pick_ticket_reference_item/pick_ticket_reference_item.js
@@ -0,0 +1,8 @@
+// Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and contributors
+// For license information, please see license.txt
+
+frappe.ui.form.on('Pick Ticket Reference Item', {
+	// refresh: function(frm) {
+
+	// }
+});
diff --git a/erpnext/stock/doctype/pick_ticket_reference_item/pick_ticket_reference_item.json b/erpnext/stock/doctype/pick_ticket_reference_item/pick_ticket_reference_item.json
new file mode 100644
index 0000000..446e075
--- /dev/null
+++ b/erpnext/stock/doctype/pick_ticket_reference_item/pick_ticket_reference_item.json
@@ -0,0 +1,27 @@
+{
+ "creation": "2019-07-24 16:11:07.415562",
+ "doctype": "DocType",
+ "editable_grid": 1,
+ "engine": "InnoDB",
+ "field_order": [
+  "item"
+ ],
+ "fields": [
+  {
+   "fieldname": "item",
+   "fieldtype": "Link",
+   "in_list_view": 1,
+   "label": "Item",
+   "options": "Item"
+  }
+ ],
+ "istable": 1,
+ "modified": "2019-07-24 16:12:58.000378",
+ "modified_by": "Administrator",
+ "module": "Stock",
+ "name": "Pick Ticket Reference Item",
+ "owner": "Administrator",
+ "permissions": [],
+ "sort_field": "modified",
+ "sort_order": "DESC"
+}
\ No newline at end of file
diff --git a/erpnext/stock/doctype/pick_ticket_reference_item/pick_ticket_reference_item.py b/erpnext/stock/doctype/pick_ticket_reference_item/pick_ticket_reference_item.py
new file mode 100644
index 0000000..412be75
--- /dev/null
+++ b/erpnext/stock/doctype/pick_ticket_reference_item/pick_ticket_reference_item.py
@@ -0,0 +1,10 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2019, 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 PickTicketReferenceItem(Document):
+	pass