Merge pull request #31630 from ruchamahabal/auto-attendance-perf

This commit is contained in:
Rucha Mahabal
2022-07-20 10:25:02 +05:30
committed by GitHub
9 changed files with 40 additions and 23 deletions

View File

@@ -483,12 +483,12 @@ scheduler_events = {
"erpnext.erpnext_integrations.doctype.plaid_settings.plaid_settings.automatic_synchronization", "erpnext.erpnext_integrations.doctype.plaid_settings.plaid_settings.automatic_synchronization",
"erpnext.projects.doctype.project.project.hourly_reminder", "erpnext.projects.doctype.project.project.hourly_reminder",
"erpnext.projects.doctype.project.project.collect_project_status", "erpnext.projects.doctype.project.project.collect_project_status",
"erpnext.hr.doctype.shift_type.shift_type.process_auto_attendance_for_all_shifts",
"erpnext.support.doctype.issue.issue.set_service_level_agreement_variance", "erpnext.support.doctype.issue.issue.set_service_level_agreement_variance",
"erpnext.erpnext_integrations.connectors.shopify_connection.sync_old_orders", "erpnext.erpnext_integrations.connectors.shopify_connection.sync_old_orders",
], ],
"hourly_long": [ "hourly_long": [
"erpnext.stock.doctype.repost_item_valuation.repost_item_valuation.repost_entries" "erpnext.stock.doctype.repost_item_valuation.repost_item_valuation.repost_entries",
"erpnext.hr.doctype.shift_type.shift_type.process_auto_attendance_for_all_shifts",
], ],
"daily": [ "daily": [
"erpnext.support.doctype.issue.issue.auto_close_tickets", "erpnext.support.doctype.issue.issue.auto_close_tickets",

View File

@@ -813,7 +813,7 @@
"idx": 24, "idx": 24,
"image_field": "image", "image_field": "image",
"links": [], "links": [],
"modified": "2021-06-17 11:31:37.730760", "modified": "2022-07-18 20:03:43.188705",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "HR", "module": "HR",
"name": "Employee", "name": "Employee",

View File

@@ -349,7 +349,9 @@ def get_employee_email(employee_doc):
def get_holiday_list_for_employee(employee, raise_exception=True): def get_holiday_list_for_employee(employee, raise_exception=True):
if employee: if employee:
holiday_list, company = frappe.db.get_value("Employee", employee, ["holiday_list", "company"]) holiday_list, company = frappe.get_cached_value(
"Employee", employee, ["holiday_list", "company"]
)
else: else:
holiday_list = "" holiday_list = ""
company = frappe.db.get_value("Global Defaults", None, "default_company") company = frappe.db.get_value("Global Defaults", None, "default_company")

View File

@@ -26,7 +26,8 @@
"fieldtype": "Link", "fieldtype": "Link",
"label": "Employee", "label": "Employee",
"options": "Employee", "options": "Employee",
"reqd": 1 "reqd": 1,
"search_index": 1
}, },
{ {
"fetch_from": "employee.employee_name", "fetch_from": "employee.employee_name",
@@ -48,7 +49,8 @@
"fieldtype": "Link", "fieldtype": "Link",
"label": "Shift", "label": "Shift",
"options": "Shift Type", "options": "Shift Type",
"read_only": 1 "read_only": 1,
"search_index": 1
}, },
{ {
"fieldname": "column_break_4", "fieldname": "column_break_4",
@@ -107,7 +109,7 @@
} }
], ],
"links": [], "links": [],
"modified": "2020-07-08 11:02:32.660986", "modified": "2022-07-19 15:38:41.767539",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "HR", "module": "HR",
"name": "Employee Checkin", "name": "Employee Checkin",

View File

