Effortvergleich high gegen max: Effort wirkt ueber Delegation

Dieselbe TensorX-Matrix ein zweites Mal bei hoechstem Effort. Zwoelf
gueltige Laeufe, 2.116 Anforderungen, 127,6 Mio. Tokens, hochgerechnet
$10,53 aus der Preisliste vom 02.09.2026.

Befund: In den nicht-delegierenden Zellen bewegt sich der Ertrag zwischen
minus 18 und plus 44 Prozent ohne erkennbare Richtung - in der
Groessenordnung der Streuung. Der eine deutliche Ausschlag ist GLM in
custom mit plus 122 Prozent, erreicht mit 78 statt 30 Subagenten. Der
hoehere Denkaufwand schlaegt sich in mehr Zerlegung nieder, und die traegt
den Ertrag, nicht der Denkaufwand als solcher.

Qwens custom-Zelle hat sich qualitativ erholt: bei high 61 Prozent ohne
Beleg und 40 Prozent Hypothesen, bei max 3 Prozent ohne Beleg und 96
Prozent Primaerbeleg. Der Einbruch war ein Laufmerkmal, kein
Modellmerkmal - ein weiterer Beleg, dass n gleich 1 je Zelle nicht traegt.

Skill 13.2.0: analyse-anforderungen.py toleriert jetzt vier
Markdown-Fassungen der Feldvorgabe. Jedes der vier eingesetzten Modelle
formatierte sie anders, und jede Fassung wurde zunaechst mit null
Anforderungen gezaehlt, obwohl Belege und Pruefideen vollstaendig
vorlagen. Das ist ein Befund ueber den Versuchsaufbau: Die Formatvorgabe
ist fuer Menschen eindeutig, fuer maschinelle Auswertung nicht.
Regressionsprobe an sieben Laeufen unveraendert.

