Add super-admin Administration section and restructure global vs company settings

- Add Administration sidebar section (super-admin only) with Companies, Users, and Global Settings pages
- Add super-admin middleware, controllers, and API routes under /api/v1/super-admin/
- Allow super-admins to manage all companies and users across tenants
- Add user impersonation with short-lived tokens, audit logging, and UI banner
- Move system-level settings (Mail, PDF, Backup, Update, File Disk) from per-company to Administration > Global Settings
- Convert save_pdf_to_disk from CompanySetting to global Setting
- Add per-company mail configuration overrides (optional, falls back to global)
- Add CompanyMailConfigService to apply company mail config before sending emails
This commit is contained in:
Darko Gjorgjijoski
2026-04-03 10:35:40 +02:00
parent 25986b7bd5
commit 9432da467e
40 changed files with 2324 additions and 91 deletions

View File

@@ -47,17 +47,10 @@ const ExpenseCategory = () =>
import('@/scripts/admin/views/settings/ExpenseCategorySetting.vue')
const ExchangeRateSetting = () =>
import('@/scripts/admin/views/settings/ExchangeRateProviderSetting.vue')
const MailConfig = () =>
import('@/scripts/admin/views/settings/MailConfigSetting.vue')
const FileDisk = () =>
import('@/scripts/admin/views/settings/FileDiskSetting.vue')
const Backup = () => import('@/scripts/admin/views/settings/BackupSetting.vue')
const UpdateApp = () =>
import('@/scripts/admin/views/settings/UpdateAppSetting.vue')
const RolesSettings = () =>
import('@/scripts/admin/views/settings/RolesSettings.vue')
const PDFGenerationSettings = () =>
import('@/scripts/admin/views/settings/PDFGenerationSetting.vue')
const CompanyMailConfig = () =>
import('@/scripts/admin/views/settings/CompanyMailConfigSetting.vue')
// Items
const ItemsIndex = () => import('@/scripts/admin/views/items/Index.vue')
@@ -115,6 +108,28 @@ const ModuleView = () => import('@/scripts/admin/views/modules/View.vue')
const InvoicePublicPage = () =>
import('@/scripts/components/InvoicePublicPage.vue')
// Administration (Super Admin)
const AdminCompaniesIndex = () =>
import('@/scripts/admin/views/administration/companies/Index.vue')
const AdminCompaniesEdit = () =>
import('@/scripts/admin/views/administration/companies/Edit.vue')
const AdminUsersIndex = () =>
import('@/scripts/admin/views/administration/users/Index.vue')
const AdminUsersEdit = () =>
import('@/scripts/admin/views/administration/users/Edit.vue')
const AdminSettingsIndex = () =>
import('@/scripts/admin/views/administration/settings/SettingsIndex.vue')
const AdminMailConfig = () =>
import('@/scripts/admin/views/settings/MailConfigSetting.vue')
const AdminPDFGeneration = () =>
import('@/scripts/admin/views/settings/PDFGenerationSetting.vue')
const AdminBackup = () =>
import('@/scripts/admin/views/settings/BackupSetting.vue')
const AdminUpdateApp = () =>
import('@/scripts/admin/views/settings/UpdateAppSetting.vue')
const AdminFileDisk = () =>
import('@/scripts/admin/views/settings/FileDiskSetting.vue')
export default [
{
path: '/installation',
@@ -304,36 +319,11 @@ export default [
meta: { ability: abilities.VIEW_EXPENSE },
component: ExpenseCategory,
},
{
path: 'mail-configuration',
name: 'mailconfig',
name: 'company.mailconfig',
meta: { isOwner: true },
component: MailConfig,
},
{
path: 'file-disk',
name: 'file-disk',
meta: { isOwner: true },
component: FileDisk,
},
{
path: 'backup',
name: 'backup',
meta: { isOwner: true },
component: Backup,
},
{
path: 'update-app',
name: 'updateapp',
meta: { isOwner: true },
component: UpdateApp,
},
{
path: 'pdf-generation',
name: 'pdf.generation',
meta: { isOwner: true },
component: PDFGenerationSettings,
component: CompanyMailConfig,
},
],
},
@@ -495,6 +485,65 @@ export default [
meta: { ability: abilities.VIEW_FINANCIAL_REPORT },
component: ReportsIndex,
},
// Administration (Super Admin)
{
path: 'administration/companies',
name: 'admin.companies.index',
meta: { isSuperAdmin: true },
component: AdminCompaniesIndex,
},
{
path: 'administration/companies/:id/edit',
name: 'admin.companies.edit',
meta: { isSuperAdmin: true },
component: AdminCompaniesEdit,
},
{
path: 'administration/users',
name: 'admin.users.index',
meta: { isSuperAdmin: true },
component: AdminUsersIndex,
},
{
path: 'administration/users/:id/edit',
name: 'admin.users.edit',
meta: { isSuperAdmin: true },
component: AdminUsersEdit,
},
{
path: 'administration/settings',
name: 'admin.settings',
meta: { isSuperAdmin: true },
component: AdminSettingsIndex,
children: [
{
path: 'mail-configuration',
name: 'admin.settings.mail',
component: AdminMailConfig,
},
{
path: 'pdf-generation',
name: 'admin.settings.pdf',
component: AdminPDFGeneration,
},
{
path: 'backup',
name: 'admin.settings.backup',
component: AdminBackup,
},
{
path: 'update-app',
name: 'admin.settings.update',
component: AdminUpdateApp,
},
{
path: 'file-disk',
name: 'admin.settings.filedisk',
component: AdminFileDisk,
},
],
},
],
},
{ path: '/:catchAll(.*)', component: NotFoundPage },