Merge pull request #9533 from rohitwaghchaure/total_amount_issue

[minor] Total amount not showing value in bank reconcillation
diff --git a/erpnext/__init__.py b/erpnext/__init__.py
index 32c9719..71323d1 100644
--- a/erpnext/__init__.py
+++ b/erpnext/__init__.py
@@ -2,7 +2,7 @@
 from __future__ import unicode_literals
 import frappe
 
-__version__ = '8.2.0'
+__version__ = '8.2.2'
 
 
 def get_default_company(user=None):
diff --git a/erpnext/config/schools.py b/erpnext/config/schools.py
index c54f808..b984578 100644
--- a/erpnext/config/schools.py
+++ b/erpnext/config/schools.py
@@ -137,7 +137,14 @@
 				{
 					"type": "doctype",
 					"name": "Assessment Result Tool"
-				}
+				},
+				{
+					"type": "report",
+					"is_query_report": True,
+					"name": "Course wise Assessment Report",
+					"doctype": "Assessment Result"
+				},
+
 			]
 		},
 		{
diff --git a/erpnext/patches/v8_1/delete_deprecated_reports.py b/erpnext/patches/v8_1/delete_deprecated_reports.py
index 9047d84..887277a 100644
--- a/erpnext/patches/v8_1/delete_deprecated_reports.py
+++ b/erpnext/patches/v8_1/delete_deprecated_reports.py
@@ -35,7 +35,7 @@
 	elif report in ["Customer Addresses And Contacts", "Supplier Addresses And Contacts"]:
 		frappe.db.sql("""update `tabDesktop Icon` set _report='{value}'
 			where name in ({docnames})""".format(
-				value=report,
+				value="Addresses And Contacts",
 				docnames=",".join(["'%s'"%icon for icon in desktop_icons])
 			)
 		)
diff --git a/erpnext/patches/v8_1/setup_gst_india.py b/erpnext/patches/v8_1/setup_gst_india.py
index 1b319f9..ce27d37 100644
--- a/erpnext/patches/v8_1/setup_gst_india.py
+++ b/erpnext/patches/v8_1/setup_gst_india.py
@@ -4,6 +4,7 @@
 def execute():
 	frappe.reload_doc('regional', 'doctype', 'gst_settings')
 	frappe.reload_doc('regional', 'doctype', 'gst_hsn_code')
+	frappe.reload_doc('stock', 'doctype', 'item')
 
 	for report_name in ('GST Sales Register', 'GST Purchase Register',
 		'GST Itemised Sales Register', 'GST Itemised Purchase Register'):
diff --git a/erpnext/schools/report/course_wise_assessment_report/__init__.py b/erpnext/schools/report/course_wise_assessment_report/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/schools/report/course_wise_assessment_report/__init__.py
diff --git a/erpnext/schools/report/course_wise_assessment_report/course_wise_assessment_report.js b/erpnext/schools/report/course_wise_assessment_report/course_wise_assessment_report.js
new file mode 100644
index 0000000..42b19eb
--- /dev/null
+++ b/erpnext/schools/report/course_wise_assessment_report/course_wise_assessment_report.js
@@ -0,0 +1,34 @@
+// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors
+// For license information, please see license.txt
+
+frappe.query_reports["Course wise Assessment Report"] = {
+	"filters": [
+		{
+			"fieldname":"assessment_group",
+			"label": __("Assessment Group"),
+			"fieldtype": "Link",
+			"options": "Assessment Group",
+			"reqd": 1,
+			"get_query": function() {
+				return{
+					filters: {
+						'is_group': 0
+					}
+				};
+			}
+		},
+		{
+			"fieldname":"course",
+			"label": __("Course"),
+			"fieldtype": "Link",
+			"options": "Course",
+			"reqd": 1
+		},
+		{
+			"fieldname":"student_group",
+			"label": __("Student Group"),
+			"fieldtype": "Link",
+			"options": "Student Group"
+		}
+	]
+};
diff --git a/erpnext/schools/report/course_wise_assessment_report/course_wise_assessment_report.json b/erpnext/schools/report/course_wise_assessment_report/course_wise_assessment_report.json
new file mode 100644
index 0000000..6b089d2
--- /dev/null
+++ b/erpnext/schools/report/course_wise_assessment_report/course_wise_assessment_report.json
@@ -0,0 +1,23 @@
+{
+ "add_total_row": 0, 
+ "apply_user_permissions": 1, 
+ "creation": "2017-05-05 14:46:13.776133", 
+ "disabled": 0, 
+ "docstatus": 0, 
+ "doctype": "Report", 
+ "idx": 0, 
+ "is_standard": "Yes", 
+ "modified": "2017-05-05 14:47:18.080385", 
+ "modified_by": "Administrator", 
+ "module": "Schools", 
+ "name": "Course wise Assessment Report", 
+ "owner": "Administrator", 
+ "ref_doctype": "Assessment Result", 
+ "report_name": "Course wise Assessment Report", 
+ "report_type": "Script Report", 
+ "roles": [
+  {
+   "role": "Academics User"
+  }
+ ]
+}
\ No newline at end of file
diff --git a/erpnext/schools/report/course_wise_assessment_report/course_wise_assessment_report.py b/erpnext/schools/report/course_wise_assessment_report/course_wise_assessment_report.py
new file mode 100644
index 0000000..b5a2fc1
--- /dev/null
+++ b/erpnext/schools/report/course_wise_assessment_report/course_wise_assessment_report.py
@@ -0,0 +1,122 @@
+# Copyright (c) 2013, Frappe Technologies Pvt. Ltd. and contributors
+# For license information, please see license.txt
+
+from __future__ import unicode_literals
+import frappe
+from frappe import _
+from collections import defaultdict
+
+def execute(filters=None):
+	args = frappe._dict()
+	args["assessment_group"] = filters.get("assessment_group")
+	if args["assessment_group"] == "All Assessment Groups":
+		frappe.throw(_("Please select the assessment group other than 'All Assessment Groups'"))
+
+	args["course"] = filters.get("course")
+	args["student_group"] = filters.get("student_group")
+	if args["student_group"]:
+		cond = "and ap.student_group=%(student_group)s"
+	else:
+		cond = ''
+
+	# find all assessment plan linked with the filters provided
+	assessment_plan = frappe.db.sql('''
+		select
+			ap.name, ap.student_group, apc.assessment_criteria, apc.maximum_score as max_score
+		from
+			`tabAssessment Plan` ap, `tabAssessment Plan Criteria` apc
+		where
+			ap.assessment_group=%(assessment_group)s and ap.course=%(course)s and
+			ap.name=apc.parent and ap.docstatus=1 {0}
+		order by
+			apc.assessment_criteria'''.format(cond), (args), as_dict=1)
+
+	assessment_plan_list = set([d["name"] for d in assessment_plan])
+	if not assessment_plan_list:
+		frappe.throw(_("No assessment plan linked with this assessment group"))
+
+	student_group_list = set([d["student_group"] for d in assessment_plan])
+	assessment_result = frappe.db.sql('''select ar.student, ard.assessment_criteria, ard.grade, ard.score
+		from `tabAssessment Result` ar, `tabAssessment Result Detail` ard
+		where ar.assessment_plan in (%s) and ar.name=ard.parent and ar.docstatus=1
+		order by ard.assessment_criteria''' %', '.join(['%s']*len(assessment_plan_list)),
+		tuple(assessment_plan_list), as_dict=1)
+
+	result_dict = defaultdict(dict)
+	kounter = defaultdict(dict)
+	for result in assessment_result:
+		result_dict[result.student].update({frappe.scrub(result.assessment_criteria): result.grade,
+			frappe.scrub(result.assessment_criteria)+"_score": result.score})
+		if result.grade in kounter[result.assessment_criteria]:
+			kounter[result.assessment_criteria][result.grade] += 1
+		else:
+			kounter[result.assessment_criteria].update({result.grade: 1})
+
+	student_list = frappe.db.sql('''select sgs.student, sgs.student_name
+		from `tabStudent Group` sg, `tabStudent Group Student` sgs
+		where sg.name = sgs.parent and sg.name in (%s)
+		order by sgs.group_roll_number asc''' %', '.join(['%s']*len(student_group_list)),
+		tuple(student_group_list), as_dict=1)
+
+	for student in student_list:
+		student.update(result_dict[student.student])
+	data = student_list
+
+	columns = get_column(list(set([(d["assessment_criteria"],d["max_score"]) for d in assessment_plan])))
+
+	grading_scale = frappe.db.get_value("Assessment Plan", list(assessment_plan_list)[0], "grading_scale")
+	grades = frappe.db.sql_list('''select grade_code from `tabGrading Scale Interval` where parent=%s''',
+		(grading_scale))
+	assessment_criteria_list = list(set([d["assessment_criteria"] for d in assessment_plan]))
+	chart = get_chart_data(grades, assessment_criteria_list, kounter)
+
+	return columns, data, None, chart
+
+def get_column(assessment_criteria):
+	columns = [{
+		"fieldname": "student",
+		"label": _("Student ID"),
+		"fieldtype": "Link",
+		"options": "Student",
+		"width": 90
+	},
+	{
+		"fieldname": "student_name",
+		"label": _("Student Name"),
+		"fieldtype": "Data",
+		"width": 160
+	}]
+	for d in assessment_criteria:
+		columns.append({
+			"fieldname": frappe.scrub(d[0]),
+			"label": d[0],
+			"fieldtype": "Data",
+			"width": 110
+		})
+		columns.append({
+			"fieldname": frappe.scrub(d[0]) +"_score",
+			"label": "Score(" + str(int(d[1])) + ")",
+			"fieldtype": "Float",
+			"width": 100
+		})
+	return columns
+
+def get_chart_data(grades, assessment_criteria_list, kounter):
+	grades = sorted(grades)
+	chart_data = []
+	chart_data.append(["x"] + assessment_criteria_list)
+	for grade in grades:
+		tmp = [grade]
+		for ac in assessment_criteria_list:
+			if grade in kounter[ac]:
+				tmp.append(kounter[ac][grade])
+			else:
+				tmp.append(0)
+		chart_data.append(tmp)
+	return {
+		"data": {
+			"x": "x",
+			"columns": chart_data
+		},
+		"chart_type": 'bar',
+	}