feat: added auto course enrollment for enrolled programs
diff --git a/erpnext/education/utils.py b/erpnext/education/utils.py
index 53f02f5..96fb4ee 100644
--- a/erpnext/education/utils.py
+++ b/erpnext/education/utils.py
@@ -179,7 +179,7 @@
 	return bool(roles & {'Administrator', 'Instructor', 'Education Manager', 'System Manager', 'Academic User'})
 
 @frappe.whitelist()
-def add_activity(course, content_type, content):
+def add_activity(course, content_type, content, program):
 	if has_super_access():
 		return None
 
@@ -187,18 +187,14 @@
 	if not student:
 		return frappe.throw("Student with email {0} does not exist".format(frappe.session.user), frappe.DoesNotExistError)
 
-	course_enrollment = get_enrollment("course", course, student.name)
-	if not course_enrollment:
-		return None
-
-	enrollment = frappe.get_doc('Course Enrollment', course_enrollment)
+	enrollment = get_or_create_course_enrollment(course, program)
 	if content_type == 'Quiz':
 		return
 	else:
 		return enrollment.add_activity(content_type, content)
 
 @frappe.whitelist()
-def evaluate_quiz(quiz_response, quiz_name, course):
+def evaluate_quiz(quiz_response, quiz_name, course, program):
 	import json
 
 	student = get_current_student()
@@ -211,16 +207,12 @@
 		return {'result': result, 'score': score, 'status': status}
 
 	if student:
-		course_enrollment = get_enrollment("course", course, student.name)
-		if course_enrollment:
-			enrollment = frappe.get_doc('Course Enrollment', course_enrollment)
-			if quiz.allowed_attempt(enrollment, quiz_name):
-				enrollment.add_quiz_activity(quiz_name, quiz_response, result, score, status)
-				return {'result': result, 'score': score, 'status': status}
-			else:
-				return None
+		enrollment = get_or_create_course_enrollment(course, program)
+		if quiz.allowed_attempt(enrollment, quiz_name):
+			enrollment.add_quiz_activity(quiz_name, quiz_response, result, score, status)
+			return {'result': result, 'score': score, 'status': status}
 		else:
-			frappe.throw("Something went wrong. Pleae contact the administrator.")
+			return None
 
 @frappe.whitelist()
 def get_quiz(quiz_name, course):
@@ -261,9 +253,17 @@
 	student.save(ignore_permissions=True)
 	return student
 
-def enroll_in_course(course_name, program_name):
+def get_or_create_course_enrollment(course, program):
 	student = get_current_student()
-	return student.enroll_in_course(course_name=course_name, program_enrollment=get_program_enrollment(program_name))
+	course_enrollment = get_enrollment("course", course, student.name)
+	if not course_enrollment:
+		program_enrollment = get_enrollment('program', program, student.name)
+		if not program_enrollment:
+			frappe.throw("You are not enrolled in program {0}".format(program))
+			return
+		return student.enroll_in_course(course_name=course, program_enrollment=get_enrollment('program', program, student.name))
+	else:
+		return frappe.get_doc('Course Enrollment', course_enrollment)
 
 def check_content_completion(content_name, content_type, enrollment_name):
 	activity = frappe.get_all("Course Activity", filters={'enrollment': enrollment_name, 'content_type': content_type, 'content': content_name})
diff --git a/erpnext/public/js/education/lms/quiz.js b/erpnext/public/js/education/lms/quiz.js
index f6dc4d0..1b520eb 100644
--- a/erpnext/public/js/education/lms/quiz.js
+++ b/erpnext/public/js/education/lms/quiz.js
@@ -63,7 +63,8 @@
 		frappe.call('erpnext.education.utils.evaluate_quiz', {
 			quiz_name: this.name,
 			quiz_response: this.get_selected(),
-			course: this.course
+			course: this.course,
+			program: this.program
 		}).then(res => {
 			this.submit_btn.remove()
 			if (!res.message) {
diff --git a/erpnext/www/lms/content.html b/erpnext/www/lms/content.html
index 41f27f3..acdc54d 100644
--- a/erpnext/www/lms/content.html
+++ b/erpnext/www/lms/content.html
@@ -144,6 +144,7 @@
 				const quiz = new Quiz(document.getElementById('quiz-wrapper'), {
 					name: '{{ content.name }}',
 					course: '{{ course }}',
+					program: '{{ program }}',
 					quiz_exit_button: quiz_exit_button,
 					next_url: next_url
 				})
@@ -165,7 +166,8 @@
 				args: {
 					course: "{{ course }}",
 					content_type: "{{ content_type }}",
-					content: "{{ content.name }}"
+					content: "{{ content.name }}",
+					program: "{{ program }}"
 				}
 			}
 			frappe.call(opts).then(res => {