fix: Stock ledger preview
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json
index 6a65b30..15be2e7 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json
@@ -211,7 +211,12 @@
   "is_discounted",
   "remarks",
   "repost_required",
-  "connections_tab"
+  "connections_tab",
+  "ledger_preview",
+  "accounting_ledger_section",
+  "accounting_ledger_preview_html",
+  "stock_ledger_section",
+  "stock_ledger_preview_html"
  ],
  "fields": [
   {
@@ -2142,6 +2147,29 @@
    "fieldname": "use_company_roundoff_cost_center",
    "fieldtype": "Check",
    "label": "Use Company default Cost Center for Round off"
+  },
+  {
+   "fieldname": "ledger_preview",
+   "fieldtype": "Tab Break",
+   "label": "Ledger Preview"
+  },
+  {
+   "fieldname": "accounting_ledger_section",
+   "fieldtype": "Section Break",
+   "label": "Accounting Ledger"
+  },
+  {
+   "fieldname": "accounting_ledger_preview_html",
+   "fieldtype": "HTML"
+  },
+  {
+   "fieldname": "stock_ledger_section",
+   "fieldtype": "Section Break",
+   "label": "Stock Ledger"
+  },
+  {
+   "fieldname": "stock_ledger_preview_html",
+   "fieldtype": "HTML"
   }
  ],
  "icon": "fa fa-file-text",
@@ -2154,7 +2182,7 @@
    "link_fieldname": "consolidated_invoice"
   }
  ],
- "modified": "2023-04-28 14:15:59.901154",
+ "modified": "2023-06-11 11:18:14.024258",
  "modified_by": "Administrator",
  "module": "Accounts",
  "name": "Sales Invoice",
diff --git a/erpnext/controllers/buying_controller.py b/erpnext/controllers/buying_controller.py
index e15b612..efddae7 100644
--- a/erpnext/controllers/buying_controller.py
+++ b/erpnext/controllers/buying_controller.py
@@ -511,6 +511,7 @@
 
 		if self.get("is_old_subcontracting_flow"):
 			self.make_sl_entries_for_supplier_warehouse(sl_entries)
+
 		self.make_sl_entries(
 			sl_entries,
 			allow_negative_stock=allow_negative_stock,
diff --git a/erpnext/controllers/stock_controller.py b/erpnext/controllers/stock_controller.py
index 30dcc7f..a81c036 100644
--- a/erpnext/controllers/stock_controller.py
+++ b/erpnext/controllers/stock_controller.py
@@ -15,7 +15,6 @@
 	make_reverse_gl_entries,
 	process_gl_map,
 )
-from erpnext.accounts.report.general_ledger.general_ledger import get_columns
 from erpnext.accounts.utils import get_fiscal_year
 from erpnext.controllers.accounts_controller import AccountsController
 from erpnext.stock import get_warehouse_account_map
@@ -827,16 +826,76 @@
 
 @frappe.whitelist()
 def show_ledger_preview(company, doctype, docname):
+	from erpnext.accounts.report.general_ledger.general_ledger import get_columns as get_gl_columns
+	from erpnext.stock.report.stock_ledger.stock_ledger import get_columns as get_sl_columns
+
+	frappe.db.savepoint("show_ledger_preview")
+
 	filters = {"company": company}
 	doc = frappe.get_doc(doctype, docname)
-	columns = get_columns(filters)
-	data = doc.get_gl_entries()
+
+	datatable_sl_columns = []
+	datatable_sl_data = []
+
+	if doc.update_stock or doc.doctype in ("Purchase Receipt", "Delivery Note"):
+		sl_columns = get_sl_columns(filters)
+		doc.docstatus = 1
+		doc.update_stock_ledger()
+		sl_entries = get_sl_entries_for_preview(doc.doctype, doc.name)
+		datatable_sl_columns = get_columns(sl_columns)
+		datatable_sl_data = get_data(sl_columns, sl_entries)
+
+	doc.docstatus = 1
+	gl_columns = get_gl_columns(filters)
+	doc.make_gl_entries()
+	gl_data = get_gl_entries_for_preview(doc.doctype, doc.name)
+
+	datatable_gl_columns = get_columns(gl_columns)
+	datatable_gl_data = get_data(gl_columns, gl_data)
+
+	frappe.db.rollback(save_point="show_ledger_preview")
+
 	return {
-		"columns": columns,
-		"data": data,
+		"gl_columns": datatable_gl_columns,
+		"gl_data": datatable_gl_data,
+		"sl_columns": datatable_sl_columns,
+		"sl_data": datatable_sl_data,
 	}
 
 
+def get_sl_entries_for_preview(doctype, docname):
+	return frappe.get_all(
+		"Stock Ledger Entry", filters={"voucher_type": doctype, "voucher_no": docname}, fields=["*"]
+	)
+
+
+def get_gl_entries_for_preview(doctype, docname):
+	return frappe.get_all(
+		"GL Entry", filters={"voucher_type": doctype, "voucher_no": docname}, fields=["*"]
+	)
+
+
+def get_columns(raw_columns):
+	return [
+		{"name": d.get("label"), "editable": False, "width": 100}
+		for d in raw_columns
+		if not d.get("hidden")
+	]
+
+
+def get_data(raw_columns, raw_data):
+	datatable_data = []
+	for row in raw_data:
+		data_row = []
+		for column in raw_columns:
+			if not column.get("hidden"):
+				data_row.append(row.get(column.get("fieldname")))
+
+		datatable_data.append(data_row)
+
+	return datatable_data
+
+
 def repost_required_for_queue(doc: StockController) -> bool:
 	"""check if stock document contains repeated item-warehouse with queue based valuation.
 
diff --git a/erpnext/public/js/controllers/stock_controller.js b/erpnext/public/js/controllers/stock_controller.js
index 919ffda..0ef2e6e 100644
--- a/erpnext/public/js/controllers/stock_controller.js
+++ b/erpnext/public/js/controllers/stock_controller.js
@@ -94,24 +94,27 @@
 						"docname": me.frm.doc.name
 					},
 					"callback": function(response) {
-						me.get_datatable(response);
+						console.log(response.message);
+						me.get_datatable(response.message.gl_columns, response.message.gl_data, me.frm.get_field("accounting_ledger_preview_html").wrapper);
+						me.get_datatable(response.message.sl_columns, response.message.sl_data, me.frm.get_field("stock_ledger_preview_html").wrapper);
+						me.frm.scroll_to_field("accounting_ledger_preview_html");
 					}
 				})
 			}, __("View"));
 		}
 	}
 
-	get_datatable(response) {
+	get_datatable(columns, data, wrapper) {
 		const datatable_options = {
-			columns: response.columns,
-			data: response.data,
+			columns: columns,
+			data: data,
 			dynamicRowHeight: true,
 			checkboxColumn: false,
 			inlineFilters: true,
 		};
 
-		this.datatable = new frappe.DataTable(
-			this.frm.page.main.parent,
+		new frappe.DataTable(
+			wrapper,
 			datatable_options
 		);
 	}