refactor: Shift Request

This commit is contained in:
Anurag Mishra 2020-06-23 17:37:41 +05:30
parent a6ec7e31d2
commit b3e00de0ae
6 changed files with 267 additions and 442 deletions

View File

@ -17,10 +17,10 @@
"payroll_cost_center", "payroll_cost_center",
"column_break_9", "column_break_9",
"leave_block_list", "leave_block_list",
"leave_section", "approvers",
"leave_approvers", "leave_approvers",
"expense_section",
"expense_approvers", "expense_approvers",
"shift_request_approver",
"lft", "lft",
"rgt", "rgt",
"old_parent" "old_parent"
@ -33,14 +33,18 @@
"label": "Department", "label": "Department",
"oldfieldname": "department_name", "oldfieldname": "department_name",
"oldfieldtype": "Data", "oldfieldtype": "Data",
"reqd": 1 "reqd": 1,
"show_days": 1,
"show_seconds": 1
}, },
{ {
"fieldname": "parent_department", "fieldname": "parent_department",
"fieldtype": "Link", "fieldtype": "Link",
"in_list_view": 1, "in_list_view": 1,
"label": "Parent Department", "label": "Parent Department",
"options": "Department" "options": "Department",
"show_days": 1,
"show_seconds": 1
}, },
{ {
"fieldname": "company", "fieldname": "company",
@ -48,7 +52,9 @@
"in_standard_filter": 1, "in_standard_filter": 1,
"label": "Company", "label": "Company",
"options": "Company", "options": "Company",
"reqd": 1 "reqd": 1,
"show_days": 1,
"show_seconds": 1
}, },
{ {
"bold": 1, "bold": 1,
@ -56,17 +62,23 @@
"fieldname": "is_group", "fieldname": "is_group",
"fieldtype": "Check", "fieldtype": "Check",
"in_list_view": 1, "in_list_view": 1,
"label": "Is Group" "label": "Is Group",
"show_days": 1,
"show_seconds": 1
}, },
{ {
"default": "0", "default": "0",
"fieldname": "disabled", "fieldname": "disabled",
"fieldtype": "Check", "fieldtype": "Check",
"label": "Disabled" "label": "Disabled",
"show_days": 1,
"show_seconds": 1
}, },
{ {
"fieldname": "section_break_4", "fieldname": "section_break_4",
"fieldtype": "Section Break" "fieldtype": "Section Break",
"show_days": 1,
"show_seconds": 1
}, },
{ {
"description": "Days for which Holidays are blocked for this department.", "description": "Days for which Holidays are blocked for this department.",
@ -74,31 +86,25 @@
"fieldtype": "Link", "fieldtype": "Link",
"in_list_view": 1, "in_list_view": 1,
"label": "Leave Block List", "label": "Leave Block List",
"options": "Leave Block List" "options": "Leave Block List",
"show_days": 1,
"show_seconds": 1
}, },
{ {
"fieldname": "leave_section",
"fieldtype": "Section Break",
"label": "Leave Approvers"
},
{
"description": "The first Leave Approver in the list will be set as the default Leave Approver.",
"fieldname": "leave_approvers", "fieldname": "leave_approvers",
"fieldtype": "Table", "fieldtype": "Table",
"label": "Leave Approver", "label": "Leave Approver",
"options": "Department Approver" "options": "Department Approver",
"show_days": 1,
"show_seconds": 1
}, },
{ {
"fieldname": "expense_section",
"fieldtype": "Section Break",
"label": "Expense Approvers"
},
{
"description": "The first Expense Approver in the list will be set as the default Expense Approver.",
"fieldname": "expense_approvers", "fieldname": "expense_approvers",
"fieldtype": "Table", "fieldtype": "Table",
"label": "Expense Approver", "label": "Expense Approver",
"options": "Department Approver" "options": "Department Approver",
"show_days": 1,
"show_seconds": 1
}, },
{ {
"fieldname": "lft", "fieldname": "lft",
@ -106,7 +112,9 @@
"hidden": 1, "hidden": 1,
"label": "lft", "label": "lft",
"print_hide": 1, "print_hide": 1,
"read_only": 1 "read_only": 1,
"show_days": 1,
"show_seconds": 1
}, },
{ {
"fieldname": "rgt", "fieldname": "rgt",
@ -114,7 +122,9 @@
"hidden": 1, "hidden": 1,
"label": "rgt", "label": "rgt",
"print_hide": 1, "print_hide": 1,
"read_only": 1 "read_only": 1,
"show_days": 1,
"show_seconds": 1
}, },
{ {
"fieldname": "old_parent", "fieldname": "old_parent",
@ -122,28 +132,52 @@
"hidden": 1, "hidden": 1,
"ignore_user_permissions": 1, "ignore_user_permissions": 1,
"label": "Old Parent", "label": "Old Parent",
"print_hide": 1 "print_hide": 1,
"show_days": 1,
"show_seconds": 1
}, },
{ {
"fieldname": "column_break_3", "fieldname": "column_break_3",
"fieldtype": "Column Break" "fieldtype": "Column Break",
"show_days": 1,
"show_seconds": 1
}, },
{ {
"fieldname": "payroll_cost_center", "fieldname": "payroll_cost_center",
"fieldtype": "Link", "fieldtype": "Link",
"label": "Payroll Cost Center", "label": "Payroll Cost Center",
"options": "Cost Center" "options": "Cost Center",
"show_days": 1,
"show_seconds": 1
}, },
{ {
"fieldname": "column_break_9", "fieldname": "column_break_9",
"fieldtype": "Column Break" "fieldtype": "Column Break",
"show_days": 1,
"show_seconds": 1
},
{
"description": "The first Approver in the list will be set as the default Approver.",
"fieldname": "approvers",
"fieldtype": "Section Break",
"label": "Approvers",
"show_days": 1,
"show_seconds": 1
},
{
"fieldname": "shift_request_approver",
"fieldtype": "Table",
"label": "Shift Request Approver",
"options": "Department Approver",
"show_days": 1,
"show_seconds": 1
} }
], ],
"icon": "fa fa-sitemap", "icon": "fa fa-sitemap",
"idx": 1, "idx": 1,
"is_tree": 1, "is_tree": 1,
"links": [], "links": [],
"modified": "2020-05-05 18:49:28.503931", "modified": "2020-06-23 15:42:00.563272",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "HR", "module": "HR",
"name": "Department", "name": "Department",

