HEX
Server: Apache
System: Linux server2.voipitup.com.au 4.18.0-553.104.1.lve.el8.x86_64 #1 SMP Tue Feb 10 20:07:30 UTC 2026 x86_64
User: posscale (1027)
PHP: 8.2.29
Disabled: exec,passthru,shell_exec,system
Upload Files
File: //home/posscale/www/printmanager/app/Console/Commands/SyncTenantRolesPermissions.php
<?php

namespace App\Console\Commands;

use App\Models\Tenant as TenantModel;
use Illuminate\Console\Command;
use Spatie\Permission\Models\Permission;
use Spatie\Permission\Models\Role;

class SyncTenantRolesPermissions extends Command
{
    protected $signature = 'sync:tenant-roles';

    protected $description = 'Sync central roles and permissions (including role-permission mapping) to all tenant databases.';

    public function handle(): int
    {
        $this->info('Loading central roles and permissions...');

        $centralPermissions = [];
        $centralRoles = [];

        tenancy()->central(function () use (&$centralPermissions, &$centralRoles) {
            $centralPermissions = Permission::all()->map(function (Permission $permission) {
                return [
                    'name' => $permission->name,
                    'guard_name' => $permission->guard_name,
                ];
            })->values()->all();

            $centralRoles = Role::with('permissions')->get()->map(function (Role $role) {
                return [
                    'name' => $role->name,
                    'guard_name' => $role->guard_name,
                    'permissions' => $role->permissions->pluck('name')->toArray(),
                ];
            })->values()->all();
        });

        if (empty($centralRoles) && empty($centralPermissions)) {
            $this->warn('No central roles or permissions found. Nothing to sync.');

            return self::SUCCESS;
        }

        $this->info('Syncing to tenant databases...');

        TenantModel::all()->each(function (TenantModel $tenant) use ($centralPermissions, $centralRoles) {
            $this->info("Syncing for tenant: {$tenant->id}");

            tenancy()->initialize($tenant);

            app(\Spatie\Permission\PermissionRegistrar::class)->forgetCachedPermissions();

            foreach ($centralPermissions as $data) {
                Permission::firstOrCreate([
                    'name' => $data['name'],
                    'guard_name' => $data['guard_name'],
                ]);
            }

            foreach ($centralRoles as $roleData) {
                /** @var Role $role */
                $role = Role::firstOrCreate([
                    'name' => $roleData['name'],
                    'guard_name' => $roleData['guard_name'],
                ]);

                if (! empty($roleData['permissions'])) {
                    $role->syncPermissions($roleData['permissions']);
                }
            }

            tenancy()->end();
        });

        $this->info('Tenant roles & permissions sync completed.');

        return self::SUCCESS;
    }
}