more runs before cline

This commit is contained in:
Christoph Schwörer
2026-08-27 19:22:37 +02:00
parent 3d5b691bfa
commit ea1f3caff7
60 changed files with 30406 additions and 5 deletions
@@ -0,0 +1,615 @@
# Analysebericht
**Untersuchungsgegenstand:** c-entron ERP-Suite (Arbeitsverzeichnis `C:\DEV\MasterArbeit\QuellCode\CentronERP`)
**Analyseart:** statische Analyse, keine Ausführung. Codebasis wurde ausschließlich gelesen.
**Datum:** 2026-08-27
## Architekturüberblick (Befund aus Schritt 0)
Die Codebasis umfasst eine Mehrschicht-Anwendung:
| Schicht | Pfad | Umfang (Dateien) | Technik |
|---|---|---|---|
| Windows-Client (Fat Client) | `src\centron\Centron.WPF.UI` | ~4.726 .cs + XAML | WPF, DevExpress, Ribbon |
| Web-Client „c-entron Nexus" | `src\nexus\CentronNexus` | ~756 (.cs/.razor, 460 .razor) | ASP.NET Core Blazor |
| Geschäftslogik | `src\backend\Centron.BL` | ~85 Fachbereiche | C#/.NET |
| Datenzugriff | `src\backend\Centron.DAO` | ~1.129 | ADO.NET/SQL |
| Entitäten | `src\backend\Centron.Entities` | ~1.183 | POCO/DTO |
| Webservice (REST + Legacy) | `src\webservice` | ~2.528 (Core) + Controller | ASP.NET Core, JWT |
| Externe API-Adapter | `src\apis`, `Centron.Api.docuFORM` | 9 Projekte | REST-Clients |
| Datenbankschema | `SSMS_DB_SCHEMA.sql` | 1.535 `CREATE TABLE` | MSSQL |
| Deployment | `docker`, `azure`, `deployment`, `scripts` | — | Docker/Azure DevOps |
## Schritt 0 — Modulinventar
Das Inventar ist die Bezugsgröße für die Abdeckungstabelle. Es wurde vor der ersten Anforderung erstellt und wird später ergänzt, aber nicht gekürzt. Gruppierung: A1–A12 = Analyse-Cluster.
| Nr. | Modul / Komponente | Pfad (Hauptfundort) | Fachliche Aufgabe (ein Satz) | Cluster |
|---|---|---|---|---|
| M01 | Rechteverwaltung / UserRights | `src\backend\Centron.BL\Security`, `src\centron\...\Modules\Administration\RightsManagement`, `CentronRights.md` | Definition und Durchsetzung feingranularer Benutzerrechte inkl. einschränkender Rechte (nur eigene, nur eigene Filiale). | A1 |
| M02 | Authentifizierung Webservice (JWT) | `src\webservice\Centron.Controllers\JwtAuthController.cs`, `Authorize*Attribute.cs` | Anmeldung und Autorisierung externer Zugriffe über JWT-Token und Rechte-Attribute. | A1 |
| M03 | Zwei-Faktor-Authentifizierung | `src\backend\Centron.BL\TwoFactorAuthenticator`, `TwoFactorAuthController.cs` | Zweiter Faktor bei der Anmeldung. | A1 |
| M04 | Passwortmanager | `src\centron\...\Modules\PasswordManager`, `Centron.BL\PasswordManagementArea` | Verwaltung von Zugangsdaten (z. B. Kundenpasswörter) im ERP. | A1 |
| M05 | DSGVO-Funktionen | `src\centron\...\Modules\Administration\DSGVO` | Datenschutzfunktionen (Anonymisierung/Auskunft) für personenbezogene Daten. | A1 |
| M06 | Verträge (Service/Leasing) | `Centron.BL\Finances`, `...\Modules\Finances\Contracts` | Verwaltung wiederkehrend abzurechnender Service-, Wartungs- und Leasingverträge. | A2 |
| M07 | Automatisierte Abrechnung | `...\Modules\Finances\AutomatedBilling`, `FlatrateBilling`, `TimerBilling` | Periodische Erzeugung von Abrechnungsbelegen aus Verträgen, Flatrates und Zeitbuchungen. | A2 |
| M08 | Mahnwesen | `...\Modules\Finances\Dunning` | Mahnläufe über offene Posten mit Mahnstufen. | A2 |
| M09 | Offene Posten (OPOS) / Zahlungen | `...\Modules\Finances\Opos`, `Payments` | Verwaltung offener Posten und Zahlungszuordnung. | A2 |
| M10 | Onlinebanking / FinAPI | `...\Modules\OnlineBanking`, `src\apis\Centron.APIs.FinAPI` | Abruf von Kontoumsätzen und Abgleich mit offenen Posten. | A2 |
| M11 | Zahler & Kostenstellen | `...\Modules\PayersAndCostCenter` | Abweichende Rechnungsempfänger (Zahler) und Kostenstellenzuordnung. | A2 |
| M12 | Buchhaltungsexport (DATEV u. a.) | `...\Modules\DataExchange\BookKeeping`, `DatevOnline2020`, `PaymentTransactions` | Übergabe von Buchungsdaten und Zahlungsverkehr an Finanzbuchhaltungssysteme. | A2 |
| M13 | Gerätezähler (Click-Abrechnung) | `...\Modules\Finances\DeviceClickCounter` | Erfassung von Zählerständen (z. B. Druckerklicks) als Abrechnungsgrundlage. | A2 |
| M14 | SEPA | `...\Modules\Administration\SepaContract` | SEPA-Mandate/Lastschrift-Grundlagen. | A2 |
| M15 | Belegwesen Verkauf (Angebot→Rechnung) | `Centron.BL\Sales` (248 Dateien), `...\Modules\Sales` | Angebots-, Auftrags-, Lieferschein- und Rechnungserstellung mit Belegkette. | A3 |
| M16 | Sonderpreise / Preisfindung | `Centron.BL\Sales`, Adressstamm-Sonderpreise | Kunden- bzw. vertragsspezifische Preisfindung. | A3 |
| M17 | Produktmatrix | `Centron.BL\ProductMatrix`, `...\Modules\Sales\ProductMatrix` | Matrixbasierte Produkt-/Konditionszuordnung im Vertrieb. | A3 |
| M18 | Mailing/Kampagnen Vertrieb | `...\Modules\Sales\Mailing`, `Centron.BL\Mailings` | Serienmails/Kampagnen an Kundenselektionen. | A3 |
| M19 | E-Rechnung (XRechnung/ZUGFeRD/ebInterface) | `docs\guides\development\xrechnung.md`, `src\apis\Centron.Api.EbInterface`, `ZugferdImportController.cs` | Erzeugung und Import strukturierter elektronischer Rechnungen. | A3 |
| M20 | Belegkonditionen | `...\Modules\Administration\ReceiptConditions` | Konfigurierbare Zu-/Abschlagskonditionen auf Belegen. | A3 |
| M21 | Artikelstamm & Lager | `Centron.BL\Warehousing` (40), `...\Modules\Warehousing` | Artikelverwaltung, Einheiten, Materialgruppen, Lagerbestände, Inventur. | A4 |
| M22 | Kommissionierung | `...\Modules\Warehousing\Commissioning`, `Commissions` | Zusammenstellung von Lieferungen aus Lagerbeständen. | A4 |
| M23 | Barcode | `...\Modules\Warehousing\BarcodeManagement` | Barcodegestützte Lagerprozesse. | A4 |
| M24 | Einkauf & Bestellvorschlag | `Centron.BL\Buying`, `Centron.BL\Purchasing`, `...\Modules\Purchasing` | Lieferantenbestellungen inkl. Bestellvorschlagsliste und Wareneingang. | A4 |
| M25 | EDI (Lieferanten) | `Centron.BL\EDI` (27), `...\Modules\Purchasing\EDIManagement` | Elektronischer Belegaustausch mit Lieferanten/Distributoren. | A4 |
| M26 | Versand / Logistik | `...\Modules\Logistic`, `src\apis\Centron.Api.Gls`, `Centron.Api.Shipcloud` | Versandarten, Paketlabel und Sendungsverfolgung über GLS/Shipcloud. | A4 |
| M27 | RMA / Retouren | `...\Modules\Rma`, `Centron.BL` | Abwicklung von Rücksendungen an Kunden (SendBack) und Lieferanten (SendForth). | A4 |
| M28 | Produktdaten-Anbindungen (Icecat, ITscope, COP, EGIS) | `src\apis\Centron.APIs.*DataAccess` | Import von Artikelstammdaten und Konditionen externer Kataloge/Distributoren. | A4 |
| M29 | TradePool | `Centron.BL\TradePool` | Austausch/Handel von Artikeln über einen Händlerpool. | A4 |
| M30 | Helpdesk / Ticketsystem | `Centron.BL\Helpers`, `...\Modules\Helpdesk`, `Centron.BL\ExternalHelpdesk` | Ticketverwaltung mit Kategorien, Status, Zuweisung, Eskalation. | A5 |
| M31 | Zeiterfassung auf Tickets | `Centron.BL\Time`, `...\Modules\Helpdesk` (EDIT_TIME-Rechte) | Erfassung und Abrechnung von Arbeitszeiten auf Tickets. | A5 |
| M32 | Checklisten | `Centron.BL\CheckListArea`, `...\Modules\Helpdesk\CentronChecklist` | Strukturierte Abarbeitungslisten an Tickets. | A5 |
| M33 | Expected Events | `Centron.BL\ExpectedEvents`, `...\Modules\Helpdesk\ExpectedEvents` | Überwachung erwarteter Ereignisse (z. B. Backup-Meldungen) mit Alarmierung. | A5 |
| M34 | SelfCare-Formulare | `Centron.BL\SelfCare`, `SelfCareFormsController.cs` | Endkunden-Formulare zur Selbstauskunft/Ticketanlage. | A5 |
| M35 | Aufgabenverwaltung (TaskManager) | `Centron.BL\TaskManager`, `...\Modules\Helpdesk\TaskManagement` | Aufgaben mit Fälligkeit und Verantwortlichen, auch ticketbezogen. | A5 |
| M36 | Umfragen (Survey) | `...\Modules\Survey` | Erstellung und Auswertung von Kundenumfragen. | A5 |
| M37 | Ticket-Projekte | `Centron.BL\TicketProjects` | Bündelung von Tickets zu Projekten. | A5 |
| M38 | Adress-/Kundenstamm | `Centron.BL\BusinessPartner`, `CustomerArea`, `Accounts` | Verwaltung von Kunden, Lieferanten, Ansprechpartnern und Web-Accounts. | A6 |
| M39 | Mitarbeiterstamm | `Centron.BL\EmployeeArea`, `...\Administration\EmployeeManagement` | Mitarbeiterdaten, Abteilungen, Filialen. | A6 |
| M40 | Geräte / Assets / Stammblätter | `Centron.BL\Devices`, `Centron.BL\ItPlanner` | Verwaltung von Kundengeräten (Drucker-Stammblätter, IT-Assets) inkl. Historie. | A6 |
| M41 | Länder/Regionen | `Centron.BL\CountryArea` | Länderstammdaten inkl. steuerlicher Zuordnung. | A6 |
| M42 | Tags & Custom Properties | `Centron.BL\Tags`, `Centron.BL\Customizations`, `...\Global\CustomProperties` | Freie Verschlagwortung und kundenindividuelle Zusatzfelder. | A6 |
| M43 | Objekt-Externreferenzen | `Centron.BL\ObjectExternalReferences` | Verknüpfung von ERP-Objekten mit IDs externer Systeme. | A6 |
| M44 | Mail (Versand/Empfang) | `Centron.BL\Mail` (20), `MailScanner` | Mailversand/-empfang, Vorlagen, automatische Zuordnung eingehender Mails. | A7 |
| M45 | Mail-Vorlagen | `...\Administration\MailTemplates`, `docs\guides\development\create-mail-templates.md` | Platzhalterbasierte Mailvorlagen für Systemmails. | A7 |
| M46 | Kalender / Termine | `Centron.BL\Calendar`, `AppointmentRequests`, `...\Modules\Calendar` | Terminverwaltung inkl. Terminanfragen, Exchange-Sync. | A7 |
| M47 | Outlook-/Exchange-Integration | `Centron.BL\Outlook`, `src\nexus\CentronNexus.OutlookAddIn`, `docs\features\exchange-sync-bugprotokoll.md` | Synchronisation von Mails/Terminen mit Outlook/Exchange. | A7 |
| M48 | Telefonie (TAPI) | `Centron.BL\Tapi`, `...\MyCentron\Telephony` | Anrufsignalisierung und Wahlhilfe am Arbeitsplatz. | A7 |
| M49 | Chats | `Centron.BL\Chats` | Interner Chat. | A7 |
| M50 | Benachrichtigungen | `Centron.BL\Notifications`, `NexusNotifications` | Systembenachrichtigungen an Benutzer (Client und Web). | A7 |
| M51 | MyCentron / MyDay / ToDo | `Centron.BL\MyCentron`, `MyDay`, `ToDoArea`, `...\Modules\MyCentron` | Persönliche Startseite mit Tagesübersicht, Aufgaben, Wiedervorlagen. | A7 |
| M52 | Social Media / VideoPortal | `Centron.BL\SocialMedia`, `VideoPortal` | Anbindung Social-Media-Kanäle und internes Videoportal. | A7 |
| M53 | Nexus WebCart (Shop) | `src\nexus\CentronNexus\WebCart` | Webshop für Endkunden auf Basis der Sonderpreise. | A8 |
| M54 | Nexus WebOffer | `src\nexus\CentronNexus\WebOffer` | Online-Angebotsansicht/-annahme durch Kunden. | A8 |
| M55 | Nexus ServiceBoard | `src\nexus\CentronNexus\ServiceBoard` | Web-Ticketboard für Servicevorgänge. | A8 |
| M56 | Nexus DocumentSigning | `src\nexus\CentronNexus\DocumentSigning` | Digitale Unterschrift von Dokumenten (Signaturpad) im Browser. | A8 |
| M57 | Nexus Produktionsaufträge | `src\nexus\CentronNexus\ProductionOrderManagement` | Web-Sicht auf Fertigungsaufträge. | A8 |
| M58 | REST-API (Centron.Controllers) | `src\webservice\Centron.Controllers` | REST-Endpunkte für Kunden, Aufträge, Tickets usw. mit Rechteprüfung. | A8 |
| M59 | Legacy-Webservices | `src\webservice\Centron.WebServices.Core` (2.528 Dateien) | Umfangreiche Service-Schicht für Client-Server-Kommunikation. | A8 |
| M60 | ConnectionManager / Hosts | `src\webservice\c-entron.misc.ConnectionManager`, `Centron.Host*` | Hosting der Dienste (Konsole, Windows-Dienst) und Verbindungsverwaltung. | A8 |
| M61 | Mobile | `Centron.BL\Mobile` | Unterstützung mobiler Zugriffe. | A8 |
| M62 | DocSync / docuFORM | `...\Modules\DataExchange\DocSync`, `DocuForm`, `Centron.Api.docuFORM` | Dokumenten-/Datenaustausch mit docuFORM (Geräte-/Zählerdaten). | A9 |
| M63 | RMM-Connectors | `...\Modules\DataExchange\Rmm`, `RmmController.cs` | Anbindung von Remote-Monitoring-Systemen (Geräte-/Alarmdaten). | A9 |
| M64 | TelekomDive | `Centron.BL`? `...\Modules\TelekomDive`, `DataExchange\TelekomDive` | Anbindung Telekom-DIVE-Portal (Aufträge/Provisionen). | A9 |
| M65 | Datenimport/-export generisch | `...\Modules\DataExchange\DataImport`, `DataExport`, `Connectors` | Konfigurierbarer Im-/Export von Stammdaten und Belegen. | A9 |
| M66 | Integrations / RiverDivo / CPra | `Centron.BL\Integrations`, `RiverDivo`, `CPra` | Weitere Drittsystem-Anbindungen. | A9 |
| M67 | Gateway | `src\backend\Centron.Gateway` | Vermittlungsschicht zwischen Client und Diensten. | A9 |
| M68 | Produktion / Fertigungsaufträge | `Centron.BL\Production`, `...\Modules\Production` | Fertigungsaufträge und Maschinenverwaltung. | A10 |
| M69 | Projektmanagement | `Centron.BL\Projects`, `...\Modules\ProjectManagement` | Projekte mit Budgets/Auswertung. | A10 |
| M70 | Projektpreisimport | `...\Modules\ProjectPriceImport` | Import projektspezifischer Preise mit Differenzprüfung. | A10 |
| M71 | PLM (Product Lifecycle) | `...\Modules\PLM`, `...\Finances\ProductLifecycleManagement` | Lebenszyklusverwaltung von Produkten/Geräten. | A10 |
| M72 | QM | `...\Modules\QM` | Qualitätsmanagement-Funktionen. | A10 |
| M73 | Statistiken / Management-Info | `Centron.BL\Statistics` (16), `...\Modules\Statistics` | Vertriebs-, MSP- und Mitarbeiterauswertungen. | A10 |
| M74 | Reporting / ReportEngine | `Centron.BL\ReportEngine` (26), `...\Modules\Reports`, `...\Administration\ReportServer` | Berichtserzeugung (Belegdruck, Listen) über Reportvorlagen. | A10 |
| M75 | Massenupdates | `Centron.BL\MassUpdate`, `...\Modules\Massenupdates` | Massenänderungen an Stammdaten/Verträgen. | A10 |
| M76 | Dashboard | `Centron.BL\DocuBoard`, `...\Modules\Dashboard`, `Statistics\Dashboard` | Konfigurierbare Kennzahlen-Dashboards. | A10 |
| M77 | Persistenzschicht / DB-Schema | `Centron.DAO`, `Centron.Entities`, `SSMS_DB_SCHEMA.sql` (1.535 Tabellen) | Datenzugriff und relationales Schema. | A11 |
| M78 | Volltextsuche (IndexSearch) | `Centron.BL\IndexSearch` | Indexgestützte übergreifende Suche. | A11 |
| M79 | Änderungsverfolgung (ChangeTracking) | `Centron.BL\ChangeTracking` | Protokollierung von Datenänderungen. | A11 |
| M80 | Dateiablage (Storage) | `Centron.BL\Storage`, `...\CentronFileSystem` | Ablage von Dokumenten/Dateien zu ERP-Objekten. | A11 |
| M81 | Lokalisierung | `...\Centron.WPF.UI\Localization`, `ResXManager.config.xml` | Mehrsprachige Oberflächentexte (ResX). | A11 |
| M82 | Logging / Telemetrie | `nlog.config`, `Centron.BL\Telemetry`, `...\Administration\LogViewer` | Technisches Logging und Telemetrie inkl. Log-Ansicht. | A11 |
| M83 | KI-Funktionen | `Centron.BL\ArtificialIntelligence` (25), `...\Modules\ArtificialIntelligence` | OpenAI-gestützte Funktionen (Chat, Angebotstexte, Textbewertung). | A11 |
| M84 | UI-Framework / Controls / GUI-Profile | `src\shared\Centron.Controls` (742), `...\Modules\Gui\Profiles` | Wiederverwendbare UI-Steuerelemente und benutzerspezifische Oberflächenprofile. | A11 |
| M85 | Externe Tools | `Centron.BL\ExternalToolsBL`, `...\Modules\ExternalTool` | Einbindung externer Programme mit Variablenübergabe. | A11 |
| M86 | Mandantenverwaltung | `...\Administration\MandatorManagement` | Verwaltung mehrerer Mandanten. | A12 |
| M87 | Einstellungsverwaltung | `...\Administration\Settings`, `docs\guides\development\settings-management.md`, `CentronConfigDb` | Zentrale, hierarchische Systemeinstellungen. | A12 |
| M88 | Textbausteine | `Centron.BL\TextModuleArea`, `...\Administration\TextBlockManagement` | Wiederverwendbare Textbausteine für Belege/Mails. | A12 |
| M89 | Hintergrunddienste | `docs\Background Service\DataQualityService.md`, `Centron.BL\Services`, `...\Administration\Services` | Zeitgesteuerte Serverdienste (u. a. Datenqualität, Eskalation). | A12 |
| M90 | Eskalationsregeln | `...\Administration\EscalationsSettings` | Konfigurierbare Eskalationen (z. B. Ticketfälligkeit). | A12 |
| M91 | PDF-Export/-Signierung | `...\Administration\PdfExport`, `PdfSigning` | PDF-Erzeugung und qualifizierte Signatur von Belegen. | A12 |
| M92 | Deployment / Betrieb | `docker`, `azure`, `deployment`, `scripts`, `Centron.Host.WindowsService` | Build-, Container- und Releaseprozesse; Betrieb als Windows-Dienst/Container. | A12 |
| M93 | Stundenzuschlagssätze | `...\Administration\HourlySurchargeRates` | Zuschlagsregeln auf Arbeitszeiten. | A12 |
| M94 | Update-Benachrichtigung | `...\Administration\UpdateAvailableNotificationSettings` | Hinweis auf verfügbare Programmversionen. | A12 |
| M95 | Gutscheinverwaltung | `Centron.BL\VoucherManagement` | Verwaltung von Gutscheinen. | A2 |
| M96 | Web-Links/URLs | `Centron.BL\Urls`, `WebLinks` | Verwaltung von Weblinks zu ERP-Objekten. | A8 |
*Das Inventar wurde vor der ersten Anforderung erstellt und im Laufe der Analyse ergänzt (nicht gekürzt); die Abdeckungstabelle unten führt jede Zeile mit Analysetiefe und Anforderungszahl.*
### Inventar-Korrekturen aus der Analyse
Die Detailanalyse hat die Ein-Satz-Beschreibungen bzw. Pfade folgender Module korrigiert oder präzisiert (das ursprüngliche Inventar bleibt oben unverändert stehen; maßgeblich sind die Korrekturen):
| Nr. | Korrektur (Kurzfassung) |
|---|---|
| M01 | `Centron.BL\Security` enthält nur `PdfSigningBL.cs`; die Rechte-BL liegt in `Centron.BL\Administration\Rights` (AppRightsBL), die Rechtekonstanten in `Centron.WebServices.Core\EntitiesWrongPlace\Administration\Rights\UserRightsConst.cs`. |
| M03 | `Centron.BL\TwoFactorAuthenticator` enthält nur die TOTP-PIN-Prüfung für den Passwortmanager; die Login-2FA (RADIUS/E-Mail-Link) liegt in `Centron.BL\Administration\Logins\TwoFactor`. |
| M04 | Der Passwortmanager existiert doppelt: `PasswordManagementArea` (Alt) und `PasswordManager` (aktuell, AES-verschlüsselt, Siegel). |
| M06 | Enthält zwei parallele Auswertungsmodule: `ContractEvaluation2` und `ContractEvaluationOld` (Altimplementierung). |
| M11 | Verwaltet Kostenstellen (CostCenter) und Kostenträger (CostObject, UI „Payers") — nicht „Zahler" im Sinne abweichender Rechnungsempfänger. |
| M15/M19/M20 | ZUGFeRD-Import liegt unter `Centron.Controllers\Controllers\v1\Receipts\`; E-Rechnungs-Generatoren in `Centron.BL\DataExchange\EDI\SaleInvoices\`; Konditions-Durchsetzung in `Centron.BL\Sales\Receipts\ReceiptBL.cs`. |
| M27 | RMA-BL liegt in `Centron.BL\CustomerArea\RmaBL.cs`; umfasst Kundenretouren, Lieferantenrücksendungen (SendBack) und Vorab-/Ersatzlieferungen (SendForth). |
| M31 | Ticket-Zeiterfassung liegt in `Centron.BL\Sales\Support` (HelpdeskTimerBL u. a.), nicht in `Centron.BL\Time` (dort nur TimingSettingsBL). |
| M33 | Expected Events = kundenbezogene Überwachung erwarteter externer Ereignisse (z. B. Backup-Meldungen) mit Zeitfenstern und Textmustern; Auswertungskomponente liegt außerhalb der Codebasis. |
| M36 | Umfrage-BL liegt in `Centron.BL\Accounts\Survey\SurveyProcessBL.cs`; Kopplung an Ticketabschluss über `HelpdeskCloseBL.AddSurvey()`. |
| M39 | EmployeeManagement-UI liegt im WPF-Client und in `Centron.Controls`; BL in `Centron.BL\EmployeeArea`. |
| M40 | „Stammblätter" = `MasterDataList` unter `Centron.BL\Sales\CustomerAssets\Contracts\ClickContracts`; `ItPlanner` enthält nur Checklisten-Kategorien. Kundengeräte liegen in **drei** Datenhaltungen (Stammblätter, `AccountDevices`, AssetManagement-/River-Sync). |
| M42 | Custom-Property-Logik liegt in `Centron.BL\Administration\Customization`; `Centron.BL\Customizations\CustomTables` ist nur ein Report-Hilfsdienst. |
| M47 | `Centron.BL\Outlook` enthält nur eine Asset-Suche für das Add-in; Exchange-Funktionalität liegt im Blazor-Add-in, `Centron.BL\Mail\Exchange` (EWS) und der Kalender-Synchronisation. |
| M50 | Zwei getrennte Benachrichtigungssysteme: `Notifications` (System-/Adminprotokoll, externe Empfänger) und `NexusNotifications` (persönliche Mitarbeiter-Benachrichtigungen mit SignalR-Push). |
| M52 | VideoPortal = rechtegeschützte Video-Zuweisung mit ToDo-Kopplung; SocialMedia = interner Aktivitäten-Stream auf Stored-Procedure-Basis. |
| M53 | WebCart umfasst das gesamte Endkunden-Portal (Belege/Verträge, Tickets, Formulare, Dokumente, Zeitnachweise), nicht nur den Warenkorb. |
| M56 | DocumentSigning (Route `/contractmanagement`) signiert beliebige PDF-Dokumente inkl. SEPA-Mandate über einmalige GUID-Links. |
| M61 | „Mobile" ist ein 37-zeiliger Alt-Lesezugriff auf `NewMobileEmployee`/`NewMobileContactPerson`, kein Mobile-Backend. |
| M62 | docuFORM = OAuth2-Import von Druckgeräte-Seitenzählern für die Click-Abrechnung; DocSync = davon unabhängige Dokumentbereitstellung je Objektart. |
| M66 | „CPra" = Konnektor zum Dienst Nexoware Smartflow; EsCustomerGroups/EsRoles = lokale Caches von ElectronicSales-Webshop-Stammdaten. |
| M69 | ProjectManagement = internes Projekt-/Auslastungsboard, hart codiert auf die Abteilung „Software-Entwicklung"; `Centron.BL\Projects` ist trivialer Altbestand. |
| M71 | Keine Doppelimplementierung: `Modules\Finances\ProductLifecycleManagement` ist nur der Einstellungsdialog des PLM-Moduls. |
| M76 | `Modules\Dashboard` = Modul-Startübersicht (Kacheln), kein Kennzahlen-Dashboard; `Centron.BL\DocuBoard` = Asset-Management-Stammlisten. |
| M79 | Das eigentliche ChangeTracking liegt in `Centron.DAO\ChangeTracking` und `ChangeLogBL`; `Centron.BL\ChangeTracking` enthält nur Import-Historie. |
| M80 | `Centron.BL\Storage` ist seit 2014 vollständig auskommentierte, obsolete Inventur-Altlogik; die Dateiablage liegt clientseitig in `CentronFileSystem` (Backend: FileManagement). |
| M86 | Mandantenverwaltung = Firmenstammdaten/Filialen in EINER Datenbank; keine Mandantentrennung im SaaS-Sinn (kein getrennter Datenraum). |
| M89 | Der Host betreibt ca. 35 über die Tabelle `BackgroundServices` einzeln aktivierbare Hintergrunddienste auf der Basisklasse `ManagedBackgroundService`. |
| M95 | Gutscheinmodul = belegbasierte Statusauswertung (frei/ausgegeben/eingelöst) über `GutscheinZuRechnung`; Ausgabe/Einlösung erfolgt im Belegwesen. |
## Vorgehen im Lauf
Die Analyse folgte den Schritten 0–6 der RRE-Methodenkette: (0) Modulinventar vor der ersten Anforderung, (0b) Mindestabdeckung je Modul, (0c) Vertiefung nach Risiko (Sicherheit, Abrechnung/Fakturierung, Berechtigungen zuerst), (2) Artefakterhebung, (3) technische Analyse, (4) semantische Interpretation, (5) Formalisierung, (6) Traceability. Die 96 Inventarmodule wurden in 12 Analyse-Cluster (A1–A12) aufgeteilt und parallel durch Analyse-Subagenten bearbeitet; jeder Cluster erhielt einen eigenen ID-Nummernkreis (A1=1xx … A12=12xx). Alle PRIMÄR-Belege wurden im Quelltext bzw. im SQL-Schema tatsächlich gelesen; die Codebasis wurde ausschließlich lesend verarbeitet.
## Abdeckungstabelle
Jede Zeile des Modulinventars mit Analysetiefe und Anzahl der daraus erzeugten Anforderungen. Anforderungszahlen enthalten teilweise anteilige Zuordnungen (eine Anforderung kann mehrere Module eines Clusters tragen); Bezugsgröße ist die Abdeckungsangabe des jeweiligen Cluster-Agenten. **Kein Modul ist ohne Anforderung** (Mindestabdeckung erfüllt); kein Modul musste als `nicht analysiert` eingestuft werden.
| Nr. | Modul | Tiefe | Anzahl Anforderungen | Bemerkung |
|---|---|---|---|---|
| M01 | Rechteverwaltung/UserRights | tief | 9 | HasUserRight-Kern, Datenmodell, Gruppenverwaltung, Audit-Log |
| M02 | Authentifizierung Webservice (JWT) | tief | 6 | JwtAuthController, Authorize-Attribute, AuthenticatorFactory |
| M03 | Zwei-Faktor-Authentifizierung | tief | 4 | beide 2FA-Subsysteme analysiert |
| M04 | Passwortmanager | tief | 7 | inkl. Alt-Implementierung (Hypothese SwRS-119) |
| M05 | DSGVO-Funktionen | mittel | 5 | Kontaktlöschung/Cleanup/AVV belegt; Komplettlöschung nicht implementiert |
| M06 | Verträge (Service/Leasing) | tief | 6 | ContractBL vollständig; Auswertungsmodule nur Controller-Ebene |
| M07 | Automatisierte Abrechnung | tief | 7 | AutomaticFacturaBL (2.900 Zeilen) und TimerBillingBL gelesen |
| M08 | Mahnwesen | tief | 6 | DunningBL/DunningRunBL vollständig |
| M09 | OPOS/Zahlungen | tief | 4 | OposBL/PaymentsBL/IncomingPaymentBL vollständig |
| M10 | Onlinebanking/FinAPI | tief | 7 | Matching-Heuristiken; Rechte-Durchsetzung als Hypothese (SwRS-248) |
| M11 | Zahler & Kostenstellen | mittel | 1 | Belegzuordnungslogik nicht vertieft |
| M12 | Buchhaltungsexport (DATEV u. a.) | mittel | 4 | Formatauswahl/Exportflags; Formatgeneratoren nicht im Detail |
| M13 | Gerätezähler (Click-Abrechnung) | tief | 2 | DeviceClickCounterBL vollständig |
| M14 | SEPA | tief | 3 | Online-Signaturprozess mit Statusmaschine |
| M15 | Belegwesen Verkauf | tief | 24 | Belegkette, Storno, Festschreibung, Nummernkreise, MwSt; ReceiptBL (11.441 Zeilen) auszugsweise |
| M16 | Sonderpreise/Preisfindung | tief | 5 | Preisfindungshierarchie, Mindestpreis-Override |
| M17 | Produktmatrix | mittel | 3 | BL + Schema vollständig, UI überflogen |
| M18 | Mailing/Kampagnen | mittel | 4 | Versandpfad nicht vertieft (Hypothese SwRS-350) |
| M19 | E-Rechnung (XRechnung/ZUGFeRD/ebInterface) | mittel | 4 | Formatwahl/Leitweg-ID belegt; XML-Feldmapping nicht Feld für Feld |
| M20 | Belegkonditionen | mittel | 2 | Durchsetzung am Beleg belegt |
| M21 | Artikelstamm & Lager | tief | 14 | Rechte, Bestandsermittlung, gleitender EK, Inventur |
| M22 | Kommissionierung | mittel | 3 | zwei parallele Implementierungen festgestellt |
| M23 | Barcode/Seriennummern | tief | 4 | Statusmodell, Eindeutigkeit, Ausbuchung |
| M24 | Einkauf & Bestellvorschlag | mittel | 3 | Bestellvorschlags-SQL tief; TravelExpense nur gesichtet |
| M25 | EDI (Lieferanten) | mittel | 3 | Formatdispatcher belegt; Distributor-Parser nicht vertieft |
| M26 | Versand/Logistik | mittel | 4 | GLS-Limits und Shipcloud-Broker belegt |
| M27 | RMA/Retouren | mittel | 3 | Statusmaschine SaveRma tief |
| M28 | Produktdaten-Anbindungen | flach | 2 | Icecat/ITscope/EGIS gelesen; CopDataAccess nicht analysiert |
| M29 | TradePool | flach | 1 | fachlicher Zweck unklar (Hypothese SwRS-451) |
| M30 | Helpdesk/Ticketsystem | tief | 12 | Statusmodell, Rechte, Fälligkeit, Eskalation, Abschluss |
| M31 | Zeiterfassung auf Tickets | tief | 8 | serverseitige Rechte belegt; MOVE-Recht nur clientseitig |
| M32 | Checklisten | mittel | 2 | kein hartes Abschluss-Gate gefunden |
| M33 | Expected Events | mittel | 2 | Auswertungskomponente außerhalb der Codebasis (Hypothese SwRS-545) |
| M34 | SelfCare | mittel | 3 | GUID-/Ablauflogik belegt |
| M35 | TaskManager | mittel | 2 | Wiederholungsregeln, Handler, Lizenzprüfung |
| M36 | Umfragen | mittel | 2 | Antwort-Erfassung (ServiceBoard) nicht analysiert |
| M37 | Ticket-Projekte | flach | 1 | CRUD/Nummernkreis belegt |
| M38 | Adress-/Kundenstamm | tief | 12 | AccountBL/WebAccountBL gelesen |
| M39 | Mitarbeiterstamm | mittel | 5 | EmployeeBL/AppUserBL gelesen |
| M40 | Geräte/Assets/Stammblätter | tief | 7 | Drei-Datenhaltungen-Befund dokumentiert |
| M41 | Länder/Regionen | mittel | 2 | CountryBL/FederalStateBL vollständig |
| M42 | Tags & Custom Properties | tief | 3 | Pflichtfeldprüfung nur clientseitig |
| M43 | Objekt-Externreferenzen | tief | 1 | Detailregeln in SyRS-612; Tabelle fehlt im SQL-Dump |
| M44 | Mail (Versand/Empfang), MailScanner | tief | 8 | Absender-Whitelist, VMA-Verschlüsselung |
| M45 | Mail-Vorlagen | tief | 3 | Fallback-Hierarchie belegt |
| M46 | Kalender/Termine | mittel | 4 | CalendarBL/AppointmentRequestBL vollständig |
| M47 | Outlook/Exchange | mittel | 2 | Sync teils über Doku (KONTEXT) erfasst |
| M48 | Telefonie (TAPI) | tief | 4 | PhoneCallBL/PhoneSettingsBL gelesen |
| M49 | Chats | tief | 2 | Mitgliedschafts-Expressions belegt |
| M50 | Benachrichtigungen | mittel | 3 | zwei Systeme (Konsolidierungskandidat) |
| M51 | MyCentron/MyDay/ToDo | tief | 6 | Rechteprüfungen FREMDTODOLISTE belegt |
| M52 | Social Media / VideoPortal | mittel | 3 | SocialMedia-Logik in Stored Procedures (Hypothese SwRS-748) |
| M53 | Nexus WebCart | tief | 5 | Freigabewesen bis in die BL verfolgt |
| M54 | Nexus WebOffer | mittel | 2 | Token-Flow und Zustandsmodell |
| M55 | Nexus ServiceBoard | mittel | 3 | CloseTicket/Auth vertieft; Kanban/Scheduler strukturell |
| M56 | Nexus DocumentSigning | mittel | 2 | Signaturseite und DsgvoBL vollständig |
| M57 | Nexus Produktionsaufträge | mittel | 2 | Auth-Lücke als Hypothese (SwRS-848) |
| M58 | REST-API (Centron.Controllers) | tief | 10 | alle Authorization-Klassen und Filter gelesen |
| M59 | Legacy-Webservices | flach | 2 | 2.530 Dateien, vereinbarungsgemäß nur strukturell |
| M60 | ConnectionManager/Hosts | mittel | 2 | beide Host-Einstiege gelesen |
| M61 | Mobile | tief | 1 | Modul vollständig (37 Zeilen), Altbestand |
| M62 | DocSync/docuFORM | mittel | 4 | Tokenfluss und Importablauf gelesen |
| M63 | RMM-Connectors | tief | 8 | RmmController/RiverDivoBL/DocBee-BLs vollständig |
| M64 | TelekomDive | mittel | 3 | Export-ViewModel und BL gelesen |
| M65 | Datenimport/-export generisch | flach | 2 | Kontenimport belegt; InvoiceUpload ist leerer Stub |
| M66 | Integrations/RiverDivo/CPra | mittel | 5 | EsRoleBL nur Kopf geprüft |
| M67 | Gateway | flach | 2 | Struktur inventarisiert, Adapter nicht im Detail |
| M68 | Produktion | tief | 4 | Statusmodell, Logkatalog, Schema |
| M69 | Projektmanagement | mittel | 2 | interner Sonderfall (hart codierte Abteilung) |
| M70 | Projektpreisimport | mittel | 1 | Import-/Differenzlogik gelesen |
| M71 | PLM | tief | 3 | Konsolidierungsfrage geklärt (keine Doppelimplementierung) |
| M72 | QM | mittel | 2 | Durchsetzung in ReceiptBL/CustomerAssetBL |
| M73 | Statistiken | tief | 6 | Rechte-/Abrechnungslogik (MSP) im Fokus |
| M74 | Reporting/ReportEngine | tief | 5 | doppelte Berichts-Datenhaltung belegt |
| M75 | Massenupdates | tief | 3 | alle vier Start-Pfade gesichtet |
| M76 | Dashboard/DocuBoard | mittel | 2 | drei DocuBoard-BLs vollständig |
| M77 | Persistenzschicht/DB-Schema | tief | 6 | Transaktionen, Listener, Konventionen, Constraints |
| M78 | Volltextsuche (IndexSearch) | tief | 4 | alle Kerndateien + Schema |
| M79 | ChangeTracking | mittel | 4 | Attribut-Mechanismus ungenutzt (Befund) |
| M80 | Dateiablage | mittel | 2 | BL\Storage als obsolet eingestuft; Server-BL als Hypothese (SyRS-1119) |
| M81 | Lokalisierung | mittel | 2 | LocalizationHelper vollständig |
| M82 | Logging/Telemetrie | tief | 4 | TelemetryBL vollständig; Schema-Drift festgestellt |
| M83 | KI-Funktionen | mittel | 3 | SSRF-Schutz und Schlüssel-Verschlüsselung belegt |
| M84 | UI-Framework/GUI-Profile | mittel | 2 | Controls strukturell; Profil-Rechtelogik tief |
| M85 | Externe Tools | mittel | 2 | BL vollständig |
| M86 | Mandantenverwaltung | tief | 6 | serverseitige Rechteprüfung offen (Hypothese SwRS-1233) |
| M87 | Einstellungsverwaltung | tief | 5 | beide Settings-Tabellen (Stammdat/ApplicationSettings) |
| M88 | Textbausteine | mittel | 3 | TextModuleBL vollständig |
| M89 | Hintergrunddienste | tief | 4 | ~35 Dienste auf gemeinsamer Basisklasse |
| M90 | Eskalationsregeln | mittel | 2 | Kernberechnung DoEscalation nicht gelesen |
| M91 | PDF-Export/-Signierung | tief | 5 | PdfSigningBL vollständig |
| M92 | Deployment/Betrieb | mittel | 2 | Docker/Compose/Windows-Dienst gelesen |
| M93 | Stundenzuschlagssätze | mittel | 2 | serverseitige BL nicht gelesen |
| M94 | Update-Benachrichtigung | mittel | 2 | Versions- und Zielgruppenlogik gelesen |
| M95 | Gutscheinverwaltung | mittel | 1 | NamedQuery vollständig analysiert |
| M96 | Web-Links/URLs | mittel | 1 | SimpleUrl vs. WebLink (Konsolidierungskandidat) |
**Zusammenfassung der Analysetiefe:** 42 Module tief, 48 Module mittel, 6 Module flach (M28, M29, M37, M59, M65, M67), 0 Module nicht analysiert. Zusätzlich wurden Querschnittsthemen ohne eigene Inventarzeile erfasst (Login/Sessions, Architektur-Schichtung, Heartbeat, Teststrategie, Profiling, SqlManagers).
## Konsistenzcheck über das gesamte Anforderungs-Set
Der Check wurde skriptgestützt über alle 413 Anforderungsblöcke (StRS.md, SyRS.md, SwRS.md) ausgeführt.
| Prüfung | Ergebnis |
|---|---|
| Anforderungen gesamt | **413** (50 StRS, 122 SyRS, 241 SwRS) |
| Doppelte oder mehrfach vergebene IDs | **keine** (413 eindeutige IDs; Hinweis: SwRS-240 wurde nicht vergeben — dokumentierte Lücke im Nummernkreis A2, kein fehlender Inhalt) |
| Anforderungen ohne Beleg | **keine** (jede Anforderung führt mindestens einen klassifizierten Beleg mit Begründung) |
| Anforderungen ohne Prüfidee | **keine** |
| Anforderungen ohne Angabe zur Übernahmewürdigkeit | **keine** |
| Tracelinks auf nicht existierende IDs | **keine** (alle referenzierten IDs existieren) |
| Anforderungen ohne Tracelinks | **keine** |
| Nicht-funktionale Anforderungen ohne ISO-25010-`Qualitätsmerkmal` | **keine** (21 nicht-funktionale Anforderungen, alle mit Merkmal) |
| Status-Verteilung | 397 `belegt`, 16 `HYPOTHESE` (3,9 %) |
| Abgleich `Hypothesen.md` gegen Inline-Markierungen | **deckungsgleich**: beide Seiten nennen exakt dieselben 16 IDs (SyRS-110, SyRS-1119; SwRS-119, 248, 350, 354, 451, 545, 637, 740, 748, 848, 947, 1043, 1147, 1233); `Hypothesen.md` enthält keine zusätzlichen freien Fragen |
| Konsolidierungskandidaten | 44 Anforderungen (10,7 %) mit `Konsolidierung: Kandidat` |
| Risikoanforderungen (Sicherheit, Abrechnung/Fakturierung, Berechtigungen) | **198**; jede trägt entweder mindestens einen `PRIMÄR`-Beleg mit durchsetzender Stelle oder ist als `HYPOTHESE` gekennzeichnet — **0 Verstöße** gegen die risikobasierte Priorisierung (skriptgeprüft) |
| Inhaltlich deckungsgleiche Anforderungen ohne Konsolidierungsmarkierung | keine gefunden; die bekannten Doppelimplementierungen (siehe Konsolidierungsübersicht) sind in den betroffenen Anforderungen als Kandidat markiert. Restrisiko: clusterübergreifende Dubletten wurden über die Meta-Abgleiche geprüft, eine paarweise Volltextprüfung aller 413 Anforderungen fand nicht statt |
### Konsolidierungsübersicht (fachlich gleichartige Konzepte in getrennten Implementierungen)
Wichtigste clusterübergreifend bestätigte bzw. vermutete Konsolidierungsfälle für das Zielsystem:
1. **Kundengeräte in drei Datenhaltungen** (bestätigt): „Stammblätter" `MasterDataList` (Drucker mit Klickzählern), `AccountDevices` (sonstige Hardware), AssetManagement-/River-Sync-Geräte — der im Auftrag genannte Fall, um eine dritte Datenhaltung erweitert.
2. **Zwei Berechtigungssysteme**: `Sichrech`/`Sichtrus`/`Sichmemb` (AppUser) vs. `WebRights`/`WebAccountsRights` (WebAccounts); dazu doppelter API-Zugriffsschutz (REST-Attributfilter vs. Legacy-`AuthenticateInterceptor`).
3. **Zwei 2FA-Subsysteme** (Login-2FA RADIUS/E-Mail vs. TOTP-PIN des Passwortmanagers) und **zwei Passwortmanager-Implementierungen** (alt/neu).
4. **Zahlungsausgleich doppelt**: IncomingPayments vs. OnlineBanking-Zuordnungen, beide über `UpdateReceiptIsPaid`; **Kostenstellen doppelt**: `Warehousing.CostCenter` vs. `Accounts.CustomerCostCenter`.
5. **Vertragsauswertung doppelt** (ContractEvaluation2 vs. „_old"); **Berichts-Datenhaltung doppelt** (`dbo.Reports` vs. `dbo.ReportData`); **Einstellungs-Datenhaltung doppelt** (`Stammdat` vs. `ApplicationSettings`).
6. **Drei E-Rechnungs-Generatoren** (ZUGFeRD/XInvoice, ebInterface, Gateway `ZUGFeRD21_Extended`); **Beleg-Summenlogik doppelt** (`ReceiptPriceHelper` vs. `CalculationUtils`).
7. **Lager/Logistik intern**: Inventur alt/neu, Kommissionierung (`CommissioningBL` vs. `OrderCommissionBL`), `BarCode` vs. `BarCode2`, GLS-Direktanbindung vs. Shipcloud-Broker, RMA-Alt-Tabellen; **duale Bestandsermittlung** (Seriennummernzählung vs. Mengenfeld, Regel doppelt in SQL und C#).
8. **Kommunikation**: zwei Benachrichtigungssysteme (`Notifications` vs. `NexusNotifications`), zwei Kalender-Sync-Pfade (EWS vs. Graph), zwei Anrufjournal-Befüllungen (TAPI vs. Teams-CallRecords), Mail-Body-Aufbau doppelt (`FillMailBodyOld`/`New`).
9. **Externe Referenzen dreifach** (generische `ObjectExternalReference`, `RiverbirdCustomerReference`, `EsCustomerGroup.ExternalId`); **„externes Ereignis → Ticket" dreifach** (RiverDivo, DocBee-Timer, DocBee-Creation).
10. **Weitere**: `SimpleUrl` vs. `WebLink`, `NewMobileEmployee` vs. Mitarbeiterstamm, zwei tokenbasierte Dokumentsignatur-Pfade (DocumentSigning vs. Office/SharedDocument), Adress-Doppelhaltung neu (`AccountAddresses`) vs. alt (`Anschrif`/`Address`), Entitäten `Mandator`/`Mandatory` auf derselben Tabelle `Mandant`, TicketProjects neben allgemeinem Projektmodul, Rechte-Doku doppelt (`CentronRights.md` vs. `Sichrech.Beschreibung`).
## Liste aller risikorelevanten Anforderungen
Alle 198 Anforderungen zu Sicherheit, Abrechnung/Fakturierung und Berechtigungen mit ihrer Belegsituation (skriptgeprüft: jede Zeile hat `PRIMÄR = ja` oder `Status = HYPOTHESE`). Vollständige Titel und Belege in StRS.md/SyRS.md/SwRS.md.
### A1 — Sicherheit, Identität, Berechtigungen (37)
| ID | Titel | PRIMÄR | Status |
|---|---|---|---|
| StRS-101 | Rollenbasierte Zugriffskontrolle für alle Fachfunktionen | ja | belegt |
| StRS-102 | Gesicherte Anmeldung für interne Benutzer und Kunden | ja | belegt |
| StRS-103 | Schutz und Nachvollziehbarkeit von Kundenzugangsdaten | ja | belegt |
| StRS-104 | DSGVO-konforme Löschung und Bereinigung personenbezogener Daten | ja | belegt |
| SyRS-101 | Durchgängige Berechtigungsprüfung an allen Systemschnittstellen | ja | belegt |
| SyRS-102 | Administrierbarkeit des Rechtesystems mit Protokollierung | ja | belegt |
| SyRS-103 | Sitzungsverwaltung über Tickets mit begrenzter Lebensdauer | ja | belegt |
| SyRS-104 | Konfigurierbare Authentifizierungsverfahren mit benutzerbezogenem Fallback | ja | belegt |
| SyRS-105 | Zwei-Faktor-Authentifizierung systemweit zuschaltbar | ja | belegt |
| SyRS-106 | Getrennte Identitäten AppUser/WebAccount | ja | belegt |
| SyRS-107 | Kontodeaktivierung verhindert Anmeldung | ja | belegt |
| SyRS-108 | Passwortmanager mit Lizenz-, Richtlinien- und Protokollpflicht | ja | belegt |
| SyRS-109 | DSGVO-Funktionen nur mit dediziertem Recht | ja | belegt |
| SyRS-110 | Serverseitige Durchsetzung aller UI-Rechte | nein | HYPOTHESE |
| SwRS-101 | Benutzerrechtsprüfung über Gruppenmitgliedschaft | ja | belegt |
| SwRS-102 | Rechte-Datenmodell und zentrale Rechtekonstanten | ja | belegt |
| SwRS-103 | Rechtegruppenverwaltung mit Admin-Gruppen-Schutz | ja | belegt |
| SwRS-104 | Protokollierung aller Rechteänderungen | ja | belegt |
| SwRS-105 | REST-Autorisierung über Rechte-Attribute (401/403) | ja | belegt |
| SwRS-106 | JWT-/OIDC-Login mit Subject-Zuordnung | ja | belegt |
| SwRS-107 | Basic-Auth über SHA1-Passworthash | ja | belegt |
| SwRS-108 | Abweisung deaktivierter Konten | ja | belegt |
| SwRS-109 | Ticket-Lebensdauer und Verlängerung | ja | belegt |
| SwRS-110 | Passwortänderung mit Ist-Passwort-Prüfung und Mindestlänge | ja | belegt |
| SwRS-111 | Web-Account-Login mit Aktivitätskette | ja | belegt |
| SwRS-112 | Entscheidungslogik Zwei-Faktor-Bestätigung | ja | belegt |
| SwRS-113 | E-Mail-Link-Zweitfaktor mit Einmalcode | ja | belegt |
| SwRS-114 | TOTP-PIN-Prüfung für Passwortmanager | ja | belegt |
| SwRS-115 | Passwortmanager-Rechteprüfungen | ja | belegt |
| SwRS-116 | Export von Zugangsdaten nur mit Exportrecht | ja | belegt |
| SwRS-117 | AES-Verschlüsselung mit Masterkey und Fallback-Schlüssel | ja | belegt |
| SwRS-118 | Siegelbruch mit Recht, Kommentar, Protokoll, Mail | ja | belegt |
| SwRS-119 | Alt-Passwortverwaltung ohne wirksame Verschlüsselung | teilweise | HYPOTHESE |
| SwRS-120 | DSGVO-Kontaktlöschung mit Löschprotokoll | ja | belegt |
| SwRS-121 | DSGVO-Datenbereinigung und Modulzugang | ja | belegt |
| SwRS-122 | AVV-Verwaltung mit eigenen Rechten | ja | belegt |
| SwRS-1233 | Serverseitige Rechteprüfung beim Speichern von Mandantenstammdaten (A12) | nein | HYPOTHESE |
### A2 — Finanzen & Abrechnung (44)
| ID | Titel | PRIMÄR | Status |
|---|---|---|---|
| StRS-201 | Wiederkehrende vertragsbasierte Abrechnung | ja | belegt |
| StRS-202 | Forderungsmanagement und Zahlungsabgleich | ja | belegt |
| StRS-203 | Ordnungsgemäße Übergabe an die Finanzbuchhaltung | ja | belegt |
| StRS-204 | Digitale SEPA-Mandatsverwaltung | ja | belegt |
| StRS-205 | Zugriffsschutz auf Finanzfunktionen | ja | belegt |
| SyRS-206 | Abrechnungsintervalle und Zeitraumfortschreibung | ja | belegt |
| SyRS-207 | Verknüpfung Rechnung–Vertrag und Kontingentbuchung | ja | belegt |
| SyRS-208 | Vertragslebenszyklus | ja | belegt |
| SyRS-209 | Click-/Zählerabrechnung | ja | belegt |
| SyRS-210 | Abrechnung von Ticketzeiten | ja | belegt |
| SyRS-211 | Mahn- und OPOS-Läufe mit Versand | ja | belegt |
| SyRS-212 | OPOS-/Mahnübersicht mit Salden | ja | belegt |
| SyRS-213 | Zahlungseingänge und Rechnungsausgleich | ja | belegt |
| SyRS-214 | Bankauszugsimport und Zahlungsabgleich | ja | belegt |
| SyRS-215 | Externe Schnittstelle finAPI | ja | belegt |
| SyRS-216 | Multiformat-Buchhaltungsexport | ja | belegt |
| SyRS-217 | SEPA-Mandat-Onlineprozess | ja | belegt |
| SyRS-218 | Serverseitige Rechte-/Lizenzprüfung | ja | belegt |
| SwRS-230 | Vertragsende-Berechnung | ja | belegt |
| SwRS-231 | Automatischer Vertragsabschluss | ja | belegt |
| SwRS-232 | Kontingentrest-Formel | ja | belegt |
| SwRS-233 | Abrechnungstermin/Normierung | ja | belegt |
| SwRS-234 | Kontingentbuchung abweichende Intervalle | ja | belegt |
| SwRS-235 | Vertragsauswahl Abrechnungslauf | ja | belegt |
| SwRS-236 | Folge-ToDo nach Abrechnung | ja | belegt |
| SwRS-237 | Mahnstufen-Statusmaschine | ja | belegt |
| SwRS-238 | Mahnlauf-Protokoll | ja | belegt |
| SwRS-239 | Mahnreife (Sperre/Fälligkeit) | ja | belegt |
| SwRS-241 | Versandvoraussetzungen Mahn-E-Mail | ja | belegt |
| SwRS-242 | Zahlungseingang löschen (Rechte/Rückrechnung) | ja | belegt |
| SwRS-243 | OPOS-Saldenformel | ja | belegt |
| SwRS-244 | Duplikaterkennung Umsatzimport | ja | belegt |
| SwRS-245 | Abschlussstatus mit Toleranz | ja | belegt |
| SwRS-246 | Matching-Heuristiken | ja | belegt |
| SwRS-247 | Buchung/Chargeback/Storno | ja | belegt |
| SwRS-248 | Kontoauszugs-Rechte serverseitig | nein | HYPOTHESE |
| SwRS-249 | Export-Doppelschutz | ja | belegt |
| SwRS-250 | Steuer-Mapping Export | ja | belegt |
| SwRS-251 | Zählerhistorie/Monotonie | ja | belegt |
| SwRS-252 | SEPA-Mandatsdaten | ja | belegt |
| SwRS-253 | Kostenstellen/Kostenträger Soft-Delete | ja | belegt |
| SwRS-254 | Editierschutz Ticketzeiten | ja | belegt |
| SwRS-255 | Gutschein-Lebenszyklus | ja | belegt |
| SwRS-1246 | Validierung/Log der Stundenzuschlagssätze (A12) | ja | belegt |
### A3 — Vertrieb & Belegwesen (22)
| ID | Titel | PRIMÄR | Status |
|---|---|---|---|
| StRS-302 | Korrekte und revisionssichere Fakturierung | ja | belegt |
| SyRS-312 | Belegnummernvergabe aus konfigurierbaren Nummernkreisen | ja | belegt |
| SyRS-313 | Mehrwertsteuerberechnung je Steuersatz mit definierter Rundung | ja | belegt |
| SyRS-314 | Revisionssichere Rechnung: Storno und Festschreibung | ja | belegt |
| SyRS-315 | Berechtigungsprüfung im Belegwesen | ja | belegt |
| SyRS-316 | Forderungsüberwachung: Mahnwesen und Kreditlimit | ja | belegt |
| SyRS-317 | Automatische Preisfindung mit Schutz des Mindestpreises | ja | belegt |
| SyRS-318 | E-Rechnungs-Export und -Import | ja | belegt |
| SwRS-334 | Nebenläufigkeitssichere Nummernvergabe | ja | belegt |
| SwRS-336 | MwSt-Splitting und Rundungsregeln | ja | belegt |
| SwRS-337 | MwSt-Pflichtprüfungen beim Belegspeichern | ja | belegt |
| SwRS-338 | Stornoregeln für Rechnungen | ja | belegt |
| SwRS-339 | Rechnungsfestschreibung mit Protokollierung | ja | belegt |
| SwRS-340 | Belegart-spezifische Rechteprüfungen inkl. Filialbindung | ja | belegt |
| SwRS-341 | Mahnstufen-Statusmaschine und Neuanlagesperre | ja | belegt |
| SwRS-342 | Kreditlimitprüfung beim Speichern | ja | belegt |
| SwRS-347 | Mindestpreis-Übersteuerung nur durch berechtigten Benutzer | ja | belegt |
| SwRS-350 | Werbesperre beim Mailingversand | nein | HYPOTHESE |
| SwRS-351 | E-Rechnungs-Formatauswahl und Dateierzeugung | ja | belegt |
| SwRS-352 | Authentifizierter ZUGFeRD-Parse-Endpunkt | ja | belegt |
| SwRS-353 | Konditionstexte am Beleg (Zahlungskonditionen) | ja | belegt |
| SwRS-354 | Manueller Storno für Nicht-Rechnungsbelege | nein | HYPOTHESE |
### A4 — Artikel, Lager, Einkauf, Logistik (7)
| ID | Titel | PRIMÄR | Status |
|---|---|---|---|
| SyRS-411 | Berechtigungsmodell für Artikelpflege und Lagerbuchungen | ja | belegt |
| SyRS-412 | Lückenlose Protokollierung aller Bestandsänderungen | ja | belegt |
| SyRS-419 | Berechtigungsgeschützte Kommissionierung mit Mengenrückmeldung | ja | belegt |
| SwRS-430 | Feingranulare Rechteprüfung beim Artikelspeichern | ja | belegt |
| SwRS-432 | Gleitender Einkaufspreis bei Wareneingang | ja | belegt |
| SwRS-433 | Lagerumbuchung nur mit Recht TRANSFER_STOCK | ja | belegt |
| SwRS-439 | Zugriffsschutz des Kommissioniermoduls | ja | belegt |
### A5 — Helpdesk & Service (15)
| ID | Titel | PRIMÄR | Status |
|---|---|---|---|
| StRS-502 | Abrechnungsfähige und rechtssichere Zeiterfassung auf Tickets | ja | belegt |
| SyRS-512 | Berechtigungsgeprüfte Ticketbearbeitung (intern und Web-Accounts) | ja | belegt |
| SyRS-513 | Fälligkeitsberechnung aus Priorität, geschütztes Fälligkeitsdatum | ja | belegt |
| SyRS-515 | Rechte- und Sperrkonzept der Ticket-Zeiterfassung | ja | belegt |
| SyRS-516 | Kundenunterschrift auf erbrachten Zeiten | ja | belegt |
| SyRS-517 | Automatische Ticketerzeugung durch den TaskManager | ja | belegt |
| SyRS-518 | Zeitlich begrenzte SelfCare-Formularlinks | ja | belegt |
| SwRS-533 | Serverseitige Rechteprüfung beim Ticket-Speichern | ja | belegt |
| SwRS-534 | Rechteprüfung für Portal-Web-Accounts mit Eigentümerbindung | ja | belegt |
| SwRS-538 | Zeiten speichern nur mit EDIT_TIME, Eigenzeiten-Beschränkung, Belegsperre | ja | belegt |
| SwRS-539 | Zeiten löschen mit DELETE_HELPDESK_TIMER, Belegsperre, Historie | ja | belegt |
| SwRS-541 | Unterschrift entfernen nur mit DELETE_HELPDESK_SIGNATURE | ja | belegt |
| SwRS-542 | Zeiten verschieben mit mehrstufiger Prüfkette (MOVE-Recht nur clientseitig) | ja | belegt |
| SwRS-546 | SelfCare-Webformulare: GUID, Ablauf, Formulardefinitionen | ja | belegt |
| SwRS-547 | TaskManager: Wiederholungsregeln, Handler-Dispatch, automatische Tickets | ja | belegt |
### A6 — Stammdaten & Assets (10)
| ID | Titel | PRIMÄR | Status |
|---|---|---|---|
| SyRS-605 | Berechtigungsprüfung aller Geschäftspartner-Operationen | ja | belegt |
| SyRS-607 | Systemweit eindeutige Benutzer-Logins über Kontoarten hinweg | ja | belegt |
| SyRS-608 | Geschützte Mitarbeiterverwaltung mit automatischer Personalakte | ja | belegt |
| SwRS-620 | Operationsbezogene Rechteprüfung in AccountBL inkl. Betreuer-Einschränkung | ja | belegt |
| SwRS-624 | Feldbezogene Rechte für Adresssprache/-währung mit Wertrücksetzung | ja | belegt |
| SwRS-625 | Ansprechpartnerpflege mit rollenabhängigen Rechten | ja | belegt |
| SwRS-627 | Dublettenprüfung von Logins und OpenID-Kennungen | ja | belegt |
| SwRS-628 | Mitarbeiterspeicherung mit Rechteprüfung und Personalakten-Ordnern | ja | belegt |
| SwRS-631 | Seriennummernwechsel am Stammblatt nur ohne aktive Klickzähler | ja | belegt |
| SwRS-637 | Berechtigungsprüfung der Kundengeräteverwaltung (Negativbefund) | nein | HYPOTHESE |
### A7 — Kommunikation & Organisation (9)
| ID | Titel | PRIMÄR | Status |
|---|---|---|---|
| SyRS-712 | Freischaltung von Absenderadressen beim Mailversand | ja | belegt |
| SyRS-714 | Virtual Mail Assistant: Zugriffsschutz, verschlüsselte Zugangsdaten | ja | belegt |
| SyRS-719 | Tagesabschluss- und Aufgabenverwaltung (Berechtigungslogik) | ja | belegt |
| SwRS-738 | MailScanner-Profile: Rechteprüfung und Master-Key-Verschlüsselung | ja | belegt |
| SwRS-742 | Teams-CallRecords-Sync (Lizenzprüfung) | ja | belegt |
| SwRS-743 | Chat: mitgliedschaftsbasierte Zugriffskontrolle | ja | belegt |
| SwRS-744 | NexusNotification-Massenoperationen nur auf eigene Einträge | ja | belegt |
| SwRS-745 | ToDo-Fremdzugriffs-Rechte | ja | belegt |
| SwRS-747 | VideoPortal-Zuweisung nur mit Recht | ja | belegt |
### A8 — Web-Client Nexus & Service-Schnittstellen (20)
| ID | Titel | PRIMÄR | Status |
|---|---|---|---|
| StRS-803 | Abgesicherte Service-Schnittstellen für Clients und Integrationen | ja | belegt |
| SyRS-811 | Policy-basierter Zugriffsschutz (LoginType, Rechte, Lizenz, Port) in Nexus | ja | belegt |
| SyRS-812 | Mehrstufiges Freigabewesen für Warenkörbe im WebCart | ja | belegt |
| SyRS-813 | Token-basierte Angebotsannahme (WebOffer) | ja | belegt |
| SyRS-814 | Online-Signatur von Dokumenten über einmaligen GUID-Link | ja | belegt |
| SyRS-815 | Sichtbarkeitsbeschränkung von Portal-Tickets auf den eigenen Kunden | ja | belegt |
| SyRS-817 | REST-API: JWT-Authentifizierung, Benutzerrechte, 401/403-Semantik | ja | belegt |
| SyRS-818 | Legacy-API: Pflicht-Authentifizierung per Ticket oder Access-Token | ja | belegt |
| SwRS-831 | UserRight-Autorisierungsfilter (Einzel-, Any-, All-Semantik) | ja | belegt |
| SwRS-832 | Hosted-only-Endpunkte über Lizenz CentronInternal | ja | belegt |
| SwRS-833 | JwtAuthController: OpenID-Connect-Login und Kontoverknüpfung | ja | belegt |
| SwRS-834 | 2FA-Code-Validierung über anonymen Bestätigungslink | ja | belegt |
| SwRS-835 | Rechteprüfung WEBACCOUNT_MANAGEMENT in der WebAccount-BL | ja | belegt |
| SwRS-836 | Interceptor-basierte Ticket-/Access-Token-Prüfung mit Sperren | ja | belegt |
| SwRS-839 | ClaimsService: Rechte/Web-Rechte/Lizenzen als Rollen-Claims | ja | belegt |
| SwRS-840 | PortHandler: getrennte Ports für Host- und Kundenportal-Bereich | ja | belegt |
| SwRS-841 | ReceiptCart-Guards: Lizenz, Web-Account-Recht, Kartenzugriff | ja | belegt |
| SwRS-842 | OrdererApproveCart: Pflichtfelder, Statuswechsel, Auftragserzeugung | ja | belegt |
| SwRS-845 | HelpdeskSearchBL: Expression-Filter für Web-Account-Logins | ja | belegt |
| SwRS-848 | Produktionsübersicht ohne deklarativen Autorisierungsschutz (Negativbefund) | nein | HYPOTHESE |
### A9 — Datenaustausch & Integrationen (10)
| ID | Titel | PRIMÄR | Status |
|---|---|---|---|
| SyRS-911 | Zugriffsschutz der RMM-REST-Schnittstelle per Zugriffsschlüssel | ja | belegt |
| SyRS-912 | Integrations-Zugangsdaten nur mit Admin-Recht, verschlüsselte Ablage | ja | belegt |
| SyRS-918 | Kundenisolation beim Datenabruf über Web-Zugänge | ja | belegt |
| SwRS-931 | Zeitkonstante Prüfung des RMM-Zugriffsschlüssels | ja | belegt |
| SwRS-932 | RMM-Einstellungen: Rechteprüfung und AES-Verschlüsselung | ja | belegt |
| SwRS-936 | Idempotente DocBee-Zeitbuchungsübernahme mit Abrechnungssteuerung | ja | belegt |
| SwRS-937 | DocBee-Konnektor: Aktivierung über Lizenz/Recht | ja | belegt |
| SwRS-938 | docuFORM-Zugangsdaten mit Masterkey-Verschlüsselung | ja | belegt |
| SwRS-939 | Gerätezähler-Import von docuFORM (abrechnungsrelevant) | ja | belegt |
| SwRS-947 | Berechtigungsschutz Pflege Integrationsstammdaten (Negativbefund) | nein | HYPOTHESE |
### A10 — Produktion, Projekte, Statistik, Reporting (11)
| ID | Titel | PRIMÄR | Status |
|---|---|---|---|
| SyRS-1010 | Lizenzgate für alle Produktionsfunktionen | ja | belegt |
| SyRS-1012 | Rechtebasierter Zugriff auf Statistiken und Kennzahlen | ja | belegt |
| SyRS-1014 | Ad-hoc-SQL-Ausführung nur mit Administrationsrecht | ja | belegt |
| SyRS-1017 | MSP-Nutzungsimport und Vertragsabgleich (Abrechnung) | ja | belegt |
| SwRS-1037 | Verkaufsstatistik: Rechte, Filiallimitierung, Web-Account-Schutz | ja | belegt |
| SwRS-1038 | Management-Info-Kennzahlen mit Filialbeschränkung | ja | belegt |
| SwRS-1039 | MSP-Import: Schemata, Duplikatschutz, verschlüsselte Zugangsdaten | ja | belegt |
| SwRS-1040 | MSP-Evaluation: Vertragsanpassung mit Historie | ja | belegt |
| SwRS-1041 | ReportEngine-Abfrageausführung mit Variablenersetzung | ja | belegt |
| SwRS-1044 | Beleg-Massenpreisupdate (Abrechnungsschutzregeln) | ja | belegt |
| SwRS-1045 | Artikel-/Kontenmassenupdate mit Logs | ja | belegt |
### A11 — Plattform & Querschnitt (7)
| ID | Titel | PRIMÄR | Status |
|---|---|---|---|
| SyRS-1113 | Verbindungs- und Lizenzüberwachung per Heartbeat | ja | belegt |
| SyRS-1118 | Konfigurierbare KI-Provider-Anbindung mit abgesicherten Endpunkten | ja | belegt |
| SyRS-1121 | Arbeitsplatz-Anpassung über GUI-Profile und externe Tools | ja | belegt |
| SwRS-1134 | Protokollierung von Stundensatz-Zuschlagsänderungen | ja | belegt |
| SwRS-1141 | Validierung der KI-Endpunkt-URLs (SSRF-Schutz) | ja | belegt |
| SwRS-1142 | Verschlüsselte Ablage der KI-API-Schlüssel | ja | belegt |
| SwRS-1145 | Rechteprüfung für globale GUI-Profile | ja | belegt |
### A12 — Administration & Betrieb (6)
*SwRS-1233 ist oben unter A1, SwRS-1246 unter A2 gelistet (thematische Zuordnung).*
| ID | Titel | PRIMÄR | Status |
|---|---|---|---|
| SyRS-1216 | PDF-Signierung als Systemdienst | ja | belegt |
| SyRS-1218 | Stundenzuschlagsmodelle für die Vertragsabrechnung | ja | belegt |
| SwRS-1234 | Mandantenspezifischer KI-Systemprompt nur mit Recht und Lizenz | ja | belegt |
| SwRS-1242 | Rechteprüfung/Verschlüsselung der PDF-Signierungseinstellungen | ja | belegt |
| SwRS-1243 | PDF-Signaturvorgang PKCS#7/SHA256/TSA | ja | belegt |
| SwRS-1245 | Serverseitige Rechteprüfung für Ad-hoc-SQL im SQL-Manager | ja | belegt |
## Selbstbewertung
### Mengengerüst und Abdeckung
- **Analysetiefe über das Inventar (96 Module):** 42 tief, 48 mittel, 6 flach (M28 Produktdaten-APIs, M29 TradePool, M37 Ticket-Projekte, M59 Legacy-Webservices, M65 generischer Datenim-/-export, M67 Gateway), **0 nicht analysiert**.
- **Mindestabdeckung erreicht:** Ja — jedes der 96 Inventarmodule hat mindestens eine Anforderung; kein Modul benötigte die Ausweichkennzeichnung `nicht analysiert`.
- **Anforderungen:** 413 gesamt (50 StRS, 122 SyRS, 241 SwRS), davon 16 Hypothesen (3,9 %), 21 nicht-funktionale mit ISO-25010-Merkmal, 198 risikorelevante (alle regelkonform belegt oder als Hypothese gekennzeichnet), 44 Konsolidierungskandidaten.
- **Belegbasis:** Alle PRIMÄR-Belege wurden im Quelltext bzw. SQL-Schema gelesen; für risikorelevante Anforderungen benennt der PRIMÄR-Beleg durchgängig die durchsetzende Stelle (Datei, Klasse, Methode, konkrete Prüfung).
### Wo der Beleg dünn war
- **Negativbefunde als Hypothesen:** Mehrere sicherheitsrelevante Hypothesen beruhen auf der Abwesenheit einer Prüfung (SwRS-637 AccountDeviceBL ohne Rechteprüfung, SwRS-848 `/production/overview` ohne Authorize-Policy, SwRS-947 Integrationsstammdaten, SwRS-1233 Mandantenspeicherung, SwRS-248 Kontoauszugs-Rechte). Abwesenheit ist statisch schwer beweisbar (die Prüfung könnte an nicht gesichteter Stelle liegen) — Verifikation durch Fachexperten bzw. Laufzeittest nötig.
- **Nur clientseitig belegte Regeln:** Pflichtfelder der Custom Properties (SwRS-636), MOVE_HELPDESK_TIMER (SwRS-542), Stundenzuschlags-Validierung (SwRS-1246), KI-Systemprompt-Recht (SwRS-1234) — die Regel existiert, ihre serverseitige Durchsetzung ist offen.
- **Nicht einsehbare Logik:** SocialMedia (Stored Procedures, SwRS-748), Expected-Events-Auswertung (außerhalb der Codebasis, SwRS-545), Reportserver-Ausführungsdienst (SwRS-1043).
- **Sehr große Einzeldateien nur auszugsweise:** `ReceiptBL.cs` (11.441 Zeilen), `InvoiceZugferdBL` (>2.000 Zeilen, kein Feld-für-Feld-Abgleich gegen EN 16931), `ContractEvaluationBL` (1.493 Zeilen), `OrderBalanceBL` (FlatrateBilling-Kern), DATEV-Formatgeneratoren.
- **Nur strukturell erfasst:** M59 Legacy-Webservices (~2.500 Dateien, exemplarisch WebAccount/ReceiptCart/Helpdesk vertieft), `Centron.Controls` (742+ Dateien), Gateway-Adapter.
### Sicherheits- und Qualitätsbefunde für die Neuimplementierung (Auswahl)
1. Passworthashing als ungesalzenes SHA1 über Codepage-1252-Bytes (`BasicAuthenticator`, TODO im Code) — im Zielsystem durch moderne KDF ersetzen; identischer Pfad für AppUser und WebAccounts.
2. Hartkodierte Geheimnisse: AES-Fallback-Schlüssel (`AESCryptoLogic`), finAPI-OAuth-Client-Credentials im Quellcode — Geheimnisverwaltung zwingend.
3. SQL-String-Konkatenation in ReportEngine (`ReportDataBL.ExecuteQuery`) und NexusNotifications — parametrisieren.
4. DSGVO-Komplettlöschung für Kunden/Lieferanten/Accounts wirft `NotImplementedException` (nur Kontaktpersonen-Löschung produktiv).
5. Keine gesichtete zentrale Schreibsperre für festgeschriebene Rechnungen (`IsFixed`) im SaveReceipt-Pfad; `RechKopf` ohne Unique-Index auf der Belegnummer — im Zielsystem als harte Invarianten spezifizieren.
6. `CanCloseHelpdesk()` liefert konstant `true` (kein Abschluss-Gate für offene Checklisten/RMA, nur TODO-Kommentar).
7. Schema-Drift: Telemetrie-Tabellen sowie `MasterDataList`/`ObjectExternalReferences` fehlen im Dump `SSMS_DB_SCHEMA.sql` — Schemaquelle und Migrationsskripte abgleichen.
8. Keine datenraumtrennende Mehrmandantenfähigkeit (eine DB, Mandant = Firmenstammsatz) — zentrale Architekturentscheidung für SaaS.
### Empfehlungen für Folge-Iterationen
1. **Verifikation der 16 Hypothesen**, vorrangig der fünf sicherheitsrelevanten Negativbefunde (Laufzeittest bzw. gezielte Suche nach der durchsetzenden Stelle).
2. **Systematischer Abgleich clientseitig geprüfter Rechte gegen serverseitige Durchsetzung** (SyRS-110): CentronRights.md-Rechteliste gegen alle WebServiceBL-Speicherpfade.
3. **Abrechnungskern vertiefen:** Positionsbildung des Abrechnungslaufs (VertragPos/VertragArtikel), OrderBalanceBL (Flatrate), Sammelrechnungen, DATEV-Formatdetails, Anzahlungsrechnungen, Provisionslogik.
4. **Legacy-Webservices (M59) flächig erfassen** — dort liegen vermutlich weitere fachliche Regeln und Rechteprüfungen; ebenso ServiceBoard-Zeiterfassung (Abrechnungsrelevanz) und Office/SharedDocument-Signaturpfad.
5. **E-Rechnung Feld-für-Feld** gegen EN 16931 prüfen (InvoiceZugferdBL, ebInterface, Gateway) — zugleich Konsolidierungsentscheidung für einen Generator.
6. **EDI-Distributor-Parser, EscalationBL.DoEscalation, AccountSearchBL, Alt-Migrationen (Anschrif→AccountAddresses)** sowie die ScriptMethods-SQL-Migrationsskripte als Quelle zusätzlicher DB-Regeln.
7. **Lizenzverwaltung (LicenseManager/LicenseGuids)** als eigenes Querschnittsthema erheben.
### Methodische Anmerkungen
- Die Anforderungszahlen je Modul in der Abdeckungstabelle enthalten anteilige Zuordnungen; die Summe über die Tabelle ist daher nicht identisch mit der Gesamtzahl 413.
- SwRS-240 wurde nicht vergeben (dokumentierte Nummernkreislücke, kein Inhaltsverlust).
- Die Hypothesenquote (3,9 %) liegt bewusst über null: Alle Aussagen ohne eindeutige Artefaktgrundlage wurden als Hypothese abgegrenzt statt behauptet; zusätzlich benennt die Selbstbewertung offene Punkte, die keiner Anforderung zugeordnet sind (nur hier, nicht in `Hypothesen.md`).
- Änderungshistorie (Commits) wurde nicht als Belegquelle herangezogen; KONTEXT-Belege stammen aus `docs\`, `CentronRights.md` und Code-Kommentaren (inkl. Ticketnummern, z. B. 168245/164153 beim MSP-Abgleich).
@@ -0,0 +1,211 @@
# Glossar
**System:** c-entron ERP-Suite | **Datum:** 2026-08-27
Domänenbegriffe, wie sie in StRS/SyRS/SwRS verwendet werden. Technische Bezeichner (Klassen, Tabellen, Spalten) stehen in Backticks.
| Begriff | Definition |
|---------|------------|
| 2FA | Zwei-Faktor-Authentifizierung; beim Login per RADIUS-Server oder E-Mail-Bestätigungslink. |
| Absender-Whitelist | Menge der zum Versand freigeschalteten Absenderadressen (Systemadressen + eigene Mitarbeiteradresse + `ApplicationSettingID.AllowedEmails`). |
| Access-Key (RMM) | Statischer, AES-verschlüsselt gespeicherter Schlüssel im Header `X-RMM-Access-Key` zur Autorisierung der RMM-REST-Schnittstelle. |
| Access-Token | Persistenter API-Schlüssel als Alternative zum Sitzungsticket (`AccessTokensController`, `AccessTokenWebServiceBL`), mit Zugriffsprotokoll (`AccessTokenLog`). |
| Account | Zentraler Geschäftspartner-Datensatz (Tabelle `Accounts`), der über Rollen gleichzeitig Kunde, Lieferant, Kontakt u. a. sein kann. |
| AccountDevice | Datenhaltung für sonstige Kundengeräte/Hardware (Tabelle `AccountDevices`) mit Soft-Delete, Log und Ticketverknüpfung. |
| AccountType / `AccountTypeToAccount` | Rollenzuordnung eines Accounts; verknüpft Account mit Kunden- (`AccountCustomers`) bzw. Lieferantendaten (`AccountSuppliers`). |
| `AESCryptoLogic` | c-entron-Hilfsklasse zur symmetrischen Verschlüsselung gespeicherter Geheimnisse (teils mit zentralem Masterkey aus der Konfigurations-DB). |
| Anrede / Abrede | Einleitungstext (`AN_*`) bzw. Schlusstext (`AB_*`) eines Belegs. |
| `ApplicationSettings` | Aktuelle Tabelle für typisierte Anwendungseinstellungen mit fester numerischer ID (Enum `ApplicationSettingID`). |
| AppUser | Internes ERP-Benutzerkonto eines Mitarbeiters (Mitarbeiterkonto) für die Anwendung, persistiert in Tabelle `Sichbenu`. |
| Artikel | Stammdatensatz eines Produkts/einer Dienstleistung (Tabelle `ARTIK`), identifiziert durch I3D und fachlich durch Artikelcode. |
| AssetManagement-Gerät | Extern (DocuBoard/River, AD/SNMP-Monitoring) synchronisierte Gerätedaten mit eigener Objektart `AssetManagementDeviceClass` (5101330). |
| AssetReason (QM-Grund) | Je Belegart gepflegter Rückgabe-/Reklamationsgrund mit Pflichtkennzeichen (`IsMandatory`). |
| AuthentificationKind | Pro Benutzer gespeichertes Anmeldeverfahren (CentronLogin/WindowsAuth/OpenIdConnectAuth), Spalte in `Sichbenu`. |
| AVV | Auftragsverarbeitungsvertrag (DSGVO Art. 28); im DSGVO-Modul als Vorlage und je Kunde als `OrderProcessingContract` verwaltet. |
| Barbeleg / Barrechnung (`IsCashAsset`) | Bar abgewickelter Beleg mit bruttobasierter Steuerrundung und eigenem Nummernkreis; vom Storno ausgeschlossen. |
| BatchId | Gruppenkennung mehrtägiger MyDay-Serieneinträge; 0 = Einzeltag. |
| Beleg | Geschäftsdokument der Verkaufs-/Einkaufskette (Angebot, Auftrag, Lieferschein, Rechnung, Gutschrift, Abholschein u. a.), technisch `IReceiptBase` mit Kopf und Positionen. |
| Belegart | Typ eines Belegs (`CentronObjectKindNumeric`, z. B. OrderClass, InvoiceClass); steuert Rechte, Nummernkreis und Weiterverarbeitungsziele über SpecificLogics. |
| Belegkette / Weiterverarbeitung (Forwarding) | Erzeugen eines Folgebelegs aus einem oder mehreren Quellbelegen mit Datenübernahme; Herkunft wird beidseitig gespeichert. |
| Belegkondition (`AssetCondition`) | Zahlungs-, Liefer- oder sonstige Kondition mit länderspezifischen Texten, Fälligkeitsart und Mindestbetrag. |
| Belegstatus Aktiv (`ReceiptState.Active`) | Einziger Belegzustand, in dem Massenänderungen an Belegpreisen zulässig sind. |
| Belegversion | Historisierte Ausprägung eines Belegs; Änderungen erzeugen Version+1, Vorversionen bleiben erhalten. |
| Belegzuordnung (`IsAssignedToAsset`) | Verweis einer Zeit auf eine Auftrags-, Lieferschein- oder Rechnungsposition (`AufPosI3D`/`LiefPosI3D`/`RechPosI3D`); macht die Zeit unveränderlich. |
| Bestellvorschlag | Automatisch berechnete Vorschlagsliste zu bestellender Mengen aus Auftragsbedarf, Mindestbestand, Bestand und Zulauf. |
| Betreuer (Adviser) | Bis zu sechs am Account hinterlegte Mitarbeiter (`Adviser1I3D`..`Adviser6I3D`), die für den Kunden verantwortlich sind. |
| BL / DAO / ILogic | Schichten: Business Logic (Entities/NHibernate), Data Access (Sessions/Mappings), clientseitige Logik-Schnittstelle mit BL- (Direkt-DB) und WS- (WebService) Implementierung. |
| CentronHosted | Autorisierungs-Policy, die Endpunkte auf von c-entron gehostete Installationen (Lizenz CentronInternal) beschränkt. |
| `CentronObjectKindNumeric` (ObjectKind) | Systemweite numerische Objektart-Enumeration/-Kennung (z. B. Account, HelpdeskClass, MasterDataListClass=25, AssetManagementDeviceClass=5101330) zur generischen Adressierung von Geschäftsobjekten. |
| ChangeLog | Generische Änderungshistorientabelle, adressiert über ObjectKind (Objektart) + ObjectI3D. |
| Chargeback | Rücklastschrift; negative Zuordnung, die auch geschlossene Rechnungen wieder öffnen darf. |
| Checkliste (`CentronChecklist`) | Hierarchische Aufgabenliste mit Punktzuständen (u. a. Open), generisch über ObjectKind/ObjectI3D an Objekte wie Tickets gebunden. |
| Check-out / Check-in | Exklusives Sperren eines Dokuments der Dateiablage zur Bearbeitung (mit Arbeitsstation) und Rückgabe als neue Version. |
| Click-Vertrag | Vertrag, der Gerätezählerstände (z. B. Druckseiten) als Differenzmenge abrechnet (`ContractExtraKind.ClickDevice`). |
| ConnectionManager | WPF-Werkzeug zur Pflege der `WebServiceConfig.xml` (DB-Verbindung, Proxy, AD, Zertifikate, Secret Key). |
| DataQualityService | Hintergrunddienst, der Datenbereinigungs- und Reparaturaufgaben in isolierten Einzelschritten ausführt. |
| DetachedFromOrigin | Kennzeichen einer Vertragsposition, dass die Verknüpfung zum erzeugenden Ursprungsauftrag gelöst wurde (verhindert Rückwirkungen bei Mengenänderungen). |
| Direktlieferung | Lieferung vom Distributor direkt an den Endkunden ohne eigenen Lagerdurchlauf (`AufPos.Direktlieferung`). |
| D!VE-Profil | Gespeicherte Exportvorgaben (Mandant, Rahmenvertrag, feste Zahlungs-/Rabatt-/USt-Werte) für den D!VE-Export (Entität `TelekomDiveProfile`). |
| DocBee | Externes Service-Management-/Vorgangssystem; angebunden über Webhooks und die DocBee-Konnektor-BLs. |
| DocSync | Mechanismus zur Bereitstellung von c-entron-Dokumenten/Verzeichnissen an eine externe Synchronisation, gefiltert nach Objektarten. |
| docuFORM | Fleet-/Print-Management-Server; liefert Druckgeräte und Seitenzähler über eine OAuth2-geschützte REST-API. |
| EAV | Entity-Attribute-Value: generisches Speichermuster mit typisierten Wertspalten je Attribut. |
| ebInterface | Österreichisches E-Rechnungsformat (hier Version 4.3). |
| EDI | Electronic Data Interchange — strukturierter elektronischer Belegaustausch mit Lieferanten/Distributoren (Bestellung, Bestellbestätigung, Lieferschein, Rechnung). |
| ElectronicSales (ES) | Webshop-System; dessen Kundengruppen/Rollen werden als lokale Caches (`EsCustomerGroup`/`EsRole`) geführt. |
| Empfänger-Bitmaske | Kodierung der Eskalationsempfänger einer Stufe als Summe von Empfänger-IDs in einer Integer-Spalte (`StageNReceivers`). |
| Eskalation | Zeitgesteuerte, bis zu dreistufige E-Mail-Benachrichtigung bei überfälligen Vorgängen (Tabellen `eskalationen`/`eskalationTypen`); die erreichte Stufe wird in `hlpdsk_requests.EscalationLevel` geführt. |
| Eskalationstyp | Konfigurierbares dreistufiges Regelwerk für die automatische Eskalation überfälliger Vorgänge, je Objektart bzw. Ticketpriorität: Wartestunden/Fristen je Stufe (`Hour1`-`3`), Geschäftszeitfenster, Sa/So-Flags und Empfängerkreise je Stufe. |
| EWS | Exchange Web Services; klassische Microsoft-Exchange-API, im System für Kalender- und Mailzugriff genutzt. |
| Expected Event | Definition eines je Wochentag erwarteten externen Ereignisses (z. B. Backup-Meldung) mit Textmustern zur Erfolgs-/Warn-/Fehlerklassifikation und Logeinträgen mit Ticketbezug. |
| Externes Tool | Konfigurierbares Fremdprogramm (Pfad + Argumente) mit @@Platzhalter@@-Ersetzung aus dem Fachkontext. |
| Externreferenz (`ObjectExternalReference`) | Generische Verknüpfung eines c-entron-Objekts (ObjectI3D + ObjectKind) mit einem Objekt eines Fremdsystems (ExternalReferenceType + ExternalReferenceID), z. B. DocBee. |
| Fälligkeit (`DueDate`/`FaelligAm`) | Aus der Ticketpriorität (Reaktionszeit in Stunden, Bürozeiten, Sa/So-Regeln) berechneter Zieltermin für die Ticketbearbeitung. |
| Festschreibung (`IsFixed`) | Unveränderlichkeits-Kennzeichen einer Rechnung (`RechKopf.IsFixed`=1), gesetzt mit Protokolleintrag. |
| FiBu-Export | Übergabe von Buchungs-/Stammdaten an Finanzbuchhaltungssysteme (DATEV, Abacus, Sage u. a.). |
| Filialbeschränkung | Rechtegesteuerte Einschränkung von Auswertungen auf die Filiale (Branch) des angemeldeten Mitarbeiters. |
| Filiale (Branch) | Standort/Niederlassung (organisatorische Einheit) eines Mandanten (Tabelle `Filiale`, `BranchDTO`); genau eine Filiale je Mandant ist Standard. `BranchI3D` bindet Rechtegruppen und restriktive Rechte an Standorte; „nur eigene Filiale"-Rechte binden den Belegzugriff an die Filiale des Benutzers. |
| finAPI | Externer Kontozugriffs-/PSD2-Dienst (live/sandbox.finapi.io), angebunden über REST v2 und WebForm. |
| Firmengruppe (`CompanyGroup`) | Konzernklammer über Konten; kann Preisliste, Sonderpreise und Leitweg-ID für Belege vorgeben. |
| Freigabewesen | Mehrstufiger Genehmigungsworkflow des Warenkorbs (Prüfer → Besteller) über die Zustandsmaschine `ReceiptCartState`. |
| Fremd-Todoliste | Recht (RIGHT_FREMDTODOLISTE), die ToDo-Listen anderer Mitarbeiter einzusehen; RIGHT_FREMDTODOLISTEVERWERFEN erlaubt das Verwerfen fremder ToDos. |
| Fremdware | Im RMA angenommener Artikel ohne eigenen Verkaufsbeleg; wird in ein RMA-Kundenlager (`StockKind.RmaCustomer`) eingebucht. |
| Gateway | Projekt `Centron.Gateway`: Sammlung von Formatadaptern (EDI, FiBu, SEPA, OpenTrans, ZUGFeRD, FinTS). |
| Gläubiger-ID (`SepaIdentificationNumber`) | SEPA-Gläubigeridentifikationsnummer des Mandanten (Mandator). |
| Gleitender EK | Mengen-gewichteter Durchschnitts-Einkaufspreis, der bei jedem Wareneingang fortgeschrieben wird (Alternative: Fest-EK, letzter EK; `ARTIK`-Feld `NoMixedEk`). |
| Globaler Zuschlag | Das per Einstellung `GlobalHourlySurchargeRateI3D` als systemweiter Standard markierte Zuschlagsmodell; nicht deaktivierbar. |
| Gruppen-Settings-Klasse | Serverseitige Klasse, die fachlich zusammengehörige Einstellungen gebündelt lädt, typisiert bereitstellt und speichert (z. B. `PdfSigningSettings`). |
| GUI-Profil | Gespeichertes Oberflächen-Layout (`CentronUiProfiles`), privat je Benutzer oder global (`IsGlobal`) für alle. |
| Gutschein (Voucher) | Barcode eines Gutscheinartikels; Status frei/ausgegeben/eingelöst über `GutscheinZuRechnung` abgeleitet. |
| Hauptlager | Implizites Basislager eines Artikels; im Code als Lager-I3D -1 geführt, Bestand in `ARTIK.Menge`. |
| Hauptposition (`IsMainItem`) | Die genau eine Position eines Stammblatts, die das Hauptgerät (Menge 1) repräsentiert. |
| Heartbeat | Zyklischer Client-Server-Ping (5 Minuten) zur Validierung von Sitzung und Lizenz. |
| Helpdesk-Status (`HelpdeskState`) | Frei konfigurierbarer Datensatz in `hlpdsk_status`, der die Lebenszyklusphase eines Tickets angibt; ein per AppSetting bestimmter Status gilt als „Abgeschlossen". |
| Helpdesk-Timer (Zeit) | Erfasste Arbeitszeit/Zeitbuchung eines Mitarbeiters auf einem Ticket (Tabelle `hlpdsk_timer`) mit Berechenbar-Flag (`Calculable`, steuert die Fakturierbarkeit) und optionaler Beleg-Zuordnung; Basis der Leistungsabrechnung. |
| Herstellercode (`ManufactorCode`/`ManufacturerCode`) | Artikelnummer des Herstellers; Zuordnungsschlüssel beim Preislistenimport. |
| Heuristik / MatchingRate | Herkunftskennzeichen und Güte einer automatischen Umsatz-Beleg-Zuordnung. |
| Hintergrunddienst (`ManagedBackgroundService`) | Im Webservice-Host laufender periodischer Job, dessen Aktivierung und Laufzeiten über die Tabelle `BackgroundServices` gesteuert/protokolliert werden. |
| I3D | „ID 3develop": systemweiter technischer Primärschlüssel (int IDENTITY) nahezu aller c-entron-Tabellen und -Entitäten; Fremdschlüsselspalten tragen das Suffix I3D. Wird auch als fester ID-Wert von Rechten verwendet. |
| Interne Rechnung | Rechnung nur mit Dienstleistungspositionen zum Gesamtwert 0,00, nummeriert aus eigenem Nummernkreis (InternalInvoice). |
| Inventur | Stichtagsbezogene Bestandszählung je Lager mit anschließender Buchbestandskorrektur; Voll- (Komplett-) oder Teilinventur. |
| Kalkulationsfaktor | Mandantenweiter Faktor (AppSetting `ArticleCalculationFactor`), mit dem Einkaufspreise bei Bewertung/Anzeige multipliziert bzw. dividiert werden. |
| Klickzähler / Seitenzähler (`DeviceClickCounter`) | Zähler eines Stammblatt-Geräts (z. B. Seitenzähler von Druckgeräten); Grundlage der verbrauchsbasierten Abrechnung von Click-/Managed-Print-Verträgen. |
| Kommissionierung | Zusammenstellen der Auftragspositionen im Lager mit Rückmeldung gepickter Mengen (`QuantityPicked`). |
| Kontenrahmen (`BookKeepingAccountSystems`) | Zuordnung Erlös-/Aufwandskonten zu Steuersätzen für den Export. |
| Kontingentrest-Mitnahme (`KontingentRestMitnehmen`) | Option, nicht verbrauchte Kontingente in die Folgeperiode zu übertragen. |
| Kontingentvertrag | Vertrag mit gebuchtem Leistungsvolumen (z. B. Stunden); Verbrauch wird gegen Buchungen (`VertragRechKopfZuordnung`) gerechnet. |
| Kontoauszug (`OnlineBankingAccountTransaction`) | Importierter Bankumsatz einer Onlinebanking-Konfiguration (FinTS/finAPI/Spreadsheet). |
| Kostenstelle / Kostenträger (`CostCenter`/`CostObject`) | Controlling-Stammdaten zur Belegzuordnung; Soft-Delete über State-Feld. |
| Kreditlimit | Kundenindividuelle Obergrenze des offenen Belegvolumens (netto/brutto); Überschreitung erfordert Bestätigung. |
| Kundensonderpreis (`KundenSonderpreise`) | Kunden-/warengruppenbezogene Preisregel mit Gültigkeitszeitraum und Preisbasis (`SpecialPriceKind`). |
| `Laenkenn` | Ländertabelle (Legacy-Name) mit Währung (`KursZuEur`), Vorwahl, MwSt-Art, Erlöskonten, Standardland-Kennzeichen. |
| Leitweg-ID | Adressierungskennung öffentlicher Auftraggeber in Deutschland; am Kunden bzw. dessen Firmengruppe gepflegt. |
| Löschprotokoll | Bei DSGVO-Löschung erzeugtes Textprotokoll („c-entron Löschprotokoll") aller entfernten personenbezogenen Angaben. |
| Mahnlauf | Ein Ausführungsvorgang des Mahnwesens; protokolliert je Rechnung in Tabelle `Mahnlauf` unter fortlaufender MahnLaufNr. |
| Mahnsperre (DunningStop) | Kennzeichen/Zeitraum auf Kunde oder Rechnung, das die Aufnahme in Mahnvorschläge verhindert. |
| Mahnstufe (DunningLevel) | Eskalationsstufe einer überfälligen Rechnung (je nach Sicht 0–3 bzw. 1–3), gespeichert in `RechKopf.Mahnstufe` mit Datum und Bearbeiter je Stufe. |
| Mailing | Kampagnenbezogener Massenversand (E-Mail/SMS) mit personalisierten Empfängertexten und Versandkennzeichen. |
| MailTemplateReference | Eindeutige Identifikation einer Mail-Vorlage über ObjectKind, SubObjectKind, ObjectI3D und TemplatePrio (Tabelle `MailVorlagen`). |
| Mandant (Mandator) | Rechtlich/organisatorisch eigenständige Firma innerhalb einer c-entron-Installation mit eigenen Stammdaten (Anschrift, Bankverbindungen, USt-ID, Logos) und Belegnummernkreisen (Tabelle `Mandant`, Entität Mandator); zugleich die eigene Firma des Systemhauses als Absender-Stammdaten für Belege. Getrennte Datenhaltung je Firma (MandantID in `Sichbenu`), wobei alle Mandanten eine Datenbank teilen; nicht zu verwechseln mit SaaS-Mandantentrennung. |
| Mandatsreferenz (`AuthorizationNumber`) | Eindeutige Kennung des SEPA-Mandats an der Bankverbindung. |
| Maschinenart (`ProductionMachineKind`) | Klassifikation von Produktionsmaschinen; trägt wiederverwendbare Arbeitsschrittbeschreibungen (`ProductionMachineKindStepsDescription`). |
| Massenupdate-Vorlage (`MassUpdateTemplate`) | Benannter Massenänderungslauf mit Einzelpositionen (Items) je Zielobjekt, Ausführungsstatus und Fehlergrund. |
| Masterkey / Masterschlüssel | Zentraler mandantenweiter symmetrischer Schlüssel aus der Konfigurations-DB (`CentronConfigurationDbBL`; „Hotline-Masterkey") zur AES-Ver-/Entschlüsselung gespeicherter Geheimnisse, z. B. der Zugangsdaten des Passwortmanagers sowie der Postfach-Passwörter und Client-Secrets der VMA-Profile. |
| MCP-Tool | Werkzeug des Model-Context-Protocol-KI-Assistenten, dessen Nutzung telemetrisch gezählt wird (`McpToolUsageTelemetry`). |
| Microsoft Graph | Moderne Microsoft-365-API; alternativer Mail-Transport (GraphMail) und Quelle der Teams-Anrufdaten (CallRecords). |
| Mindestpreis (`MinPrice`) | Artikeluntergrenze für den Netto-VK; Unterschreitung erfordert Recht ALLOW_IGNORE_MINIMUM_PRICE. |
| Mitarbeiter (Employee) | Personalstammsatz (Tabelle `Personal`) mit Kürzel (`ShortSign`), Filiale (`BranchI3D`) und Personalakten-Ordnern. |
| MSP | Managed-Service-Provider — Systemhaus, das IT-Betrieb für Kunden übernimmt; Zielgruppe von c-entron. |
| MSP-Collector | Konfigurierte Importschnittstelle zu einem Managed-Service-Lieferanten (z. B. Veeam, Octopus, ArrowSphere), die Nutzungs-/Abrechnungsdaten abholt. |
| MSP-Evaluation | Positionsweiser Abgleich importierter Lieferantenabrechnungen mit Kundenvertragspositionen inklusive Übernahmeentscheidung (Menge/Preis/ignorieren). |
| Nebenlager | Zusätzliches, in `Warehouses` definiertes Lager; Artikelbestand je Nebenlager in `NebenlagerArtikel`. |
| Nexoware Smartflow (CPra) | Externer Formular-/Workflow-Dienst; c-entron erzeugt vorbefüllte Webhook-Links. |
| NexusNotification | Persönliche Benachrichtigung im Nexus-Web-Client mit getrennten Zuständen `IsSeen` (Badge) und `IsRead` (gelesen), gepusht über SignalR-Hub. |
| Normierung (`RechnungNormieren`) | Tagesanteilige Berechnung angebrochener erster/letzter Abrechnungsperioden auf Kalendermonat/-quartal/-jahr. |
| Nummernkreis (`NumberGroup`) | Zentraler konfigurierbarer Zähler für fortlaufende Nummern (Tabelle `Nummernkreis`), je Belegart/Mandant/Filiale zur Vergabe eindeutiger Belegnummern sowie für Account-, Kunden- und Lieferantennummern (via `NumberGroupBL.GetNextNumber`). |
| OnlinePdfDocument | Per GUID adressiertes, einmalig signierbares PDF-Dokument (`DsgvoBL`); nach Bestätigung gelöscht. |
| OpenTRANS 2.1 | XML-Standardformat für Geschäftsbelege; Standardformat des Bestellversands. |
| OPOS | Offene-Posten-Liste: aktive Rechnungen abzüglich Zahlungen und verrechneter Gutschriften je Kunde; Versandform „Kontoauszug". |
| Pauschalabrechnung (FlatRate) | Auftragbasierte Pauschalfaktura; zugehörige Zeiten sind von der Einzelzeitabrechnung ausgeschlossen (`IsFlatRateItem`). |
| PDF/A | ISO-Normfamilie für Langzeitarchivierung von PDF; im System als Konformitätsstufen PDF/A-1a bis PDF/A-3b sowie PDF/X wählbar. |
| Personalakte | Automatisch angelegte Dokumenten-Ordnerstruktur je Mitarbeiter (Zertifikate, Verträge, Gesprächsnotizen usw.). |
| PLM (`ProductLifecycleInformation`) | Product Lifecycle Management — Lebenszyklusdatensatz einer verkauften Lizenz/eines Abos (Quelle meist Rechnungsposition) mit Laufzeit (`StartDate`/`EndDate`), Kunde und Angebotsstatus; das Verwerfen des zugehörigen ToDos deaktiviert die Lizenz und wird protokolliert. |
| `PORTRECH` / `PORTWARE` | Flag-Tabellen für bereits an die FiBu exportierte Kunden- bzw. Lieferantenbelege. |
| Preisliste (VK1–VK4) | Vier Verkaufspreisfelder je Artikel; `Customer.PriceList` wählt den anzuwendenden VK. |
| Produktfamilie (`ProductFamily`/`-Group`) | Fachliche Gruppierung von Artikeln im PLM zur Zuordnung von Lebenszyklusdaten. |
| Produktionsauftrag (`ProductionOrder`) | Fertigungsauftrag, der zwingend auf einen Verkaufsauftrag (`OrderI3D`/`OrderNumber`) verweist und Arbeitsschritte (`ProductionOrderItems`) bündelt. |
| Produktionsschritt / Werkschritt (`ProductionOrderItem`) | Einzelner Arbeitsschritt eines Produktionsauftrags mit Maschinenart/Maschine, Soll-/Ist-Menge und Zustand (`ProductionOrderItemState`: Offen/OpenNotStarted, In Bearbeitung, Beendet/Finished). |
| Produktmatrix | Bewertungsraster Kunde × Produkt mit 4 Potenzialstufen und Änderungshistorie. |
| QmNotification | Dreistufiger Benachrichtigungsmodus je Belegart: keine / Nachfrage / immer. |
| Recht | Einzelberechtigung mit fester I3D (Tabelle `Sichrech`), im Code über `UserRightsConst` referenziert. |
| Rechtegruppe | Gruppe (Tabelle `Sichgrup`), der Rechte (`Sichtrus`) und Benutzer (`Sichmemb`) zugeordnet werden. |
| ReportEngine / ReportData | Neuere Berichtsverwaltung auf FastReport-Basis (XML im DB-Feld `Report`) mit Gruppen (`ReportGroup`, GUID je Belegart) und Abfragen (`ReportDataQuery`). |
| Reports (Alt-Tabelle) | Legacy-Berichtsspeicher (`dbo.Reports`, deutsche Spalten) mit eigener BL — Parallelbestand zur ReportEngine. |
| Restriktives Recht | Recht, das Befugnisse einschränkt statt erweitert (z. B. MANAGE_RIGHTS_ONLY_OWN_BRANCH, „nur eigene"-Rechte). |
| Result / `Result<T>` | Einheitliches Rückgabemuster der Logikschicht mit Status (Success/Error), Meldung und Nutzdaten statt Exceptions. |
| Richtlinie (Guideline) | Passwortmanager-Regelwerk, das je Kunde und Mitarbeiter feingranulare Zugriffsrechte (Bitflags) auf Zugangsdaten definiert. |
| Riverbird / RiverDivo | RMM-Produkt bzw. dessen c-entron-Anbindung (Namespace `RiverDivo`); Legacy-Zugang per Ticket, neuer Zugang per RMM-Access-Key. |
| RMA | Return Merchandise Authorization — Retourenvorgang mit Statushistorie je reklamiertem Artikel. |
| RMM | Remote Monitoring & Management — Fernüberwachungs-/Verwaltungssystem eines Managed-Service-Providers (hier v. a. Riverbird). |
| SelfCare-Formular / WebForm | Konfigurierbares Kundenformular, das über einen GUID-Link mit Ablaufdatum extern (ServiceBoard-Web) ausgefüllt wird. |
| SendBack | RMA-Rücksendung defekter Ware an den Lieferanten (`RmaSendBack`). |
| SendForth | RMA-Vorab-/Ersatzlieferung an den Kunden (`RmaSendForth`). |
| SEPA-Mandat (`SepaContract`) | Lastschriftmandat mit Status Draft/Accepted/Declined/LinkExpired und Online-Unterschriftsprozess; als Signaturdokument mit Pflicht-Bankdaten (Bankname, IBAN, BIC) über die DocumentSigning-Seite erteilt. |
| Seriennummer / Barcode | Einzelstück-Identifikation eines Artikels (Tabelle `Barcode`, Entitäten `BarCode`/`BarCode2`) mit eigenem Statuslebenszyklus (`BarcodeState`). |
| Seriennummernpflicht (`ScanBarcode`) | Artikelkennzeichen (`ARTIK.BarcodeScanen`), das die Bestandsführung auf Seriennummernzählung umstellt. |
| ServiceBoard (SBO) | Web-Frontend der Suite; je nach Sicht browserbasierter Mitarbeiter-Arbeitsbereich für Tickets, Planung und Zeiterfassung (Lizenz ServiceBoardWebDev) sowie Zugangspunkt für Kunden-/Technikerzugriffe (Formulare, Umfragen, Tickets); Basis-URL in den Einstellungen. |
| SETTINGS-Recht | Benutzerrecht `UserRightsConst.Administration.SETTINGS`; Voraussetzung für die Pflege von Integrations-/Systemeinstellungen. |
| Siegel / Siegelbruch | Schutzmechanismus des Passwortmanagers: versiegelte Zugangsdaten dürfen nur mit SealBreak-Recht, Begründung, Protokoll und E-Mail-Meldung geöffnet werden. |
| SimpleUrl / WebLink | Zwei getrennte Datenhaltungen für objektbezogene URLs; WebLinks besitzen zusätzlich Gruppen und ausführbare Aktionen (`WebLinkAction`). |
| Skonto-Ausschluss (`NoEarlyPaymentDiscountAllowed`) | Positionskennzeichen, das die Position aus der Skontobasis herausnimmt (NotDiscountable-Summen). |
| Soft-Delete | Logisches Löschen per Kennzeichen statt physischem Entfernen des Datensatzes; je nach Modul über Statusfeld (State=0) oder über `IsDeleted`/`DeletedByI3D`/`DeletedDate`. |
| Sondervereinbarung (SpecialAgreement, Projektpreis) | Kunden-, projekt- oder auftragsbezogenes Preisabkommen: verkaufsseitig eine Preisliste mit eigenen EK/VK bzw. prozentualen Reduktionen, Artikelpositionen und zugeordneten Kunden; einkaufsseitig eine auftrags-/projektbezogene Einkaufspreisabsprache (`SondervereinbarungI3D`) mit Gültigkeitsdatum, die vom Standard-EK-Verfahren ausgenommen ist. |
| Staffelpreis (`ArticleVolumePrices`) | Mengenabhängige EK/VK-Preise eines Artikels. |
| Stammblatt (MasterDataList) | Gerätedatensatz des Kunden für abrechnungsrelevante Geräte (v. a. Drucker/Kopierer) mit Hauptposition, Seriennummer, Klickzählern und Click-Vertragszuordnung; Träger der Gerätezähler; UI-Bezeichnung der Objektart `MasterDataListClass` (25). |
| `Stammdat` | Legacy-Einstellungstabelle (Zugriff über Enum `AppSettingsConst`); für neue Einstellungen gesperrt. |
| Standardmandant | Der genau eine Mandant mit `Default`=true; er kann nicht gelöscht/deaktiviert werden und dient als Fallback (z. B. für Logos). |
| Stemming | Rückführung von Wörtern auf ihre Stammform (`GermanAnalyzer`, angelehnt an Lucene.NET GermanStemmer). |
| Storno | Aufhebung einer Rechnung als neue Belegversion mit Status „storniert" und genullten Mengen; nur mit Recht RIGHT_RECHNUNGSTORNIEREN. |
| Stundenzuschlagsmodell (`HourlySurchargeRate`) | Satz von Zeitfenstern mit prozentualen Zuschlägen je Wochentag/Feiertag, der Verträgen zur Abrechnung von Arbeitszeiten zugeordnet wird. |
| Sync-Mitglied | Mitarbeiter, dessen Teams-Anrufe beim Graph-CallRecords-Sync in das Anrufjournal übernommen werden. |
| Tag | Normalisiertes (lowercase, getrimmt) freies Schlagwort (Tabelle `Tags`), Objekten z. B. Tickets über `TicketTags` zugeordnet. |
| Tagesabschluss (`MyDayFinalizedDay`) | Verbindliche Bestätigung eines Mitarbeiters, dass sein Arbeitstag in MyDay vollständig erfasst ist; fehlende Abschlüsse lösen Erinnerungen und Teamleiter-Eskalation aus. |
| TAPI | Telephony API; Windows-Telefonie-Schnittstelle, über die der Client Anrufe meldet, die als `PhoneCall` protokolliert werden. |
| TaskManager-Aufgabe | Wiederkehrende Aufgabe (`TaskManagementTask`) mit Wiederholungsregel (Recurrence) und Aktion, z. B. automatischer Ticketanlage (`TaskManagementHelpdeskAction`). |
| Teilkommission | Kommissionierung einer Teilmenge eines Auftrags (`PartialCommissionOrder`). |
| Telekom D!VE | Telekom-Partnerportal/Marktplatz; c-entron exportiert Angebote als D!VE-XML. |
| Telemetrie-Bucket | Zeitfenster (`BucketStartUtc`), auf das Nutzungsereignisse aggregiert werden; gespeichert wird nur ein Zähler je Schlüsselkombination. |
| Terminanfrage (`AppointmentRequest`) | Vorgang, bei dem einem Kunden mehrere Terminvorschläge (`AppointmentProposal`) angeboten werden; Antwort erfolgt über eine Guid und schaltet den `RequestState` weiter. |
| Textbaustein (TextModule) | Wiederverwendbarer Anrede- oder Schlusstext je Belegart/Helpdesk-Kontext mit @@-Platzhaltern; Auflösung kundenspezifisch vor benutzerspezifisch vor global. |
| Ticket (Authentifizierung) | Serverseitig gespeichertes/verwaltetes Sitzungs-Token mit Ablaufdatum, ausgestellt nach erfolgreicher Anmeldung (`TicketBL`); wird bei jedem Legacy-Aufruf validiert und verlängert. Nicht zu verwechseln mit dem Helpdesk-Ticket. |
| Ticket (Helpdesk-Fall) | Kundenbezogener Service-/Support-Vorgang in Tabelle `hlpdsk_requests` (Entität `Helpdesk`/`HelpdeskCompact`), auch im ServiceBoard/Kundenportal sichtbar; „Ticket" und „Helpdesk(-Fall)" werden in der Codebasis synonym verwendet. |
| Ticket-Projekt | Bündelung von Tickets mit eigenem Nummernkreis, Aufgaben, Abhängigkeiten, Nachrichten und Logs (`TicketProject`; `hlpdsk_requests.ProjectHelpdeskI3D`). |
| TimerBilling | Abrechnung erfasster Helpdesk-Zeiten (HelpdeskTimer) über Aufträge/Rechnungen. |
| ToDo / Wiedervorlage | Aus Geschäftsobjekten (Belege, Verträge, Tickets, PLM-Lizenzen, Geburtstage, Videozuweisungen) erzeugter Aufgabeneintrag mit Read-/Discarded-Status. |
| Toleranzfrist (`DaysToTolerate`) | Konfigurierte Anzahl Tage, innerhalb derer ablaufende Lizenzen Wiedervorlagen (ToDos) erzeugen. |
| TOTP-PIN | Zeitbasiertes Einmalpasswort (Google-Authenticator-Verfahren) gegen den in `Sichbenu.TwoFactorAuthKey` hinterlegten Schlüssel. |
| TradePool | Separater, per XML befüllter Katalog von Handelsartikeln (`TradeArticles`) mit Klassenhierarchie; Nutzung unklar. |
| TSA | Time Stamping Authority; Zeitstempeldienst (RFC 3161), der Signaturen einen beglaubigten Zeitpunkt hinzufügt. |
| Umfrage-Instanz | Antwortleere Kopie einer Umfragevorlage (`SurveyProcessTemplate`) mit Status Open, Objektbezug und verschlüsseltem Zugriffslink. |
| UniqueId (`MyDayWorkItem`) | Fachlicher Eindeutigkeitsschlüssel (Type + ObjectI3D bzw. Type + I3D) zur Deduplizierung automatisch erzeugter Zeiteinträge. |
| Update-Benachrichtigungsart (`UpdateAvailableNotificationKind`) | Einstellung, die die Zielgruppe von Update-Hinweisen festlegt (keine, Administratoren, ausgewählte Mitarbeiter, alle). |
| Verknüpfungsnummer (`ConnectionNumber`) | Fortlaufende Nummer, die mehrere Tickets zu einer Gruppe (`HelpdeskConnections`) bündelt. |
| Vertragssonderpreis (`ContractSpecialPrice`) | Preisregel aus einem Vertrag; hat Vorrang vor Kundensonderpreisen. |
| VMA (Virtual Mail Assistant) | Mail-Eingangs-Scanner (MailScanner), der Postfächer über Profile abruft und eingehende Mails Workflows zuführt; lizenz- (MailScannerNET) und rechtegeschützt (ACCESS_VMA_MODULE). |
| Volltextindex | Datenbanktabelle `ObjectFulltextIndex` mit gestemmten Termen je Objekt; Suche = UND-Verknüpfung von Präfixtreffern. |
| Vorab-/Nachberechnung (Billingadvance/Billingarrear) | Abrechnung vor Beginn bzw. nach Ende des Leistungszeitraums. |
| Vorgang (DocBee) | Ticket-Äquivalent in DocBee; referenziert über `ObjectExternalReference` mit Typ „DocBee". |
| Vorlagen-Fallback | Auflösungsreihenfolge einer Mail-Vorlage: Kunde (Account) → Mitarbeiter → Filiale (Branch) → global → Systemstandard. |
| Warenkorb (`ReceiptCart`) | Web-Warenkorb, technisch ein ReceiptOffer (`AngKopf`) mit `IsCart`=true und CartState (`ReceiptCartState`). |
| Web-Account (WebAccount) | Externes Portal-Konto/Kundenlogin (Self-Service-/Webportal, ServiceBoard) eines Kunden-/Account-Ansprechpartners, persistiert in Tabelle `WebAccounts`; eigener Login-Typ „Webaccount" mit eigenem Rechtesystem (WEBRIGHT_*, Enum `WebAccountRightsConst`), abgegrenzt vom internen Mitarbeiter-Login (AppUser); besitzt keinen Mitarbeiterkontext und unterliegt Kundenisolation (darf nur Daten des eigenen Kunden sehen). |
| Web-Receipt / Web-Angebot | Per Token im Browser bereitgestellter Beleg (Angebot) mit eigenem Zustandsmodell `WebReceiptState` (Annahme/Ablehnung/Änderungswünsche). |
| Web-Recht | Berechtigung eines Web-Accounts (Enum `WebAccountRightsConst`, z. B. WEBRIGHT_WEBCART2_CHECK_CART); unabhängig von den Mitarbeiterrechten (`UserRightsConst`, int-I3Ds). |
| Werbesperre (`AdvertisingNotAllowed`) | Kennzeichen am Konto, dass keine Werbung zugesendet werden darf. |
| XRechnung / XInvoice | Deutsche EN-16931-konforme E-Rechnungs-XML-Ausprägung; erfordert BuyerReference (Leitweg-ID) für B2G. |
| Zeit-Signatur | Grafische Kundenunterschrift zu genau einer Zeit (Tabelle `hlpdsk_timer_signature`); Flag `IsSigned` am Timer. |
| Zugangsdaten (Access Data) | Im Passwortmanager verwaltete Benutzername/Passwort-Kombinationen für Kundensysteme (Hotline-Custom-Items mit Custom-Properties). |
| ZUGFeRD | Hybrides E-Rechnungsformat: E-Rechnungs-XML eingebettet in PDF/A; Versionen 1.0 bis 3.0.1 (XInvoice) im System wählbar; im EDI-Rechnungsimport unterstützt. |
| Zulauf | Bereits bestellte, noch nicht gelieferte Menge (Intake) je Artikel/Lager. |
| Zuordnung (`TransactionAssignment`) | Verknüpfung Bankumsatz ↔ Beleg mit zugewiesenem Betrag, Heuristik und Buchungsflags. |
| Zusatzfeld (`ModuleCustomProperty`) | Konfigurierbares kundenindividuelles Feld je Objektart mit Datentyp, Pflicht- (`IsMandatory`) und Versiegelungskennzeichen (`Sealable`); Werte in EAV-Tabelle `ModuleCustomPropertyValues`. |
| Zwischenrechnung | Codierter Zuordnungstyp in `VertragRechKopfZuordnung` für abweichende Kontingentintervalle (`DifferContingentInterval`: none/headMinor/interimMinor/headMajor/interimMajor). |
@@ -0,0 +1,24 @@
# Hypothesen
**System:** c-entron ERP-Suite | **Datum:** 2026-08-27
Diese Datei enthält genau die Anforderungen mit `[HYPOTHESE]`-Markierung (`Status: HYPOTHESE`) aus StRS.md, SyRS.md und SwRS.md — deckungsgleich mit den Inline-Markierungen. Je Eintrag die offene Frage, deren Beantwortung die Hypothese bestätigen oder verwerfen würde.
| ID | Ebene | Titel | Offene Frage (fehlende Information) |
|----|-------|-------|-------------------------------------|
| SyRS-110 | SyRS | Serverseitige Durchsetzung aller im WPF-Client geprüften Rechte | Existiert für jedes clientseitig geprüfte Recht (insb. UI-Sichtbarkeitsrechte wie EDIT_GLOBAL_PROFILES) eine korrespondierende serverseitige Prüfung in BL oder Webservice? |
| SyRS-1119 | SyRS | Zentrale Dateiablage mit Versionierung und Sperrmechanismus | Die serverseitige Durchsetzung (Ablehnung eines zweiten Check-outs, Versionszählung) in der Dokumenten-BL (FileManagement) wurde nicht gelesen; belegt ist nur der Client-Vertrag (ICentronFileSystemConnector). |
| SwRS-119 | SwRS | Alt-Passwortverwaltung (PasswordManagementArea) mit Zugriffsprotokoll, aber ohne wirksame Verschlüsselung | Wird PasswordManagementKeyword.Password von einem anderen (Alt-)Client verschlüsselt befüllt, oder liegen die Werte im Klartext vor? Warum wird beim Lesezugriff der ActionType "Create" geloggt? |
| SwRS-248 | SwRS | Serverseitige Durchsetzung der Kontoauszugs-Rechte (20800147–20800151) | Existiert eine hier nicht gefundene serverseitige Prüfung (z. B. in einer Webservice-Fassade/Modulfreischaltung), oder sind die Rechte 20800147–20800151 tatsächlich nur UI-wirksam? |
| SwRS-350 | SwRS | Durchsetzung der Werbesperre beim Mailingversand | Gibt es im Versandpfad (Mail-Dispatcher/UI-Auswahl) eine erzwungene Filterung auf Werbesperre, oder verlässt sich das System allein auf die manuelle Filterwahl der Empfängerselektion? |
| SwRS-354 | SwRS | Manueller Statuswechsel auf „storniert" für Nicht-Rechnungsbelege | Über welchen UI-/BL-Pfad werden Angebote/Aufträge/Lieferscheine storniert, und welche Prüfungen (Rechte, Bestandsrückbuchung, Folgebelege) werden dabei erzwungen? |
| SwRS-451 | SwRS | TradePool-Artikelimport aus XML-Dateien | Wird der TradePool produktiv noch genutzt und was ist der fachliche Zweck (kundenübergreifende Handelsbörse vs. interner Katalog)? Kein aufrufendes UI-Modul im Cluster gefunden. |
| SwRS-545 | SwRS | Automatische Auswertung eingehender Meldungen gegen Expected Events | Welche Komponente (vermutlich ein externer Dienst oder RiverDivo-Integration) wertet eingehende Meldungen gegen die MessageContains*-Muster aus und erzeugt ExpectedEventLogEntries bzw. Tickets? |
| SwRS-637 | SwRS | Berechtigungsprüfung der Kundengeräteverwaltung | Wird der Zugriff auf die Geräteverwaltung an anderer Stelle (WPF-Client-Menürechte, API-Gateway, Lizenz) durchgesetzt, oder ist die Operation tatsächlich ungeschützt? |
| SwRS-740 | SwRS | Getrennte Persistenz von Betreff-Schalter und Betreff-Text der Outlook-Termine | Ist die Nutzung von HolidayRequestedEmailSubject als Bool-Schalter beabsichtigte Wiederverwendung eines freien Schlüssels oder ein Copy-Paste-Fehler, und liest ein anderes Modul denselben Schlüssel mit Urlaubs-Semantik? |
| SwRS-748 | SwRS | Social-Media-Interaktionen über Datenbankprozeduren | Welche Regeln (Berechtigung, Dubletten, Benachrichtigung) implementieren die Stored Procedures AddCommentToASocialMediaAction/LikeAStreamOrAction, und ist socialKind = 0 für Actions ein Fehler? |
| SwRS-848 | SwRS | Fehlender Seitenschutz der Produktionsübersicht | Existiert an anderer Stelle (Middleware, Host-Konfiguration, Reverse Proxy) ein Schutz der Route /production/overview, oder ist die Seite tatsächlich anonym erreichbar? |
| SwRS-947 | SwRS | Berechtigungsschutz für die Pflege von Integrationsstammdaten (D!VE-Profile, ES-Kundengruppen) | Greift für v1/telekom-dive und v1/integrations/es-* eine globale Autorisierung (z. B. Authentifizierungspflicht in Centron.Host/Middleware) oder genügt heute jede gültige Anmeldung für Schreibzugriffe? |
| SwRS-1043 | SwRS | Reportserver: automatisierter Reportversand per E-Mail über Aufgaben | Wo (welcher Dienst/Serverprozess) führt die geplanten Aufgaben aus und mit welcher Render-/Mail-Logik — der ausführende Code wurde im Cluster nicht gefunden. |
| SwRS-1147 | SwRS | Doppelte Entitätsklassen für den Firmenmandanten (Tabelle Mandant) | Ist „Mandant" ausschließlich Belegabsender (eigene Firma) ohne datenraumtrennende Mehrmandantenfähigkeit, und wird die Alt-Tabelle MandantenStammdat noch verwendet? |
| SwRS-1233 | SwRS | Serverseitige Rechteprüfung beim Speichern von Mandantenstammdaten | Prüft die aufrufende REST-Schicht (CentronRestService) oder MandatorBL.SaveMandatory das Recht Administration.MANDATORY serverseitig, oder verlässt sich das System allein auf die Client-UI? |
@@ -0,0 +1,324 @@
# Traceability
**System:** c-entron ERP-Suite | **Datum:** 2026-08-27
Forward-/Backward-Traceability zwischen StRS ↔ SyRS ↔ SwRS. Jede SwRS-Anforderung referenziert ihre SyRS, jede SyRS ihre StRS. Eine Zeile pro Kette; der Artefaktbeleg ist der Hauptbeleg der jeweils spezifischsten Anforderung. Nummernkreise: A1=1xx, A2=2xx, A3=3xx, A4=4xx, A5=5xx, A6=6xx, A7=7xx, A8=8xx, A9=9xx, A10=10xx, A11=11xx, A12=12xx.
## A1 — Sicherheit, Identität, Berechtigungen
| StRS-ID | SyRS-ID | SwRS-ID | Artefaktbeleg |
|---------|---------|---------|---------------|
| StRS-101 | SyRS-101 | SwRS-101 | Centron.BL\Administration\Rights\AppRightsBL.cs → HasUserRight (SQL Sichtrus⋈Sichmemb) |
| StRS-101 | SyRS-101 | SwRS-105 | Centron.Controllers\Authorization\AuthorizeUserRightAttribute.cs → OnAuthorization (401/403) |
| StRS-101 | SyRS-102 | SwRS-102 | SSMS_DB_SCHEMA.sql → CREATE TABLE dbo.Sichrech/Sichgrup/Sichmemb/Sichtrus |
| StRS-101 | SyRS-102 | SwRS-103 | AppRightsBL.cs → SaveRightGroup/DeleteRightGroup (UserRightsManagement-Prüfungen, Admin-Gruppen-Schutz) |
| StRS-101 | SyRS-102 | SwRS-104 | AppRightsBL.cs → WriteAddRightToGroupLog/WriteBaseLog (AppRightLog) |
| StRS-101 | SyRS-110 | — | Centron.WPF.UI\Extensions\RibbonControlExtensions.cs → nur clientseitige Rechteprüfung |
| StRS-102 | SyRS-103 | SwRS-109 | Centron.BL\Administration\Logins\TicketBL.cs → GetExpireDate/RefreshTicketExpireDate |
| StRS-102 | SyRS-104 | SwRS-106 | OpenIdConnectAuthenticator.cs → AppUser-Lookup über OpenIdConnectSubjectIdentifier |
| StRS-102 | SyRS-104 | SwRS-107 | BasicAuthenticator.cs → SHA1Decoder.GetDecodedSHA1String + Passwortvergleich |
| StRS-102 | SyRS-104 | SwRS-110 | UsersBL.cs → ChangeOwnPassword/IsValidAppUserPassword |
| StRS-102 | SyRS-105 | SwRS-112 | TwoFactorAuthBL.cs → HasToValidateTwoFactor |
| StRS-102 | SyRS-105 | SwRS-113 | EmailTwoFactorValidator.cs + TwoFactorAuthController.cs → /2fa/validate |
| StRS-102 | SyRS-105 | SwRS-114 | TwoFactorAuthenticationBL.cs → ValidateAuthenticationPin (GoogleAuthenticator) |
| StRS-102 | SyRS-106 | SwRS-111 | WebAccountBL.cs → LoginWithWebAccount (Statuskette) |
| StRS-102 | SyRS-107 | SwRS-108 | Authenticator.cs → ValidateAppUser (Deaktivierungsfenster) |
| StRS-103 | SyRS-108 | SwRS-115 | PasswordManagerBL.cs → ValidateUserRights + Guideline-Rechteprüfungen |
| StRS-103 | SyRS-108 | SwRS-116 | PasswordManagerBL.cs → EXPORT_ACCESS_AND_PASSWORD_DATA-Prüfung vor Export |
| StRS-103 | SyRS-108 | SwRS-117 | AESCryptoLogic.cs → EncryptText/GetKeyAndIV (inkl. Fallback-Key) |
| StRS-103 | SyRS-108 | SwRS-118 | Centron.Controls\PasswordManager\AccessManagementViewModel.cs → SealBreakPropertyValue |
| StRS-103 | SyRS-108 | SwRS-119 | PasswordManagementKeywordBL.cs → GetDecryptedKeywordById (fehlende Entschlüsselung) |
| StRS-104 | SyRS-109 | SwRS-120 | DataSecurityBL.cs → DoDeleteContactPerson + Löschprotokoll |
| StRS-104 | SyRS-109 | SwRS-121 | DataSecurityBL.cs → ACCESS_CLEANUP_DATABASE-Prüfung |
| StRS-104 | SyRS-109 | SwRS-122 | DsgvoBL.cs → ORDER_PROCESSING_CONTRACTS_MANAGEMENT-Prüfung |
## A2 — Finanzen & Abrechnung
| StRS-ID | SyRS-ID | SwRS-ID | Artefaktbeleg |
|---------|---------|---------|---------------|
| StRS-201 | SyRS-206 | SwRS-233 | AutomaticFacturaBL.Contracts.cs: NextDate/SetInvoiceTo/NormalizeCoefficient (Z. 1375–1583) |
| StRS-201 | SyRS-206 | SwRS-235 | AutomaticFacturaBL.Contracts.cs: SearchBillingContracts (Z. 847–970) |
| StRS-201 | SyRS-206 | SwRS-236 | AutomaticFacturaBL.Contracts.cs: StoreInvoiceToContract ToDo-Teil (Z. 1310–1336) |
| StRS-201 | SyRS-207 | SwRS-232 | ContractBL.cs: GetContingentRest (Z. 60–83) |
| StRS-201 | SyRS-207 | SwRS-234 | AutomaticFacturaBL.Contracts.cs: StoreBookedContingent (Z. 1098–1245) |
| StRS-201 | SyRS-208 | SwRS-230 | ContractBL.cs: RefreshContractEndeDate (Z. 1067–1177) |
| StRS-201 | SyRS-208 | SwRS-231 | ContractBL.cs: CloseContract (Z. 1243–1316) |
| StRS-201 | SyRS-209 | SwRS-251 | DeviceClickCounterBL.cs: GetAndUpdateDeviceClickCounter (Z. 234–270) |
| StRS-201 | SyRS-210 | SwRS-254 | HelpdeskTimerWebServiceBL.cs: ThrowIfUserDoesntHaveRightToChangeHelpdeskTimers (Z. 348–376) |
| StRS-202 | SyRS-211 | SwRS-237 | DunningRunBL.cs: UpdateInvoice (Z. 248–275) |
| StRS-202 | SyRS-211 | SwRS-238 | DunningRunBL.cs: SaveDunningRun (Z. 277–315); Tabelle Mahnlauf |
| StRS-202 | SyRS-211 | SwRS-241 | DunningRunBL.cs: GenerateMail (Z. 406–451) |
| StRS-202 | SyRS-212 | SwRS-239 | DunningBL.cs: GetDunningStopActive (Z. 170–182); cvw_InvoiceDunning NextDueDate |
| StRS-202 | SyRS-212 | SwRS-243 | DunningBL.cs: CalculateDunningStatistics (Z. 205–236) |
| StRS-202 | SyRS-213 | SwRS-242 | PaymentsBL.cs: DeleteIncomingPayment (Z. 38–78) |
| StRS-202 | SyRS-214 | SwRS-244 | OnlineBankingAccountTransactionsBL.cs: SaveOnlineBankingAccountTransactions (Z. 294–340) |
| StRS-202 | SyRS-214 | SwRS-245 | OnlineBankingAccountTransactionsBL.cs: CheckForCompleted (Z. 342–360) |
| StRS-202 | SyRS-214 | SwRS-246 | OnlineBankingAccountTransactionsBL.cs: AutoCompleteSingleAccountTransaciton (Z. 581–617) |
| StRS-202 | SyRS-214 | SwRS-247 | OnlineBankingAccountTransactionsBL.cs: BookAmountToAssignedInvoice (Z. 1042–1086) |
| StRS-202 | SyRS-214 | SwRS-248 | ScriptMethod11560.cs (Rechteanlage, TODO-Kommentar) |
| StRS-202 | SyRS-215 | SwRS-244 | FinApiClient.cs: LoadAccountTransactions (Z. 266 ff.); OnlineBankingFinApiBL.cs Z. 29–50 |
| StRS-203 | SyRS-216 | SwRS-249 | BookKeepingExportBL.cs: IsReceiptExported (Z. 209–226); PORTRECH/PORTWARE |
| StRS-203 | SyRS-216 | SwRS-250 | BookKeepingExportBL.cs: GetReceiptsBookingdataExportFile (Z. 443–544) |
| StRS-203 | SyRS-216 | SwRS-253 | CustomerCostCenterBL.cs: DeleteCustomerCostCenter (Z. 42–54) |
| StRS-203 | SyRS-216 | SwRS-255 | NamedQueryPool.xml: VoucherManagementGetVoucherArticles (Z. 680–709) |
| StRS-204 | SyRS-217 | SwRS-252 | SepaContractOnlinePdfDocumentHandler.cs: Confirm (Z. 78–178) |
| StRS-205 | SyRS-218 | SwRS-242 | PaymentsBL.cs: Rechteprüfung 10980 (Z. 43–44) |
| StRS-205 | SyRS-218 | SwRS-248 | CheckForUnknownIbanViewModel.cs: CheckUserRightsAsync (Z. 83–101) |
| StRS-205 | SyRS-218 | SwRS-254 | HelpdeskTimerWebServiceBL.cs: EDIT_TIME/OWN_TIME_EDIT (Z. 348–376) |
## A3 — Vertrieb & Belegwesen
| StRS-ID | SyRS-ID | SwRS-ID | Artefaktbeleg |
|---------|---------|---------|---------------|
| StRS-301 | SyRS-310 | SwRS-331 | OfferSpecificLogic.CanBeForwardedInto() (Zeile 314) |
| StRS-301 | SyRS-310 | SwRS-332 | ReceiptBL.ValidateReceiptForwarding() (Zeile 2462) |
| StRS-301 | SyRS-310 | SwRS-333 | ReceiptBL.ForwardReceipt() (Zeile 1548, UpdateReceiptNumber Zeile 1643) |
| StRS-301 | SyRS-311 | SwRS-330 | Centron.Interfaces\Sales\Receipts\ReceiptState.cs |
| StRS-301 | SyRS-311 | SwRS-343 | ReceiptBL.CreateNewVersion<T>() (Zeile 3068) |
| StRS-301 | SyRS-311 | SwRS-344 | AutomaticallyCloseReceiptHelperBL.ItemIsFinished() |
| StRS-302 | SyRS-312 | SwRS-334 | NumberGroupBL.GetNextNumber() (bedingtes UPDATE, Zeile 80) |
| StRS-302 | SyRS-312 | SwRS-335 | InvoiceSpecificLogic.GetNumberGroup() (Zeile 104) |
| StRS-302 | SyRS-313 | SwRS-336 | ReceiptPriceHelper.CalculateReceiptVatPrices() (Zeile 61) |
| StRS-302 | SyRS-313 | SwRS-337 | ReceiptBL.CheckIfAllArticlePositionsHaveVatRate() |
| StRS-302 | SyRS-314 | SwRS-338 | ReceiptInvoiceBL.CancelInvoice() (Zeile 143, Recht Zeile 154) |
| StRS-302 | SyRS-314 | SwRS-339 | ReceiptInvoiceBL.FixInvoice() (UPDATE RechKopf SET IsFixed=1) |
| StRS-302 | SyRS-314 | SwRS-354 | ReceiptItemBL.cs Zeile 2954 (Sperre stornierter Belege) |
| StRS-302 | SyRS-315 | SwRS-340 | ReceiptBL.CanUserEditReceipt() (Zeile 10273) |
| StRS-302 | SyRS-316 | SwRS-341 | DunningRunBL (Mahnstufen-Switch Zeilen 253–268) |
| StRS-302 | SyRS-316 | SwRS-342 | ReceiptBL.CheckIfCustomerLimitIsReached() |
| StRS-302 | SyRS-321 | SwRS-353 | ReceiptBL.GetReceiptConditionText() (Zeile 8500) |
| StRS-303 | SyRS-317 | SwRS-345 | ReceiptItemPriceBL.GetBasePrice() (Zeile 154) |
| StRS-303 | SyRS-317 | SwRS-346 | ReceiptItemPriceBL.GetSpecialPrice() (Zeile 588) + CustomerSpecialPriceMaps (KundenSonderpreise) |
| StRS-303 | SyRS-317 | SwRS-347 | ReceiptBL.CheckArticleMinPrices() (Zeilen 9036–9130) |
| StRS-304 | SyRS-318 | SwRS-351 | InvoiceZugferdBL.GenerateZugferdFile() (Zeile 124) |
| StRS-304 | SyRS-318 | SwRS-352 | ZugferdImportController.cs ([Authorize], POST parse) |
| StRS-305 | SyRS-319 | SwRS-349 | MailingDataBL.SaveMailingData() (Version=2, Zeile 78) |
| StRS-305 | SyRS-319 | SwRS-350 | AccountSearchBL (AdvertisingNotAllowed-Filter, Zeilen 993–1011) |
| StRS-305 | SyRS-320 | SwRS-348 | SSMS_DB_SCHEMA.sql, CustomerProductMatrixRating/ChangeLogs (Zeilen 36519/36535) |
## A4 — Artikel, Lager, Einkauf, Logistik, RMA
| StRS-ID | SyRS-ID | SwRS-ID | Artefaktbeleg |
|---------|---------|---------|---------------|
| StRS-401 | SyRS-410 | SwRS-435 | SSMS_DB_SCHEMA.sql, cvw_BarcodeCount (Status in (1,2,8)) |
| StRS-401 | SyRS-410 | SwRS-436 | SSMS_DB_SCHEMA.sql, Tabelle NebenlagerArtikel |
| StRS-401 | SyRS-410 | SwRS-441 | BarcodeBL.ValidateNewBarcode |
| StRS-401 | SyRS-410 | SwRS-443 | BarcodeBL.GetSystemSNID |
| StRS-401 | SyRS-411 | SwRS-430 | ArticleBL.CheckUserRightBeforeSave |
| StRS-401 | SyRS-411 | SwRS-431 | ArticleBL.SaveArticle (Duplikat-/Längenprüfung) |
| StRS-401 | SyRS-411 | SwRS-432 | ArticleStockBL.UpdateArticlePurchasePrice |
| StRS-401 | SyRS-411 | SwRS-433 | SecondStockArticleBL.RebookStockArticle (TRANSFER_STOCK) |
| StRS-401 | SyRS-412 | SwRS-434 | SecondStockArticleBL.StockBookOrBookout (ARTIKlog) |
| StRS-401 | SyRS-412 | SwRS-442 | BarcodeBL.CheckOutBarCodes |
| StRS-401 | SyRS-413 | SwRS-437 | InventoryNewBL.CloseInventory |
| StRS-401 | SyRS-413 | SwRS-438 | InventoryBL.CloseStorages |
| StRS-402 | SyRS-414 | SwRS-444 | OrderSuggestionListBL, _sqlArticle |
| StRS-402 | SyRS-415 | SwRS-445 | EDIDispatcherBL.CreateEDISuggestionOrderAsync |
| StRS-402 | SyRS-415 | SwRS-446 | SupplierEdiBL.SaveReceiptItemAssignments |
| StRS-402 | SyRS-418 | SwRS-450 | IceCatImportService.GetArticleAsync |
| StRS-402 | SyRS-418 | SwRS-451 | TradePoolBL.StartTradeImport |
| StRS-403 | SyRS-419 | SwRS-439 | OrderCommissionBL.HasUserRightsTooAccessCommissionModule |
| StRS-403 | SyRS-419 | SwRS-440 | OrderCommissionBL.ExecuteCommissionForOrders |
| StRS-403 | SyRS-416 | SwRS-447 | CentronGlsLogic.DoValidateShipment |
| StRS-403 | SyRS-416 | SwRS-448 | CentronShipcloudLogic.CreateShipmentAsync |
| StRS-404 | SyRS-417 | SwRS-449 | RmaBL.SaveRma |
## A5 — Helpdesk & Service
| StRS-ID | SyRS-ID | SwRS-ID | Artefaktbeleg |
|---------|---------|---------|---------------|
| StRS-501 | SyRS-511 | SwRS-531 | HelpdeskStatusBL.DeleteHelpdeskStatus() |
| StRS-501 | SyRS-511 | SwRS-532 | HelpdeskCloseBL.CloseHelpdeskForNotificationMethods() |
| StRS-501 | SyRS-511 | SwRS-549 | TicketProjectBL.SaveOrUpdateTicketProject() |
| StRS-501 | SyRS-511 | SwRS-550 | HelpdeskConnectionNumberBL.EnsureHelpdeskConnection() |
| StRS-501 | SyRS-512 | SwRS-533 | HelpdeskBL.CheckUserRigths() |
| StRS-501 | SyRS-512 | SwRS-534 | HelpdeskBL.CheckWebRights() |
| StRS-501 | SyRS-512 | SwRS-535 | HelpdeskBL.DoValidateMandatoryFields() |
| StRS-501 | SyRS-513 | SwRS-536 | HelpdeskBL.GetDueDateFromPriority() |
| StRS-501 | SyRS-514 | SwRS-537 | EscalationBL.CheckEskalationStage()/UpdateTicket() |
| StRS-501 | SyRS-520 | SwRS-543 | CentronChecklistBL.ObjectHasOpenChecklists() |
| StRS-502 | SyRS-515 | SwRS-538 | HelpdeskTimerWebServiceBL.ThrowIfUserDoesntHaveRightToChangeHelpdeskTimers() |
| StRS-502 | SyRS-515 | SwRS-539 | HelpdeskTimerBL.DeleteHelpdeskTimer() |
| StRS-502 | SyRS-515 | SwRS-542 | HelpdeskTimerWebServiceBL.CheckTimerCanBeMoved() |
| StRS-502 | SyRS-516 | SwRS-540 | HelpdeskTimerSignatureBL.SignMultipleTimers() |
| StRS-502 | SyRS-516 | SwRS-541 | HelpdeskTimerSignatureBL.RemoveSignatureFromTime() |
| StRS-503 | SyRS-517 | SwRS-544 | ExpectedEventsBL.SaveExpectedEvent() |
| StRS-503 | SyRS-517 | SwRS-545 | ExpectedEventsMaps.cs (Mapping MessageContains*) |
| StRS-503 | SyRS-517 | SwRS-547 | TaskManagementHelpdeskActionHandler.Execute() |
| StRS-504 | SyRS-518 | SwRS-546 | SelfCareBL.GetWebFormByGuid() |
| StRS-504 | SyRS-519 | SwRS-548 | SurveyProcessBL.GetSurveyfromTemplate() |
## A6 — Stammdaten & Assets
| StRS-ID | SyRS-ID | SwRS-ID | Artefaktbeleg |
|---------|---------|---------|---------------|
| StRS-601 | SyRS-605 | SwRS-620 | Centron.BL\Accounts\AccountBL.cs, ValidateUserRights |
| StRS-601 | SyRS-605 | SwRS-624 | Centron.BL\Accounts\AccountAddressBL.cs, CheckSpecialUserRightForAddressLanguageBeforeSave |
| StRS-601 | SyRS-605 | SwRS-625 | Centron.BL\Accounts\AccountAddressContactBL.cs, AccountSaveAddressContact |
| StRS-601 | SyRS-606 | SwRS-621 | Centron.BL\Accounts\AccountBL.cs, GetNewAccount |
| StRS-601 | SyRS-606 | SwRS-622 | SSMS_DB_SCHEMA.sql, IX_Accounts_Number / IX_AccountCustomers_UniqueNumber |
| StRS-601 | SyRS-606 | SwRS-623 | Centron.BL\Accounts\AccountBL.cs, DeleteAccount |
| StRS-601 | SyRS-606 | SwRS-626 | Centron.BL\Accounts\AccountAddressBL.cs, GetNotImportedGeoInfoList |
| StRS-602 | SyRS-607 | SwRS-627 | Centron.BL\EmployeeArea\AppUserBL.cs, SaveOrUpdateAppUser |
| StRS-602 | SyRS-607 | SwRS-629 | Centron.BL\EmployeeArea\AppUserBL.cs, GetActiveAppUsers |
| StRS-602 | SyRS-608 | SwRS-628 | Centron.BL\EmployeeArea\EmployeeBL.cs, SaveOrUpdateEmployee |
| StRS-603 | SyRS-609 | SwRS-630 | Centron.BL\Sales\CustomerAssets\Contracts\ClickContracts\MasterDataListBL.cs, SaveMasterDataList |
| StRS-603 | SyRS-609 | SwRS-631 | ebd., RemoveMainDeviceSerialNumber / SwapMainDeviceSerialNumber |
| StRS-603 | SyRS-609 | SwRS-633 | Centron.Entities\Entities\Sales\Receipts\MasterDataLists\MasterDataList.cs vs. Entities\Devices\AccountDevice.cs |
| StRS-603 | SyRS-610 | SwRS-632 | Centron.BL\Devices\AccountDeviceBL.cs, DeleteAccountDevice |
| StRS-603 | SyRS-610 | SwRS-637 | Centron.BL\Devices\AccountDeviceBL.cs (Negativbefund Rechteprüfung) |
| StRS-604 | SyRS-611 | SwRS-635 | Centron.BL\Tags\TagsBL.cs, AddTicketTag |
| StRS-604 | SyRS-611 | SwRS-636 | Centron.BL\Administration\Customization\ModuleCustomPropertyBL.cs, SaveCustomPropertyStructure |
| StRS-604 | SyRS-612 | — | Centron.BL\ObjectExternalReferences\ObjectExternalReferenceBL.cs, CreateReference |
| StRS-604 | SyRS-613 | SwRS-634 | Centron.BL\CountryArea\CountryBL.cs, UpdateCurrencyRateByRateDictionary |
## A7 — Kommunikation & persönliche Organisation
| StRS-ID | SyRS-ID | SwRS-ID | Artefaktbeleg |
|---------|---------|---------|---------------|
| StRS-701 | SyRS-711 | SwRS-731 | Centron.BL\Mail\Factory\CentronMailFactory.cs, GetMail() |
| StRS-701 | SyRS-711 | SwRS-732 | Centron.BL\Mail\Protocols\SMTPMail.cs, CreateSmtpClient() |
| StRS-701 | SyRS-711 | SwRS-733 | Centron.BL\Mail\Protocols\SMTPMail.cs, CreateMailMessage() |
| StRS-701 | SyRS-711 | SwRS-734 | Centron.BL\Mail\Protocols\SMTPMail.cs, FillMailBodyOld() |
| StRS-701 | SyRS-711 | SwRS-735 | Centron.BL\Mail\Blacklist\DomainBlacklistBL.cs, IsBlacklisted() |
| StRS-701 | SyRS-712 | — | Centron.BL\WebServices\Mail\SendMailWebserviceBL.cs, CheckFromAdress() |
| StRS-701 | SyRS-713 | SwRS-736 | Centron.BL\Mail\Templates\MailTemplateBL.cs, MailTemplate() (Fallback-Kommentar Z. 248–255) |
| StRS-701 | SyRS-713 | SwRS-737 | Centron.BL\Mail\Templates\MailTemplateBL.cs, GenerateVariables() |
| StRS-701 | SyRS-714 | SwRS-738 | Centron.BL\MailScanner\MailScannerBL.cs, GetProfiles() / EncryptProperties() |
| StRS-702 | SyRS-715 | SwRS-739 | Centron.BL\AppointmentRequests\AppointmentRequestBL.cs, HandleAppointmentRequestReply() |
| StRS-702 | SyRS-716 | SwRS-740 | Centron.BL\Calendar\CalendarBL.cs, GetCalendarSynchronizationSettings() |
| StRS-704 | SyRS-717 | SwRS-741 | Centron.BL\Tapi\PhoneCallBL.cs, SearchContactPersonByPhoneNumberV2() |
| StRS-704 | SyRS-717 | SwRS-742 | Centron.BL\Tapi\PhoneCallBL.cs, SyncPhoneCalls() (Lizenzprüfung) |
| StRS-704 | SyRS-718 | SwRS-743 | Centron.BL\Chats\ChatBL.cs, GetFilterExpression() (OnlyOwn/Membership) |
| StRS-703 | SyRS-718 | SwRS-744 | Centron.BL\NexusNotifications\NexusNotificationsBL.cs, MarkAllNexusNotificationsAsRead() |
| StRS-703 | SyRS-718 | SwRS-748 | Centron.BL\SocialMedia\SocialMediaBL.cs, AddCommentToASocialMediaAction() |
| StRS-703 | SyRS-719 | SwRS-745 | Centron.BL\ToDoArea\ToDoBL.cs, GetTodosThroughPaging() (RIGHT_FREMDTODOLISTE) |
| StRS-703 | SyRS-719 | SwRS-746 | Centron.BL\MyDay\MyDayBL.cs, SaveOrUpdateWorkItem() (UniqueId-Dedup) |
| StRS-703 | SyRS-719 | SwRS-747 | Centron.BL\VideoPortal\VideoPortalAssignmentBL.cs, SaveVideoPortalAssignment() |
## A8 — Web-Client Nexus & Service-Schnittstellen
| StRS-ID | SyRS-ID | SwRS-ID | Artefaktbeleg |
|---------|---------|---------|---------------|
| StRS-801 | SyRS-811 | SwRS-839 | src\nexus\CentronNexus\Shared\Authorization\ClaimsService.cs (GetClaims) |
| StRS-801 | SyRS-811 | SwRS-840 | src\nexus\CentronNexus\Shared\Authorization\PortAuthorization.cs (PortHandler) |
| StRS-802 | SyRS-811 | SwRS-848 | src\nexus\CentronNexus\ProductionOrderManagement\Pages\ProductionOrderOverView.razor (fehlendes Authorize-Attribut) |
| StRS-801 | SyRS-812 | SwRS-841 | src\backend\Centron.BL\Sales\Receipts\ReceiptCartBL.cs (ThrowIfCanNotAccessCart) |
| StRS-801 | SyRS-812 | SwRS-842 | src\backend\Centron.BL\Sales\Receipts\ReceiptCartReleaseSystemBL.cs (OrdererApproveCart) |
| StRS-801 | SyRS-813 | SwRS-843 | src\nexus\CentronNexus\WebOffer\WebReceiptOverview.razor (ChangeWebReceiptState) |
| StRS-801 | SyRS-814 | SwRS-844 | src\backend\Centron.BL\Administration\Documents\Dsgvo\DsgvoBL.cs (ConfirmOnlinePdfDocument) |
| StRS-801 | SyRS-815 | SwRS-845 | src\backend\Centron.BL\Sales\Support\HelpdeskSearchBL.cs (IsWebAccountLogin-Filter) |
| StRS-802 | SyRS-816 | SwRS-846 | src\backend\Centron.BL\Sales\Support\HelpdeskCloseBL.cs (CloseHelpdesk) |
| StRS-802 | SyRS-816 | SwRS-847 | src\nexus\CentronNexus\ProductionOrderManagement\Components\WorkStepTemplateComponent.razor (FinishWorkstep) |
| StRS-803 | SyRS-817 | SwRS-831 | src\webservice\Centron.Controllers\Authorization\AuthorizeUserRightAttribute.cs (OnAuthorization) |
| StRS-803 | SyRS-817 | SwRS-832 | src\webservice\Centron.Controllers\Authorization\CentronHostedAuthorization.cs (HandleRequirementAsync) |
| StRS-803 | SyRS-817 | SwRS-833 | src\webservice\Centron.Controllers\Controllers\Unversioned\JwtAuthController.cs (LoginWithBearer) |
| StRS-803 | SyRS-817 | SwRS-834 | src\webservice\Centron.Controllers\Controllers\Unversioned\TwoFactorAuthController.cs (ValidateTwoFactorCode) |
| StRS-803 | SyRS-817 | SwRS-835 | src\backend\Centron.BL\WebServices\Administration\Logins\WebAccountWebServiceBL.cs (HasUserRight WEBACCOUNT_MANAGEMENT) |
| StRS-803 | SyRS-818 | SwRS-836 | src\webservice\Centron.Host\AspNetCore\WcfBridge\Interception\Interceptors\AuthenticateInterceptor.cs (InterceptExecution) |
| StRS-803 | SyRS-818 | SwRS-849 | src\backend\Centron.BL\Mobile\MobileBL.cs (GetMobileEmployee) |
| StRS-803 | SyRS-818 | SwRS-850 | src\backend\Centron.BL\WebLinks\WebLinkActionAccountActivityHandler.cs (Execute) |
| StRS-803 | SyRS-819 | SwRS-837 | src\webservice\Centron.Controllers\Configuration\GlobalExceptionFilter.cs (OnException) |
| StRS-803 | SyRS-819 | SwRS-838 | src\webservice\Centron.Controllers\Configuration\Routing\KebabCaseTransformer.cs (TransformOutbound) |
| StRS-804 | SyRS-820 | — | src\webservice\Centron.Host.Console\Program.cs (CentronHost.Instance.Start) |
Hinweis: SwRS-848 hängt unter SyRS-811 (Zugriffsschutz) und zusätzlich fachlich unter StRS-802; SwRS-850 ist sekundär auch SyRS-816 zugeordnet (Tracelinks im Block).
## A9 — Datenaustausch & Integrationen
| StRS-ID | SyRS-ID | SwRS-ID | Artefaktbeleg |
|---------|---------|---------|---------------|
| StRS-901 | SyRS-911 | SwRS-931 | src\backend\Centron.BL\RiverDivo\RiverDivoBL.cs → ValidateRmmAccessKey (FixedTimeEquals) |
| StRS-901 | SyRS-911 | SwRS-933 | src\backend\Centron.BL\RiverDivo\RiverDivoBL.cs → CreateHelpdeskRequest (CreatedFrom = 7) |
| StRS-901 | SyRS-911 | SwRS-935 | src\backend\Centron.BL\RiverDivo\RiverDivoBL.cs → GetAllCustomersForSync (ChangedAfterDate, LogoHash) |
| StRS-901 | SyRS-912 | SwRS-932 | src\backend\Centron.BL\WebServices\Rmm\RmmConnectionSettingsWebServiceBL.cs → HasUserRight(SETTINGS) |
| StRS-901 | SyRS-912 | SwRS-937 | src\backend\Centron.BL\DataExchange\Connectors\DocBeeTicketCreationBL.cs → IsDocBeeActive (Lizenzprüfung) |
| StRS-901 | SyRS-912 | SwRS-947 | src\webservice\Centron.Controllers\Controllers\v1\DataExchange\TelekomDiveController.cs → SaveProfiles (ohne Rechteattribut) |
| StRS-901 | SyRS-913 | SwRS-934 | src\backend\Centron.BL\RiverDivo\RiverDivoBL.cs → GetCentronCustomerI3D (RiverbirdCustomerReference) |
| StRS-901 | SyRS-913 | SwRS-936 | src\backend\Centron.BL\DataExchange\Connectors\DocBeeTicketTimerBL.cs → SaveDocBeeTicketTimer |
| StRS-904 | SyRS-913 | SwRS-942 | src\backend\Centron.BL\Integrations\EsCustomerGroupBL.cs → Create/Delete (Soft-Delete) |
| StRS-901 | SyRS-913 | SwRS-945 | src\backend\Centron.BL\CPra\CPraConnectorBL.cs → GenerateLink (Base64-Parameter) |
| StRS-903 | SyRS-914 | SwRS-938 | src\backend\Centron.BL\DataExchange\DocuForm\DocuFormApiSettingsBL.cs → AES + SETTINGS-Recht |
| StRS-903 | SyRS-914 | SwRS-939 | src\centron\Centron.WPF.UI\Modules\Finances\DeviceClickCounter\DocuFormApiImport\DocuFormApiImportViewModel.cs → DownloadDeviceCounters |
| StRS-902 | SyRS-915 | SwRS-940 | src\backend\Centron.Entities\Entities\DataExchange\TelekomDive\TelekomDiveProfile.cs |
| StRS-902 | SyRS-915 | SwRS-941 | src\centron\Centron.WPF.UI\Modules\TelekomDive\TelekomDiveExportViewModel.cs → ExportToXml |
| StRS-902 | SyRS-916 | SwRS-946 | src\backend\Centron.Gateway\DataExchange\BookKeeping\BookKeepingFileExport.cs → PrepareStoreFile |
| StRS-904 | SyRS-917 | SwRS-943 | src\backend\Centron.BL\Administration\FileManagement\DirectoryBL.cs → IsDocSyncEnabledForObjectKind |
| StRS-904 | SyRS-917 | SwRS-944 | src\centron\Centron.WPF.UI\Modules\DataExchange\DataImport\AccountImport\IbanValidation.cs → IbanChecksumCheck |
| StRS-901 | SyRS-918 | — | src\backend\Centron.BL\RiverDivo\RiverConnectionBL.cs → GetActiveDirectoryUsers (WebAccount-Isolationsprüfung) |
## A10 — Produktion, Projekte, PLM, QM, Statistik, Reporting
| StRS-ID | SyRS-ID | SwRS-ID | Artefaktbeleg |
|---------|---------|---------|---------------|
| StRS-1001 | SyRS-1010 | SwRS-1030 | ProductionOrderBL.cs: LicenseManager.HasLicense(LicenseGuids.ProductionManagement)-Gate |
| StRS-1001 | SyRS-1010 | SwRS-1031 | ProductionBL.cs: Lizenzgate vor Maschinenstammdaten |
| StRS-1001 | SyRS-1011 | SwRS-1030 | ProductionOrderItemState.cs / ProductionOrderLogKind.cs |
| StRS-1001 | SyRS-1011 | SwRS-1031 | SSMS_DB_SCHEMA.sql: ProductionOrders/ProductionOrderLogs NOT-NULL-Constraints |
| StRS-1002 | SyRS-1012 | SwRS-1037 | SaleStatisticBL.GetSalesArticleStatistic: SALES_STATISTIC-Prüfung |
| StRS-1002 | SyRS-1012 | SwRS-1038 | ManagementInfoBL: MANAGEMENT_INFO_ONLY_OWN_BRANCH-Zwangsfilter |
| StRS-1002 | SyRS-1012 | SwRS-1046 | ModulesSlideViewModel.cs: Gruppierung/Suche/Favoriten |
| StRS-1002 | SyRS-1013 | SwRS-1041 | ReportDataBL.ExecuteQuery: Regex-Variablenersetzung |
| StRS-1002 | SyRS-1013 | SwRS-1042 | SSMS_DB_SCHEMA.sql: Tabellen ReportData und Reports |
| StRS-1002 | SyRS-1013 | SwRS-1043 | ReportServerAppModuleController.Description + ReportServerConnector |
| StRS-1002 | SyRS-1014 | SwRS-1041 | ReportDataWebBL.ReportEngineExecuteQuery: SQL_MANAGER/REPORT_MANAGEMENT-Prüfung |
| StRS-1002 | SyRS-1019 | SwRS-1032 | ProjectManagementViewModel.RefreshAsync/RefreshEmployeeWorkload |
| StRS-1003 | SyRS-1015 | SwRS-1033 | ProjectPriceImportViewModel: Fehlerliste + SpecialAgreementDifferenceViewModel |
| StRS-1003 | SyRS-1015 | SwRS-1044 | MassUpdateBL.StartReceiptPriceUpdate: ReceiptState.Active-Prüfung |
| StRS-1003 | SyRS-1015 | SwRS-1045 | MassUpdateBL.StartArticlePriceUpdate: Bulkchanger-Log |
| StRS-1003 | SyRS-1016 | SwRS-1036 | ReceiptBL.CheckIfAssetReasonIsNeeded: IsMandatory-Prüfung |
| StRS-1004 | SyRS-1017 | SwRS-1039 | MspCollectorsBL.MspDowloadStart: Duplikatprüfung MspCollectorInvoiceHead |
| StRS-1004 | SyRS-1017 | SwRS-1040 | MspCollectorsBL.UpdateMspContractItem: MspEvaluationDecision-Switch |
| StRS-1004 | SyRS-1017 | SwRS-1047 | AssetManagementArticleAssignmentBL: Löschschutz bei Vertragsreferenz |
| StRS-1004 | SyRS-1018 | SwRS-1034 | ProductFamilyBL.ImportProductLifecycleInformations: Dedup-Query |
| StRS-1004 | SyRS-1018 | SwRS-1035 | ProductFamilyBL: DaysToTolerate-Fristlogik + UserForPLM |
## A11 — Plattform & Querschnitt
| StRS-ID | SyRS-ID | SwRS-ID | Artefaktbeleg |
|---------|---------|---------|---------------|
| StRS-1101 | SyRS-1110 | SwRS-1130 | src\backend\Centron.DAO\DAOSession.cs (WithTransaction) |
| StRS-1101 | SyRS-1110 | SwRS-1143 | src\centron\Centron.WPF.UI\CentronFileSystem\CentronFileSystemConnector.cs |
| StRS-1101 | SyRS-1111 | SwRS-1131 | src\backend\Centron.Entities\PersistedEntity.cs (operator ==) |
| StRS-1101 | SyRS-1111 | SwRS-1132 | src\backend\Centron.DAO\DAOFactory.cs:100-127 (AppendListeners) |
| StRS-1101 | SyRS-1111 | SwRS-1147 | src\backend\Centron.DAO\Mappings\...\MandatorMaps.cs / MandatoryMaps.cs (Table("Mandant")) |
| StRS-1101 | SyRS-1112 | — | tests\Centron.Tests.Integration\IntegrationTest.cs (TestGetHelpdesksThroughPaging) |
| StRS-1102 | SyRS-1114 | — | src\centron\Centron.WPF.UI\nlog.config (csvTarget, WARN, 15 Archive) |
| StRS-1102 | SyRS-1115 | SwRS-1133 | src\backend\Centron.DAO\ChangeTracking\ChangeTrackingEventListener.cs |
| StRS-1102 | SyRS-1115 | SwRS-1134 | src\backend\Centron.DAO\ChangeTracking\LogHourlySurchargeRateChangesListener.cs |
| StRS-1102 | SyRS-1115 | SwRS-1135 | SSMS_DB_SCHEMA.sql:34746 (ChangeLog + IX_ChangeLog) |
| StRS-1102 | SyRS-1116 | SwRS-1136 | src\backend\Centron.BL\Telemetry\TelemetryBL.cs (MERGE WITH (HOLDLOCK)) |
| StRS-1102 | SyRS-1116 | SwRS-1137 | src\backend\Centron.BL\Telemetry\TelemetryBL.cs (InsertMissingNames) |
| StRS-1103 | SyRS-1117 | SwRS-1138 | src\backend\Centron.BL\IndexSearch\IndexBuilder.cs |
| StRS-1103 | SyRS-1117 | SwRS-1139 | src\backend\Centron.BL\IndexSearch\IndexSearchBL.cs (UpdateIndexesInternal) |
| StRS-1103 | SyRS-1117 | SwRS-1140 | SSMS_DB_SCHEMA.sql:45591 (ObjectFulltextIndex/Stats) |
| StRS-1103 | SyRS-1118 | SwRS-1141 | src\backend\Centron.BL\ArtificialIntelligence\AiApiLinkValidator.cs |
| StRS-1103 | SyRS-1118 | SwRS-1142 | src\backend\Centron.BL\Administration\ArtificialIntelligence\ArtificialIntelligenceBL.cs:184 |
| StRS-1104 | SyRS-1113 | — | src\centron\Centron.WPF.UI\ConnectionHeartbeatTimer.cs (TimerTick) |
| StRS-1104 | SyRS-1119 | SwRS-1143 | src\centron\Centron.WPF.UI\CentronFileSystem\CentronFileSystemConnector.cs (CheckOutDocument) |
| StRS-1104 | SyRS-1120 | SwRS-1144 | src\centron\Centron.WPF.UI\Localization\LocalizationHelper.cs |
| StRS-1104 | SyRS-1121 | SwRS-1145 | src\backend\Centron.BL\GUI\Profiles\UiProfileBL.cs:51 |
| StRS-1104 | SyRS-1121 | SwRS-1146 | src\backend\Centron.BL\ExternalToolsBL\ExternalToolBL.cs (SaveExternalTool) |
## A12 — Administration, Konfiguration & Betrieb
| StRS-ID | SyRS-ID | SwRS-ID | Artefaktbeleg |
|---------|---------|---------|---------------|
| StRS-1201 | SyRS-1211 | SwRS-1231 | MandatorManagementViewModel.DeleteMandatorAsync (State = 0) |
| StRS-1201 | SyRS-1211 | SwRS-1232 | MandatorManagementViewModel.IsSetToDefault / EditBranchDetails |
| StRS-1201 | SyRS-1211 | SwRS-1233 | MandatorWebServiceBL.SaveMandatoryExtended (fehlende Rechteprüfung) |
| StRS-1201 | SyRS-1211 | SwRS-1234 | MandatorManagementViewModel.SaveMandatorInstructionPrompt (Rechteprüfung 10510) |
| StRS-1202 | SyRS-1212 | SwRS-1235 | SSMS_DB_SCHEMA.sql [dbo].[ApplicationSettings] |
| StRS-1202 | SyRS-1212 | SwRS-1236 | docs\guides\development\settings-management.md + Tabellen Stammdat/ApplicationSettings |
| StRS-1202 | SyRS-1212 | SwRS-1245 | ReportDataWebBL.ReportEngineExecuteQuery (Rechteprüfung SQL_MANAGER) |
| StRS-1202 | SyRS-1213 | SwRS-1237 | TextModuleBL.GetTextModule (dreistufige Kaskade) |
| StRS-1202 | SyRS-1213 | SwRS-1238 | TextModuleBL.ReplaceCustomerTextBlockVariables ("@@") |
| StRS-1203 | SyRS-1214 | SwRS-1239 | ManagedBackgroundService.GetIsEnabledCached/GetDelayWithBackoff |
| StRS-1203 | SyRS-1214 | SwRS-1240 | DataQualityService.ExecuteService (Task-Isolation) |
| StRS-1202, StRS-1203 | SyRS-1215 | SwRS-1241 | EscalationTypeSettingViewModel.EscTypeVM_To_DTO (Hour1-3, StageReceivers) |
| StRS-1204 | SyRS-1216 | SwRS-1242 | PdfSigningBL.SavePdfSigningSettings (Rechteprüfung + AES) |
| StRS-1204 | SyRS-1216 | SwRS-1243 | PdfSigningBL.SignPdfDocument (Pkcs7Signer/SHA256/TSA) |
| StRS-1204 | SyRS-1216 | SwRS-1244 | PdfExportSettingsViewModel.InitializeDropdownLists (PDF/A-Stufen) |
| StRS-1203 | SyRS-1217 | SwRS-1248 | docker\compose\compose.yaml + CentronService.cs |
| StRS-1202 | SyRS-1218 | SwRS-1246 | HourlySurchargeRateItemViewModel.UpdateInvalidRatesReasons + HourlySurchargeRateLog |
| StRS-1203 | SyRS-1219 | SwRS-1247 | UpdateAvailableNotificationBL.ShowUpdatesFor |
@@ -0,0 +1 @@
{"is_error":false,"duration_api_ms":15462451,"num_turns":2,"stop_reason":"end_turn","session_id":"73f6a03e-8aed-4897-8d13-e9e10ba3a32b","total_cost_usd":205.92314750000008,"usage":{"input_tokens":4,"cache_creation_input_tokens":1791,"cache_read_input_tokens":453523,"output_tokens":2278,"output_tokens_details":{"thinking_tokens":253},"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":1791,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":1575,"cache_read_input_tokens":227183,"cache_creation_input_tokens":948,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":948},"type":"message"}],"speed":"standard"},"modelUsage":{"claude-haiku-4-5-20251001":{"inputTokens":6962,"outputTokens":29,"cacheReadInputTokens":0,"cacheCreationInputTokens":0,"webSearchRequests":0,"costUSD":0.0071070000000000005,"contextWindow":200000,"maxOutputTokens":32000,"canonicalModel":"claude-haiku-4-5","provider":"firstParty","costBasis":"list"},"claude-fable-5":{"inputTokens":1626,"outputTokens":1343904,"cacheReadInputTokens":92177958,"cacheCreationInputTokens":3603520,"webSearchRequests":0,"costUSD":205.91604050000007,"contextWindow":1000000,"maxOutputTokens":64000,"canonicalModel":"claude-fable-5","provider":"firstParty","costBasis":"list"}},"permission_denials":[],"terminal_reason":"completed","fast_mode_state":"off","fast_mode_disabled_reason":"extra_usage_disabled","origin":{"kind":"task-notification"},"subagent_stats":{"spawned":18,"requested":{"background":0,"foreground":0,"unset":18},"started_in_background":18,"max_depth":1,"spawned_by_subagents":0,"completed":16,"failed":2,"killed":{"parent":0,"user":0,"system":0},"refused":{"depth_limit":0,"concurrency_limit":0,"budget":0},"by_type":{"general-purpose":18}},"subtype":"success","api_error_status":null,"result":"Der Lauf ist abgeschlossen. Alle sieben Ergebnisdateien liegen im Verzeichnis `Ergebnisse\\` und sind konsistenzgeprüft.\n\n## Ergebnis\n\n**413 Anforderungen** aus der gesamten Codebasis der c-entron ERP-Suite, verteilt auf drei Ebenen nach ISO/IEC/IEEE 29148: **50 StRS**, **122 SyRS**, **241 SwRS** — dazu Traceability (269 Ketten StRS↔SyRS↔SwRS), 16 Hypothesen, 203 Glossarbegriffe und der Analysebericht mit Modulinventar, Abdeckungstabelle und Konsistenzcheck.\n\n**Vorgehen:** Vor der ersten Anforderung wurde ein Modulinventar mit 96 Modulen erstellt (Schritt 0), danach in 12 parallelen Analyse-Clustern (Sicherheit, Finanzen/Abrechnung, Vertrieb, Lager/Einkauf, Helpdesk, Stammdaten, Kommunikation, Web/Schnittstellen, Integrationen, Produktion/Reporting, Plattform, Administration) mit eigenen ID-Nummernkreisen gearbeitet — erst Mindestabdeckung, dann Vertiefung nach Risiko.\n\n**Kennzahlen aus dem skriptgestützten Konsistenzcheck:**\n- Mindestabdeckung erfüllt: alle 96 Module haben ≥1 Anforderung (42 tief, 48 mittel, 6 flach, 0 nicht analysiert)\n- Keine doppelten IDs, keine Anforderung ohne Beleg, Prüfidee oder Übernahmewürdigkeit, keine toten Tracelinks\n- **198 risikorelevante Anforderungen** (Sicherheit/Abrechnung/Berechtigungen): jede mit PRIMÄR-Beleg inkl. durchsetzender Stelle oder als Hypothese gekennzeichnet — 0 Verstöße; die Liste steht vollständig im Analysebericht\n- `Hypothesen.md` deckungsgleich mit den 16 Inline-Markierungen (3,9 % Hypothesenquote)\n- 44 Konsolidierungskandidaten, alle 21 nicht-funktionalen Anforderungen mit ISO-25010-`Qualitätsmerkmal`\n\n**Fachlich wichtigste Befunde:** Der im Prompt genannte Konsolidierungsfall (Stammblätter vs. Assets) wurde bestätigt und auf **drei** Gerätedatenhaltungen erweitert; daneben ~20 weitere Doppelimplementierungen (zwei Berechtigungssysteme, drei E-Rechnungs-Generatoren, Inventur/Kommissionierung alt/neu, zwei Settings-Datenhaltungen u. a.). Für die SaaS-Neuimplementierung kritisch: ungesalzene SHA1-Passworthashes, hartkodierte Secrets (AES-Fallback, finAPI), fehlende datenraumtrennende Mandantenfähigkeit, keine Schreibsperre für festgeschriebene Rechnungen, sowie fünf als Hypothese dokumentierte Verdachtsfälle nur clientseitiger Rechteprüfung.\n\nZwei Hinweise zur Durchführung: Zwei Analyse-Agenten brachen unterwegs an API-Fehlern ab und wurden mit erhaltenem Kontext erfolgreich fortgesetzt; da Shell-Schreibzugriffe auf das Ausgabeverzeichnis von der Rechtekonfiguration verweigert wurden, erfolgte die Zusammenführung der großen Dateien über Subagenten mit dem Write-Tool (jeweils byteidentisch gegen die Quellkonkatenation verifiziert). Die Codebasis selbst wurde ausschließlich gelesen.","ttft_ms":5456,"ttft_stream_ms":3850,"time_to_request_ms":10,"type":"result","duration_ms":36521,"uuid":"466ea4d1-f66d-4d0f-9eaf-aefc1a731d26","queued_turn_count":0}
@@ -0,0 +1,178 @@
# Versuch 01 - Baseline (Prompt-only) - Iteration 02
## Metadaten
- **Versuch:** V1 Baseline (Prompt-only)
- **Iteration:** 02 (erste Überarbeitung nach Auswertung von Iteration 01)
- **Codebasis:** c-entron ERP-Suite (Windows, C#/XAML, MSSQL)
- **Zeitstempel:** 2026-08-26
- **Vorgänger:** `01_Prompt.md` (SHA-256 `1B0DB06B…3C02FF`), 24 Läufe an Tag 1
- **Änderungsgrund:** Auswertung der 24 Läufe von Tag 1 über 3.287 erzeugte Anforderungen. Jede Änderung ist an einen gemessenen Befund gekoppelt:
| Änderung | Auslösender Befund |
|---|---|
| Modulinventar als Pflicht-Vorstufe, Mindestabdeckung je Modul, Vertiefung erst danach | Anforderungszahl schwankte je Lauf zwischen 42 und 325 (Faktor 5,9); 55 bis 60 von rund 85 Modulen blieben unanalysiert; die Modultabellen der Analyseberichte reichten von 0 bis 51 Zeilen |
| Hypothesenpflicht kalibriert, `Hypothesen.md` deckungsgleich mit den Inline-Markierungen | Zwei Läufe meldeten null Hypothesen bei 71 bzw. 148 Anforderungen; der Anteil schwankte zwischen 0 % und 26,2 %; mehrfach wichen Sammeldatei und Inline-Markierungen voneinander ab |
| Primärbeleg muss die durchsetzende Stelle benennen | 45,9 % aller Anforderungen trugen genau einen Beleg; in einem Lauf waren 5 von 31 risikorelevanten Anforderungen weder mit `PRIMÄR` noch als `[HYPOTHESE]` gedeckt |
| Belegpflicht verschärft: ohne Beleg keine Anforderung | Eine Anforderung wurde ohne jeden Beleg geschrieben |
| Konsolidierungsbegriff an einem Beispiel kalibriert | Anteil der Konsolidierungskandidaten schwankte je Lauf zwischen 2,4 % und 35,2 % |
| Eigenes Feld `Qualitätsmerkmal` für die ISO-25010-Zuordnung | Die Zuordnung war gefordert, hatte aber keinen Ablageort: nur 33 von 313 nicht-funktionalen Anforderungen führten sie als eigene Angabe |
| Risikoanforderungen im Konsistenzcheck auflisten | Verstöße gegen die risikobasierte Priorisierung fielen erst in der nachgelagerten Auswertung auf, nicht im Lauf selbst |
Unverändert bleiben Prüfidee, Tracelinks, Belegklassifikation und das Blockformat: Prüfidee und Tracelinks waren in **allen** 3.287 Anforderungen gesetzt, 78,6 % der Belege waren `PRIMÄR`.
> 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.
---
## 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.
**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. Diese Angabe steuert die spätere fachliche Priorisierung; eine Fehleinschätzung ist unkritisch, eine fehlende Angabe nicht.
- **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)
```
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)
```
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?
---
### Werkzeugkontext (vom Versuchsaufbau vorgegeben)
Für diesen Lauf stehen zur Verfügung: Lesen und Suchen von Dateien, das Ausführen von
Kommandozeilenbefehlen im Arbeitsverzeichnis sowie die werkzeugeigenen Subagenten.
Nicht verfügbar sind: spezialisierte Agentenrollen aus Konfigurationsdateien, externe
Werkzeugserver.
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 3\claude-fable-5\builtin\high\02_Lauf_2026-08-27_095953_v7.0.0-6ce6\Ergebnisse\`.
Verändere keine Dateien im Arbeitsverzeichnis (der analysierten Codebasis).