Export the required target languages from Salesforce in XLIFF format.
-
Salesforce may provide several language files in a ZIP archive. You can upload the Salesforce ZIP directly or select extracted XLIFF files.
-
Under Salesforce XLIFF export files, select the ZIP or the individual XLIFF files for the languages you want to translate. The tool automatically reads all XLIFF files from a ZIP and detects each file's target-language value.
-
Prepare one Excel or CSV target translation file and upload it under Target translation.
-
Check the language matches, create the preview, and then download the translated files as a ZIP archive.
-
Extract the generated ZIP and import each completed target-language XLIFF file into Salesforce separately. Salesforce accepts one translation file per import.
-
-
-
Required columns: Header names are case-insensitive. The English headers object, field, and target are recommended. The existing German aliases Objekt and Feld also remain supported.
-
-
-
-
-
object
-
field
-
target
-
language
-
-
-
-
-
Account
-
Name
-
Kontoname
-
de
-
-
-
Account
-
Name
-
Nom du compte
-
fr
-
-
-
-
-
The optional language column lets one target translation file contain several languages. Its values must match the XLIFF target-language values, for example de, fr, or de-DE. If the column is omitted and several Salesforce XLIFF files are loaded, select the one target XLIFF file to which the translation data belongs.
-
Important: Each matched target language is exported as a separate XLIFF file inside the generated ZIP. A language file is omitted when no matching translation can be applied. The result contains only changed translation units with a non-empty target value. Rows with an empty target, rows where field and target are identical, and translations identical to the current XLIFF source or target are omitted.
-
-
-
-
-
-
No Salesforce XLIFF export files selected.
-
-
-
-
-
-
No target translation file selected.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
File
-
Language
-
Object
-
Field
-
Current target
-
Result target
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/config/apps.php b/config/apps.php
index 9d22c3d3..08dd4229 100644
--- a/config/apps.php
+++ b/config/apps.php
@@ -69,10 +69,10 @@ return [
'options' => [],
'assets' => [
'styles' => [
- ['href' => '/assets/apps/user-self-management/app.css'],
+ ['href' => '/system-app-assets/index.php?app=user-self-management&path=assets/app.css'],
],
'scripts' => [
- ['src' => '/assets/apps/user-self-management/app.js'],
+ ['src' => '/system-app-assets/index.php?app=user-self-management&path=assets/app.js'],
],
],
],
@@ -116,10 +116,10 @@ return [
],
'assets' => [
'styles' => [
- ['href' => '/assets/apps/user-management/app.css'],
+ ['href' => '/system-app-assets/index.php?app=user-management&path=assets/app.css'],
],
'scripts' => [
- ['src' => '/assets/apps/user-management/app.js'],
+ ['src' => '/system-app-assets/index.php?app=user-management&path=assets/app.js'],
],
],
],
@@ -148,10 +148,10 @@ return [
],
'assets' => [
'styles' => [
- ['href' => '/assets/apps/cron-management/app.css'],
+ ['href' => '/system-app-assets/index.php?app=cron-management&path=assets/app.css'],
],
'scripts' => [
- ['src' => '/assets/apps/cron-management/app.js'],
+ ['src' => '/system-app-assets/index.php?app=cron-management&path=assets/app.js'],
],
],
],
diff --git a/modules/README.md b/custom/apps/README.md
similarity index 90%
rename from modules/README.md
rename to custom/apps/README.md
index f3796e36..c9f99854 100644
--- a/modules/README.md
+++ b/custom/apps/README.md
@@ -1,6 +1,6 @@
# Module
-Klassische Module bleiben in diesem Projekt unter `modules//`.
+Installierbare und fachliche Apps liegen in diesem Projekt unter `custom/apps//`.
Die neue Desktop-Shell ist nur die UI-Schicht. Modul-Businesslogik wird nicht in den Desktop-Core verschoben.
@@ -15,13 +15,13 @@ Ein Desktop-Modul kann zusaetzlich diese Projektdateien besitzen:
- `docs/README.md` fuer modulspezifische Hinweise, API und Sonderregeln
- `module.json` fuer Setup, Desktop-Freigabe, Widget-Funktionen und Cron-Endpunkte
-Module-Assets werden in diesem Projekt nicht direkt aus `public/assets/apps/...` dupliziert, sondern ueber den generischen Endpoint `/module-assets/index.php` aus dem jeweiligen Modul ausgeliefert.
+Custom-App-Assets werden nicht direkt aus `public/` geladen, sondern ueber den generischen Endpoint `/module-assets/index.php` aus dem jeweiligen App-Ordner ausgeliefert.
## Trennung zwischen Systemtools und Modulen
- `Systemtools` sind globale Verwaltungs- und Setup-Apps und nicht installierbar
- aktuelle Beispiele: `User Management`, `User Self Management`, `Cron Tool`
-- `Module` sind installierbare Fachanwendungen
+- `Custom Apps` sind installierbare Fachanwendungen
- aktuelle Beispiele: `Mining-Checker`, `Waehrungs-Checker`, `Boersenchecker`, `Pi-hole`
Diese Trennung wird ueber App-Metadaten gesteuert:
diff --git a/modules/boersenchecker/api/chart_data.php b/custom/apps/boersenchecker/api/chart_data.php
similarity index 100%
rename from modules/boersenchecker/api/chart_data.php
rename to custom/apps/boersenchecker/api/chart_data.php
diff --git a/modules/boersenchecker/api/index.php b/custom/apps/boersenchecker/api/index.php
similarity index 100%
rename from modules/boersenchecker/api/index.php
rename to custom/apps/boersenchecker/api/index.php
diff --git a/modules/boersenchecker/assets/boersenchecker-native.js b/custom/apps/boersenchecker/assets/boersenchecker-native.js
similarity index 100%
rename from modules/boersenchecker/assets/boersenchecker-native.js
rename to custom/apps/boersenchecker/assets/boersenchecker-native.js
diff --git a/modules/boersenchecker/assets/boersenchecker.css b/custom/apps/boersenchecker/assets/boersenchecker.css
similarity index 100%
rename from modules/boersenchecker/assets/boersenchecker.css
rename to custom/apps/boersenchecker/assets/boersenchecker.css
diff --git a/modules/boersenchecker/assets/boersenchecker.js b/custom/apps/boersenchecker/assets/boersenchecker.js
similarity index 100%
rename from modules/boersenchecker/assets/boersenchecker.js
rename to custom/apps/boersenchecker/assets/boersenchecker.js
diff --git a/modules/boersenchecker/bootstrap.php b/custom/apps/boersenchecker/bootstrap.php
similarity index 100%
rename from modules/boersenchecker/bootstrap.php
rename to custom/apps/boersenchecker/bootstrap.php
diff --git a/modules/boersenchecker/config/module.php b/custom/apps/boersenchecker/config/module.php
similarity index 100%
rename from modules/boersenchecker/config/module.php
rename to custom/apps/boersenchecker/config/module.php
diff --git a/modules/boersenchecker/design.json b/custom/apps/boersenchecker/design.json
similarity index 100%
rename from modules/boersenchecker/design.json
rename to custom/apps/boersenchecker/design.json
diff --git a/modules/boersenchecker/desktop.php b/custom/apps/boersenchecker/desktop.php
similarity index 100%
rename from modules/boersenchecker/desktop.php
rename to custom/apps/boersenchecker/desktop.php
diff --git a/modules/boersenchecker/docs/README.md b/custom/apps/boersenchecker/docs/README.md
similarity index 92%
rename from modules/boersenchecker/docs/README.md
rename to custom/apps/boersenchecker/docs/README.md
index fbfca4c2..557594cb 100644
--- a/modules/boersenchecker/docs/README.md
+++ b/custom/apps/boersenchecker/docs/README.md
@@ -4,7 +4,7 @@ Importiertes Altmodul fuer Depotverwaltung, Aktienstammdaten, Kursverlauf, Alpha
## Einbindung
-- Desktop-App ueber `modules/boersenchecker/desktop.php`
+- Desktop-App ueber `custom/apps/boersenchecker/desktop.php`
- oeffentlicher App-Einstieg ueber `public/apps/boersenchecker/index.php`
- API-Endpunkt fuer Chartdaten ueber `public/api/boersenchecker/index.php?path=v1/chart-data`
diff --git a/modules/boersenchecker/module.json b/custom/apps/boersenchecker/module.json
similarity index 100%
rename from modules/boersenchecker/module.json
rename to custom/apps/boersenchecker/module.json
diff --git a/modules/boersenchecker/pages/index.php b/custom/apps/boersenchecker/pages/index.php
similarity index 100%
rename from modules/boersenchecker/pages/index.php
rename to custom/apps/boersenchecker/pages/index.php
diff --git a/modules/boersenchecker/partials/dashboard.php b/custom/apps/boersenchecker/partials/dashboard.php
similarity index 100%
rename from modules/boersenchecker/partials/dashboard.php
rename to custom/apps/boersenchecker/partials/dashboard.php
diff --git a/modules/boersenchecker/partials/home.php b/custom/apps/boersenchecker/partials/home.php
similarity index 100%
rename from modules/boersenchecker/partials/home.php
rename to custom/apps/boersenchecker/partials/home.php
diff --git a/modules/boersenchecker/partials/instruments.php b/custom/apps/boersenchecker/partials/instruments.php
similarity index 100%
rename from modules/boersenchecker/partials/instruments.php
rename to custom/apps/boersenchecker/partials/instruments.php
diff --git a/modules/boersenchecker/src/Support/DashboardPage.php b/custom/apps/boersenchecker/src/Support/DashboardPage.php
similarity index 100%
rename from modules/boersenchecker/src/Support/DashboardPage.php
rename to custom/apps/boersenchecker/src/Support/DashboardPage.php
diff --git a/modules/boersenchecker/src/Support/HomePage.php b/custom/apps/boersenchecker/src/Support/HomePage.php
similarity index 100%
rename from modules/boersenchecker/src/Support/HomePage.php
rename to custom/apps/boersenchecker/src/Support/HomePage.php
diff --git a/modules/boersenchecker/src/Support/InstrumentPage.php b/custom/apps/boersenchecker/src/Support/InstrumentPage.php
similarity index 100%
rename from modules/boersenchecker/src/Support/InstrumentPage.php
rename to custom/apps/boersenchecker/src/Support/InstrumentPage.php
diff --git a/modules/boersenchecker/src/Support/InstrumentRegistry.php b/custom/apps/boersenchecker/src/Support/InstrumentRegistry.php
similarity index 100%
rename from modules/boersenchecker/src/Support/InstrumentRegistry.php
rename to custom/apps/boersenchecker/src/Support/InstrumentRegistry.php
diff --git a/modules/fx-rates/api/index.php b/custom/apps/fx-rates/api/index.php
similarity index 100%
rename from modules/fx-rates/api/index.php
rename to custom/apps/fx-rates/api/index.php
diff --git a/modules/fx-rates/assets/css/app.css b/custom/apps/fx-rates/assets/css/app.css
similarity index 100%
rename from modules/fx-rates/assets/css/app.css
rename to custom/apps/fx-rates/assets/css/app.css
diff --git a/modules/fx-rates/assets/js/app.js b/custom/apps/fx-rates/assets/js/app.js
similarity index 100%
rename from modules/fx-rates/assets/js/app.js
rename to custom/apps/fx-rates/assets/js/app.js
diff --git a/modules/fx-rates/bootstrap.php b/custom/apps/fx-rates/bootstrap.php
similarity index 100%
rename from modules/fx-rates/bootstrap.php
rename to custom/apps/fx-rates/bootstrap.php
diff --git a/modules/fx-rates/config/example.config.php b/custom/apps/fx-rates/config/example.config.php
similarity index 100%
rename from modules/fx-rates/config/example.config.php
rename to custom/apps/fx-rates/config/example.config.php
diff --git a/modules/fx-rates/config/module.php b/custom/apps/fx-rates/config/module.php
similarity index 100%
rename from modules/fx-rates/config/module.php
rename to custom/apps/fx-rates/config/module.php
diff --git a/modules/fx-rates/design.json b/custom/apps/fx-rates/design.json
similarity index 100%
rename from modules/fx-rates/design.json
rename to custom/apps/fx-rates/design.json
diff --git a/modules/fx-rates/desktop.php b/custom/apps/fx-rates/desktop.php
similarity index 100%
rename from modules/fx-rates/desktop.php
rename to custom/apps/fx-rates/desktop.php
diff --git a/modules/fx-rates/docs/README.md b/custom/apps/fx-rates/docs/README.md
similarity index 94%
rename from modules/fx-rates/docs/README.md
rename to custom/apps/fx-rates/docs/README.md
index 178435a3..035e77e9 100644
--- a/modules/fx-rates/docs/README.md
+++ b/custom/apps/fx-rates/docs/README.md
@@ -4,7 +4,7 @@ Das Modul `fx-rates` stellt gespeicherte Waehrungskurse, Historie, Umrechnung un
## Kernpunkte
-- Desktop-App unter `modules/fx-rates/desktop.php`
+- Desktop-App unter `custom/apps/fx-rates/desktop.php`
- API unter `/api/fx-rates/...`
- Widget fuer den rechten Desktop-Infobereich ueber `config/widgets.php`
- externer Provider-Token wird aus dem alten Bestand als Default uebernommen
diff --git a/modules/fx-rates/module.json b/custom/apps/fx-rates/module.json
similarity index 100%
rename from modules/fx-rates/module.json
rename to custom/apps/fx-rates/module.json
diff --git a/modules/fx-rates/pages/index.php b/custom/apps/fx-rates/pages/index.php
similarity index 100%
rename from modules/fx-rates/pages/index.php
rename to custom/apps/fx-rates/pages/index.php
diff --git a/modules/fx-rates/src/Api/Router.php b/custom/apps/fx-rates/src/Api/Router.php
similarity index 100%
rename from modules/fx-rates/src/Api/Router.php
rename to custom/apps/fx-rates/src/Api/Router.php
diff --git a/modules/fx-rates/src/Domain/FxRatesService.php b/custom/apps/fx-rates/src/Domain/FxRatesService.php
similarity index 100%
rename from modules/fx-rates/src/Domain/FxRatesService.php
rename to custom/apps/fx-rates/src/Domain/FxRatesService.php
diff --git a/modules/fx-rates/src/Infrastructure/ConnectionFactory.php b/custom/apps/fx-rates/src/Infrastructure/ConnectionFactory.php
similarity index 100%
rename from modules/fx-rates/src/Infrastructure/ConnectionFactory.php
rename to custom/apps/fx-rates/src/Infrastructure/ConnectionFactory.php
diff --git a/modules/fx-rates/src/Infrastructure/FxRatesRepository.php b/custom/apps/fx-rates/src/Infrastructure/FxRatesRepository.php
similarity index 100%
rename from modules/fx-rates/src/Infrastructure/FxRatesRepository.php
rename to custom/apps/fx-rates/src/Infrastructure/FxRatesRepository.php
diff --git a/modules/fx-rates/src/Infrastructure/ModuleConfig.php b/custom/apps/fx-rates/src/Infrastructure/ModuleConfig.php
similarity index 100%
rename from modules/fx-rates/src/Infrastructure/ModuleConfig.php
rename to custom/apps/fx-rates/src/Infrastructure/ModuleConfig.php
diff --git a/modules/fx-rates/src/Infrastructure/SettingsStore.php b/custom/apps/fx-rates/src/Infrastructure/SettingsStore.php
similarity index 100%
rename from modules/fx-rates/src/Infrastructure/SettingsStore.php
rename to custom/apps/fx-rates/src/Infrastructure/SettingsStore.php
diff --git a/modules/fx-rates/storage/.gitkeep b/custom/apps/fx-rates/storage/.gitkeep
similarity index 100%
rename from modules/fx-rates/storage/.gitkeep
rename to custom/apps/fx-rates/storage/.gitkeep
diff --git a/modules/mining-checker/api/index.php b/custom/apps/mining-checker/api/index.php
similarity index 100%
rename from modules/mining-checker/api/index.php
rename to custom/apps/mining-checker/api/index.php
diff --git a/modules/mining-checker/assets/css/.gitkeep b/custom/apps/mining-checker/assets/css/.gitkeep
similarity index 100%
rename from modules/mining-checker/assets/css/.gitkeep
rename to custom/apps/mining-checker/assets/css/.gitkeep
diff --git a/modules/mining-checker/assets/css/app.css b/custom/apps/mining-checker/assets/css/app.css
similarity index 100%
rename from modules/mining-checker/assets/css/app.css
rename to custom/apps/mining-checker/assets/css/app.css
diff --git a/modules/mining-checker/assets/js/.gitkeep b/custom/apps/mining-checker/assets/js/.gitkeep
similarity index 100%
rename from modules/mining-checker/assets/js/.gitkeep
rename to custom/apps/mining-checker/assets/js/.gitkeep
diff --git a/modules/mining-checker/assets/js/app.js b/custom/apps/mining-checker/assets/js/app.js
similarity index 100%
rename from modules/mining-checker/assets/js/app.js
rename to custom/apps/mining-checker/assets/js/app.js
diff --git a/modules/mining-checker/bootstrap.php b/custom/apps/mining-checker/bootstrap.php
similarity index 100%
rename from modules/mining-checker/bootstrap.php
rename to custom/apps/mining-checker/bootstrap.php
diff --git a/modules/mining-checker/config/example.config.php b/custom/apps/mining-checker/config/example.config.php
similarity index 100%
rename from modules/mining-checker/config/example.config.php
rename to custom/apps/mining-checker/config/example.config.php
diff --git a/modules/mining-checker/config/module.php b/custom/apps/mining-checker/config/module.php
similarity index 100%
rename from modules/mining-checker/config/module.php
rename to custom/apps/mining-checker/config/module.php
diff --git a/modules/mining-checker/design.json b/custom/apps/mining-checker/design.json
similarity index 85%
rename from modules/mining-checker/design.json
rename to custom/apps/mining-checker/design.json
index c5427d41..fa85d7f6 100644
--- a/modules/mining-checker/design.json
+++ b/custom/apps/mining-checker/design.json
@@ -4,7 +4,7 @@
"description": "Erfassung, OCR-Auswertung und Analyse von DOGE-Mining-Messwerten als eingebettetes Modul.",
"actions": [
{ "label": "Nexus Übersicht", "href": "/modules" },
- { "label": "Setup", "href": "/modules/setup/mining-checker", "variant": "secondary" }
+ { "label": "Setup", "href": "/apps/mining-checker?view=setup", "variant": "secondary" }
],
"sections": [
{ "key": "overview", "label": "Übersicht" },
diff --git a/modules/mining-checker/desktop.php b/custom/apps/mining-checker/desktop.php
similarity index 100%
rename from modules/mining-checker/desktop.php
rename to custom/apps/mining-checker/desktop.php
diff --git a/modules/mining-checker/docs/README.md b/custom/apps/mining-checker/docs/README.md
similarity index 99%
rename from modules/mining-checker/docs/README.md
rename to custom/apps/mining-checker/docs/README.md
index 89af70a6..f2149bd0 100644
--- a/modules/mining-checker/docs/README.md
+++ b/custom/apps/mining-checker/docs/README.md
@@ -7,7 +7,7 @@ Das Modul erfasst DOGE-Mining-Messpunkte, analysiert OCR-Vorschlaege aus Screens
## Ordnerstruktur
```text
-modules/mining-checker/
+custom/apps/mining-checker/
|-- api/
|-- assets/
| |-- css/
diff --git a/modules/mining-checker/module.json b/custom/apps/mining-checker/module.json
similarity index 100%
rename from modules/mining-checker/module.json
rename to custom/apps/mining-checker/module.json
diff --git a/modules/mining-checker/pages/index.php b/custom/apps/mining-checker/pages/index.php
similarity index 100%
rename from modules/mining-checker/pages/index.php
rename to custom/apps/mining-checker/pages/index.php
diff --git a/modules/mining-checker/partials/.gitkeep b/custom/apps/mining-checker/partials/.gitkeep
similarity index 100%
rename from modules/mining-checker/partials/.gitkeep
rename to custom/apps/mining-checker/partials/.gitkeep
diff --git a/modules/mining-checker/sql/migrations/001_init.sql b/custom/apps/mining-checker/sql/migrations/001_init.sql
similarity index 100%
rename from modules/mining-checker/sql/migrations/001_init.sql
rename to custom/apps/mining-checker/sql/migrations/001_init.sql
diff --git a/modules/mining-checker/sql/migrations/002_seed_doge_main.sql b/custom/apps/mining-checker/sql/migrations/002_seed_doge_main.sql
similarity index 100%
rename from modules/mining-checker/sql/migrations/002_seed_doge_main.sql
rename to custom/apps/mining-checker/sql/migrations/002_seed_doge_main.sql
diff --git a/modules/mining-checker/sql/migrations/003_timezone_utc.sql b/custom/apps/mining-checker/sql/migrations/003_timezone_utc.sql
similarity index 100%
rename from modules/mining-checker/sql/migrations/003_timezone_utc.sql
rename to custom/apps/mining-checker/sql/migrations/003_timezone_utc.sql
diff --git a/modules/mining-checker/sql/migrations/004_merge_cost_plans_into_purchased_miners.sql b/custom/apps/mining-checker/sql/migrations/004_merge_cost_plans_into_purchased_miners.sql
similarity index 100%
rename from modules/mining-checker/sql/migrations/004_merge_cost_plans_into_purchased_miners.sql
rename to custom/apps/mining-checker/sql/migrations/004_merge_cost_plans_into_purchased_miners.sql
diff --git a/modules/mining-checker/sql/migrations/005_module_theme_settings.sql b/custom/apps/mining-checker/sql/migrations/005_module_theme_settings.sql
similarity index 100%
rename from modules/mining-checker/sql/migrations/005_module_theme_settings.sql
rename to custom/apps/mining-checker/sql/migrations/005_module_theme_settings.sql
diff --git a/modules/mining-checker/sql/migrations/006_user_scope_owner_sub.sql b/custom/apps/mining-checker/sql/migrations/006_user_scope_owner_sub.sql
similarity index 100%
rename from modules/mining-checker/sql/migrations/006_user_scope_owner_sub.sql
rename to custom/apps/mining-checker/sql/migrations/006_user_scope_owner_sub.sql
diff --git a/modules/mining-checker/sql/schema.mysql.sql b/custom/apps/mining-checker/sql/schema.mysql.sql
similarity index 100%
rename from modules/mining-checker/sql/schema.mysql.sql
rename to custom/apps/mining-checker/sql/schema.mysql.sql
diff --git a/modules/mining-checker/sql/schema.pgsql.sql b/custom/apps/mining-checker/sql/schema.pgsql.sql
similarity index 100%
rename from modules/mining-checker/sql/schema.pgsql.sql
rename to custom/apps/mining-checker/sql/schema.pgsql.sql
diff --git a/modules/mining-checker/sql/schema.sql b/custom/apps/mining-checker/sql/schema.sql
similarity index 100%
rename from modules/mining-checker/sql/schema.sql
rename to custom/apps/mining-checker/sql/schema.sql
diff --git a/modules/mining-checker/sql/seed.sql b/custom/apps/mining-checker/sql/seed.sql
similarity index 100%
rename from modules/mining-checker/sql/seed.sql
rename to custom/apps/mining-checker/sql/seed.sql
diff --git a/modules/mining-checker/src/Api/Router.php b/custom/apps/mining-checker/src/Api/Router.php
similarity index 100%
rename from modules/mining-checker/src/Api/Router.php
rename to custom/apps/mining-checker/src/Api/Router.php
diff --git a/modules/mining-checker/src/Domain/AnalyticsService.php b/custom/apps/mining-checker/src/Domain/AnalyticsService.php
similarity index 100%
rename from modules/mining-checker/src/Domain/AnalyticsService.php
rename to custom/apps/mining-checker/src/Domain/AnalyticsService.php
diff --git a/modules/mining-checker/src/Domain/FxService.php b/custom/apps/mining-checker/src/Domain/FxService.php
similarity index 100%
rename from modules/mining-checker/src/Domain/FxService.php
rename to custom/apps/mining-checker/src/Domain/FxService.php
diff --git a/modules/mining-checker/src/Domain/OcrService.php b/custom/apps/mining-checker/src/Domain/OcrService.php
similarity index 100%
rename from modules/mining-checker/src/Domain/OcrService.php
rename to custom/apps/mining-checker/src/Domain/OcrService.php
diff --git a/modules/mining-checker/src/Domain/SeedData.php b/custom/apps/mining-checker/src/Domain/SeedData.php
similarity index 100%
rename from modules/mining-checker/src/Domain/SeedData.php
rename to custom/apps/mining-checker/src/Domain/SeedData.php
diff --git a/modules/mining-checker/src/Domain/SeedImporter.php b/custom/apps/mining-checker/src/Domain/SeedImporter.php
similarity index 100%
rename from modules/mining-checker/src/Domain/SeedImporter.php
rename to custom/apps/mining-checker/src/Domain/SeedImporter.php
diff --git a/modules/mining-checker/src/Infrastructure/ConnectionFactory.php b/custom/apps/mining-checker/src/Infrastructure/ConnectionFactory.php
similarity index 100%
rename from modules/mining-checker/src/Infrastructure/ConnectionFactory.php
rename to custom/apps/mining-checker/src/Infrastructure/ConnectionFactory.php
diff --git a/modules/mining-checker/src/Infrastructure/MiningRepository.php b/custom/apps/mining-checker/src/Infrastructure/MiningRepository.php
similarity index 100%
rename from modules/mining-checker/src/Infrastructure/MiningRepository.php
rename to custom/apps/mining-checker/src/Infrastructure/MiningRepository.php
diff --git a/modules/mining-checker/src/Infrastructure/ModuleConfig.php b/custom/apps/mining-checker/src/Infrastructure/ModuleConfig.php
similarity index 100%
rename from modules/mining-checker/src/Infrastructure/ModuleConfig.php
rename to custom/apps/mining-checker/src/Infrastructure/ModuleConfig.php
diff --git a/modules/mining-checker/src/Infrastructure/SchemaManager.php b/custom/apps/mining-checker/src/Infrastructure/SchemaManager.php
similarity index 100%
rename from modules/mining-checker/src/Infrastructure/SchemaManager.php
rename to custom/apps/mining-checker/src/Infrastructure/SchemaManager.php
diff --git a/modules/mining-checker/src/Legacy/LegacyModuleStore.php b/custom/apps/mining-checker/src/Legacy/LegacyModuleStore.php
similarity index 100%
rename from modules/mining-checker/src/Legacy/LegacyModuleStore.php
rename to custom/apps/mining-checker/src/Legacy/LegacyModuleStore.php
diff --git a/modules/mining-checker/src/Legacy/UserScope.php b/custom/apps/mining-checker/src/Legacy/UserScope.php
similarity index 100%
rename from modules/mining-checker/src/Legacy/UserScope.php
rename to custom/apps/mining-checker/src/Legacy/UserScope.php
diff --git a/modules/mining-checker/src/Support/ApiException.php b/custom/apps/mining-checker/src/Support/ApiException.php
similarity index 100%
rename from modules/mining-checker/src/Support/ApiException.php
rename to custom/apps/mining-checker/src/Support/ApiException.php
diff --git a/modules/mining-checker/src/Support/DebugState.php b/custom/apps/mining-checker/src/Support/DebugState.php
similarity index 100%
rename from modules/mining-checker/src/Support/DebugState.php
rename to custom/apps/mining-checker/src/Support/DebugState.php
diff --git a/modules/mining-checker/src/Support/DebugTrace.php b/custom/apps/mining-checker/src/Support/DebugTrace.php
similarity index 100%
rename from modules/mining-checker/src/Support/DebugTrace.php
rename to custom/apps/mining-checker/src/Support/DebugTrace.php
diff --git a/modules/mining-checker/src/Support/Http.php b/custom/apps/mining-checker/src/Support/Http.php
similarity index 100%
rename from modules/mining-checker/src/Support/Http.php
rename to custom/apps/mining-checker/src/Support/Http.php
diff --git a/modules/mining-checker/storage/uploads/.gitkeep b/custom/apps/mining-checker/storage/uploads/.gitkeep
similarity index 100%
rename from modules/mining-checker/storage/uploads/.gitkeep
rename to custom/apps/mining-checker/storage/uploads/.gitkeep
diff --git a/modules/pihole/api/index.php b/custom/apps/pihole/api/index.php
similarity index 100%
rename from modules/pihole/api/index.php
rename to custom/apps/pihole/api/index.php
diff --git a/modules/pihole/assets/pihole-native.js b/custom/apps/pihole/assets/pihole-native.js
similarity index 100%
rename from modules/pihole/assets/pihole-native.js
rename to custom/apps/pihole/assets/pihole-native.js
diff --git a/modules/pihole/assets/pihole.css b/custom/apps/pihole/assets/pihole.css
similarity index 100%
rename from modules/pihole/assets/pihole.css
rename to custom/apps/pihole/assets/pihole.css
diff --git a/modules/pihole/assets/pihole.js b/custom/apps/pihole/assets/pihole.js
similarity index 100%
rename from modules/pihole/assets/pihole.js
rename to custom/apps/pihole/assets/pihole.js
diff --git a/modules/pihole/assets/pihole_instances.js b/custom/apps/pihole/assets/pihole_instances.js
similarity index 100%
rename from modules/pihole/assets/pihole_instances.js
rename to custom/apps/pihole/assets/pihole_instances.js
diff --git a/modules/pihole/bootstrap.php b/custom/apps/pihole/bootstrap.php
similarity index 100%
rename from modules/pihole/bootstrap.php
rename to custom/apps/pihole/bootstrap.php
diff --git a/modules/pihole/config/module.php b/custom/apps/pihole/config/module.php
similarity index 100%
rename from modules/pihole/config/module.php
rename to custom/apps/pihole/config/module.php
diff --git a/modules/pihole/design.json b/custom/apps/pihole/design.json
similarity index 100%
rename from modules/pihole/design.json
rename to custom/apps/pihole/design.json
diff --git a/modules/pihole/desktop.php b/custom/apps/pihole/desktop.php
similarity index 100%
rename from modules/pihole/desktop.php
rename to custom/apps/pihole/desktop.php
diff --git a/modules/pihole/docs/README.md b/custom/apps/pihole/docs/README.md
similarity index 100%
rename from modules/pihole/docs/README.md
rename to custom/apps/pihole/docs/README.md
diff --git a/modules/pihole/module.json b/custom/apps/pihole/module.json
similarity index 100%
rename from modules/pihole/module.json
rename to custom/apps/pihole/module.json
diff --git a/modules/pihole/pages/index.php b/custom/apps/pihole/pages/index.php
similarity index 100%
rename from modules/pihole/pages/index.php
rename to custom/apps/pihole/pages/index.php
diff --git a/modules/pihole/partials/dashboard.php b/custom/apps/pihole/partials/dashboard.php
similarity index 100%
rename from modules/pihole/partials/dashboard.php
rename to custom/apps/pihole/partials/dashboard.php
diff --git a/modules/pihole/partials/instances.php b/custom/apps/pihole/partials/instances.php
similarity index 100%
rename from modules/pihole/partials/instances.php
rename to custom/apps/pihole/partials/instances.php
diff --git a/modules/pihole/partials/lists.php b/custom/apps/pihole/partials/lists.php
similarity index 100%
rename from modules/pihole/partials/lists.php
rename to custom/apps/pihole/partials/lists.php
diff --git a/modules/pihole/partials/queries.php b/custom/apps/pihole/partials/queries.php
similarity index 100%
rename from modules/pihole/partials/queries.php
rename to custom/apps/pihole/partials/queries.php
diff --git a/modules/salesforce-translation-import/assets/css/app.css b/custom/apps/salesforce-translation-import/assets/css/app.css
similarity index 100%
rename from modules/salesforce-translation-import/assets/css/app.css
rename to custom/apps/salesforce-translation-import/assets/css/app.css
diff --git a/modules/salesforce-translation-import/assets/js/app.js b/custom/apps/salesforce-translation-import/assets/js/app.js
similarity index 100%
rename from modules/salesforce-translation-import/assets/js/app.js
rename to custom/apps/salesforce-translation-import/assets/js/app.js
diff --git a/modules/salesforce-translation-import/desktop.php b/custom/apps/salesforce-translation-import/desktop.php
similarity index 100%
rename from modules/salesforce-translation-import/desktop.php
rename to custom/apps/salesforce-translation-import/desktop.php
diff --git a/modules/salesforce-translation-import/docs/README.md b/custom/apps/salesforce-translation-import/docs/README.md
similarity index 87%
rename from modules/salesforce-translation-import/docs/README.md
rename to custom/apps/salesforce-translation-import/docs/README.md
index 9bea346a..454a9c87 100644
--- a/modules/salesforce-translation-import/docs/README.md
+++ b/custom/apps/salesforce-translation-import/docs/README.md
@@ -4,7 +4,7 @@ Desktop-App fuer den Import von Salesforce-XLIFF-Dateien mit Zieluebersetzungen
## Einbindung
-- Desktop-App ueber `modules/salesforce-translation-import/desktop.php`
+- Desktop-App ueber `custom/apps/salesforce-translation-import/desktop.php`
- oeffentlicher App-Einstieg ueber `public/apps/salesforce-translation-import/index.php`
- Darstellung als `native-module` mit modul-eigenem `app.js` und `app.css`
diff --git a/modules/salesforce-translation-import/module.json b/custom/apps/salesforce-translation-import/module.json
similarity index 100%
rename from modules/salesforce-translation-import/module.json
rename to custom/apps/salesforce-translation-import/module.json
diff --git a/modules/salesforce-translation-import/pages/index.php b/custom/apps/salesforce-translation-import/pages/index.php
similarity index 100%
rename from modules/salesforce-translation-import/pages/index.php
rename to custom/apps/salesforce-translation-import/pages/index.php
diff --git a/docs/ANLEITUNG.md b/docs/ANLEITUNG.md
index b08bec32..703b095f 100644
--- a/docs/ANLEITUNG.md
+++ b/docs/ANLEITUNG.md
@@ -63,7 +63,7 @@ Dort koennen derzeit insbesondere verwaltet werden:
## Module
-Klassische Module liegen unter `modules//` und koennen als normale `App` im Desktop erscheinen.
+Installierbare Fach-Apps liegen unter `custom/apps//` und koennen als normale `App` im Desktop erscheinen.
Aktuell gilt:
diff --git a/docs/CONTENT.md b/docs/CONTENT.md
index 711cf8b8..99050114 100644
--- a/docs/CONTENT.md
+++ b/docs/CONTENT.md
@@ -83,7 +83,7 @@ Stand dieser Datei:
- Startmenue mit `User Setting Bereich`, `Funktion-Bereich` und `Auswahlbereich`
- rechter `Infobereich` mit benutzerbezogener Sichtbarkeit
- `User Self Management` als Setup-App
-- erster echter Modulpfad fuer klassische Module mit Modul-Discovery aus `modules//`
+- erster echter App-Pfad fuer installierbare Fach-Apps mit Discovery aus `custom/apps//`
- `Mining-Checker` als erstes angebundenes klassisches Modul
- `Waehrungs-Checker` als zweites angebundenes klassisches Modul mit Desktop-Widget fuer Kursaktualisierung
- versionierte API auf demselben Host unter `(staging.)desktop.kusche.berlin/api/v1/...`
@@ -103,23 +103,24 @@ Aus [README.md](/home/lars/Schreibtisch/Projekte/desktop.kusche.berlin/docs/READ
- `src/Desktop/` enthaelt zentrale Desktop-Mechaniken
- die API bleibt auf demselben Host wie die Desktop-Shell und wird unter `/api/v1/...` versioniert
- `partials/desktop/` enthaelt Shell-Templates
-- `modules/` bleibt Zielort fuer klassische Module
+- `custom/apps/` bleibt Zielort fuer installierbare Fach-Apps
+- `system/apps/` bleibt Zielort fuer System-Tools
- `temp/nexus-module-import/` ist Rohbasis fuer importierte Nexus-Module
- Keycloak bleibt das Auth-System
### Module
-Aus [modules/README.md](/home/lars/Schreibtisch/Projekte/desktop.kusche.berlin/modules/README.md):
+Aus [custom/apps/README.md](/home/lars/Schreibtisch/Projekte/desktop.kusche.berlin/custom/apps/README.md):
-- klassische Module bleiben unter `modules//`
+- installierbare Fach-Apps liegen unter `custom/apps//`
- Businesslogik wird nicht in den Desktop-Core verschoben
- ein Desktop-Modul kann eigene `desktop.php`, `pages/`, `api/` und `assets/` Strukturen mitbringen
- Modul-Assets muessen nicht in den globalen Desktop-Asset-Baum kopiert werden
### Aktueller Modulstand
-- `Mining-Checker` ist das erste Modul, das als echte Desktop-App aus `modules/mining-checker/` angebunden wird
-- `Waehrungs-Checker` ist das zweite Modul, das als echte Desktop-App aus `modules/fx-rates/` angebunden wird
+- `Mining-Checker` ist eine Desktop-App aus `custom/apps/mining-checker/`
+- `Waehrungs-Checker` ist eine Desktop-App aus `custom/apps/fx-rates/`
- die Desktop-Shell kann Moduldefinitionen zentral erkennen und als `App` bereitstellen
- wiederverwendbare Modul-Helfer liegen im globalen Kern, die Fachlogik bleibt im Modul
diff --git a/docs/README.md b/docs/README.md
index a3866974..299e17f5 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -25,7 +25,8 @@ Zentraler Dokumentationsindex fuer das Projekt.
- `src/Desktop/` zentrale Desktop-Mechaniken
- `src/ModulesCore/` gemeinsame Helfer fuer Modul-Discovery, Modul-HTTP und wiederverwendbare Modul-Anbindung
- `partials/desktop/` Shell-Template
-- `modules/` Zielort fuer klassische Module
+- `custom/apps/` Zielort fuer installierbare Fach-Apps
+- `system/apps/` Zielort fuer nicht installierbare System-Tools
- `temp/nexus-module-import/` Rohbasis fuer importierte Nexus-Module
## Fachliche Hinweise
@@ -49,10 +50,10 @@ Es gilt:
Aktuell wichtig:
-- der Mining-Checker ist das erste als echtes Desktop-Modul angebundene Modul unter `modules/mining-checker/`
-- der Waehrungs-Checker ist als zweites echtes Desktop-Modul unter `modules/fx-rates/` angebunden
-- der Salesforce Translation Import ist als weitere Desktop-App unter `modules/salesforce-translation-import/` angebunden
-- der Boersenchecker ist als weiteres importiertes Desktop-Modul unter `modules/boersenchecker/` angebunden
+- der Mining-Checker ist als echte Desktop-App unter `custom/apps/mining-checker/` angebunden
+- der Waehrungs-Checker ist als Desktop-App unter `custom/apps/fx-rates/` angebunden
+- der Salesforce Translation Import ist als Desktop-App unter `custom/apps/salesforce-translation-import/` angebunden
+- der Boersenchecker ist als importierte Desktop-App unter `custom/apps/boersenchecker/` angebunden
- Modul-Assets koennen ueber einen gemeinsamen Auslieferungsweg aus dem Modul selbst geladen werden
- die API bleibt vorerst auf demselben Host und wird nicht auf `api.desktop.kusche.berlin` ausgelagert
- das gemeinsame Admin-Debug-Widget neben der Uhr ist der Standard fuer Live-Debugging in Desktop und Native-Apps
diff --git a/docs/Umsetzungsanweisung/02_ORDNERSTRUKTUR_UND_GRUNDREGELN.md b/docs/Umsetzungsanweisung/02_ORDNERSTRUKTUR_UND_GRUNDREGELN.md
index eb3afda6..57e1d5bd 100644
--- a/docs/Umsetzungsanweisung/02_ORDNERSTRUKTUR_UND_GRUNDREGELN.md
+++ b/docs/Umsetzungsanweisung/02_ORDNERSTRUKTUR_UND_GRUNDREGELN.md
@@ -10,7 +10,8 @@ Die Ordnerstruktur soll sich so nah wie sinnvoll an der bestehenden Nexus-Strukt
- `/api/` -> Backend- und API-Endpunkte
- `/src/` -> Kernlogik, Services, Utilities
- `/config/` -> Umgebungs-Configs
-- `/modules//` -> klassische Module
+- `/custom/apps//` -> installierbare Fach-Apps
+- `/system/apps//` -> System-Tools und interne App-Quellen
- `/partials/structure/` -> globale Layout-Bausteine
- `/partials/landingpages/` -> Seiten oder Views
- `/tools/` -> Worker, CLI, Hilfstools
@@ -48,7 +49,7 @@ Die klassische Modulstruktur bleibt erhalten.
Das bedeutet:
-- Module bleiben unter `/modules//`
+- installierbare Fach-Apps bleiben unter `/custom/apps//`
- der neue Desktop-Layer ist nur die neue Oberfläche
- Module dürfen nicht ungeordnet in den Desktop-Core verschoben werden
- gemeinsame Desktop-Mechaniken liegen nicht in Modulen, sondern im globalen Kern
diff --git a/docs/Umsetzungsanweisung/03_MIGRATION_BESTEHENDE_MODULE.md b/docs/Umsetzungsanweisung/03_MIGRATION_BESTEHENDE_MODULE.md
index 536d96f6..ec3f2585 100644
--- a/docs/Umsetzungsanweisung/03_MIGRATION_BESTEHENDE_MODULE.md
+++ b/docs/Umsetzungsanweisung/03_MIGRATION_BESTEHENDE_MODULE.md
@@ -19,7 +19,7 @@ Die Übernahme erfolgt zweistufig:
Mindestens:
-- `/modules/`
+- `/custom/apps/`
- relevante globale Dokumentationsdateien
- gegebenenfalls Referenzdateien aus `/src/`, wenn Modul-Helfer benötigt werden
diff --git a/docs/WEITERENTWICKLUNG.md b/docs/WEITERENTWICKLUNG.md
index e95fe894..d0df8839 100644
--- a/docs/WEITERENTWICKLUNG.md
+++ b/docs/WEITERENTWICKLUNG.md
@@ -56,7 +56,8 @@ Verbindlich ist:
## Architekturregeln
-- `modules//` bleibt Ort fuer klassische Module
+- `custom/apps//` bleibt Ort fuer installierbare Fach-Apps
+- `system/apps//` bleibt Ort fuer System-Tools und nicht installierbare App-Quellen
- globale Desktop-Mechaniken liegen im gemeinsamen Kern
- globale Modul-Helfer duerfen im gemeinsamen Kern liegen, Fachlogik aber nicht
- globale Debug-Steuerung fuer Admins liegt im Desktop-Core; Aktivierung erfolgt ueber das gemeinsame Debug-Widget neben der Uhr
diff --git a/public/admin/cron/index.php b/public/admin/cron/index.php
index 239b6d81..9b1dfda1 100644
--- a/public/admin/cron/index.php
+++ b/public/admin/cron/index.php
@@ -4,377 +4,6 @@ declare(strict_types=1);
require_once dirname(__DIR__, 3) . '/src/App/bootstrap.php';
-use App\ConfigLoader;
-use App\CronManagementService;
-use App\KeycloakAuth;
-use ModulesCore\ModuleRegistry;
+use App\AppPaths;
-if (session_status() !== PHP_SESSION_ACTIVE) {
- session_start();
-}
-
-$projectRoot = dirname(__DIR__, 3);
-$auth = new KeycloakAuth(ConfigLoader::load($projectRoot, 'keycloak'));
-if (!$auth->isAuthenticated()) {
- header('Location: /auth/keycloak', true, 302);
- exit;
-}
-
-$currentUser = is_array($_SESSION['desktop_auth']['user'] ?? null) ? $_SESSION['desktop_auth']['user'] : [];
-$currentGroups = array_map(
- static fn (string $group): string => strtolower(trim($group, '/')),
- array_values(array_map('strval', (array) ($currentUser['groups'] ?? [])))
-);
-$isPartial = !empty($_GET['partial']);
-
-if (!in_array('administrators', $currentGroups, true)) {
- http_response_code(403);
- $forbidden = '