From 9d857579af6c88daa1f8ea294b9e67aa21ef060c Mon Sep 17 00:00:00 2001 From: Jamsheer Date: Tue, 8 May 2018 11:47:47 +0530 Subject: [PATCH] Attendance Request - validate and create attendance --- .../attendance_request/attendance_request.js | 1 + .../attendance_request/attendance_request.py | 46 ++++++++++++++++++- 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/erpnext/hr/doctype/attendance_request/attendance_request.js b/erpnext/hr/doctype/attendance_request/attendance_request.js index 76a28a056e..caf955aed1 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 0114b99de3..eb0b3689c3 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