* feat: added more filters * feat: show only first 30 projects in chart * Update erpnext/projects/report/project_summary/project_summary.js Co-authored-by: Marica <maricadsouza221197@gmail.com> Co-authored-by: Marica <maricadsouza221197@gmail.com>
		
			
				
	
	
		
			156 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			156 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # 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 _
 | |
| 
 | |
| def execute(filters=None):
 | |
| 	columns = get_columns()
 | |
| 	data = []
 | |
| 
 | |
| 	data = frappe.db.get_all("Project", filters=filters, fields=["name", 'status', "percent_complete", "expected_start_date", "expected_end_date", "project_type"], order_by="expected_end_date")
 | |
| 
 | |
| 	for project in data:
 | |
| 		project["total_tasks"] = frappe.db.count("Task", filters={"project": project.name})
 | |
| 		project["completed_tasks"] = frappe.db.count("Task", filters={"project": project.name, "status": "Completed"})
 | |
| 		project["overdue_tasks"] = frappe.db.count("Task", filters={"project": project.name, "status": "Overdue"})
 | |
| 
 | |
| 	chart = get_chart_data(data)
 | |
| 	report_summary = get_report_summary(data)
 | |
| 
 | |
| 	return columns, data, None, chart, report_summary
 | |
| 
 | |
| def get_columns():
 | |
| 	return [
 | |
| 		{
 | |
| 			"fieldname": "name",
 | |
| 			"label": _("Project"),
 | |
| 			"fieldtype": "Link",
 | |
| 			"options": "Project",
 | |
| 			"width": 200
 | |
| 		},
 | |
| 		{
 | |
| 			"fieldname": "project_type",
 | |
| 			"label": _("Type"),
 | |
| 			"fieldtype": "Link",
 | |
| 			"options": "Project Type",
 | |
| 			"width": 120
 | |
| 		},
 | |
| 		{
 | |
| 			"fieldname": "status",
 | |
| 			"label": _("Status"),
 | |
| 			"fieldtype": "Data",
 | |
| 			"width": 120
 | |
| 		},
 | |
| 		{
 | |
| 			"fieldname": "total_tasks",
 | |
| 			"label": _("Total Tasks"),
 | |
| 			"fieldtype": "Data",
 | |
| 			"width": 120
 | |
| 		},
 | |
| 		{
 | |
| 			"fieldname": "completed_tasks",
 | |
| 			"label": _("Tasks Completed"),
 | |
| 			"fieldtype": "Data",
 | |
| 			"width": 120
 | |
| 		},
 | |
| 		{
 | |
| 			"fieldname": "overdue_tasks",
 | |
| 			"label": _("Tasks Overdue"),
 | |
| 			"fieldtype": "Data",
 | |
| 			"width": 120
 | |
| 		},
 | |
| 		{
 | |
| 			"fieldname": "percent_complete",
 | |
| 			"label": _("Completion"),
 | |
| 			"fieldtype": "Data",
 | |
| 			"width": 120
 | |
| 		},
 | |
| 		{
 | |
| 			"fieldname": "expected_start_date",
 | |
| 			"label": _("Start Date"),
 | |
| 			"fieldtype": "Date",
 | |
| 			"width": 120
 | |
| 		},
 | |
| 		{
 | |
| 			"fieldname": "expected_end_date",
 | |
| 			"label": _("End Date"),
 | |
| 			"fieldtype": "Date",
 | |
| 			"width": 120
 | |
| 		},
 | |
| 	]
 | |
| 
 | |
| def get_chart_data(data):
 | |
| 	labels = []
 | |
| 	total = []
 | |
| 	completed = []
 | |
| 	overdue = []
 | |
| 
 | |
| 	for project in data:
 | |
| 		labels.append(project.name)
 | |
| 		total.append(project.total_tasks)
 | |
| 		completed.append(project.completed_tasks)
 | |
| 		overdue.append(project.overdue_tasks)
 | |
| 
 | |
| 	return {
 | |
| 		"data": {
 | |
| 			'labels': labels[:30],
 | |
| 			'datasets': [
 | |
| 				{
 | |
| 					"name": "Overdue",
 | |
| 					"values": overdue[:30]
 | |
| 				},
 | |
| 				{
 | |
| 					"name": "Completed",
 | |
| 					"values": completed[:30]
 | |
| 				},
 | |
| 				{
 | |
| 					"name": "Total Tasks",
 | |
| 					"values": total[:30]
 | |
| 				},
 | |
| 			]
 | |
| 		},
 | |
| 		"type": "bar",
 | |
| 		"colors": ["#fc4f51", "#78d6ff", "#7575ff"],
 | |
| 		"barOptions": {
 | |
| 			"stacked": True
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| def get_report_summary(data):
 | |
| 	if not data:
 | |
| 		return None
 | |
| 
 | |
| 	avg_completion = sum([project.percent_complete for project in data]) / len(data)
 | |
| 	total = sum([project.total_tasks for project in data])
 | |
| 	total_overdue = sum([project.overdue_tasks for project in data])
 | |
| 	completed = sum([project.completed_tasks for project in data])
 | |
| 
 | |
| 	return [
 | |
| 		{
 | |
| 			"value": avg_completion,
 | |
| 			"indicator": "Green" if avg_completion > 50 else "Red",
 | |
| 			"label": "Average Completion",
 | |
| 			"datatype": "Percent",
 | |
| 		},
 | |
| 		{
 | |
| 			"value": total,
 | |
| 			"indicator": "Blue",
 | |
| 			"label": "Total Tasks",
 | |
| 			"datatype": "Int",
 | |
| 		},
 | |
| 		{
 | |
| 			"value": completed,
 | |
| 			"indicator": "Green",
 | |
| 			"label": "Completed Tasks",
 | |
| 			"datatype": "Int",
 | |
| 		},
 | |
| 		{
 | |
| 			"value": total_overdue,
 | |
| 			"indicator": "Green" if total_overdue == 0 else "Red",
 | |
| 			"label": "Overdue Tasks",
 | |
| 			"datatype": "Int",
 | |
| 		}
 | |
| 	]
 |