Fix the demo for the schools (#8879)

* Fix the demo for the schools

* Fix for the demo

https://github.com/frappe/erpnext/issues/6347
diff --git a/erpnext/demo/data/assessment_criteria.json b/erpnext/demo/data/assessment_criteria.json
new file mode 100644
index 0000000..8295682
--- /dev/null
+++ b/erpnext/demo/data/assessment_criteria.json
@@ -0,0 +1,18 @@
+[
+	{
+		"doctype": "Assessment Criteria",
+		"assessment_criteria": "Aptitude"
+	},
+	{
+		"doctype": "Assessment Criteria",
+		"assessment_criteria": "Application"
+	},
+	{
+		"doctype": "Assessment Criteria",
+		"assessment_criteria": "Understanding"
+	},
+	{
+		"doctype": "Assessment Criteria",
+		"assessment_criteria": "Knowledge"
+	}
+]
\ No newline at end of file
diff --git a/erpnext/demo/data/grading_scale.json b/erpnext/demo/data/grading_scale.json
new file mode 100644
index 0000000..0760919
--- /dev/null
+++ b/erpnext/demo/data/grading_scale.json
@@ -0,0 +1,17 @@
+[
+	{
+		"doctype": "Grading Scale",
+		"grading_scale_name": "Standard Grading",
+		"description": "Standard Grading Scale",
+		"intervals": [
+			{"threshold": 100.0, "grade_code": "A", "grade_description": "Excellent"},
+			{"threshold": 89.9, "grade_code": "B+", "grade_description": "Close to Excellence"},
+			{"threshold": 80.0, "grade_code": "B", "grade_description": "Good"},
+			{"threshold": 69.9, "grade_code": "C+", "grade_description": "Almost Good"},
+			{"threshold": 60.0, "grade_code": "C", "grade_description": "Average"},
+			{"threshold": 50.0, "grade_code": "D+", "grade_description": "Have to Work"},
+			{"threshold": 40.0, "grade_code": "D", "grade_description": "Not met Baseline Expectations"},
+			{"threshold": 0.0, "grade_code": "F", "grade_description": "Have to work a lot"}
+		]
+	}
+]
\ No newline at end of file
diff --git a/erpnext/demo/data/item_schools.json b/erpnext/demo/data/item_schools.json
index 5eb6082..077fcaa 100644
--- a/erpnext/demo/data/item_schools.json
+++ b/erpnext/demo/data/item_schools.json
@@ -57,6 +57,7 @@
  },
  {
   "is_stock_item": 0,
+  "default_warehouse": "Stores",
   "description": "Computer",
   "item_code": "Computer",
   "item_name": "Computer",
@@ -64,6 +65,7 @@
  },
  {
   "is_stock_item": 0,
+  "default_warehouse": "Stores",
   "description": "Mobile",
   "item_code": "Mobile",
   "item_name": "Mobile",
@@ -71,6 +73,7 @@
  },
  {
   "is_stock_item": 0,
+  "default_warehouse": "Stores",
   "description": "ERP",
   "item_code": "ERP",
   "item_name": "ERP",
@@ -78,6 +81,7 @@
  },
  {
   "is_stock_item": 0,
+  "default_warehouse": "Stores",
   "description": "Autocad",
   "item_code": "Autocad",
   "item_name": "Autocad",
@@ -85,6 +89,7 @@
  },
  {
   "default_warehouse": "Stores",
+  "default_warehouse": "Stores",
   "item_code": "Service",
   "item_group": "Services",
   "item_name": "Service",
diff --git a/erpnext/demo/data/program.json b/erpnext/demo/data/program.json
index 8638311..9c2ec77 100644
--- a/erpnext/demo/data/program.json
+++ b/erpnext/demo/data/program.json
@@ -1,102 +1,46 @@
 [
 	{
 		"doctype": "Program",
+		"name": "MCA",
 		"program_name": "Masters of Computer Applications",
 		"program_code": "MCA",
 		"department": "Information Technology",
 		"courses": [
-			{
-				"course": "Microprocessor",
-				"academic_term": "Semester 1"
-			},
-			{
-				"course": "Probability and Statistics",
-				"academic_term": "Semester 1"
-			},
-			{
-				"course": "Programing in Java",
-				"academic_term": "Semester 2"
-			}
+			{ "course": "MCA4010" },
+			{ "course": "MCA4020" },
+			{ "course": "MCA4030" }
 		]
 	},
 	{
 		"doctype": "Program",
+		"name": "BCA",
 		"program_name": "Bachelor of Computer Applications",
 		"program_code": "BCA",
 		"department": "Information Technology",
 		"courses": [
-			{
-				"course": "Communication Skiils",
-				"academic_term": "Semester 3"
-			},
-			{
-				"course": "Object Oriented Programing - C++",
-				"academic_term": "Semester 3"
-			},
-			{
-				"course": "Basic Mathematics",
-				"academic_term": "Semester 2"
-			},
-			{
-				"course": "Data Structures and Algorithm",
-				"academic_term": "Semester 2"
-			},
-			{
-				"course": "Digital Logic",
-				"academic_term": "Semester 2"
-			},
-			{
-				"course": "Fundamentals of IT & Programing",
-				"academic_term": "Semester 1"
-			},
-			{
-				"course": "Operating System",
-				"academic_term": "Semester 1"
-			},
-			{
-				"course": "Programing in C",
-				"academic_term": "Semester 1"
-			}
+			{ "course": "BCA2030" },
+			{ "course": "BCA1030" },
+			{ "course": "BCA2020" },
+			{ "course": "BCA1040" },
+			{ "course": "BCA1010" },
+			{ "course": "BCA2010" },
+			{ "course": "BCA1020" }
 		]
 	},
 	{
 		"doctype": "Program",
+		"name": "BBA",
 		"program_name": "Bachelor of Business Administration",
 		"program_code": "BBA",
 		"department": "Management Studies",
 		"courses": [
-			{
-				"course": "Organizational Behavior",
-				"academic_term": "Semester 1"
-			},
-			{
-				"course": "Management Development and Skills",
-				"academic_term": "Semester 1"
-			},
-			{
-				"course": "Legal and Regulatory Framework",
-				"academic_term": "Semester 1"
-			},
-			{
-				"course": "Human Resource Management",
-				"academic_term": "Semester 2"
-			},
-			{
-				"course": "Entrepreneurship Management",
-				"academic_term": "Semester 2"
-			},
-			{
-				"course": "Communication Skills",
-				"academic_term": "Semester 2"
-			},
-			{
-				"course": "Business Environment",
-				"academic_term": "Semester 3"
-			},
-			{
-				"course": "Advertising and Sales",
-				"academic_term": "Semester 3"
-			}
+			{ "course": "BBA 101" },
+			{ "course": "BBA 102" },
+			{ "course": "BBA 103" },
+			{ "course": "BBA 301" },
+			{ "course": "BBA 302" },
+			{ "course": "BBA 304" },
+			{ "course": "BBA 505" }
 		]
 	}
 ]
\ No newline at end of file
diff --git a/erpnext/demo/data/student_batch_name.json b/erpnext/demo/data/student_batch_name.json
new file mode 100644
index 0000000..ef3f18d
--- /dev/null
+++ b/erpnext/demo/data/student_batch_name.json
@@ -0,0 +1,10 @@
+[
+	{
+		"doctype": "Student Batch Name",
+		"batch_name": "Section-A"
+	},
+	{
+		"doctype": "Student Batch Name",
+		"batch_name": "Section-B"
+	}
+]
\ No newline at end of file
diff --git a/erpnext/demo/demo.py b/erpnext/demo/demo.py
index aeaa1f0..a270e05 100644
--- a/erpnext/demo/demo.py
+++ b/erpnext/demo/demo.py
@@ -35,6 +35,7 @@
 	frappe.destroy()
 	frappe.init(site)
 	frappe.connect()
+
 	simulate(domain)
 
 def simulate(domain='Manufacturing'):
@@ -73,7 +74,7 @@
 			stock.work()
 			accounts.work()
 			projects.run_projects(current_date)
-			#run_messages()
+			# run_messages()
 
 			if domain=='Manufacturing':
 				sales.work()
diff --git a/erpnext/demo/setup/education.py b/erpnext/demo/setup/education.py
index b164057..a124ee7 100644
--- a/erpnext/demo/setup/education.py
+++ b/erpnext/demo/setup/education.py
@@ -15,6 +15,7 @@
 	make_student_group()
 	make_fees_category()
 	make_fees_structure()
+	make_assessment_groups()
 	frappe.db.commit()
 	frappe.clear_cache()
 
@@ -24,6 +25,9 @@
 	import_json("Instructor")
 	import_json("Course")
 	import_json("Program")
+	import_json("Student Batch Name")
+	import_json("Assessment Criteria")
+	import_json("Grading Scale")
 	frappe.db.commit()
 
 def setup_item():
@@ -81,13 +85,24 @@
 			count+=1
 
 def make_student_group():
-	for d in frappe.db.get_list("Academic Term"):
-		sg_tool = frappe.new_doc("Student Group Creation Tool")
-		sg_tool.academic_year = "2016-17"
-		sg_tool.academic_term = d.name
-		sg_tool.courses = sg_tool.get_courses()
-		sg_tool.create_student_groups()
-		frappe.db.commit()
+	for term in frappe.db.get_list("Academic Term"):
+		for program in frappe.db.get_list("Program"):
+			sg_tool = frappe.new_doc("Student Group Creation Tool")
+			sg_tool.academic_year = "2017-18"
+			sg_tool.academic_term = term.name
+			sg_tool.program = program.name
+			for d in sg_tool.get_courses():
+				d = frappe._dict(d)
+				student_group = frappe.new_doc("Student Group")
+				student_group.student_group_name = d.student_group_name
+				student_group.group_based_on = d.group_based_on
+				student_group.program = program.name
+				student_group.course = d.course
+				student_group.batch = d.batch
+				student_group.academic_term = term.name
+				student_group.academic_year = "2017-18"
+				student_group.save()
+			frappe.db.commit()
 
 def make_fees_category():
 	fee_type = ["Tuition Fee", "Hostel Fee", "Logistics Fee",
@@ -111,7 +126,7 @@
 def make_fees_structure():
 	for d in frappe.db.get_list("Program"):
 		program = frappe.get_doc("Program", d.name)
-		for academic_term in ["Semester 1", "Semester 2", "Semester 3"]:
+		for academic_term in ["2017-18 (Semester 1)", "2017-18 (Semester 2)", "2017-18 (Semester 3)"]:
 			fee_structure = frappe.new_doc("Fee Structure")
 			fee_structure.program = d.name
 			fee_structure.academic_term = random.choice(frappe.db.get_list("Academic Term")).name
@@ -123,6 +138,27 @@
 		program.save()
 	frappe.db.commit()
 
+def make_assessment_groups():
+	for year in frappe.db.get_list("Academic Year"):
+		ag = frappe.new_doc('Assessment Group')
+		ag.assessment_group_name = year.name
+		ag.parent_assessment_group = "All Assessment Groups"
+		ag.is_group = 1
+		ag.insert()
+		for term in frappe.db.get_list("Academic Term", filters = {"academic_year": year.name}):
+			ag1 = frappe.new_doc('Assessment Group')
+			ag1.assessment_group_name = term.name
+			ag1.parent_assessment_group = ag.name
+			ag1.is_group = 1
+			ag1.insert()
+			for assessment_group in ['Term I', 'Term II']:
+				ag2 = frappe.new_doc('Assessment Group')
+				ag2.assessment_group_name = ag1.name + " " + assessment_group
+				ag2.parent_assessment_group = ag1.name
+				ag2.insert()
+	frappe.db.commit()
+
+
 def get_json_path(doctype):
 		return frappe.get_app_path('erpnext', 'demo', 'data', frappe.scrub(doctype) + '.json')
 		
diff --git a/erpnext/demo/user/schools.py b/erpnext/demo/user/schools.py
index 6388f9a..422c31a 100644
--- a/erpnext/demo/user/schools.py
+++ b/erpnext/demo/user/schools.py
@@ -8,30 +8,22 @@
 from frappe.utils import cstr
 from frappe.utils.make_random import get_random
 from datetime import timedelta
-from erpnext.schools.api import get_student_group_students, make_attendance_records, enroll_student, get_fee_schedule, collect_fees
+from erpnext.schools.api import get_student_group_students, make_attendance_records, enroll_student, \
+								get_fee_schedule, collect_fees, get_course
+from erpnext.schools.doctype.program_enrollment.program_enrollment import get_program_courses
+from erpnext.schools.doctype.student_group.student_group import get_students
 
 def work():
 	frappe.set_user(frappe.db.get_global('demo_schools_user'))
 	for d in xrange(20):
 		approve_random_student_applicant()
 		enroll_random_student(frappe.flags.current_date)
-	if frappe.flags.current_date.weekday()== 0:
-		make_course_schedule(frappe.flags.current_date, frappe.utils.add_days(frappe.flags.current_date, 5))	
+	# if frappe.flags.current_date.weekday()== 0:
+	# 	make_course_schedule(frappe.flags.current_date, frappe.utils.add_days(frappe.flags.current_date, 5))	
 	mark_student_attendance(frappe.flags.current_date)
+	# make_assessment_plan()
 	make_fees()
 
-def mark_student_attendance(current_date):
-	status = ["Present", "Absent"]
-	for d in frappe.db.get_list("Course Schedule", filters={"schedule_date": current_date}, fields=("name", "student_group")):
-		students = get_student_group_students(d.student_group)
-		for stud in students:
-			make_attendance_records(stud.student, stud.student_name, d.name, status[weighted_choice([9,4])])
-			
-def make_fees():
-	for d in range(1,10):
-		random_fee = get_random("Fees", {"paid_amount": 0})
-		collect_fees(random_fee, frappe.db.get_value("Fees", random_fee, "outstanding_amount"))
-	
 def approve_random_student_applicant():
 	random_student = get_random("Student Applicant", {"application_status": "Applied"})
 	if random_student:
@@ -39,31 +31,59 @@
 		frappe.db.set_value("Student Applicant", random_student, "application_status", status[weighted_choice([9,3])])
 
 def enroll_random_student(current_date):
+	batch = ["Section-A", "Section-B"]
 	random_student = get_random("Student Applicant", {"application_status": "Approved"})
 	if random_student:
 		enrollment = enroll_student(random_student)
 		enrollment.academic_year = get_random("Academic Year")
 		enrollment.enrollment_date = current_date
+		enrollment.student_batch_name = batch[weighted_choice([9,3])]
 		fee_schedule = get_fee_schedule(enrollment.program)
 		for fee in fee_schedule:
 			enrollment.append("fees", fee)
+		enrolled_courses = get_course(enrollment.program)
+		for course in enrolled_courses:
+			enrollment.append("courses", course)
 		enrollment.submit()
 		frappe.db.commit()
-		assign_student_group(enrollment.student, enrollment.program)
+		assign_student_group(enrollment.student, enrollment.student_name, enrollment.program,
+			enrolled_courses, enrollment.student_batch_name)
 		
-def assign_student_group(student, program):
-	courses = []
-	for d in frappe.get_list("Program Course", fields=("course"), filters={"parent": program }):
-		courses.append(d.course)
+def assign_student_group(student, student_name, program, courses, batch):
+	course_list = [d["course"] for d in courses]
+	for d in frappe.get_list("Student Group", fields=("name"), filters={"program": program, "course":("in", course_list)}):
+		student_group = frappe.get_doc("Student Group", d.name)
+		student_group.append("students", {"student": student, "student_name": student_name,
+			"group_roll_number":len(student_group.students)+1, "active":1})
+		student_group.save()
+	student_batch = frappe.get_list("Student Group", fields=("name"), filters={"program": program, "group_based_on":"Batch", "batch":batch})[0]
+	student_batch_doc = frappe.get_doc("Student Group", student_batch.name)
+	student_batch_doc.append("students", {"student": student, "student_name": student_name,
+		"group_roll_number":len(student_batch_doc.students)+1, "active":1})
+	student_batch_doc.save()
+	frappe.db.commit()
 
-	for d in xrange(3):
-		course = random.choice(courses)
-		random_sg = get_random("Student Group", {"course": course})
-		if random_sg:
-			student_group = frappe.get_doc("Student Group", random_sg)
-			student_group.append("students", {"student": student})
-			student_group.save()
-		courses.remove(course)
+def mark_student_attendance(current_date):
+	status = ["Present", "Absent"]
+	for d in frappe.db.get_list("Student Group", filters={"group_based_on": "Batch"}):
+		students = get_student_group_students(d.name)
+		for stud in students:
+			make_attendance_records(stud.student, stud.student_name, status[weighted_choice([9,4])], None, d.name, current_date)
+			
+def make_fees():
+	for d in range(1,10):
+		random_fee = get_random("Fees", {"paid_amount": 0})
+		collect_fees(random_fee, frappe.db.get_value("Fees", random_fee, "outstanding_amount"))	
+
+def make_assessment_plan(date):
+	for d in range(1,4):
+		random_group = get_random("Student Group", {"group_based_on": "Course"}, True)
+		doc = frappe.new_doc("Assessment Plan")
+		doc.student_group = random_group.name
+		doc.course = random_group.course
+		doc.assessment_group = get_random("Assessment Group", {"is_group": 0, "parent": "2017-18 (Semester 2)"})
+		doc.grading_scale = get_random("Grading Scale")
+		doc.maximum_assessment_score = 100
 		
 def make_course_schedule(start_date, end_date):
 	for d in frappe.db.get_list("Student Group"):
diff --git a/erpnext/schools/api.py b/erpnext/schools/api.py
index 43d2438..db65a69 100644
--- a/erpnext/schools/api.py
+++ b/erpnext/schools/api.py
@@ -10,6 +10,14 @@
 from frappe.utils import flt, cstr
 from frappe.email.doctype.email_group.email_group import add_subscribers
 
+def get_course(program):
+	'''Return list of courses for a particular program
+	:param program: Program
+	'''
+	courses = frappe.db.sql('''select course, course_name from `tabProgram Course` where parent=%s''',
+			(program), as_dict=1)
+	return courses
+
 @frappe.whitelist()
 def enroll_student(source_name):
 	"""Creates a Student Record and returns a Program Enrollment.