Beispiel #1
0
	def test_subcontracted_pr_for_multi_transfer_batches(self):
		from erpnext.stock.doctype.stock_entry.test_stock_entry import make_stock_entry
		from erpnext.buying.doctype.purchase_order.purchase_order import make_rm_stock_entry, make_purchase_receipt
		from erpnext.buying.doctype.purchase_order.test_purchase_order import (update_backflush_based_on,
			create_purchase_order)

		update_backflush_based_on("Material Transferred for Subcontract")
		item_code = "_Test Subcontracted FG Item 3"

		make_item('Sub Contracted Raw Material 3', {
			'is_stock_item': 1,
			'is_sub_contracted_item': 1,
			'has_batch_no': 1,
			'create_new_batch': 1
		})

		create_subcontracted_item(item_code=item_code, has_batch_no=1,
			raw_materials=["Sub Contracted Raw Material 3"])

		order_qty = 500
		po = create_purchase_order(item_code=item_code, qty=order_qty,
			is_subcontracted="Yes", supplier_warehouse="_Test Warehouse 1 - _TC")

		ste1=make_stock_entry(target="_Test Warehouse - _TC",
			item_code = "Sub Contracted Raw Material 3", qty=300, basic_rate=100)
		ste2=make_stock_entry(target="_Test Warehouse - _TC",
			item_code = "Sub Contracted Raw Material 3", qty=200, basic_rate=100)

		transferred_batch = {
			ste1.items[0].batch_no : 300,
			ste2.items[0].batch_no : 200
		}

		rm_items = [
			{"item_code":item_code,"rm_item_code":"Sub Contracted Raw Material 3","item_name":"_Test Item",
				"qty":300,"warehouse":"_Test Warehouse - _TC", "stock_uom":"Nos", "name": po.supplied_items[0].name},
			{"item_code":item_code,"rm_item_code":"Sub Contracted Raw Material 3","item_name":"_Test Item",
				"qty":200,"warehouse":"_Test Warehouse - _TC", "stock_uom":"Nos", "name": po.supplied_items[0].name}
		]

		rm_item_string = json.dumps(rm_items)
		se = frappe.get_doc(make_rm_stock_entry(po.name, rm_item_string))
		self.assertEqual(len(se.items), 2)
		se.items[0].batch_no = ste1.items[0].batch_no
		se.items[1].batch_no = ste2.items[0].batch_no
		se.submit()

		supplied_qty = frappe.db.get_value("Purchase Order Item Supplied",
			{"parent": po.name, "rm_item_code": "Sub Contracted Raw Material 3"}, "supplied_qty")

		self.assertEqual(supplied_qty, 500.00)

		pr = make_purchase_receipt(po.name)
		pr.save()
		self.assertEqual(len(pr.supplied_items), 2)

		for row in pr.supplied_items:
			self.assertEqual(transferred_batch.get(row.batch_no), row.consumed_qty)

		update_backflush_based_on("BOM")
	def test_subcontracting_over_receipt(self):
		"""
			Behaviour: Raise multiple PRs against one PO that in total
				receive more than the required qty in the PO.
			Expected Result: Error Raised for Over Receipt against PO.
		"""
		from erpnext.stock.doctype.stock_entry.test_stock_entry import make_stock_entry
		from erpnext.buying.doctype.purchase_order.test_purchase_order import (update_backflush_based_on,
			make_subcontracted_item, create_purchase_order)
		from erpnext.buying.doctype.purchase_order.purchase_order import (make_purchase_receipt,
			make_rm_stock_entry as make_subcontract_transfer_entry)

		update_backflush_based_on("Material Transferred for Subcontract")
		item_code = "_Test Subcontracted FG Item 1"
		make_subcontracted_item(item_code=item_code)

		po = create_purchase_order(item_code=item_code, qty=1, include_exploded_items=0,
			is_subcontracted="Yes", supplier_warehouse="_Test Warehouse 1 - _TC")

		#stock raw materials in a warehouse before transfer
		se1 = make_stock_entry(target="_Test Warehouse - _TC",
			item_code = "Test Extra Item 1", qty=10, basic_rate=100)
		se2 = make_stock_entry(target="_Test Warehouse - _TC",
			item_code = "_Test FG Item", qty=1, basic_rate=100)
		rm_items = [
			{
				"item_code": item_code,
				"rm_item_code": po.supplied_items[0].rm_item_code,
				"item_name": "_Test FG Item",
				"qty": po.supplied_items[0].required_qty,
				"warehouse": "_Test Warehouse - _TC",
				"stock_uom": "Nos"
			},
			{
				"item_code": item_code,
				"rm_item_code": po.supplied_items[1].rm_item_code,
				"item_name": "Test Extra Item 1",
				"qty": po.supplied_items[1].required_qty,
				"warehouse": "_Test Warehouse - _TC",
				"stock_uom": "Nos"
			}
		]
		rm_item_string = json.dumps(rm_items)
		se = frappe.get_doc(make_subcontract_transfer_entry(po.name, rm_item_string))
		se.to_warehouse = "_Test Warehouse 1 - _TC"
		se.save()
		se.submit()

		pr1 = make_purchase_receipt(po.name)
		pr2 = make_purchase_receipt(po.name)

		pr1.submit()
		self.assertRaises(frappe.ValidationError, pr2.submit)

		pr1.cancel()
		se.cancel()
		se1.cancel()
		se2.cancel()
		po.reload()
		po.cancel()