--- /dev/null
+<?php
+
+namespace Cubedesigners\UserDatabase;
+
+class Permissions
+{
+ protected static $_dataOk = false;
+ /**
+ * @var array[]
+ */
+ protected static $_companyUsers = [];
+ /**
+ * @var int[]
+ */
+ protected static $_usersCompany = [];
+
+ /**
+ * @var array[]
+ */
+ protected static $_managedCompanies = [];
+
+ protected static $_companyManagedBy = [];
+
+ protected function _getData()
+ {
+ if (self::$_dataOk) {
+ return;
+ }
+ self::$_dataOk = true;
+
+ foreach (User::all() as $user) {
+ if (!isset(self::$_companyUsers[$user->company])) {
+ self::$_companyUsers[$user->company] = [];
+ }
+
+ self::$_companyUsers[$user->company][] = $user->id;
+ self::$_usersCompany[$user->id] = $user->company;
+ }
+
+ foreach (Company::all() as $company) {
+ $adminCompany = self::getCompanyByUser($company->admin);
+ if ($company->id !== $adminCompany) {
+ self::$_companyManagedBy[$company->id] = [$adminCompany];
+ }
+ }
+
+ for ($i = 0; $i <= 3; $i++) {
+ foreach (self::$_companyManagedBy as $company => $admins) {
+ foreach ($admins as $admin) {
+ if (isset(self::$_companyManagedBy[$admin])) {
+ self::$_companyManagedBy[$company] = array_unique(array_merge(self::$_companyManagedBy[$admin], self::$_companyManagedBy[$company]), SORT_REGULAR);
+ }
+ }
+ }
+ }
+
+ dd(self::$_companyManagedBy);
+
+
+ }
+
+ /**
+ * @param integer $company
+ * @return array
+ */
+ public static function getUsersByCompany($company)
+ {
+ self::_getData();
+ return self::$_companyUsers[$company];
+ }
+
+ /**
+ * @param integer $user
+ * @return integer
+ */
+ public static function getCompanyByUser($user)
+ {
+ self::_getData();
+ return self::$_usersCompany[$user];
+ }
+
+ /**
+ * @param integer $user
+ * @return array
+ */
+ public static function getWorkmates($user)
+ {
+ return self::getUsersByCompany(self::getCompanyByUser($user));
+ }
+}