Files
admin 015ddea46c feat(asset-management): complete module with standardized UI + demo data seeder
- Fix Vendor column bug (name → company_name) across all controllers
- Create 6 missing pages (Assets/Edit, Categories/Create+Edit, Maintenance/Show+Edit, Disposal/Show)
- Standardize all 7 Index pages with DataTable, SearchInput, PerPageSelector, Pagination
- Add AssetManagementDemoSeeder with 5 categories, 22 assets, 8 maintenance, 4 assignments, 3 transfers, 2 disposals
- All 19 controller-referenced pages now have matching .tsx files
2026-05-02 10:49:55 +08:00

326 lines
11 KiB
PHP

<?php
namespace App\Models;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Spatie\Permission\Traits\HasRoles;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Spatie\Permission\Models\Permission as ModelsPermission;
use Spatie\Permission\Models\Role;
use Illuminate\Support\Str;
use Laravel\Sanctum\HasApiTokens;
class User extends Authenticatable implements MustVerifyEmail
{
use HasRoles, HasFactory, Notifiable, HasApiTokens;
/**
* The attributes that are mass assignable.
*
* @var array<int, string>
*/
protected $fillable = [
'name',
'email',
'mobile_no',
'email_verified_at',
'password',
'type',
'avatar',
'lang',
'active_plan',
'plan_expire_date',
'trial_expire_date',
'is_trial_done',
'total_user',
'commission_amount',
'storage_limit',
'is_disable',
'is_enable_login',
'creator_id',
'created_by',
'active_status',
'last_seen_at',
'slug',
];
/**
* The attributes that should be hidden for serialization.
*
* @var array<int, string>
*/
protected $hidden = [
'password',
'remember_token',
];
/**
* Get the attributes that should be cast.
*
* @return array<string, string>
*/
protected function casts(): array
{
return [
'email_verified_at' => 'datetime',
'password' => 'hashed',
];
}
protected static function boot()
{
parent::boot();
static::creating(function ($user) {
if (empty($user->slug)) {
$user->slug = static::generateUniqueSlug($user->name);
}
});
}
public static function generateUniqueSlug($name)
{
$slug = Str::slug($name);
$originalSlug = $slug;
$counter = 1;
while (static::where('slug', $slug)->exists()) {
$slug = $originalSlug . '-' . $counter;
$counter++;
}
return $slug;
}
public static $superadmin_activated_module = [
'LandingPage',
];
public $not_emp_type = [
'superadmin',
'company',
'client',
'vendor',
'doctor',
'student',
'parent',
'tenant',
'salesagent',
'driver',
'farmer',
'gym member',
'gym trainer',
'resident',
'hr',
'construction-partner',
'driving student',
'advocate',
'case initiator'
];
public function scopeEmp($query, $additionalTypes = [], $includeTypes = [])
{
$excludeTypes = array_diff(array_merge($this->not_emp_type, $additionalTypes), $includeTypes);
return $query->whereNotIn('type', $excludeTypes);
}
public function createdBy(): BelongsTo
{
return $this->belongsTo(User::class, 'created_by');
}
public static function CompanySetting($user_id)
{
$company_settings = [
// Brand Settings
'logo_light' => admin_setting('logo_light'),
'logo_dark' => admin_setting('logo_dark'),
'favicon' => admin_setting('favicon'),
'titleText' => admin_setting('titleText'),
'footerText' => admin_setting('footerText'),
'sidebarVariant' => admin_setting('sidebarVariant'),
'sidebarStyle' => admin_setting('sidebarStyle'),
'layoutDirection' => admin_setting('layoutDirection'),
'themeMode' => admin_setting('themeMode'),
'themeColor' => admin_setting('themeColor'),
'customColor' => admin_setting('customColor'),
// System Settings
'defaultLanguage' => admin_setting('defaultLanguage'),
'dateFormat' => admin_setting('dateFormat'),
'timeFormat' => admin_setting('timeFormat'),
'calendarStartDay' => admin_setting('calendarStartDay'),
// Currency Settings
'defaultCurrency' => admin_setting('defaultCurrency'),
'currencySymbol' => admin_setting('currencySymbol'),
'currency_format' => admin_setting('currency_format'),
'decimalFormat' => admin_setting('decimalFormat'),
'decimalSeparator' => admin_setting('decimalSeparator'),
'thousandsSeparator' => admin_setting('thousandsSeparator'),
'floatNumber' => admin_setting('floatNumber'),
'currencySymbolSpace' => admin_setting('currencySymbolSpace'),
'currencySymbolPosition' => admin_setting('currencySymbolPosition'),
];
foreach($company_settings as $key => $value){
if (!company_setting($key,$user_id)) {
setSetting($key, $value, $user_id);
}
}
}
public static function MakeRole($userId)
{
// Create staff role
$staffRole = Role::where('name','staff')->where('created_by',$userId)->where('guard_name','web')->first();
if(empty($staffRole))
{
$staffRole = new Role();
$staffRole->name = 'staff';
$staffRole->guard_name = 'web';
$staffRole->label = 'Staff';
$staffRole->editable = false;
$staffRole->created_by = $userId;
$staffRole->save();
$permissions = ModelsPermission::whereIn('name', [
'manage-dashboard',
'manage-media',
'manage-own-media',
'create-media',
'download-media',
'delete-media',
'manage-media-directories',
'manage-own-media-directories',
'create-media-directories',
'edit-media-directories',
'delete-media-directories',
'manage-profile',
'edit-profile',
'change-password-profile',
'manage-messenger',
'send-messages',
'view-messages',
'toggle-favorite-messages',
'toggle-pinned-messages'
])->get();
$staffRole->givePermissionTo($permissions);
}
// Create client role
$clientRole = Role::where('name','client')->where('created_by',$userId)->where('guard_name','web')->first();
if(empty($clientRole))
{
$clientRole = new Role();
$clientRole->name = 'client';
$clientRole->guard_name = 'web';
$clientRole->label = 'Client';
$clientRole->editable = false;
$clientRole->created_by = $userId;
$clientRole->save();
$permissions = ModelsPermission::whereIn('name', [
'manage-dashboard',
'manage-media',
'manage-own-media',
'create-media',
'download-media',
'delete-media',
'manage-media-directories',
'manage-own-media-directories',
'create-media-directories',
'edit-media-directories',
'delete-media-directories',
'manage-profile',
'edit-profile',
'change-password-profile',
'manage-messenger',
'send-messages',
'view-messages',
'toggle-favorite-messages',
'toggle-pinned-messages',
'manage-sales-invoices',
'manage-own-sales-invoices',
'view-sales-invoices',
'print-sales-invoices',
'manage-sales-return-invoices',
'manage-own-sales-return-invoices',
'view-sales-return-invoices',
'manage-sales-proposals',
'manage-own-sales-proposals',
'view-sales-proposals',
'print-sales-proposals',
'accept-sales-proposals',
'reject-sales-proposals',
])->get();
$clientRole->givePermissionTo($permissions);
}
// Create vendor role
$vendorRole = Role::where('name','vendor')->where('created_by',$userId)->where('guard_name','web')->first();
if(empty($vendorRole))
{
$vendorRole = new Role();
$vendorRole->name = 'vendor';
$vendorRole->guard_name = 'web';
$vendorRole->label = 'Vendor';
$vendorRole->editable = false;
$vendorRole->created_by = $userId;
$vendorRole->save();
$permissions = ModelsPermission::whereIn('name', [
'manage-dashboard',
'manage-media',
'manage-own-media',
'create-media',
'download-media',
'delete-media',
'manage-media-directories',
'manage-own-media-directories',
'create-media-directories',
'edit-media-directories',
'delete-media-directories',
'manage-profile',
'edit-profile',
'change-password-profile',
'manage-messenger',
'send-messages',
'view-messages',
'toggle-favorite-messages',
'toggle-pinned-messages',
'manage-purchase-invoices',
'manage-own-purchase-invoices',
'view-purchase-invoices',
'print-purchase-invoices',
'manage-purchase-return-invoices',
'manage-own-purchase-return-invoices',
'view-purchase-return-invoices',
])->get();
$vendorRole->givePermissionTo($permissions);
}
}
/**
* Laratrust compatibility shim.
*
* Legacy Blade modules (Fleet, Bookings, Documents, DoubleEntry, AIDocument)
* use $user->isAbleTo('permission') from the Laratrust package.
* This bridges to Spatie's hasPermissionTo() so the old controllers work
* without modifying 170+ permission checks across 5 modules.
*/
public function isAbleTo(string $permission, $guardName = null): bool
{
try {
return $this->hasPermissionTo($permission, $guardName);
} catch (\Spatie\Permission\Exceptions\PermissionDoesNotExist $e) {
return false;
}
}
}