fix: Show create button only if target doc does not exists
diff --git a/erpnext/stock/doctype/pick_list/pick_list.js b/erpnext/stock/doctype/pick_list/pick_list.js
index 75d0511..a0082b8 100644
--- a/erpnext/stock/doctype/pick_list/pick_list.js
+++ b/erpnext/stock/doctype/pick_list/pick_list.js
@@ -32,23 +32,18 @@
 	},
 	refresh: (frm) => {
 		frm.trigger('add_get_items_button');
-
-		// if (frm.doc.items && (frm.doc.items.length > 1 || frm.doc.items[0].item_code) && frm.doc.docstatus === 0) {
-		// 	frm.add_custom_button(__('Get Item Locations'), () => {
-		//  	frm.call('set_item_locations');
-		// 	}).addClass('btn-primary');
-		// }
 		if (frm.doc.docstatus === 1) {
-			if (frm.doc.purpose === 'Delivery against Sales Order') {
-				frm.add_custom_button(__('Delivery Note'), () => frm.trigger('create_delivery_note'), __('Create'));
-			} else {
-				frappe.xcall('erpnext.stock.doctype.pick_list.pick_list.stock_entry_exists', {
-					'pick_list_name': frm.doc.name
-				}).then(exists => {
-					if (exists) return;
+			frappe.xcall('erpnext.stock.doctype.pick_list.pick_list.target_document_exists', {
+				'pick_list_name': frm.doc.name,
+				'purpose': frm.doc.purpose
+			}).then(target_document_exists => {
+				if (target_document_exists) return;
+				if (frm.doc.purpose === 'Delivery against Sales Order') {
+					frm.add_custom_button(__('Delivery Note'), () => frm.trigger('create_delivery_note'), __('Create'));
+				} else {
 					frm.add_custom_button(__('Stock Entry'), () => frm.trigger('create_stock_entry'), __('Create'));
-				});
-			}
+				}
+			});
 		}
 	},
 	work_order: (frm) => {
diff --git a/erpnext/stock/doctype/pick_list/pick_list.py b/erpnext/stock/doctype/pick_list/pick_list.py
index a8955de..16bb9e6 100644
--- a/erpnext/stock/doctype/pick_list/pick_list.py
+++ b/erpnext/stock/doctype/pick_list/pick_list.py
@@ -170,6 +170,7 @@
 
 	return locations
 
+
 @frappe.whitelist()
 def create_delivery_note(source_name, target_doc=None):
 	pick_list = frappe.get_doc('Pick List', source_name)
@@ -181,18 +182,18 @@
 		delivery_note = create_delivery_note_from_sales_order(sales_order,
 			delivery_note, skip_item_mapping=True)
 
+	item_table_mapper = {
+		'doctype': 'Delivery Note Item',
+		'field_map': {
+			'rate': 'rate',
+			'name': 'so_detail',
+			'parent': 'against_sales_order',
+		},
+		'condition': lambda doc: abs(doc.delivered_qty) < abs(doc.qty) and doc.delivered_by_supplier!=1
+	}
+
 	for location in pick_list.locations:
 		sales_order_item = frappe.get_cached_doc('Sales Order Item', location.sales_order_item)
-		item_table_mapper = {
-			'doctype': 'Delivery Note Item',
-			'field_map': {
-				'rate': 'rate',
-				'name': 'so_detail',
-				'parent': 'against_sales_order',
-			},
-			'condition': lambda doc: abs(doc.delivered_qty) < abs(doc.qty) and doc.delivered_by_supplier!=1
-		}
-
 		dn_item = map_child_doc(sales_order_item, delivery_note, item_table_mapper)
 
 		if dn_item:
@@ -203,79 +204,26 @@
 
 	set_delivery_note_missing_values(delivery_note)
 
+	delivery_note.pick_list = pick_list.name
+
 	return delivery_note
 
-
-def update_delivery_note_item(source, target, delivery_note):
-	cost_center = frappe.db.get_value("Project", delivery_note.project, "cost_center")
-	if not cost_center:
-		cost_center = frappe.db.get_value('Item Default',
-			fieldname=['buying_cost_center'],
-			filters={
-				'parent': source.item_code,
-				'parenttype': 'Item',
-				'company': delivery_note.company
-			})
-
-	if not cost_center:
-		cost_center = frappe.db.get_value('Item Default',
-			fieldname=['buying_cost_center'],
-			filters={
-				'parent': source.item_group,
-				'parenttype': 'Item Group',
-				'company': delivery_note.company
-			})
-
-	target.cost_center = cost_center
-
-def set_delivery_note_missing_values(target):
-	target.run_method('set_missing_values')
-	target.run_method('set_po_nos')
-	target.run_method('calculate_taxes_and_totals')
-
 @frappe.whitelist()
 def create_stock_entry(pick_list):
 	pick_list = frappe.get_doc(json.loads(pick_list))
-	if stock_entry_exists(pick_list.get('name')):
-		return frappe.msgprint(_('Stock Entry already exists against this Pick List'))
 
-	work_order = frappe.get_doc("Work Order", pick_list.get('work_order'))
+	if stock_entry_exists(pick_list.get('name')):
+		return frappe.msgprint(_('Stock Entry has been already created against this Pick List'))
 
 	stock_entry = frappe.new_doc('Stock Entry')
 	stock_entry.pick_list = pick_list.get('name')
 	stock_entry.purpose = pick_list.get('purpose')
 	stock_entry.set_stock_entry_type()
-	stock_entry.work_order = work_order.name
-	stock_entry.company = work_order.company
-	stock_entry.from_bom = 1
-	stock_entry.bom_no = work_order.bom_no
-	stock_entry.use_multi_level_bom = work_order.use_multi_level_bom
-	stock_entry.fg_completed_qty = pick_list.for_qty
-	if work_order.bom_no:
-		stock_entry.inspection_required = frappe.db.get_value('BOM',
-			work_order.bom_no, 'inspection_required')
 
-	is_wip_warehouse_group = frappe.db.get_value('Warehouse', work_order.wip_warehouse, 'is_group')
-	if not (is_wip_warehouse_group and work_order.skip_transfer):
-		wip_warehouse = work_order.wip_warehouse
-	else:
-		wip_warehouse = None
-	stock_entry.to_warehouse = wip_warehouse
-
-	stock_entry.project = work_order.project
-
-	for location in pick_list.locations:
-		item = frappe._dict()
-		item.item_code = location.item_code
-		item.s_warehouse = location.warehouse
-		item.t_warehouse = wip_warehouse
-		item.qty = location.qty
-		item.transfer_qty = location.stock_qty
-		item.uom = location.uom
-		item.conversion_factor = location.conversion_factor
-		item.stock_uom = location.stock_uom
-
-		stock_entry.append('items', item)
+	if pick_list.get('work_order'):
+		stock_entry = update_stock_entry_based_on_work_order(pick_list, stock_entry)
+	elif pick_list.get('material_request'):
+		stock_entry = update_stock_entry_based_on_material_request(pick_list, stock_entry)
 
 	stock_entry.set_incoming_rate()
 	stock_entry.set_actual_qty()
@@ -283,7 +231,6 @@
 
 	return stock_entry.as_dict()
 
-
 @frappe.whitelist()
 def create_stock_entry_with_material_request_items(pick_list):
 	stock_entry = frappe.new_doc('Stock Entry')
@@ -330,11 +277,99 @@
 			'company': filters.get('company')
 		}, as_dict=as_dict)
 
