string, * 'name' => string, * 'email' => string, * 'phone' => string, * 'password' => string, * 'position' => string (optional), * 'company_name' => string, * 'business_num' => string (optional), * 'company_scale' => string (optional), * 'industry' => string (optional), * ] * @return array ['user' => array, 'tenant' => array] */ public static function register(array $params): array { return DB::transaction(function () use ($params) { // 1. Generate unique tenant code from company name $code = TenantCodeGenerator::generate($params['company_name']); // 2. Create Tenant with trial status and options $tenant = Tenant::create([ 'company_name' => $params['company_name'], 'code' => $code, 'business_num' => $params['business_num'] ?? null, 'tenant_st_code' => 'trial', // 트라이얼 상태 'options' => [ 'company_scale' => $params['company_scale'] ?? null, 'industry' => $params['industry'] ?? null, ], ]); // 3. Create default menus for tenant $menuIds = MenuBootstrapService::createDefaultMenus($tenant->id); // 4. Create User with hashed password and options $user = User::create([ 'user_id' => $params['user_id'], 'name' => $params['name'], 'email' => $params['email'], 'phone' => $params['phone'] ?? null, 'password' => Hash::make($params['password']), 'options' => [ 'position' => $params['position'] ?? null, ], ]); // 5. Create TenantUserProfile (tenant-user mapping) TenantUserProfile::create([ 'user_id' => $user->id, 'tenant_id' => $tenant->id, 'is_default' => 1, // 기본 테넌트로 설정 'is_active' => 1, // 활성화 ]); // 6. Set tenant context for permissions app()->bind('tenant_id', fn () => $tenant->id); app(PermissionRegistrar::class)->setPermissionsTeamId($tenant->id); // 7. Create 'system_manager' role $role = Role::create([ 'tenant_id' => $tenant->id, 'guard_name' => 'api', 'name' => 'system_manager', 'description' => '시스템 관리자', ]); // 8. Create permissions for each menu and assign to role $permissions = []; foreach ($menuIds as $menuId) { $permName = "menu.{$menuId}"; // Use firstOrCreate to avoid duplicate permission errors $perm = Permission::firstOrCreate([ 'tenant_id' => $tenant->id, 'guard_name' => 'api', 'name' => $permName, ]); $permissions[] = $perm; } // 9. Assign all menu permissions to system_manager role $role->syncPermissions($permissions); // 10. Assign system_manager role to user $user->assignRole($role); // 11. Return user and tenant data return [ 'user' => [ 'id' => $user->id, 'user_id' => $user->user_id, 'name' => $user->name, 'email' => $user->email, 'phone' => $user->phone, 'options' => $user->options, ], 'tenant' => [ 'id' => $tenant->id, 'company_name' => $tenant->company_name, 'business_num' => $tenant->business_num, 'tenant_st_code' => $tenant->tenant_st_code, 'options' => $tenant->options, ], ]; }); } }