2016-03-25 01:18:05 -07:00
< ? php
namespace App\Models ;
use Illuminate\Auth\Authenticatable ;
use Illuminate\Database\Eloquent\Model ;
use Illuminate\Auth\Passwords\CanResetPassword ;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract ;
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract ;
use Watson\Validating\ValidatingTrait ;
use Illuminate\Database\Eloquent\SoftDeletes ;
2016-07-26 01:39:30 -07:00
use App\Http\Traits\UniqueUndeletedTrait ;
2016-09-07 01:41:23 -07:00
use App\Models\Setting ;
2016-12-14 05:06:51 -08:00
use Illuminate\Notifications\Notifiable ;
2016-12-14 10:06:05 -08:00
use Laravel\Passport\HasApiTokens ;
2016-03-25 01:18:05 -07:00
class User extends Model implements AuthenticatableContract , CanResetPasswordContract
{
use SoftDeletes ;
use ValidatingTrait ;
use Authenticatable ;
use CanResetPassword ;
2016-07-26 01:39:30 -07:00
use UniqueUndeletedTrait ;
2016-12-14 05:06:51 -08:00
use Notifiable ;
2016-12-14 10:06:05 -08:00
use HasApiTokens ;
2016-03-25 01:18:05 -07:00
protected $dates = [ 'deleted_at' ];
protected $table = 'users' ;
protected $injectUniqueIdentifier = true ;
protected $fillable = [ 'first_name' , 'last_name' , 'email' , 'password' , 'username' ];
2016-06-02 17:16:22 -07:00
/**
* Model validation rules
*
* @ var array
*/
2016-03-25 01:18:05 -07:00
protected $rules = [
2016-06-02 17:16:22 -07:00
'first_name' => 'required|string|min:1' ,
2016-07-26 01:49:21 -07:00
'username' => 'required|string|min:2|unique_undeleted' ,
2016-06-02 17:16:22 -07:00
'email' => 'email' ,
'password' => 'required|min:6' ,
2016-03-25 01:18:05 -07:00
];
public function hasAccess ( $section )
{
2016-06-02 02:49:32 -07:00
2016-05-14 15:05:35 -07:00
if ( $this -> isSuperUser ()) {
return true ;
}
2016-06-15 20:45:45 -07:00
2016-06-02 02:49:32 -07:00
$user_groups = $this -> groups ;
2016-05-18 14:38:17 -07:00
2016-06-02 02:49:32 -07:00
if (( $this -> permissions == '' ) && ( count ( $user_groups ) == 0 )) {
2016-05-18 14:38:17 -07:00
return false ;
}
2016-06-02 02:49:32 -07:00
2016-03-25 01:18:05 -07:00
$user_permissions = json_decode ( $this -> permissions , true );
2016-07-28 20:59:42 -07:00
//If the user is explicitly granted, return true
2016-06-22 12:27:41 -07:00
if (( $user_permissions != '' ) && (( array_key_exists ( $section , $user_permissions )) && ( $user_permissions [ $section ] == '1' ))) {
2016-06-15 20:45:45 -07:00
return true ;
}
// If the user is explicitly denied, return false
2016-06-22 12:27:41 -07:00
if (( $user_permissions == '' ) || array_key_exists ( $section , $user_permissions ) && ( $user_permissions [ $section ] == '-1' )) {
2016-06-15 20:45:45 -07:00
return false ;
2016-03-25 01:18:05 -07:00
}
2016-06-15 20:45:45 -07:00
// Loop through the groups to see if any of them grant this permission
2016-03-25 01:18:05 -07:00
foreach ( $user_groups as $user_group ) {
2016-08-30 13:25:14 -07:00
$group_permissions = ( array ) json_decode ( $user_group -> permissions , true );
2016-06-02 02:49:32 -07:00
if ((( array_key_exists ( $section , $group_permissions )) && ( $group_permissions [ $section ] == '1' ))) {
2016-06-15 20:45:45 -07:00
return true ;
2016-03-25 01:18:05 -07:00
}
}
2016-06-15 20:45:45 -07:00
return false ;
2016-03-25 01:18:05 -07:00
}
2016-06-22 12:27:41 -07:00
public function isSuperUser ()
{
2016-05-12 21:01:31 -07:00
if ( ! $user_permissions = json_decode ( $this -> permissions , true )) {
return false ;
}
2016-05-14 15:05:35 -07:00
2016-06-02 02:49:32 -07:00
foreach ( $this -> groups as $user_group ) {
2016-05-12 21:01:31 -07:00
$group_permissions = json_decode ( $user_group -> permissions , true );
2016-08-30 13:25:14 -07:00
$group_array = ( array ) $group_permissions ;
2016-06-02 02:49:32 -07:00
if (( array_key_exists ( 'superuser' , $group_array )) && ( $group_permissions [ 'superuser' ] == '1' )) {
return true ;
}
2016-05-12 21:01:31 -07:00
}
2016-06-02 17:16:22 -07:00
2016-03-25 01:18:05 -07:00
if (( array_key_exists ( 'superuser' , $user_permissions )) && ( $user_permissions [ 'superuser' ] == '1' )) {
return true ;
}
2016-06-02 02:49:32 -07:00
return false ;
2016-03-25 01:18:05 -07:00
}
public function company ()
{
return $this -> belongsTo ( '\App\Models\Company' , 'company_id' );
}
public function isActivated ()
{
if ( $this -> activated == 1 ) {
return true ;
} else {
return false ;
}
}
2016-06-02 17:16:22 -07:00
/**
* Returns the user full name , it simply concatenates
* the user first and last name .
*
* @ return string
*/
2016-03-25 01:18:05 -07:00
public function fullName ()
{
return " { $this -> first_name } { $this -> last_name } " ;
}
2016-05-17 21:31:57 -07:00
public function getFullNameAttribute ()
{
2016-06-02 17:16:22 -07:00
return $this -> first_name . " " . $this -> last_name ;
2016-05-17 21:31:57 -07:00
}
2016-03-25 01:18:05 -07:00
2016-06-01 11:43:43 -07:00
public function getCompleteNameAttribute ()
{
2016-06-02 17:16:22 -07:00
return $this -> last_name . " , " . $this -> first_name . " ( " . $this -> username . " ) " ;
2016-06-01 11:43:43 -07:00
}
2016-06-02 17:16:22 -07:00
/**
* Returns the user Gravatar image url .
*
* @ return string
*/
2016-03-25 01:18:05 -07:00
public function gravatar ()
{
if ( $this -> avatar ) {
return config ( 'app.url' ) . '/uploads/avatars/' . $this -> avatar ;
}
2016-09-07 01:41:23 -07:00
if (( Setting :: getSettings () -> load_remote == '1' ) && ( $this -> email != '' )) {
2016-03-25 01:18:05 -07:00
$gravatar = md5 ( strtolower ( trim ( $this -> email )));
return " //gravatar.com/avatar/ " . $gravatar ;
}
return false ;
}
2016-06-02 17:16:22 -07:00
/**
* Get assets assigned to this user
*/
2016-03-25 01:18:05 -07:00
public function assets ()
{
return $this -> hasMany ( '\App\Models\Asset' , 'assigned_to' ) -> withTrashed ();
}
2016-06-22 17:04:47 -07:00
/**
* Get assets assigned to this user
*/
public function assetmaintenances ()
{
return $this -> hasMany ( '\App\Models\AssetMaintenance' , 'user_id' ) -> withTrashed ();
}
2016-06-02 17:16:22 -07:00
/**
* Get accessories assigned to this user
*/
2016-03-25 01:18:05 -07:00
public function accessories ()
{
return $this -> belongsToMany ( '\App\Models\Accessory' , 'accessories_users' , 'assigned_to' , 'accessory_id' ) -> withPivot ( 'id' ) -> withTrashed ();
}
2016-06-02 17:16:22 -07:00
/**
* Get consumables assigned to this user
*/
2016-03-25 01:18:05 -07:00
public function consumables ()
{
return $this -> belongsToMany ( '\App\Models\Consumable' , 'consumables_users' , 'assigned_to' , 'consumable_id' ) -> withPivot ( 'id' ) -> withTrashed ();
}
2016-06-02 17:16:22 -07:00
/**
* Get licenses assigned to this user
*/
2016-03-25 01:18:05 -07:00
public function licenses ()
{
return $this -> belongsToMany ( '\App\Models\License' , 'license_seats' , 'assigned_to' , 'license_id' ) -> withPivot ( 'id' );
}
2016-06-02 17:16:22 -07:00
/**
* Get action logs for this user
*/
2016-03-25 01:18:05 -07:00
public function userlog ()
{
2016-09-06 19:39:42 -07:00
return $this -> hasMany ( '\App\Models\Actionlog' , 'target_id' ) -> orderBy ( 'created_at' , 'DESC' ) -> withTrashed ();
2016-03-25 01:18:05 -07:00
}
2016-06-02 17:16:22 -07:00
/**
* Get the asset ' s location based on the assigned user
**/
2016-03-25 01:18:05 -07:00
public function userloc ()
{
return $this -> belongsTo ( '\App\Models\Location' , 'location_id' ) -> withTrashed ();
}
2016-06-02 17:16:22 -07:00
/**
* Get the user ' s manager based on the assigned user
**/
2016-03-25 01:18:05 -07:00
public function manager ()
{
return $this -> belongsTo ( '\App\Models\User' , 'manager_id' ) -> withTrashed ();
}
2016-06-02 17:16:22 -07:00
/**
* Get user groups
*/
2016-03-25 01:18:05 -07:00
public function groups ()
{
2016-06-15 20:45:45 -07:00
return $this -> belongsToMany ( '\App\Models\Group' , 'users_groups' );
2016-03-25 01:18:05 -07:00
}
public function accountStatus ()
{
2016-08-02 01:23:53 -07:00
if ( $this -> throttle ) {
if ( $this -> throttle -> suspended == 1 ) {
2016-03-25 01:18:05 -07:00
return 'suspended' ;
2016-08-02 01:23:53 -07:00
} elseif ( $this -> throttle -> banned == 1 ) {
2016-03-25 01:18:05 -07:00
return 'banned' ;
} else {
return false ;
}
} else {
return false ;
}
}
public function assetlog ()
{
return $this -> hasMany ( '\App\Models\Asset' , 'id' ) -> withTrashed ();
}
2016-06-02 17:16:22 -07:00
/**
* Get uploads for this asset
*/
2016-03-25 01:18:05 -07:00
public function uploads ()
{
2016-09-06 19:39:42 -07:00
return $this -> hasMany ( '\App\Models\Actionlog' , 'item_id' )
-> where ( 'item_type' , User :: class )
2016-06-02 17:16:22 -07:00
-> where ( 'action_type' , '=' , 'uploaded' )
-> whereNotNull ( 'filename' )
-> orderBy ( 'created_at' , 'desc' );
2016-03-25 01:18:05 -07:00
}
2016-09-15 19:58:27 -07:00
/**
* Fetch Items User has requested
*/
public function checkoutRequests ()
{
return $this -> belongsToMany ( Asset :: class , 'checkout_requests' );
}
2016-08-02 01:23:53 -07:00
public function throttle ()
2016-03-25 01:18:05 -07:00
{
return $this -> hasOne ( '\App\Models\Throttle' );
}
public function scopeGetDeleted ( $query )
{
return $query -> withTrashed () -> whereNotNull ( 'deleted_at' );
}
public function scopeGetNotDeleted ( $query )
{
return $query -> whereNull ( 'deleted_at' );
}
2016-06-02 17:16:22 -07:00
/**
* Override the SentryUser getPersistCode method for
* multiple logins at one time
**/
2016-03-25 01:18:05 -07:00
public function getPersistCode ()
{
if ( ! config ( 'session.multi_login' ) || ( ! $this -> persist_code )) {
$this -> persist_code = $this -> getRandomString ();
// Our code got hashed
$persistCode = $this -> persist_code ;
$this -> save ();
return $persistCode ;
}
return $this -> persist_code ;
}
public function scopeMatchEmailOrUsername ( $query , $user_username , $user_email )
{
return $query -> where ( 'email' , '=' , $user_email )
2016-06-02 17:16:22 -07:00
-> orWhere ( 'username' , '=' , $user_username )
-> orWhere ( 'username' , '=' , $user_email );
2016-03-25 01:18:05 -07:00
}
2016-08-12 16:02:39 -07:00
public static function generateEmailFromFullName ( $name ) {
$username = User :: generateFormattedNameFromFullName ( Setting :: getSettings () -> email_format , $name );
return $username [ 'username' ] . '@' . Setting :: getSettings () -> email_domain ;
}
2016-03-25 01:18:05 -07:00
public static function generateFormattedNameFromFullName ( $format = 'filastname' , $users_name )
{
$name = explode ( " " , $users_name );
$name = str_replace ( " ' " , '' , $name );
$first_name = $name [ 0 ];
$email_last_name = '' ;
$email_prefix = $first_name ;
// If there is no last name given
if ( ! array_key_exists ( 1 , $name )) {
$last_name = '' ;
$email_last_name = $last_name ;
$user_username = $first_name ;
2016-06-02 17:16:22 -07:00
// There is a last name given
2016-03-25 01:18:05 -07:00
} else {
$last_name = str_replace ( $first_name , '' , $users_name );
if ( $format == 'filastname' ) {
$email_last_name .= str_replace ( ' ' , '' , $last_name );
$email_prefix = $first_name [ 0 ] . $email_last_name ;
} elseif ( $format == 'firstname.lastname' ) {
$email_last_name .= str_replace ( ' ' , '' , $last_name );
$email_prefix = $first_name . '.' . $email_last_name ;
} elseif ( $format == 'firstname' ) {
$email_last_name .= str_replace ( ' ' , '' , $last_name );
$email_prefix = $first_name ;
}
2016-08-12 16:02:39 -07:00
2016-03-25 01:18:05 -07:00
}
$user_username = $email_prefix ;
$user [ 'first_name' ] = $first_name ;
$user [ 'last_name' ] = $last_name ;
$user [ 'username' ] = strtolower ( $user_username );
return $user ;
}
2016-04-28 21:59:43 -07:00
public function decodePermissions ()
{
return json_decode ( $this -> permissions , true );
}
2016-06-02 17:16:22 -07:00
/**
* Query builder scope to search on text
*
* @ param Illuminate\Database\Query\Builder $query Query builder instance
* @ param text $search Search term
*
* @ return Illuminate\Database\Query\Builder Modified query builder
*/
2016-03-25 01:18:05 -07:00
public function scopeTextsearch ( $query , $search )
{
return $query -> where ( function ( $query ) use ( $search ) {
$query -> where ( 'users.first_name' , 'LIKE' , " % $search % " )
2016-06-02 17:16:22 -07:00
-> orWhere ( 'users.last_name' , 'LIKE' , " % $search % " )
-> orWhere ( 'users.email' , 'LIKE' , " % $search % " )
-> orWhere ( 'users.username' , 'LIKE' , " % $search % " )
-> orWhere ( 'users.notes' , 'LIKE' , " % $search % " )
2016-10-27 14:29:07 -07:00
-> orWhere ( 'users.jobtitle' , 'LIKE' , " % $search % " )
2016-06-02 17:16:22 -07:00
-> orWhere ( 'users.employee_num' , 'LIKE' , " % $search % " )
-> orWhere ( function ( $query ) use ( $search ) {
$query -> whereHas ( 'userloc' , function ( $query ) use ( $search ) {
$query -> where ( 'locations.name' , 'LIKE' , '%' . $search . '%' );
});
})
2016-10-31 18:27:34 -07:00
-> orWhere ( function ( $query ) use ( $search ) {
$query -> whereHas ( 'groups' , function ( $query ) use ( $search ) {
$query -> where ( 'groups.name' , 'LIKE' , '%' . $search . '%' );
});
})
2016-06-02 17:16:22 -07:00
// Ugly, ugly code because Laravel sucks at self-joins
-> orWhere ( function ( $query ) use ( $search ) {
$query -> whereRaw ( " users.manager_id IN (select id from users where first_name LIKE '% " . $search . " %' OR last_name LIKE '% " . $search . " %') " );
2016-03-25 01:18:05 -07:00
});
});
}
2016-06-02 17:16:22 -07:00
/**
* Query builder scope for Deleted users
*
* @ param Illuminate\Database\Query\Builder $query Query builder instance
*
* @ return Illuminate\Database\Query\Builder Modified query builder
*/
2016-03-25 01:18:05 -07:00
public function scopeDeleted ( $query )
{
return $query -> whereNotNull ( 'deleted_at' );
}
2016-06-02 17:16:22 -07:00
/**
* Query builder scope to order on manager
*
* @ param Illuminate\Database\Query\Builder $query Query builder instance
* @ param text $order Order
*
* @ return Illuminate\Database\Query\Builder Modified query builder
*/
2016-03-25 01:18:05 -07:00
public function scopeOrderManager ( $query , $order )
{
2016-06-02 17:16:22 -07:00
// Left join here, or it will only return results with parents
2016-03-25 01:18:05 -07:00
return $query -> leftJoin ( 'users as manager' , 'users.manager_id' , '=' , 'manager.id' ) -> orderBy ( 'manager.first_name' , $order ) -> orderBy ( 'manager.last_name' , $order );
}
2016-06-02 17:16:22 -07:00
/**
* Query builder scope to order on company
*
* @ param Illuminate\Database\Query\Builder $query Query builder instance
* @ param text $order Order
*
* @ return Illuminate\Database\Query\Builder Modified query builder
*/
2016-03-25 01:18:05 -07:00
public function scopeOrderLocation ( $query , $order )
{
return $query -> leftJoin ( 'locations' , 'users.location_id' , '=' , 'locations.id' ) -> orderBy ( 'locations.name' , $order );
}
}