fix: academic term and year date validations
diff --git a/erpnext/education/doctype/program_enrollment/program_enrollment.js b/erpnext/education/doctype/program_enrollment/program_enrollment.js
index e3b3e9f..5e1635d 100644
--- a/erpnext/education/doctype/program_enrollment/program_enrollment.js
+++ b/erpnext/education/doctype/program_enrollment/program_enrollment.js
@@ -2,16 +2,24 @@
 // For license information, please see license.txt
 
 
-frappe.ui.form.on("Program Enrollment", {
+frappe.ui.form.on('Program Enrollment', {
 	setup: function(frm) {
 		frm.add_fetch('fee_structure', 'total_amount', 'amount');
 	},
 
-	onload: function(frm, cdt, cdn){
-		frm.set_query("academic_term", "fees", function(){
-			return{
-				"filters":{
-					"academic_year": (frm.doc.academic_year)
+	onload: function(frm) {
+		frm.set_query('academic_term', function() {
+			return {
+				'filters':{
+					'academic_year': (frm.doc.academic_year)
+				}
+			};
+		});
+
+		frm.set_query('academic_term', 'fees', function() {
+			return {
+				'filters':{
+					'academic_year': (frm.doc.academic_year)
 				}
 			};
 		});
@@ -24,9 +32,9 @@
 		};
 
 		if (frm.doc.program) {
-			frm.set_query("course", "courses", function(doc, cdt, cdn) {
-				return{
-					query: "erpnext.education.doctype.program_enrollment.program_enrollment.get_program_courses",
+			frm.set_query('course', 'courses', function(doc, cdt, cdn) {
+				return {
+					query: 'erpnext.education.doctype.program_enrollment.program_enrollment.get_program_courses',
 					filters: {
 						'program': frm.doc.program
 					}
@@ -34,9 +42,9 @@
 			});
 		}
 
-		frm.set_query("student", function() {
+		frm.set_query('student', function() {
 			return{
-				query: "erpnext.education.doctype.program_enrollment.program_enrollment.get_students",
+				query: 'erpnext.education.doctype.program_enrollment.program_enrollment.get_students',
 				filters: {
 					'academic_year': frm.doc.academic_year,
 					'academic_term': frm.doc.academic_term
@@ -49,14 +57,14 @@
 		frm.events.get_courses(frm);
 		if (frm.doc.program) {
 			frappe.call({
-				method: "erpnext.education.api.get_fee_schedule",
+				method: 'erpnext.education.api.get_fee_schedule',
 				args: {
-					"program": frm.doc.program,
-					"student_category": frm.doc.student_category
+					'program': frm.doc.program,
+					'student_category': frm.doc.student_category
 				},
 				callback: function(r) {
 					if(r.message) {
-						frm.set_value("fees" ,r.message);
+						frm.set_value('fees' ,r.message);
 						frm.events.get_courses(frm);
 					}
 				}
@@ -65,17 +73,17 @@
 	},
 
 	student_category: function() {
-		frappe.ui.form.trigger("Program Enrollment", "program");
+		frappe.ui.form.trigger('Program Enrollment', 'program');
 	},
 
 	get_courses: function(frm) {
-		frm.set_value("courses",[]);
+		frm.set_value('courses',[]);
 		frappe.call({
-			method: "get_courses",
+			method: 'get_courses',
 			doc:frm.doc,
 			callback: function(r) {
 				if(r.message) {
-					frm.set_value("courses", r.message);
+					frm.set_value('courses', r.message);
 				}
 			}
 		})
@@ -84,10 +92,10 @@
 
 frappe.ui.form.on('Program Enrollment Course', {
 	courses_add: function(frm){
-		frm.fields_dict['courses'].grid.get_field('course').get_query = function(doc){
+		frm.fields_dict['courses'].grid.get_field('course').get_query = function(doc) {
 			var course_list = [];
 			if(!doc.__islocal) course_list.push(doc.name);
-			$.each(doc.courses, function(idx, val){
+			$.each(doc.courses, function(_idx, val) {
 				if (val.course) course_list.push(val.course);
 			});
 			return { filters: [['Course', 'name', 'not in', course_list]] };
diff --git a/erpnext/education/doctype/program_enrollment/program_enrollment.py b/erpnext/education/doctype/program_enrollment/program_enrollment.py
index 28767f8..d676c25 100644
--- a/erpnext/education/doctype/program_enrollment/program_enrollment.py
+++ b/erpnext/education/doctype/program_enrollment/program_enrollment.py
@@ -7,12 +7,14 @@
 from frappe import msgprint, _
 from frappe.model.document import Document
 from frappe.desk.reportview import get_match_cond, get_filters_cond
-from frappe.utils import comma_and
+from frappe.utils import comma_and, get_link_to_form, getdate
 import erpnext.www.lms as lms
 
 class ProgramEnrollment(Document):
 	def validate(self):
 		self.validate_duplication()
+		self.validate_academic_year()
+		self.validate_academic_term()
 		if not self.student_name:
 			self.student_name = frappe.db.get_value("Student", self.student, "title")
 		if not self.courses:
@@ -23,6 +25,28 @@
 		self.make_fee_records()
 		self.create_course_enrollments()
 
+	def validate_academic_year(self):
+		start_date, end_date = frappe.db.get_value("Academic Year", self.academic_year, ["year_start_date", "year_end_date"])
+		if self.enrollment_date:
+			if start_date and getdate(self.enrollment_date) < getdate(start_date):
+				frappe.throw(_("Enrollment Date cannot be before the Start Date of the Academic Year {0}").format(
+					get_link_to_form("Academic Year", self.academic_year)))
+
+			if end_date and getdate(self.enrollment_date) > getdate(end_date):
+				frappe.throw(_("Enrollment Date cannot be after the End Date of the Academic Term {0}").format(
+					get_link_to_form("Academic Year", self.academic_year)))
+
+	def validate_academic_term(self):
+		start_date, end_date = frappe.db.get_value("Academic Term", self.academic_term, ["term_start_date", "term_end_date"])
+		if self.enrollment_date:
+			if start_date and getdate(self.enrollment_date) < getdate(start_date):
+				frappe.throw(_("Enrollment Date cannot be before the Start Date of the Academic Term {0}").format(
+					get_link_to_form("Academic Term", self.academic_term)))
+
+			if end_date and getdate(self.enrollment_date) > getdate(end_date):
+				frappe.throw(_("Enrollment Date cannot be after the End Date of the Academic Term {0}").format(
+					get_link_to_form("Academic Term", self.academic_term)))
+
 	def validate_duplication(self):
 		enrollment = frappe.get_all("Program Enrollment", filters={
 			"student": self.student,