@@ -131,7 +131,7 @@ def mark_attendance_and_link_log(
return None return None
elif attendance_status in ("Present", "Absent", "Half Day"): elif attendance_status in ("Present", "Absent", "Half Day"):
employee_doc = frappe.get_doc("Employee", employee) company = frappe.get_cached_value("Employee", employee, "company")
duplicate = frappe.db.exists( duplicate = frappe.db.exists(
"Attendance", "Attendance",
{"employee": employee, "attendance_date": attendance_date, "docstatus": ("!=", "2")}, {"employee": employee, "attendance_date": attendance_date, "docstatus": ("!=", "2")},
@@ -144,7 +144,7 @@ def mark_attendance_and_link_log(
"attendance_date": attendance_date, "attendance_date": attendance_date,
"status": attendance_status, "status": attendance_status,
"working_hours": working_hours, "working_hours": working_hours,
"company": employee_doc.company, "company": company,
"shift": shift, "shift": shift,
"late_entry": late_entry, "late_entry": late_entry,
"early_exit": early_exit, "early_exit": early_exit,

View File

@@ -115,6 +115,8 @@ def is_holiday(holiday_list, date=None):
if date is None: if date is None:
date = today() date = today()
if holiday_list: if holiday_list:
return bool(frappe.get_all("Holiday List", dict(name=holiday_list, holiday_date=date))) return bool(
frappe.db.exists("Holiday", {"parent": holiday_list, "holiday_date": date}, cache=True)
)
else: else:
return False return False

View File

@@ -25,7 +25,8 @@
"fieldtype": "Link", "fieldtype": "Link",
"label": "Employee", "label": "Employee",
"options": "Employee", "options": "Employee",
"reqd": 1 "reqd": 1,
"search_index": 1
}, },
{ {
"fetch_from": "employee.employee_name", "fetch_from": "employee.employee_name",
@@ -48,7 +49,8 @@
"in_list_view": 1, "in_list_view": 1,
"label": "Shift Type", "label": "Shift Type",
"options": "Shift Type", "options": "Shift Type",
"reqd": 1 "reqd": 1,
"search_index": 1
}, },
{ {
"fieldname": "column_break_3", "fieldname": "column_break_3",
@@ -105,7 +107,7 @@
], ],
"is_submittable": 1, "is_submittable": 1,
"links": [], "links": [],
"modified": "2020-06-15 14:27:54.310773", "modified": "2022-07-19 15:27:54.310773",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "HR", "module": "HR",
"name": "Shift Assignment", "name": "Shift Assignment",

View File

@@ -169,7 +169,7 @@ def get_employee_shift(
""" """
if for_date is None: if for_date is None:
for_date = nowdate() for_date = nowdate()
default_shift = frappe.db.get_value("Employee", employee, "default_shift") default_shift = frappe.get_cached_value("Employee", employee, "default_shift")
shift_type_name = None shift_type_name = None
shift_assignment_details = frappe.db.get_value( shift_assignment_details = frappe.db.get_value(
"Shift Assignment", "Shift Assignment",
@@ -187,7 +187,7 @@ def get_employee_shift(
if not shift_type_name and consider_default_shift: if not shift_type_name and consider_default_shift:
shift_type_name = default_shift shift_type_name = default_shift
if shift_type_name: if shift_type_name:
holiday_list_name = frappe.db.get_value("Shift Type", shift_type_name, "holiday_list") holiday_list_name = frappe.get_cached_value("Shift Type", shift_type_name, "holiday_list")
if not holiday_list_name: if not holiday_list_name:
holiday_list_name = get_holiday_list_for_employee(employee, False) holiday_list_name = get_holiday_list_for_employee(employee, False)
if holiday_list_name and is_holiday(holiday_list_name, for_date): if holiday_list_name and is_holiday(holiday_list_name, for_date):
@@ -294,7 +294,18 @@ def get_shift_details(shift_type_name, for_date=None):
return None return None
if not for_date: if not for_date:
for_date = nowdate() for_date = nowdate()
shift_type = frappe.get_doc("Shift Type", shift_type_name) shift_type = frappe.get_cached_value(
"Shift Type",
shift_type_name,
[
"name",
"start_time",
"end_time",
"begin_check_in_before_shift_start_time",
"allow_check_out_after_shift_end_time",
],
as_dict=1,
)
start_datetime = datetime.combine(for_date, datetime.min.time()) + shift_type.start_time start_datetime = datetime.combine(for_date, datetime.min.time()) + shift_type.start_time
for_date = ( for_date = (
for_date + timedelta(days=1) if shift_type.start_time > shift_type.end_time else for_date for_date + timedelta(days=1) if shift_type.start_time > shift_type.end_time else for_date

View File

@@ -107,7 +107,7 @@ class ShiftType(Document):
"""Marks Absents for the given employee on working days in this shift which have no attendance marked. """Marks Absents for the given employee on working days in this shift which have no attendance marked.
The Absent is marked starting from 'process_attendance_after' or employee creation date. The Absent is marked starting from 'process_attendance_after' or employee creation date.
""" """
date_of_joining, relieving_date, employee_creation = frappe.db.get_value( date_of_joining, relieving_date, employee_creation = frappe.get_cached_value(
"Employee", employee, ["date_of_joining", "relieving_date", "creation"] "Employee", employee, ["date_of_joining", "relieving_date", "creation"]
) )
if not date_of_joining: if not date_of_joining:
@@ -156,21 +156,19 @@ class ShiftType(Document):
if not from_date: if not from_date:
del filters["start_date"] del filters["start_date"]
assigned_employees = frappe.get_all("Shift Assignment", "employee", filters, as_list=True) assigned_employees = frappe.get_all("Shift Assignment", filters, pluck="employee")
assigned_employees = [x[0] for x in assigned_employees]
if consider_default_shift: if consider_default_shift:
filters = {"default_shift": self.name, "status": ["!=", "Inactive"]} filters = {"default_shift": self.name, "status": ["!=", "Inactive"]}
default_shift_employees = frappe.get_all("Employee", "name", filters, as_list=True) default_shift_employees = frappe.get_all("Employee", filters, pluck="name")
default_shift_employees = [x[0] for x in default_shift_employees]
return list(set(assigned_employees + default_shift_employees)) return list(set(assigned_employees + default_shift_employees))
return assigned_employees return assigned_employees
def process_auto_attendance_for_all_shifts(): def process_auto_attendance_for_all_shifts():
shift_list = frappe.get_all("Shift Type", "name", {"enable_auto_attendance": "1"}, as_list=True) shift_list = frappe.get_all("Shift Type", filters={"enable_auto_attendance": "1"}, pluck="name")
for shift in shift_list: for shift in shift_list:
doc = frappe.get_doc("Shift Type", shift[0]) doc = frappe.get_cached_doc("Shift Type", shift)
doc.process_auto_attendance() doc.process_auto_attendance()