Attendance Request - validate and create attendance
diff --git a/erpnext/hr/doctype/attendance_request/attendance_request.js b/erpnext/hr/doctype/attendance_request/attendance_request.js
index 76a28a0..caf955a 100644
--- a/erpnext/hr/doctype/attendance_request/attendance_request.js
+++ b/erpnext/hr/doctype/attendance_request/attendance_request.js
@@ -1,5 +1,6 @@
 // Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
 // For license information, please see license.txt
+cur_frm.add_fetch('employee', 'company', 'company');
 
 frappe.ui.form.on('Attendance Request', {
 	refresh: function(frm) {
diff --git a/erpnext/hr/doctype/attendance_request/attendance_request.py b/erpnext/hr/doctype/attendance_request/attendance_request.py
index 0114b99..eb0b368 100644
--- a/erpnext/hr/doctype/attendance_request/attendance_request.py
+++ b/erpnext/hr/doctype/attendance_request/attendance_request.py
@@ -5,6 +5,50 @@
 from __future__ import unicode_literals
 import frappe
 from frappe.model.document import Document
+from frappe.utils import date_diff, add_days
+from erpnext.hr.doctype.employee.employee import is_holiday
+from erpnext.hr.utils import validate_dates
 
 class AttendanceRequest(Document):
-	pass
+	def validate(self):
+		validate_dates(self, self.from_date, self.to_date)
+
+	def on_submit(self):
+		self.create_attendance()
+
+	def on_cancel(self):
+		attendance_list = frappe.get_list("Attendance", {'employee': self.employee, 'attendance_request': self.name})
+		if attendance_list:
+			for attendance in attendance_list:
+				attendance_obj = frappe.get_doc("Attendance", attendance['name'])
+				attendance_obj.cancel()
+
+	def create_attendance(self):
+		request_days = date_diff(self.to_date, self.from_date) + 1
+		for number in range(request_days):
+			attendance_date = add_days(self.from_date, number)
+			skip_attendance = self.validate_if_attendance_not_applicable(attendance_date)
+			if not skip_attendance:
+				attendance = frappe.new_doc("Attendance")
+				attendance.employee = self.employee
+				attendance.employee_name = self.employee_name
+				attendance.status = "Present"
+				attendance.attendance_date = attendance_date
+				attendance.company = self.company
+				attendance.attendance_request = self.name
+				attendance.save(ignore_permissions=True)
+				attendance.submit()
+
+	def validate_if_attendance_not_applicable(self, attendance_date):
+		# Check if attendance_date is a Holiday
+		if is_holiday(self.employee, attendance_date):
+			return True
+
+		# Check if employee on Leave
+		leave_record = frappe.db.sql("""select half_day from `tabLeave Application`
+			where employee = %s and %s between from_date and to_date
+			and docstatus = 1""", (self.employee, attendance_date), as_dict=True)
+		if leave_record:
+			return True
+
+		return False