Add patch to skip user perm check for doctype (#14873)

* Add patch to skip user perm check for doctype

Skip user permission check for doctypes where
department link field was recently added

* Remove new doctype entries

* Skip doctypes if department field already exists (custom field)

* Add patch to set department value based on employee

* Update set_department_for_doctypes.py

* Update skip_user_permission_check_for_department.py
diff --git a/erpnext/patches.txt b/erpnext/patches.txt
index bd6d1c3..d960caf 100644
--- a/erpnext/patches.txt
+++ b/erpnext/patches.txt
@@ -555,5 +555,7 @@
 erpnext.patches.v11_0.set_salary_component_properties
 erpnext.patches.v11_0.set_user_permissions_for_department
 erpnext.patches.v11_0.hr_ux_cleanups
+erpnext.patches.v11_0.skip_user_permission_check_for_department
+erpnext.patches.v11_0.set_department_for_doctype
 erpnext.patches.v11_0.update_allow_transfer_for_manufacture
 erpnext.patches.v11_0.rename_healthcare_doctype_and_fields
diff --git a/erpnext/patches/v11_0/set_department_for_doctypes.py b/erpnext/patches/v11_0/set_department_for_doctypes.py
new file mode 100644
index 0000000..8fc6656
--- /dev/null
+++ b/erpnext/patches/v11_0/set_department_for_doctypes.py
@@ -0,0 +1,16 @@
+import frappe
+
+# Set department value based on employee value
+
+def execute():
+
+    doctypes_to_update = ['Appraisal', 'Leave Allocation', 'Expense Claim', 'Instructor', 'Salary Slip',
+        'Attendance', 'Training Feedback', 'Training Result Employee',
+        'Leave Application', 'Employee Advance', 'Activity Cost', 'Training Event Employee',
+        'Timesheet', 'Sales Person', 'Payroll Employee Detail']
+
+    for doctype in doctypes_to_update:
+        frappe.db.sql("""
+            update `tab%s` dt
+            set department=(select department from `tabEmployee` where name=dt.employee)
+        """ % doctype)
diff --git a/erpnext/patches/v11_0/skip_user_permission_check_for_department.py b/erpnext/patches/v11_0/skip_user_permission_check_for_department.py
new file mode 100644
index 0000000..123eed5
--- /dev/null
+++ b/erpnext/patches/v11_0/skip_user_permission_check_for_department.py
@@ -0,0 +1,28 @@
+import frappe
+
+# Skips user permission check for doctypes where department link field was recently added
+# https://github.com/frappe/erpnext/pull/14121
+
+def execute():
+    user_permissions = frappe.get_all("User Permission",
+        filters=[['allow', '=', 'Department']],
+        fields=['name', 'skip_for_doctype'])
+
+    doctypes_to_skip = []
+
+    for doctype in ['Appraisal', 'Leave Allocation', 'Expense Claim', 'Instructor', 'Salary Slip',
+                    'Attendance', 'Training Feedback', 'Training Result Employee',
+                    'Leave Application', 'Employee Advance', 'Activity Cost', 'Training Event Employee',
+                    'Timesheet', 'Sales Person', 'Payroll Employee Detail']:
+        if frappe.db.exists('Custom Field', { 'dt': doctype, 'fieldname': 'department'}): continue
+        doctypes_to_skip.append(doctype)
+
+    for perm in user_permissions:
+        skip_for_doctype = perm.get('skip_for_doctype')
+
+        skip_for_doctype = skip_for_doctype.split('\n') + doctypes_to_skip
+        skip_for_doctype = set(skip_for_doctype) # to remove duplicates
+        skip_for_doctype = '\n'.join(skip_for_doctype) # convert back to string
+
+        frappe.set_value('User Permission', perm.name, 'skip_for_doctype', skip_for_doctype)
+