-def get_item_details(item_code):
-	pass
-
 @frappe.whitelist()
+def target_document_exists(pick_list_name, purpose):
+	if purpose == 'Delivery against Sales Order':
+		return frappe.db.exists('Delivery Note', {
+			'pick_list': pick_list_name
+		})
+
+	return stock_entry_exists(pick_list_name)
+
+
+def update_delivery_note_item(source, target, delivery_note):
+	cost_center = frappe.db.get_value('Project', delivery_note.project, 'cost_center')
+	if not cost_center:
+		cost_center = get_cost_center(source.item_code, 'Item', delivery_note.company)
+
+	if not cost_center:
+		cost_center = get_cost_center(source.item_group, 'Item Group', delivery_note.company)
+
+	target.cost_center = cost_center
+
+def get_cost_center(for_item, from_doctype, company):
+	'''Returns Cost Center for Item or Item Group'''
+	return frappe.db.get_value('Item Default',
+		fieldname=['buying_cost_center'],
+		filters={
+			'parent': for_item,
+			'parenttype': from_doctype,
+			'company': company
+		})
+
+def set_delivery_note_missing_values(target):
+	target.run_method('set_missing_values')
+	target.run_method('set_po_nos')
+	target.run_method('calculate_taxes_and_totals')
+
 def stock_entry_exists(pick_list_name):
 	return frappe.db.exists('Stock Entry', {
 		'pick_list': pick_list_name
 	})
+
+def get_item_details(item_code):
+	pass
+
+def update_stock_entry_based_on_work_order(pick_list, stock_entry):
+	work_order = frappe.get_doc("Work Order", pick_list.get('work_order'))
+
+	stock_entry.work_order = work_order.name
+	stock_entry.company = work_order.company
+	stock_entry.from_bom = 1
+	stock_entry.bom_no = work_order.bom_no
+	stock_entry.use_multi_level_bom = work_order.use_multi_level_bom
+	stock_entry.fg_completed_qty = pick_list.for_qty
+	if work_order.bom_no:
+		stock_entry.inspection_required = frappe.db.get_value('BOM',
+			work_order.bom_no, 'inspection_required')
+
+	is_wip_warehouse_group = frappe.db.get_value('Warehouse', work_order.wip_warehouse, 'is_group')
+	if not (is_wip_warehouse_group and work_order.skip_transfer):
+		wip_warehouse = work_order.wip_warehouse
+	else:
+		wip_warehouse = None
+	stock_entry.to_warehouse = wip_warehouse
+
+	stock_entry.project = work_order.project
+
+	for location in pick_list.locations:
+		item = frappe._dict()
+		item.item_code = location.item_code
+		item.s_warehouse = location.warehouse
+		item.t_warehouse = wip_warehouse
+		item.qty = location.qty
+		item.transfer_qty = location.stock_qty
+		item.uom = location.uom
+		item.conversion_factor = location.conversion_factor
+		item.stock_uom = location.stock_uom
+
+		stock_entry.append('items', item)
+
+	return stock_entry
+
+def update_stock_entry_based_on_material_request(pick_list, stock_entry):
+	for location in pick_list.locations:
+		item = frappe._dict()
+		item.item_code = location.item_code
+		item.s_warehouse = location.warehouse
+		item.qty = location.qty
+		item.transfer_qty = location.stock_qty
+		item.uom = location.uom
+		item.conversion_factor = location.conversion_factor
+		item.stock_uom = location.stock_uom
+		item.material_request = location.material_request
+		item.material_request_item = location.material_request_item
+
+		stock_entry.append('items', item)
+
+	return stock_entry
\ No newline at end of file