[report] monthly attendance sheet
diff --git a/hr/page/hr_home/hr_home.js b/hr/page/hr_home/hr_home.js
index 8a50184..e35a808 100644
--- a/hr/page/hr_home/hr_home.js
+++ b/hr/page/hr_home/hr_home.js
@@ -181,6 +181,10 @@
 				"label":wn._("Monthly Salary Register"),
 				route: "query-report/Monthly Salary Register"
 			},
+			{
+				"label":wn._("Monthly Attendance Sheet"),
+				route: "query-report/Monthly Attendance Sheet"
+			},
 		]
 	}
 ];
diff --git a/hr/report/monthly_attendance_sheet/__init__.py b/hr/report/monthly_attendance_sheet/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/hr/report/monthly_attendance_sheet/__init__.py
diff --git a/hr/report/monthly_attendance_sheet/monthly_attendance_sheet.js b/hr/report/monthly_attendance_sheet/monthly_attendance_sheet.js
new file mode 100644
index 0000000..6dc8d78
--- /dev/null
+++ b/hr/report/monthly_attendance_sheet/monthly_attendance_sheet.js
@@ -0,0 +1,32 @@
+wn.query_reports["Monthly Attendance Sheet"] = {
+	"filters": [
+		{
+			"fieldname":"month",
+			"label": "Month",
+			"fieldtype": "Select",
+			"options": "Jan\nFeb\nMar\nApr\nMay\nJun\nJul\nAug\nSep\nOct\nNov\nDec",
+			"default": ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", 
+				"Dec"][wn.datetime.str_to_obj(wn.datetime.get_today()).getMonth()],
+		},
+		{
+			"fieldname":"fiscal_year",
+			"label": "Fiscal Year",
+			"fieldtype": "Link",
+			"options": "Fiscal Year",
+			"default": sys_defaults.fiscal_year,
+		},
+		{
+			"fieldname":"employee",
+			"label": "Employee",
+			"fieldtype": "Link",
+			"options": "Employee"
+		},
+		{
+			"fieldname":"company",
+			"label": "Company",
+			"fieldtype": "Link",
+			"options": "Company",
+			"default": sys_defaults.company
+		}
+	]
+}
\ No newline at end of file
diff --git a/hr/report/monthly_attendance_sheet/monthly_attendance_sheet.py b/hr/report/monthly_attendance_sheet/monthly_attendance_sheet.py
new file mode 100644
index 0000000..520f6e9
--- /dev/null
+++ b/hr/report/monthly_attendance_sheet/monthly_attendance_sheet.py
@@ -0,0 +1,107 @@
+# ERPNext - web based ERP (http://erpnext.com)
+# Copyright (C) 2012 Web Notes Technologies Pvt Ltd
+# 
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+from __future__ import unicode_literals
+import webnotes
+from webnotes.utils import cstr, cint
+from webnotes import msgprint, _
+
+def execute(filters=None):
+	if not filters: filters = {}
+	
+	conditions, filters = get_conditions(filters)
+	columns = get_columns(filters)
+	att_map = get_attendance_list(conditions, filters)
+	emp_map = get_employee_details()
+	
+	data = []
+	for emp in sorted(att_map):
+		emp_det = emp_map.get(emp)
+		row = [emp, emp_det.employee_name, emp_det.branch, emp_det.department, emp_det.designation, 
+			emp_det.company]
+			
+		total_p = total_a = 0.0
+		for day in range(filters["total_days_in_month"]):
+			status = att_map.get(emp).get(day + 1, "Absent")
+			status_map = {"Present": "P", "Absent": "A", "Half Day": "HD"}
+			row.append(status_map[status])
+			
+			if status == "Present":
+				total_p += 1
+			elif status == "Absent":
+				total_a += 1
+			elif status == "Half Day":
+				total_p += 0.5
+				total_a += 0.5
+	
+		row += [total_p, total_a]
+		
+		data.append(row)
+	
+	return columns, data
+	
+def get_columns(filters):
+	columns = [
+		"Employee:Link/Employee:120", "Employee Name::140", "Branch:Link/Branch:120", 
+		"Department:Link/Department:120", "Designation:Link/Designation:120",
+		 "Company:Link/Company:120"
+	]
+	
+	for day in range(filters["total_days_in_month"]):
+		columns.append(cstr(day+1) +"::20")
+		
+	columns += ["Total Present:Float:80", "Total Absent:Float:80"]
+	return columns
+	
+def get_attendance_list(conditions, filters):
+	attendance_list = webnotes.conn.sql("""select employee, day(att_date) as day_of_month, 
+		status from tabAttendance where docstatus < 2 %s order by employee, att_date""" % 
+		conditions, filters, as_dict=1)
+		
+	att_map = {}
+	for d in attendance_list:
+		att_map.setdefault(d.employee, webnotes._dict()).setdefault(d.day_of_month, "")
+		att_map[d.employee][d.day_of_month] = d.status
+
+	return att_map
+	
+def get_conditions(filters):	
+	if not (filters.get("month") and filters.get("fiscal_year")):
+		msgprint(_("Please select month and year"), raise_exception=1)
+		
+	filters["month"] = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", 
+		"Dec"].index(filters["month"]) + 1
+	
+	from calendar import monthrange	
+	filters["total_days_in_month"] = monthrange(cint(filters["fiscal_year"].split("-")[-1]), 
+		filters["month"])[1]
+	
+	conditions = " and month(att_date) = %(month)s and fiscal_year = %(fiscal_year)s"
+	
+	if filters.get("company"): conditions += " and company = %(company)s"
+	if filters.get("employee"): conditions += " and employee = %(employee)s"
+	
+	return conditions, filters
+	
+def get_employee_details():
+	employee = webnotes.conn.sql("""select name, employee_name, designation, department, 
+		branch, company from tabEmployee where docstatus < 2 and status = 'Active'""", as_dict=1)
+	
+	emp_map = {}
+	for emp in employee:
+		emp_map[emp.name] = emp
+		
+	return emp_map
\ No newline at end of file
diff --git a/hr/report/monthly_attendance_sheet/monthly_attendance_sheet.txt b/hr/report/monthly_attendance_sheet/monthly_attendance_sheet.txt
new file mode 100644
index 0000000..3c53aae
--- /dev/null
+++ b/hr/report/monthly_attendance_sheet/monthly_attendance_sheet.txt
@@ -0,0 +1,22 @@
+[
+ {
+  "creation": "2013-05-13 14:04:03", 
+  "docstatus": 0, 
+  "modified": "2013-05-13 14:32:42", 
+  "modified_by": "Administrator", 
+  "owner": "Administrator"
+ }, 
+ {
+  "add_total_row": 0, 
+  "doctype": "Report", 
+  "is_standard": "Yes", 
+  "name": "__common__", 
+  "ref_doctype": "Attendance", 
+  "report_name": "Monthly Attendance Sheet", 
+  "report_type": "Script Report"
+ }, 
+ {
+  "doctype": "Report", 
+  "name": "Monthly Attendance Sheet"
+ }
+]
\ No newline at end of file