From d4348da163ac592ed96a2b7223d70388d1847d56 Mon Sep 17 00:00:00 2001
From: alivin70 <v.bruno@vinsoft.it>
Date: Tue, 28 Jan 2025 20:03:48 +0100
Subject: [PATCH] Adddress issue #1947
 https://code.vtiger.com/vtiger/vtigercrm/-/issues/1947 Problem on users
 visibility based on "Can Assign Records To" set to "Users having Same Role or
 Subordinate Role" in role configuration.

---
 languages/en_us/Settings/Roles.php            |  1 +
 .../v7/modules/Settings/Roles/EditView.tpl    |  5 +++++
 modules/Users/models/Record.php               | 20 +++++++++++++++++++
 3 files changed, 26 insertions(+)

diff --git a/languages/en_us/Settings/Roles.php b/languages/en_us/Settings/Roles.php
index dd9d11ab1..77ab8b62e 100644
--- a/languages/en_us/Settings/Roles.php
+++ b/languages/en_us/Settings/Roles.php
@@ -35,6 +35,7 @@ $languageStrings = array(
 	'LBL_ALL_USERS' => 'All Users',
 	'LBL_USERS_WITH_LOWER_LEVEL' => 'Users having Subordinate Role',
 	'LBL_USERS_WITH_SAME_OR_LOWER_LEVEL' => 'Users having Same Role or Subordinate Role',
+        'LBL_USERS_WITH_SAME_LEVEL_AND_SUBORDINATES' => 'Users having Same Level or Subordinate Role',
     
     /*Vtiger7 String*/
     'LBL_EDIT_ROLE' => 'Edit Role',
diff --git a/layouts/v7/modules/Settings/Roles/EditView.tpl b/layouts/v7/modules/Settings/Roles/EditView.tpl
index 917115bcb..a73e5bd04 100644
--- a/layouts/v7/modules/Settings/Roles/EditView.tpl
+++ b/layouts/v7/modules/Settings/Roles/EditView.tpl
@@ -68,6 +68,11 @@
                                 <div class="radio">
                                     <label>
                                     <input type="radio" value="2" {if $RECORD_MODEL->get('allowassignedrecordsto') eq '2'} checked="" {/if} name="allowassignedrecordsto" data-handler="new" class="alignTop"/>
+                                    &nbsp;{vtranslate('LBL_USERS_WITH_SAME_LEVEL_AND_SUBORDINATES',$QUALIFIED_MODULE)}</label>
+                                </div>
+                                <div class="radio">
+                                    <label>
+                                    <input type="radio" value="4" {if $RECORD_MODEL->get('allowassignedrecordsto') eq '4'} checked="" {/if} name="allowassignedrecordsto" data-handler="new" class="alignTop"/>
                                     &nbsp;{vtranslate('LBL_USERS_WITH_SAME_OR_LOWER_LEVEL',$QUALIFIED_MODULE)}</label>
                                 </div>
                                 <div class="radio">
diff --git a/modules/Users/models/Record.php b/modules/Users/models/Record.php
index 0308b1739..c6933e9c2 100644
--- a/modules/Users/models/Record.php
+++ b/modules/Users/models/Record.php
@@ -426,6 +426,8 @@ class Users_Record_Model extends Vtiger_Record_Model {
         if(empty($accessibleUser)) {
 			if($currentUserRoleModel->get('allowassignedrecordsto') === '1' || $private == 'Public') {
 				$accessibleUser = get_user_array(false, "ACTIVE", "", $private,$module);
+			} else if($currentUserRoleModel->get('allowassignedrecordsto') === '4'){
+				$accessibleUser = $this->getSameRolelUsersWithSubordinates();
 			} else if($currentUserRoleModel->get('allowassignedrecordsto') === '2'){
 				$accessibleUser = $this->getSameLevelUsersWithSubordinates();
 			} else if($currentUserRoleModel->get('allowassignedrecordsto') === '3') {
@@ -436,6 +438,24 @@ class Users_Record_Model extends Vtiger_Record_Model {
 		return $accessibleUser;
 	}
 
+	/**
+	 * Function to get same ROLE and subordinates Users
+	 * @return <array> Users
+	 */
+	public function getSameRolelUsersWithSubordinates(){
+		$currentUserRoleModel = Settings_Roles_Record_Model::getInstanceById($this->getRole());
+                $roleID = $currentUserRoleModel->getId();
+		//$sameLevelRoles = $currentUserRoleModel->getSameLevelRoles();
+                //$sameLevelUsers = $this->getAllUsersOnRoles($sameLevelRoles);
+                $thisRole = array($roleID =>$currentUserRoleModel );
+                $sameLevelUsers = $this->getAllUsersOnRoles($thisRole);
+		$subordinateUsers = $this->getRoleBasedSubordinateUsers();
+		foreach ($subordinateUsers as $userId => $userName) {
+			$sameLevelUsers[$userId] = $userName;
+		}
+		return $sameLevelUsers;
+	}
+        
 	/**
 	 * Function to get same level and subordinates Users
 	 * @return <array> Users
-- 
GitLab