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

@@ -84,7 +84,7 @@
<script setup>
import { useDiskStore } from '@/scripts/admin/stores/disk'
import { useCompanyStore } from '@/scripts/admin/stores/company'
import { useGlobalStore } from '@/scripts/admin/stores/global'
import { useDialogStore } from '@/scripts/stores/dialog'
import { useModalStore } from '@/scripts/stores/modal'
import { ref, computed, reactive, onMounted, inject } from 'vue'
@@ -95,7 +95,7 @@ const utils = inject('utils')
const modalStore = useModalStore()
const diskStore = useDiskStore()
const companyStore = useCompanyStore()
const globalStore = useGlobalStore()
const dialogStore = useDialogStore()
const { t } = useI18n()
@@ -139,7 +139,7 @@ const fileDiskColumns = computed(() => {
]
})
const savePdfToDisk = ref(companyStore.selectedCompanySettings.save_pdf_to_disk)
const savePdfToDisk = ref(globalStore.globalSettings?.save_pdf_to_disk || 'NO')
const savePdfToDiskField = computed({
get: () => {
@@ -156,7 +156,7 @@ const savePdfToDiskField = computed({
savePdfToDisk.value = value
await companyStore.updateCompanySettings({
await globalStore.updateGlobalSettings({
data,
message: 'general.setting_updated',
})