Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions time_capture/custom_fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,16 @@ def get_custom_fields():
"reqd": 1,
},
],
"Leave Application": [
{
"fieldname": "bulk_leave_application",
"fieldtype": "Link",
"insert_after": "letter_head",
"label": _("Bulk Leave Application"),
"options": "Bulk Leave Application",
"read_only": 1,
},
],
"Task": [
{
"fieldname": "custom_hourly_billed",
Expand Down
2 changes: 1 addition & 1 deletion time_capture/hooks.py
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@

doc_events = {
"Attendance": {
"before_insert": "time_capture.scripts.attendance.before_insert",
"on_change": "time_capture.scripts.attendance.on_change",
"on_submit": "time_capture.scripts.attendance.on_submit",
"on_cancel": "time_capture.scripts.attendance.on_cancel",
},
Expand Down
2 changes: 1 addition & 1 deletion time_capture/patches.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@
# Read docs to understand patches: https://frappeframework.com/docs/v14/user/en/database-migrations

[post_model_sync]
execute:from time_capture.install import after_install;after_install() # 2025-03-19 #2
execute:from time_capture.install import after_install;after_install() # 2025-05-12
32 changes: 26 additions & 6 deletions time_capture/scripts/attendance.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,9 @@
from time_capture.time_capture.doctype.time_capture.time_capture import _create_time_capture


def before_insert(doc, event):
set_flexitime_for_compensatory_leave(doc)
def on_change(doc, event):
if not doc.flags.flexitime_updated:
set_flexitime_and_working_time(doc)


def on_submit(doc, event):
Expand All @@ -18,10 +19,29 @@ def on_cancel(doc, event):
_create_time_capture(employee, doc.attendance_date)


def set_flexitime_for_compensatory_leave(doc):
if not doc.leave_type or frappe.db.get_value("Leave Type", doc.leave_type, "is_compensatory") != 1:
return
doc.flexitime = -frappe.db.get_value("Employee", doc.employee, "expected_daily_working_hours")
def set_flexitime_and_working_time(doc):
doc.flags.flexitime_updated = True
expected_working_hours = frappe.db.get_value("Employee", doc.employee, "expected_daily_working_hours")
working_hours = doc.working_hours
if not doc.leave_type:
if expected_working_hours:
HALF_DAY = expected_working_hours / 2
OVERTIME_FACTOR = 1.15
MAX_HALF_DAY = HALF_DAY * OVERTIME_FACTOR * 60 * 60
doc.db_set({"status": "Present" if working_hours > MAX_HALF_DAY else "Half Day"})
else:
if frappe.db.get_value("Leave Type", doc.leave_type, "is_compensatory") == 1:
working_hours = 0
else:
expected_working_hours = 0
working_hours = 0
doc.db_set(
{
"expected_working_hours": expected_working_hours,
"working_hours": working_hours,
"flexitime": working_hours - expected_working_hours,
}
)


def delete_time_capture(doc):
Expand Down
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
// Copyright (c) 2025, ALYF GmbH and contributors
// For license information, please see license.txt

// frappe.ui.form.on("Bulk Leave Application", {
// refresh(frm) {

// },
// });

frappe.ui.form.on("Bulk Leave Application", {
setup: function (frm) {
frm.set_query("leave_approver", function () {
return {
query: "hrms.hr.doctype.department_approver.department_approver.get_approvers",
filters: {
employee: frm.doc.employee,
doctype: "Leave Application",
},
};
});
frm.set_query("employee", erpnext.queries.employee);
},

from_date: function (frm) {
if (frm.doc.from_date && !frm.doc.to_date) {
var a_year_from_start = frappe.datetime.add_months(frm.doc.from_date, 12);
frm.set_value("to_date", frappe.datetime.add_days(a_year_from_start, -1));
}
},

employee: function (frm) {
frm.trigger("set_leave_approver");
},

set_leave_approver: function (frm) {
if (frm.doc.employee) {
return frappe.call({
method: "hrms.hr.doctype.leave_application.leave_application.get_leave_approver",
args: {
employee: frm.doc.employee,
},
callback: function (r) {
if (r && r.message) {
frm.set_value("leave_approver", r.message);
}
},
});
}
},
});

frappe.ui.form.on("Bulk Leave Application Date", {
from_date: function (frm, cdt, cdn) {
frappe.model.set_value(cdt, cdn, "to_date", locals[cdt][cdn].from_date);
},
});

Original file line number Diff line number Diff line change
@@ -0,0 +1,256 @@
{
"actions": [],
"allow_rename": 1,
"creation": "2025-04-09 14:17:35.501172",
"doctype": "DocType",
"engine": "InnoDB",
"field_order": [
"employee",
"employee_name",
"column_break_ihkc",
"leave_type",
"from_date",
"to_date",
"add_weekly_holidays",
"weekly_off",
"get_weekly_off_dates",
"dates_section",
"table_leaves",
"approval_section",
"leave_approver",
"column_break_lfyt",
"status",
"amended_from"
],
"fields": [
{
"fieldname": "employee",
"fieldtype": "Link",
"in_filter": 1,
"in_list_view": 1,
"label": "Employee",
"options": "Employee",
"reqd": 1
},
{
"fetch_from": "employee.employee_name",
"fieldname": "employee_name",
"fieldtype": "Data",
"label": "Employee Name"
},
{
"fieldname": "column_break_ihkc",
"fieldtype": "Column Break"
},
{
"fieldname": "leave_type",
"fieldtype": "Link",
"in_list_view": 1,
"label": "Leave Type",
"options": "Leave Type",
"reqd": 1
},
{
"fieldname": "approval_section",
"fieldtype": "Section Break",
"label": "Approval"
},
{
"fieldname": "leave_approver",
"fieldtype": "Link",
"label": "Leave Approver",
"options": "User",
"reqd": 1
},
{
"fieldname": "column_break_lfyt",
"fieldtype": "Column Break"
},
{
"allow_on_submit": 1,
"fieldname": "status",
"fieldtype": "Select",
"in_filter": 1,
"in_standard_filter": 1,
"label": "Status",
"no_copy": 1,
"options": "Open\nApproved\nRejected\nCancelled",
"permlevel": 1
},
{
"fieldname": "dates_section",
"fieldtype": "Section Break",
"label": "Dates"
},
{
"fieldname": "amended_from",
"fieldtype": "Link",
"label": "Amended From",
"no_copy": 1,
"options": "Bulk Leave Application",
"print_hide": 1,
"read_only": 1,
"search_index": 1
},
{
"fieldname": "table_leaves",
"fieldtype": "Table",
"label": "Leaves",
"options": "Bulk Leave Application Date"
},
{
"depends_on": "eval: doc.from_date && doc.to_date",
"fieldname": "add_weekly_holidays",
"fieldtype": "Section Break",
"label": "Add Weekly Holidays"
},
{
"fieldname": "weekly_off",
"fieldtype": "Select",
"label": "Weekly Off",
"options": "\nSunday\nMonday\nTuesday\nWednesday\nThursday\nFriday\nSaturday"
},
{
"fieldname": "get_weekly_off_dates",
"fieldtype": "Button",
"label": "Add to Holidays",
"options": "get_weekly_off_dates"
},
{
"fieldname": "from_date",
"fieldtype": "Date",
"label": "From Date",
"reqd": 1
},
{
"fieldname": "to_date",
"fieldtype": "Date",
"label": "To Date",
"reqd": 1
}
],
"grid_page_length": 50,
"index_web_pages_for_search": 1,
"is_submittable": 1,
"links": [],
"modified": "2025-05-12 08:50:33.467370",
"modified_by": "Administrator",
"module": "Time Capture",
"name": "Bulk Leave Application",
"owner": "Administrator",
"permissions": [
{
"amend": 1,
"cancel": 1,
"create": 1,
"delete": 1,
"email": 1,
"export": 1,
"print": 1,
"read": 1,
"report": 1,
"role": "System Manager",
"share": 1,
"submit": 1,
"write": 1
},
{
"create": 1,
"email": 1,
"export": 1,
"print": 1,
"read": 1,
"report": 1,
"role": "Employee",
"share": 1,
"submit": 1,
"write": 1
},
{
"create": 1,
"delete": 1,
"email": 1,
"export": 1,
"print": 1,
"read": 1,
"report": 1,
"role": "HR Manager",
"share": 1,
"submit": 1,
"write": 1
},
{
"email": 1,
"export": 1,
"permlevel": 1,
"print": 1,
"read": 1,
"report": 1,
"role": "All",
"share": 1
},
{
"create": 1,
"delete": 1,
"email": 1,
"export": 1,
"print": 1,
"read": 1,
"report": 1,
"role": "HR User",
"share": 1,
"submit": 1,
"write": 1
},
{
"delete": 1,
"email": 1,
"export": 1,
"print": 1,
"read": 1,
"report": 1,
"role": "Leave Approver",
"share": 1,
"submit": 1,
"write": 1
},
{
"email": 1,
"export": 1,
"permlevel": 1,
"print": 1,
"read": 1,
"report": 1,
"role": "Leave Approver",
"share": 1,
"write": 1
},
{
"email": 1,
"export": 1,
"permlevel": 1,
"print": 1,
"read": 1,
"report": 1,
"role": "HR User",
"share": 1,
"write": 1
},
{
"email": 1,
"export": 1,
"permlevel": 1,
"print": 1,
"read": 1,
"report": 1,
"role": "HR Manager",
"share": 1,
"write": 1
}
],
"row_format": "Dynamic",
"sort_field": "modified",
"sort_order": "DESC",
"states": [],
"title_field": "employee_name"
}
Loading
Loading