Merge pull request #35239 from ashish-greycube/patch-8

fix: in payment_entry  difference amount cal is broken
diff --git a/erpnext/accounts/doctype/bank_statement_import/bank_statement_import.py b/erpnext/accounts/doctype/bank_statement_import/bank_statement_import.py
index d8880f7..003a43c 100644
--- a/erpnext/accounts/doctype/bank_statement_import/bank_statement_import.py
+++ b/erpnext/accounts/doctype/bank_statement_import/bank_statement_import.py
@@ -53,19 +53,20 @@
 		if "Bank Account" not in json.dumps(preview["columns"]):
 			frappe.throw(_("Please add the Bank Account column"))
 
-		from frappe.utils.background_jobs import is_job_queued
+		from frappe.utils.background_jobs import is_job_enqueued
 		from frappe.utils.scheduler import is_scheduler_inactive
 
 		if is_scheduler_inactive() and not frappe.flags.in_test:
 			frappe.throw(_("Scheduler is inactive. Cannot import data."), title=_("Scheduler Inactive"))
 
-		if not is_job_queued(self.name):
+		job_id = f"bank_statement_import::{self.name}"
+		if not is_job_enqueued(job_id):
 			enqueue(
 				start_import,
 				queue="default",
 				timeout=6000,
 				event="data_import",
-				job_name=self.name,
+				job_id=job_id,
 				data_import=self.name,
 				bank_account=self.bank_account,
 				import_file_path=self.import_file,
diff --git a/erpnext/accounts/doctype/ledger_merge/ledger_merge.py b/erpnext/accounts/doctype/ledger_merge/ledger_merge.py
index 7cd6d04..381083b 100644
--- a/erpnext/accounts/doctype/ledger_merge/ledger_merge.py
+++ b/erpnext/accounts/doctype/ledger_merge/ledger_merge.py
@@ -4,7 +4,7 @@
 import frappe
 from frappe import _
 from frappe.model.document import Document
-from frappe.utils.background_jobs import is_job_queued
+from frappe.utils.background_jobs import is_job_enqueued
 
 from erpnext.accounts.doctype.account.account import merge_account
 
@@ -17,13 +17,14 @@
 		if is_scheduler_inactive() and not frappe.flags.in_test:
 			frappe.throw(_("Scheduler is inactive. Cannot merge accounts."), title=_("Scheduler Inactive"))
 
-		if not is_job_queued(self.name):
+		job_id = f"ledger_merge::{self.name}"
+		if not is_job_enqueued(job_id):
 			enqueue(
 				start_merge,
 				queue="default",
 				timeout=6000,
 				event="ledger_merge",
-				job_name=self.name,
+				job_id=job_id,
 				docname=self.name,
 				now=frappe.conf.developer_mode or frappe.flags.in_test,
 			)
diff --git a/erpnext/accounts/doctype/opening_invoice_creation_tool/opening_invoice_creation_tool.py b/erpnext/accounts/doctype/opening_invoice_creation_tool/opening_invoice_creation_tool.py
index 47c2ceb..680afb1 100644
--- a/erpnext/accounts/doctype/opening_invoice_creation_tool/opening_invoice_creation_tool.py
+++ b/erpnext/accounts/doctype/opening_invoice_creation_tool/opening_invoice_creation_tool.py
@@ -6,7 +6,7 @@
 from frappe import _, scrub
 from frappe.model.document import Document
 from frappe.utils import flt, nowdate
-from frappe.utils.background_jobs import enqueue, is_job_queued
+from frappe.utils.background_jobs import enqueue, is_job_enqueued
 
 from erpnext.accounts.doctype.accounting_dimension.accounting_dimension import (
 	get_accounting_dimensions,
@@ -212,13 +212,15 @@
 			if is_scheduler_inactive() and not frappe.flags.in_test:
 				frappe.throw(_("Scheduler is inactive. Cannot import data."), title=_("Scheduler Inactive"))
 
-			if not is_job_queued(self.name):
+			job_id = f"opening_invoice::{self.name}"
+
+			if not is_job_enqueued(job_id):
 				enqueue(
 					start_import,
 					queue="default",
 					timeout=6000,
 					event="opening_invoice_creation",
-					job_name=self.name,
+					job_id=job_id,
 					invoices=invoices,
 					now=frappe.conf.developer_mode or frappe.flags.in_test,
 				)
diff --git a/erpnext/accounts/doctype/pos_invoice_merge_log/pos_invoice_merge_log.py b/erpnext/accounts/doctype/pos_invoice_merge_log/pos_invoice_merge_log.py
index b1e2208..d8aed21 100644
--- a/erpnext/accounts/doctype/pos_invoice_merge_log/pos_invoice_merge_log.py
+++ b/erpnext/accounts/doctype/pos_invoice_merge_log/pos_invoice_merge_log.py
@@ -9,7 +9,7 @@
 from frappe.model.document import Document
 from frappe.model.mapper import map_child_doc, map_doc
 from frappe.utils import cint, flt, get_time, getdate, nowdate, nowtime
-from frappe.utils.background_jobs import enqueue, is_job_queued
+from frappe.utils.background_jobs import enqueue, is_job_enqueued
 from frappe.utils.scheduler import is_scheduler_inactive
 
 
@@ -483,15 +483,15 @@
 
 	closing_entry = kwargs.get("closing_entry") or {}
 
-	job_name = closing_entry.get("name")
-	if not is_job_queued(job_name):
+	job_id = "pos_invoice_merge::" + str(closing_entry.get("name"))
+	if not is_job_enqueued(job_id):
 		enqueue(
 			job,
 			**kwargs,
 			queue="long",
 			timeout=10000,
 			event="processing_merge_logs",
-			job_name=job_name,
+			job_id=job_id,
 			now=frappe.conf.developer_mode or frappe.flags.in_test
 		)
 
diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js
index 5c9168b..ab7884d 100644
--- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js
+++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js
@@ -303,7 +303,7 @@
 
 	apply_tds(frm) {
 		var me = this;
-
+		me.frm.set_value("tax_withheld_vouchers", []);
 		if (!me.frm.doc.apply_tds) {
 			me.frm.set_value("tax_withholding_category", '');
 			me.frm.set_df_property("tax_withholding_category", "hidden", 1);
diff --git a/erpnext/accounts/doctype/share_transfer/share_transfer.json b/erpnext/accounts/doctype/share_transfer/share_transfer.json
index 59a3053..51f2ac1 100644
--- a/erpnext/accounts/doctype/share_transfer/share_transfer.json
+++ b/erpnext/accounts/doctype/share_transfer/share_transfer.json
@@ -124,6 +124,7 @@
    "fieldname": "rate",
    "fieldtype": "Currency",
    "label": "Rate",
+   "options": "Company:company:default_currency",
    "reqd": 1
   },
   {
@@ -147,6 +148,7 @@
    "fieldname": "amount",
    "fieldtype": "Currency",
    "label": "Amount",
+   "options": "Company:company:default_currency",
    "read_only": 1
   },
   {
diff --git a/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py b/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py
index c987231..dd9c073 100644
--- a/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py
+++ b/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py
@@ -19,14 +19,19 @@
 	return _execute(filters)
 
 
-def _execute(filters=None, additional_table_columns=None, additional_query_columns=None):
+def _execute(
+	filters=None,
+	additional_table_columns=None,
+	additional_query_columns=None,
+	additional_conditions=None,
+):
 	if not filters:
 		filters = {}
 	columns = get_columns(additional_table_columns, filters)
 
 	company_currency = frappe.get_cached_value("Company", filters.get("company"), "default_currency")
 
-	item_list = get_items(filters, additional_query_columns)
+	item_list = get_items(filters, additional_query_columns, additional_conditions)
 	if item_list:
 		itemised_tax, tax_columns = get_tax_accounts(item_list, columns, company_currency)
 
@@ -328,7 +333,7 @@
 	return columns
 
 
-def get_conditions(filters):
+def get_conditions(filters, additional_conditions=None):
 	conditions = ""
 
 	for opts in (
@@ -341,6 +346,9 @@
 		if filters.get(opts[0]):
 			conditions += opts[1]
 
+	if additional_conditions:
+		conditions += additional_conditions
+
 	if filters.get("mode_of_payment"):
 		conditions += """ and exists(select name from `tabSales Invoice Payment`
 			where parent=`tabSales Invoice`.name
@@ -376,8 +384,8 @@
 		return "ORDER BY `tab{0}`.{1}".format(doctype, frappe.scrub(filters.get("group_by")))
 
 
-def get_items(filters, additional_query_columns):
-	conditions = get_conditions(filters)
+def get_items(filters, additional_query_columns, additional_conditions=None):
+	conditions = get_conditions(filters, additional_conditions)
 
 	if additional_query_columns:
 		additional_query_columns = ", " + ", ".join(additional_query_columns)
diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py
index d0ec654..78bb056 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
 
@@ -1679,6 +1682,9 @@
 					d.base_payment_amount = flt(
 						d.payment_amount * self.get("conversion_rate"), d.precision("base_payment_amount")
 					)
+		else:
+			self.fetch_payment_terms_from_order(po_or_so, doctype)
+			self.ignore_default_payment_terms_template = 1
 
 	def get_order_details(self):
 		if self.doctype == "Sales Invoice":
diff --git a/erpnext/controllers/queries.py b/erpnext/controllers/queries.py
index 799fed9..f1cef71 100644
--- a/erpnext/controllers/queries.py
+++ b/erpnext/controllers/queries.py
@@ -53,13 +53,17 @@
 	doctype = "Lead"
 	fields = get_fields(doctype, ["name", "lead_name", "company_name"])
 
+	searchfields = frappe.get_meta(doctype).get_search_fields()
+	searchfields = " or ".join(field + " like %(txt)s" for field in searchfields)
+
 	return frappe.db.sql(
 		"""select {fields} from `tabLead`
 		where docstatus < 2
 			and ifnull(status, '') != 'Converted'
 			and ({key} like %(txt)s
 				or lead_name like %(txt)s
-				or company_name like %(txt)s)
+				or company_name like %(txt)s
+				or {scond})
 			{mcond}
 		order by
 			(case when locate(%(_txt)s, name) > 0 then locate(%(_txt)s, name) else 99999 end),
@@ -68,7 +72,12 @@
 			idx desc,
 			name, lead_name
 		limit %(page_len)s offset %(start)s""".format(
-			**{"fields": ", ".join(fields), "key": searchfield, "mcond": get_match_cond(doctype)}
+			**{
+				"fields": ", ".join(fields),
+				"key": searchfield,
+				"scond": searchfields,
+				"mcond": get_match_cond(doctype),
+			}
 		),
 		{"txt": "%%%s%%" % txt, "_txt": txt.replace("%", ""), "start": start, "page_len": page_len},
 	)
diff --git a/erpnext/controllers/selling_controller.py b/erpnext/controllers/selling_controller.py
index fc16a91..7687aad 100644
--- a/erpnext/controllers/selling_controller.py
+++ b/erpnext/controllers/selling_controller.py
@@ -168,7 +168,7 @@
 			self.round_floats_in(sales_person)
 
 			sales_person.allocated_amount = flt(
-				self.amount_eligible_for_commission * sales_person.allocated_percentage / 100.0,
+				flt(self.amount_eligible_for_commission) * sales_person.allocated_percentage / 100.0,
 				self.precision("allocated_amount", sales_person),
 			)
 
diff --git a/erpnext/controllers/stock_controller.py b/erpnext/controllers/stock_controller.py
index a27e348..befde71 100644
--- a/erpnext/controllers/stock_controller.py
+++ b/erpnext/controllers/stock_controller.py
@@ -442,7 +442,43 @@
 			if not dimension:
 				continue
 
-			if row.get(dimension.source_fieldname):
+			if self.doctype in [
+				"Purchase Invoice",
+				"Purchase Receipt",
+				"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:
+					fieldname_start_with = "to"
+					if self.doctype in ["Purchase Invoice", "Purchase Receipt"]:
+						fieldname_start_with = "from"
+
+					fieldname = f"{fieldname_start_with}_{dimension.source_fieldname}"
+					sl_dict[dimension.target_fieldname] = row.get(fieldname)
+
+					if not sl_dict.get(dimension.target_fieldname):
+						sl_dict[dimension.target_fieldname] = row.get(dimension.source_fieldname)
+
+			elif row.get(dimension.source_fieldname):
 				sl_dict[dimension.target_fieldname] = row.get(dimension.source_fieldname)
 
 			if not sl_dict.get(dimension.target_fieldname) and dimension.fetch_from_parent:
@@ -734,6 +770,9 @@
 			}
 		)
 
+		if self.docstatus == 2:
+			force = True
+
 		if force or future_sle_exists(args) or repost_required_for_queue(self):
 			item_based_reposting = cint(
 				frappe.db.get_single_value("Stock Reposting Settings", "item_based_reposting")
diff --git a/erpnext/controllers/subcontracting_controller.py b/erpnext/controllers/subcontracting_controller.py
index 0575429..c3fa894 100644
--- a/erpnext/controllers/subcontracting_controller.py
+++ b/erpnext/controllers/subcontracting_controller.py
@@ -741,7 +741,7 @@
 					sco_doc = frappe.get_doc("Subcontracting Order", sco)
 					sco_doc.update_status()
 
-	def set_missing_values_in_additional_costs(self):
+	def calculate_additional_costs(self):
 		self.total_additional_costs = sum(flt(item.amount) for item in self.get("additional_costs"))
 
 		if self.total_additional_costs:
diff --git a/erpnext/controllers/tests/test_subcontracting_controller.py b/erpnext/controllers/tests/test_subcontracting_controller.py
index 0e6fe95..4ea4fd1 100644
--- a/erpnext/controllers/tests/test_subcontracting_controller.py
+++ b/erpnext/controllers/tests/test_subcontracting_controller.py
@@ -36,7 +36,7 @@
 		sco.remove_empty_rows()
 		self.assertEqual((len_before - 1), len(sco.service_items))
 
-	def test_set_missing_values_in_additional_costs(self):
+	def test_calculate_additional_costs(self):
 		sco = get_subcontracting_order(do_not_submit=1)
 
 		rate_without_additional_cost = sco.items[0].rate
diff --git a/erpnext/e_commerce/web_template/hero_slider/hero_slider.json b/erpnext/e_commerce/web_template/hero_slider/hero_slider.json
index 2b1807c..39b2b3e 100644
--- a/erpnext/e_commerce/web_template/hero_slider/hero_slider.json
+++ b/erpnext/e_commerce/web_template/hero_slider/hero_slider.json
@@ -165,6 +165,7 @@
    "fieldname": "slide_3_content_align",
    "fieldtype": "Select",
    "label": "Content Align",
+   "options": "Left\nCentre\nRight",
    "reqd": 0
   },
   {
@@ -214,6 +215,7 @@
    "fieldname": "slide_4_content_align",
    "fieldtype": "Select",
    "label": "Content Align",
+   "options": "Left\nCentre\nRight",
    "reqd": 0
   },
   {
@@ -263,6 +265,7 @@
    "fieldname": "slide_5_content_align",
    "fieldtype": "Select",
    "label": "Content Align",
+   "options": "Left\nCentre\nRight",
    "reqd": 0
   },
   {
@@ -274,7 +277,7 @@
   }
  ],
  "idx": 2,
- "modified": "2021-02-24 15:57:05.889709",
+ "modified": "2023-05-12 15:03:57.604060",
  "modified_by": "Administrator",
  "module": "E-commerce",
  "name": "Hero Slider",
diff --git a/erpnext/manufacturing/doctype/bom/bom.js b/erpnext/manufacturing/doctype/bom/bom.js
index f147b46..8c671e2 100644
--- a/erpnext/manufacturing/doctype/bom/bom.js
+++ b/erpnext/manufacturing/doctype/bom/bom.js
@@ -48,7 +48,6 @@
 			return {
 				query: "erpnext.manufacturing.doctype.bom.bom.item_query",
 				filters: {
-					"item_code": doc.item,
 					"include_item_in_manufacturing": 1,
 					"is_fixed_asset": 0
 				}
diff --git a/erpnext/patches.txt b/erpnext/patches.txt
index 03c7b01..e158df6 100644
--- a/erpnext/patches.txt
+++ b/erpnext/patches.txt
@@ -326,7 +326,7 @@
 erpnext.patches.v15_0.update_asset_value_for_manual_depr_entries
 erpnext.patches.v15_0.update_gpa_and_ndb_for_assdeprsch
 erpnext.patches.v14_0.create_accounting_dimensions_for_closing_balance
-erpnext.patches.v14_0.update_closing_balances
+erpnext.patches.v14_0.update_closing_balances #10-05-2023
 execute:frappe.db.set_single_value("Accounts Settings", "merge_similar_account_heads", 0)
 # below migration patches should always run last
 erpnext.patches.v14_0.migrate_gl_to_payment_ledger
diff --git a/erpnext/patches/v14_0/update_closing_balances.py b/erpnext/patches/v14_0/update_closing_balances.py
index f47e730..bb108ab 100644
--- a/erpnext/patches/v14_0/update_closing_balances.py
+++ b/erpnext/patches/v14_0/update_closing_balances.py
@@ -11,6 +11,8 @@
 
 
 def execute():
+	frappe.db.truncate("Account Closing Balance")
+
 	company_wise_order = {}
 	get_opening_entries = True
 	for pcv in frappe.db.get_all(
@@ -35,7 +37,20 @@
 				entry["closing_date"] = pcv_doc.posting_date
 				entry["period_closing_voucher"] = pcv_doc.name
 
-			closing_entries = pcv_doc.get_grouped_gl_entries(get_opening_entries=get_opening_entries)
+			closing_entries = frappe.db.get_all(
+				"GL Entry",
+				filters={
+					"is_cancelled": 0,
+					"voucher_no": ["!=", pcv.name],
+					"posting_date": ["<=", pcv.posting_date],
+				},
+				fields=["*"],
+			)
+
+			for entry in closing_entries:
+				entry["closing_date"] = pcv_doc.posting_date
+				entry["period_closing_voucher"] = pcv_doc.name
+
 			make_closing_entries(gl_entries + closing_entries, voucher_name=pcv.name)
 			company_wise_order[pcv.company].append(pcv.posting_date)
 			get_opening_entries = False
diff --git a/erpnext/projects/doctype/timesheet/timesheet.py b/erpnext/projects/doctype/timesheet/timesheet.py
index d482a46..11156f4 100644
--- a/erpnext/projects/doctype/timesheet/timesheet.py
+++ b/erpnext/projects/doctype/timesheet/timesheet.py
@@ -374,6 +374,7 @@
 	billing_rate = billing_amount / hours
 
 	target.company = timesheet.company
+	target.project = timesheet.parent_project
 	if customer:
 		target.customer = customer
 
diff --git a/erpnext/selling/doctype/sales_order/sales_order.js b/erpnext/selling/doctype/sales_order/sales_order.js
index 449d461..e9a6cc3 100644
--- a/erpnext/selling/doctype/sales_order/sales_order.js
+++ b/erpnext/selling/doctype/sales_order/sales_order.js
@@ -264,7 +264,7 @@
 					}
 				}
 				// payment request
-				if(flt(doc.per_billed)<100) {
+				if(flt(doc.per_billed, precision('per_billed', doc)) < 100 + frappe.boot.sysdefaults.over_billing_allowance) {
 					this.frm.add_custom_button(__('Payment Request'), () => this.make_payment_request(), __('Create'));
 					this.frm.add_custom_button(__('Payment'), () => this.make_payment_entry(), __('Create'));
 				}
diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py
index de63f6d..06467e5 100755
--- a/erpnext/selling/doctype/sales_order/sales_order.py
+++ b/erpnext/selling/doctype/sales_order/sales_order.py
@@ -620,6 +620,8 @@
 
 @frappe.whitelist()
 def make_delivery_note(source_name, target_doc=None, skip_item_mapping=False):
+	from erpnext.stock.doctype.packed_item.packed_item import make_packing_list
+
 	def set_missing_values(source, target):
 		target.run_method("set_missing_values")
 		target.run_method("set_po_nos")
@@ -634,6 +636,8 @@
 		if target.company_address:
 			target.update(get_fetch_values("Delivery Note", "company_address", target.company_address))
 
+		make_packing_list(target)
+
 	def update_item(source, target, source_parent):
 		target.base_amount = (flt(source.qty) - flt(source.delivered_qty)) * flt(source.base_rate)
 		target.amount = (flt(source.qty) - flt(source.delivered_qty)) * flt(source.rate)
diff --git a/erpnext/selling/doctype/sales_order/test_sales_order.py b/erpnext/selling/doctype/sales_order/test_sales_order.py
index ba8bbc2..9854f15 100644
--- a/erpnext/selling/doctype/sales_order/test_sales_order.py
+++ b/erpnext/selling/doctype/sales_order/test_sales_order.py
@@ -1909,6 +1909,75 @@
 
 		self.assertEqual(mr.items[0].qty, 6)
 
+	def test_packed_items_for_partial_sales_order(self):
+		# test Update Items with product bundle
+		for product_bundle in [
+			"_Test Product Bundle Item Partial 1",
+			"_Test Product Bundle Item Partial 2",
+		]:
+			if not frappe.db.exists("Item", product_bundle):
+				bundle_item = make_item(product_bundle, {"is_stock_item": 0})
+				bundle_item.append(
+					"item_defaults", {"company": "_Test Company", "default_warehouse": "_Test Warehouse - _TC"}
+				)
+				bundle_item.save(ignore_permissions=True)
+
+		for product_bundle in ["_Packed Item Partial 1", "_Packed Item Partial 2"]:
+			if not frappe.db.exists("Item", product_bundle):
+				make_item(product_bundle, {"is_stock_item": 1, "stock_uom": "Nos"})
+
+			make_stock_entry(item=product_bundle, target="_Test Warehouse - _TC", qty=2, rate=10)
+
+		make_product_bundle("_Test Product Bundle Item Partial 1", ["_Packed Item Partial 1"], 1)
+
+		make_product_bundle("_Test Product Bundle Item Partial 2", ["_Packed Item Partial 2"], 1)
+
+		so = make_sales_order(
+			item_code="_Test Product Bundle Item Partial 1",
+			warehouse="_Test Warehouse - _TC",
+			qty=1,
+			uom="Nos",
+			stock_uom="Nos",
+			conversion_factor=1,
+			transaction_date=nowdate(),
+			delivery_note=nowdate(),
+			do_not_submit=1,
+		)
+
+		so.append(
+			"items",
+			{
+				"item_code": "_Test Product Bundle Item Partial 2",
+				"warehouse": "_Test Warehouse - _TC",
+				"qty": 1,
+				"uom": "Nos",
+				"stock_uom": "Nos",
+				"conversion_factor": 1,
+				"delivery_note": nowdate(),
+			},
+		)
+
+		so.save()
+		so.submit()
+
+		dn = make_delivery_note(so.name)
+		dn.remove(dn.items[1])
+		dn.save()
+		dn.submit()
+
+		self.assertEqual(len(dn.items), 1)
+		self.assertEqual(len(dn.packed_items), 1)
+		self.assertEqual(dn.items[0].item_code, "_Test Product Bundle Item Partial 1")
+
+		so.load_from_db()
+
+		dn = make_delivery_note(so.name)
+		dn.save()
+
+		self.assertEqual(len(dn.items), 1)
+		self.assertEqual(len(dn.packed_items), 1)
+		self.assertEqual(dn.items[0].item_code, "_Test Product Bundle Item Partial 2")
+
 
 def automatically_fetch_payment_terms(enable=1):
 	accounts_settings = frappe.get_doc("Accounts Settings")
diff --git a/erpnext/selling/sales_common.js b/erpnext/selling/sales_common.js
index f1df3a1..e3de49c 100644
--- a/erpnext/selling/sales_common.js
+++ b/erpnext/selling/sales_common.js
@@ -299,7 +299,8 @@
 	}
 
 	batch_no(doc, cdt, cdn) {
-		var me = this;
+		super.batch_no(doc, cdt, cdn);
+
 		var item = frappe.get_doc(cdt, cdn);
 
 		if (item.serial_no) {
@@ -378,10 +379,6 @@
 			}
 	}
 
-	batch_no(doc, cdt, cdn) {
-		super.batch_no(doc, cdt, cdn);
-	}
-
 	qty(doc, cdt, cdn) {
 		super.qty(doc, cdt, cdn);
 
diff --git a/erpnext/setup/doctype/employee/employee.py b/erpnext/setup/doctype/employee/employee.py
index ece5a7d..566392c 100755
--- a/erpnext/setup/doctype/employee/employee.py
+++ b/erpnext/setup/doctype/employee/employee.py
@@ -257,7 +257,9 @@
 
 def get_holiday_list_for_employee(employee, raise_exception=True):
 	if employee:
-		holiday_list, company = frappe.db.get_value("Employee", employee, ["holiday_list", "company"])
+		holiday_list, company = frappe.get_cached_value(
+			"Employee", employee, ["holiday_list", "company"]
+		)
 	else:
 		holiday_list = ""
 		company = frappe.db.get_single_value("Global Defaults", "default_company")
diff --git a/erpnext/setup/doctype/holiday_list/holiday_list.py b/erpnext/setup/doctype/holiday_list/holiday_list.py
index fad827a..84d0d35 100644
--- a/erpnext/setup/doctype/holiday_list/holiday_list.py
+++ b/erpnext/setup/doctype/holiday_list/holiday_list.py
@@ -115,6 +115,8 @@
 	if date is None:
 		date = today()
 	if holiday_list:
-		return bool(frappe.get_all("Holiday List", dict(name=holiday_list, holiday_date=date)))
+		return bool(
+			frappe.db.exists("Holiday", {"parent": holiday_list, "holiday_date": date}, cache=True)
+		)
 	else:
 		return False
diff --git a/erpnext/setup/module_onboarding/home/home.json b/erpnext/setup/module_onboarding/home/home.json
index f02fc45..516f122 100644
--- a/erpnext/setup/module_onboarding/home/home.json
+++ b/erpnext/setup/module_onboarding/home/home.json
@@ -22,25 +22,19 @@
  "creation": "2021-11-22 12:19:15.888642",
  "docstatus": 0,
  "doctype": "Module Onboarding",
- "documentation_url": "https://docs.erpnext.com/docs/v13/user/manual/en/setting-up/company-setup",
+ "documentation_url": "https://docs.erpnext.com/docs/v14/user/manual/en/setting-up/company-setup",
  "idx": 0,
  "is_complete": 0,
- "modified": "2022-06-07 14:31:00.575193",
+ "modified": "2023-05-16 13:13:24.043792",
  "modified_by": "Administrator",
  "module": "Setup",
  "name": "Home",
  "owner": "Administrator",
  "steps": [
   {
-   "step": "Company Set Up"
-  },
-  {
    "step": "Navigation Help"
   },
   {
-   "step": "Data import"
-  },
-  {
    "step": "Create an Item"
   },
   {
@@ -51,12 +45,9 @@
   },
   {
    "step": "Create a Quotation"
-  },
-  {
-   "step": "Letterhead"
   }
  ],
- "subtitle": "Company, Item, Customer, Supplier, Navigation Help, Data Import, Letter Head, Quotation",
- "success_message": "Masters are all set up!",
- "title": "Let's Set Up Some Masters"
+ "subtitle": "Item, Customer, Supplier, Navigation Help and Quotation",
+ "success_message": "You're ready to start your journey with ERPNext",
+ "title": "Let's begin your journey with ERPNext"
 }
\ No newline at end of file
diff --git a/erpnext/setup/onboarding_step/company_set_up/company_set_up.json b/erpnext/setup/onboarding_step/company_set_up/company_set_up.json
index 6f65832..fae2de0 100644
--- a/erpnext/setup/onboarding_step/company_set_up/company_set_up.json
+++ b/erpnext/setup/onboarding_step/company_set_up/company_set_up.json
@@ -5,11 +5,11 @@
  "description": "# Set Up a Company\n\nA company is a legal entity for which you will set up your books of account and create accounting transactions. In ERPNext, you can create multiple companies, and establish relationships (group/subsidiary) among them.\n\nWithin the company master, you can capture various default accounts for that Company and set crucial settings related to the accounting methodology followed for a company.\n",
  "docstatus": 0,
  "doctype": "Onboarding Step",
- "idx": 0,
+ "idx": 1,
  "is_complete": 0,
  "is_single": 0,
  "is_skipped": 0,
- "modified": "2021-12-15 14:22:18.317423",
+ "modified": "2023-05-15 09:18:42.895537",
  "modified_by": "Administrator",
  "name": "Company Set Up",
  "owner": "Administrator",
diff --git a/erpnext/setup/onboarding_step/create_a_customer/create_a_customer.json b/erpnext/setup/onboarding_step/create_a_customer/create_a_customer.json
index f74d745..e1a8f90 100644
--- a/erpnext/setup/onboarding_step/create_a_customer/create_a_customer.json
+++ b/erpnext/setup/onboarding_step/create_a_customer/create_a_customer.json
@@ -5,17 +5,17 @@
  "description": "# Create a Customer\n\nThe Customer master is at the heart of your sales transactions. Customers are linked in Quotations, Sales Orders, Invoices, and Payments. Customers can be either numbered or identified by name (you would typically do this based on the number of customers you have).\n\nThrough Customer\u2019s master, you can effectively track essentials like:\n - Customer\u2019s multiple address and contacts\n - Account Receivables\n - Credit Limit and Credit Period\n",
  "docstatus": 0,
  "doctype": "Onboarding Step",
- "idx": 0,
+ "idx": 1,
  "is_complete": 0,
  "is_single": 0,
  "is_skipped": 0,
- "modified": "2021-12-15 14:20:31.197564",
+ "modified": "2023-05-16 12:54:54.112364",
  "modified_by": "Administrator",
  "name": "Create a Customer",
  "owner": "Administrator",
  "reference_document": "Customer",
  "show_form_tour": 0,
  "show_full_form": 0,
- "title": "Manage Customers",
+ "title": "Create a Customer",
  "validate_action": 1
 }
\ No newline at end of file
diff --git a/erpnext/setup/onboarding_step/create_a_quotation/create_a_quotation.json b/erpnext/setup/onboarding_step/create_a_quotation/create_a_quotation.json
index 8bdb621..92b45b4 100644
--- a/erpnext/setup/onboarding_step/create_a_quotation/create_a_quotation.json
+++ b/erpnext/setup/onboarding_step/create_a_quotation/create_a_quotation.json
@@ -5,11 +5,11 @@
  "description": "# Create a Quotation\n\nLet\u2019s get started with business transactions by creating your first Quotation. You can create a Quotation for an existing customer or a prospect. It will be an approved document, with items you sell and the proposed price + taxes applied. After completing the instructions, you will get a Quotation in a ready to share print format.",
  "docstatus": 0,
  "doctype": "Onboarding Step",
- "idx": 0,
+ "idx": 1,
  "is_complete": 0,
  "is_single": 0,
  "is_skipped": 0,
- "modified": "2021-12-15 14:21:31.675330",
+ "modified": "2023-05-15 09:18:42.984170",
  "modified_by": "Administrator",
  "name": "Create a Quotation",
  "owner": "Administrator",
diff --git a/erpnext/setup/onboarding_step/create_a_supplier/create_a_supplier.json b/erpnext/setup/onboarding_step/create_a_supplier/create_a_supplier.json
index 9574141..ef493fe 100644
--- a/erpnext/setup/onboarding_step/create_a_supplier/create_a_supplier.json
+++ b/erpnext/setup/onboarding_step/create_a_supplier/create_a_supplier.json
@@ -5,17 +5,17 @@
  "description": "# Create a Supplier\n\nAlso known as Vendor, is a master at the center of your purchase transactions. Suppliers are linked in Request for Quotation, Purchase Orders, Receipts, and Payments. Suppliers can be either numbered or identified by name.\n\nThrough Supplier\u2019s master, you can effectively track essentials like:\n - Supplier\u2019s multiple address and contacts\n - Account Receivables\n - Credit Limit and Credit Period\n",
  "docstatus": 0,
  "doctype": "Onboarding Step",
- "idx": 0,
+ "idx": 1,
  "is_complete": 0,
  "is_single": 0,
  "is_skipped": 0,
- "modified": "2021-12-15 14:21:23.518301",
+ "modified": "2023-05-16 12:55:08.610113",
  "modified_by": "Administrator",
  "name": "Create a Supplier",
  "owner": "Administrator",
  "reference_document": "Supplier",
  "show_form_tour": 0,
  "show_full_form": 0,
- "title": "Manage Suppliers",
+ "title": "Create a Supplier",
  "validate_action": 1
 }
\ No newline at end of file
diff --git a/erpnext/setup/onboarding_step/create_an_item/create_an_item.json b/erpnext/setup/onboarding_step/create_an_item/create_an_item.json
index cd29683..15f36be 100644
--- a/erpnext/setup/onboarding_step/create_an_item/create_an_item.json
+++ b/erpnext/setup/onboarding_step/create_an_item/create_an_item.json
@@ -6,18 +6,18 @@
  "docstatus": 0,
  "doctype": "Onboarding Step",
  "form_tour": "Item General",
- "idx": 0,
+ "idx": 1,
  "intro_video_url": "",
  "is_complete": 0,
  "is_single": 0,
  "is_skipped": 0,
- "modified": "2021-12-15 14:19:56.297772",
+ "modified": "2023-05-16 12:56:40.355878",
  "modified_by": "Administrator",
  "name": "Create an Item",
  "owner": "Administrator",
  "reference_document": "Item",
  "show_form_tour": 1,
- "show_full_form": 1,
- "title": "Manage Items",
+ "show_full_form": 0,
+ "title": "Create an Item",
  "validate_action": 1
 }
\ No newline at end of file
diff --git a/erpnext/setup/onboarding_step/data_import/data_import.json b/erpnext/setup/onboarding_step/data_import/data_import.json
index 4999a36..e5dd7da 100644
--- a/erpnext/setup/onboarding_step/data_import/data_import.json
+++ b/erpnext/setup/onboarding_step/data_import/data_import.json
@@ -5,11 +5,11 @@
  "description": "# Import Data from Spreadsheet\n\nIn ERPNext, you can easily migrate your historical data using spreadsheets. You can use it for migrating not just masters (like Customer, Supplier, Items), but also for transactions like (outstanding invoices, opening stock and accounting entries, etc).",
  "docstatus": 0,
  "doctype": "Onboarding Step",
- "idx": 0,
+ "idx": 1,
  "is_complete": 0,
  "is_single": 0,
  "is_skipped": 0,
- "modified": "2022-06-07 14:28:51.390813",
+ "modified": "2023-05-15 09:18:42.962231",
  "modified_by": "Administrator",
  "name": "Data import",
  "owner": "Administrator",
diff --git a/erpnext/setup/onboarding_step/letterhead/letterhead.json b/erpnext/setup/onboarding_step/letterhead/letterhead.json
index 8e1bb8c..584fd48 100644
--- a/erpnext/setup/onboarding_step/letterhead/letterhead.json
+++ b/erpnext/setup/onboarding_step/letterhead/letterhead.json
@@ -5,11 +5,11 @@
  "description": "# Create a Letter Head\n\nA Letter Head contains your organization's name, logo, address, etc which appears at the header and footer portion in documents. You can learn more about Setting up Letter Head in ERPNext here.\n",
  "docstatus": 0,
  "doctype": "Onboarding Step",
- "idx": 0,
+ "idx": 1,
  "is_complete": 0,
  "is_single": 0,
  "is_skipped": 0,
- "modified": "2021-12-15 14:21:39.037742",
+ "modified": "2023-05-15 09:18:42.995184",
  "modified_by": "Administrator",
  "name": "Letterhead",
  "owner": "Administrator",
diff --git a/erpnext/setup/onboarding_step/navigation_help/navigation_help.json b/erpnext/setup/onboarding_step/navigation_help/navigation_help.json
index cf07968..f57818b 100644
--- a/erpnext/setup/onboarding_step/navigation_help/navigation_help.json
+++ b/erpnext/setup/onboarding_step/navigation_help/navigation_help.json
@@ -2,14 +2,14 @@
  "action": "Watch Video",
  "action_label": "Learn about  Navigation options",
  "creation": "2021-11-22 12:09:52.233872",
- "description": "# Navigation in ERPNext\n\nEase of navigating and browsing around the ERPNext is one of our core strengths. In the following video, you will learn how to reach a specific feature in ERPNext via module page or awesome bar\u2019s shortcut.\n",
+ "description": "# Navigation in ERPNext\n\nEase of navigating and browsing around the ERPNext is one of our core strengths. In the following video, you will learn how to reach a specific feature in ERPNext via module page or AwesomeBar.",
  "docstatus": 0,
  "doctype": "Onboarding Step",
- "idx": 0,
+ "idx": 1,
  "is_complete": 0,
  "is_single": 0,
  "is_skipped": 0,
- "modified": "2022-06-07 14:28:00.901082",
+ "modified": "2023-05-16 12:53:25.939908",
  "modified_by": "Administrator",
  "name": "Navigation Help",
  "owner": "Administrator",
diff --git a/erpnext/startup/boot.py b/erpnext/startup/boot.py
index 62936fc..db1cc49 100644
--- a/erpnext/startup/boot.py
+++ b/erpnext/startup/boot.py
@@ -21,6 +21,10 @@
 		bootinfo.sysdefaults.allow_stale = cint(
 			frappe.db.get_single_value("Accounts Settings", "allow_stale")
 		)
+		bootinfo.sysdefaults.over_billing_allowance = frappe.db.get_single_value(
+			"Accounts Settings", "over_billing_allowance"
+		)
+
 		bootinfo.sysdefaults.quotation_valid_till = cint(
 			frappe.db.get_single_value("CRM Settings", "default_valid_till")
 		)
diff --git a/erpnext/stock/doctype/inventory_dimension/inventory_dimension.py b/erpnext/stock/doctype/inventory_dimension/inventory_dimension.py
index db2b5d0..8bff4d5 100644
--- a/erpnext/stock/doctype/inventory_dimension/inventory_dimension.py
+++ b/erpnext/stock/doctype/inventory_dimension/inventory_dimension.py
@@ -75,7 +75,16 @@
 		self.delete_custom_fields()
 
 	def delete_custom_fields(self):
-		filters = {"fieldname": self.source_fieldname}
+		filters = {
+			"fieldname": (
+				"in",
+				[
+					self.source_fieldname,
+					f"to_{self.source_fieldname}",
+					f"from_{self.source_fieldname}",
+				],
+			)
+		}
 
 		if self.document_type:
 			filters["dt"] = self.document_type
@@ -88,6 +97,8 @@
 
 	def reset_value(self):
 		if self.apply_to_all_doctypes:
+			self.type_of_transaction = ""
+
 			self.istable = 0
 			for field in ["document_type", "condition"]:
 				self.set(field, None)
@@ -111,12 +122,35 @@
 	def on_update(self):
 		self.add_custom_fields()
 
-	def add_custom_fields(self):
-		dimension_fields = [
+	@staticmethod
+	def get_insert_after_fieldname(doctype):
+		return frappe.get_all(
+			"DocField",
+			fields=["fieldname"],
+			filters={"parent": doctype},
+			order_by="idx desc",
+			limit=1,
+		)[0].fieldname
+
+	def get_dimension_fields(self, doctype=None):
+		if not doctype:
+			doctype = self.document_type
+
+		label_start_with = ""
+		if doctype in ["Purchase Invoice Item", "Purchase Receipt Item"]:
+			label_start_with = "Target"
+		elif doctype in ["Sales Invoice Item", "Delivery Note Item", "Stock Entry Detail"]:
+			label_start_with = "Source"
+
+		label = self.dimension_name
+		if label_start_with:
+			label = f"{label_start_with} {self.dimension_name}"
+
+		return [
 			dict(
 				fieldname="inventory_dimension",
 				fieldtype="Section Break",
-				insert_after="warehouse",
+				insert_after=self.get_insert_after_fieldname(doctype),
 				label="Inventory Dimension",
 				collapsible=1,
 			),
@@ -125,24 +159,37 @@
 				fieldtype="Link",
 				insert_after="inventory_dimension",
 				options=self.reference_document,
-				label=self.dimension_name,
+				label=label,
 				reqd=self.reqd,
 				mandatory_depends_on=self.mandatory_depends_on,
 			),
 		]
 
+	def add_custom_fields(self):
 		custom_fields = {}
 
+		dimension_fields = []
 		if self.apply_to_all_doctypes:
 			for doctype in get_inventory_documents():
-				if not field_exists(doctype[0], self.source_fieldname):
-					custom_fields.setdefault(doctype[0], dimension_fields)
+				if field_exists(doctype[0], self.source_fieldname):
+					continue
+
+				dimension_fields = self.get_dimension_fields(doctype[0])
+				self.add_transfer_field(doctype[0], dimension_fields)
+				custom_fields.setdefault(doctype[0], dimension_fields)
 		elif not field_exists(self.document_type, self.source_fieldname):
+			dimension_fields = self.get_dimension_fields()
+
+			self.add_transfer_field(self.document_type, dimension_fields)
 			custom_fields.setdefault(self.document_type, dimension_fields)
 
-		if not frappe.db.get_value(
-			"Custom Field", {"dt": "Stock Ledger Entry", "fieldname": self.target_fieldname}
-		) and not field_exists("Stock Ledger Entry", self.target_fieldname):
+		if (
+			dimension_fields
+			and not frappe.db.get_value(
+				"Custom Field", {"dt": "Stock Ledger Entry", "fieldname": self.target_fieldname}
+			)
+			and not field_exists("Stock Ledger Entry", self.target_fieldname)
+		):
 			dimension_field = dimension_fields[1]
 			dimension_field["mandatory_depends_on"] = ""
 			dimension_field["reqd"] = 0
@@ -152,6 +199,53 @@
 		if custom_fields:
 			create_custom_fields(custom_fields)
 
+	def add_transfer_field(self, doctype, dimension_fields):
+		if doctype not in [
+			"Stock Entry Detail",
+			"Sales Invoice Item",
+			"Delivery Note Item",
+			"Purchase Invoice Item",
+			"Purchase Receipt Item",
+		]:
+			return
+
+		fieldname_start_with = "to"
+		label_start_with = "Target"
+		display_depends_on = ""
+
+		if doctype in ["Purchase Invoice Item", "Purchase Receipt Item"]:
+			fieldname_start_with = "from"
+			label_start_with = "Source"
+			display_depends_on = "eval:parent.is_internal_supplier == 1"
+		elif doctype != "Stock Entry Detail":
+			display_depends_on = "eval:parent.is_internal_customer == 1"
+		elif doctype == "Stock Entry Detail":
+			display_depends_on = "eval:parent.purpose != 'Material Issue'"
+
+		fieldname = f"{fieldname_start_with}_{self.source_fieldname}"
+		label = f"{label_start_with} {self.dimension_name}"
+
+		if field_exists(doctype, fieldname):
+			return
+
+		dimension_fields.extend(
+			[
+				dict(
+					fieldname="inventory_dimension_col_break",
+					fieldtype="Column Break",
+					insert_after=self.source_fieldname,
+				),
+				dict(
+					fieldname=fieldname,
+					fieldtype="Link",
+					insert_after="inventory_dimension_col_break",
+					options=self.reference_document,
+					label=label,
+					depends_on=display_depends_on,
+				),
+			]
+		)
+
 
 def field_exists(doctype, fieldname) -> str or None:
 	return frappe.db.get_value("DocField", {"parent": doctype, "fieldname": fieldname}, "name")
@@ -185,18 +279,19 @@
 	dimensions = get_document_wise_inventory_dimensions(doc.doctype)
 	filter_dimensions = []
 	for row in dimensions:
-		if (
-			row.type_of_transaction == "Inward"
-			if doc.docstatus == 1
-			else row.type_of_transaction != "Inward"
-		) and sl_dict.actual_qty < 0:
-			continue
-		elif (
-			row.type_of_transaction == "Outward"
-			if doc.docstatus == 1
-			else row.type_of_transaction != "Outward"
-		) and sl_dict.actual_qty > 0:
-			continue
+		if row.type_of_transaction:
+			if (
+				row.type_of_transaction == "Inward"
+				if doc.docstatus == 1
+				else row.type_of_transaction != "Inward"
+			) and sl_dict.actual_qty < 0:
+				continue
+			elif (
+				row.type_of_transaction == "Outward"
+				if doc.docstatus == 1
+				else row.type_of_transaction != "Outward"
+			) and sl_dict.actual_qty > 0:
+				continue
 
 		evals = {"doc": doc}
 		if parent_doc:
diff --git a/erpnext/stock/doctype/inventory_dimension/test_inventory_dimension.py b/erpnext/stock/doctype/inventory_dimension/test_inventory_dimension.py
index 28b1ed9..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 (
@@ -12,6 +13,7 @@
 	DoNotChangeError,
 	delete_dimension,
 )
+from erpnext.stock.doctype.item.test_item import create_item
 from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import make_purchase_receipt
 from erpnext.stock.doctype.stock_entry.stock_entry_utils import make_stock_entry
 from erpnext.stock.doctype.warehouse.test_warehouse import create_warehouse
@@ -20,6 +22,7 @@
 class TestInventoryDimension(FrappeTestCase):
 	def setUp(self):
 		prepare_test_data()
+		create_store_dimension()
 
 	def test_validate_inventory_dimension(self):
 		# Can not be child doc
@@ -73,6 +76,8 @@
 		self.assertFalse(custom_field)
 
 	def test_inventory_dimension(self):
+		frappe.local.document_wise_inventory_dimensions = {}
+
 		warehouse = "Shelf Warehouse - _TC"
 		item_code = "_Test Item"
 
@@ -143,6 +148,8 @@
 		self.assertRaises(DoNotChangeError, inv_dim1.save)
 
 	def test_inventory_dimension_for_purchase_receipt_and_delivery_note(self):
+		frappe.local.document_wise_inventory_dimensions = {}
+
 		inv_dimension = create_inventory_dimension(
 			reference_document="Rack", dimension_name="Rack", apply_to_all_doctypes=1
 		)
@@ -250,6 +257,191 @@
 			)
 		)
 
+	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",
+			dimension_name="Store",
+			apply_to_all_doctypes=1,
+		)
+
+		item_code = "Test Inventory Dimension Item"
+		create_item(item_code)
+		warehouse = create_warehouse("Store Warehouse")
+
+		# Purchase Receipt -> Inward in Store 1
+		pr_doc = make_purchase_receipt(
+			item_code=item_code, warehouse=warehouse, qty=10, rate=100, do_not_submit=True
+		)
+
+		pr_doc.items[0].store = "Store 1"
+		pr_doc.save()
+		pr_doc.submit()
+
+		entries = get_voucher_sl_entries(pr_doc.name, ["warehouse", "store", "incoming_rate"])
+
+		self.assertEqual(entries[0].warehouse, warehouse)
+		self.assertEqual(entries[0].store, "Store 1")
+
+		# Stock Entry -> Transfer from Store 1 to Store 2
+		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 1"
+		se_doc.items[0].to_store = "Store 2"
+
+		se_doc.save()
+		se_doc.submit()
+
+		entries = get_voucher_sl_entries(
+			se_doc.name, ["warehouse", "store", "incoming_rate", "actual_qty"]
+		)
+
+		for entry in entries:
+			self.assertEqual(entry.warehouse, warehouse)
+			if entry.actual_qty > 0:
+				self.assertEqual(entry.store, "Store 2")
+				self.assertEqual(entry.incoming_rate, 100.0)
+			else:
+				self.assertEqual(entry.store, "Store 1")
+
+		# Delivery Note -> Outward from Store 2
+
+		dn_doc = create_delivery_note(item_code=item_code, qty=10, warehouse=warehouse, do_not_save=True)
+
+		dn_doc.items[0].store = "Store 2"
+		dn_doc.save()
+		dn_doc.submit()
+
+		entries = get_voucher_sl_entries(dn_doc.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)
+
+		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(
+		"Stock Ledger Entry", filters={"voucher_no": voucher_no}, fields=fields, order_by="creation"
+	)
+
+
+def create_store_dimension():
+	if not frappe.db.exists("DocType", "Store"):
+		frappe.get_doc(
+			{
+				"doctype": "DocType",
+				"name": "Store",
+				"module": "Stock",
+				"custom": 1,
+				"naming_rule": "By fieldname",
+				"autoname": "field:store_name",
+				"fields": [{"label": "Store Name", "fieldname": "store_name", "fieldtype": "Data"}],
+				"permissions": [
+					{"role": "System Manager", "permlevel": 0, "read": 1, "write": 1, "create": 1, "delete": 1}
+				],
+			}
+		).insert(ignore_permissions=True)
+
+	for store in ["Store 1", "Store 2"]:
+		if not frappe.db.exists("Store", store):
+			frappe.get_doc({"doctype": "Store", "store_name": store}).insert(ignore_permissions=True)
+
 
 def prepare_test_data():
 	if not frappe.db.exists("DocType", "Shelf"):
@@ -326,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"
+			),
+		}
+	)
diff --git a/erpnext/stock/doctype/item/item_list.js b/erpnext/stock/doctype/item/item_list.js
index 534b341..22d38e8 100644
--- a/erpnext/stock/doctype/item/item_list.js
+++ b/erpnext/stock/doctype/item/item_list.js
@@ -1,5 +1,5 @@
 frappe.listview_settings['Item'] = {
-	add_fields: ["item_name", "stock_uom", "item_group", "image", "variant_of",
+	add_fields: ["item_name", "stock_uom", "item_group", "image",
 		"has_variants", "end_of_life", "disabled"],
 	filters: [["disabled", "=", "0"]],
 
diff --git a/erpnext/stock/doctype/repost_item_valuation/test_repost_item_valuation.py b/erpnext/stock/doctype/repost_item_valuation/test_repost_item_valuation.py
index 96ac435..9c4d997 100644
--- a/erpnext/stock/doctype/repost_item_valuation/test_repost_item_valuation.py
+++ b/erpnext/stock/doctype/repost_item_valuation/test_repost_item_valuation.py
@@ -376,3 +376,19 @@
 
 		accounts_settings.acc_frozen_upto = ""
 		accounts_settings.save()
+
+	def test_create_repost_entry_for_cancelled_document(self):
+		pr = make_purchase_receipt(
+			company="_Test Company with perpetual inventory",
+			warehouse="Stores - TCP1",
+			get_multiple_items=True,
+		)
+
+		self.assertTrue(pr.docstatus == 1)
+		self.assertFalse(frappe.db.exists("Repost Item Valuation", {"voucher_no": pr.name}))
+
+		pr.load_from_db()
+
+		pr.cancel()
+		self.assertTrue(pr.docstatus == 2)
+		self.assertTrue(frappe.db.exists("Repost Item Valuation", {"voucher_no": pr.name}))
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py
index cc0923f..cd076d8 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.py
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.py
@@ -9,7 +9,17 @@
 from frappe import _
 from frappe.model.mapper import get_mapped_doc
 from frappe.query_builder.functions import Sum
-from frappe.utils import cint, comma_or, cstr, flt, format_time, formatdate, getdate, nowdate
+from frappe.utils import (
+	cint,
+	comma_or,
+	cstr,
+	flt,
+	format_time,
+	formatdate,
+	getdate,
+	month_diff,
+	nowdate,
+)
 
 import erpnext
 from erpnext.accounts.general_ledger import process_gl_map
@@ -151,6 +161,41 @@
 			self.reset_default_field_value("from_warehouse", "items", "s_warehouse")
 			self.reset_default_field_value("to_warehouse", "items", "t_warehouse")
 
+	def submit(self):
+		if self.is_enqueue_action():
+			frappe.msgprint(
+				_(
+					"The task has been enqueued as a background job. In case there is any issue on processing in background, the system will add a comment about the error on this Stock Reconciliation and revert to the Draft stage"
+				)
+			)
+			self.queue_action("submit", timeout=2000)
+		else:
+			self._submit()
+
+	def cancel(self):
+		if self.is_enqueue_action():
+			frappe.msgprint(
+				_(
+					"The task has been enqueued as a background job. In case there is any issue on processing in background, the system will add a comment about the error on this Stock Reconciliation and revert to the Submitted stage"
+				)
+			)
+			self.queue_action("cancel", timeout=2000)
+		else:
+			self._cancel()
+
+	def is_enqueue_action(self, force=False) -> bool:
+		if force:
+			return True
+
+		if frappe.flags.in_test:
+			return False
+
+		# If line items are more than 100 or record is older than 6 months
+		if len(self.items) > 100 or month_diff(nowdate(), self.posting_date) > 6:
+			return True
+
+		return False
+
 	def on_submit(self):
 		self.update_stock_ledger()
 
diff --git a/erpnext/stock/doctype/stock_entry/test_stock_entry.py b/erpnext/stock/doctype/stock_entry/test_stock_entry.py
index c43a1b1..de74fda 100644
--- a/erpnext/stock/doctype/stock_entry/test_stock_entry.py
+++ b/erpnext/stock/doctype/stock_entry/test_stock_entry.py
@@ -5,7 +5,7 @@
 import frappe
 from frappe.permissions import add_user_permission, remove_user_permission
 from frappe.tests.utils import FrappeTestCase, change_settings
-from frappe.utils import add_days, flt, nowdate, nowtime, today
+from frappe.utils import add_days, add_to_date, flt, nowdate, nowtime, today
 
 from erpnext.accounts.doctype.account.test_account import get_inventory_account
 from erpnext.stock.doctype.item.test_item import (
@@ -1707,6 +1707,36 @@
 
 		self.assertRaises(frappe.ValidationError, sr_doc.submit)
 
+	def test_enqueue_action(self):
+		frappe.flags.in_test = False
+		item_code = "Test Enqueue Item - 001"
+		create_item(item_code=item_code, is_stock_item=1, valuation_rate=10)
+
+		doc = make_stock_entry(
+			item_code=item_code,
+			posting_date=add_to_date(today(), months=-7),
+			posting_time="00:00:00",
+			purpose="Material Receipt",
+			qty=10,
+			to_warehouse="_Test Warehouse - _TC",
+			do_not_submit=True,
+		)
+
+		self.assertTrue(doc.is_enqueue_action())
+
+		doc = make_stock_entry(
+			item_code=item_code,
+			posting_date=today(),
+			posting_time="00:00:00",
+			purpose="Material Receipt",
+			qty=10,
+			to_warehouse="_Test Warehouse - _TC",
+			do_not_submit=True,
+		)
+
+		self.assertFalse(doc.is_enqueue_action())
+		frappe.flags.in_test = True
+
 
 def make_serialized_item(**args):
 	args = frappe._dict(args)
diff --git a/erpnext/stock/stock_ledger.py b/erpnext/stock/stock_ledger.py
index 103ed4a..6106809 100644
--- a/erpnext/stock/stock_ledger.py
+++ b/erpnext/stock/stock_ledger.py
@@ -781,13 +781,21 @@
 				d.db_update()
 
 	def update_rate_on_subcontracting_receipt(self, sle, outgoing_rate):
-		if frappe.db.exists(sle.voucher_type + " Item", sle.voucher_detail_no):
-			frappe.db.set_value(sle.voucher_type + " Item", sle.voucher_detail_no, "rate", outgoing_rate)
+		if frappe.db.exists("Subcontracting Receipt Item", sle.voucher_detail_no):
+			frappe.db.set_value("Subcontracting Receipt Item", sle.voucher_detail_no, "rate", outgoing_rate)
 		else:
 			frappe.db.set_value(
-				"Subcontracting Receipt Supplied Item", sle.voucher_detail_no, "rate", outgoing_rate
+				"Subcontracting Receipt Supplied Item",
+				sle.voucher_detail_no,
+				{"rate": outgoing_rate, "amount": abs(sle.actual_qty) * outgoing_rate},
 			)
 
+		scr = frappe.get_doc("Subcontracting Receipt", sle.voucher_no, for_update=True)
+		scr.calculate_items_qty_and_amount()
+		scr.db_update()
+		for d in scr.items:
+			d.db_update()
+
 	def get_serialized_values(self, sle):
 		incoming_rate = flt(sle.incoming_rate)
 		actual_qty = flt(sle.actual_qty)
diff --git a/erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.py b/erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.py
index e6de72d..3919733 100644
--- a/erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.py
+++ b/erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.py
@@ -77,22 +77,22 @@
 					frappe.throw(_(msg))
 
 	def set_missing_values(self):
-		self.set_missing_values_in_additional_costs()
-		self.set_missing_values_in_service_items()
-		self.set_missing_values_in_supplied_items()
-		self.set_missing_values_in_items()
+		self.calculate_additional_costs()
+		self.calculate_service_costs()
+		self.calculate_supplied_items_qty_and_amount()
+		self.calculate_items_qty_and_amount()
 
-	def set_missing_values_in_service_items(self):
+	def calculate_service_costs(self):
 		for idx, item in enumerate(self.get("service_items")):
 			self.items[idx].service_cost_per_qty = item.amount / self.items[idx].qty
 
-	def set_missing_values_in_supplied_items(self):
+	def calculate_supplied_items_qty_and_amount(self):
 		for item in self.get("items"):
 			bom = frappe.get_doc("BOM", item.bom)
 			rm_cost = sum(flt(rm_item.amount) for rm_item in bom.items)
 			item.rm_cost_per_qty = rm_cost / flt(bom.quantity)
 
-	def set_missing_values_in_items(self):
+	def calculate_items_qty_and_amount(self):
 		total_qty = total = 0
 		for item in self.items:
 			item.rate = item.rm_cost_per_qty + item.service_cost_per_qty + flt(item.additional_cost_per_qty)
diff --git a/erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py b/erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py
index 4f8e045..2c84262 100644
--- a/erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py
+++ b/erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py
@@ -113,9 +113,9 @@
 
 	@frappe.whitelist()
 	def set_missing_values(self):
-		self.set_missing_values_in_additional_costs()
-		self.set_missing_values_in_supplied_items()
-		self.set_missing_values_in_items()
+		self.calculate_additional_costs()
+		self.calculate_supplied_items_qty_and_amount()
+		self.calculate_items_qty_and_amount()
 
 	def set_available_qty_for_consumption(self):
 		supplied_items_details = {}
@@ -147,13 +147,13 @@
 					item.rm_item_code, 0
 				)
 
-	def set_missing_values_in_supplied_items(self):
+	def calculate_supplied_items_qty_and_amount(self):
 		for item in self.get("supplied_items") or []:
 			item.amount = item.rate * item.consumed_qty
 
 		self.set_available_qty_for_consumption()
 
-	def set_missing_values_in_items(self):
+	def calculate_items_qty_and_amount(self):
 		rm_supp_cost = {}
 		for item in self.get("supplied_items") or []:
 			if item.reference_name in rm_supp_cost:
diff --git a/erpnext/subcontracting/doctype/subcontracting_receipt/test_subcontracting_receipt.py b/erpnext/subcontracting/doctype/subcontracting_receipt/test_subcontracting_receipt.py
index 72ed4d4..dfb72c3 100644
--- a/erpnext/subcontracting/doctype/subcontracting_receipt/test_subcontracting_receipt.py
+++ b/erpnext/subcontracting/doctype/subcontracting_receipt/test_subcontracting_receipt.py
@@ -6,7 +6,7 @@
 
 import frappe
 from frappe.tests.utils import FrappeTestCase
-from frappe.utils import cint, flt
+from frappe.utils import add_days, cint, cstr, flt, today
 
 import erpnext
 from erpnext.accounts.doctype.account.test_account import get_inventory_account
@@ -26,6 +26,9 @@
 from erpnext.stock.doctype.item.test_item import make_item
 from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import get_gl_entries
 from erpnext.stock.doctype.stock_entry.test_stock_entry import make_stock_entry
+from erpnext.stock.doctype.stock_reconciliation.test_stock_reconciliation import (
+	create_stock_reconciliation,
+)
 from erpnext.subcontracting.doctype.subcontracting_order.subcontracting_order import (
 	make_subcontracting_receipt,
 )
@@ -528,6 +531,69 @@
 		# consumed_qty should be (accepted_qty * qty_consumed_per_unit) = (6 * 1) = 6
 		self.assertEqual(scr.supplied_items[0].consumed_qty, 6)
 
+	def test_supplied_items_cost_after_reposting(self):
+		# Set Backflush Based On as "BOM"
+		set_backflush_based_on("BOM")
+
+		# Create Material Receipt for RM's
+		make_stock_entry(
+			item_code="_Test Item",
+			qty=100,
+			target="_Test Warehouse 1 - _TC",
+			basic_rate=100,
+			posting_date=add_days(today(), -2),
+		)
+		make_stock_entry(
+			item_code="_Test Item Home Desktop 100",
+			qty=100,
+			target="_Test Warehouse 1 - _TC",
+			basic_rate=100,
+		)
+
+		service_items = [
+			{
+				"warehouse": "_Test Warehouse - _TC",
+				"item_code": "Subcontracted Service Item 1",
+				"qty": 10,
+				"rate": 100,
+				"fg_item": "_Test FG Item",
+				"fg_item_qty": 10,
+			},
+		]
+
+		# Create Subcontracting Order
+		sco = get_subcontracting_order(service_items=service_items)
+
+		# Transfer RM's
+		rm_items = get_rm_items(sco.supplied_items)
+
+		itemwise_details = make_stock_in_entry(rm_items=rm_items)
+		make_stock_transfer_entry(
+			sco_no=sco.name,
+			rm_items=rm_items,
+			itemwise_details=copy.deepcopy(itemwise_details),
+		)
+
+		# Create Subcontracting Receipt
+		scr = make_subcontracting_receipt(sco.name)
+		scr.save()
+		scr.submit()
+
+		# Create Backdated Stock Reconciliation
+		sr = create_stock_reconciliation(
+			item_code=rm_items[0].get("item_code"),
+			warehouse="_Test Warehouse 1 - _TC",
+			qty=100,
+			rate=50,
+			posting_date=add_days(today(), -1),
+		)
+
+		# Cost should be updated in Subcontracting Receipt after reposting
+		prev_cost = scr.supplied_items[0].rate
+		scr.load_from_db()
+		self.assertNotEqual(scr.supplied_items[0].rate, prev_cost)
+		self.assertEqual(scr.supplied_items[0].rate, sr.items[0].valuation_rate)
+
 
 def make_return_subcontracting_receipt(**args):
 	args = frappe._dict(args)
diff --git a/erpnext/translations/de.csv b/erpnext/translations/de.csv
index 57556f3..b4fd76d 100644
--- a/erpnext/translations/de.csv
+++ b/erpnext/translations/de.csv
@@ -7638,20 +7638,19 @@
 Served,Serviert,
 Restaurant Reservation,Restaurant Reservierung,
 Waitlisted,Auf der Warteliste,
-No Show,Keine Show,
-No of People,Nein von Menschen,
+No Show,Nicht angetreten,
+No of People,Anzahl von Personen,
 Reservation Time,Reservierungszeit,
 Reservation End Time,Reservierungsendzeit,
 No of Seats,Anzahl der Sitze,
 Minimum Seating,Mindestbestuhlung,
 "Keep Track of Sales Campaigns. Keep track of Leads, Quotations, Sales Order etc from Campaigns to gauge Return on Investment. ","Verkaufskampagne verfolgen: Leads, Angebote, Aufträge usw. von Kampagnen beobachten um die Kapitalverzinsung (RoI) zu messen.",
-SAL-CAM-.YYYY.-,SAL-CAM-.YYYY.-,
 Campaign Schedules,Kampagnenpläne,
 Buyer of Goods and Services.,Käufer von Waren und Dienstleistungen.,
-CUST-.YYYY.-,CUST-.YYYY.-,
 Default Company Bank Account,Standard-Bankkonto des Unternehmens,
 From Lead,Aus Lead,
-Account Manager,Buchhalter,
+Account Manager,Kundenberater,
+Accounts Manager,Buchhalter,
 Allow Sales Invoice Creation Without Sales Order,Ermöglichen Sie die Erstellung von Kundenrechnungen ohne Auftrag,
 Allow Sales Invoice Creation Without Delivery Note,Ermöglichen Sie die Erstellung einer Ausgangsrechnung ohne Lieferschein,
 Default Price List,Standardpreisliste,
@@ -7692,7 +7691,6 @@
 "Aggregate group of **Items** into another **Item**. This is useful if you are bundling a certain **Items** into a package and you maintain stock of the packed **Items** and not the aggregate **Item**. \n\nThe package **Item** will have ""Is Stock Item"" as ""No"" and ""Is Sales Item"" as ""Yes"".\n\nFor Example: If you are selling Laptops and Backpacks separately and have a special price if the customer buys both, then the Laptop + Backpack will be a new Product Bundle Item.\n\nNote: BOM = Bill of Materials","Fassen Sie eine Gruppe von Artikeln zu einem neuen Artikel zusammen. Dies ist nützlich, wenn Sie bestimmte Artikel zu einem Paket bündeln und einen Bestand an Artikel-Bündeln erhalten und nicht einen Bestand der einzelnen Artikel. Das Artikel-Bündel erhält für das Attribut ""Ist Lagerartikel"" den Wert ""Nein"" und für das Attribut ""Ist Verkaufsartikel"" den Wert ""Ja"". Beispiel: Wenn Sie Laptops und Tragetaschen getrennt verkaufen und einen bestimmten Preis anbieten, wenn der Kunde beides zusammen kauft, dann wird der Laptop mit der Tasche zusammen ein neuer Bündel-Artikel. Anmerkung: BOM = Stückliste",
 Parent Item,Übergeordneter Artikel,
 List items that form the package.,"Die Artikel auflisten, die das Paket bilden.",
-SAL-QTN-.YYYY.-,SAL-QTN-.YYYY.-,
 Quotation To,Angebot für,
 Rate at which customer's currency is converted to company's base currency,"Kurs, zu dem die Währung des Kunden in die Basiswährung des Unternehmens umgerechnet wird",
 Rate at which Price list currency is converted to company's base currency,"Kurs, zu dem die Währung der Preisliste in die Basiswährung des Unternehmens umgerechnet wird",
@@ -7704,7 +7702,6 @@
 Against Doctype,Zu DocType,
 Against Docname,Zu Dokumentenname,
 Additional Notes,Zusätzliche Bemerkungen,
-SAL-ORD-.YYYY.-,SAL-ORD-.YYYY.-,
 Skip Delivery Note,Lieferschein überspringen,
 In Words will be visible once you save the Sales Order.,"""In Worten"" wird sichtbar, sobald Sie den Auftrag speichern.",
 Track this Sales Order against any Project,Diesen Auftrag in jedem Projekt nachverfolgen,
@@ -7935,7 +7932,7 @@
 Territory Targets,Ziele für die Region,
 Set Item Group-wise budgets on this Territory. You can also include seasonality by setting the Distribution.,Artikelgruppenbezogene Budgets für diese Region erstellen. Durch Setzen der Auslieferungseinstellungen können auch saisonale Aspekte mit einbezogen werden.,
 UOM Name,Maßeinheit-Name,
-Check this to disallow fractions. (for Nos),"Hier aktivieren, um keine Bruchteile zuzulassen (für Nr.)",
+Check this to disallow fractions. (for Nos),"Hier aktivieren, um keine Bruchteile zuzulassen (für Anzahl)",
 Website Item Group,Webseiten-Artikelgruppe,
 Cross Listing of Item in multiple groups,Kreuzweise Auflistung des Artikels in mehreren Gruppen,
 Default settings for Shopping Cart,Standardeinstellungen für den Warenkorb,
@@ -8016,7 +8013,6 @@
 Email sent to,E-Mail versandt an,
 Dispatch Information,Versandinformationen,
 Estimated Arrival,Voraussichtliche Ankunft,
-MAT-DT-.YYYY.-,MAT-DT-.YYYY.-,
 Initial Email Notification Sent,Erste E-Mail-Benachrichtigung gesendet,
 Delivery Details,Lieferdetails,
 Driver Email,Fahrer-E-Mail,
@@ -8176,7 +8172,6 @@
 Landed Cost Purchase Receipt,Einstandspreis-Kaufbeleg,
 Landed Cost Taxes and Charges,Einstandspreis Steuern und Gebühren,
 Landed Cost Voucher,Beleg über Einstandskosten,
-MAT-LCV-.YYYY.-,MAT-LCV-.YYYY.-,
 Purchase Receipts,Kaufbelege,
 Purchase Receipt Items,Kaufbeleg-Artikel,
 Get Items From Purchase Receipts,Artikel vom Kaufbeleg übernehmen,
@@ -8184,7 +8179,6 @@
 Landed Cost Help,Hilfe zum Einstandpreis,
 Manufacturers used in Items,Hersteller im Artikel verwendet,
 Limited to 12 characters,Limitiert auf 12 Zeichen,
-MAT-MR-.YYYY.-,MAT-MR-.YYYY.-,
 Partially Ordered,Teilweise bestellt,
 Transferred,Übergeben,
 % Ordered,% bestellt,
@@ -8199,7 +8193,6 @@
 Parent Detail docname,Übergeordnetes Detail Dokumentenname,
 "Generate packing slips for packages to be delivered. Used to notify package number, package contents and its weight.","Packzettel für zu liefernde Pakete generieren. Wird verwendet, um Paketnummer, Packungsinhalt und das Gewicht zu dokumentieren.",
 Indicates that the package is a part of this delivery (Only Draft),"Zeigt an, dass das Paket ein Teil dieser Lieferung ist (nur Entwurf)",
-MAT-PAC-.YYYY.-,MAT-PAC-.YYYY.-,
 From Package No.,Von Paket Nr.,
 Identification of the package for the delivery (for print),Kennzeichnung des Paketes für die Lieferung (für den Druck),
 To Package No.,Bis Paket Nr.,
@@ -8290,7 +8283,6 @@
 Out of AMC,Außerhalb des jährlichen Wartungsvertrags,
 Warranty Period (Days),Garantiefrist (Tage),
 Serial No Details,Details zur Seriennummer,
-MAT-STE-.YYYY.-,MAT-STE-.JJJJ.-,
 Stock Entry Type,Bestandsbuchungsart,
 Stock Entry (Outward GIT),Bestandsbuchung (Outward GIT),
 Material Consumption for Manufacture,Materialverbrauch für die Herstellung,
@@ -8336,7 +8328,6 @@
 Is Cancelled,Ist storniert,
 Stock Reconciliation,Bestandsabgleich,
 This tool helps you to update or fix the quantity and valuation of stock in the system. It is typically used to synchronise the system values and what actually exists in your warehouses.,"Dieses Werkzeug hilft Ihnen dabei, die Menge und die Bewertung von Bestand im System zu aktualisieren oder zu ändern. Es wird in der Regel verwendet, um die Systemwerte und den aktuellen Bestand Ihrer Lager zu synchronisieren.",
-MAT-RECO-.YYYY.-,MAT-RECO-.YYYY.-,
 Reconciliation JSON,Abgleich JSON (JavaScript Object Notation),
 Stock Reconciliation Item,Bestandsabgleich-Artikel,
 Before reconciliation,Vor Ausgleich,
@@ -8796,8 +8787,7 @@
 Availed ITC Cess,ITC Cess verfügbar,
 Is Nil Rated or Exempted,Ist gleich Null oder ausgenommen,
 Is Non GST,Ist nicht GST,
-ACC-SINV-RET-.YYYY.-,ACC-SINV-RET-.YYYY.-,
-E-Way Bill No.,E-Way Bill No.,
+E-Way Bill No.,E-Way Bill Nr.,
 Is Consolidated,Ist konsolidiert,
 Billing Address GSTIN,Rechnungsadresse GSTIN,
 Customer GSTIN,Kunde GSTIN,
@@ -9216,7 +9206,7 @@
 Time Required (In Mins),Erforderliche Zeit (in Minuten),
 From Posting Date,Ab dem Buchungsdatum,
 To Posting Date,Zum Buchungsdatum,
-No records found,Keine Aufzeichnungen gefunden,
+No records found,Keine Einträge gefunden,
 Customer/Lead Name,Name des Kunden / Lead,
 Unmarked Days,Nicht markierte Tage,
 Jan,Jan.,
@@ -9275,7 +9265,7 @@
 Group by Sales Order,Nach Auftrag gruppieren,
  Sales Value,Verkaufswert,
 Stock Qty vs Serial No Count,Lagermenge vs Seriennummer,
-Serial No Count,Seriennummer nicht gezählt,
+Serial No Count,Seriennummern gezählt,
 Work Order Summary,Arbeitsauftragsübersicht,
 Produce Qty,Menge produzieren,
 Lead Time (in mins),Vorlaufzeit (in Minuten),
@@ -9569,7 +9559,7 @@
 You can alternatively disable selling price validation in {} to bypass this validation.,"Alternativ können Sie die Validierung des Verkaufspreises in {} deaktivieren, um diese Validierung zu umgehen.",
 Invalid Selling Price,Ungültiger Verkaufspreis,
 Address needs to be linked to a Company. Please add a row for Company in the Links table.,Die Adresse muss mit einem Unternehmen verknüpft sein. Bitte fügen Sie eine Zeile für Firma in die Tabelle Links ein.,
-Company Not Linked,Firma nicht verbunden,
+Company Not Linked,Firma nicht verknüpft,
 Import Chart of Accounts from CSV / Excel files,Kontenplan aus CSV / Excel-Dateien importieren,
 Completed Qty cannot be greater than 'Qty to Manufacture',Die abgeschlossene Menge darf nicht größer sein als die Menge bis zur Herstellung.,
 "Row {0}: For Supplier {1}, Email Address is Required to send an email","Zeile {0}: Für Lieferant {1} ist eine E-Mail-Adresse erforderlich, um eine E-Mail zu senden",
@@ -9656,7 +9646,7 @@
 Action If Quality Inspection Is Not Submitted,Maßnahme Wenn keine Qualitätsprüfung eingereicht wird,
 Auto Insert Price List Rate If Missing,"Preisliste automatisch einfügen, falls fehlt",
 Automatically Set Serial Nos Based on FIFO,Seriennummern basierend auf FIFO automatisch einstellen,
-Set Qty in Transactions Based on Serial No Input,Stellen Sie die Menge in Transaktionen basierend auf Seriennummer ohne Eingabe ein,
+Set Qty in Transactions Based on Serial No Input,Setze die Anzahl in der Transaktion basierend auf den Seriennummern,
 Raise Material Request When Stock Reaches Re-order Level,"Erhöhen Sie die Materialanforderung, wenn der Lagerbestand die Nachbestellmenge erreicht",
 Notify by Email on Creation of Automatic Material Request,Benachrichtigen Sie per E-Mail über die Erstellung einer automatischen Materialanforderung,
 Allow Material Transfer from Delivery Note to Sales Invoice,Materialübertragung vom Lieferschein zur Ausgangsrechnung zulassen,
@@ -9765,7 +9755,7 @@
 POS invoice {0} created succesfully,POS-Rechnung {0} erfolgreich erstellt,
 Stock quantity not enough for Item Code: {0} under warehouse {1}. Available quantity {2}.,Lagermenge nicht ausreichend für Artikelcode: {0} unter Lager {1}. Verfügbare Menge {2}.,
 Serial No: {0} has already been transacted into another POS Invoice.,Seriennummer: {0} wurde bereits in eine andere POS-Rechnung übertragen.,
-Balance Serial No,Balance Seriennr,
+Balance Serial No,Stand Seriennummern,
 Warehouse: {0} does not belong to {1},Lager: {0} gehört nicht zu {1},
 Please select batches for batched item {0},Bitte wählen Sie Chargen für Chargenartikel {0} aus,
 Please select quantity on row {0},Bitte wählen Sie die Menge in Zeile {0},