Merge pull request #24072 from pateljannat/partially-submit-drop-ship-items-issue
fix: drop ship partial order fixed
This commit is contained in:
		
						commit
						8bb8ff673a
					
				| @ -830,56 +830,49 @@ def make_purchase_order_for_default_supplier(source_name, selected_items=None, t | ||||
| 		frappe.throw(_("Please set a Supplier against the Items to be considered in the Purchase Order.")) | ||||
| 
 | ||||
| 	for supplier in suppliers: | ||||
| 		po = frappe.get_list("Purchase Order", filters={"sales_order":source_name, "supplier":supplier, "docstatus": ("<", "2")}) | ||||
| 		if len(po) == 0: | ||||
| 			doc = get_mapped_doc("Sales Order", source_name, { | ||||
| 				"Sales Order": { | ||||
| 					"doctype": "Purchase Order", | ||||
| 					"field_no_map": [ | ||||
| 						"address_display", | ||||
| 						"contact_display", | ||||
| 						"contact_mobile", | ||||
| 						"contact_email", | ||||
| 						"contact_person", | ||||
| 						"taxes_and_charges", | ||||
| 						"shipping_address", | ||||
| 						"terms" | ||||
| 					], | ||||
| 					"validation": { | ||||
| 						"docstatus": ["=", 1] | ||||
| 					} | ||||
| 				}, | ||||
| 				"Sales Order Item": { | ||||
| 					"doctype": "Purchase Order Item", | ||||
| 					"field_map":  [ | ||||
| 						["name", "sales_order_item"], | ||||
| 						["parent", "sales_order"], | ||||
| 						["stock_uom", "stock_uom"], | ||||
| 						["uom", "uom"], | ||||
| 						["conversion_factor", "conversion_factor"], | ||||
| 						["delivery_date", "schedule_date"] | ||||
| 			 		], | ||||
| 					"field_no_map": [ | ||||
| 						"rate", | ||||
| 						"price_list_rate", | ||||
| 						"item_tax_template", | ||||
| 						"discount_percentage", | ||||
| 						"discount_amount", | ||||
| 						"pricing_rules" | ||||
| 					], | ||||
| 					"postprocess": update_item, | ||||
| 					"condition": lambda doc: doc.ordered_qty < doc.stock_qty and doc.supplier == supplier and doc.item_code in items_to_map | ||||
| 		doc = get_mapped_doc("Sales Order", source_name, { | ||||
| 			"Sales Order": { | ||||
| 				"doctype": "Purchase Order", | ||||
| 				"field_no_map": [ | ||||
| 					"address_display", | ||||
| 					"contact_display", | ||||
| 					"contact_mobile", | ||||
| 					"contact_email", | ||||
| 					"contact_person", | ||||
| 					"taxes_and_charges", | ||||
| 					"shipping_address", | ||||
| 					"terms" | ||||
| 				], | ||||
| 				"validation": { | ||||
| 					"docstatus": ["=", 1] | ||||
| 				} | ||||
| 			}, target_doc, set_missing_values) | ||||
| 			}, | ||||
| 			"Sales Order Item": { | ||||
| 				"doctype": "Purchase Order Item", | ||||
| 				"field_map":  [ | ||||
| 					["name", "sales_order_item"], | ||||
| 					["parent", "sales_order"], | ||||
| 					["stock_uom", "stock_uom"], | ||||
| 					["uom", "uom"], | ||||
| 					["conversion_factor", "conversion_factor"], | ||||
| 					["delivery_date", "schedule_date"] | ||||
| 				], | ||||
| 				"field_no_map": [ | ||||
| 					"rate", | ||||
| 					"price_list_rate", | ||||
| 					"item_tax_template", | ||||
| 					"discount_percentage", | ||||
| 					"discount_amount", | ||||
| 					"pricing_rules" | ||||
| 				], | ||||
| 				"postprocess": update_item, | ||||
| 				"condition": lambda doc: doc.ordered_qty < doc.stock_qty and doc.supplier == supplier and doc.item_code in items_to_map | ||||
| 			} | ||||
| 		}, target_doc, set_missing_values) | ||||
| 
 | ||||
| 			doc.insert() | ||||
| 		else: | ||||
| 			suppliers =[] | ||||
| 	if suppliers: | ||||
| 		doc.insert() | ||||
| 		frappe.db.commit() | ||||
| 		return doc | ||||
| 	else: | ||||
| 		frappe.msgprint(_("Purchase Order already created for all Sales Order items")) | ||||
| 
 | ||||
| @frappe.whitelist() | ||||
| def make_purchase_order(source_name, selected_items=None, target_doc=None): | ||||
| @ -1094,4 +1087,4 @@ def update_produced_qty_in_so_item(sales_order, sales_order_item): | ||||
| 
 | ||||
| 	if not total_produced_qty and frappe.flags.in_patch: return | ||||
| 
 | ||||
| 	frappe.db.set_value('Sales Order Item', sales_order_item, 'produced_qty', total_produced_qty) | ||||
| 	frappe.db.set_value('Sales Order Item', sales_order_item, 'produced_qty', total_produced_qty) | ||||
|  | ||||
| @ -772,6 +772,59 @@ class TestSalesOrder(unittest.TestCase): | ||||
| 		so.load_from_db() | ||||
| 		so.cancel() | ||||
| 
 | ||||
| 	def test_drop_shipping_partial_order(self): | ||||
| 		from erpnext.selling.doctype.sales_order.sales_order import make_purchase_order_for_default_supplier, \ | ||||
| 			update_status as so_update_status | ||||
| 
 | ||||
| 		# make items | ||||
| 		po_item1 = make_item("_Test Item for Drop Shipping 1", {"is_stock_item": 1, "delivered_by_supplier": 1}) | ||||
| 		po_item2 = make_item("_Test Item for Drop Shipping 2", {"is_stock_item": 1, "delivered_by_supplier": 1}) | ||||
| 
 | ||||
| 		so_items = [ | ||||
| 			{ | ||||
| 				"item_code": po_item1.item_code, | ||||
| 				"warehouse": "", | ||||
| 				"qty": 2, | ||||
| 				"rate": 400, | ||||
| 				"delivered_by_supplier": 1, | ||||
| 				"supplier": '_Test Supplier' | ||||
| 			}, | ||||
| 			{ | ||||
| 				"item_code": po_item2.item_code, | ||||
| 				"warehouse": "", | ||||
| 				"qty": 2, | ||||
| 				"rate": 400, | ||||
| 				"delivered_by_supplier": 1, | ||||
| 				"supplier": '_Test Supplier' | ||||
| 			} | ||||
| 		] | ||||
| 
 | ||||
| 		# create so and po | ||||
| 		so = make_sales_order(item_list=so_items, do_not_submit=True) | ||||
| 		so.submit() | ||||
| 
 | ||||
| 		# create po for only one item | ||||
| 		po1 = make_purchase_order_for_default_supplier(so.name, selected_items=[so_items[0]]) | ||||
| 		po1.submit() | ||||
| 
 | ||||
| 		self.assertEqual(so.customer, po1.customer) | ||||
| 		self.assertEqual(po1.items[0].sales_order, so.name) | ||||
| 		self.assertEqual(po1.items[0].item_code, po_item1.item_code) | ||||
| 		#test po item length | ||||
| 		self.assertEqual(len(po1.items), 1) | ||||
| 
 | ||||
| 		# create po for remaining item | ||||
| 		po2 = make_purchase_order_for_default_supplier(so.name, selected_items=[so_items[1]]) | ||||
| 		po2.submit() | ||||
| 
 | ||||
| 		# teardown | ||||
| 		so_update_status("Draft", so.name) | ||||
| 
 | ||||
| 		po1.cancel() | ||||
| 		po2.cancel() | ||||
| 		so.load_from_db() | ||||
| 		so.cancel() | ||||
| 
 | ||||
| 	def test_reserved_qty_for_closing_so(self): | ||||
| 		bin = frappe.get_all("Bin", filters={"item_code": "_Test Item", "warehouse": "_Test Warehouse - _TC"}, | ||||
| 			fields=["reserved_qty"]) | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user