Fixes related to schools fees
diff --git a/erpnext/schools/doctype/fee_schedule/fee_schedule.js b/erpnext/schools/doctype/fee_schedule/fee_schedule.js
index 952a4f6..d834b88 100644
--- a/erpnext/schools/doctype/fee_schedule/fee_schedule.js
+++ b/erpnext/schools/doctype/fee_schedule/fee_schedule.js
@@ -62,10 +62,8 @@
if (frm.doc.fee_creation_status=="In Process") {
frm.dashboard.add_progress("Fee Creation Status", "0");
}
- if (!frm.doc.__islocal && !frm.doc.fee_creation_status || frm.doc.fee_creation_status == "Failed") {
+ if (frm.doc.docstatus==1 && !frm.doc.fee_creation_status || frm.doc.fee_creation_status == "Failed") {
frm.add_custom_button(__('Create Fees'), function() {
- frm.doc.fee_creation_status = "In Process";
- frm.save();
frappe.call({
method: "create_fees",
doc: frm.doc,
@@ -75,9 +73,6 @@
});
}, "fa fa-play", "btn-success");
}
- if (frm.doc.fee_creation_status==="Successful") {
- frm.set_read_only();
- }
},
fee_structure: function(frm) {
@@ -104,6 +99,8 @@
method: "erpnext.schools.doctype.fee_schedule.fee_schedule.get_total_students",
args: {
"student_group": row.student_group,
+ "academic_year": frm.doc.academic_year,
+ "academic_term": frm.doc.academic_term,
"student_category": frm.doc.student_category
},
callback: function(r) {
diff --git a/erpnext/schools/doctype/fee_schedule/fee_schedule.json b/erpnext/schools/doctype/fee_schedule/fee_schedule.json
index 2b496af..d2b5c52 100644
--- a/erpnext/schools/doctype/fee_schedule/fee_schedule.json
+++ b/erpnext/schools/doctype/fee_schedule/fee_schedule.json
@@ -1,7 +1,7 @@
{
"allow_copy": 0,
"allow_guest_to_view": 0,
- "allow_import": 0,
+ "allow_import": 1,
"allow_rename": 0,
"autoname": "naming_series:",
"beta": 1,
@@ -151,7 +151,7 @@
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
- "label": "Send Email",
+ "label": "Send Payment Request Email",
"length": 0,
"no_copy": 0,
"permlevel": 0,
@@ -1025,11 +1025,11 @@
"idx": 0,
"image_view": 0,
"in_create": 0,
- "is_submittable": 0,
+ "is_submittable": 1,
"issingle": 0,
"istable": 0,
"max_attachments": 0,
- "modified": "2017-09-12 02:03:37.062064",
+ "modified": "2017-09-19 16:24:17.266071",
"modified_by": "Administrator",
"module": "Schools",
"name": "Fee Schedule",
@@ -1037,23 +1037,23 @@
"owner": "Administrator",
"permissions": [
{
- "amend": 0,
+ "amend": 1,
"apply_user_permissions": 0,
- "cancel": 0,
+ "cancel": 1,
"create": 1,
"delete": 1,
"email": 1,
- "export": 0,
+ "export": 1,
"if_owner": 0,
- "import": 0,
+ "import": 1,
"permlevel": 0,
"print": 1,
"read": 1,
- "report": 0,
+ "report": 1,
"role": "Academics User",
"set_user_permissions": 0,
"share": 1,
- "submit": 0,
+ "submit": 1,
"write": 1
}
],
diff --git a/erpnext/schools/doctype/fee_schedule/fee_schedule.py b/erpnext/schools/doctype/fee_schedule/fee_schedule.py
index b2ee260..fc2907a 100644
--- a/erpnext/schools/doctype/fee_schedule/fee_schedule.py
+++ b/erpnext/schools/doctype/fee_schedule/fee_schedule.py
@@ -3,7 +3,7 @@
# For license information, please see license.txt
from __future__ import unicode_literals
-import frappe
+import frappe, erpnext
from frappe.model.document import Document
from frappe.model.mapper import get_mapped_doc
from frappe.utils import money_in_words
@@ -17,13 +17,19 @@
self.set_onload('dashboard_info', info)
def get_dashboard_info(self):
- total_unpaid = frappe.db.sql("""select sum(outstanding_amount) from tabFees
- where fee_schedule=%s""", (self.name))
- total_unpaid_amount = flt(total_unpaid[0][0]) if total_unpaid else 0
- info = {}
- info["total_paid"] = self.grand_total - total_unpaid_amount
- info["total_unpaid"] = total_unpaid_amount
- info["currency"] = frappe.defaults.get_defaults().currency
+ info = {
+ "total_paid": 0,
+ "total_unpaid": 0,
+ "currency": erpnext.get_company_currency(self.company)
+ }
+
+ fees_amount = frappe.db.sql("""select sum(grand_total), sum(outstanding_amount) from tabFees
+ where fee_schedule=%s and docstatus=1""", (self.name))
+
+ if fees_amount:
+ info["total_paid"] = flt(fees_amount[0][0]) - flt(fees_amount[0][1])
+ info["total_unpaid"] = flt(fees_amount[0][1])
+
return info
def validate(self):
@@ -33,16 +39,18 @@
no_of_students = 0
for d in self.student_groups:
# if not d.total_students:
- d.total_students = get_total_students(d.student_group, self.student_category)
+ d.total_students = get_total_students(d.student_group, self.academic_year,
+ self.academic_term, self.student_category)
no_of_students += cint(d.total_students)
self.grand_total = no_of_students*self.total_amount
self.grand_total_in_words = money_in_words(self.grand_total)
def create_fees(self):
- if self.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)
+ 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)
def generate_fee(fee_schedule):
doc = frappe.get_doc("Fee Schedule", fee_schedule)
@@ -87,7 +95,8 @@
frappe.db.set_value("Fee Schedule", fee_schedule, "fee_creation_status", "Successful")
frappe.db.set_value("Fee Schedule", fee_schedule, "error_log", None)
- frappe.publish_realtime("fee_schedule_progress", {"progress": "100", "reload": 1}, user=frappe.session.user)
+ frappe.publish_realtime("fee_schedule_progress",
+ {"progress": "100", "reload": 1}, user=frappe.session.user)
@frappe.whitelist()
@@ -99,17 +108,21 @@
return fee_request
@frappe.whitelist()
-def get_total_students(student_group, student_category=None):
+def get_total_students(student_group, academic_year, academic_term=None, student_category=None):
conditions = ""
if student_category:
- conditions = " and s.student_category='{}'".format(frappe.db.escape(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(s.name)
- from `tabStudent` s, `tabStudent Group Student` sgs
+ select count(pe.name)
+ from `tabStudent Group Student` sgs, `tabProgram Enrollment` pe
where
- s.name = sgs.student
+ pe.student = sgs.student
+ and pe.academic_year = %s
and sgs.parent = %s
and sgs.active = 1
{conditions}
- """.format(conditions=conditions), student_group)[0][0]
+ """.format(conditions=conditions), (academic_year, student_group))[0][0]
diff --git a/erpnext/schools/doctype/fees/fees.js b/erpnext/schools/doctype/fees/fees.js
index 45d30d4..4347308 100644
--- a/erpnext/schools/doctype/fees/fees.js
+++ b/erpnext/schools/doctype/fees/fees.js
@@ -4,8 +4,6 @@
frappe.ui.form.on("Fees", {
setup: function(frm) {
- frm.add_fetch("student", "title", "student_name");
- frm.add_fetch("student", "student_email_id", "student_email");
frm.add_fetch("fee_structure", "receivable_account", "receivable_account");
frm.add_fetch("fee_structure", "income_account", "income_account");
frm.add_fetch("fee_structure", "cost_center", "cost_center");
diff --git a/erpnext/schools/doctype/fees/fees.json b/erpnext/schools/doctype/fees/fees.json
index 8286048..7a2167b 100644
--- a/erpnext/schools/doctype/fees/fees.json
+++ b/erpnext/schools/doctype/fees/fees.json
@@ -93,6 +93,7 @@
"label": "Student Name",
"length": 0,
"no_copy": 0,
+ "options": "student.student_name",
"permlevel": 0,
"precision": "",
"print_hide": 0,
@@ -142,37 +143,6 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
- "default": "",
- "fieldname": "send_payment_request",
- "fieldtype": "Check",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Send Payment Request",
- "length": 0,
- "no_copy": 1,
- "permlevel": 0,
- "precision": "",
- "print_hide": 1,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
"default": "0",
"fieldname": "include_payment",
"fieldtype": "Check",
@@ -204,6 +174,37 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
+ "default": "",
+ "fieldname": "send_payment_request",
+ "fieldtype": "Check",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "Send Payment Request",
+ "length": 0,
+ "no_copy": 1,
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 1,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
"fieldname": "column_break_4",
"fieldtype": "Column Break",
"hidden": 0,
@@ -505,13 +506,14 @@
},
{
"allow_bulk_edit": 0,
- "allow_on_submit": 0,
+ "allow_on_submit": 1,
"bold": 0,
"collapsible": 0,
"columns": 0,
+ "depends_on": "",
"fieldname": "student_email",
"fieldtype": "Data",
- "hidden": 1,
+ "hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
@@ -526,7 +528,7 @@
"precision": "",
"print_hide": 1,
"print_hide_if_no_value": 0,
- "read_only": 1,
+ "read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
@@ -1274,7 +1276,7 @@
"istable": 0,
"max_attachments": 0,
"menu_index": 0,
- "modified": "2017-09-11 16:04:35.725204",
+ "modified": "2017-09-19 16:45:14.313744",
"modified_by": "Administrator",
"module": "Schools",
"name": "Fees",
diff --git a/erpnext/schools/doctype/fees/fees.py b/erpnext/schools/doctype/fees/fees.py
index 2ce115b..d45d6e3 100644
--- a/erpnext/schools/doctype/fees/fees.py
+++ b/erpnext/schools/doctype/fees/fees.py
@@ -4,14 +4,13 @@
from __future__ import unicode_literals
from frappe.model.document import Document
-import frappe
+import frappe, erpnext
from frappe import _
from frappe.utils import money_in_words
from erpnext.accounts.doctype.payment_request.payment_request import make_payment_request
from frappe.utils.csvutils import getlink
from erpnext.controllers.accounts_controller import AccountsController
from erpnext.accounts.general_ledger import delete_gl_entries
-from erpnext.schools.api import get_student_guardians
class Fees(AccountsController):
@@ -32,10 +31,11 @@
if not self.company:
self.company = frappe.defaults.get_defaults().company
if not self.currency:
- self.currency = frappe.defaults.get_defaults().currency
+ self.currency = erpnext.get_company_currency(self.company)
if not (self.receivable_account and self.income_account and self.cost_center):
- accounts_details = frappe.get_all("Company", fields=["default_receivable_account",
- "default_income_account", "cost_center"], filters={"name": self.company})[0]
+ accounts_details = frappe.get_all("Company",
+ fields=["default_receivable_account", "default_income_account", "cost_center"],
+ filters={"name": self.company})[0]
if not self.receivable_account:
self.receivable_account = accounts_details.default_receivable_account
if not self.income_account:
@@ -46,13 +46,14 @@
self.student_email = self.get_student_emails()
def get_student_emails(self):
- guardians = get_student_guardians(self.student)
- email_list = []
- for guardian in guardians:
- email = frappe.db.get_value("Guardian", guardian.guardian, "email_address")
- if email:
- email_list.append(email)
- return ", ".join(email_list)
+ student_emails = frappe.db.sql_list("""
+ select g.email_address
+ from `tabGuardian` g, `tabStudent Guardian` sg
+ where g.name = sg.guardian and sg.parent = %s and sg.parenttype = 'Student'
+ """, self.student)
+
+ student_emails.append(frappe.db.get_value("Student", self.student, "student_email_id"))
+ return ", ".join(list(set(student_emails)))
def calculate_total(self):