minor changes
diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.py b/erpnext/accounts/doctype/payment_entry/payment_entry.py
index e663983..c93e5f9 100644
--- a/erpnext/accounts/doctype/payment_entry/payment_entry.py
+++ b/erpnext/accounts/doctype/payment_entry/payment_entry.py
@@ -212,18 +212,16 @@
self.validate_journal_entry()
if d.reference_doctype in ("Sales Invoice", "Purchase Invoice", "Expense Claim", "Fees"):
- if self.party_type in ("Customer", "Student"):
+ if self.party_type == "Customer":
ref_party_account = ref_doc.debit_to
+ elif self.party_type == "Student":
+ ref_party_account = ref_doc.receivable_account
elif self.party_type=="Supplier":
ref_party_account = ref_doc.credit_to
elif self.party_type=="Employee":
ref_party_account = ref_doc.payable_account
- if d.reference_doctype in ("Sales Invoice", "Purchase Invoice", "Fees"):
- ref_party_account = ref_doc.debit_to \
- if self.party_type in ("Customer", "Student") else ref_doc.credit_to
-
- if ref_party_account != self.party_account:
+ if ref_party_account != self.party_account:
frappe.throw(_("{0} {1} is associated with {2}, but Party Account is {3}")
.format(d.reference_doctype, d.reference_name, ref_party_account, self.party_account))
@@ -695,10 +693,12 @@
party_type = "Student"
# party account
- if dt in ("Sales Invoice", "Fees"):
+ if dt == "Sales Invoice":
party_account = doc.debit_to
elif dt == "Purchase Invoice":
party_account = doc.credit_to
+ elif dt == "Fees":
+ party_account = doc.receivable_account
else:
party_account = get_party_account(party_type, doc.get(party_type.lower()), doc.company)
diff --git a/erpnext/schools/doctype/fee_component/fee_component.json b/erpnext/schools/doctype/fee_component/fee_component.json
index da659fa..ccf1f65 100644
--- a/erpnext/schools/doctype/fee_component/fee_component.json
+++ b/erpnext/schools/doctype/fee_component/fee_component.json
@@ -51,6 +51,36 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
+ "fieldname": "description",
+ "fieldtype": "Small Text",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 1,
+ "in_standard_filter": 0,
+ "label": "Description",
+ "length": 0,
+ "no_copy": 0,
+ "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_2",
"fieldtype": "Column Break",
"hidden": 0,
@@ -107,36 +137,6 @@
"set_only_once": 0,
"unique": 0,
"width": "300px"
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "description",
- "fieldtype": "Small Text",
- "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": "Description",
- "length": 0,
- "no_copy": 0,
- "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
}
],
"has_web_view": 0,
@@ -150,7 +150,7 @@
"issingle": 0,
"istable": 1,
"max_attachments": 0,
- "modified": "2017-07-18 15:03:18.945746",
+ "modified": "2017-09-11 16:48:07.810959",
"modified_by": "Administrator",
"module": "Schools",
"name": "Fee Component",
diff --git a/erpnext/schools/doctype/fee_schedule/fee_schedule.js b/erpnext/schools/doctype/fee_schedule/fee_schedule.js
index 757355d..5eba62d 100644
--- a/erpnext/schools/doctype/fee_schedule/fee_schedule.js
+++ b/erpnext/schools/doctype/fee_schedule/fee_schedule.js
@@ -3,10 +3,39 @@
frappe.ui.form.on('Fee Schedule', {
setup: function(frm) {
- frm.add_fetch("fee_structure", "default_receivable_account", "debit_to");
- frm.add_fetch("fee_structure", "default_income_account", "against_income_account");
+ 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");
+ frappe.realtime.on("fee_schedule_progress", function(data) {
+ if (data.progress && data.progress === 0) {
+ frappe.msgprint(__("Fee records will be created in the background. In case of any error the error message will be updated in the Schedule."));
+ }
+ if (data.progress) {
+ frm.reload_doc();
+ frm.dashboard.add_progress("Fee Creation Status", data.progress);
+ }
+ });
+ },
+ onload: function(frm) {
+ frm.set_query("receivable_account", function(doc) {
+ return {
+ filters: {
+ 'account_type': 'Receivable',
+ 'is_group': 0,
+ 'company': doc.company
+ }
+ };
+ });
+ frm.set_query("income_account", function(doc) {
+ return {
+ filters: {
+ 'account_type': 'Income Account',
+ 'is_group': 0,
+ 'company': doc.company
+ }
+ };
+ });
frm.set_query("student_group", "student_groups", function() {
return {
"program": frm.doc.program,
@@ -24,7 +53,8 @@
frm.dashboard.add_indicator(__('Total Outstanding: {0}', [format_currency(info.total_unpaid,
info.currency)]), info.total_unpaid ? 'orange' : 'green');
}
- if (!frm.doc.fee_creation_status || frm.doc.fee_creation_status == "Failed") {
+
+ if (!frm.doc.__islocal && !frm.doc.fee_creation_status || frm.doc.fee_creation_status == "Failed") {
frm.add_custom_button(__('Create Fees'), function() {
frappe.call({
method: "create_fees",
diff --git a/erpnext/schools/doctype/fee_schedule/fee_schedule.json b/erpnext/schools/doctype/fee_schedule/fee_schedule.json
index 7215603..8dd51f7 100644
--- a/erpnext/schools/doctype/fee_schedule/fee_schedule.json
+++ b/erpnext/schools/doctype/fee_schedule/fee_schedule.json
@@ -142,6 +142,36 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
+ "fieldname": "send_email",
+ "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 Email",
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "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,
@@ -749,7 +779,7 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
- "fieldname": "debit_to",
+ "fieldname": "receivable_account",
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
@@ -758,7 +788,7 @@
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
- "label": "Academic Receivable Account",
+ "label": "Receivable Account",
"length": 0,
"no_copy": 0,
"options": "Account",
@@ -780,7 +810,7 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
- "fieldname": "against_income_account",
+ "fieldname": "income_account",
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
@@ -999,7 +1029,7 @@
"issingle": 0,
"istable": 0,
"max_attachments": 0,
- "modified": "2017-09-07 12:36:02.678355",
+ "modified": "2017-09-11 16:57:27.427777",
"modified_by": "Administrator",
"module": "Schools",
"name": "Fee Schedule",
diff --git a/erpnext/schools/doctype/fee_schedule/fee_schedule.py b/erpnext/schools/doctype/fee_schedule/fee_schedule.py
index 822a62d..1b2299c 100644
--- a/erpnext/schools/doctype/fee_schedule/fee_schedule.py
+++ b/erpnext/schools/doctype/fee_schedule/fee_schedule.py
@@ -42,14 +42,15 @@
def create_fees(self):
if not self.fee_creation_status or self.fee_creation_status == "Failed":
self.fee_creation_status = "In Process"
+ frappe.publish_realtime("fee_schedule_progress", {"progress": 0, "reload": True}, user=frappe.session.user)
enqueue(generate_fee, queue='default', timeout=6000, event='generate_fee',
fee_schedule=self.name)
- frappe.msgprint(_("Fee records will be created in the background. In case of any error, the error message will be updated in the Schedule, check after refresh in 5 minutes."))
-
def generate_fee(fee_schedule):
doc = frappe.get_doc("Fee Schedule", fee_schedule)
error = False
+ total_records = sum([int(d.total_students) for d in doc.student_groups])
+ created_records = 0
for d in doc.student_groups:
try:
students = frappe.db.sql(""" select sg.program, sg.batch, sgs.student, sgs.student_name
@@ -74,6 +75,9 @@
doc.send_payment_request = 1
doc.save()
doc.submit()
+ created_records += 1
+ frappe.publish_realtime("fee_schedule_progress", {"progress": created_records}, user=frappe.session.user)
+
except Exception as e:
error = True
err_msg = frappe.local.message_log and "\n\n".join(frappe.local.message_log) or cstr(e)
diff --git a/erpnext/schools/doctype/fee_structure/fee_structure.js b/erpnext/schools/doctype/fee_structure/fee_structure.js
index 78b8588..300bdc8 100644
--- a/erpnext/schools/doctype/fee_structure/fee_structure.js
+++ b/erpnext/schools/doctype/fee_structure/fee_structure.js
@@ -1,13 +1,15 @@
// Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and contributors
// For license information, please see license.txt
-cur_frm.add_fetch("company", "default_receivable_account", "debit_to");
-cur_frm.add_fetch("company", "default_income_account", "against_income_account");
-cur_frm.add_fetch("company", "cost_center", "cost_center");
-
frappe.ui.form.on('Fee Structure', {
+ setup: function(frm) {
+ frm.add_fetch("company", "default_receivable_account", "receivable_account");
+ frm.add_fetch("company", "default_income_account", "income_account");
+ frm.add_fetch("company", "cost_center", "cost_center");
+ },
+
onload: function(frm) {
- frm.set_query("debit_to", function(doc) {
+ frm.set_query("receivable_account", function(doc) {
return {
filters: {
'account_type': 'Receivable',
@@ -16,6 +18,15 @@
}
};
});
+ frm.set_query("income_account", function(doc) {
+ return {
+ filters: {
+ 'account_type': 'Income Account',
+ 'is_group': 0,
+ 'company': doc.company
+ }
+ };
+ });
},
refresh: function(frm) {
diff --git a/erpnext/schools/doctype/fee_structure/fee_structure.json b/erpnext/schools/doctype/fee_structure/fee_structure.json
index c3df7bb6..d93a667 100644
--- a/erpnext/schools/doctype/fee_structure/fee_structure.json
+++ b/erpnext/schools/doctype/fee_structure/fee_structure.json
@@ -208,37 +208,6 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
- "default": "",
- "fieldname": "disabled",
- "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": "Disabled",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "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": "section_break_4",
"fieldtype": "Section Break",
"hidden": 0,
@@ -418,7 +387,7 @@
"collapsible": 0,
"columns": 0,
"default": "",
- "fieldname": "debit_to",
+ "fieldname": "receivable_account",
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
@@ -427,7 +396,7 @@
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
- "label": "Academic Receivable Account",
+ "label": "Receivable Account",
"length": 0,
"no_copy": 0,
"options": "Account",
@@ -449,7 +418,7 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
- "fieldname": "against_income_account",
+ "fieldname": "income_account",
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
@@ -608,7 +577,7 @@
"istable": 0,
"max_attachments": 0,
"menu_index": 0,
- "modified": "2017-09-07 12:04:14.807690",
+ "modified": "2017-09-11 15:18:27.975666",
"modified_by": "Administrator",
"module": "Schools",
"name": "Fee Structure",
diff --git a/erpnext/schools/doctype/fees/fees.js b/erpnext/schools/doctype/fees/fees.js
index 5bb130b..45d30d4 100644
--- a/erpnext/schools/doctype/fees/fees.js
+++ b/erpnext/schools/doctype/fees/fees.js
@@ -6,8 +6,8 @@
setup: function(frm) {
frm.add_fetch("student", "title", "student_name");
frm.add_fetch("student", "student_email_id", "student_email");
- frm.add_fetch("fee_structure", "debit_to", "debit_to");
- frm.add_fetch("fee_structure", "against_income_account", "against_income_account");
+ 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");
},
@@ -19,7 +19,6 @@
}
};
});
-
frm.set_query("fee_structure",function(){
return{
"filters":{
@@ -27,9 +26,7 @@
}
};
});
-
- // debit account for booking the fee
- frm.set_query("debit_to", function(doc) {
+ frm.set_query("receivable_account", function(doc) {
return {
filters: {
'account_type': 'Receivable',
@@ -38,7 +35,15 @@
}
};
});
-
+ frm.set_query("income_account", function(doc) {
+ return {
+ filters: {
+ 'account_type': 'Income Account',
+ 'is_group': 0,
+ 'company': doc.company
+ }
+ };
+ });
if (!frm.doc.posting_date) {
frm.doc.posting_date = frappe.datetime.get_today();
}
@@ -98,7 +103,7 @@
},
make_payment_request: function(frm) {
- if (!frm.doc.contact_email) {
+ if (!frm.doc.student_email) {
frappe.msgprint(__("Please set the Email ID for the Student to send the Payment Request"));
} else {
frappe.call({
@@ -106,7 +111,7 @@
args: {
"dt": frm.doc.doctype,
"dn": frm.doc.name,
- "recipient_id": frm.doc.contact_email
+ "recipient_id": frm.doc.student_email
},
callback: function(r) {
if(!r.exc){
@@ -136,23 +141,6 @@
frm.refresh();
},
- program: function(frm) {
- if (frm.doc.program && frm.doc.academic_term) {
- frappe.call({
- method: "erpnext.schools.api.get_fee_structure",
- args: {
- "program": frm.doc.program,
- "academic_term": frm.doc.academic_term
- },
- callback: function(r) {
- if(r.message) {
- frm.set_value("fee_structure" ,r.message);
- }
- }
- });
- }
- },
-
academic_term: function() {
frappe.ui.form.trigger("Fees", "program");
},
diff --git a/erpnext/schools/doctype/fees/fees.json b/erpnext/schools/doctype/fees/fees.json
index b01b5d0..8286048 100644
--- a/erpnext/schools/doctype/fees/fees.json
+++ b/erpnext/schools/doctype/fees/fees.json
@@ -1146,7 +1146,7 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
- "fieldname": "debit_to",
+ "fieldname": "receivable_account",
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
@@ -1155,7 +1155,7 @@
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
- "label": "Academic Receivable Account",
+ "label": "Receivable Account",
"length": 0,
"no_copy": 0,
"options": "Account",
@@ -1177,7 +1177,7 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
- "fieldname": "against_income_account",
+ "fieldname": "income_account",
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
@@ -1274,7 +1274,7 @@
"istable": 0,
"max_attachments": 0,
"menu_index": 0,
- "modified": "2017-08-23 14:12:58.772381",
+ "modified": "2017-09-11 16:04:35.725204",
"modified_by": "Administrator",
"module": "Schools",
"name": "Fees",
diff --git a/erpnext/schools/doctype/fees/fees.py b/erpnext/schools/doctype/fees/fees.py
index ac5564e..2ce115b 100644
--- a/erpnext/schools/doctype/fees/fees.py
+++ b/erpnext/schools/doctype/fees/fees.py
@@ -11,6 +11,7 @@
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,15 +33,27 @@
self.company = frappe.defaults.get_defaults().company
if not self.currency:
self.currency = frappe.defaults.get_defaults().currency
- if not (self.debit_to and self.against_income_account and self.cost_center):
+ 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]
- if not self.debit_to:
- self.debit_to = accounts_details.default_receivable_account
- if not self.against_income_account:
- self.against_income_account = accounts_details.default_income_account
+ if not self.receivable_account:
+ self.receivable_account = accounts_details.default_receivable_account
+ if not self.income_account:
+ self.income_account = accounts_details.default_income_account
if not self.cost_center:
self.cost_center = accounts_details.cost_center
+ if not self.student_email:
+ 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)
+
def calculate_total(self):
"""Calculates total amount."""
@@ -55,7 +68,7 @@
self.make_gl_entries()
if self.send_payment_request and self.student_email:
- pr = make_payment_request(dt="Fees", dn=self.name, recipient_id=self.contact_email,
+ pr = make_payment_request(dt="Fees", dn=self.name, recipient_id=self.student_email,
submit_doc=True, use_dummy_message=True)
frappe.msgprint(_("Payment request {0} created").format(getlink("Payment Request", pr.name)))
@@ -68,17 +81,17 @@
if not self.grand_total:
return
student_gl_entries = self.get_gl_dict({
- "account": self.debit_to,
+ "account": self.receivable_account,
"party_type": "Student",
"party": self.student,
- "against": self.against_income_account,
+ "against": self.income_account,
"debit": self.grand_total,
"debit_in_account_currency": self.grand_total,
"against_voucher": self.name,
"against_voucher_type": self.doctype
})
fee_gl_entry = self.get_gl_dict({
- "account": self.against_income_account,
+ "account": self.income_account,
"against": self.student,
"credit": self.grand_total,
"credit_in_account_currency": self.grand_total,