fix: unlink Attendance from Employee Checkins on cancellation (#31045)
This commit is contained in:
parent
867f2c6282
commit
28fe4f3d54
@ -32,6 +32,9 @@ class Attendance(Document):
|
|||||||
self.validate_employee_status()
|
self.validate_employee_status()
|
||||||
self.check_leave_record()
|
self.check_leave_record()
|
||||||
|
|
||||||
|
def on_cancel(self):
|
||||||
|
self.unlink_attendance_from_checkins()
|
||||||
|
|
||||||
def validate_attendance_date(self):
|
def validate_attendance_date(self):
|
||||||
date_of_joining = frappe.db.get_value("Employee", self.employee, "date_of_joining")
|
date_of_joining = frappe.db.get_value("Employee", self.employee, "date_of_joining")
|
||||||
|
|
||||||
@ -127,6 +130,33 @@ class Attendance(Document):
|
|||||||
if not emp:
|
if not emp:
|
||||||
frappe.throw(_("Employee {0} is not active or does not exist").format(self.employee))
|
frappe.throw(_("Employee {0} is not active or does not exist").format(self.employee))
|
||||||
|
|
||||||
|
def unlink_attendance_from_checkins(self):
|
||||||
|
EmployeeCheckin = frappe.qb.DocType("Employee Checkin")
|
||||||
|
linked_logs = (
|
||||||
|
frappe.qb.from_(EmployeeCheckin)
|
||||||
|
.select(EmployeeCheckin.name)
|
||||||
|
.where(EmployeeCheckin.attendance == self.name)
|
||||||
|
.for_update()
|
||||||
|
.run(as_dict=True)
|
||||||
|
)
|
||||||
|
|
||||||
|
if linked_logs:
|
||||||
|
(
|
||||||
|
frappe.qb.update(EmployeeCheckin)
|
||||||
|
.set("attendance", "")
|
||||||
|
.where(EmployeeCheckin.attendance == self.name)
|
||||||
|
).run()
|
||||||
|
|
||||||
|
frappe.msgprint(
|
||||||
|
msg=_("Unlinked Attendance record from Employee Checkins: {}").format(
|
||||||
|
", ".join(get_link_to_form("Employee Checkin", log.name) for log in linked_logs)
|
||||||
|
),
|
||||||
|
title=_("Unlinked logs"),
|
||||||
|
indicator="blue",
|
||||||
|
is_minimizable=True,
|
||||||
|
wide=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def get_duplicate_attendance_record(employee, attendance_date, shift, name=None):
|
def get_duplicate_attendance_record(employee, attendance_date, shift, name=None):
|
||||||
attendance = frappe.qb.DocType("Attendance")
|
attendance = frappe.qb.DocType("Attendance")
|
||||||
|
@ -76,6 +76,17 @@ class TestEmployeeCheckin(FrappeTestCase):
|
|||||||
)
|
)
|
||||||
self.assertEqual(attendance_count, 1)
|
self.assertEqual(attendance_count, 1)
|
||||||
|
|
||||||
|
def test_unlink_attendance_on_cancellation(self):
|
||||||
|
employee = make_employee("test_mark_attendance_and_link_log@example.com")
|
||||||
|
logs = make_n_checkins(employee, 3)
|
||||||
|
|
||||||
|
frappe.db.delete("Attendance", {"employee": employee})
|
||||||
|
attendance = mark_attendance_and_link_log(logs, "Present", nowdate(), 8.2)
|
||||||
|
attendance.cancel()
|
||||||
|
|
||||||
|
linked_logs = frappe.db.get_all("Employee Checkin", {"attendance": attendance.name})
|
||||||
|
self.assertEquals(len(linked_logs), 0)
|
||||||
|
|
||||||
def test_calculate_working_hours(self):
|
def test_calculate_working_hours(self):
|
||||||
check_in_out_type = [
|
check_in_out_type = [
|
||||||
"Alternating entries as IN and OUT during the same shift",
|
"Alternating entries as IN and OUT during the same shift",
|
||||||
|
Loading…
Reference in New Issue
Block a user