real time fee creation status via socketio

This commit is contained in:
Manas Solanki 2017-09-12 02:10:19 +05:30 committed by Nabin Hait
parent 1bcc6c661a
commit 0664d6ed8b
3 changed files with 47 additions and 36 deletions

View File

@ -6,15 +6,6 @@ frappe.ui.form.on('Fee Schedule', {
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) {
@ -42,6 +33,21 @@ frappe.ui.form.on('Fee Schedule', {
"academic_year": frm.doc.academic_year
};
});
frappe.realtime.on("fee_schedule_progress", function(data) {
if (data.reload && data.reload === 1) {
frm.reload_doc();
}
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) {
let progress_bar = $(cur_frm.dashboard.progress_area).find(".progress-bar");
if (progress_bar) {
$(progress_bar).removeClass("progress-bar-danger").addClass("progress-bar-success progress-bar-striped");
$(progress_bar).css("width", data.progress+"%");
}
}
});
},
refresh: function(frm) {
@ -53,9 +59,13 @@ frappe.ui.form.on('Fee Schedule', {
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=="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") {
frm.add_custom_button(__('Create Fees'), function() {
frm.doc.fee_creation_status = "In Process";
frm.save();
frappe.call({
method: "create_fees",
doc: frm.doc,
@ -65,6 +75,9 @@ frappe.ui.form.on('Fee Schedule', {
});
}, "fa fa-play", "btn-success");
}
if (frm.doc.fee_creation_status==="Successful") {
frm.set_read_only();
}
},
fee_structure: function(frm) {
@ -98,6 +111,6 @@ frappe.ui.form.on("Fee Schedule Student Group", {
frappe.model.set_value(cdt, cdn, "total_students", r.message);
}
}
})
});
}
})

View File

@ -39,7 +39,7 @@
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"unique": 0
@ -1029,7 +1029,7 @@
"issingle": 0,
"istable": 0,
"max_attachments": 0,
"modified": "2017-09-11 16:57:27.427777",
"modified": "2017-09-12 02:03:37.062064",
"modified_by": "Administrator",
"module": "Schools",
"name": "Fee Schedule",

View File

@ -4,7 +4,6 @@
from __future__ import unicode_literals
import frappe
from frappe import _
from frappe.model.document import Document
from frappe.model.mapper import get_mapped_doc
from frappe.utils import money_in_words
@ -40,9 +39,8 @@ class FeeSchedule(Document):
self.grand_total_in_words = money_in_words(self.grand_total)
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)
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)
@ -52,15 +50,13 @@ def generate_fee(fee_schedule):
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
from `tabStudent Group` sg, `tabStudent Group Student` sgs
where sg.name=%s and sg.name=sgs.parent and sgs.active=1""", d.student_group, as_dict=1)
students = frappe.db.sql(""" select sg.program, sg.batch, sgs.student, sgs.student_name
from `tabStudent Group` sg, `tabStudent Group Student` sgs
where sg.name=%s and sg.name=sgs.parent and sgs.active=1""", d.student_group, as_dict=1)
# students = frappe.get_all("Student Group Student", fields=["student", "student_name"],
# filters={"parent": d.student_group, "parenttype": "Student Group", "active": 1})
for student in students:
doc = get_mapped_doc("Fee Schedule", fee_schedule, {
for student in students:
try:
fees_doc = get_mapped_doc("Fee Schedule", fee_schedule, {
"Fee Schedule": {
"doctype": "Fees",
"field_map": {
@ -68,19 +64,19 @@ def generate_fee(fee_schedule):
}
}
})
doc.student = student.student
doc.student_name = student.student_name
doc.program = student.program
doc.student_batch = student.batch
doc.send_payment_request = 1
doc.save()
doc.submit()
fees_doc.student = student.student
fees_doc.student_name = student.student_name
fees_doc.program = student.program
fees_doc.student_batch = student.batch
fees_doc.send_payment_request = doc.send_email
fees_doc.save()
fees_doc.submit()
created_records += 1
frappe.publish_realtime("fee_schedule_progress", {"progress": created_records}, user=frappe.session.user)
frappe.publish_realtime("fee_schedule_progress", {"progress": str(int(created_records * 100/total_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)
except Exception as e:
error = True
err_msg = frappe.local.message_log and "\n\n".join(frappe.local.message_log) or cstr(e)
if error:
frappe.db.rollback()
@ -91,6 +87,8 @@ def generate_fee(fee_schedule):
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.whitelist()
def get_fee_structure(source_name,target_doc=None):