diff --git a/app/modules/employees/service.py b/app/modules/employees/service.py
index d601136..2578361 100644
--- a/app/modules/employees/service.py
+++ b/app/modules/employees/service.py
@@ -290,6 +290,15 @@ def create_login_user_for_employee(
def create_employee(db: Session, actor: User, scope: EmployeeScope, data: dict[str, Any]) -> Employee:
cleaned = _clean_payload(data)
+ partner_staff_mode = bool(scope.is_partner and not scope.is_system_admin and not scope.is_firm_admin)
+
+ # Partners can create staff only in their own tenant and branch. Never trust
+ # tenant, branch or role values posted by the browser for this workflow.
+ if partner_staff_mode:
+ cleaned["tenant_id"] = scope.tenant_id
+ cleaned["branch_id"] = scope.branch_id or actor.branch_id
+ cleaned["employee_role"] = "Staff"
+
tenant_id = int(cleaned.get("tenant_id") or scope.tenant_id)
branch_id = int(cleaned.get("branch_id") or actor.branch_id)
@@ -311,6 +320,11 @@ def create_employee(db: Session, actor: User, scope: EmployeeScope, data: dict[s
raise HTTPException(status_code=404, detail="Selected user was not found.")
if linked_user.tenant_id != tenant_id or linked_user.branch_id != branch_id:
raise HTTPException(status_code=400, detail="Selected user must belong to the employee tenant and branch.")
+ if partner_staff_mode:
+ linked_roles = _role_set(db, linked_user)
+ elevated_roles = {"System Admin", "Firm Admin", "Partner", "Branch Manager"}
+ if "Staff" not in linked_roles or linked_roles.intersection(elevated_roles):
+ raise HTTPException(status_code=403, detail="Partners can link only a Staff login user.")
user_id = linked_user.id
elif cleaned.get("create_login_user"):
login_user = create_login_user_for_employee(
diff --git a/app/modules/employees/templates/employees/form.html b/app/modules/employees/templates/employees/form.html
index 7d0b4ee..97a328c 100644
--- a/app/modules/employees/templates/employees/form.html
+++ b/app/modules/employees/templates/employees/form.html
@@ -11,7 +11,7 @@
{{ title }}
-
Create or update the employee master. Attendance, leave, payroll and ESS will be added in later phases.
+
{% if partner_staff_mode and not is_edit %}Create a Staff employee in your assigned branch and optionally create the Staff login account.{% else %}Create or update the employee master. Attendance, leave, payroll and ESS will be added in later phases.{% endif %}
{% if partner_staff_mode %}Link an existing unlinked Staff login or create a Staff login automatically for this employee.{% else %}Either link an existing unlinked login user or create a login user automatically for this employee.{% endif %}
@@ -43,7 +43,13 @@
Minimum 8 characters. User must change password after login.