View File

@ -15,7 +15,7 @@ class DepartmentApprover(Document):
def get_approvers(doctype, txt, searchfield, start, page_len, filters): def get_approvers(doctype, txt, searchfield, start, page_len, filters):
if not filters.get("employee"): if not filters.get("employee"):
frappe.throw(_("Please select Employee Record first.")) frappe.throw(_("Please select Employee first."))
approvers = [] approvers = []
department_details = {} department_details = {}
@ -41,9 +41,12 @@ def get_approvers(doctype, txt, searchfield, start, page_len, filters):
if filters.get("doctype") == "Leave Application": if filters.get("doctype") == "Leave Application":
parentfield = "leave_approvers" parentfield = "leave_approvers"
field_name = "Leave Approver" field_name = "Leave Approver"
else: elif filters.get("doctype") == "Leave Application":
parentfield = "expense_approvers" parentfield = "expense_approvers"
field_name = "Expense Approver" field_name = "Expense Approver"
else:
parentfield = "shift_request_approver"
field_name = "Approver"
if department_list: if department_list:
for d in department_list: for d in department_list:
approvers += frappe.db.sql("""select user.name, user.first_name, user.last_name from approvers += frappe.db.sql("""select user.name, user.first_name, user.last_name from

View File

@ -2,7 +2,16 @@
// For license information, please see license.txt // For license information, please see license.txt
frappe.ui.form.on('Shift Request', { frappe.ui.form.on('Shift Request', {
refresh: function(frm) { setup: function(frm) {
frm.set_query("approver", function() {
} return {
query: "erpnext.hr.doctype.department_approver.department_approver.get_approvers",
filters: {
employee: frm.doc.employee,
doctype: frm.doc.doctype
}
};
});
frm.set_query("employee", erpnext.queries.employee);
},
}); });

View File

@ -1,396 +1,175 @@
{ {
"allow_copy": 0, "actions": [],
"allow_guest_to_view": 0, "allow_import": 1,
"allow_import": 1, "autoname": "HR-SHR-.YY.-.MM.-.#####",
"allow_rename": 0, "creation": "2018-04-13 16:32:27.974273",
"autoname": "HR-SHR-.YY.-.MM.-.#####", "doctype": "DocType",
"beta": 0, "editable_grid": 1,
"creation": "2018-04-13 16:32:27.974273", "engine": "InnoDB",
"custom": 0, "field_order": [
"docstatus": 0, "shift_type",
"doctype": "DocType", "employee",
"document_type": "", "employee_name",
"editable_grid": 1, "department",
"engine": "InnoDB", "status",
"column_break_4",
"company",
"approver",
"from_date",
"to_date",
"amended_from"
],
"fields": [ "fields": [
{ {
"allow_bulk_edit": 0, "fieldname": "shift_type",
"allow_in_quick_entry": 0, "fieldtype": "Link",
"allow_on_submit": 0, "in_list_view": 1,
"bold": 0, "label": "Shift Type",
"collapsible": 0, "options": "Shift Type",
"columns": 0, "reqd": 1,
"fieldname": "shift_type", "show_days": 1,
"fieldtype": "Link", "show_seconds": 1
"hidden": 0, },
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 1,
"in_standard_filter": 0,
"label": "Shift Type",
"length": 0,
"no_copy": 0,
"options": "Shift Type",
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{ {
"allow_bulk_edit": 0, "fieldname": "employee",
"allow_in_quick_entry": 0, "fieldtype": "Link",
"allow_on_submit": 0, "in_list_view": 1,
"bold": 0, "label": "Employee",
"collapsible": 0, "options": "Employee",
"columns": 0, "reqd": 1,
"fieldname": "employee", "show_days": 1,
"fieldtype": "Link", "show_seconds": 1
"hidden": 0, },
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 1,
"in_standard_filter": 0,
"label": "Employee",
"length": 0,
"no_copy": 0,
"options": "Employee",
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{ {
"allow_bulk_edit": 0, "fetch_from": "employee.employee_name",
"allow_in_quick_entry": 0, "fieldname": "employee_name",
"allow_on_submit": 0, "fieldtype": "Data",
"bold": 0, "label": "Employee Name",
"collapsible": 0, "read_only": 1,
"columns": 0, "show_days": 1,
"fetch_from": "employee.employee_name", "show_seconds": 1
"fieldname": "employee_name", },
"fieldtype": "Data",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Employee Name",
"length": 0,
"no_copy": 0,
"options": "",
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 1,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{ {
"allow_bulk_edit": 0, "fetch_from": "employee.department",
"allow_in_quick_entry": 0, "fieldname": "department",
"allow_on_submit": 0, "fieldtype": "Link",
"bold": 0, "label": "Department",
"collapsible": 0, "options": "Department",
"columns": 0, "read_only": 1,
"fetch_from": "employee.department", "show_days": 1,
"fieldname": "department", "show_seconds": 1
"fieldtype": "Link", },
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Department",
"length": 0,
"no_copy": 0,
"options": "Department",
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 1,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{ {
"allow_bulk_edit": 0, "fieldname": "column_break_4",
"allow_in_quick_entry": 0, "fieldtype": "Column Break",
"allow_on_submit": 0, "show_days": 1,
"bold": 0, "show_seconds": 1
"collapsible": 0, },
"columns": 0,
"fieldname": "column_break_4",
"fieldtype": "Column Break",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{ {
"allow_bulk_edit": 0, "fieldname": "company",
"allow_in_quick_entry": 0, "fieldtype": "Link",
"allow_on_submit": 0, "in_list_view": 1,
"bold": 0, "label": "Company",
"collapsible": 0, "options": "Company",
"columns": 0, "reqd": 1,
"fieldname": "company", "show_days": 1,
"fieldtype": "Link", "show_seconds": 1
"hidden": 0, },
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 1,
"in_standard_filter": 0,
"label": "Company",
"length": 0,
"no_copy": 0,
"options": "Company",
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{ {
"allow_bulk_edit": 0, "fieldname": "from_date",
"allow_in_quick_entry": 0, "fieldtype": "Date",
"allow_on_submit": 0, "label": "From Date",
"bold": 0, "reqd": 1,
"collapsible": 0, "show_days": 1,
"columns": 0, "show_seconds": 1
"fieldname": "from_date", },
"fieldtype": "Date",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "From Date",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{ {
"allow_bulk_edit": 0, "fieldname": "to_date",
"allow_in_quick_entry": 0, "fieldtype": "Date",
"allow_on_submit": 0, "label": "To Date",
"bold": 0, "show_days": 1,
"collapsible": 0, "show_seconds": 1
"columns": 0, },
"fieldname": "to_date",
"fieldtype": "Date",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "To Date",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{ {
"allow_bulk_edit": 0, "fieldname": "amended_from",
"allow_in_quick_entry": 0, "fieldtype": "Link",
"allow_on_submit": 0, "label": "Amended From",
"bold": 0, "no_copy": 1,
"collapsible": 0, "options": "Shift Request",
"columns": 0, "print_hide": 1,
"fieldname": "amended_from", "read_only": 1,
"fieldtype": "Link", "show_days": 1,
"hidden": 0, "show_seconds": 1
"ignore_user_permissions": 0, },
"ignore_xss_filter": 0, {
"in_filter": 0, "default": "Draft",
"in_global_search": 0, "fieldname": "status",
"in_list_view": 0, "fieldtype": "Select",
"in_standard_filter": 0, "label": "Status",
"label": "Amended From", "options": "Draft\nApproved\nRejected",
"length": 0, "reqd": 1,
"no_copy": 1, "show_days": 1,
"options": "Shift Request", "show_seconds": 1
"permlevel": 0, },
"print_hide": 1, {
"print_hide_if_no_value": 0, "fieldname": "approver",
"read_only": 1, "fieldtype": "Link",
"remember_last_selected_value": 0, "label": "Approver",
"report_hide": 0, "options": "User",
"reqd": 0, "reqd": 1,
"search_index": 0, "show_days": 1,
"set_only_once": 0, "show_seconds": 1
"translatable": 0,
"unique": 0
} }
], ],
"has_web_view": 0, "is_submittable": 1,
"hide_heading": 0, "links": [],
"hide_toolbar": 0, "modified": "2020-06-23 15:56:44.536207",
"idx": 0, "modified_by": "Administrator",
"image_view": 0, "module": "HR",
"in_create": 0, "name": "Shift Request",
"is_submittable": 1, "owner": "Administrator",
"issingle": 0,
"istable": 0,
"max_attachments": 0,
"modified": "2018-08-21 16:15:36.577448",
"modified_by": "Administrator",
"module": "HR",
"name": "Shift Request",
"name_case": "",
"owner": "Administrator",
"permissions": [ "permissions": [
{ {
"amend": 0, "create": 1,
"cancel": 0, "email": 1,
"create": 1, "export": 1,
"delete": 0, "print": 1,
"email": 1, "read": 1,
"export": 1, "report": 1,
"if_owner": 0, "role": "Employee",
"import": 0, "share": 1,
"permlevel": 0,
"print": 1,
"read": 1,
"report": 1,
"role": "Employee",
"set_user_permissions": 0,
"share": 1,
"submit": 1,
"write": 1 "write": 1
}, },
{ {
"amend": 1, "amend": 1,
"cancel": 1, "cancel": 1,
"create": 1, "create": 1,
"delete": 1, "delete": 1,
"email": 1, "email": 1,
"export": 1, "export": 1,
"if_owner": 0, "print": 1,
"import": 0, "read": 1,
"permlevel": 0, "report": 1,
"print": 1, "role": "HR Manager",
"read": 1, "share": 1,
"report": 1, "submit": 1,
"role": "HR Manager",
"set_user_permissions": 0,
"share": 1,
"submit": 1,
"write": 1 "write": 1
}, },
{ {
"amend": 0, "create": 1,
"cancel": 0, "email": 1,
"create": 1, "export": 1,
"delete": 0, "print": 1,
"email": 1, "read": 1,
"export": 1, "report": 1,
"if_owner": 0, "role": "HR User",
"import": 0, "share": 1,
"permlevel": 0, "submit": 1,
"print": 1,
"read": 1,
"report": 1,
"role": "HR User",
"set_user_permissions": 0,
"share": 1,
"submit": 1,
"write": 1 "write": 1
} }
], ],
"quick_entry": 0, "sort_field": "modified",
"read_only": 0, "sort_order": "DESC",
"read_only_onload": 0, "title_field": "employee_name",
"show_name_in_global_search": 0, "track_changes": 1
"sort_field": "modified",
"sort_order": "DESC",
"title_field": "employee_name",
"track_changes": 1,
"track_seen": 0,
"track_views": 0
} }

View File

@ -7,6 +7,7 @@ import frappe
from frappe import _ from frappe import _
from frappe.model.document import Document from frappe.model.document import Document
from frappe.utils import formatdate, getdate from frappe.utils import formatdate, getdate
from erpnext.hr.doctype.department_approver.department_approver import get_approvers
class OverlapError(frappe.ValidationError): pass class OverlapError(frappe.ValidationError): pass
@ -14,15 +15,19 @@ class ShiftRequest(Document):
def validate(self): def validate(self):
self.validate_dates() self.validate_dates()
self.validate_shift_request_overlap_dates() self.validate_shift_request_overlap_dates()
self.validate_approver()
def on_submit(self): def on_submit(self):
date_list = self.get_working_days(self.from_date, self.to_date) if self.status not in ["Approved", "Rejected"]:
for date in date_list: frappe.throw(_("Only Shift Request with status 'Approved' and 'Rejected' can be submitted"))
if self.status == "Approved":
assignment_doc = frappe.new_doc("Shift Assignment") assignment_doc = frappe.new_doc("Shift Assignment")
assignment_doc.company = self.company assignment_doc.company = self.company
assignment_doc.shift_type = self.shift_type assignment_doc.shift_type = self.shift_type
assignment_doc.employee = self.employee assignment_doc.employee = self.employee
assignment_doc.date = date assignment_doc.start_date = self.from_date
if self.to_date:
assignment_doc.end_date = self.to_date
assignment_doc.shift_request = self.name assignment_doc.shift_request = self.name
assignment_doc.insert() assignment_doc.insert()
assignment_doc.submit() assignment_doc.submit()
@ -34,6 +39,13 @@ class ShiftRequest(Document):
shift_assignment_doc = frappe.get_doc("Shift Assignment", shift['name']) shift_assignment_doc = frappe.get_doc("Shift Assignment", shift['name'])
shift_assignment_doc.cancel() shift_assignment_doc.cancel()
def validate_approver(self):
department = frappe.get_value("Employee", self.employee, "department")
# shift_approver = frappe.get_value("Employee", self.employee, "shift_request_approver")
approvers = frappe.db.sql("""select approver from `tabDepartment Approver` where parent= %s and parentfield = 'shift_request_approver'""", (department))
approvers = [approver[0] for approver in approvers]
if self.approver not in approvers:
frappe.throw(__("Only Approvers can Approve this Request."))
def validate_dates(self): def validate_dates(self):
if self.from_date and self.to_date and (getdate(self.to_date) < getdate(self.from_date)): if self.from_date and self.to_date and (getdate(self.to_date) < getdate(self.from_date)):
@ -68,28 +80,4 @@ class ShiftRequest(Document):
msg = _("Employee {0} has already applied for {1} between {2} and {3} : ").format(self.employee, msg = _("Employee {0} has already applied for {1} between {2} and {3} : ").format(self.employee,
d['shift_type'], formatdate(d['from_date']), formatdate(d['to_date'])) \ d['shift_type'], formatdate(d['from_date']), formatdate(d['to_date'])) \
+ """ <b><a href="#Form/Shift Request/{0}">{0}</a></b>""".format(d["name"]) + """ <b><a href="#Form/Shift Request/{0}">{0}</a></b>""".format(d["name"])
frappe.throw(msg, OverlapError) frappe.throw(msg, OverlapError)
def get_working_days(self, start_date, end_date):
start_date, end_date = getdate(start_date), getdate(end_date)
from datetime import timedelta
date_list = []
employee_holiday_list = []
employee_holidays = frappe.db.sql("""select holiday_date from `tabHoliday`
where parent in (select holiday_list from `tabEmployee`
where name = %s)""",self.employee,as_dict=1)
for d in employee_holidays:
employee_holiday_list.append(d.holiday_date)
reference_date = start_date
while reference_date <= end_date:
if reference_date not in employee_holiday_list:
date_list.append(reference_date)
reference_date += timedelta(days=1)
return date_list

View File

@ -5,7 +5,7 @@ from __future__ import unicode_literals
import frappe import frappe
import unittest import unittest
from frappe.utils import nowdate from frappe.utils import nowdate, add_days
class TestShiftRequest(unittest.TestCase): class TestShiftRequest(unittest.TestCase):
def setUp(self): def setUp(self):
@ -13,14 +13,20 @@ class TestShiftRequest(unittest.TestCase):
frappe.db.sql("delete from `tab{doctype}`".format(doctype=doctype)) frappe.db.sql("delete from `tab{doctype}`".format(doctype=doctype))
def test_make_shift_request(self): def test_make_shift_request(self):
department = frappe.get_value("Employee", "_T-Employee-00001", 'department')
set_shift_approver(department)
approver = frappe.db.sql("""select approver from `tabDepartment Approver` where parent= %s and parentfield = 'shift_request_approver'""", (department))[0][0]
shift_request = frappe.get_doc({ shift_request = frappe.get_doc({
"doctype": "Shift Request", "doctype": "Shift Request",
"shift_type": "Day Shift", "shift_type": "Day Shift",
"company": "_Test Company", "company": "_Test Company",
"employee": "_T-Employee-00001", "employee": "_T-Employee-00001",
"employee_name": "_Test Employee", "employee_name": "_Test Employee",
"start_date": nowdate(), "from_date": nowdate(),
"end_date": nowdate() "to_date": add_days(nowdate(), 10),
"approver": approver,
"status": "Approved"
}) })
shift_request.insert() shift_request.insert()
shift_request.submit() shift_request.submit()
@ -34,4 +40,10 @@ class TestShiftRequest(unittest.TestCase):
self.assertEqual(shift_request.employee, employee) self.assertEqual(shift_request.employee, employee)
shift_request.cancel() shift_request.cancel()
shift_assignment_doc = frappe.get_doc("Shift Assignment", {"shift_request": d.get('shift_request')}) shift_assignment_doc = frappe.get_doc("Shift Assignment", {"shift_request": d.get('shift_request')})
self.assertEqual(shift_assignment_doc.docstatus, 2) self.assertEqual(shift_assignment_doc.docstatus, 2)
def set_shift_approver(department):
department_doc = frappe.get_doc("Department", department)
department_doc.append('shift_request_approver',{'approver': "test1@example.com"})
department_doc.save()
department_doc.reload()