filter students on basis of category and button to show fees
diff --git a/erpnext/education/doctype/fee_schedule/fee_schedule.js b/erpnext/education/doctype/fee_schedule/fee_schedule.js
index a36b9cb..c4fff77 100644
--- a/erpnext/education/doctype/fee_schedule/fee_schedule.js
+++ b/erpnext/education/doctype/fee_schedule/fee_schedule.js
@@ -38,9 +38,6 @@
 			if (data.reload && data.reload === 1) {
 				frm.reload_doc();
 			}
-			if (data.progress && data.progress === "0") {
-				frappe.msgprint(__("Fee records will be created in the background. In case of any error the error message will be updated in the Schedule."));
-			}
 			if (data.progress) {
 				let progress_bar = $(cur_frm.dashboard.progress_area).find(".progress-bar");
 				if (progress_bar) {
@@ -74,6 +71,15 @@
 				});
 			}, "fa fa-play", "btn-success");
 		}
+		if (frm.doc.fee_creation_status == "Successful") {
+			frm.add_custom_button(__("View Fees Records"), function() {
+				frappe.route_options = {
+					fee_schedule: frm.doc.name
+				};
+				frappe.set_route("List", "Fees");
+			});
+		}
+
 	},
 
 	fee_structure: function(frm) {
diff --git a/erpnext/education/doctype/fee_schedule/fee_schedule.json b/erpnext/education/doctype/fee_schedule/fee_schedule.json
index a77cc59..5aae690 100644
--- a/erpnext/education/doctype/fee_schedule/fee_schedule.json
+++ b/erpnext/education/doctype/fee_schedule/fee_schedule.json
@@ -4,7 +4,7 @@
  "allow_import": 1, 
  "allow_rename": 0, 
  "autoname": "naming_series:", 
- "beta": 1, 
+ "beta": 0, 
  "creation": "2017-07-18 15:21:21.527136", 
  "custom": 0, 
  "docstatus": 0, 
@@ -1029,7 +1029,7 @@
  "issingle": 0, 
  "istable": 0, 
  "max_attachments": 0, 
- "modified": "2017-12-04 13:08:27.727709", 
+ "modified": "2018-02-26 13:59:36.560780", 
  "modified_by": "Administrator", 
  "module": "Education", 
  "name": "Fee Schedule", 
diff --git a/erpnext/education/doctype/fee_schedule/fee_schedule.py b/erpnext/education/doctype/fee_schedule/fee_schedule.py
index 59acf46..b6df8c5 100644
--- a/erpnext/education/doctype/fee_schedule/fee_schedule.py
+++ b/erpnext/education/doctype/fee_schedule/fee_schedule.py
@@ -56,8 +56,15 @@
 		self.db_set("fee_creation_status", "In Process")
 		frappe.publish_realtime("fee_schedule_progress",
 			{"progress": "0", "reload": 1}, user=frappe.session.user)
-		enqueue(generate_fee, queue='default', timeout=6000, event='generate_fee',
-			fee_schedule=self.name)
+
+		total_records = sum([int(d.total_students) for d in self.student_groups])
+		if total_records > 10:
+			frappe.msgprint(_('''Fee records will be created in the background.
+				In case of any error the error message will be updated in the Schedule.'''))
+			enqueue(generate_fee, queue='default', timeout=6000, event='generate_fee',
+				fee_schedule=self.name)
+		else:
+			generate_fee(self.name)
 
 def generate_fee(fee_schedule):
 	doc = frappe.get_doc("Fee Schedule", fee_schedule)
@@ -69,10 +76,7 @@
 		frappe.throw(_("Please setup Students under Student Groups"))
 
 	for d in doc.student_groups:
-		students = frappe.db.sql(""" select sg.program, sg.batch, sgs.student, sgs.student_name
-			from `tabStudent Group` sg, `tabStudent Group Student` sgs
-			where sg.name=%s and sg.name=sgs.parent and sgs.active=1""", d.student_group, as_dict=1)
-
+		students = get_students(d.student_group, doc.academic_year, doc.academic_term, doc.student_category)
 		for student in students:
 			try:
 				fees_doc = get_mapped_doc("Fee Schedule", fee_schedule,	{
@@ -86,7 +90,7 @@
 				fees_doc.student = student.student
 				fees_doc.student_name = student.student_name
 				fees_doc.program = student.program
-				fees_doc.student_batch = student.batch
+				fees_doc.student_batch = student.student_batch_name
 				fees_doc.send_payment_request = doc.send_email
 				fees_doc.save()
 				fees_doc.submit()
@@ -110,6 +114,30 @@
 		{"progress": "100", "reload": 1}, user=frappe.session.user)
 
 
+def get_students(student_group, academic_year, academic_term=None, student_category=None):
+	conditions = ""
+	if student_category:
+		conditions = " and pe.student_category='{}'".format(frappe.db.escape(student_category))
+	if academic_term:
+		conditions = " and pe.academic_term='{}'".format(frappe.db.escape(academic_term))
+
+	students = frappe.db.sql("""
+		select pe.student, pe.student_name, pe.program, pe.student_batch_name
+		from `tabStudent Group Student` sgs, `tabProgram Enrollment` pe
+		where 
+			pe.student = sgs.student and pe.academic_year = %s
+			and sgs.parent = %s and sgs.active = 1
+			{conditions}
+		""".format(conditions=conditions), (academic_year, student_group), as_dict=1)
+	return students
+
+
+@frappe.whitelist()
+def get_total_students(student_group, academic_year, academic_term=None, student_category=None):
+	total_students = get_students(student_group, academic_year, academic_term, student_category)
+	return len(total_students)
+
+
 @frappe.whitelist()
 def get_fee_structure(source_name,target_doc=None):
 	fee_request = get_mapped_doc("Fee Structure", source_name,
@@ -117,23 +145,3 @@
 			"doctype": "Fee Schedule"
 		}}, ignore_permissions=True)
 	return fee_request
-
-@frappe.whitelist()
-def get_total_students(student_group, academic_year, academic_term=None, student_category=None):
-	conditions = ""
-	if student_category:
-		conditions = " and pe.student_category='{}'".format(frappe.db.escape(student_category))
-	if academic_term:
-		conditions = " and pe.academic_term='{}'".format(frappe.db.escape(academic_term))
-
-
-	return frappe.db.sql("""
-		select count(pe.name)
-		from `tabStudent Group Student` sgs, `tabProgram Enrollment` pe
-		where 
-			pe.student = sgs.student
-			and pe.academic_year = %s
-			and sgs.parent = %s
-			and sgs.active = 1
-			{conditions}
-	""".format(conditions=conditions), (academic_year, student_group))[0][0]