fix: Add items belonging to Product Bundles as children
diff --git a/erpnext/accounts/report/gross_profit/gross_profit.py b/erpnext/accounts/report/gross_profit/gross_profit.py
index 549c668..87053a0 100644
--- a/erpnext/accounts/report/gross_profit/gross_profit.py
+++ b/erpnext/accounts/report/gross_profit/gross_profit.py
@@ -375,6 +375,10 @@
 				sales_team_table=sales_team_table, match_cond = get_match_cond('Sales Invoice')), self.filters, as_dict=1)
 
 	def group_items_by_invoice(self):
+		"""
+			Turns list of Sales Invoice Items to a tree of Sales Invoices with their Items as children.
+		"""
+
 		parents = []
 
 		for row in self.si_list:
@@ -386,15 +390,14 @@
 			if parents_index < len(parents) and row.parent == parents[parents_index]:
 				invoice = frappe._dict({
 					'parent_invoice': "",
-					'parent': row.parent,
 					'indent': 0.0,
+					'parent': row.parent,
 					'posting_date': row.posting_date,
 					'posting_time': row.posting_time,
 					'project': row.project,
 					'update_stock': row.update_stock,
 					'customer': row.customer,
 					'customer_group': row.customer_group,
-					'customer_group': row.customer_group,
 					'item_code': None,
 					'item_name': None,
 					'description': None,
@@ -407,21 +410,60 @@
 					'item_row': None, 
 					'is_return': row.is_return, 
 					'cost_center': row.cost_center,
-					'base_net_amount': 0,
-					'indent': 0.0,
-					'parent_invoice': ''
+					'base_net_amount': 0
 				})
 
 				self.si_list.insert(index, invoice)
 				parents_index += 1
 
 			else:
-				row.indent = 1.0
-				row.parent_invoice = row.parent
-				row.parent = row.item_code
+				# skipping the bundle items rows
+				if not row.indent:
+					row.indent = 1.0
+					row.parent_invoice = row.parent
+					row.parent = row.item_code
+
 				# ind = parents_index-1 if parents_index > 0 else parents_index
 				# self.si_list[ind].base_net_amount += row.base_net_amount
 
+				if frappe.db.exists('Product Bundle', row.item_code):
+					self.add_bundle_items(row, index)
+
+	def add_bundle_items(self, product_bundle, index):
+		bundle_items = frappe.get_all(
+			'Product Bundle Item',
+			filters = {
+				'parent': product_bundle.item_code
+			},
+			fields = ['item_code', 'qty']
+		)
+
+		for i, item in enumerate(bundle_items):
+			bundle_item = frappe._dict({
+				'parent_invoice': product_bundle.item_code,
+				'indent': product_bundle.indent + 1,
+				'parent': item.item_code,
+				'posting_date': product_bundle.posting_date,
+				'posting_time': product_bundle.posting_time,
+				'project': product_bundle.project,
+				'customer': product_bundle.customer,
+				'customer_group': product_bundle.customer_group,
+				'item_code': item.item_code,
+				'item_name': frappe.db.get_value('Item', item.item_code, 'item_name'),
+				'description': frappe.db.get_value('Item', item.item_code, 'description'),
+				'warehouse': product_bundle.warehouse,
+				'item_group': frappe.db.get_value('Item', item.item_code, 'item_group'),
+				'brand': frappe.db.get_value('Item', item.item_code, 'brand'), 
+				'dn_detail': product_bundle.dn_detail, 
+				'delivery_note': product_bundle.delivery_note, 
+				'qty': (product_bundle.qty * item.qty), 
+				'item_row': None, 
+				'is_return': product_bundle.is_return, 
+				'cost_center': product_bundle.cost_center
+			})
+
+			self.si_list.insert((index+i+1), bundle_item)
+
 	def load_stock_ledger_entries(self):
 		res = frappe.db.sql("""select item_code, voucher_type, voucher_no,
 				voucher_detail_no, stock_value, warehouse, actual_qty as qty