chore: rearrange functions
diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
index bd3aeac..72808db 100644
--- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
+++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
@@ -344,10 +344,6 @@
 			)
 		)
 
-		supplier_warehouse_account = warehouse_account.get(self.supplier_warehouse, {}).get("account")
-		supplier_warehouse_account_currency = warehouse_account.get(self.supplier_warehouse, {}).get(
-			"account_currency"
-		)
 		exchange_rate_map, net_rate_map = get_purchase_document_details(self)
 
 		def make_item_asset_inward_entries(item, stock_value_diff, stock_asset_account_name):
@@ -365,22 +361,26 @@
 			)
 
 		def make_stock_received_but_not_billed_entry(item, outgoing_amount):
+			account = (
+				warehouse_account[item.from_warehouse]["account"] if item.from_warehouse else stock_asset_rbnb
+			)
+			account_currency = get_account_currency(account)
+
 			# GL Entry for from warehouse or Stock Received but not billed
 			# Intentionally passed negative debit amount to avoid incorrect GL Entry validation
 			credit_amount = (
 				flt(item.base_net_amount, item.precision("base_net_amount"))
-				if credit_currency == self.company_currency
+				if account_currency == self.company_currency
 				else flt(item.net_amount, item.precision("net_amount"))
 			)
 
 			if self.is_internal_transfer() and item.valuation_rate:
-				credit_amount = abs(get_stock_value_difference(self.name, item.name, item.from_warehouse) or 0)
+				outgoing_amount = abs(
+					get_stock_value_difference(self.name, item.name, item.from_warehouse) or 0
+				)
+				credit_amount = outgoing_amount
 
 			if credit_amount:
-				account = (
-					warehouse_account[item.from_warehouse]["account"] if item.from_warehouse else stock_asset_rbnb
-				)
-
 				self.add_gl_entry(
 					gl_entries=gl_entries,
 					account=account,
@@ -390,7 +390,7 @@
 					remarks=remarks,
 					against_account=stock_asset_account_name,
 					debit_in_account_currency=-1 * credit_amount,
-					account_currency=credit_currency,
+					account_currency=account_currency,
 					item=item,
 				)
 
@@ -415,7 +415,7 @@
 							remarks=remarks,
 							against_account=self.supplier,
 							debit_in_account_currency=-1 * discrepancy_caused_by_exchange_rate_difference,
-							account_currency=credit_currency,
+							account_currency=account_currency,
 							item=item,
 						)
 
@@ -428,7 +428,7 @@
 							remarks=remarks,
 							against_account=self.supplier,
 							debit_in_account_currency=-1 * discrepancy_caused_by_exchange_rate_difference,
-							account_currency=credit_currency,
+							account_currency=account_currency,
 							item=item,
 						)
 
@@ -519,7 +519,7 @@
 				cost_center = item.cost_center or frappe.get_cached_value(
 					"Company", self.company, "cost_center"
 				)
-
+				account_currency = get_account_currency(loss_account)
 				self.add_gl_entry(
 					gl_entries=gl_entries,
 					account=loss_account,
@@ -528,23 +528,32 @@
 					credit=0.0,
 					remarks=remarks,
 					against_account=stock_asset_account_name,
-					account_currency=credit_currency,
+					account_currency=account_currency,
 					project=item.project,
 					item=item,
 				)
 
 		for d in self.get("items"):
 			if d.item_code in stock_items or d.is_fixed_asset:
-				credit_currency = (
-					get_account_currency(warehouse_account[d.from_warehouse]["account"])
-					if d.from_warehouse
-					else get_account_currency(stock_asset_rbnb)
-				)
-
 				if warehouse_account.get(d.warehouse):
 					stock_value_diff = get_stock_value_difference(self.name, d.name, d.warehouse)
 					outgoing_amount = d.base_net_amount + d.item_tax_amount
 
+					supplier_warehouse_account = warehouse_account.get(self.supplier_warehouse, {}).get("account")
+					supplier_warehouse_account_currency = warehouse_account.get(self.supplier_warehouse, {}).get(
+						"account_currency"
+					)
+
+					# If PR is sub-contracted and fg item rate is zero
+					# in that case if account for source and target warehouse are same,
+					# then GL entries should not be posted
+					if (
+						flt(stock_value_diff) == flt(d.rm_supp_cost)
+						and warehouse_account.get(self.supplier_warehouse)
+						and stock_asset_account_name == supplier_warehouse_account
+					):
+						continue
+
 					if d.is_fixed_asset:
 						stock_asset_account_name = (
 							get_asset_category_account(
@@ -562,16 +571,6 @@
 					elif (flt(d.valuation_rate) or self.is_return) and flt(d.qty):
 						stock_asset_account_name = warehouse_account[d.warehouse]["account"]
 
-					# If PR is sub-contracted and fg item rate is zero
-					# in that case if account for source and target warehouse are same,
-					# then GL entries should not be posted
-					if (
-						flt(stock_value_diff) == flt(d.rm_supp_cost)
-						and warehouse_account.get(self.supplier_warehouse)
-						and stock_asset_account_name == supplier_warehouse_account
-					):
-						continue
-
 					make_item_asset_inward_entries(d, stock_value_diff, stock_asset_account_name)
 					make_stock_received_but_not_billed_entry(d, outgoing_amount)
 					make_landed_cost_gl_entries(d)