Merge pull request #35289 from rohitwaghchaure/fixed-inventory-dimesion-for-inter-compnay-trasfer-return

fix: inventory dimension for returned inter company transfer
diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py
index d0ec654..3d930d6 100644
--- a/erpnext/controllers/accounts_controller.py
+++ b/erpnext/controllers/accounts_controller.py
@@ -392,6 +392,9 @@
 				)
 
 	def validate_inter_company_reference(self):
+		if self.get("is_return"):
+			return
+
 		if self.doctype not in ("Purchase Invoice", "Purchase Receipt"):
 			return
 
diff --git a/erpnext/controllers/stock_controller.py b/erpnext/controllers/stock_controller.py
index 796a069..09089be 100644
--- a/erpnext/controllers/stock_controller.py
+++ b/erpnext/controllers/stock_controller.py
@@ -449,8 +449,22 @@
 				"Delivery Note",
 				"Stock Entry",
 			]:
-				if (sl_dict.actual_qty > 0 and self.doctype in ["Purchase Invoice", "Purchase Receipt"]) or (
-					sl_dict.actual_qty < 0 and self.doctype in ["Sales Invoice", "Delivery Note", "Stock Entry"]
+				if (
+					(
+						sl_dict.actual_qty > 0
+						and not self.get("is_return")
+						or sl_dict.actual_qty < 0
+						and self.get("is_return")
+					)
+					and self.doctype in ["Purchase Invoice", "Purchase Receipt"]
+				) or (
+					(
+						sl_dict.actual_qty < 0
+						and not self.get("is_return")
+						or sl_dict.actual_qty > 0
+						and self.get("is_return")
+					)
+					and self.doctype in ["Sales Invoice", "Delivery Note", "Stock Entry"]
 				):
 					sl_dict[dimension.target_fieldname] = row.get(dimension.source_fieldname)
 				else:
diff --git a/erpnext/stock/doctype/inventory_dimension/test_inventory_dimension.py b/erpnext/stock/doctype/inventory_dimension/test_inventory_dimension.py
index ae5f521..2d273c6 100644
--- a/erpnext/stock/doctype/inventory_dimension/test_inventory_dimension.py
+++ b/erpnext/stock/doctype/inventory_dimension/test_inventory_dimension.py
@@ -4,6 +4,7 @@
 import frappe
 from frappe.custom.doctype.custom_field.custom_field import create_custom_field
 from frappe.tests.utils import FrappeTestCase
+from frappe.utils import nowdate, nowtime
 
 from erpnext.stock.doctype.delivery_note.test_delivery_note import create_delivery_note
 from erpnext.stock.doctype.inventory_dimension.inventory_dimension import (
@@ -257,6 +258,8 @@
 		)
 
 	def test_for_purchase_sales_and_stock_transaction(self):
+		from erpnext.controllers.sales_and_purchase_return import make_return_doc
+
 		create_inventory_dimension(
 			reference_document="Store",
 			type_of_transaction="Outward",
@@ -319,6 +322,98 @@
 		self.assertEqual(entries[0].store, "Store 2")
 		self.assertEqual(entries[0].actual_qty, -10.0)
 
+		return_dn = make_return_doc("Delivery Note", dn_doc.name)
+		return_dn.submit()
+		entries = get_voucher_sl_entries(return_dn.name, ["warehouse", "store", "actual_qty"])
+
+		self.assertEqual(entries[0].warehouse, warehouse)
+		self.assertEqual(entries[0].store, "Store 2")
+		self.assertEqual(entries[0].actual_qty, 10.0)
+
+		se_doc = make_stock_entry(
+			item_code=item_code, qty=10, from_warehouse=warehouse, to_warehouse=warehouse, do_not_save=True
+		)
+
+		se_doc.items[0].store = "Store 2"
+		se_doc.items[0].to_store = "Store 1"
+
+		se_doc.save()
+		se_doc.submit()
+
+		return_pr = make_return_doc("Purchase Receipt", pr_doc.name)
+		return_pr.submit()
+		entries = get_voucher_sl_entries(return_pr.name, ["warehouse", "store", "actual_qty"])
+
+		self.assertEqual(entries[0].warehouse, warehouse)
+		self.assertEqual(entries[0].store, "Store 1")
+		self.assertEqual(entries[0].actual_qty, -10.0)
+
+	def test_inter_transfer_return_against_inventory_dimension(self):
+		from erpnext.controllers.sales_and_purchase_return import make_return_doc
+		from erpnext.stock.doctype.delivery_note.delivery_note import make_inter_company_purchase_receipt
+
+		data = prepare_data_for_internal_transfer()
+
+		dn_doc = create_delivery_note(
+			customer=data.customer,
+			company=data.company,
+			warehouse=data.from_warehouse,
+			target_warehouse=data.to_warehouse,
+			qty=5,
+			cost_center=data.cost_center,
+			expense_account=data.expense_account,
+			do_not_submit=True,
+		)
+
+		dn_doc.items[0].store = "Inter Transfer Store 1"
+		dn_doc.items[0].to_store = "Inter Transfer Store 2"
+		dn_doc.save()
+		dn_doc.submit()
+
+		for d in get_voucher_sl_entries(dn_doc.name, ["store", "actual_qty"]):
+			if d.actual_qty > 0:
+				self.assertEqual(d.store, "Inter Transfer Store 2")
+			else:
+				self.assertEqual(d.store, "Inter Transfer Store 1")
+
+		pr_doc = make_inter_company_purchase_receipt(dn_doc.name)
+		pr_doc.items[0].warehouse = data.store_warehouse
+		pr_doc.items[0].from_store = "Inter Transfer Store 2"
+		pr_doc.items[0].store = "Inter Transfer Store 3"
+		pr_doc.save()
+		pr_doc.submit()
+
+		for d in get_voucher_sl_entries(pr_doc.name, ["store", "actual_qty"]):
+			if d.actual_qty > 0:
+				self.assertEqual(d.store, "Inter Transfer Store 3")
+			else:
+				self.assertEqual(d.store, "Inter Transfer Store 2")
+
+		return_doc = make_return_doc("Purchase Receipt", pr_doc.name)
+		return_doc.submit()
+
+		for d in get_voucher_sl_entries(return_doc.name, ["store", "actual_qty"]):
+			if d.actual_qty > 0:
+				self.assertEqual(d.store, "Inter Transfer Store 2")
+			else:
+				self.assertEqual(d.store, "Inter Transfer Store 3")
+
+		dn_doc.load_from_db()
+
+		return_doc1 = make_return_doc("Delivery Note", dn_doc.name)
+		return_doc1.posting_date = nowdate()
+		return_doc1.posting_time = nowtime()
+		return_doc1.items[0].target_warehouse = dn_doc.items[0].target_warehouse
+		return_doc1.items[0].warehouse = dn_doc.items[0].warehouse
+		return_doc1.save()
+		return_doc1.submit()
+
+		for d in get_voucher_sl_entries(return_doc1.name, ["store", "actual_qty"]):
+			if d.actual_qty > 0:
+				self.assertEqual(d.store, "Inter Transfer Store 1")
+			else:
+				self.assertEqual(d.store, "Inter Transfer Store 2")
+
 
 def get_voucher_sl_entries(voucher_no, fields):
 	return frappe.get_all(
@@ -423,3 +518,79 @@
 		doc.insert(ignore_permissions=True)
 
 	return doc
+
+
+def prepare_data_for_internal_transfer():
+	from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_internal_supplier
+	from erpnext.selling.doctype.customer.test_customer import create_internal_customer
+	from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import make_purchase_receipt
+	from erpnext.stock.doctype.warehouse.test_warehouse import create_warehouse
+
+	company = "_Test Company with perpetual inventory"
+
+	customer = create_internal_customer(
+		"_Test Internal Customer 3",
+		company,
+		company,
+	)
+
+	supplier = create_internal_supplier(
+		"_Test Internal Supplier 3",
+		company,
+		company,
+	)
+
+	for store in ["Inter Transfer Store 1", "Inter Transfer Store 2", "Inter Transfer Store 3"]:
+		if not frappe.db.exists("Store", store):
+			frappe.get_doc({"doctype": "Store", "store_name": store}).insert(ignore_permissions=True)
+
+	warehouse = create_warehouse("_Test Internal Warehouse New A", company=company)
+
+	to_warehouse = create_warehouse("_Test Internal Warehouse GIT A", company=company)
+
+	pr_doc = make_purchase_receipt(
+		company=company, warehouse=warehouse, qty=10, rate=100, do_not_submit=True
+	)
+	pr_doc.items[0].store = "Inter Transfer Store 1"
+	pr_doc.submit()
+
+	if not frappe.db.get_value("Company", company, "unrealized_profit_loss_account"):
+		account = "Unrealized Profit and Loss - TCP1"
+		if not frappe.db.exists("Account", account):
+			frappe.get_doc(
+				{
+					"doctype": "Account",
+					"account_name": "Unrealized Profit and Loss",
+					"parent_account": "Direct Income - TCP1",
+					"company": company,
+					"is_group": 0,
+					"account_type": "Income Account",
+				}
+			).insert()
+
+		frappe.db.set_value("Company", company, "unrealized_profit_loss_account", account)
+
+	cost_center = frappe.db.get_value("Company", company, "cost_center") or frappe.db.get_value(
+		"Cost Center", {"company": company}, "name"
+	)
+
+	expene_account = frappe.db.get_value(
+		"Company", company, "stock_adjustment_account"
+	) or frappe.db.get_value(
+		"Account", {"company": company, "account_type": "Expense Account"}, "name"
+	)
+
+	return frappe._dict(
+		{
+			"from_warehouse": warehouse,
+			"to_warehouse": to_warehouse,
+			"customer": customer,
+			"supplier": supplier,
+			"company": company,
+			"cost_center": cost_center,
+			"expene_account": expene_account,
+			"store_warehouse": frappe.db.get_value(
+				"Warehouse", {"name": ("like", "Store%"), "company": company}, "name"
+			),
+		}
+	)