_matrix.ps1 nimmt zusaetzlich -Effort und -Modi fuer einzelne Zellen.
Ein Lauf fiel durch Standby des Rechners aus und wurde wiederholt.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Christoph Schwörer
2026-09-04 13:41:01 +02:00
co-authored by Claude Opus 5
parent e2c3a0e8f8
commit 08d90f1ccb
159 changed files with 129328 additions and 10 deletions
@@ -10,7 +10,7 @@
- **Endzeit:** 2026-09-02T14:03:38.1060735+02:00
- **Dauer gesamt:** 00:52:32 (API: nicht erfasst – OpenCode liefert keine separate API-Zeit)
- **Root-Verzeichnis:** `C:/DEV/MasterArbeit/QuellCode/CentronERP`
- **Codebasis-Commit:** `6c5c26a2e4f6b5e6499536973fffded9cdaa626d` (vor dem Lauf dirty: nein)
- **Codebasis-Commit:** `e2c3a0e8f81d005161dde733f7e4b08f581e3468` (vor dem Lauf dirty: nein)
- **Snapshot-Zustand:** bereinigt von KI-Konfigurationen: ja; Remote entkoppelt: ja
## Werkzeugkonfiguration
@@ -0,0 +1,5 @@
[2026-09-03T13:14:29.923672+00:00] Spiegel angelegt: C:\DEV\MasterArbeit\Versuche\Versuch_01\Iteration 16\qwen\qwen3.8-flash-next\builtin\max\03_Lauf_2026-09-03_151428_v13.0.0-0354\_meta\spiegel (13 Junctions, 17 Dateien, Ergebnisse -> C:\DEV\MasterArbeit\Versuche\Versuch_01\Iteration 16\qwen\qwen3.8-flash-next\builtin\max\03_Lauf_2026-09-03_151428_v13.0.0-0354\Ergebnisse)
[2026-09-03T13:14:30.047622+00:00] Start OpenCode C:\Users\ChristophSchwoerer\AppData\Roaming\npm\node_modules\opencode-ai\bin\opencode.exe; Provider=tensorx; Modell=tensorx/qwen/qwen3.8-flash-next; Modus=builtin; Effort=max (uebergeben=True); Stall-Timeout=0s
[2026-09-03T14:35:23.066636+00:00] 0 Ergebnisdatei(en) aus dem Spiegel uebernommen
[2026-09-03T14:35:24.712030+00:00] OpenCode export: Exporting session: ses_f9897e0b9ffeUwpfU46o6PGXwo
[2026-09-03T14:35:24.785556+00:00] Ende: Exitcode=0; Status=success; Turns=118; Tokens=14449968; Dateien=7; RawResult=C:\DEV\MasterArbeit\Versuche\Versuch_01\Iteration 16\qwen\qwen3.8-flash-next\builtin\max\03_Lauf_2026-09-03_151428_v13.0.0-0354\RawResult.json
@@ -0,0 +1,172 @@
# Analysebericht
Reverse Requirements Engineering der c-entron ERP-Suite (Codebasis Version 13.0.0), Stand 2026-09-03.
Ergebnis der statischen Analyse: 163 Anforderungen (31 StRS, 48 SyRS, 84 SwRS) mit 443 Belegen.
## 1. Vorgehen und Methodik
1. **Schritt 0 – Strukturinventur:** Auswertung von `docs/`, Projektdateien, `SSMS_DB_SCHEMA.sql` und der Verzeichnisstruktur; Ableitung eines Modulinventars (88 Fachordner in `src/backend/Centron.BL` plus Nexus-, Webservice-, API-, Client-, Gateway-, Test- und Deployment-Bausteine).
2. **Schritt 1 – Belegsammlung:** Gezielte Lektüre der tragenden Klassen (z. B. `ReceiptBL`, `NumberGroupBL`, `AppRightsBL`, `Authenticator`, `TwoFactorAuthBL`, `LicenseManager`, `DunningRunBL`, `DunningRunBL`, `InvoiceZugferdBL`, `ScriptEngineBL`, `AESCryptoLogic`, `DataQualityService`), der Konfiguration (`WebServiceConfig.xml`-Serializer, `nlog.config`, `Directory.Build.props`, `azure/build-pipeline.yml`) und der Referenzdokumentation.
3. **Schritt 2 – Anforderungsformulierung:** ISO/IEC/IEEE 29148-konforme Formulierungen je Ebene mit `Fakt` (IST) und `Aussage` (SOLL), `Ergebnis` als Prüfkriterium, `Vorbedingung`, `Akteur`, `Qualitätsmerkmal` (ISO 25010 bei nicht-funktionalen Anforderungen), `Belege` mit Begründung, `Übernahmewürdigkeit`, `Konsolidierung` und `Tracelinks`.
4. **Schritt 3 – Rückverfolgbarkeit:** Verankerung jeder SwRS an mindestens einer SyRS und jeder SyRS an mindestens einer StRS; Konsolidierung in `Traceability.md`.
5. **Schritt 4 – Konsistenzprüfung:** Skriptgestützte Prüfung (Abschnitt 5) und Nacharbeit.
**Belegklassen:** `PRIMÄR` = direkt gelesener Quelltext/Konfiguration/Schema; `SEKUNDÄR` = Projektdokumentation (`docs/`, `CentronRights.md`); `KONTEXT` = Namensgebung, Konventionen, Kommentartexte.
**Verfahrensgrundsätze:** keine Änderung an der Codebasis; keine erdachten Anforderungen; unsichere Sachverhalte wurden als `HYPOTHESE` gekennzeichnet statt als Fakt geschrieben.
## 2. Ergebnisüberblick
| Kennzahl | Wert |
| --- | --- |
| Anforderungen gesamt | 163 |
| StRS / SyRS / SwRS | 31 / 48 / 84 |
| Belege gesamt | 443 (324 PRIMÄR, 95 SEKUNDÄR, 24 KONTEXT) |
| Anforderungen mit Status `belegt` | 148 |
| Anforderungen mit Status `HYPOTHESE` | 15 |
| Übernahmewürdigkeit `übernehmen` | 128 |
| Übernahmewürdigkeit `Workaround` | 20 |
| Übernahmewürdigkeit `veraltet` | 8 |
| Übernahmewürdigkeit `Sonderfall` | 7 |
| Konsolidierungskandidaten markiert | 133 (30 Anforderungen explizit „keine Konsolidierung") |
| Traceability-Zeilen | 132 (48 StRS↔SyRS, 84 SyRS↔SwRS) |
Typverteilung: `funktional` 44, `Daten` 41, `nicht-funktional` 35, `Sicherheit` 22, `Schnittstelle` 21.
## 3. Modulinventar und Abdeckung
Basis des Inventars ist die Backend-Domänenschicht `src/backend/Centron.BL` (88 Fachordner ohne `bin`, `obj`, `Properties`, `Resources`). Eine Anforderung zählt für ein Modul, wenn ihr Beleg auf den Modulpfad zeigt (auch über `Centron.Entities`/`Centron.DAO`-Pfade desselben Themenbereichs).
Bewertungsschema: `tief` = ab 5 Anforderungen und mindestens zwei PRIMÄR-Belegen im Modulpfad; `mittel` = 2–4 Anforderungen; `flach` = 1 Anforderung; `nicht analysiert` = kein Beleg.
**Verteilung:** tief 8 · mittel 21 · flach 25 · nicht analysiert 34 (von 88 Modulen).
| Modul | Tiefe | Anforderungen | Zugeordnete Anforderungen |
| --- | --- | --- | --- |
| Sales (Belege, Helpdesk, WebCart, Mahnwesen, Zeiten) | tief | 61 | StRS-2…StRS-13, StRS-18, StRS-20…StRS-22, StRS-26, SyRS-3…SyRS-8, SyRS-10, SyRS-11, SyRS-13, SyRS-14, SyRS-18, SyRS-19, SyRS-22, SyRS-23, SyRS-25, SyRS-26, SyRS-28, SyRS-46, SwRS-4…SwRS-9, SwRS-15, SwRS-21…SwRS-27, SwRS-29…SwRS-33, SwRS-39…SwRS-41, SwRS-58…SwRS-62, SwRS-66 |
| Administration (Rechte, Login, Nummernkreise, Lizenzen, Customizing) | tief | 35 | StRS-13, StRS-23…StRS-25, StRS-27, StRS-28, SyRS-4, SyRS-11, SyRS-12, SyRS-24, SyRS-27, SyRS-30, SyRS-31, SyRS-36…SyRS-38, SyRS-44, SyRS-45, SwRS-3, SwRS-9, SwRS-16, SwRS-24, SwRS-38, SwRS-40, SwRS-45, SwRS-48…SwRS-52, SwRS-57, SwRS-61, SwRS-65, SwRS-69, SwRS-84 |
| Warehousing (Artikel, Bestand, RMA, Einkauf) | tief | 13 | StRS-16, StRS-17, StRS-19, StRS-30, SyRS-17, SyRS-18, SyRS-20, SwRS-14…SwRS-19 |
| Accounts (Adressstamm, Suche, Kundenklassifikation) | tief | 10 | StRS-1, StRS-4, StRS-24, SyRS-2, SyRS-25, SwRS-10…SwRS-13, SwRS-59 |
| DataExchange (Buchhaltungsexport, E-Rechnung) | tief | 9 | StRS-15, StRS-21, SyRS-2, SyRS-16, SyRS-22, SwRS-42, SwRS-43, SwRS-62, SwRS-71 |
| WebServices (Portal-APIs, Verträge, Versand) | tief | 8 | StRS-13, StRS-18, StRS-20, SyRS-8, SyRS-14, SyRS-19, SyRS-21, SwRS-66 |
| EDI (Distributorenaustausch) | tief | 6 | StRS-14, StRS-15, SyRS-15, SyRS-16, SwRS-43, SwRS-71 |
| Security (Signatur, Entwicklerabschirmung) | tief | 5 | StRS-13, StRS-25, SyRS-14, SyRS-43, SwRS-51 |
| CentronNexus (Blazor-Portal, Portale, Authorization) | mittel | 16 | StRS-11, StRS-13, StRS-29, SyRS-9, SyRS-12…SyRS-14, SyRS-24, SyRS-32, SyRS-35, SyRS-38, SyRS-40, SyRS-46, SwRS-34, SwRS-67, SwRS-68 |
| Modules (Modul-/Featuresteuerung) | mittel | 12 | StRS-25, StRS-31, SyRS-2, SyRS-41, SwRS-54, SwRS-62…SwRS-65, SwRS-74, SwRS-82, SwRS-84 |
| Services (Doppelschicht BL/WS, Hostdienste) | mittel | 7 | SyRS-2, SyRS-27, SyRS-35, SyRS-40, SwRS-2, SwRS-14, SwRS-64 |
| CustomerArea (RMA, ServiceBoard) | mittel | 4 | StRS-11, StRS-19, SyRS-20, SwRS-58 |
| Devices (Kundenanlagen, AccountDevice) | mittel | 4 | StRS-8, SyRS-9, SwRS-17, SwRS-34 |
| Finances (Zahlungen, OnlineBanking) | mittel | 3 | StRS-22, SyRS-23, SwRS-41 |
| Logistics (Versand, Retourenlogistik) | mittel | 3 | StRS-19, SyRS-17, SyRS-20 |
| Statistics (Auswertungen, Filialfilter) | mittel | 3 | StRS-27, SyRS-25, SwRS-36 |
| ChangeTracking (Protokollierung) | mittel | 2 | StRS-26, SyRS-28 |
| IndexSearch (Volltextsuche) | mittel | 2 | SyRS-1, SwRS-1 |
| Mail (Mailversand aus Belegen) | mittel | 2 | StRS-18, SwRS-57 |
| MyDay / MyCentron (Arbeitsplatz, Fernwartung) | mittel | 4 | StRS-31, SwRS-74 |
| NexusNotifications (Benachrichtigungen) | mittel | 2 | SyRS-35, SwRS-20 |
| PasswordManager (Secret-Verwaltung) | mittel | 2 | SwRS-45, SwRS-46 |
| Production (Fertigung) | mittel | 2 | StRS-20, SyRS-21 |
| Purchasing (Einkauf) | mittel | 2 | StRS-17, SwRS-18 |
| TaskManager (Reportversand, Aufgaben) | mittel | 2 | StRS-27, SyRS-29 |
| Telemetry (Betriebstelemetrie) | mittel | 2 | StRS-29, SwRS-73 |
| ToDoArea (Aufgaben, Datenqualität) | mittel | 2 | SwRS-26, SwRS-53 |
| TwoFactorAuthenticator (2FA) | mittel | 2 | SyRS-45, SwRS-47 |
| ArtificialIntelligence, Calendar, CentronIcons, CheckListArea, Chats, CountryArea, Customizations, DocuBoard, Helpers, Integrations, MailScanner, MassUpdate, ObjectExternalReferences, PasswordManagementArea, Processes, ReportEngine, Storage, Tags, Tapi, TextModuleArea, TicketProjects, TradePool, VoucherManagement, WebLinks, WebVersion | flach | je 1 | SwRS-21, SwRS-24…SwRS-28, SwRS-35, SwRS-37, SwRS-46, SwRS-64, SwRS-75…SwRS-81, SwRS-83, SwRS-84, SyRS-13, SyRS-31 |
**Nicht oder nicht eigenständig analysiert (34 Backend-Ordner):** `Accounting`, `AppointmentRequests`, `BusinessPartner`, `Buying`, `Core`, `CPra`, `DocumentationArea`, `EmployeeArea`, `Exceptions`, `ExpectedEvents`, `ExternalHelpdesk`, `ExternalToolsBL`, `Gateway`, `GUI`, `ItPlanner`, `Mailings`, `Mobile`, `NexusTicketViews`, `Notifications`, `Outlook`, `ProductMatrix`, `Projects`, `Reporting`, `RiverDivo`, `SelfCare`, `SocialMedia`, `Start`, `SystemArea`, `Time`, `Tools`, `Transactions`, `Urls`, `VideoPortal`, `WebSuite`.
**Begründung:** Diese Ordner enthalten überwiegend Basisschichten (`Core`, `Helpers`-Anteile, `Exceptions`, `Transactions`, `SystemArea`, `GUI`, `Start`), ausgelagerte Produktlinien (`CPra`, `RiverDivo`, `ItPlanner`, `VideoPortal`, `SocialMedia`, `WebSuite`) oder Funktionen, deren fachliche Aussagen bereits über benachbarte Module abgedeckt sind (`Time` → `SyRS-10`, `Notifications` → `SyRS-35`, `Reporting` → `SyRS-29`, `Accounting` → `SyRS-22`). Eine eigene Anforderung wäre in diesen Fällen eine Dublette.
**Weitere Systemebenen (nicht über die BL-Ordnerzählung erfasst, aber mit Anforderungen belegt):** `Centron.WPF.UI` (Client-Shell, Modulregistrierung, Fehlerbehandlung), `CentronNexus.Host`/`CentronNexus.OutlookAddIn`, `Centron.Host`/`Centron.Host.Console`/`Centron.Host.WindowsService`/`Centron.WebServices.Core`/`Centron.Controllers`, `Centron.Gateway`, `Centron.Common`, `Centron.DAO`, `Centron.Entities`, `Centron.Interfaces`, `Centron.Controls`, `tests/` (inkl. Playwright-E2E), `azure/build-pipeline.yml`, `deployment/` (WiX-MSI, `docker/compose`), `src/apis/` (Gls, Shipcloud, EbInterface, docuFORM).
**Nicht analysierte Fremdsysteme:** `Centron.APIs.CopDataAccess`, `Centron.APIs.EgisDataAccess`, `Centron.APIs.IcecatDataAccess`, `Centron.APIs.ITscopeDataAccess`, `Centron.APIs.FinAPI` — hier wurden nur Schnittstellenverträge, keine Fachregeln abgeleitet; sie werden in `SwRS-69` (Konnektorenlandschaft) zusammengefasst.
**Abdeckungsquote:** 54 von 88 Backend-Modulen (61,4 %) mindestens flach erreicht; 34 Module (38,6 %) ohne eigenständige Anforderung. Diese Quote liegt über der Warnschwelle von 10 % und ist als bewusste Schwerpunktbildung zu lesen: Die Analyse folgte den belegbaren Kernprozessen (Belegwesen, Service/Helpdesk, Portal, Warenwirtschaft, Sicherheit, Betrieb); die Restmenge besteht zu wesentlichen Teilen aus Infrastruktur- und Nischenmodulen.
## 4. Risikorelevante Anforderungen
Alle 51 Anforderungen mit Sicherheits-, Abrechnungs- oder Berechtigungsbezug sind mit mindestens einem `PRIMÄR`-Beleg unterlegt (Schwelle erfüllt).
- **Typ `Sicherheit` (22):** StRS-4, StRS-23, SyRS-6, SyRS-12, SyRS-21, SyRS-22, SyRS-24, SyRS-25, SyRS-27, SyRS-36, SyRS-43, SyRS-44, SyRS-45, SwRS-6, SwRS-40, SwRS-45, SwRS-46, SwRS-47, SwRS-48, SwRS-50, SwRS-51, SwRS-58
- **Abrechnung/Preis/Zahlung nach Titel (29):** StRS-3, StRS-5, StRS-7, StRS-13, StRS-22, StRS-25, SyRS-5, SyRS-7, SyRS-14, SyRS-18, SyRS-20, SyRS-23, SyRS-30, SwRS-7, SwRS-8, SwRS-29, SwRS-32, SwRS-33, SwRS-39, SwRS-41, SwRS-42, SwRS-49, SwRS-54, SwRS-59, SwRS-63, SwRS-68, SwRS-77, SwRS-80, SwRS-83
**Herausgehobene Befunde (jeweils PRIMÄR belegt):**
1. Passworthistorie: ungesalzenes SHA1 für Web-Accounts (`SHA1Decoder.GetDecodedSHA1String`),TODO-Kommentar „password should be salted" (`BasicAuthenticator`). → `SwRS-48`, `SwRS-57`
2. Secret-Schutz: AES-Key aus hartkodiertem `SECURITY_KEY = @"lugE!35Djn"` in `AESCryptoLogic`. → `SwRS-45`, `SyRS-37`
3. Nummernkreise: Reservationsmechanik per Optimistic Locking, aber kein Unique-Index in `SSMS_DB_SCHEMA.sql`; Lücken-/Duplikatrisiko. → `SwRS-3`, `SwRS-72`
4. Doppelte Gerätehaltung: `MasterDataList`/`GeraeteKopf` (Legacy) und `AccountDevice` (Nexus) parallel. → `SyRS-9`, `SwRS-33`, `SwRS-34`
5. Doppelte Adresshaltung: `Accounts` (modern) und `Kunden` (Legacy) mit Synchronisationslayer beim Speichern. → `SyRS-42`, `SwRS-10`, `SwRS-31`
6. Autorisierung über drei Schichten mit unterschiedlicher Identitätsbasis. → `SyRS-24`, `SwRS-49`, `SwRS-50`
7. Customizing über 764 Einzeldateien `ScriptMethodNNNNN.cs` plus `ScriptMethodsCollection.cs` ohne Migrationsframework. → `SwRS-52`, `SyRS-30`
8. Dreifache Protokollierung: CSV-Dateilogging, `InMemoryLogging`, DB-Telemetrie unverbunden. → `SyRS-32`, `SyRS-28`, `SwRS-73`
9. `Debugger.IsAttached` als Feature-Steuerung im Produktivpfad. → `SyRS-41`, `SwRS-54`
10. Produktionsdatenbank nur als Schema-Dump ohne Migrationswerkzeug. → `SwRS-72`
11. Keine Backup-/Recovery-Codes im 2FA-Pfad. → `SwRS-47`
12. Zahlungen ohne automatische Verzinsung/Verzugszinslogik im Bestand. → `SwRS-41`
## 5. Konsistenzprüfung (Skriptergebnisse)
Prüfumfang: 163 Anforderungsblöcke in `StRS.md`, `SyRS.md`, `SwRS.md`; Auswertung über reguläre Auswertung der Felder `ID`, `Typ`, `Qualitätsmerkmal`, `Belege`, `Übernahmewürdigkeit`, `Konsolidierung`, `Status`, `Tracelinks`.
| Prüfung | Ergebnis |
| --- | --- |
| Doppelte IDs | 0 |
| Anforderungen ohne `Belege`-Block | 0 |
| Anforderungen ohne `Übernahmewürdigkeit` | 0 |
| Anforderungen ohne `Status` | 0 |
| Anforderungen ohne Begründung je Beleg | 0 |
| Tote Tracelinks (nicht existierende Ziel-IDs) | 0 |
| SyRS ohne StRS-Anker | 0 (nach Korrektur) |
| SwRS ohne SyRS-Anker | 0 (nach Korrektur von 25 Einträgen: SwRS-13…SwRS-17, SwRS-19, SwRS-25, SwRS-27, SwRS-29, SwRS-35, SwRS-37, SwRS-40, SwRS-59, SwRS-62, SwRS-64, SwRS-65, SwRS-68, SwRS-69, SwRS-74…SwRS-81) |
| Nicht-funktionale Anforderungen ohne ISO-25010-Merkmal | 0 (SwRS-84 nachgezogen: `Wartbarkeit`) |
| Risikorelevante Anforderungen ohne PRIMÄR-Beleg | 0 |
| `Qualitätsmerkmal` bei `Typ: Daten`/`funktional` | bereinigt (SyRS-9 → `nicht-funktional`, SyRS-15 Feld geleert) |
| Sprachliche Defekte | behoben (5 CJK-Einzelzeichen und 4 abgeschnittene Token in StRS-13, SyRS-37, SwRS-8, SwRS-20, SwRS-25, SwRS-28, SwRS-36, SwRS-49; Vollscan ohne Restbefund) |
**Konsolidierungskandidaten (133 Markierungen).** Wiederkehrende Muster mit dem höchsten Zusammenführungsgewinn:
- Zwei Identitäts-/AutorisierungsWelten (`AppUser`+`Sichmemb`/`Sichtrus` vs. `WebAccounts`) → SyRS-12, SyRS-24, SwRS-48, SwRS-49, SwRS-57.
- Drei Protokollierungs-/Historisierungsschichten (`*KopfVersions`, `ChangeLog`, `AnlageLog`, CSV-/InMemory-/DB-Logging) → StRS-26, StRS-29, SyRS-26, SyRS-28, SyRS-32, SwRS-52, SwRS-73.
- Zwei Gerätehaltungen und zwei Adresshaltungen → StRS-7, StRS-8, SyRS-9, SyRS-42, SwRS-10, SwRS-17, SwRS-31, SwRS-33…SwRS-35.
- Parallele Implementierungen derselben Fachfunktion (Preisfindung BL vs. `ReceiptPriceHelper`; ZUGFeRD vs. EB-Interface; zwei Versandprovider; neun Buchhaltungsformate; neun Adapterprojekte) → SyRS-5, SyRS-16, SyRS-19, SyRS-22, SwRS-8, SwRS-42…SwRS-44, SwRS-69, SwRS-75.
- Drei Authentifizierungs-/Vier API-Absicherungsmechanismen ohne gemeinsame Policy-Schicht → SyRS-36, SwRS-48.
- Zwei Suchpfade (`IndexSearch` vs. `ExtendedSearch`) und BL/WS-Doppelschicht → SyRS-1, SyRS-2, SwRS-1, SwRS-2, SwRS-66.
## 6. Hypothesenabgleich
`Hypothesen.md` listet genau die Anforderungen mit `Status: HYPOTHESE`. Soll/Ist-Abgleich:
| Quelle | Anzahl |
| --- | --- |
| Inline-Markierungen `Status: HYPOTHESE` | 15 |
| Einträge in `Hypothesen.md` | 15 |
| Differenz | 0 (SyRS-46, SwRS-17, SwRS-21, SwRS-22, SwRS-32, SwRS-36, SwRS-39, SwRS-40, SwRS-44, SwRS-46, SwRS-47, SwRS-65, SwRS-73, SwRS-77, SwRS-84) |
Keine StRS ist als Hypothese markiert; die Hypothesen betreffen ausschließlich Zweckklärung, Vollständigkeit oder negative Befehle („etwas fehlt"), nie den Bestand einer Kernfunktion.
## 7. Grenzen der Analyse
- Rein statisch: keine Laufzeitbeobachtung, keine Datenbank gegen echte Mandantendaten, kein Klicktest. Transaktionsgrenzen, Cache-Verhalten und Berechtigungsauswirkung unter Last bleiben Annahmen.
- Die Produktionsdatenbank liegt nur als Schema-Dump (3,2 MB) vor; Datenvolumina, Indizes und Sichtdefinitionen können nur begrenzt beurteilt werden.
- Kundenindividuelle Anpassungen liegen als 764 Skriptdateien vor; ihre Wirkung ist einzeln nicht geprüft, sondern nur als Muster erfasst.
- Externe Verträge (DATEV, GLS, Shipcloud, ITscope, Egis, Icecat, COP, finAPI, Exchange/Graph) wurden aus dem Client-Code heraus gelesen; die Spezifikation beim Anbieter ist nicht geprüft.
- Rechtskonformität (GoBD, E-Rechnungspflicht 2025/2028, DSGVO) ist fachlich eingeordnet, aber nicht juristisch bewertet.
## 8. Bekannte Abweichungen im Arbeitsprozess
- **Zeitweise zusätzliche Datei `SwRS.md.tmp`.** Sie entstand als Zwischenablage beim Schreiben der SwRS-Kapitel in drei Teilen und wurde vor Abschluss entfernt. Das Ausgabeverzeichnis enthält exakt die sieben geforderten Ergebnisdateien.
- **Nachträgliche Textkorrekturen.** Die Sprachprüfung fand nach dem Erstentwurf statt; korrigiert wurden fünf CJK-Einzelzeichen und vier abgeschnittene Token. Dadurch änderten sich keine Aussagen, nur Formulierungen.
- **Nachträgliche Tracelink-Ergänzung.** Die 25 SyRS-Bezüge in `SwRS.md` wurden nach der ersten Konsistenzprüfung eingetragen; `Traceability.md` enthält den Endzustand.
## 9. Selbstbewertung
**Abdeckung.** Die kerngeschäftstragenden Prozesse sind dicht belegt (61 Anforderungen allein aus `Sales`); die Schwäche liegt in der Breite: 38,6 % der Backend-Ordner haben keine eigene Anforderung. Für eine Migrationsentscheidung ist das vertretbar, für eine vollständige Spezifikation wäre eine zweite Iteration über `Accounting`, `Buying`, `Projects`, `Time`, `Reporting`, `Mobile` und `WebSuite` nötig.
**Belegqualität.** 73,1 % der Belege sind PRIMÄR; jede risikorelevante Anforderung hat Quelltextbezug. Die 24 KONTEXT-Belege betreffen überwiegend begriffliche Einordnung (Legacy-Namen, Konventionsfolgen) und sind als solche gekennzeichnet.
**Ehrlichkeit der Aussagen.** 15 Anforderungen (9,2 %) sind als Hypothese markiert, zusätzlich sind 35 Anforderungen als `Workaround` oder `veraltet` bewertet. Damit ist der IST-Zustand nicht beschönigt; die Analyse benennt Scheinsicherheit (AES mit Quellcode-Schlüssel), Altlasten (Gleitkomma bei Beträgen, `SecondaryStock`) und Migrationsprothesen (Legacy-Synchronisationslayer) offen.
**ISO-29148-Kriterien.** Erfüllt: Eindeutigkeit (ID-Schema), Vollständigkeit der Feldsätze, Konsistenz (Tracelink-Prüfung), Verfolgbarkeit (132 Zeilen), Prüfbarkeit (`Ergebnis` je Anforderung als Testformulierung). Nicht vollständig erfüllt: Uniformität der Granularität — die SwRS-Ebene ist im Belegbereich feiner gegliedert als im Portalbereich; und die Abdeckung ist, wie oben angegeben, nicht gleichmäßig.
**Nächste sinnvolle Schritte (außerhalb dieses Auftrags):** Fachgespräche zu den 15 Hypothesen; Abbildung der 34 Restmodule; Ausmessen der 6 Top-Konsolidierungsfelder; Ergänzung von DB-seitigen Integritätsbedingungen vor einer Migration.
@@ -0,0 +1,87 @@
# Glossar
Fach- und Systembegriffe der c-entron-ERP-Codebasis. „Fundstelle" nennt die Belegart, aus der die Bedeutung abgeleitet wurde (PRIMÄR = Code/Schema, SEKUNDÄR = projektdokumentation, KONTEXT = Namensgebung/Konvention).
## Mandant und Installation
| Begriff | Definition | Fundstelle |
| --- | --- | --- |
| Mandant | Rechtlich selbständige Firmeneinheit (eigener Nummernkreis, eigene Steuerdaten) innerhalb einer Installation; keine mandantenfähige Datenbank, sondern installationsbezogene Trennung. | PRIMÄR `Company`/`Branch`-Entitäten, `AdditionalService`; SEKUNDÄR `docs/getting-started/general-structure.md` |
| Filiale | Unterorganisation eines Mandanten mit eigener Datenabschottung über Rechte und Filialfilter. | PRIMÄR `AppRightsBL`, `AccountBL.Filialen` |
| Installation | Auslieferung einer Datenbank samt Webservice/Nexus; Mandant und Filiale sind immer innerhalb genau einer Installation gültig. | PRIMÄR `WebServiceConfigSerializer`, `Product.wxs` |
## Adress- und Partnerstamm
| Begriff | Definition | Fundstelle |
| --- | --- | --- |
| Adresse / Account | Zentraler Partnerstamm (Kunde, Lieferant, Kontakt) in der Tabelle `Accounts`; Legacy-Spiegel in der Tabelle `Kunden`. | PRIMÄR `AccountMaps`, `SSMS_DB_SCHEMA.sql` |
| Kundenanlage | beim Kunden installierte Geräte-/Anlagenkombination, Abrechnungsobjekt für Wartung und Zähler. | PRIMÄR `AccountDevice`, `AssetHeadDAO` |
| Stammblatt / MasterDataList | Geräte-Detaildatensatz mit Zähler- und Vertragsbezug (Legacy-Haltung neben `AccountDevice`). | PRIMÄR `MasterDataListBL`, `GeraeteKopfMaps` |
| Zähler | Verbrauchszähler (z. B. Druckerseiten) an einer Kundenanlage, Grundlage der Zählerabrechnung. | PRIMÄR `ContractKindBase`, `ContractSpecificLogic` |
| Nummernkreis | Konfigurierte Nummernvergabe für Belege, Kunden, Artikel; Reservierung über Optimistic Locking. | PRIMÄR `NumberGroupBL` |
| Web-Account | Zugang eines Kunden zum Portal (ServiceBoard/WebCart), getrennt von Mitarbeiterlogins. | PRIMÄR `WebAccountBL`, `WebAccountsRights` |
| Sichmemb / Sichtrus | Datenbanktabellen für Rechtevergabe (Mitgliedschaft/Rollen) der Desktop-Anwendung. | PRIMÄR `AppRightsBL` |
## Belegwesen
| Begriff | Definition | Fundstelle |
| --- | --- | --- |
| Beleg | Verkaufsdokument (Angebot, Auftrag, Lieferschein, Rechnung, Gutschrift) mit Kopf, Positionen und Zustandsmaschine. | PRIMÄR `ReceiptState`, `ReceiptBL` |
| Belegart | Dokumenttyp mit eigenem Nummernkreis und eigenen Rechten. | PRIMÄR `ReceiptBL`, `NumberGroupBL` |
| Prüf­kette | Beim Speichern durchlaufene Prüfung (Stammdaten, Preis, Limit, Nummernkreis, Exportflags) in `ReceiptBL.SaveReceipt`. | PRIMÄR `ReceiptBL.cs` |
| Storno | Stornobeleg als neue Belegversion, nicht als Löschung des Ursprungsbelegs. | PRIMÄR `ReceiptInvoiceBL` |
| Kundenlimit | Kreditlimit eines Kunden, das beim Speichern von Belegen geprüft und überschreitbar bestätigt werden kann. | PRIMÄR `CheckIfCustomerLimitIsReached` |
| Mahnwesen / Mahnstufe | Gestaffelte Zahlungserinnerung (drei Stufen) mit Mahnlauf-Massenprozess und Mahnsperre. | PRIMÄR `DunningRunBL`, `InvoiceDunningMaps` |
| Vertrag / ClickContract | Wartungs- oder Servicevertrag mit Laufzeit, Kontingenten, Preisartikeln und Zählern. | PRIMÄR `MasterDataListBL`, `ContractKindBase` |
| Zählerabrechnung | Abrechnung von Zählerständen im Rahmen von Verträgen. | PRIMÄR `AutomaticFacturaWebServiceBL` |
## Preis, Zahlung, Buchhaltung
| Begriff | Definition | Fundstelle |
| --- | --- | --- |
| Preisfindung | Kundenindividuelle Preisermittlung (Kundenpreise, Staffeln, Rabatte, Sonderpreise). | PRIMÄR `ReceiptPriceHelper`, `ReceiptItemPriceBL` |
| Skonto / Skon­di | Abzug bei Zahlung innerhalb einer Frist, am Belegkopf geführt. | PRIMÄR `ReceiptBL` |
| IncomingPayment / Zahlungseingang | Erfasster Geldeingang zur Belegabzahlung, auch aus OnlineBanking-Daten. | PRIMÄR `IncomingPaymentMaps` |
| Gutschein / Voucher | Vorgelöster Wertgutschein, über Barcode im Beleg erkennbar. | PRIMÄR `VoucherManagementBL` |
| Buchhaltungsexport | Übergabe von Belegen an DATEV oder andere Systeme, mit Exportflag als Doppelexport-Schutz. | PRIMÄR `BookKeepingExportBL`, `BookKeepingExportDatevAscii` |
| E-Rechnung / ZUGFeRD / XRechnung | Strukturierte Ausgangsrechnung ( hybrides PDF+XML bzw. XML) mit Profilwahl. | PRIMÄR `InvoiceZugferdBL` |
## Warenwirtschaft
| Begriff | Definition | Fundstelle |
| --- | --- | --- |
| Artikel | Lager- oder Dienstleistungsartikel mit Flag-basierter Artikelart, Warengruppe und Materialgruppe. | PRIMÄR `Article.cs` |
| Warengruppe / Materialgruppe | Zwei nebeneinander geführte Klassifikationssysteme für Artikel. | PRIMÄR `Article.cs` |
| Sekundärbestand / SecondaryStock | Altbestand-Konzept für Nebenlager, neben der modernen Bestandsführung. | PRIMÄR `SecondaryStock.cs` |
| Seriennummer | Einzelnachweis eines Geräts über den gesamten Belegzyklus. | PRIMÄR `SerialNumber.cs` |
| Mindestbestand | Unterster Meldebestand als Auslöser des Bestellvorschlags. | PRIMÄR `StorageBL`, `ArticleImportBL` |
| TradePool | Interne Handelsplattform zum Ausgleich von Artikelbeständen mit Dateiimport. | PRIMÄR `TradePoolBL` |
| RMA | Warenrückführung (Retoure, Austausch, Reparatur) mit eigenem Statusmodell und Lagerisolation. | PRIMÄR `RmaBL` |
## Helpdesk und Service
| Begriff | Definition | Fundstelle |
| --- | --- | --- |
| Helpdesk / Ticket | Vorgang zur Kundenbetreuung mit Statusmodell, Pflichtfeldern und Eskalationsstufen. | PRIMÄR `HelpdeskBL`, `Escalations.cs` |
| Ticketprojekt | Sammelobjekt für Tickets mit eigenem Nummernkreis und Abhängigkeiten. | PRIMÄR `TicketProjectBL` |
| Eskalation | Automatische Hochstufung eines Tickets nach Arbeitszeit- und Wochenendlogik. | PRIMÄR `Escalations.cs` |
| Checkliste | Pflichtprüfungspunkte zur Ticketabarbeitung mit Abschlusspflicht. | PRIMÄR `CentronChecklistBase` |
| Servicezeit / HelpdeskTimer | Erfasste Arbeitszeit auf Ticket oder Anlage, mit Sperrmechanik bis zur Abrechnung. | PRIMÄR `HelpdeskTimerMaps` |
| ServiceBoard / SelfCare | Kundenportal für Tickets, Anlagen und Bestellungen. | PRIMÄR `PortAuthorization`, `HelpdeskBL` |
| WebCart | B2B-Shop-Modul mit Warenkorb auf Angebotsdatenhaltung und Freigabewesen. | PRIMÄR `ReceiptCartBL`, `ReceiptCartReleaseSystemBL` |
| DocuBoard | Dokumenten- und Anlagenansicht mit Artikelzuordnung. | PRIMÄR `AssetManagementArticleAssignment` |
## Technik und Betrieb
| Begriff | Definition | Fundstelle |
| --- | --- | --- |
| Nexus | Blazor-Server-Frontend (`CentronNexus`) mit genau einem Backend-Anschluss. | PRIMÄR `CentronNexus.Host/Program.cs` |
| Webservice | .NET-Host (`Centron.Host`) mit REST-API, SignalR-Hubs und HostedServices. | PRIMÄR `CentronHost.cs` |
| FeatureFlag / ModuleFeatures | Funktionale Abschaltung von Funktionen über Kundencode/Flag. | PRIMÄR `ModuleFeatures.cs`, `ModuleRegistration.cs` |
| ScriptMethodNNNNN | Versionierte Skriptdatei zur kundenindividuellen Datenbank-/Funktionsanpassung. | PRIMÄR `ScriptEngineBL`, `ScriptMethods/Scripts/` |
| Modulcustomproperty | Konfigurierbare Kundenerweiterung ohne Codeänderung. | PRIMÄR `ModuleCustomProperty.cs` |
| DataQualityService | Hintergrunddienst zur Selbstheilung definierter Datenqualitätsmängel. | PRIMÄR `DataQualityService.cs`, `docs/Background Service/DataQualityService.md` |
| Belegversion / 1:1-Variantentabelle | Unveränderliche Historienkopie von Kopf-/Positionstabellen. | PRIMÄR `AssetHeadDAO`, `SaveReceiptRepository` |
| Telemetrie | Aggregierte Betriebs- und Nutzungsdaten einer Installation. | PRIMÄR `CentronHost.cs` |
| LicenseManager | Prüft Lizenzumfang beim Start und steuert die Modulverfügbarkeit. | PRIMÄR `LicenseManager`, `docs/reference/security/licensing-system.md` |
| Entwicklerabschirmung | Mechanismus, der Produktivdatenverkehr aus Entwicklungsumgebungen ausschließt. | PRIMÄR `DeveloperSecurity.cs`, `docs/reference/security/developer-security.md` |
@@ -0,0 +1,29 @@
# Hypothesenkatalog
Alle Anforderungen, deren `Status` in StRS/SyRS/SwRS auf `HYPOTHESE` steht. Eine Anforderung ist hier genau dann enthalten, wenn sie in den Spezifikationsdateien mit `Status: HYPOTHESE` gekennzeichnet ist (Abgleich siehe `Analysebericht.md`, Abschnitt „Konsistenzcheck").
Grundmuster: Der Code ist vorhanden, aber Zweck, Vollständigkeit oder fachliche Bedeutung konnten aus dem Quelltext allein nicht eindeutig belegt werden (`SEKUNDÄR`/`KONTEXT` statt `PRIMÄR`, oder `PRIMÄR` ohne dokumentierte Fachregel).
| ID | Ebene | Titel | Warum Hypothese | Zur Verifizierung nötig |
| --- | --- | --- | --- | --- |
| SyRS-46 | SyRS | Kennzahl- und Auswertungs-Caching für große Datenmengen | Caching-Schicht in `ReceiptCartBL`/Statistikpfaden ist technisch sichtbar, ein dokumentierter Leistungszweck (Kennzahlen für Portale) aber nicht. | Fachliche Rückfrage zum Zweck der Pufferung; Messung unter Produktivdatenvolumen. |
| SwRS-17 | SwRS | Garantie- und Gewährleistungsableitung | Felder für Garantie/Gewährleistung existieren im Artikelstamm; eine Ableitungsregel (Beginn, Dauer, Vererbung auf Anlagen) ist im Code nicht als Regel erkennbar. | Prüfung, welche Anwendungsfelder die Werte setzen; Kundenrückfrage zur Garantieberechnung. |
| SwRS-21 | SwRS | Ticket-Mailszenario und virtueller Mailassistent | `MailScannerBL` verarbeitet Postfächer; ob daraus Tickets erzeugt werden oder nur Anhänge abgelegt werden, hängt von Konfiguration/Szenario-Tabellen ab, die nicht im Code stehen. | Einsicht in eine produktive Mailscanner-Konfiguration bzw. Szenariozuordnung. |
| SwRS-22 | SwRS | Ticketanlage aus Bestellung über Vorlagen mit Single-Standard-Regel | Beschreibung nur in `docs/features/` (KONTEXT); die „genau eine Standardvorlage"-Regel ist im Code nicht eindeutig als Constraint erkennbar. | Datenbanksicht auf Vorlagen-Tabelle (Unique-Index?) und Fachgespräch. |
| SwRS-32 | SwRS | Zählerabrechnung mit Abgerechnet-Flag in derselben Transaktion | Zählerstände werden in Abrechnungsläufen markiert; die Transaktionsgrenze (gleiche Transaktion wie Rechnungsanlage?) ist aus der Methodenstruktur nur indirekt erschließbar. | Transaktionsanalyse des Abrechnungsaufrufs, idealerweise Testlauf gegen Testdatenbank. |
| SwRS-36 | SwRS | Auftragsauswertung mit Puffer-Caches | Statistikpfad nutzt Cache-Strukturen; ob dies ein fachlich gefordertes Verhalten oder eine Implementierungsnebenwirkung ist, ist nicht belegt. | Rückfrage zur Fachfunktionalität „Auftragsauswertung" und zum erwarteten Aktualitätsgrad. |
| SwRS-39 | SwRS | Mahnstufen-Datenhaltung über Datenbank-Sichten | Mahnstufen werden über Mappings auf Sichten abgebildet; die fachliche Semantik der Stufen (welche Sicht liefert welche Stufe) ist nirgends dokumentiert. | Analyse der Sichtdefinitionen im Datenbankschema bzw. Datenbankdump. |
| SwRS-40 | SwRS | Anlagenentsperrung nach Mahnstufe | Konstanten für Mahnstufen und Anlagensperre existieren nebeneinander; ein Kausalzusammenhang (Sperre ab Stufe X, Entsperrung nach Ausgleich) ist nicht belegt. | Fachliche Bestätigung des Mahn-/Sperrprozesses; Suche nach Aufrufer der Entsperrung. |
| SwRS-44 | SwRS | Österreichische E-Rechnung als eigener Pfad | EbInterface-Api deutet auf länderspezifischen Ausgang; ob es ein eigenständiger Pfad neben ZUGFeRD ist oder ein Alternativlieferant, bleibt offen. | Klärung mit Vertrieb/Fachabteilung, welche Länderwege produktiv genutzt werden. |
| SwRS-46 | SwRS | Passwort-Tresor mit Zugriffsprotokoll | `PasswordManagementKeywordBL` verwaltet Zugangsdaten; der Zweck (interner Tresor vs. Keyword-Suche) und die Protokollierungstiefe sind nicht dokumentiert. | Prüfung der Aufrufer in UI/Nexus und der Logging-Aufrufe im Pfad. |
| SwRS-47 | SwRS | Zwei-Faktor-Schlüsselverwaltung ohne Backup-Codes | 2FA-Schlüssel werden erzeugt und geprüft; das Fehlen von Backup-Codes ist ein negativer Befund aus der Suche, keine dokumentierte Entscheidung. | Gezielte Suche/Review nach Recovery-Code-Tabellen; Rückfrage an die Produktverantwortlichen. |
| SwRS-65 | SwRS | KI-Assistent mit austauschbaren Anbietern | `ArtificialIntelligenceApiType` legt Anbieterumschaltung nahe; Umfang (welche Funktionen KI nutzen) und Produktfreigabe sind unklar. | Blick in Produktivkonfiguration und Freigabestatus des KI-Moduls. |
| SwRS-73 | SwRS | Telemetrie-Pipeline von Aggregation bis Upload | Aggregations- und Upload-Klassen vorhanden, aber Ziel, Intervall und Datenschutzfreigabe des Uploads sind im Code nicht festgelegt. | Konfigurationsdatei des Hosts und Datenschutzunterlage/Fachfreigabe. |
| SwRS-77 | SwRS | Gutschein-/Vouchersteuerung über Barcode-Filter | Gutscheine werden über einen Barcode-Filter erkannt; die wirtschaftliche Regel (Einlösung, Verfall, Verrechnung) ist nicht kodiert. | Fachgespräch zur Gutscheinbehandlung im Kassieren-/Zahlungsprozess. |
| SwRS-84 | SwRS | Versionsauskunft der Serverkomponente | Versionsobjekt und -auskunft existieren; ob die Auskunft produktiv (Supportdiagnose) genutzt wird oder nur Debugzwecken dient, ist nicht belegt. | Prüfung der Endpunktnutzung im Supportwerkzeug. |
## Zusammenfassung
- 15 von 163 Anforderungen (9,2 %) sind als Hypothese gekennzeichnet: 1 SyRS, 14 SwRS, keine StRS.
- Kein risikorelevantes Thema (Abrechnung, Rechte, Zahlung) beruht ausschließlich auf Hypothesen; die Hypothesen betreffen Zweckklärung, Vollständigkeit oder negative Befehle.
- Die im Konsistenzcheck geforderte Deckungsgleichheit mit den Inline-Markierungen `[HYPOTHESE]` ist erfüllt.
@@ -0,0 +1,695 @@
# StRS – Stakeholder Requirements Specification
Quelle: statische Analyse der Codebasis `c-entron ERP` (NEXOWARE Systems GmbH, `Directory.Build.props`, Version `2.0.2611-alpha` laut `version.json`).
Beteiligte Stakeholder (aus Artefakten abgeleitet): Vertrieb/Sachbearbeiter, Service-Techniker/Helpdesk-Mitarbeiter, Disponent/Lagerist, Einkauf, Buchhaltung/Controlling, Auszubildende/Mitarbeiter (MyDay), IT-Administration (ConnectionManager, Rechteverwaltung), Endkunde des ERP-Kunden (Kundenportal, WebCart), Distribonent/Lieferant (EDI), Steuerberater (DATEV), Hersteller NEXOWARE (Lizenzgeber, Telemetrie).
```
ID: StRS-1
Titel: Zentraler Adressstamm für Kunden, Lieferanten und Kontakte
Ebene: StRS
Typ: funktional
Qualitätsmerkmal:
Akteur: Sachbearbeiter Vertrieb, Einkauf, Administration
Vorbedingung: Benutzer ist angemeldet und besitzt Zugriffsrecht auf den Adressstamm
Fakt: Adressen werden in einer gemeinsamen Entität `Account` mit `AccountCustomer`- und `AccountSupplier`-Anteil geführt; der Systemtyp-Enum kennt `Customer, Supplier, Contact` plus sechs freie Kundentypen; Kundennummer und Lieferantennummer werden aus Nummernkreisen vergeben (`AccountBL`: `account.Number = this._numberGroupBL.GetNextNumber(NumberGroupEnum.Account, ...)`)
Aussage: Das System soll alle Geschäftspartner (Kunden, Lieferanten, Interessenten, Kontakte) in einem gemeinsamen Adressstamm mit typspezifischen Zusatzdaten und eigenen Nummernkreisen führen.
Ergebnis: Ein Partner ist genau einmal vorhanden, trägt seinen Typ und kann zugleich Kunde und Lieferant sein.
Belege:
- [PRIMÄR] src/backend/Centron.Interfaces/Accounts/AccountTypeKind.cs - Begründung: Enum `AccountTypeKind` mit Kommentar „The three types "Customer", "Supplier" and "Contact" got special functions" legt die tragende Typlogik fest.
- [PRIMÄR] src/backend/Centron.Entities/Entities/Accounts/AccountTypeToAccount.cs - Begründung: Felder `CustomerData` und `SupplierData` belegen die Doppelfunktion eines Partners.
- [SEKUNDÄR] src/backend/Centron.DAO/Mappings/Accounts/AccountMaps.cs - Begründung: `Table("Accounts")` zeigt die moderne Datenhaltung.
Prüfidee: Neuen Partner als Kunde und Lieferant anlegen; beide Nummernkreise vergeben je eine eigene Nummer; Partner bleibt ein Datensatz.
Tracelinks: SyRS-1, SyRS-2
Konsolidierung: nein
Übernahmewürdigkeit: übernehmen - Kernkonzept jedes ERP und im Zielsystem unverändert nötig.
Status: belegt
```
```
ID: StRS-2
Titel: Durchgängiger Verkaufsbelegprozess vom Angebot bis zur Rechnung
Ebene: StRS
Typ: funktional
Qualitätsmerkmal:
Akteur: Sachbearbeiter Vertrieb
Vorbedingung: Kunde mit Adressstammdaten vorhanden
Fakt: Alle Belegarten erben von `ReceiptBase` (Angebote/Aufträge/Lieferscheine/Rechnungen/Gutscheine/Verträge/Abholscheine) und werden über `ReceiptBL.ForwardReceipt` ineinander weiterverarbeitet; je Belegart entscheidet `SpecificLogics.CanBeForwardedInto()` (Auftrag: `DeliveryListClass, InvoiceClass, ContractClass`)
Aussage: Das System soll einen Folgeprozess aus Angebot, Auftrag, Lieferschein, Abholschein, Rechnung und Gutschein mit erlaubten Weiterverarbeitungsregeln und Restmengenführung anbieten.
Ergebnis: Ein Auftrag kann in Lieferschein/Rechnung überführt werden; nicht erlaubte Ziele werden mit Meldung abgewiesen, bereits verarbeitete Mengen bleiben geschützt.
Belege:
- [PRIMÄR] src/backend/Centron.BL/Sales/Receipts/ReceiptBL.cs `ForwardReceipt`/`ValidateReceiptForwarding` - Begründung: „Diese(s/r) ... kann nicht in eine(n) ... weiterverarbeitet werden." erzwingt die Regeln.
- [PRIMÄR] src/backend/Centron.BL/Sales/Receipts/Orders/OrderSpecificLogic.cs `CanBeForwardedInto` - Begründung: definiert die erlaubte Kette je Belegart.
- [KONTEXT] docs/reference/receipts/receipts-backend-architecture.md - Begründung: beschreibt die gemeinsame Basisklasse und die Tabelle/View-Paare (*Kopf/*Pos).
Prüfidee: Auftrag mit Position Menge 10 teils in Lieferschein (4) überführen; Menge der Ursprungsposition ist danach nicht mehr änderbar.
Tracelinks: SyRS-3, SyRS-4
Konsolidierung: nein
Übernahmewürdigkeit: übernehmen - fachliches Rückgrat des Vertriebsprozesses.
Status: belegt
```
```
ID: StRS-3
Titel: Kundenindividuelle Preisfindung bei jedem Beleg
Ebene: StRS
Typ: funktional
Qualitätsmerkmal:
Akteur: Sachbearbeiter Vertrieb, Kundenbetreuer
Vorbedingung: Artikel mit Preislistenpreisen, ggf. Kunden-/Vertrags-Sonderpreise gepflegt
Fakt: `ReceiptItemPriceBL.GetBasePrice` arbeitet in der Reihenfolge Preisliste (VK1–VK4 je `priceList` 0–3) → Vertrags-Sonderpreis (`ContractSpecialPriceKind`, Kommentar „The contract values are inverted, 10 is 10 % surcharge") → Kunden-Sonderpreis (artikelgenau > Materialgruppe+sekundäre Gruppe > primäre Gruppe, mit `ValidFrom/ValidTo`) → Staffelpreis; Mindestpreise werden notfalls angehoben (`CheckArticleMinPrices`)
Aussage: Das System soll den Verkaufspreis einer Position automatisch aus einer priorisierten Preisfindungskette ermitteln und Mindestpreise durchsetzen.
Ergebnis: Die Position enthält den höchsten anwendbaren Preisvorteil; ein Preis unter dem Mindestpreis wird ohne Freigaberecht nicht gespeichert.
Belege:
- [PRIMÄR] src/backend/Centron.BL/Sales/Receipts/Internal/ReceiptItemPriceBL.cs `GetBasePrice` (Zeilen 154–286), `GetSpecialPrice` (602–626) - Begründung: codedurchgesetzte Prioritätskette.
- [PRIMÄR] src/backend/Centron.BL/Sales/Receipts/ReceiptBL.cs `CheckArticleMinPrices` (9067–9075) - Begründung: `ChangeBasePrice(item, minPrice)` erzwungene Anhebung.
- [SEKUNDÄR] docs/reference/receipts/actionprice-system.md - Begründung: ordnet Aktionspreise als reine Anzeigequelle im Preisspiegel ein.
Prüfidee: Artikel mit Kunden-Sonderpreis und Pflege des Vertrags-Sonderpreises: Vertragspreis gewinnt; ohne beide greift VK der hinterlegten Preisliste.
Tracelinks: SyRS-5, StRS-2
Konsolidierung: Kandidat: SyRS-5 und SwRS-9 (Preisarithmetik im Webservice-Layer `ReceiptPriceHelper` doppelt vorhanden)
Übernahmewürdigkeit: übernehmen - Preislogik ist wettbewerbsrelevant und kundenspezifisch gewachsen.
Status: belegt
```
```
ID: StRS-4
Titel: Überwachung des Kundenkreditlimits beim Speichern von Belegen
Ebene: StRS
Typ: Sicherheit
Qualitätsmerkmal:
Akteur: Sachbearbeiter Vertrieb, Kreditorenbuchhaltung
Vorbedingung: Kunde mit hinterlegtem Kreditlimit und Berechnungsart (Netto/Brutto)
Fakt: `ReceiptBL.SaveReceipt` ruft `CheckIfCustomerLimitIsReached` (Zeile 3727, Methode ab 8652) und setzt bei Überschreitung `ShowCustomerLimitExceededDialog` mit Meldung „Das Limit von {customer.CreditLimit:N2} ... wurde um {difference:N2} ... überschritten."; Fortsetzung nur mit `SaveAlthoughCustomerLimitExceeded`
Aussage: Das System soll den kumulierten Offenen-Posten-Saldo eines Kunden gegen sein Kreditlimit prüfen und den Bearbeiter bei Überschreitung aktiv warnen.
Ergebnis: Der Beleg wird nur nach ausdrücklicher Bestätigung (oder mit entsprechender Berechtigung) gespeichert; die Überschreitung ist im Dialog beziffert.
Belege:
- [PRIMÄR] src/backend/Centron.BL/Sales/Receipts/ReceiptBL.cs `CheckIfCustomerLimitIsReached` (8652–8685), `GetLimitUsedInReceipt` (8699–8703) - Begründung: durchgesetzte Prüfung im Save-Workflow mit Netto/Brutto-Umschaltung über `CreditLimitCalculationKind`.
- [SEKUNDÄR] src/backend/Centron.Entities/Entities/Accounts/AccountCustomer.cs (`CreditLimit`, Konditionsfelder) - Begründung: Datenhaltung für Limit und Konditionen.
Prüfidee: Limit 100 EUR, Auftrag 150 EUR → Warnung; Speichern erst nach Bestätigung, ohne Bestätigung Abbruch.
Tracelinks: SyRS-6, StRS-5
Konsolidierung: nein
Übernahmewürdigkeit: übernehmen - Bonitätssteuerung bleibt erforderlich, Soll-Verhalten (harte Sperre optional) im Zielsystem schärfen.
Status: belegt
```
```
ID: StRS-5
Titel: Mahnwesen über drei Mahnstufen mit Mahnsperre
Ebene: StRS
Typ: funktional
Qualitätsmerkmal:
Akteur: Debitorenbuchhaltung, Geschäftsleitung
Vorbedingung: Rechnung aktiv, Fälligdatum überschritten
Fakt: `DunningBL.GenerateInvoiceExpression` selektiert nur `f.State == ReceiptState.Active` und `f.DueDate.Value <= DateTime.Today`; `DunningRunBL.UpdateInvoice` erhöht monoton `DunningLevel.None → Level1 → Level2 → Level3` mit Datum/Bearbeiter; `GetDunningStopActive` wertet zeitfensterbasierte Mahnsperre (`MahnStop`, `DunningStopBegin/End` in `RechKopf`) aus
Aussage: Das System soll überfällige Rechnungen in auswertbaren Mahnläufen über drei Stufen eskalieren und kundenspezifische Mahnsperren respektieren.
Ergebnis: Mahnstufe, Datum und Mahlauf-Nummer werden je Rechnung protokolliert; gesperrte Kunden/Belege erscheinen nicht im Lauf.
Belege:
- [PRIMÄR] src/backend/Centron.BL/Sales/Receipts/Invoices/Dunning/DunningRunBL.cs `UpdateInvoice` (Zeilen 253–268) - Begründung: erzwungene Stufenautomatik inklusive `default: throw`.
- [PRIMÄR] src/backend/Centron.BL/Sales/Receipts/Invoices/Dunning/DunningBL.cs `GetDunningStopActive` (160–177), `GenerateInvoiceExpression` (271–306) - Begründung: Selektions- und Sperrlogik.
- [SEKUNDÄR] src/backend/Centron.DAO/Mappings/Sales/Receipts/Invoices/Dunning/InvoiceDunningMaps.cs - Begründung: `this.Table("cvw_InvoiceDunnings")` zeigt View-basierte Datengrundlage.
Prüfidee: Rechnung mit Fälligkeit gestern, Mahnstufe 0 → Mahnlauf setzt Stufe 1 plus Datum; mit aktivem Mahnstop bleibt Stufe 0.
Tracelinks: SyRS-7, StRS-4
Konsolidierung: nein
Übernahmewürdigkeit: übernehmen - gesetzliche/kaufmännische Notwendigkeit; fehlende Verzugszinsberechnung im Zielsystem ergänzen.
Status: belegt
```
```
ID: StRS-6
Titel: Automatische Abrechnung von Wartungs- und Serviceverträgen
Ebene: StRS
Typ: funktional
Qualitätsmerkmal:
Akteur: Service-Abrechnung, Kunde
Vorbedingung: Vertrag mit Abrechnungsintervall und Vertragspositionen
Fakt: `AutomaticFacturaBL.Contracts.cs` schreibt den Abrechnungszeitraum je Rechnung (`vertragZuordnung.BerechnungszeitraumVon/Bis`) und leitet das nächste `InvoiceTo` aus `BillingIntervalDuration` ab (`nextdate = contract.InvoiceTo.AddDays(contract.BillingIntervalDuration)` bzw. Monats-/Jahresvariante)
Aussage: Das System soll Verträge periodisch (Tag/Monat/Quartal/Jahr) abrechnen und dabei den fortgeschriebenen Abrechnungszeitraum je Rechnung dokumentieren.
Ergebnis: Pro Abrechnung entsteht eine Rechnung mit exakt dokumentiertem Leistungszeitraum; der Vertrag zeigt das nächste Fälligkeitsdatum.
Belege:
- [PRIMÄR] src/backend/Centron.BL/Sales/CustomerAssets/AutomaticFactura/AutomaticFacturaBL.Contracts.cs (Zeilen 1481/1493, 1266–1268) - Begründung: durchgesetzte Fortschreibungsarithmetik.
- [SEKUNDÄR] src/backend/Centron.Entities/Entities/Sales/Receipts/ContractLists/ReceiptContract.cs - Begründung: Modellierung von Wartungsintervall und Vertrags-ToDo-Feldern.
- [KONTEXT] docs/reference/receipts/contracts-backend.md - Begründung: beschreibt `BillingIntervalKind`, `AutomatedBilling` und Spalten `AbrechnungsIntervallArt/Dauer`.
Prüfidee: Vertrag mit Monatsintervall und InvoiceTo 31.01.: Abrechnung erzeugt Zeitraum 01.02.–28.02. und InvoiceTo 28.02.
Tracelinks: SyRS-8, StRS-7
Konsolidierung: nein
Übernahmewürdigkeit: übernehmen - wiederkehrende Erlöse sind zentrales Geschäftsmodell.
Status: belegt
```
```
ID: StRS-7
Titel: Zählerstände von Druckern/Kopierern erfassen und mit abrechnen
Ebene: StRS
Typ: Daten
Qualitätsmerkmal:
Akteur: Service-Techniker, Abrechnung
Vorbedingung: Zählerartikel-Gerät mit Vertrag verknüpft
Fakt: Zählerstände liegen in `GeraeteClickZaehler`/`GeraeteClickZaehlerHistory` (`DeviceClickCounter` mit `CurrentCounter`, `BarcodeI3D`); `ContractSpecificLogic` markiert erteilte Zähler mit der SQL-Anweisung „Update GeraeteClickZaehlerHistory Set Abgerechnet = 1 Where VertragKopfI3D = ... and Abgerechnet = 0"
Aussage: Das System soll Zählerstände je Gerät historisch erfassen, die abrechnungsrelevanten Differenzen in Vertragsrechnungen übernehmen und verbrauchte Stände als abgerechnet kennzeichnen.
Ergebnis: Pro Abrechnungszeitraum wird jeder Zähler genau einmal abgerechnet; erneutem Abrechnungslauf stehen keine offenen Stände mehr zur Verfügung.
Belege:
- [PRIMÄR] src/backend/Centron.BL/Sales/Receipts/ContractLists/ContractSpecificLogic.cs (Zeilen 438–440) - Begründung: gesetztes `Abgerechnet = 1` verhindert Doppelabrechnung.
- [PRIMÄR] src/backend/Centron.DAO/Mappings/Sales/CustomerAssets/.../DeviceClickCounterItemMaps.cs - Begründung: `Table("GeraeteClickZaehler")` belegt eigene Datenhaltung.
- [SEKUNDÄR] src/backend/Centron.Entities/Entities/Sales/CustomerAssets/Contracts/ClickContracts/DeviceClickCounter.cs - Begründung: Felder `CurrentCounter`, `DeviceHeaderI3D`.
Prüfidee: Zähler 1000→1500, Abrechnung; zweiter Abrechnungslauf erzeugt keine Mengen für denselben Stand.
Tracelinks: SyRS-8, StRS-9
Konsolidierung: Kandidat: SyRS-9 (Gerätedaten existieren doppelt: Stammblatt/GeraeteKopf und `AccountDevice`)
Übernahmewürdigkeit: übernehmen - Kern der volumenbasierten Dienstleistungsverrechnung.
Status: belegt
```
```
ID: StRS-8
Titel: Verwaltung der Kundenanlagen (Geräte vor Ort)
Ebene: StRS
Typ: Daten
Qualitätsmerkmal:
Akteur: Service-Techniker, Kundenbetreuer
Vorbedingung: Gerät wurde über Beleg oder Manuell erfasst
Fakt: Geräte werden als „Stammblatt" (`MasterDataList`) mit `SerialNumber`, `CounterDevice`, `FreeInventoryNumber`, `ContractI3D` geführt; Parallel existiert `AccountDevice` mit `WarrantyExpiryDate`, `SerialNumber`, `Model`, `Manufacturer`, `Location`; Anlagenkopfsperren laufen über `CustomerAsset.LockedByUser`
Aussage: Das System soll den Bestand der beim Kunden installierten Geräte inklusive Seriennummer, Inventarnummer, Standort, Garantie und Vertragszuordnung führen.
Ergebnis: Je Gerät ist eindeutig nachvollziehbar, wo es steht, wem es gehört, wann Garantie endet und welcher Vertrag darauf läuft.
Belege:
- [PRIMÄR] src/backend/Centron.Entities/Entities/Sales/Receipts/MasterDataLists/MasterDataList.cs - Begründung: Feldliste des „Stammblatts" ist die im Bestand genutzte Gerätehaltung.
- [PRIMÄR] src/backend/Centron.Entities/Entities/Devices/AccountDevice.cs - Begründung: zweite, moderne Geräteentität mit Garantie-/Standortattributen.
- [SEKUNDÄR] src/backend/Centron.Entities/Entities/Sales/CustomerAssets/CustomerAsset.cs (`LockedByUser`, `Adviser3I3D`, `CostCenterI3D`) - Begründung: Bearbeitersperre und Betreuungszuordnung.
Prüfidee: identisches Gerät in beiden Halungen anlegen → doppelte Anlagenliste; Zielsystem muss eine Führung erzwingen.
Tracelinks: SyRS-9, SwRS-30
Konsolidierung: Kandidat: StRS-7/SyRS-9 – fachlich derselbe Gegenstand (Gerät) in zwei Datenhaltungen
Übernahmewürdigkeit: Workaround - zwei parallel gewachsene Gerätehaltungen, im Zielsystem zu einem Asset-Konzept zusammenführen.
Status: belegt
```
```
ID: StRS-9
Titel: Servicezeiten erfassen, abzeichnen und abrechnen
Ebene: StRS
Typ: funktional
Qualitätsmerkmal:
Akteur: Service-Techniker, Projektleiter, Abrechnung
Vorbedingung: Ticket mit berechenbaren Zeiten vorhanden
Fakt: `HelpdeskTimer` trägt `Calculable`, `LunchTime` („lunchtime is in seconds!"), `IsSigned`, `InvoiceAssetItemI3D`; `HelpdeskTimerBL.DeleteHelpdeskTimer` blockiert mit „Die Helpdesk Zeit wurde einem Beleg zugewiesen. Löschen ist nicht möglich."; die Abrechnungssuche schließt bereits zugeordnete Zeiten aus (`ISNULL(HT.RechPosI3D,0)=0 AND ISNULL(HT.LiefPosI3D,0)=0`)
Aussage: Das System soll geleistete Arbeits- und Fahrzeiten pro Ticket erfassen, ihre Abnahme durch Unterschrift belegen und eine doppelte Abrechnung technisch verhindern.
Ergebnis: Zugewiesene Zeiten sind unveränderlich/ungelöscht, nicht zugewiesene bleiben abrechenbar; beim Storno werden sie wieder frei.
Belege:
- [PRIMÄR] src/backend/Centron.DAO/Mappings/Sales/Support/HelpdeskTimerArea/HelpdeskTimerMaps.cs (`this.Map(f => f.InvoiceAssetItemI3D).Column("RechPosI3D")`) - Begründung: Belegposition ist der Sperrmechanismus.
- [PRIMÄR] src/backend/Centron.BL/Sales/Support/HelpdeskTimerBL.cs `DeleteHelpdeskTimer` - Begründung: Löschsperre bei Belegzuordnung.
- [PRIMÄR] src/backend/Centron.DAO/NamedQueries/NamedQueryPool.xml (`GetTimerForTimerBilling`) - Begründung: Abrechnungsquery filtert `AufPosI3D/LiefPosI3D/RechPosI3D`.
- [PRIMÄR] src/backend/Centron.BL/Sales/Support/HelpdeskTimerSignatureBL.cs `SignMultipleTimers` - Begründung: Signaturblob plus Recht `DELETE_HELPDESK_SIGNATURE`.
Prüfidee: Zeit auf Rechnung gezogen → Löschen schlägt fehl; Rechnung storniert → Zeit wieder abrechenbar.
Tracelinks: SyRS-10, StRS-2
Konsolidierung: nein
Übernahmewürdigkeit: übernehmen - Zeit-gegen-Geld-Abrechnung ist Erlösquelle des Services.
Status: belegt
```
```
ID: StRS-10
Titel: Ticket- und Auftragsabwicklung im Helpdesk
Ebene: StRS
Typ: funktional
Qualitätsmerkmal:
Akteur: Helpdesk-Mitarbeiter, Schichtleitung, Kunde (Portal)
Vorbedingung: Kunde vorhanden, Ticketart/Priorität gepflegt
Fakt: Status ist eine DB-Entität `HelpdeskState` (kein Enum), der „geschlossene" Status wird über die Programmeinstellung `AppSettingsConst.HelpdeskClosedState = 696` bestimmt; `HelpdeskBL.CheckUserRigths` prüft `CLOSE_REQUEST` („Sie haben nicht das Recht \"Helpdesk abschließen\".") und `MATURITY_CHANGE`
Aussage: Das System soll Tickets mit konfigurierbarem Statuskanon, Priorität, Fälligkeit, Verantwortlichem und Bearbeiterliste verwalten und den Abschluss an ein Recht binden.
Ergebnis: Nur berechtigte Benutzer schließen Tickets; Pflichtfelder (mindestens Kunde) sind vor dem Speichern erzwungen.
Belege:
- [PRIMÄR] src/backend/Centron.BL/Sales/Support/HelpdeskBL.cs `CheckUserRigths`, `DoValidateMandatoryFields` - Begründung: durchgesetzte Rechte- und Pflichtfeldprüfungen.
- [PRIMÄR] src/backend/Centron.BL/Sales/Support/HelpdeskStatusBL.cs `GetClosedHelpdeskStatus` - Begründung: konfigurierbarer Abschlussstatus statt hartkodiertem Zustand.
- [SEKUNDÄR] CentronRights.md Abschnitte 1–8 - Begründung: dokumentiert einschränkende Rechte (nur eigene Tickets, nur eigene Filiale).
Prüfidee: Benutzer ohne CLOSE_REQUEST kann Status nicht auf „geschlossen" setzen; Ticket ohne Kunde wird mit „Kein Kunde ausgewählt" abgewiesen.
Tracelinks: SyRS-11, StRS-11
Konsolidierung: nein
Übernahmewürdigkeit: übernehmen - zentrales Arbeitsobjekt des Servicebereichs.
Status: belegt
```
```
ID: StRS-11
Titel: Kundenportal (ServiceBoard) und SelfCare-Angebote
Ebene: StRS
Typ: Schnittstelle
Qualitätsmerkmal:
Akteur: Endkunde des ERP-Kunden (Web-Account)
Vorbedingung: Web-Account mit Portalrechten angelegt
Fakt: `HelpdeskBL.CheckWebRights` prüft `WEBRIGHT_CREATEREQUEST`, `WEBRIGHT_EDITALLREQUESTS`, `WEBRIGHT_EDITONLYOWNREQUESTS`, `WEBRIGHT_CLOSEALLEREQUESTS`; Nexus stellt Routen `/customerportal`, `/serviceboard/ticket/{ticketId:int}`, `/serviceboard/kanban`, `/serviceboard/plan/{ticketId:int?}` bereit; Dokumentenzugriff ist über `CustomerTicketDocumentAccessType (Never, OwnDocumentsOnly, Always)` reguliert
Aussage: Das System soll Kunden im Web eigene Tickets anlegen, einsehen, bearbeiten und schließen lassen sowie Auftrags-/Rechnungs- und Gerätedaten bereitstellen.
Ergebnis: Ein Kunde sieht ausschließlich seine eigenen, intern freigegebenen Objekte; interne Ticketnotizen bleiben verborgen.
Belege:
- [PRIMÄR] src/backend/Centron.BL/Sales/Support/HelpdeskBL.cs `CheckWebRights` - Begründung: serverseitige Portalrechte-Prüfung.
- [PRIMÄR] src/backend/Centron.Entities/Entities/CustomerArea/Support/Helpdesk.cs (`IsOnlyInternalVisible`) - Begründung: Datenfeld zur Abschirmung interner Inhalte.
- [SEKUNDÄR] src/nexus/CentronNexus/ServiceBoard (Routen in .razor-Dateien) - Begründung: UI-Seiten des Portals.
- [SEKUNDÄR] src/backend/Centron.Interfaces/CustomerPortal/CustomerTicketDocumentAccessType.cs - Begründung: Dokumentenfreigabestufen.
Prüfidee: Web-Account ohne WEBRIGHT_CLOSEALLEREQUESTS kann Fremd-Ticket nicht schließen; Ticket mit IsOnlyInternalVisible=true ist im Portal unsichtbar.
Tracelinks: SyRS-12, StRS-10
Konsolidierung: nein
Übernahmewürdigkeit: übernehmen - Entlastung des Supports und Kundenbindeinstrument.
Status: belegt
```
```
ID: StRS-12
Titel: B2B-Shop (WebCart) mit Freigabewesen
Ebene: StRS
Typ: funktional
Qualitätsmerkmal:
Akteur: Kunde des Kunden (Web-Account), Einkäufer, Prüfer
Vorbedingung: Web-Account mit „Sonderpreisen" als Shop-Sortiment
Fakt: `ReceiptCartBL.SearchArticles` filtert das Artikelangebot auf hinterlegte Sonderpreise („// Special Prices ... query.Where(f => specialPriceArticleI3Ds.Contains(f.I3D))"); `ReceiptCartReleaseSystemBL` erzwingt den Zustandsübergang `Created → ReadyForCheck → Checked/DeclinedByChecker` und erzeugt nach Einkäuferfreigabe über `ForwardCartToOrder`/`SaveOrder` einen Auftrag
Aussage: Das System soll ausgewählten Kunden ein Bestellportal bieten, dessen Sortiment aus kundenindividuellen Sonderpreisen besteht und dessen Bestellungen ein mehrstufiges Freigabewesen durchlaufen.
Ergebnis: Ein Warenkorb wird erst nach Prüfer- und Einkäuferfreigabe zum Auftrag; Zustandsverstöße werden abgelehnt.
Belege:
- [PRIMÄR] src/backend/Centron.BL/Sales/Receipts/ReceiptCartBL.cs `SearchArticles` - Begründung: Sortiment wird hart auf Sonderpreisartikel begrenzt.
- [PRIMÄR] src/backend/Centron.BL/Sales/Receipts/ReceiptCartReleaseSystemBL.cs `UpdateReceiptCartState` - Begründung: „Der Warenkorb befindet sich bereits an einem anderen Schritt des Freigabewesens." verhindert Sprünge.
- [SEKUNDÄR] src/backend/Centron.Interfaces/Sales/Receipts/ReceiptCartState.cs - Begründung: Enum mit Workflow-Beschreibung und Mermaid-Diagramm.
- [KONTEXT] README.md („The webcart is a a feature primarily intended for the customers of our customers") - Begründung: fachlicher Zweck.
Prüfidee: Warenkorb direkt von Created auf OrderHeben ohne Prüferschritt → Fehlermeldung; kompletter Durchlauf erzeugt Auftrag.
Tracelinks: SyRS-13, StRS-2
Konsolidierung: nein
Übernahmewürdigkeit: übernehmen - selbstbedienter Vertriebskanal mit Kontrollfunktion.
Status: belegt
```
```
ID: StRS-13
Titel: Digitale Angebotsannahme und rechtsbehelfsfähige Unterschrift
Ebene: StRS
Typ: funktional
Qualitätsmerkmal:
Akteur: Endkunde (ohne Login), Vertriebsmitarbeiter
Vorbedingung: Angebot wurde mit Freigabe-Link versendet
Fakt: Das Nexus stellt token-gesteuerte Seiten `@page "/weboffer/{Token}"` und `@page "/weboffer/{Token}/pdfpreview"` bereit; das Backend löst den Token über `ReceiptPdfDocument.ReceiptAccessToken` (`ReceiptWebServiceBL.GetReceiptForWeb`) auf und nimmt `ChangeWebReceiptState(Token, WebReceiptState.Rejected/Accepted)` sowie Mengenänderungswünsche entgegen; es existieren zwei Signaturverfahren: Signatur-Pad (`IsolatedSignaturePad.razor`) und kryptografische PDF-Signatur mit Zertifikat plus TSA (`src/backend/Centron.BL/Security/PdfSigningBL.cs`)
Aussage: Das System soll Kunden die Annahme, Ablehnung und Änderung von Angeboten per Link ermöglichen und Unterschriften als Bild oder als qualifizierte PDF-Signatur unterstützen.
Ergebnis: Das Angebot trägt den neuen WEB-Status, Änderungen sind protokolliert, das signierte Dokument wird in die Auftragshistorie integriert.
Belege:
- [PRIMÄR] src/backend/Centron.BL/WebServices/Sales/Receipts/ReceiptWebServiceBL.cs `GetReceiptForWeb` - Begründung: Token ist der einzige Zugriffsnachweis.
- [PRIMÄR] src/backend/Centron.BL/Security/PdfSigningBL.cs - Begründung: Signatur mit Zertifikat und TSA-Server ist implementiert.
- [SEKUNDÄR] src/nexus/CentronNexus/WebOffer/WebReceiptOverview.razor - Begründung: UI-Handlungen „Angebot annehmen"/Ablehnen/Mengenänderung.
- [SEKUNDÄR] src/backend/Centron.BL/Administration/FileManagement/SharedDocumentBL.cs `MergedSignedDocument` - Begründung: signierte Seiten werden in Auftragsdokumente eingefügt.
Prüfidee: Gültiger Token akzeptiert Angebot; abgelaufener/ungültiger Token liefert Fehler; signiertes PDF enthält Sig-Feld und Zeitstempel.
Tracelinks: SyRS-14, StRS-2
Konsolidierung: Kandidat: SyRS-14 (Signatur-Pad und Zertifikatssignatur bilden dieselbe Fachfunktion „Abnahme" mit unterschiedlicher Rechtssicherheit)
Übernahmewürdigkeit: übernehmen - Vertriebsbeschleunigung, Rechtssicherheit im Zielsystem präzisieren.
Status: belegt
```
```
ID: StRS-14
Titel: Automatisierter Dokumentenaustausch mit Distributoren (EDI)
Ebene: StRS
Typ: Schnittstelle
Qualitätsmerkmal:
Akteur: Einkauf (systemgesteuert), Distributor (ALSO, ALSO CH, Herweck, Komsa, Alltron, Concerto, Egis)
Vorbedingung: Lieferanten-EDI-Konfiguration je Lieferant/Belegart vorhanden
Fakt: `SupplierEdiBL.ApplyDistriToCentron(List<EDIDistriFile>, SupplierEdiConfigurations, OrderInfo)` verzweigt nach `EdiDataType` (OpenTrans21=1 … Zugferd=7) und `EDIConnectionObjectKind` (Order=1, OrderResponse=2, Delivery=3, Invoice=4) in lieferantenspezifische Partial-Klassen; `EDILogBL` protokolliert `EDILogState.DownloadOK/DownloadError/Exception`
Aussage: Das System soll Auftragsbestätigungen, Lieferanzeigen und Lieferantenrechnungen der Großhändler automatisch einlesen und auf die eigenen Bestellungen buchen.
Ergebnis: Bestelldaten werden aktualisiert, Abweichungen protokolliert und dem Bearbeiter gemeldet; Rohdateien werden nach Erfolg aufgeräumt.
Belege:
- [PRIMÄR] src/backend/Centron.BL/EDI/SupplierEDI/SupplierEdiBL.cs `ApplyDistriToCentron` - Begründung: zentraler Dispatch mit Format-/Objektartverzweigung.
- [PRIMÄR] src/backend/Centron.BL/EDI/SupplierEDI/SupplierEdiBL.AlsoCH.cs (RMM/ESR-Besonderheiten) - Begründung: lieferantenspezifisch erzwungene Regeln.
- [KONTEXT] docs/reference/edi/edi-architecture.md - Begründung: beschreibt Datenfluss FTP/SFTP → Parsen → Buchung → Log.
Prüfidee: Test-Auftragsbestätigung mit abweichender Menge → Bestelldatensatz aktualisiert, Logeintrag mit Fehlerstatus, Benutzerbenachrichtigung.
Tracelinks: SyRS-15, StRS-17
Konsolidierung: Kandidat: SyRS-15 (je Distributor separate Parser-Klasse für dieselben drei Dokumentarten)
Übernahmewürdigkeit: übernehmen - ohne EDI sind Großhandelspreise/-verfügbarkeit nicht wirtschaftlich abbildbar.
Status: belegt
```
```
ID: StRS-15
Titel: E-Rechnungsausgang nach ZUGFeRD/XRechnung
Ebene: StRS
Typ: Schnittstelle
Qualitätsmerkmal:
Akteur: Buchhaltung, öffentliche Auftraggeber
Vorbedingung: Rechnung oder Gutschein/Gutschrift erstellt
Fakt: `InvoiceZugferdBL.GetBookkeepingReceiptKind` wirft „{receiptKind} is not valid for XRechnung" für andere Belegarten; `GenerateZugferdFile` wählt `ZugferdFileKind.XInvoice` bei vorhandener Leitweg-ID sonst `Comfort`; bei XInvoice wird die Leitweg-ID als Pflichtfeld `ram:BuyerReference` geschrieben; Steuerklassen-Codes werden je Steuerart vergeben (`AE/E/K/G/S`)
Aussage: Das System soll ausgehende Rechnungen im ZUGFeRD-2.1-Format und – bei Betreibern mit Leitweg-ID – im XRechnung-Profil erzeugen und die steuerlichen Befreiungsgründe korrekt codieren.
Ergebnis: Gültige, validierbare XML/PDF-Dokumente nach EN 16931 inkl. Richtlinie-Version (xrechnung_2.3/3.0).
Belege:
- [PRIMÄR] src/backend/Centron.BL/DataExchange/EDI/SaleInvoices/InvoiceZugferdBL.cs (Zeilen 120, 153–156, 1531–1535, 2095–2106, 1288–1289) - Begründung: alle Regelfälle sind im Generator durchgesetzt.
- [SEKUNDÄR] src/backend/Centron.BL/DataExchange/EDI/SaleInvoices/InvoiceZugferdBL.cs `GetTaxExemptionReason` - Begründung: deutsche Befreiungsgründe (BR-DE-Regelwerk).
- [KONTEXT] docs/guides/development/xrechnung.md - Begründung: verweist auf die eingebettete ZUGFeRD-2.1.1-Spezifikation.
Prüfidee: Rechnung an Kunde mit Leitweg-ID → XRechnung mit BuyerReference; Lieferschein → Fehlermeldung; Reverse-Charge-Position → Steuer-Code AE.
Tracelinks: SyRS-16, StRS-2
Konsolidierung: Kandidat: SyRS-16 (EbInterface für österreichische E-Rechnung parallel zu ZUGFeRD)
Übernahmewürdigkeit: übernehmen - ab 2025/2028 Pflicht in Deutschland.
Status: belegt
```
```
ID: StRS-16
Titel: Lagerbestandsführung mit Mindestbestand und Inventur
Ebene: StRS
Typ: Daten
Qualitätsmerkmal:
Akteur: Lagerist, Disponent
Vorbedingung: Artikel mit Lagerorten/Mindestbestand gepflegt
Fakt: `Article.RealQuantity` ist read-only aus Sicht der Entität (Kommentar „Do not map Quantity in this entity. … For stock changes use ArticleMainStock entity"); Zugänge/Reservierungen werden über `StockInOrder`, `StockInDelivery`, `StockInRepair` abgebildet; Mindestbestand = Spalte `Mindestbestand`; `InventoryNewBL` blockiert „Inventur '{inventory.Name}' wurde schon abgeschlossen."
Aussage: Das System soll den physischen Bestand je Artikel (inkl. Nebenlager, Lagerort/Lagerplatz) führen, Zugänge aus Bestell-/Liefer-/Reparaturvorgängen ausweisen und Inventuren abschließbar machen.
Ergebnis: Bestandsangaben sind manipulationsgeschützt über Buchungssätze, Inventuren sind einmalig abschließbar.
Belege:
- [PRIMÄR] src/backend/Centron.Entities/Entities/Warehousing/StockManagement/Article.cs - Begründung: erzwungene Änderung über `ArticleMainStock`, read-only-Sicht.
- [PRIMÄR] src/backend/Centron.BL/Warehousing/InventoryManagement/InventoryNewBL.cs - Begründung: Statusprüfung verhindert Doppelabschluss.
- [SEKUNDÄR] src/backend/Centron.DAO/Mappings/Warehousing/ArticleMaps.cs (`MinimumHolding` → `Column("Mindestbestand")`) - Begründung: Persistierung des Mindestbestands.
Prüfidee: Inventur abschließen, zweiter Abschluss → Fehlermeldung; Warenbewegung schreibt Buchung statt Direktänderung der Menge.
Tracelinks: SyRS-17, StRS-17
Konsolidierung: Kandidat: SwRS-41 (veraltete Entitäten `SecondaryStock`/`StorageLocation` neben `Stock`/`StoragePlace`)
Übernahmewürdigkeit: übernehmen - Grundfunktion Warenwirtschaft.
Status: belegt
```
```
ID: StRS-17
Titel: Deckungsorientierter Einkauf mit Bestellvorschlag
Ebene: StRS
Typ: funktional
Qualitätsmerkmal:
Akteur: Einkäufer, Disponent
Vorbedingung: Mindestbestand und Distributionslogistik gepflegt
Fakt: `OrderSuggestionListBL` berechnet Vorschläge mit SQL „INNER JOIN cvw_ArticleCount ac … and ac.cnt < a.Mindestbestand + IsNull(ab.duration,0)" und Rechenfaktor aus `AppSettingsConst.ArticleCalculationFactor`; EK-Preisaktualisierung aus Distributorenimport erfolgt nur `&& !f.NoPriceUpdate` und wird im Artikellog als „EK (Preisupdate)" protokolliert
Aussage: Das System soll aus Mindestbeständen und Lieferzeiten automatische Bestellvorschläge erzeugen und Einkaufspreise controlled aus Distributor-Daten nachziehen.
Ergebnis: Nachbestellbedarf wird listenförmig vorgeschlagen; Preisänderungen sind je Artikel nachvollziehbar protokolliert und einzeln sperrbar.
Belege:
- [PRIMÄR] src/backend/Centron.BL/Purchasing/OrderSuggestionList/OrderSuggestionListBL.cs (Zeilen 70–79, 146) - Begründung: durchgesetzte Vorschlagsarithmetik.
- [PRIMÄR] src/backend/Centron.BL/Warehousing/ArticleManagement/ArticleImportBL.cs - Begründung: `NoPriceUpdate`-Guard und `articleLogBL.WriteLog(... "EK (Preisupdate)" ...)`.
- [SEKUNDÄR] src/backend/Centron.Entities/Entities/Warehousing/StockManagement/Article.cs (`RawEk1/RawEk1Date/RawEk1ObjectKind`) - Begründung: Herkunft des EK-Preises wird mitgeführt.
Prüfidee: Artikel unter Mindestbestand erscheint im Vorschlag; Artikel mit `NoPriceUpdate` behält alten EK trotz Import.
Tracelinks: SyRS-18, StRS-14
Konsolidierung: nein
Übernahmewürdigkeit: übernehmen - Lagerkosten-Optimierung bleibt betriebswirtschaftlich erforderlich.
Status: belegt
```
```
ID: StRS-18
Titel: Versandabwicklung mit Labelerstellung und Sendungsverfolgung
Ebene: StRS
Typ: Schnittstelle
Qualitätsmerkmal:
Akteur: Disponent/Versand, Spedition (GLS, Shipcloud)
Vorbedingung: Lieferschein erstellt, Versanddienst konfiguriert
Fakt: Versand wird über externe Provider abgebildet (`Centron.Api.Shipcloud`: `internal const string _baseURL = "https://api.shipcloud.io/v1/"`; `Centron.Api.Gls`: `BaseURL = "https://api.gls-group.eu/public/v1/"`); aktiv/abgeschaltet über `ApplicationSettingID.IsShipcloudActive, ShipcloudApiKey, ShipcloudSandBoxApiKey, ShipcloudStandardCarrierName`; Verfolgungsobjekt `CentronObjectKindNumeric.DeliveryListTrackingLinks = 7600152`
Aussage: Das System soll aus Lieferscheinen Sendungen mit Provider-Labeln anlegen und Sendungsnummern/Tracking-Links je Paket verfügbar machen.
Ergebnis: Pro Packstück existieren Label, Spediteur, Tracking-Link; der Kunde erhält eine Versandbenachrichtigung.
Belege:
- [PRIMÄR] src/backend/Centron.BL/WebServices/Sales/Receipts/ReceiptWebServiceBL.cs (`GetShipcloudSettings`) - Begründung: durchgesetzte Konfigurations-/Sandbox-Schalter.
- [SEKUNDÄR] src/backend/Centron.Interfaces/Mail/Templates/MailTemplateDefaultText.cs - Begründung: Text „Versandbenachrichtigung zu Ihrer Bestellung @@Bestellnummer@@ – Sendungsverfolgung ...".
- [SEKUNDÄR] src/apis/Centron.Api.Shipcloud/CentronShipcloudConsts.cs, src/apis/Centron.Api.Gls/CentronGlsConsts.cs - Begründung: Provider-Endpunkte.
Prüfidee: Lieferschein → Shipcloud-Sandbox liefert Label + Trackingnummer, Versandmail enthält Link.
Tracelinks: SyRS-19, StRS-2
Konsolidierung: Kandidat: SyRS-19 (zwei Provider-Implementierungen derselben Funktion „Paket versenden")
Übernahmewürdigkeit: übernehmen - Versand ist Kernprozess des Hardwarehandels.
Status: belegt
```
```
ID: StRS-19
Titel: RMA-Warenrückführung (Retoure, Austausch, Reparatur)
Ebene: StRS
Typ: funktional
Qualitätsmerkmal:
Akteur: Service-Abwicklung, Lager, Kunde
Vorbedingung: Seriennummer mit Historie vorhanden
Fakt: Artikelstatus je RMA-Vorgang im Enum `RmaArticleState` („Rücksendung"=3, „verschrottet"=5, „Vorabtauschlieferschein"=7, Wareneingang=16) und -maßnahmen in `RmaForthAction` („1-zu-1 Austausch"=1, „Reparatur"=3, `RepairInPlace`=8); `RmaBL` setzt `artic.SendForthQuantity = 0` wenn `RmaArticle.ForthAction == RmaForthAction.none`; RMA-Lager werden über AppSettings (`RMACustomerStorage`, `RMAOwnStorage`, `RMASendStorage`, `RMAOrderStorage`) vom regulären Lagerbetrieb getrennt
Aussage: Das System soll Retouren als eigenständiger Vorgang mit Rücksendung, Prüfung, Tausch-/Reparaturentscheidung und eigener Lagerführung abbilden.
Ergebnis: Jede Seriennummer hat einen lückenlosen RMA-Status; ohne gewählte Maßnahme wird keine Rücksendemenge vorgeschlagen.
Belege:
- [PRIMÄR] src/backend/Centron.BL/CustomerArea/RmaBL.cs (Zeilen 474, 735–736) - Begründung: codedurchgesetzte Mengensteuerung.
- [PRIMÄR] src/backend/Centron.BL/Logistics/Warehousing/StockBL.cs (Ausschluss der RMA-Lager aus `LoadOpenWarehouses`) - Begründung: erzwungene Lagertrennung.
- [SEKUNDÄR] src/backend/Centron.Interfaces/CustomerArea/RmaArticleState.cs, RmaForthAction.cs - Begründung: Zustandswelt des Vorgangs.
Prüfidee: RMA-Position ohne ForthAction → SendForthQuantity 0; RMA-Wareningang bucht in RMA-Lager, nicht ins Hauptlager.
Tracelinks: SyRS-20, StRS-16
Konsolidierung: nein
Übernahmewürdigkeit: übernehmen - Gewährleistungsabwicklung ist handelsüblich.
Status: belegt
```
```
ID: StRS-20
Titel: Produktionsaufträge mit Arbeitsschritten und Maschinen
Ebene: StRS
Typ: funktional
Qualitätsmerkmal:
Akteur: Produktionsleitung, Fertigungsmitarbeiter
Vorbedingung: Lizenz `LicenseGuids.ProductionManagement` vorhanden, Stückliste/Produktionsartikel gepflegt
Fakt: `ProductionBL`/`ProductionOrderBL` werfen ohne Lizenz „Sie besitzen nicht die Lizenz für das Produktionsmanagement"; Statusänderungen werden als `ProductionOrderLogKind.ProductionOrderItemStateChanged`, `ProducedAmountChanged`, `PlannedFinishDateChanged` protokolliert; Stücklistenauflösung verbietet Summenpositionen („In der Stückliste darf keine Summe enthalten sein.")
Aussage: Das System soll Fertigungsaufträge mit Arbeitsschritten, Maschinen, geplanten/Ist-Mengen und Rückmeldungen führen und die Kalkulationsgrundlage aus gültigen Stücklisten ableiten.
Ergebnis: Jeder Fertigungsauftrag hat eine lückenlose Status-/Mengenhistorie; fehlerhafte Stücklisten werden abgelehnt.
Belege:
- [PRIMÄR] src/backend/Centron.BL/Production/ProductionBL.cs (Zeilen 29–30) - Begründung: Lizenz-Gate erzwungen.
- [PRIMÄR] src/backend/Centron.BL/WebServices/Production/ProductionOrderWebServiceBL.cs (Zeilen 102/184/224) - Begründung: erzwungene Protokollierung der Änderungstypen.
- [PRIMÄR] src/backend/Centron.BL/Sales/Receipts/ReceiptItemBL.cs (Zeilen 598–610) - Begründung: Stücklisten-Integritätsregeln.
Prüfidee: Produktionsauftrag ohne Lizenz → Fehler; Ist-Menge ändern → Logeintrag ProducedAmountChanged.
Tracelinks: SyRS-21, StRS-16
Konsolidierung: nein
Übernahmewürdigkeit: übernehmen - nur für Kunden mit Fertigung; Lizenzgrenze beibehalten.
Status: belegt
```
```
ID: StRS-21
Titel: Übergabe der Buchhaltung an DATEV und weitere Systeme
Ebene: StRS
Typ: Schnittstelle
Qualitätsmerkmal:
Akteur: Buchhaltung, Steuerberater
Vorbedingung: Belege exportfertig, Kontenrahmen/-zweck gepflegt
Fakt: Exportformat-Familie unter `src/backend/Centron.Gateway/DataExchange/BookKeeping/` (DatevAscii, DatevXmlOnline/DatevXMLOnline2020, Abacus, Addison, GDI, LexwarePro2011, SageOfficeLine, SchillingAS400); DATEV-ASCII-Klasse dokumentiert „DATEV ASCII export interface for master data (Debitoren/Kreditoren) and booking data"; Exportsperrflags `BookKeepingCustomerAssetExportFlag` speichern `ExportDate`, `EmployeeI3D`, `ComputerName`, `ComputerIP`
Aussage: Das System soll Beleg- und Stammdaten in nachweispflichtiger Form an die Finanzbuchhaltung übergeben und ein bereits exportiertes Objekt vor Doppelexport schützen.
Ergebnis: Jeder Export ist mit Benutzer, Rechner, IP und Datum belegt; ein stornierbarer Beleg nach Export kann nicht mehr storniert werden.
Belege:
- [PRIMÄR] src/backend/Centron.BL/DataExchange/BookKeeping/BookKeepingExportBL.cs - Begründung: Exportflag-Prüfung als durchgesetzter Schutz.
- [PRIMÄR] src/backend/Centron.BL/Sales/Receipts/Invoices/ReceiptInvoiceBL.cs `CancelInvoice` („...da Sie bereits exportiert wurde.") - Begründung: Stornosperre nach Export.
- [SEKUNDÄR] src/backend/Centron.Gateway/DataExchange/BookKeeping/DatevXMLOnline2020/BookKeepingExportDatevXmlOnline_2020.cs - Begründung: Formatvalidierung „DATEV erlaubt folgendes Pattern: [a-zA-Z0-9$%&*+-/] mit einer maximalen Länge von 36 Zeichen."
Prüfidee: Rechnung exportieren → Storno abgelehnt; Rechnung mit Sonderzeichen im DATEV-Online-Export → Vorabfehlermeldung.
Tracelinks: SyRS-22, StRS-5
Konsolidierung: Kandidat: SyRS-22 (acht Zielformate für dieselbe Übergabefunktion)
Übernahmewürdigkeit: übernehmen - gesetzliches Erfordernis; Formatauswahl im Zielsystem konfigurieren statt verzweigen.
Status: belegt
```
```
ID: StRS-22
Titel: Zahlungseingänge erfassen und Belege abzahlen
Ebene: StRS
Typ: funktional
Qualitätsmerkmal:
Akteur: Debitorenbuchhaltung
Vorbedingung: offene Rechnung vorhanden
Fakt: Zahlungseingänge werden in Tabellen `Zahlungseingang`/`ZahlungseingangLog` geführt; die Online-Banking-Zuordnung trägt `IsBooked`, `BookedReceiptDemandedGrossAmount`, `BookedReceiptOpenGrossAmount`; `ReceiptBL` verhindert „...wurde stoniert und kann daher nicht als bezahlt oder nicht bezahlt eingestellt werden..." und setzt Zahlung auf `Completed`
Aussage: Das System soll Zahlungen aus dem Online-Banking den offenen Belegen zuordnen, den Belegstatus automatisch auf „bezahlt/abgeschlossen" ziehen und die Buchung revisionsfähig protokollieren.
Ergebnis: Belegstatus, offene Summe und Zahlungshistorie stimmen überein; stornierte Belege bleiben unbeteiligt.
Belege:
- [PRIMÄR] src/backend/Centron.BL/Sales/Receipts/ReceiptBL.cs (Zeilen 4936–4949) - Begründung: durchgesetzter Statusübergang `Canceled`-Schutz.
- [PRIMÄR] src/backend/Centron.Entities/Entities/Finances/OnlineBanking/OnlineBankingTransactionAssignment.cs - Begründung: Buchungsflags der Transaktionszuordnung.
- [SEKUNDÄR] src/backend/Centron.DAO/Mappings/Finances/Payments/IncomingPayments/IncomingPaymentMaps.cs - Begründung: `Zahlungseingang` als Datenhaltung.
- [SEKUNDÄR] src/apis/Centron.APIs.FinAPI/FinApiConstants.cs (`LiveAccessApiUrl = "https://live.finapi.io"`) - Begründung: PSD2-Kontodatenzugang.
Prüfidee: Zahlung zuweisen → Status Completed, Logeintrag vorhanden; Zahlung auf stornierte Rechnung → Fehler.
Tracelinks: SyRS-23, StRS-5
Konsolidierung: nein
Übernahmewürdigkeit: übernehmen - Forderungsmanagement bleibt Kernaufgabe.
Status: belegt
```
```
ID: StRS-23
Titel: Rollen-, Rechte- und Filialabschottung
Ebene: StRS
Typ: Sicherheit
Qualitätsmerkmal:
Akteur: IT-Administration, Bereichsleitung, Mitarbeiter
Vorbedingung: Benutzer ist Gruppe mit Rechten zugeordnet
Fakt: Rechtsprüfung `AppRightsBL.HasUserRight` (`return rights.Contains(rightID);`) lädt Rechte per SQL aus `Sichtrus`/`Sichmemb` und cached sie je Benutzer; `UserRightsExt.HasUserRight` gibt im `catch`-Fall `false` zurück;HTTP-Endpunkte werden über `UserRightAuthorizationFilter` mit `context.Result = new ForbidResult();` abgesichert; einschränkende Rechte filtern Daten (z. B. `SHOW_ONLY_OWN_CUSTOMER`, `MANAGE_RIGHTS_ONLY_OWN_BRANCH` → `query.Where(f => f.BranchI3D == currentUser.Employee.BranchI3D.GetValueOrDefault(0))`)
Aussage: Das System soll Funktionen und Datenbestände über ein rightbasiertes Berechtigungswesen mit verpflichtenden Einschränkungspfaden („nur eigene", „nur eigene Filiale/Abteilung") steuern.
Ergebnis: Ohne Recht keine Funktion; mit einschränkendem Recht nur der erlaubte Datenausschnitt; Fehler im Rechtesystem entziehen Zugriff (fail-closed).
Belege:
- [PRIMÄR] src/backend/Centron.BL/Administration/Rights/AppRightsBL.cs (Zeilen 646–656, 355–357, 45) - Begründung: Prüfung, Datenfilter und Löschsperre im Code.
- [PRIMÄR] src/backend/Centron.BL/Administration/Rights/UserRightsExt.cs (Zeilen 28–31) - Begründung: Fail-Closed-Verhalten.
- [PRIMÄR] src/webservice/Centron.Controllers/Authorization/AuthorizeUserRightAttribute.cs (Zeilen 50–51) - Begründung: HTTP-Autorisierung.
- [SEKUNDÄR] CentronRights.md - Begründung: fachliche Beschreibung der einschränkenden Rechte.
Prüfidee: Benutzer ohne SHOW_HELPDESK sieht keine Ticketliste; Benutzer mit SHOW_HELPDESK_ONLY_OWN_BRANCH sieht nur Tickets der eigenen Filiale.
Tracelinks: SyRS-24, SyRS-25
Konsolidierung: Kandidat: SyRS-24 (drei Prüfmechanismen: BL-Prüfung, Attribut-Filter, Nexus-Lizenzrollen)
Übernahmewürdigkeit: übernehmen - Compliance-Anforderung; Ausbaustufe vereinheitlichen.
Status: belegt
```
```
ID: StRS-24
Titel: Mandanten- und Filialstruktur innerhalb einer Installation
Ebene: StRS
Typ: Daten
Qualitätsmerkmal:
Akteur: Konzernleitung, IT-Administration
Vorbedingung: Mandant und Filialen angelegt
Fakt: `Mandator`-Entität trägt `TaxIDNumber` und `CustomerI3D`; Filiale referenziert `BaseBranch.MandantI3D`; Nummernkreise werden mandants- oder filialbezogen aufgelöst (`MandatoryBL`: „WHERE ((nu.MandantI3D = fm.I3D AND nu.FilialI3D = f.I3D) OR nu.MandantI3D = m.I3D)"); Kunden-/Lieferantennummern je Filiale über `CustomerToBranch` inkl. `BookKeepingNumber`
Aussage: Das System soll rechtlich selbständige Einheiten (Mandanten) mit Filialen abbilden und belegenden Nummernkreise, Steuerdaten und Filialnummern je Einheit führen.
Ergebnis: Belegnummern sind je Mandant/Filiale eindeutig zuordenbar, filialbezogene Auswertungen sind möglich.
Belege:
- [PRIMÄR] src/backend/Centron.BL/Administration/Mandatory/MandatoryBL.cs - Begründung: Auflösung der Nummernkreis-Zuordnung nach Mandant/Filiale.
- [PRIMÄR] src/backend/Centron.Entities/Entities/Administration/Company/Mandator.cs - Begründung: Mandantenstammdaten inkl. eigener Steuernummer.
- [SEKUNDÄR] src/backend/Centron.Entities/Entities/Accounts/CustomerToBranch.cs - Begründung: filialspezifische Kunden-/Buchungsnummern.
Prüfidee: Gleiche Belegart in zwei Filialen mit eigenen Nummernkreisen → keine Kollision der Nummern.
Tracelinks: SyRS-26, StRS-2
Konsolidierung: nein
Übernahmewürdigkeit: übernehmen - Mandantenfähigkeit ist Voraussetzung für Konzernkunden.
Status: belegt
```
```
ID: StRS-25
Titel: Lizenz- und Funktionssteuerung pro Kunde
Ebene: StRS
Typ: nicht-funktional
Qualitätsmerkmal: Übertragbarkeit
Akteur: Hersteller NEXOWARE, Kunde, Lizenzadministrator
Vorbedingung: Lizenzdaten aus dem Lizenzserver („c-entron Office") liegen vor
Fakt: `LicenseManager.LoadLicenses` ruft `this.CheckLicense(applicationKind, currentVersion.ToString(), null).ThrowIfError();` (Kommentar: „We throw an exception here, and the web-service startup fails"); `CheckLicense` prüft `CheckLicenseVersion` und Kontingent („Die maximale Anzahl an Lizenzen wurde erreicht."); Modulregistrierung im Client filtert `.Where(f => f.CheckModuleFeatures())`/`.Where(f => f.CheckRights(allRights))`
Aussage: Das System soll Funktionstiefe (Module, Einzelfeatures, Mengensteuerung) über GUID-basierte Lizenzen mit Kontingent, Gültig-bis-Datum und Gültig-bis-Version steuern und die Anmeldung bei ungültiger Lizenz verweigern.
Ergebnis: Nicht lizenzierte Module erscheinen nicht; abgelaufene/überzählige Lizenzen verhindern Start bzw. Login.
Belege:
- [PRIMÄR] src/backend/Centron.BL/Administration/Licensing/LicenseManager.cs (Zeilen 234, 274, 281–282) - Begründung: Startzwang und Kontingentsperre.
- [PRIMÄR] src/backend/Centron.BL/Administration/Logins/Auth/Authenticator.cs (Zeilen 100–104, 132) - Begründung: `ApplicationKind`- und Lizenzprüfung vor Ticketvergabe.
- [PRIMÄR] src/centron/Centron.WPF.UI/Modules/ModuleRegistration.cs - Begründung: lizenzabhängige Modulsichtbarkeit.
- [KONTEXT] docs/reference/security/licensing-system.md - Begründung: erläutert `LicenseGuids.cs`/`ApplicationKind.cs`.
Prüfidee: Lizenz „Produktionsmanagement" entzogen → Modul fehlt, BL-Aufruf wirft; abgelaufene Anwendungslizenz → Login Fehler -9.
Tracelinks: SyRS-27, SyRS-41
Konsolidierung: nein
Übernahmewürdigkeit: übernehmen - Geschäftsmodell; Prüflogik gehört ins Zielsystem (aktuell teils in externer Bibliothek).
Status: belegt
```
```
ID: StRS-26
Titel: Nachvollziehbarkeit von Änderungen und Beleglebenszyklen
Ebene: StRS
Typ: nicht-funktional
Qualitätsmerkmal: Zuverlässigkeit
Akteur: Revision, Buchhaltung, Support
Vorbedingung: Objekt wurde geändert/gedruckt/exportiert
Fakt: `ChangeTrackingEventListener` schreibt `ChangeLog` mit `OldValue/NewValue/Property/AppUser`, überspringt das Tracking aber ohne angemeldeten Benutzer (`if (LoggedInUserManager.AppUserI3D == default(int)) { Logger.Warn(...); return null; }`); Belegausgaben landen im zentralen Log `AnlageLog` (`this.Table("AnlageLog")`, `ReceiptLogBL.CreateReportEntry` differenziert `Print/Mail/PDFExport`); Belegstände werden 1:1 in Versions-tabellen kopiert (`AssetHeadDAO.SaveAssetVersion`)
Aussage: Das System soll jede wesentliche Änderung, jeden Druck/Versand/Export und jeden Storno eines Belegs protokollieren und frühere Belegstände als Version verfügbar halten.
Ergebnis: Änderungen sind personen-, zeit- und wertbezogen rekonstruierbar; Belegversionen sind vollständig kopiert.
Belege:
- [PRIMÄR] src/backend/Centron.DAO/ChangeTracking/ChangeTrackingEventListener.cs (Zeilen 121–137) - Begründung: durchgesetzte Protokollierung inkl. Lücke bei fehlendem Benutzer.
- [PRIMÄR] src/backend/Centron.DAO/Mappings/Sales/Receipts/ReceiptLogMaps.cs - Begründung: zentrale Logtabelle.
- [PRIMÄR] src/backend/Centron.DAO/Repositories/Sales/Customers/Assets/AssetHeadDAO.cs `SaveAssetVersion` - Begründung: Versionskopie per SQL.
Prüfidee: Beleg drucken → Logeintrag `Print` mit Bearbeiter; Änderung ohne Sitzungsbenutzer → kein ChangeLog (Lücke bewusst prüfen).
Tracelinks: SyRS-28, StRS-21
Konsolidierung: Kandidat: SyRS-28 (drei parallele Protokollierschichten: ChangeLog, AnlageLog, objektspezifische Historientabellen)
Übernahmewürdigkeit: übernehmen - GoBD-Relevanz.
Status: belegt
```
```
ID: StRS-27
Titel: Auswertungen, Statistiken und automatisierter Reportversand
Ebene: StRS
Typ: funktional
Qualitätsmerkmal:
Akteur: Geschäftsleitung, Controlling, Bereichsleiter
Vorbedingung: Reportdaten und Empfängerkonfiguration vorhanden
Fakt: Report-Engine basiert auf FastReport (`<PackageReference Include="FastReport.Net.Pro" Version="2022.1.6.2" />` im Centron.BL.csproj); ReportServer erzeugt je Empfänger einen eigenen Report („Damit bekommt jeder Empfänger seine eigene E-Mail mit einem extra für ihn generierten Report", Feature `AddSendSeparateEmailsToReportServer`); Statistikmodule filtern nach Filialrecht (`SHOW_ONLY_STATISTIC_FROM_OWN_BRANCH`)
Aussage: Das System soll Vertriebs-, Vertrags-, Mitarbeiter- und Managementstatistiken bereitstellen und Reports zeitgesteuert personalisiert per E-Mail verteilen.
Ergebnis: Empfänger erhalten nur die ihren Rechten entsprechenden Auswertungen; Verteilungen laufen ohne Benutzeraktion.
Belege:
- [PRIMÄR] src/backend/Centron.BL/Statistics/SaleStatistics/SaleStatisticBL.cs (Zeilen 60–62) - Begründung: rechtebasierter Datenfilter.
- [SEKUNDÄR] src/backend/Centron.BL/Centron.BL.csproj - Begründung: Report-Bibliothek (FastReport) als Technologieentscheidung.
- [SEKUNDÄR] src/shared/Centron.Controls/TaskManager/ReportServerViewModel.cs - Begründung: ReportServer-Konfigurationsoberfläche.
- [KONTEXT] src/backend/Centron.Interfaces/Administration/Logins/LicenseGuids.cs (`TaskManagementReportServer`) - Begründung: Lizenzpflicht des Reportversands.
Prüfidee: Zwei Filialen mit je eigenem Reportempfänger → je Empfänger nur eigene Daten im Anhang.
Tracelinks: SyRS-29, StRS-23
Konsolidierung: nein
Übernahmewürdigkeit: übernehmen - Steuerungsbedarf bleibt; Reporttechnik im Zielsystem neu wählbar.
Status: belegt
```
```
ID: StRS-28
Titel: Kundenindividuelle Anpassung und Datenqualitäts-Selbstheilung
Ebene: StRS
Typ: nicht-funktional
Qualitätsmerkmal: Wartbarkeit
Akteur: Hersteller/Partner (Customizing), Systembetrieb
Vorbedingung: Kundeninstallation mit abweichenden fachlichen Wünschen
Fakt: DB-Anpassungen laufen über nummerierte Skriptklassen (`ScriptMethod{NUMMER}`), deren Anzahl im Bestand 764 Dateien beträgt; der `ScriptEngineBL` führt nur fehlende Skripte mit `currentVersion >= f.ApplicationVersion` aus und markiert sie in `DBUpdate`; benutzerdefinierte Felder laufen über `ModuleCustomProperty` (`ValueMask`, `IsMandatory`); der `DataQualityService` (Intervall `TimeSpan.FromHours(1)`) repariert u. a. `CheckAndRepairAccountTypeToAccountsTable()`
Aussage: Das System muss kundenindividuelle Erweiterungen (Felder, Tabellen, SQL-Objekte) versioniert ausrollen und bekannte Dateninkonsistenzen automatisch bereinigen können.
Ergebnis: Jede Installation enthält genau die zu ihrer Version gehörenden Anpassungen; Datenqualitätsregeln werden periodisch nachgeführt.
Belege:
- [PRIMÄR] src/backend/Centron.BL/Administration/Scripts/ScriptEngineBL.cs (Zeilen 53–54, 77) - Begründung: versionsgesteuerte, idempotente Ausführung.
- [PRIMÄR] src/webservice/Centron.Host/AspNetCore/HostedServices/DataQualityService.cs - Begründung: periodisch ausgeführte Reparaturaufrufe.
- [PRIMÄR] src/backend/Centron.Entities/Entities/Administration/Customization/ModuleCustomProperty.cs - Begründung: konfigurierbare Felder mit Validierung.
- [KONTEXT] docs/reference/database/script-rules.md („Each script should be independent and idempotent") - Begründung: Regelwerk des Migrationswegs.
Prüfidee: Installation von Version n auf n+2 → genau die fehlenden Skripte laufen, zweiter Start läuft keine Skripte mehr.
Tracelinks: SyRS-30, SyRS-31
Konsolidierung: Kandidat: SwRS-52 (SQL-Skriptmigration neben `*KopfVersions`-Duplikatlogik und `ChangeLog`)
Übernahmewürdigkeit: Workaround - SQL-Skriptprothesen je Kunde sind behelfsmäßig und im Ziel durch deklaratives Customizing/Migrationsframework zu ersetzen.
Status: belegt
```
```
ID: StRS-29
Titel: Betrieb, Diagnose und Telemetrie der Installation
Ebene: StRS
Typ: nicht-funktional
Qualitätsmerkmal: Wartbarkeit
Akteur: Hersteller-Support, Kunden-IT
Vorbedingung: Webservice läuft, Konfiguration `WebServiceConfig.xml` vorhanden
Fakt: Der Webservice schreibt Log-CSV nach `%CommonApplicationData%\c-entron software gmbh\c-entron Web-Service\Logs` (`nlog.config`, `archiveEvery="Day" maxArchiveFiles="15"`, `<logger name="Centron*" minLevel="WARN" writeTo="csvTarget" />`); Telemetrie wird aggregiert, in DB-Tabellen gemergt (`MERGE dbo.McpToolUsageTelemetry WITH (HOLDLOCK)`) und als ZIP („telemetry.json") an c-entron Office hochgeladen; Nexus bietet `/logviewer/{applicationLog?}`
Aussage: Das System soll im Betrieb strukturiert mitloggen, Diagnosedaten im Produktivsystem einsehbar machen und aggregierte Nutzungsdaten an den Hersteller übermitteln.
Ergebnis: Support kann Fehlerraten, Funktionsnutzung und Versionsstand je Installation auswerten; Logdateien sind begrenzt aufbewahrt.
Belege:
- [PRIMÄR] src/webservice/Centron.Host.WindowsService/nlog.config - Begründung: konfigurierte Ziel-/Rotationsregel.
- [PRIMÄR] src/backend/Centron.BL/Telemetry/TelemetryBL.cs - Begründung: Persistierung und Upload der Telemetrie.
- [SEKUNDÄR] src/nexus/CentronNexus/Shared/Diagnostics/LogViewerPage.razor - Begründung: UI für Log-Diagnose.
Prüfidee: Fehler produzieren → CSV-Eintrag mit Level WARN; Telemetrieupload schlägt fehl → Fehlermeldung „Telemetry upload to c-entron Office failed." ohne Funktionsausfall.
Tracelinks: SyRS-32, SyRS-33
Konsolidierung: Kandidat: SyRS-32 (Logging in CSV, InMemory-Target und Datenbanktelemetrie parallel)
Übernahmewürdigkeit: übernehmen - Voraussetzung für gewartete Kundeninstallation; Datenschutzprüfung erforderlich.
Status: belegt
```
```
ID: StRS-30
Titel: Deutschsprachige Bedienung mit zweiter Sprache
Ebene: StRS
Typ: nicht-funktional
Qualitätsmerkmal: Gebrauchstauglichkeit
Akteur: Mitarbeiter (DACH), zweisprachige Kunden
Vorbedingung: Client/Webservice installiert
Fakt: Vorgabe „All UI labels must be written in German" mit zweisprachiger Ressourcpflege (`LocalizedStrings.resx` Basis/Deutsch, `LocalizedStrings.en.resx` Englisch); Adress-/Artikeltexte sind landesabhängig modelliert (`ForeignArticleText` → `Table("ArtikelText")`, `AccountAddress.LanguageI3D`)
Aussage: Das System soll vollständig deutschsprachig bedienbar sein, Übersetzungen für Englisch bereitstellen und Geschäftspartner-/Artikeltexte je Land pflegbar halten.
Ergebnis: Oberflächen, Fehlermeldungen und Berichte erscheinen in der eingestellten Sprache; fremdsprachige Texte werden im Belegdruck verwendet.
Belege:
- [SEKUNDÄR] docs/getting-started/general-structure.md („All UI labels must be written in German") - Begründung: verbindliche Sprachregel.
- [PRIMÄR] src/backend/Centron.DAO/Mappings/Warehousing/ForeignArticleTextMaps.cs (`Table("ArtikelText")`) - Begründung: mehrsprachige Datenhaltung.
- [SEKUNDÄR] src/backend/Centron.BL/Warehousing/ArticleBL.cs `GetForeignArticleTextForArticleByCountry` - Begründung: sprachabhängiger Textabruf.
Prüfidee: Umschaltung auf Englisch zeigt englische Labels; Artikel ohne englischen Text fällt auf Deutsch zurück.
Tracelinks: SyRS-34
Konsolidierung: nein
Übernahmewürdigkeit: übernehmen - Marktanforderung; Übersetzungsworkflow im Ziel zentralisieren.
Status: belegt
```
```
ID: StRS-31
Titel: Telefonie-, Fernwartungs- und Mobilunterstützung im Arbeitsalltag
Ebene: StRS
Typ: funktional
Qualitätsmerkmal:
Akteur: Service-Mitarbeiter, Außendienst, Support
Vorbedingung: TAPI-/Fernwartungs-Anbindung konfiguriert
Fakt: Anrufe werden als `PhoneCall` erfasst (`PhoneCallBL.CreatePhoneCall` mit `WasOutgoing/WasConnected`, Graph-Call-Records als Quelle) und über `TapiClientHub` mit `Task IncomingCall(...)` an Clients gemeldet; Fernwartung über Supremo (`SupremoSettingsController`, Token via `CryptoControl.EncryptToString`) und TeamViewer (`TestTeamViewerCommand`); MyDay-Arbeitsarten enthalten `Telephone, Travel, Break, Supremo, TeamViewer`; externe Zeiterfassung wird über `ImportMyDayWorkItems` importiert (Dedupe über `UniqueId`)
Aussage: Das System soll Anläufe aus der Telefonanlage, Fernwartungssitzungen und Fremd-Zeiterfassungen im persönlichen Tagescockpit und in der Zeiterfassung nutzbar machen.
Ergebnis: Anruf ist als Aktivität/Ticketbezug dokumentiert, Fremdzeiten sind duplikatfrei übernommen.
Belege:
- [PRIMÄR] src/backend/Centron.BL/Tapi/PhoneCallBL.cs - Begründung: implementierte Anruferfassung.
- [PRIMÄR] src/webservice/Centron.Host/RealTimeServices/TapiClientHub.cs - Begründung: Echtzeit-Verteilung der Anrufereignisse.
- [PRIMÄR] src/backend/Centron.BL/MyDay/MyDayBL.cs (`ImportMyDayItems`) - Begründung: Import-/Dedupe-Logik.
- [SEKUNDÄR] src/centron/Centron.WPF.UI/Modules/MyCentron/Supremo/SupremoSettingsController.cs - Begründung: Fernwartungsanbindung im UI.
Prüfidee: Eingehender Call → Client-Popup + PhoneCall-Datensatz; identischer Import zweimal → keine Duplikate.
Tracelinks: SyRS-35, StRS-9
Konsolidierung: Kandidat: StRS-9/SyRS-10 (Zeiterfassung aus vier Quellen: Ticket, MyDay, TAPI, Fremdimport)
Übernahmewürdigkeit: Sonderfall - stark an Hersteller-Infrastruktur (TAPI-Interop-DLL, eigene Connector) gekoppelt; im Ziel auf Standard-Schnittstellen prüfen.
Status: belegt
```
@@ -0,0 +1,149 @@
# Traceability-Matrix
Rückverfolgbarkeit aller 163 Anforderungen (31 StRS, 48 SyRS, 84 SwRS).
- Zeilentyp A: jede SyRS mit ihrer übergeordneten StRS (SwRS-Spalte `–`).
- Zeilentyp B: jede SwRS mit ihrer übergeordneten SyRS; die StRS-Spalte ist über die SyRS-Tracelinks hergeleitet.
- `Artefaktbeleg` ist der PRIMÄR-Beleg der jeweils Kind-Anforderung (SyRS bzw. SwRS); bei Zeilentyp A der PRIMÄR-Beleg der SyRS.
| StRS-ID | SyRS-ID | SwRS-ID | Artefaktbeleg |
| --- | --- | --- | --- |
| StRS-1 | SyRS-1 | – | src/backend/Centron.BL/IndexSearch/IndexSearchBL.cs |
| StRS-1 | SyRS-2 | – | src/centron/Centron.WPF.UI/Services/Logics/Accounts/ExtendedSearch/BLExtendedSearchLogic.cs |
| StRS-2 | SyRS-3 | – | src/backend/Centron.BL/Sales/Receipts/ReceiptBL.cs |
| StRS-24 | SyRS-4 | – | src/backend/Centron.BL/Administration/Company/NumberGroupBL.cs |
| StRS-3 | SyRS-5 | – | src/webservice/Centron.WebServices.Core/Helper/ReceiptPriceHelper.cs |
| StRS-4 | SyRS-6 | – | src/backend/Centron.BL/Sales/Receipts/ReceiptBL.cs |
| StRS-5 | SyRS-7 | – | src/backend/Centron.BL/Sales/Receipts/Invoices/Dunning/DunningRunBL.cs |
| StRS-6 | SyRS-8 | – | src/backend/Centron.BL/WebServices/Sales/CustomerAssets/AutomaticFactura/AutomaticFacturaWebServiceBL.cs |
| StRS-8 | SyRS-9 | – | src/backend/Centron.DAO/Mappings/TemporaryEntities/GeraeteKopfMaps.cs |
| StRS-9 | SyRS-10 | – | src/backend/Centron.DAO/Mappings/Sales/Support/HelpdeskTimerArea/HelpdeskTimerMaps.cs |
| StRS-10 | SyRS-11 | – | src/backend/Centron.BL/Sales/Support/HelpdeskBL.cs |
| StRS-11 | SyRS-12 | – | src/nexus/CentronNexus/Shared/Authorization/PortAuthorization.cs |
| StRS-12 | SyRS-13 | – | src/backend/Centron.BL/Sales/Receipts/ReceiptCartReleaseSystemBL.cs |
| StRS-13 | SyRS-14 | – | src/backend/Centron.BL/WebServices/Sales/Receipts/ReceiptWebServiceBL.cs |
| StRS-14 | SyRS-15 | – | src/backend/Centron.BL/EDI/SupplierEDI/SupplierEdiBL.cs |
| StRS-15 | SyRS-16 | – | src/backend/Centron.BL/DataExchange/EDI/SaleInvoices/InvoiceZugferdBL.cs |
| StRS-16 | SyRS-17 | – | src/backend/Centron.Entities/Entities/Warehousing/StockManagement/Article.cs |
| StRS-17 | SyRS-18 | – | src/backend/Centron.BL/Warehousing/ArticleManagement/ArticleImportBL.cs |
| StRS-18 | SyRS-19 | – | src/backend/Centron.BL/WebServices/Sales/Receipts/ReceiptWebServiceBL.cs |
| StRS-19 | SyRS-20 | – | src/backend/Centron.BL/CustomerArea/RmaBL.cs |
| StRS-20 | SyRS-21 | – | src/backend/Centron.BL/Production/ProductionBL.cs |
| StRS-21 | SyRS-22 | – | src/backend/Centron.BL/DataExchange/BookKeeping/BookKeepingExportBL.cs |
| StRS-22 | SyRS-23 | – | src/backend/Centron.BL/Sales/Receipts/ReceiptBL.cs |
| StRS-23 | SyRS-24 | – | src/backend/Centron.BL/Administration/Rights/AppRightsBL.cs |
| StRS-23 | SyRS-25 | – | src/backend/Centron.BL/Statistics/SaleStatistics/SaleStatisticBL.cs |
| StRS-26 | SyRS-26 | – | src/backend/Centron.DAO/Repositories/Sales/Customers/Assets/AssetHeadDAO.cs |
| StRS-25 | SyRS-27 | – | src/backend/Centron.BL/Administration/Logins/Auth/Authenticator.cs |
| StRS-26 | SyRS-28 | – | src/backend/Centron.DAO/ChangeTracking/ChangeTrackingEventListener.cs |
| StRS-27 | SyRS-29 | – | src/webservice/Centron.Host/CentronHost.cs |
| StRS-28 | SyRS-30 | – | src/backend/Centron.BL/Administration/Scripts/ScriptEngineBL.cs |
| StRS-28 | SyRS-31 | – | src/backend/Centron.Entities/Entities/Administration/Customization/ModuleCustomProperty.cs |
| StRS-29 | SyRS-32 | – | src/webservice/Centron.Host.WindowsService/nlog.config |
| StRS-28 | SyRS-33 | – | src/webservice/Centron.Host/CentronHost.cs |
| StRS-30 | SyRS-34 | – | src/centron/Centron.WPF.UI/Resources/LocalizedStrings.resx |
| StRS-10 | SyRS-35 | – | src/webservice/Centron.Host/RealTimeServices/NotificationsHub.cs |
| StRS-25 | SyRS-36 | – | src/webservice/Centron.Host/CentronHost.cs |
| StRS-29 | SyRS-37 | – | src/backend/Centron.BL/Administration/WebServiceConfiguration/WebServiceConfigSerializer.cs |
| StRS-24 | SyRS-38 | – | src/backend/Centron.BL/Administration/WebServiceConfiguration/AdditionalService.cs |
| StRS-29 | SyRS-39 | – | src/webservice/Centron.Host.WindowsService/CentronService.cs |
| StRS-23 | SyRS-40 | – | src/centron/Centron.WPF.UI/Services/Container/Installers/Interceptors/CatchExceptionMakeErrorResultInterceptor.cs |
| StRS-25 | SyRS-41 | – | src/backend/Centron.Common/ModuleFeatures.cs |
| StRS-1 | SyRS-42 | – | src/backend/Centron.DAO/Mappings/TemporaryEntities/GeraeteKopfMaps.cs |
| StRS-29 | SyRS-43 | – | src/backend/Centron.Common/DeveloperSecurity.cs |
| StRS-23 | SyRS-44 | – | src/backend/Centron.BL/Administration/Logins/UsersBL.cs |
| StRS-23 | SyRS-45 | – | src/backend/Centron.BL/Administration/Logins/TwoFactor/TwoFactorAuthBL.cs |
| StRS-27 | SyRS-46 | – | src/backend/Centron.BL/Sales/Receipts/ReceiptCartBL.cs |
| StRS-29 | SyRS-47 | – | azure/build-pipeline.yml |
| StRS-29 | SyRS-48 | – | Directory.Build.props |
| StRS-1 | SyRS-1 | SwRS-1 | src/backend/Centron.BL/IndexSearch/IndexSearchBL.cs |
| StRS-1 | SyRS-2 | SwRS-2 | src/centron/Centron.WPF.UI/Services/Container/ClassContainer.cs |
| StRS-24 | SyRS-4 | SwRS-3 | src/backend/Centron.BL/Administration/Company/NumberGroupBL.cs |
| StRS-24 | SyRS-4 | SwRS-4 | src/backend/Centron.BL/Sales/Receipts/ReceiptBL.cs |
| StRS-2 | SyRS-3 | SwRS-5 | src/backend/Centron.Interfaces/Sales/Receipts/ReceiptState.cs |
| StRS-21 | SyRS-22 | SwRS-6 | src/backend/Centron.BL/Sales/Receipts/Invoices/ReceiptInvoiceBL.cs |
| StRS-3 | SyRS-5 | SwRS-7 | src/backend/Centron.BL/Sales/Receipts/ReceiptBL.cs |
| StRS-3 | SyRS-5 | SwRS-8 | src/webservice/Centron.WebServices.Core/Helper/ReceiptPriceHelper.cs |
| StRS-3 | SyRS-5 | SwRS-9 | src/backend/Centron.BL/Sales/Receipts/ReceiptBL.cs |
| StRS-1 | SyRS-42 | SwRS-10 | src/backend/Centron.DAO/Mappings/Accounts/AccountMaps.cs |
| StRS-30 | SyRS-34 | SwRS-11 | src/backend/Centron.BL/Accounts/AccountAddressBL.cs |
| StRS-24 | SyRS-4 | SwRS-12 | src/backend/Centron.BL/Accounts/AccountBL.cs |
| StRS-1 | SyRS-2 | SwRS-13 | src/backend/Centron.BL/Accounts/AccountBL.cs |
| StRS-16 | SyRS-17 | SwRS-14 | src/backend/Centron.Entities/Entities/Warehousing/StockManagement/Article.cs |
| StRS-16 | SyRS-17 | SwRS-15 | src/backend/Centron.Entities/Entities/Warehousing/StockManagement/Article.cs |
| StRS-16 | SyRS-17 | SwRS-16 | src/backend/Centron.Entities/Entities/Warehousing/SerialNumber.cs |
| StRS-8 | SyRS-9 | SwRS-17 | src/backend/Centron.Entities/Entities/Warehousing/StockManagement/Article.cs |
| StRS-16 | SyRS-17 | SwRS-18 | src/backend/Centron.Entities/Entities/Warehousing/StockManagement/Article.cs |
| StRS-16 | SyRS-17 | SwRS-19 | src/backend/Centron.Entities/Entities/Warehousing/SecondaryStock.cs |
| StRS-10 | SyRS-35 | SwRS-20 | src/backend/Centron.BL/NexusNotifications/NexusNotificationsBL.cs |
| StRS-10 | SyRS-11 | SwRS-21 | src/backend/Centron.BL/MailScanner/MailScannerBL.cs |
| StRS-10 | SyRS-11 | SwRS-22 | docs/features/automatic-helpdesk-creation-templates.md |
| StRS-10 | SyRS-11 | SwRS-23 | src/backend/Centron.Entities/Entities/Sales/Support/Escalation/Escalations.cs |
| StRS-10 | SyRS-11 | SwRS-24 | src/backend/Centron.Entities/Entities/ChecklistArea/CentronChecklistBase.cs |
| StRS-10 | SyRS-35 | SwRS-25 | src/backend/Centron.BL/Sales/Calendar/ScheduleBL.cs |
| StRS-10 | SyRS-11 | SwRS-26 | src/backend/Centron.Entities/Entities/ToDoArea/ToDo.cs |
| StRS-10 | SyRS-11 | SwRS-27 | src/backend/Centron.BL/TicketProjects/TicketProjectBL.cs |
| StRS-10 | SyRS-35 | SwRS-28 | src/backend/Centron.BL/Chats/ChatBL.cs |
| StRS-6 | SyRS-8 | SwRS-29 | src/backend/Centron.Entities/Entities/Sales/CustomerAssets/Contracts/ContractKindBase.cs |
| StRS-26 | SyRS-26 | SwRS-30 | src/backend/Centron.DAO/Repositories/Sales/Customers/Assets/AssetHeadDAO.cs |
| StRS-1 | SyRS-42 | SwRS-31 | src/backend/Centron.DAO/Repositories/Sales/Receipts/SaveReceiptRepository.cs |
| StRS-6 | SyRS-8 | SwRS-32 | src/backend/Centron.BL/Sales/Receipts/ContractLists/ContractSpecificLogic.cs |
| StRS-8 | SyRS-9 | SwRS-33 | src/backend/Centron.BL/Sales/CustomerAssets/Contracts/ClickContracts/MasterDataListBL.cs |
| StRS-8 | SyRS-9 | SwRS-34 | src/backend/Centron.BL/Devices/AccountDeviceBL.cs |
| StRS-8 | SyRS-9 | SwRS-35 | src/backend/Centron.Entities/Entities/DocuBoard/AssetManagementArticleAssignment.cs |
| StRS-23 | SyRS-25 | SwRS-36 | src/backend/Centron.BL/Statistics/SaleStatistics/SaleStatisticBL.cs |
| StRS-27 | SyRS-29 | SwRS-37 | src/backend/Centron.BL/Centron.BL.csproj |
| StRS-28 | SyRS-31 | SwRS-38 | src/backend/Centron.BL/Administration/Settings/AppSettingsBL.cs |
| StRS-5 | SyRS-7 | SwRS-39 | src/backend/Centron.DAO/Mappings/Sales/Receipts/Invoices/Dunning/InvoiceDunningMaps.cs |
| StRS-5 | SyRS-7 | SwRS-40 | src/backend/Centron.BL/Administration/Settings/AppSettingsConst.cs |
| StRS-22 | SyRS-23 | SwRS-41 | src/backend/Centron.DAO/Mappings/Finances/Payments/IncomingPayments/IncomingPaymentMaps.cs |
| StRS-21 | SyRS-22 | SwRS-42 | src/backend/Centron.Gateway/DataExchange/BookKeeping/DatevAscii/BookKeepingExportDatevAscii.cs |
| StRS-15 | SyRS-16 | SwRS-43 | src/backend/Centron.BL/DataExchange/EDI/SaleInvoices/InvoiceZugferdBL.cs |
| StRS-15 | SyRS-16 | SwRS-44 | src/apis/Centron.Api.EbInterface/EbInterfaceLogic.cs |
| StRS-29 | SyRS-37 | SwRS-45 | src/backend/Centron.Common/TextCoding/AESCryptoLogic.cs |
| StRS-23 | SyRS-44 | SwRS-46 | src/backend/Centron.BL/PasswordManagementArea/PasswordManagementKeywordBL.cs |
| StRS-23 | SyRS-45 | SwRS-47 | src/backend/Centron.BL/TwoFactorAuthenticator/TwoFactorAuthenticationBL.cs |
| StRS-25 | SyRS-27 | SwRS-48 | src/backend/Centron.BL/Administration/Logins/Auth/BasicAuthenticator.cs |
| StRS-23 | SyRS-24 | SwRS-49 | src/backend/Centron.BL/Administration/Rights/AppRightsBL.cs |
| StRS-23 | SyRS-24 | SwRS-50 | src/backend/Centron.BL/Administration/Rights/UserRightsExt.cs |
| StRS-25 | SyRS-27 | SwRS-51 | src/webservice/Centron.Host/CentronHost.cs |
| StRS-28 | SyRS-30 | SwRS-52 | src/backend/Centron.BL/Administration/Scripts/ScriptMethods/Scripts/ |
| StRS-28 | SyRS-30 | SwRS-53 | src/webservice/Centron.Host/AspNetCore/HostedServices/DataQualityService.cs |
| StRS-25 | SyRS-41 | SwRS-54 | src/centron/Centron.WPF.UI/Modules/ModuleRegistration.cs |
| StRS-23 | SyRS-40 | SwRS-55 | src/centron/Centron.WPF.UI/App.xaml.cs |
| StRS-29 | SyRS-48 | SwRS-56 | src/centron/Centron.WPF.UI/App.xaml.cs |
| StRS-11 | SyRS-12 | SwRS-57 | src/backend/Centron.BL/Administration/Logins/WebAccountBL.cs |
| StRS-11 | SyRS-12 | SwRS-58 | src/backend/Centron.BL/Sales/Support/HelpdeskBL.cs |
| StRS-12 | SyRS-13 | SwRS-59 | src/backend/Centron.BL/Sales/Receipts/ReceiptCartBL.cs |
| StRS-12 | SyRS-13 | SwRS-60 | src/backend/Centron.BL/Sales/Receipts/ReceiptCartReleaseSystemBL.cs |
| StRS-13 | SyRS-14 | SwRS-61 | src/backend/Centron.BL/Administration/FileManagement/DocumentBL.cs |
| StRS-1 | SyRS-2 | SwRS-62 | src/backend/Centron.BL/Sales/Receipts/SupplierReceiptDocuments/ScanSupplierReceiptDocument/PdfScanning/ |
| StRS-23 | SyRS-25 | SwRS-63 | src/shared/Centron.Controls/ExcelExport/BaseExcelExportManager.cs |
| StRS-2 | SyRS-3 | SwRS-64 | src/centron/Centron.WPF.UI/Services/Logics/MassUpdate/BLMassUpdateLogic.cs |
| StRS-25 | SyRS-41 | SwRS-65 | src/webservice/Centron.WebServices.Core/Entities/Administration/ArtificialIntelligence/ArtificialIntelligenceApiType.cs |
| StRS-25 | SyRS-36 | SwRS-66 | src/backend/Centron.BL/WebServices/Sales/CustomerAssets/CustomerAssetCompactWebserviceBL.cs |
| StRS-24 | SyRS-38 | SwRS-67 | src/nexus/CentronNexus.Host/Program.cs |
| StRS-11 | SyRS-12 | SwRS-68 | src/nexus/CentronNexus.OutlookAddIn/Manifest/Manifest.xml |
| StRS-17 | SyRS-18 | SwRS-69 | src/apis/Centron.Api.Gls/CentronGlsConsts.cs |
| StRS-29 | SyRS-39 | SwRS-70 | deployment/centron/CentronSetupProject/Product.wxs |
| StRS-29 | SyRS-47 | SwRS-71 | tests/backend/Centron.Tests.BL/DataExchange/EDI/SaleInvoices/InvoiceZugferdBalanceMergeTests.cs |
| StRS-24 | SyRS-4 | SwRS-72 | SSMS_DB_SCHEMA.sql |
| StRS-29 | SyRS-32 | SwRS-73 | src/webservice/Centron.Host/CentronHost.cs |
| StRS-10 | SyRS-35 | SwRS-74 | src/centron/Centron.WPF.UI/Modules/MyCentron/Supremo/SupremoSettingsViewModel.cs |
| StRS-24 | SyRS-38 | SwRS-75 | src/backend/Centron.BL/Integrations/EsCustomerGroupBL.cs |
| StRS-10 | SyRS-11 | SwRS-76 | src/backend/Centron.BL/Processes/ProcessBL.cs |
| StRS-22 | SyRS-23 | SwRS-77 | src/backend/Centron.BL/VoucherManagement/VoucherManagementBL.cs |
| StRS-17 | SyRS-18 | SwRS-78 | src/backend/Centron.BL/TradePool/TradePoolBL.cs |
| StRS-30 | SyRS-34 | SwRS-79 | src/backend/Centron.BL/TextModuleArea/TextModuleBL.cs |
| StRS-10 | SyRS-11 | SwRS-80 | src/backend/Centron.BL/Tags/TagsBL.cs |
| StRS-3 | SyRS-5 | SwRS-81 | src/backend/Centron.BL/CountryArea/CountryBL.cs |
| StRS-10 | SyRS-11 | SwRS-82 | src/backend/Centron.BL/Modules/ModuleCategoryBL.cs |
| StRS-16 | SyRS-17 | SwRS-83 | src/backend/Centron.BL/Storage/StorageBL.cs |
| StRS-29 | SyRS-48 | SwRS-84 | src/backend/Centron.BL/WebVersion/VersionBL.cs |
## Vollständigkeit
- 48/48 SyRS mit StRS-Anker (Spalte SwRS = `–`).
- 84/84 SwRS mit SyRS-Anker und abgeleitetem StRS-Anker.
- 31/31 StRS sind Ziel mindestens eines SyRS-Rückverweises.
- Keine toten Tracelinks (alle referenzierten IDs existieren).
@@ -0,0 +1,127 @@
# Messprotokoll – Iteration 16/qwen/qwen3.8-flash-next/builtin/max
> **GERUEST** – maschinell aus den Rohdaten erzeugt. Die Abschnitte *Anmerkungen*
> und *Gueltigkeit* sind von Hand zu pruefen und zu ergaenzen.
## Lauf
- **Prompt-Datei:** `03_Prompt.md`
- **SHA-256 (Prompt):** `B8C8764F0912FA070B57A0EAE8FAFC8F869D4BC0195FA999B27013BCBC030F07`
- **Startzeit:** 2026-09-03T15:14:28.3153953+02:00
- **Endzeit:** 2026-09-03T16:35:24.8130428+02:00
- **Dauer gesamt:** 01:20:53 (API: nicht erfasst – OpenCode liefert keine separate API-Zeit)
- **Root-Verzeichnis:** `C:/DEV/MasterArbeit/QuellCode/CentronERP`
- **Codebasis-Commit:** `e2c3a0e8f81d005161dde733f7e4b08f581e3468` (vor dem Lauf dirty: nein)
- **Snapshot-Zustand:** bereinigt von KI-Konfigurationen: ja; Remote entkoppelt: ja
## Werkzeugkonfiguration
- **Skill-Version:** 13.0.0
- **Werkzeugadapter:** OpenCode, `opencode-adapter.py --provider tensorx` (Adapter-Version 2.5.2)
- **CLI-Version:** OpenCode 1.18.25
- **Modell (angefordert):** `qwen/qwen3.8-flash-next`
- **Modell (tatsaechlich):** `qwen/qwen3.8-flash-next`
- **Kontrolle Modell:** bestanden
- **Effort:** `max` angefordert, **wirksam** (`effort_applied: true`)
- **Ablage:** `Iteration 16/qwen/qwen3.8-flash-next/builtin/max/`
- **Agentenmodus:** `builtin`
- **Kontextfenster:** 0 Tokens geladen (Modellmaximum 0)
- **Sampling-Parameter:** nicht steuerbar
- **Lokaler Modellbetrieb:** Runtime `?`, `lms` ?, Architektur `?`, **Quantisierung `?`**, ? Slots, GPU-Offload `?`, alleiniges Modell: ?
- **Abbruchsicherungen:** `--stall-timeout 0`, `--max-runtime` siehe Matrixskript
- **Subagenten:** `spawned` = 7, `completed` = 7, `failed` = 0
- **Rollen:** {"explore": 7}
## Validierungsstichprobe
- **Stand:** entfaellt
## Verbrauch
| Messgroesse | Wert |
|---|---|
| Input-Tokens | 434.508 |
| Output-Tokens | 164.404 |
| Reasoning-Tokens | 43.824 |
| Cache-Write-/Cache-Read-Tokens | nicht erfasst – der lokale Server liefert keine |
| Agent-Turns | 118 |
**Tokens gesamt: 14.449.968.** Kosten `0` – lokaler Betrieb ().
## Gefundene Anforderungen
## Gefundene Anforderungen
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
### Verteilung über die Ebenen
| Ebene | Anzahl | Anteil |
|---|---:|---:|
| StRS | 31 | 19,0 % |
| SyRS | 48 | 29,4 % |
| SwRS | 84 | 51,5 % |
| **Gesamt** | **163** | 100 % |
### Anforderungstypen
| Typ | Anzahl | Anteil |
|---|---:|---:|
| funktional | 44 | 27,0 % |
| Daten | 41 | 25,2 % |
| nicht-funktional | 35 | 21,5 % |
| Sicherheit | 22 | 13,5 % |
| Schnittstelle | 21 | 12,9 % |
### Belegqualität
| Messgröße | Wert |
|---|---:|
| Belege gesamt | 443 |
| davon `PRIMÄR` | 324 (73,1 %) |
| davon `SEKUNDÄR` | 95 (21,4 %) |
| davon `KONTEXT` | 24 (5,4 %) |
| Belege je Anforderung (Median) | 3 |
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 162 (99,4 %) |
### Übernahmewürdigkeit
| Einstufung | Anzahl | Anteil |
|---|---:|---:|
| übernehmen | 129 | 79,1 % |
| workaround | 19 | 11,7 % |
| sonderfall | 7 | 4,3 % |
| veraltet | 8 | 4,9 % |
### Status
| Kategorie | Anzahl | Anteil |
|---|---:|---:|
| belegt | 148 | 90,8 % |
| als `HYPOTHESE` gekennzeichnet | 15 | 9,2 % |
| als Workaround vermerkt | 0 | 0,0 % |
| Konsolidierungskandidaten | 133 | 81,6 % |
| mit ISO-25010-Qualitätsmerkmal | 52 | 31,9 % |
### Regelkonformität (Prüfung gegen die Vorgaben des Prompts)
| Vorgabe | Ergebnis |
|---|---|
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (43 risikorelevante Anforderungen, alle gedeckt) |
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | **erfüllt** (alle 163 Anforderungen eingestuft) |
| **Traceability** – Verknüpfung zwischen den Ebenen | 163 von 163 mit Tracelinks (100,0 %) |
## Ergebnis
- **Status:** `is_error: false`, `subtype: success`, `exit_code: 0`, `timed_out: false`
- **Session-ID:** `ses_f9897e0b9ffeUwpfU46o6PGXwo`
- **Werkzeugaufrufe:** 116 – {"bash": 42, "read": 12, "task": 7, "write": 10, "edit": 45}
- **Kontrolle Agentenmodus:** `subagent_stats.spawned` = 7
- **Gueltigkeit:** *(pruefen)* Ergebnisdateien vorhanden.
- **Erzeugte Dateien:** Analysebericht.md, Glossar.md, Hypothesen.md, StRS.md, SwRS.md, SyRS.md, Traceability.md
- **Root unveraendert:** ja
- **Fehlermeldungen:** []
## Anmerkungen/Auffaelligkeiten
*(von Hand zu ergaenzen)*
@@ -0,0 +1,5 @@
[2026-09-03T13:14:29.923672+00:00] Spiegel angelegt: C:\DEV\MasterArbeit\Versuche\Versuch_01\Iteration 16\qwen\qwen3.8-flash-next\builtin\max\03_Lauf_2026-09-03_151428_v13.0.0-0354\_meta\spiegel (13 Junctions, 17 Dateien, Ergebnisse -> C:\DEV\MasterArbeit\Versuche\Versuch_01\Iteration 16\qwen\qwen3.8-flash-next\builtin\max\03_Lauf_2026-09-03_151428_v13.0.0-0354\Ergebnisse)
[2026-09-03T13:14:30.047622+00:00] Start OpenCode C:\Users\ChristophSchwoerer\AppData\Roaming\npm\node_modules\opencode-ai\bin\opencode.exe; Provider=tensorx; Modell=tensorx/qwen/qwen3.8-flash-next; Modus=builtin; Effort=max (uebergeben=True); Stall-Timeout=0s
[2026-09-03T14:35:23.066636+00:00] 0 Ergebnisdatei(en) aus dem Spiegel uebernommen
[2026-09-03T14:35:24.712030+00:00] OpenCode export: Exporting session: ses_f9897e0b9ffeUwpfU46o6PGXwo
[2026-09-03T14:35:24.785556+00:00] Ende: Exitcode=0; Status=success; Turns=118; Tokens=14449968; Dateien=7; RawResult=C:\DEV\MasterArbeit\Versuche\Versuch_01\Iteration 16\qwen\qwen3.8-flash-next\builtin\max\03_Lauf_2026-09-03_151428_v13.0.0-0354\RawResult.json
@@ -0,0 +1,65 @@
## Gefundene Anforderungen
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
### Verteilung über die Ebenen
| Ebene | Anzahl | Anteil |
|---|---:|---:|
| StRS | 31 | 19,0 % |
| SyRS | 48 | 29,4 % |
| SwRS | 84 | 51,5 % |
| **Gesamt** | **163** | 100 % |
### Anforderungstypen
| Typ | Anzahl | Anteil |
|---|---:|---:|
| funktional | 44 | 27,0 % |
| Daten | 41 | 25,2 % |
| nicht-funktional | 35 | 21,5 % |
| Sicherheit | 22 | 13,5 % |
| Schnittstelle | 21 | 12,9 % |
### Belegqualität
| Messgröße | Wert |
|---|---:|
| Belege gesamt | 443 |
| davon `PRIMÄR` | 324 (73,1 %) |
| davon `SEKUNDÄR` | 95 (21,4 %) |
| davon `KONTEXT` | 24 (5,4 %) |
| Belege je Anforderung (Median) | 3 |
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 162 (99,4 %) |
### Übernahmewürdigkeit
| Einstufung | Anzahl | Anteil |
|---|---:|---:|
| übernehmen | 129 | 79,1 % |
| workaround | 19 | 11,7 % |
| sonderfall | 7 | 4,3 % |
| veraltet | 8 | 4,9 % |
### Status
| Kategorie | Anzahl | Anteil |
|---|---:|---:|
| belegt | 148 | 90,8 % |
| als `HYPOTHESE` gekennzeichnet | 15 | 9,2 % |
| als Workaround vermerkt | 0 | 0,0 % |
| Konsolidierungskandidaten | 133 | 81,6 % |
| mit ISO-25010-Qualitätsmerkmal | 52 | 31,9 % |
### Regelkonformität (Prüfung gegen die Vorgaben des Prompts)
| Vorgabe | Ergebnis |
|---|---|
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (43 risikorelevante Anforderungen, alle gedeckt) |
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | **erfüllt** (alle 163 Anforderungen eingestuft) |
| **Traceability** – Verknüpfung zwischen den Ebenen | 163 von 163 mit Tracelinks (100,0 %) |
@@ -0,0 +1,175 @@
# Versuch 01 - Baseline (Prompt-only) - Iteration 03
## Metadaten
- **Versuch:** V1 Baseline (Prompt-only)
- **Iteration:** 03 (zweite Überarbeitung nach Auswertung der Iteration-6-Läufe)
- **Codebasis:** c-entron ERP-Suite (Windows, C#/XAML, MSSQL)
- **Zeitstempel:** 2026-08-28
- **Vorgänger:** `02_Prompt.md` (SHA-256 `F9B2A1AA…0D7849`), 4 Läufe in Iteration 6
- **Änderungsgrund:** Auswertung der 4 Iteration-6-Läufe (GLM-solo, GLM-builtin, Kimi-solo, Kimi-builtin). Jede Änderung ist an einen gemessenen Befund gekoppelt:
| Änderung | Auslösender Befund |
|---|---|
---
## Prompt
Du bist ein Requirements Engineer im Reverse Requirements Engineering eines Legacy-ERP-Systems. Erzeuge aus der vorliegenden Codebasis eine Anforderungsspezifikation nach **ISO/IEC/IEEE 29148:2018**. Arbeite ausschließlich auf den im Arbeitsverzeichnis liegenden Artefakten (Quellcode, Konfiguration, UI-Ressourcen, ggf. DB-Skripte). Nutze nur Informationen, die du aus diesen Artefakten gewinnen kannst.
### Auftrag
Erzeuge eine konsolidierte Spezifikation auf den drei Ebenen:
1. **StRS** - Stakeholder Requirements Specification (fachliche Sicht, Akteure, Geschäftsziele)
2. **SyRS** - System Requirements Specification (Systemverhalten, Schnittstellen, Performance-, Sicherheitsanforderungen)
3. **SwRS** - Software Requirements Specification (Komponenten, Datenmodelle, Software-interne Regeln)
Ziel ist eine Spezifikation, die als belastbare Basis für eine Web-/SaaS-Neuimplementierung dienen kann.
### Scope (Schritt 1 der RRE-Methodenkette, manuell vorgegeben)
Der Untersuchungsgegenstand ist die **gesamte Codebasis** im Arbeitsverzeichnis. Es gilt bewusst keine Modulbeschränkung: Alle Module, Datenobjekte und Prozesse sind gleichrangig zu erfassen.
**Breite geht vor Tiefe.** Ein fehlendes Requirement führt bei einer Neuimplementierung zu Funktionsverlust; eine oberflächlich erfasste Funktion lässt sich dagegen nachschärfen. Erfasse deshalb zuerst die gesamte Breite und vertiefe erst danach. Halte dich an die Reihenfolge aus dem Abschnitt **Vorgehen**: erst Inventar, dann Mindestabdeckung, dann Vertiefung.
### Vorgehen (statische Analyse, keine Ausführung)
Bearbeite die Schritte 2-6 der RRE-Methodenkette (Schritt 1 Scope ist oben vorgegeben, Schritt 7 Validierung erfolgt manuell durch Fachexperten). Vorgeschaltet ist eine verbindliche Inventarisierung:
**Schritt 0 - Modulinventar (vor der ersten Anforderung).** Verschaffe dir zuerst einen vollständigen Überblick über den Untersuchungsgegenstand und lege ihn im `Analysebericht.md` als Tabelle ab: fachliches Modul beziehungsweise Komponente, Pfad im Arbeitsverzeichnis, ein Satz zur fachlichen Aufgabe. Das Inventar wird erstellt, **bevor** die erste Anforderung formuliert wird. Es ist die Bezugsgröße für die Abdeckung und darf später ergänzt, aber nicht gekürzt werden.
**Schritt 0b - Mindestabdeckung.** Jedes Modul des Inventars erhält **mindestens eine** Anforderung, bevor irgendein Modul vertieft wird. Lässt sich für ein Modul keine belegbare Anforderung bilden, führe es im Inventar als `nicht analysiert` mit einer kurzen Begründung. Ein Modul ohne Anforderung und ohne Begründung ist unzulässig. **Mehr als 10 % der Module als `nicht analysiert` zu führen, ist ein Hinweis auf unvollständige Erkundung** – gehe zurück und lies die zugehörigen Quelldateien, bevor du mit der Vertiefung fortfährst.
**Schritt 0c - Vertiefung nach Risiko.** Erst wenn die Mindestabdeckung steht, vertiefe einzelne Module. Beginne dort, wo Sicherheitsregeln, Abrechnungs- und Fakturierungslogik oder Berechtigungsprüfungen liegen.
2. **Artefakterhebung:** Erfasse Quellcode, Konfiguration, UI-Texte, Datenbankschemata, Schnittstellenbeschreibungen sowie Change-Historie und Projektartefakte (Commit-Messages, Tickets, Release Notes, Migrationsnotizen), soweit als Datei lesbar.
3. **Technische Analyse:** Identifiziere Module, Komponenten, Abhängigkeiten, Statusmaschinen, Validierungslogik, Berechtigungsprüfungen.
4. **Semantische Interpretation:** Leite fachliche Aussagen aus technischen Implementierungen ab (z. B. Statusübergänge → Geschäftsregel).
5. **Formalisierung:** Überführe die Aussagen in klare, testbare Anforderungen mit Kontext, Vorbedingung und Ergebnis.
6. **Traceability-Anreicherung:** Verknüpfe jede Anforderung mit konkreten Artefaktbelegen.
### Pflicht-Eigenschaften jeder Anforderung
- **Belegpflicht:** Jede Anforderung **muss** mindestens einen konkreten Artefaktbeleg führen (Dateipfad, Klasse/Methode, SQL-Statement, UI-String, Konfigurationseintrag). Jeder Beleg erhält eine kurze Begründung, warum er die Aussage trägt. Lässt sich eine Aussage nicht belegen, **schreibe die Anforderung nicht** - erfasse den offenen Punkt stattdessen als Hypothese. Eine Anforderung ohne Beleg ist unter keinen Umständen zulässig.
- **Trennung von Fakt und Interpretation:** Die belegte technische Beobachtung (Feld `Fakt`) wird getrennt von der fachlichen Interpretation (Feld `Aussage`) dokumentiert, damit nachvollziehbar bleibt, was im Artefakt steht und was daraus geschlossen wurde.
- **Risikobasierte Priorisierung:** Anforderungen zu Sicherheitsregeln, Abrechnungs-/Fakturierungslogik und Berechtigungen unterliegen strengeren Evidenzanforderungen: Sie benötigen mindestens einen `PRIMÄR`-Beleg, andernfalls sind sie zwingend als `[HYPOTHESE]` zu kennzeichnen. Ein `PRIMÄR`-Beleg benennt hier die **durchsetzende Stelle** - Datei, Klasse, Methode und die konkrete Prüfung, Bedingung oder das Constraint. Ein Verweis auf eine Datei ohne Angabe der prüfenden Stelle genügt für diese Anforderungen nicht.
- **Belegklassifikation:** Kennzeichne jeden Beleg als
- `PRIMÄR` (durchgesetzte Regel im Code oder DB-Constraint),
- `SEKUNDÄR` (UI-Label, Fehlermeldung, Reportlayout, Mappingtabelle, Konfigurationsschalter),
- `KONTEXT` (Kommentar, Commit-Message, Ticketreferenz).
- **Hypothesenmarkierung:** Aussagen, die sich nicht eindeutig aus Artefakten ableiten lassen, kennzeichnest du explizit mit `[HYPOTHESE]` und einer kurzen Begründung, welche Information zur Bestätigung fehlt. Bei einer Codebasis dieser Größe ist eine Analyse ohne jeden offenen Punkt unplausibel: Führst du keine einzige Hypothese, begründe das ausdrücklich in der Selbstbewertung. Umgekehrt ist eine hohe Hypothesenzahl kein Mangel, sondern ein Hinweis auf ehrliche Abgrenzung.
- **Verifizierbarkeit:** Jede Anforderung enthält mindestens eine Prüfidee oder ein Akzeptanzkriterium.
- **Eindeutigkeit:** Vermeide vage Begriffe ("schnell", "benutzerfreundlich"); definiere domänenspezifische Begriffe beim ersten Auftreten.
- **Übernahmewürdigkeit:** Beurteile für jede Anforderung, ob ihre Funktion im Zielsystem erhalten bleiben soll. Unterscheide `übernehmen` (fachlich weiterhin erforderlich), `Workaround` (historisch gewachsene Behelfslösung), `Sonderfall` (Ausnahme für einen einzelnen Kunden, Mandanten oder Altbestand) und `veraltet` (durch neuere Logik abgelöst oder fachlich überholt). Begründe die Einstufung in einem Halbsatz.
- **Redundanzfreiheit:** Formuliere jede Anforderung so, dass sie von den übrigen klar abgegrenzt ist. Beschreiben zwei Anforderungen dieselbe fachliche Funktion aus unterschiedlicher Perspektive, führe sie zusammen oder grenze sie im Titel und in der Aussage ausdrücklich gegeneinander ab.
### Formatvorgabe pro Anforderung
```
ID: <StRS|SyRS|SwRS>-<laufende Nummer>
Titel: <kurzer Titel>
Ebene: <StRS | SyRS | SwRS>
Typ: <funktional | nicht-funktional | Schnittstelle | Daten | Sicherheit | ...>
Qualitätsmerkmal: <nur bei nicht-funktionalen Anforderungen: ISO-25010-Merkmal, sonst leer>
Akteur: <Rolle / System / Komponente>
Vorbedingung: <Zustand vor Auslösen>
Fakt: <belegte technische Beobachtung, z. B. Statusübergang, Constraint, Prüfung>
Aussage: Das System soll <...>. (fachliche Interpretation als klare Soll-Aussage)
Ergebnis: <erwartetes Ergebnis / Nachbedingung>
Belege:
- [PRIMÄR] <Pfad/Klasse/Methode/SQL/UI-String> - Begründung: <warum trägt der Beleg die Aussage>
- [SEKUNDÄR] <...> - Begründung: <...>
- [KONTEXT] <...> - Begründung: <...>
Prüfidee: <Akzeptanzkriterium oder Testidee>
Tracelinks: <verwandte StRS-/SyRS-/SwRS-IDs>
Konsolidierung: <nein | Kandidat: <IDs oder Stellen, die dieselbe fachliche Funktion abbilden>>
Übernahmewürdigkeit: <übernehmen | Workaround | Sonderfall | veraltet> - <kurze Begründung>
Status: <belegt | HYPOTHESE>
```
### Traceability
Stelle Forward- und Backward-Traceability zwischen den drei Ebenen her:
- Jede SwRS-Anforderung referenziert die zugehörige SyRS-Anforderung.
- Jede SyRS-Anforderung referenziert die zugehörige StRS-Anforderung.
- Erzeuge zusätzlich eine konsolidierte **Traceability-Tabelle** (Markdown oder CSV): `StRS-ID | SyRS-ID | SwRS-ID | Artefaktbeleg`.
### Nicht-funktionale Anforderungen
- Ordne nicht-funktionale Anforderungen den Qualitätsmerkmalen der **ISO/IEC 25010** zu (z. B. Zuverlässigkeit, Performance-Effizienz, Sicherheit, Wartbarkeit, Übertragbarkeit). Trage die Zuordnung in das dafür vorgesehene Feld `Qualitätsmerkmal` ein, nicht in das Feld `Typ`.
- Leite Betriebs- und Sicherheitsanforderungen gezielt auch aus indirekt sichtbaren Artefakten ab: Konfigurationen, Deployment-Skripte, Logging-Policies, Rechteprüfungen.
### Konsolidierungsbedarf
Die Codebasis enthält fachliche Redundanz: Dieselbe Anforderung kann auf unterschiedlichen Masken oder in unterschiedlichen Modulen mehrfach und teils unterschiedlich implementiert sein. Prüfe daher bei jeder Anforderung, ob andere Anforderungen dieselbe fachliche Funktion abbilden, und vermerke solche Fälle im Feld `Konsolidierung` als Kandidat für eine Zusammenführung im Zielsystem.
**Gemeint sind fachlich gleichartige Konzepte in getrennten Implementierungen**, nicht bloß ähnlich formulierte Anforderungen. Ein Beispiel aus dieser Codebasis: Drucker werden als „Stammblätter" geführt, sonstige Hardware getrennt davon als „Assets" - zwei Datenhaltungen für denselben fachlichen Gegenstand, die im Zielsystem zu einem Asset-Konzept zusammengeführt werden sollen. Zwei Anforderungen, die denselben Sachverhalt nur aus Sicht verschiedener Ebenen beschreiben (etwa StRS und SwRS), sind **kein** Konsolidierungsfall - dafür sind die Tracelinks da.
### Ergebnisstruktur (im vorgegebenen Ausgabeverzeichnis)
```text
Ergebnisse/
StRS.md
SyRS.md
SwRS.md
Traceability.md (oder Traceability.csv)
Hypothesen.md (Sammlung aller mit [HYPOTHESE] markierten Aussagen mit offener Frage)
Glossar.md (Domänenbegriffe, die in den Anforderungen verwendet werden)
Analysebericht.md (Modulinventar aus Schritt 0, Abdeckungstabelle, Konsistenzcheck,
Selbstbewertung, bekannte Lücken)
```
**Erstelle ausschließlich diese 7 Dateien.** Keine Ergänzungsdateien, keine Aufteilungen wie `SwRS-Ergaenzungen.md` oder `SyRS-Teil2.md`. Wenn eine Datei zu lang wird, fahre in derselben Datei fort — die ID-Reihe macht die Reihenfolge klar. Anforderungen außerhalb dieser 7 Dateien werden von der Auswertung nicht erfasst.
Das Ausgabeverzeichnis wird beim Start des Laufs beigestellt. Die analysierte Codebasis wird ausschließlich gelesen und nicht verändert.
### Randbedingungen
- **Keine Halluzinationen.** Wenn ein Artefakt nicht gelesen oder eine Aussage nicht belegt werden kann, ist das offen zu legen, nicht zu erfinden.
- **Keine Generierung von Code.** Es sollen ausschließlich Spezifikationsartefakte entstehen.
- **Keine Annahme über nicht beigestellte Hilfsmittel.** Arbeite mit dem, was dir in diesem Lauf zur Verfügung steht. Setze keine zusätzlichen Analysewerkzeuge, Datenbankzugriffe oder laufende Systeme voraus. Stehen für eine Aussage nur indirekte Belege zur Verfügung, ist sie als `[HYPOTHESE]` zu kennzeichnen.
- **Migrationsperspektive berücksichtigen.** Erkennbare Workarounds, Sonderfälle und überholte Logik gehören in das Feld `Übernahmewürdigkeit`, nicht in das Feld `Status`. `Status` beschreibt ausschließlich die Belegsituation (`belegt` oder `HYPOTHESE`), `Übernahmewürdigkeit` die fachliche Zukunft der Anforderung. Beide Angaben sind unabhängig voneinander: Eine gut belegte Anforderung kann ein Workaround sein, eine Hypothese kann übernahmewürdig sein.
- **Sprache:** Deutsch für Anforderungsaussagen, technische Bezeichner (Klassen, Methoden, Spalten) bleiben in ihrer Originalsprache.
### Abschluss
Führe vor Abgabe einen **Konsistenzcheck über das gesamte Anforderungs-Set** durch und dokumentiere das Ergebnis im `Analysebericht.md`:
- Doppelte oder mehrfach vergebene IDs
- Anforderungen ohne Beleg
- Anforderungen ohne Angabe zur `Übernahmewürdigkeit`
- Tracelinks auf nicht existierende IDs
- Inhaltlich deckungsgleiche Anforderungen, die nicht als Konsolidierungskandidat markiert sind
- **Liste aller risikorelevanten Anforderungen** (Sicherheit, Abrechnung/Fakturierung, Berechtigungen) mit ihrer Belegsituation: ID, Titel, ob ein `PRIMÄR`-Beleg vorliegt, andernfalls die `[HYPOTHESE]`-Kennzeichnung. Diese Liste macht Verstöße gegen die risikobasierte Priorisierung im Lauf selbst sichtbar.
- **Abgleich `Hypothesen.md` gegen die Inline-Markierungen:** Beide müssen dieselben Anforderungen nennen. `Hypothesen.md` enthält genau die Anforderungen mit `[HYPOTHESE]`-Markierung und keine zusätzlichen freien Fragen; offene Punkte ohne zugehörige Anforderung gehören in die Selbstbewertung.
Erstelle außerdem die **Abdeckungstabelle** auf Basis des Modulinventars aus Schritt 0: je Modul die Einstufung `tief | mittel | flach | nicht analysiert` und die Anzahl der daraus erzeugten Anforderungen. Jede Zeile des Inventars muss in der Abdeckungstabelle auftauchen.
Beende den Lauf mit einer kurzen Selbstbewertung im `Analysebericht.md`:
- Wie viele Module des Inventars wurden tief, mittel, flach beziehungsweise gar nicht analysiert? Nenne absolute Zahlen, nicht nur Beispiele.
- Wurde die Mindestabdeckung erreicht, also hat jedes Modul mindestens eine Anforderung? Falls nein: welche Module fehlen und warum?
- An welchen Stellen war der Beleg dünn (hoher Anteil `SEKUNDÄR`/`KONTEXT` oder `[HYPOTHESE]`)?
- Falls keine einzige Hypothese geführt wurde: Begründung, warum die Analyse ohne offene Punkte auskommt.
- Welche Erkenntnisse legen einen Nachschlag in einer Folge-Iteration nahe?
| Ergebnisstruktur: nur die 7 vorgegebenen Dateien, keine Ergänzungsdateien | Kimi-solo erstellte `SwRS-Ergaenzungen.md` und `SyRS-Ergaenzungen.md` — 18 Anforderungen lagen außerhalb der vorgegebenen Dateien und wurden vom Auswertungsskript nicht erfasst |
| Modulabdeckung härter einfordern: >10 % `nicht analysiert` = unvollständige Erkundung | GLM-solo ließ 33 von 120 Modulen (27,5 %) unanalysiert; Kimi-solo kam auf 1/56 (1,8 %) — die Streuung zeigt, dass die Formulierung „nicht analysiert mit Begründung" zu weich war |
Unverändert bleiben: Prüfidee, Tracelinks, Belegklassifikation, Blockformat, Hypothesenpflicht, risikobasierte Priorisierung, Konsolidierungsbegriff und ISO-25010-Zuordnung. Werkzeugnutzung und Turn-Anzahl werden bewusst nicht vorgegeben — sie sind Teil der Untersuchung.
> Dieser Prompt enthält ausschließlich die **Analyseanweisung** und ist damit unabhängig von einem
> bestimmten Werkzeug oder Modell einsetzbar. Welche Werkzeuge im jeweiligen Lauf zur Verfügung
> stehen und wohin die Ergebnisse geschrieben werden, stellt der Versuchsaufbau beim Start bei.
### Werkzeugkontext (vom Versuchsaufbau vorgegeben)
Für diesen Lauf stehen zur Verfügung: Lesen von Dateien, Suchen im Dateibestand, Auflisten von
Verzeichnissen, das Ausführen rein lesender Kommandozeilenbefehle im Arbeitsverzeichnis sowie
die werkzeugeigenen Subagenten.
Nicht verfügbar sind: spezialisierte Agentenrollen aus Konfigurationsdateien, externe
Werkzeugserver, Webzugriff.
Triff keine Annahmen über weitere Werkzeuge und versuche nicht, nicht verfügbare
Werkzeuge zu ersetzen.
### Ausgabeverzeichnis (überschreibt anderslautende Pfadangaben oben)
Schreibe ALLE zu erzeugenden Ergebnisdateien in das Verzeichnis
`C:\DEV\MasterArbeit\Versuche\Versuch_01\Iteration 16\qwen\qwen3.8-flash-next\builtin\max\03_Lauf_2026-09-03_151428_v13.0.0-0354\Ergebnisse\`.
Verändere keine Dateien im Arbeitsverzeichnis (der analysierten Codebasis).
@@ -0,0 +1,234 @@
{
"$schema": "https://opencode.ai/config.json",
"provider": {
"tensorx": {
"npm": "@ai-sdk/openai-compatible",
"name": "TensorX",
"options": {
"baseURL": "https://api.tensorx.ai/v1"
},
"models": {
"qwen/qwen3.8-flash-next": {
"name": "Qwen 3.8 Flash Next",
"limit": {
"context": 262144,
"output": 131072
},
"variants": {
"low": {
"thinking": {
"type": "enabled",
"level": "low"
}
},
"medium": {
"thinking": {
"type": "enabled",
"level": "medium"
}
},
"high": {
"thinking": {
"type": "enabled",
"level": "high"
}
},
"xhigh": {
"thinking": {
"type": "enabled",
"level": "xhigh"
}
},
"max": {
"thinking": {
"type": "enabled",
"level": "xhigh"
}
}
}
},
"z-ai/glm-5.2": {
"name": "GLM 5.2",
"limit": {
"context": 1048576,
"output": 131072
},
"variants": {
"low": {
"thinking": {
"type": "enabled",
"level": "low"
}
},
"medium": {
"thinking": {
"type": "enabled",
"level": "medium"
}
},
"high": {
"thinking": {
"type": "enabled",
"level": "high"
}
},
"xhigh": {
"thinking": {
"type": "enabled",
"level": "xhigh"
}
},
"max": {
"thinking": {
"type": "enabled",
"level": "xhigh"
}
}
}
},
"z-ai/glm-5.3-flash": {
"name": "GLM 5.3 Flash",
"variants": {
"low": {
"thinking": {
"type": "enabled",
"level": "low"
}
},
"medium": {
"thinking": {
"type": "enabled",
"level": "medium"
}
},
"high": {
"thinking": {
"type": "enabled",
"level": "high"
}
},
"xhigh": {
"thinking": {
"type": "enabled",
"level": "xhigh"
}
},
"max": {
"thinking": {
"type": "enabled",
"level": "xhigh"
}
}
}
},
"moonshotai/kimi-k3": {
"name": "Kimi K3",
"limit": {
"context": 1048576,
"output": 131072
}
}
}
}
},
"model": "tensorx/qwen/qwen3.8-flash-next",
"permission": {
"*": "deny",
"read": "allow",
"glob": "allow",
"grep": "allow",
"list": "allow",
"edit": {
"*": "deny",
"Versuche/Versuch_01/Iteration 16/qwen/qwen3.8-flash-next/builtin/max/03_Lauf_2026-09-03_151428_v13.0.0-0354/Ergebnisse": "allow",
"Versuche/Versuch_01/Iteration 16/qwen/qwen3.8-flash-next/builtin/max/03_Lauf_2026-09-03_151428_v13.0.0-0354/Ergebnisse/**": "allow",
"../../Ergebnisse": "allow",
"../../Ergebnisse/**": "allow",
"C:/DEV/MasterArbeit/Versuche/Versuch_01/Iteration 16/qwen/qwen3.8-flash-next/builtin/max/03_Lauf_2026-09-03_151428_v13.0.0-0354/Ergebnisse": "allow",
"C:/DEV/MasterArbeit/Versuche/Versuch_01/Iteration 16/qwen/qwen3.8-flash-next/builtin/max/03_Lauf_2026-09-03_151428_v13.0.0-0354/Ergebnisse/**": "allow",
"C:/DEV/MasterArbeit/Versuche/Versuch_01/Iteration 16/qwen/qwen3.8-flash-next/builtin/max/03_Lauf_2026-09-03_151428_v13.0.0-0354/_meta/spiegel/Ergebnisse": "allow",
"C:/DEV/MasterArbeit/Versuche/Versuch_01/Iteration 16/qwen/qwen3.8-flash-next/builtin/max/03_Lauf_2026-09-03_151428_v13.0.0-0354/_meta/spiegel/Ergebnisse/**": "allow",
"Ergebnisse": "allow",
"Ergebnisse/**": "allow",
"Versuche/Versuch_01/Iteration 16/qwen/qwen3.8-flash-next/builtin/max/03_Lauf_2026-09-03_151428_v13.0.0-0354/_meta/spiegel/Ergebnisse": "allow",
"Versuche/Versuch_01/Iteration 16/qwen/qwen3.8-flash-next/builtin/max/03_Lauf_2026-09-03_151428_v13.0.0-0354/_meta/spiegel/Ergebnisse/**": "allow"
},
"external_directory": {
"*": "deny",
"Versuche/Versuch_01/Iteration 16/qwen/qwen3.8-flash-next/builtin/max/03_Lauf_2026-09-03_151428_v13.0.0-0354/Ergebnisse": "allow",
"Versuche/Versuch_01/Iteration 16/qwen/qwen3.8-flash-next/builtin/max/03_Lauf_2026-09-03_151428_v13.0.0-0354/Ergebnisse/**": "allow",
"../../Ergebnisse": "allow",
"../../Ergebnisse/**": "allow",
"C:/DEV/MasterArbeit/Versuche/Versuch_01/Iteration 16/qwen/qwen3.8-flash-next/builtin/max/03_Lauf_2026-09-03_151428_v13.0.0-0354/Ergebnisse": "allow",
"C:/DEV/MasterArbeit/Versuche/Versuch_01/Iteration 16/qwen/qwen3.8-flash-next/builtin/max/03_Lauf_2026-09-03_151428_v13.0.0-0354/Ergebnisse/**": "allow",
"C:/DEV/MasterArbeit/Versuche/Versuch_01/Iteration 16/qwen/qwen3.8-flash-next/builtin/max/03_Lauf_2026-09-03_151428_v13.0.0-0354/_meta/spiegel/Ergebnisse": "allow",
"C:/DEV/MasterArbeit/Versuche/Versuch_01/Iteration 16/qwen/qwen3.8-flash-next/builtin/max/03_Lauf_2026-09-03_151428_v13.0.0-0354/_meta/spiegel/Ergebnisse/**": "allow",
"Ergebnisse": "allow",
"Ergebnisse/**": "allow",
"Versuche/Versuch_01/Iteration 16/qwen/qwen3.8-flash-next/builtin/max/03_Lauf_2026-09-03_151428_v13.0.0-0354/_meta/spiegel/Ergebnisse": "allow",
"Versuche/Versuch_01/Iteration 16/qwen/qwen3.8-flash-next/builtin/max/03_Lauf_2026-09-03_151428_v13.0.0-0354/_meta/spiegel/Ergebnisse/**": "allow"
},
"bash": {
"*": "allow",
"rm *": "deny",
"rmdir *": "deny",
"mv *": "deny",
"cp *": "deny",
"dd *": "deny",
"truncate *": "deny",
"chmod *": "deny",
"chown *": "deny",
"ln *": "deny",
"tee *": "deny",
"sed -i*": "deny",
"git checkout*": "deny",
"git restore*": "deny",
"git clean*": "deny",
"git reset*": "deny",
"git add*": "deny",
"git commit*": "deny",
"git push*": "deny",
"git fetch*": "deny",
"git pull*": "deny",
"git remote*": "deny",
"dotnet *": "deny",
"msbuild *": "deny",
"npm install*": "deny",
"nuget *": "deny",
"Remove-Item *": "deny",
"Move-Item *": "deny",
"Copy-Item *": "deny",
"New-Item *": "deny",
"Set-Content *": "deny",
"Add-Content *": "deny",
"Clear-Content *": "deny",
"Out-File *": "deny",
"Set-ItemProperty *": "deny",
"Rename-Item *": "deny"
},
"task": {
"*": "deny",
"general": "allow",
"explore": "allow"
},
"webfetch": "deny",
"websearch": "deny",
"skill": "deny",
"question": "deny"
},
"agent": {
"build": {
"model": "tensorx/qwen/qwen3.8-flash-next",
"mode": "primary"
},
"general": {
"model": "tensorx/qwen/qwen3.8-flash-next",
"mode": "subagent"
},
"explore": {
"model": "tensorx/qwen/qwen3.8-flash-next",
"mode": "subagent"
}
},
"default_agent": "build"
}