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,