Tag 1 abgeschlossen
This commit is contained in:
+7
@@ -96,6 +96,8 @@ allen V1b-Laeufen, wo sie um bis zu Faktor 21,6 auseinanderlagen.
|
||||
|
||||
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
|
||||
|
||||
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
|
||||
|
||||
### Verteilung über die Ebenen
|
||||
|
||||
| Ebene | Anzahl | Anteil |
|
||||
@@ -130,6 +132,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
|
||||
| Belege je Anforderung (Median) | 1,0 |
|
||||
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 38 (90,5 %) |
|
||||
|
||||
### Übernahmewürdigkeit
|
||||
|
||||
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
|
||||
|
||||
### Status
|
||||
|
||||
| Kategorie | Anzahl | Anteil |
|
||||
@@ -147,6 +153,7 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
|
||||
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
|
||||
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (20 risikorelevante Anforderungen, alle gedeckt) |
|
||||
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
|
||||
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
|
||||
| **Traceability** – Verknüpfung zwischen den Ebenen | 42 von 42 mit Tracelinks (100,0 %) |
|
||||
|
||||
## Vergleich V1 (solo) gegen V1b (builtin)
|
||||
|
||||
+84
-42
@@ -15,7 +15,8 @@
|
||||
"tracelinks": "SyRS-001, SwRS-001, SwRS-002",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Einem Testbenutzer wird eine Gruppe ohne ein bestimmtes Recht zugewiesen; die zugehörige Funktion darf im Client nicht sichtbar/ausführbar sein.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-002",
|
||||
@@ -32,7 +33,8 @@
|
||||
"tracelinks": "SyRS-002, SwRS-003",
|
||||
"konsolidierung": "Kandidat: Gleiches Muster wiederkehrend bei Kalender (RIGHT_KALENDERANZEIGENEIGENE) und Mitarbeiterauslastung (RIGHT_MITARBEITERAUSLASTUNGNUREIGENEFILIALE) — im Zielsystem als generisches \"Sichtbarkeits-Scoping\" konsolidierbar.",
|
||||
"pruefidee": "Zwei Testbenutzer unterschiedlicher Filialen mit \"nur eigene Filiale\"-Recht dürfen jeweils nur Tickets ihrer eigenen Filiale in der Liste sehen.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-003",
|
||||
@@ -49,7 +51,8 @@
|
||||
"tracelinks": "SyRS-003, SyRS-004, SwRS-004, SwRS-005",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Aus einem Auftrag wird ein Lieferschein und daraus eine Rechnung erzeugt; `GetRelatedItemsForObject` für die Rechnung muss Auftrag und Lieferschein als Ursprungsbelege zurückliefern.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-004",
|
||||
@@ -65,7 +68,8 @@
|
||||
"tracelinks": "SyRS-004, SwRS-005",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Für einen Auftrag mit einer Anzahlungsrechnung liefert `GetRelatedItemsForObject(Auftrag)` die Anzahlungsrechnung als verknüpftes Objekt.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-005",
|
||||
@@ -81,7 +85,8 @@
|
||||
"tracelinks": "SyRS-005, SwRS-006",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Ein neu angelegter Beleg hat Status \"offen\"; nach Stornierung liefert eine Statusabfrage \"storniert\".",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-006",
|
||||
@@ -97,7 +102,8 @@
|
||||
"tracelinks": "SyRS-006, SwRS-007",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Zwei parallele Aufrufe von `GetNextNumber(updateDatabase:true)` für denselben Nummernkreis dürfen keine identische Nummer liefern (Lasttest mit paralleler Ausführung).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-007",
|
||||
@@ -114,7 +120,8 @@
|
||||
"tracelinks": "SyRS-007, SyRS-008, SwRS-008, SwRS-009",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Ein Ticket wird angelegt, bearbeitet, Zeit erfasst und abgeschlossen; jeder Schritt ist im Änderungsprotokoll nachvollziehbar.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-008",
|
||||
@@ -130,7 +137,8 @@
|
||||
"tracelinks": "SyRS-002, SwRS-009",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Testbenutzer mit EDIT_HELPDESK aber ohne CLOSE_REQUEST versucht, Status auf \"geschlossen\" zu setzen → erwartet: Fehler-Result, kein Speichern.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-009",
|
||||
@@ -146,7 +154,8 @@
|
||||
"tracelinks": "SyRS-009, SwRS-010",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Wareneingang über einen Lieferschein erhöht den Bestand des betroffenen Artikels am betroffenen Lagerort um die Liefermenge.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-010",
|
||||
@@ -164,7 +173,8 @@
|
||||
"tracelinks": "SyRS-010",
|
||||
"konsolidierung": "Kandidat: Partnerspezifische EDI-Module folgen strukturell ähnlichem Muster (Import/Connector-Klassen) — im Zielsystem als generisches EDI-Adapter-Framework konsolidierbar. [HYPOTHESE: nicht im Detail verglichen, ob die Partner-Implementierungen tatsächlich strukturell identisch sind — Bestätigung erfordert Tiefenanalyse je Partnermodul.]",
|
||||
"pruefidee": "Eine Testdatei im jeweiligen Partnerformat wird importiert; Ergebnis ist ein systemseitig referenzierbarer Beleg/Belegstatus.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-011",
|
||||
@@ -181,7 +191,8 @@
|
||||
"tracelinks": "SyRS-011, SyRS-002",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Ein Web-Account meldet sich in CentronNexus an und sieht ausschließlich für ihn freigegebene Artikel (Sonderpreise) im WebCart.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-012",
|
||||
@@ -197,7 +208,8 @@
|
||||
"tracelinks": "SyRS-012, SwRS-011",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Für ein beliebiges Modul existieren sowohl eine `BL{Modul}Logic`- als auch eine `WS{Modul}Logic`-Klasse, die dasselbe `I{Modul}Logic`-Interface implementieren.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-013",
|
||||
@@ -214,7 +226,8 @@
|
||||
"tracelinks": "SyRS-013",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Stichprobe von 20 zufälligen benutzersichtbaren Strings im WPF-Client: alle sind auf Deutsch vorhanden (Basis-resx).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-014",
|
||||
@@ -231,7 +244,8 @@
|
||||
"tracelinks": "SyRS-007, SwRS-008",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Eine bereits abgerechnete Zeitbuchung eines Tickets kann über EDIT_TIME nicht mehr gelöscht werden (erwarteter Fehler).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-001",
|
||||
@@ -247,7 +261,8 @@
|
||||
"tracelinks": "StRS-001; SwRS-001",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Direkter Aufruf von `CheckRightsFromUser` mit der I3D eines Rechts, das keiner Gruppe des Benutzers zugewiesen ist, liefert eine leere Liste.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-002",
|
||||
@@ -263,7 +278,8 @@
|
||||
"tracelinks": "StRS-002; SwRS-003",
|
||||
"konsolidierung": "Kandidat: identisches Scoping-Muster (All/OnlyOwn/OnlyOwnBranch) potenziell in weiteren Modulen (Kalender, Mitarbeiterauslastung) — nur für Helpdesk verifiziert, für andere Module [HYPOTHESE].",
|
||||
"pruefidee": "Benutzer mit SHOW_HELPDESK_ONLY_OWN_BRANCH erhält bei Ticketsuche ausschließlich Tickets seiner Filiale, auch bei explizitem Filterversuch auf andere Filialen.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-003",
|
||||
@@ -279,7 +295,8 @@
|
||||
"tracelinks": "StRS-003; SwRS-004",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Für einen Lieferschein mit bekanntem Ursprungsauftrag und bekannter Folgerechnung liefert `GetRelatedItemsForObject` genau diese zwei Objekte mit korrektem IsOrigin-Wert.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-004",
|
||||
@@ -295,7 +312,8 @@
|
||||
"tracelinks": "StRS-003, StRS-004; SwRS-005",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Ein Datensatz in `ObjectExternalReferences` mit bekannter ExternalReferenceID liefert bei Abfrage den verknüpften internen Auftrag/Lieferschein.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-005",
|
||||
@@ -311,7 +329,8 @@
|
||||
"tracelinks": "StRS-005; SwRS-006",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Statischer Test: Serialisierung/Deserialisierung eines Belegs erlaubt keinen anderen Enum-Wert als die drei definierten.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-006",
|
||||
@@ -327,7 +346,8 @@
|
||||
"tracelinks": "StRS-006; SwRS-007",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Lasttest mit N parallelen Threads, die `GetNextNumber(updateDatabase:true)` für denselben Nummernkreis aufrufen: alle N Ergebnisse müssen paarweise verschieden sein.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-007",
|
||||
@@ -344,7 +364,8 @@
|
||||
"tracelinks": "StRS-003; SwRS-004",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Nach Änderung eines Belegs existiert ein neuer `ReceiptLog`-Eintrag mit korrektem Employee- und Zeitstempel-Wert.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-008",
|
||||
@@ -360,7 +381,8 @@
|
||||
"tracelinks": "StRS-008; SwRS-009",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Statuswechsel eines Tickets vom konfigurierten Abschlussstatus zurück auf \"in Bearbeitung\" führt zu `ClosedAt == null` nach dem Speichern.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-009",
|
||||
@@ -376,7 +398,8 @@
|
||||
"tracelinks": "StRS-009; SwRS-010",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Buchung eines Lieferscheinpostens mit abweichendem Einkaufspreis führt zu aktualisiertem `SecondaryStockArticle`-Preis für den betroffenen Artikel/Lagerort.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-010",
|
||||
@@ -392,7 +415,8 @@
|
||||
"tracelinks": "StRS-010; SwRS-004",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Für jeden Partnerordner existiert mindestens eine BL-Klasse mit Importmethode; Testnachricht des Partnerformats erzeugt einen validen internen Beleg.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-011",
|
||||
@@ -408,7 +432,8 @@
|
||||
"tracelinks": "StRS-011; SwRS-012",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Ein WebAccount ohne explizite WebAccountsRights-Zuweisung erhält bei `CheckWebRightsFromUser` eine leere Ergebnisliste, selbst wenn ein gleichnamiges internes Recht existiert.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-012",
|
||||
@@ -424,7 +449,8 @@
|
||||
"tracelinks": "StRS-012; SwRS-011",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Ein Modul mit `SupportsConnectionTypes = [SqlServer, CentronWebServices]` liefert bei beiden Verbindungsarten dieselben Testdaten für dieselbe Anfrage.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-013",
|
||||
@@ -440,7 +466,8 @@
|
||||
"tracelinks": "StRS-013",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Für eine resx-Datei ohne .en.resx-Pendant liefert die Lokalisierung zur Laufzeit den deutschen Text statt eines Fehlers/leeren Strings.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-014",
|
||||
@@ -457,7 +484,8 @@
|
||||
"tracelinks": "StRS-001; SwRS-013",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Nach Passwortänderung enthält die Datenbankspalte `Password` einen 40-stelligen Hex-String, kein Klartext.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-015",
|
||||
@@ -473,7 +501,8 @@
|
||||
"tracelinks": "SyRS-014; SwRS-013",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Setzen eines Passworts mit Länge < PasswordMinLength liefert Result mit Status Error und der genannten Fehlermeldung.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-001",
|
||||
@@ -490,7 +519,8 @@
|
||||
"tracelinks": "SyRS-001",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Unit-Test ruft CheckRightsFromUser mit einer Mischung aus zugewiesenen/nicht zugewiesenen Recht-IDs auf; Ergebnisliste enthält exakt die zugewiesene Teilmenge.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-002",
|
||||
@@ -506,7 +536,8 @@
|
||||
"tracelinks": "SyRS-001",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Simulation einer Exception innerhalb der Session-Erzeugung während `HasUserRight`-Aufruf: Rückgabewert ist `false`, keine Exception propagiert zum Aufrufer.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-003",
|
||||
@@ -522,7 +553,8 @@
|
||||
"tracelinks": "SyRS-002",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Für alle 2^3 Kombinationen der drei Basisrechte liefert die Methode den in der Tabelle der Fallunterscheidung dokumentierten Modus.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-004",
|
||||
@@ -539,7 +571,8 @@
|
||||
"tracelinks": "SyRS-003, SyRS-004, SyRS-010",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Für jeden in ReceiptProgressionBL verwendeten numerischen Code existiert ein korrespondierender, namentlich passender Enum-Wert in `CentronObjectKindNumeric` (Konsistenzprüfung Enum vs. SQL-Literale).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-005",
|
||||
@@ -555,7 +588,8 @@
|
||||
"tracelinks": "SyRS-003, SyRS-004",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Rechnung mit gesetztem `DownPaymentForOrderI3D` erscheint bei Abfrage der verknüpften Objekte des referenzierten Auftrags.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-006",
|
||||
@@ -571,7 +605,8 @@
|
||||
"tracelinks": "SyRS-005",
|
||||
"konsolidierung": "Kandidat: Zwei redundante Zuordnungen (Attribut + switch-Methode) für dieselbe Information — im Zielsystem auf eine einzige Quelle konsolidierbar.",
|
||||
"pruefidee": "Für jeden Enum-Wert liefern sowohl das Description-Attribut als auch `GetReceiptStateString()` denselben deutschen Text (Konsistenzprüfung der doppelten Definition).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-007",
|
||||
@@ -588,7 +623,8 @@
|
||||
"tracelinks": "SyRS-006",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Zwei parallele Transaktionen mit demselben Ausgangswert `Current`: nur eine darf erfolgreich committen, die andere muss die Schleife erneut durchlaufen und einen anderen Wert erhalten.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-008",
|
||||
@@ -604,7 +640,8 @@
|
||||
"tracelinks": "StRS-014",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Suche nach der konkreten Prüfmethode (voraussichtlich in einer `HelpdeskTimer*BL`-Klasse) und Verifikation der Bedingung im Code als Folgeschritt.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-009",
|
||||
@@ -620,7 +657,8 @@
|
||||
"tracelinks": "SyRS-008",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Ticket im Abschlussstatus mit gesetztem ClosedAt wird auf \"in Bearbeitung\" umgestellt → nach Speichern ist ClosedAt == null.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-010",
|
||||
@@ -636,7 +674,8 @@
|
||||
"tracelinks": "SyRS-009",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Zwei aufeinanderfolgende Wareneingänge mit unterschiedlichem Einkaufspreis führen zu einem im Artikel/Lagerort konsistent nachvollziehbaren, aktualisierten Preis (z. B. gleitender Durchschnitt oder letzter Preis – exakte Bewertungsmethode nicht Teil dieses Belegs).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-011",
|
||||
@@ -652,7 +691,8 @@
|
||||
"tracelinks": "SyRS-012",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Neues Test-Modul mit korrektem Namensschema wird ohne expliziten Registrierungsaufruf über `ClassContainer.Instance.WithInstance<I...Logic>()` auflösbar.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-012",
|
||||
@@ -668,7 +708,8 @@
|
||||
"tracelinks": "SyRS-011",
|
||||
"konsolidierung": "Kandidat: Zwei parallele, strukturell unterschiedliche Rechtemodelle (gruppenbasiert für AppUser, direkt für WebAccount) — im Zielsystem ggf. auf ein einheitliches RBAC-Modell konsolidierbar.",
|
||||
"pruefidee": "Datenmodellprüfung: `WebAccountsRights` besitzt keine Fremdschlüsselspalte auf eine Gruppentabelle (Strukturvergleich mit `Sichtrus`/`Sichmemb`).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-013",
|
||||
@@ -684,6 +725,7 @@
|
||||
"tracelinks": "SyRS-014",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Zwei AppUser-Datensätze mit demselben Testpasswort erzeugen identische Werte in der Spalte `Password`.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
}
|
||||
]
|
||||
+7
@@ -2,6 +2,8 @@
|
||||
|
||||
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
|
||||
|
||||
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
|
||||
|
||||
### Verteilung über die Ebenen
|
||||
|
||||
| Ebene | Anzahl | Anteil |
|
||||
@@ -36,6 +38,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
|
||||
| Belege je Anforderung (Median) | 1,0 |
|
||||
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 38 (90,5 %) |
|
||||
|
||||
### Übernahmewürdigkeit
|
||||
|
||||
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
|
||||
|
||||
### Status
|
||||
|
||||
| Kategorie | Anzahl | Anteil |
|
||||
@@ -53,5 +59,6 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
|
||||
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
|
||||
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (20 risikorelevante Anforderungen, alle gedeckt) |
|
||||
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
|
||||
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
|
||||
| **Traceability** – Verknüpfung zwischen den Ebenen | 42 von 42 mit Tracelinks (100,0 %) |
|
||||
|
||||
|
||||
+7
@@ -96,6 +96,8 @@ allen V1b-Laeufen, wo sie um bis zu Faktor 21,6 auseinanderlagen.
|
||||
|
||||
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
|
||||
|
||||
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
|
||||
|
||||
### Verteilung über die Ebenen
|
||||
|
||||
| Ebene | Anzahl | Anteil |
|
||||
@@ -132,6 +134,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
|
||||
| Belege je Anforderung (Median) | 1,0 |
|
||||
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 80 (97,6 %) |
|
||||
|
||||
### Übernahmewürdigkeit
|
||||
|
||||
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
|
||||
|
||||
### Status
|
||||
|
||||
| Kategorie | Anzahl | Anteil |
|
||||
@@ -149,6 +155,7 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
|
||||
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
|
||||
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (40 risikorelevante Anforderungen, alle gedeckt) |
|
||||
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
|
||||
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
|
||||
| **Traceability** – Verknüpfung zwischen den Ebenen | 82 von 82 mit Tracelinks (100,0 %) |
|
||||
|
||||
## Vergleich V1 (solo) gegen V1b (builtin)
|
||||
|
||||
+164
-82
@@ -15,7 +15,8 @@
|
||||
"tracelinks": "SyRS-001, SyRS-002, SyRS-026",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Benutzer ohne die entsprechende Gruppenmitgliedschaft ruft eine rechtegeschützte Aktion auf (API und WPF) → Zugriff wird verweigert (403 bzw. Result.AsError mit RightCheckFailed).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-002",
|
||||
@@ -32,7 +33,8 @@
|
||||
"tracelinks": "SyRS-003, StRS-001",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Anmeldung als WebAccount und Aufruf einer internen Beleg-Ansichtsfunktion → Result.AsError mit RightCheckFailed und Text \"Web-Benutzer haben keine Berechtigung Belege einzusehen.\"",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-003",
|
||||
@@ -49,7 +51,8 @@
|
||||
"tracelinks": "SyRS-004, StRS-001",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Benutzer der Filiale A mit \"nur eigene Filiale\"-Recht versucht, einen Beleg der Filiale B zu bearbeiten → Fehlermeldung \"...einer anderen Filiale zu bearbeiten.\"",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-004",
|
||||
@@ -65,7 +68,8 @@
|
||||
"tracelinks": "SyRS-005, StRS-001",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Löschversuch der Gruppe \"Administratoren\" → Result.AsError; Versuch, ein nicht in der Whitelist enthaltenes Recht der Admin-Gruppe zu entziehen → Operation liefert false/keine Änderung.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-005",
|
||||
@@ -82,7 +86,8 @@
|
||||
"tracelinks": "SyRS-006",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Nach Zuweisung eines Rechts an eine Gruppe erscheint ein neuer Eintrag in GetAllAppRightLogs mit korrektem Beschreibungstext und Benutzerreferenz.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-006",
|
||||
@@ -100,7 +105,8 @@
|
||||
"tracelinks": "SyRS-007, SyRS-008",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Ein Angebot wird in einen Auftrag übernommen; GetReceiptForwardedInto(Angebot) liefert den erzeugten Auftrag als Ziel.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-007",
|
||||
@@ -117,7 +123,8 @@
|
||||
"tracelinks": "SyRS-009, StRS-006",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Ein stornierter Beleg kann nicht mehr als bezahlt markiert werden (Fehlermeldung); ein neu angelegter Beleg mit passender Zahlungsbedingung wird automatisch auf \"abgeschlossen\" gesetzt.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-008",
|
||||
@@ -134,7 +141,8 @@
|
||||
"tracelinks": "SyRS-010, SyRS-011, StRS-006",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Zwei simultane Speichervorgänge im selben Nummernkreis führen zu zwei unterschiedlichen, gültigen Nummern (kein Duplikat in der Zieltabelle).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-009",
|
||||
@@ -151,7 +159,8 @@
|
||||
"tracelinks": "SyRS-012, StRS-006",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Benutzer A speichert einen Beleg; Benutzer B versucht anschließend, denselben (veralteten) Beleg mit alter ConcurrencyControlGuid zu speichern → Fehler \"was changed in the meantime\".",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-010",
|
||||
@@ -167,7 +176,8 @@
|
||||
"tracelinks": "SyRS-013, StRS-007",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Benutzer mit ausschließlich INCOMING_PAYMENT_TRANSACTIONS-Recht (ohne allgemeines Bearbeitungsrecht) kann einen Beleg als bezahlt markieren; derselbe Versuch an einem stornierten Beleg schlägt fehl.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-011",
|
||||
@@ -184,7 +194,8 @@
|
||||
"tracelinks": "SyRS-014, StRS-007",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Rechnung mit aktivierter ZUGFeRD-Einstellung erzeugen → resultierendes PDF enthält eingebettetes XML gemäß ZUGFeRD-Schema.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-012",
|
||||
@@ -202,7 +213,8 @@
|
||||
"tracelinks": "SyRS-015, StRS-001",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Signatureinstellungen (Zertifikat/TSA) werden von einem Benutzer ohne Administration.SETTINGS-Recht abgelehnt gespeichert; ein signiertes PDF weist eine gültige, prüfbare Signatur auf.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-013",
|
||||
@@ -219,7 +231,8 @@
|
||||
"tracelinks": "SyRS-016, StRS-012, StRS-020",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Aufruf der URL .../weboffer/{gültigesToken} ohne vorherige Anmeldung zeigt das zugehörige Angebot inklusive Mandantenbranding an; ein ungültiges/abgelaufenes Token verweigert den Zugriff (Detail-Mechanismus nicht verifiziert, siehe Hypothesen.md).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-014",
|
||||
@@ -236,7 +249,8 @@
|
||||
"tracelinks": "SyRS-017, SyRS-018",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Aufruf von DataSecurityExecuteCleanUp mit gültigen Rechten führt zu keiner beobachtbaren Datenänderung (Abgleich Datenbestand vor/nach Aufruf) → bestätigt Stub-Charakter.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-015",
|
||||
@@ -253,7 +267,8 @@
|
||||
"tracelinks": "SyRS-019, SyRS-020",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Ein Ticket mit IsOnlyInternalVisible=true zeigt den betreffenden Inhalt im Kundenportal nicht an; ein gesperrtes Ticket (LockUserName gesetzt) kann von einem zweiten Bearbeiter nicht gleichzeitig verändert werden (UI-seitige Prüfung, Detailmechanismus nicht vollständig verifiziert).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-016",
|
||||
@@ -270,7 +285,8 @@
|
||||
"tracelinks": "SyRS-021, StRS-015",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Benutzer ohne CanChangeDateInInvoices-Einstellung öffnet die Timer-Fakturierungs-Einstellungen für eine Rechnung → BillingDate-Feld ist deaktiviert, Hinweistext \"Sie besitzen nicht das Recht ... Datum der Rechnung nach neuer Version / bei Neuanlage ändern\" wird angezeigt.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-017",
|
||||
@@ -286,7 +302,8 @@
|
||||
"tracelinks": "SyRS-022",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Zwei aufeinanderfolgende Wareneingangsbuchungen mit unterschiedlichem Preis auf denselben Artikel → RawEk2 entspricht nach der zweiten Buchung dem Preis der ersten Buchung.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-018",
|
||||
@@ -303,7 +320,8 @@
|
||||
"tracelinks": "SyRS-023",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Ein Mandant ohne Lizenz \"CentronInternal\" erhält bei Aufruf eines mit der Policy \"CentronHosted\" geschützten Endpunkts keinen Zugriff, unabhängig von individuellen Benutzerrechten.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-019",
|
||||
@@ -319,7 +337,8 @@
|
||||
"tracelinks": "SyRS-024, SyRS-025, StRS-001",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Aufruf eines geschützten Endpunkts ohne jegliches Authentifizierungsmerkmal → HTTP 401; Aufruf mit abgelaufenem JWT → 401 (ValidateLifetime=true).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-020",
|
||||
@@ -335,7 +354,8 @@
|
||||
"tracelinks": "SyRS-027, StRS-013",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Zwei Mandanten mit unterschiedlich konfiguriertem Logo erzeugen sichtbar unterschiedliche Web-Angebots-Seiten.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-001",
|
||||
@@ -351,7 +371,8 @@
|
||||
"tracelinks": "StRS-001; SwRS-001, SwRS-002",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Unit-/Integrationstest: Benutzer mit Gruppenmitgliedschaft X, Gruppe X besitzt Recht Y → HasUserRight(User, Y)==true; Entzug des Rechts → false nach Cache-Invalidierung.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-002",
|
||||
@@ -368,7 +389,8 @@
|
||||
"tracelinks": "StRS-001; SwRS-003",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Integrationstest: Aufruf eines annotierten Endpunkts ohne Login → 401; mit Login aber ohne Recht → 403; mit Recht → 200.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-003",
|
||||
@@ -384,7 +406,8 @@
|
||||
"tracelinks": "StRS-002; SwRS-004",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "WebAccount-Login mit (fehlerhaft) hinterlegtem internen AppRight versucht Belegeinsicht → dennoch RightCheckFailed.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-004",
|
||||
@@ -400,7 +423,8 @@
|
||||
"tracelinks": "StRS-003; SwRS-005",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Benutzer ohne jegliches Bearbeitungsrecht → Meldung \"nicht das Recht ... zu bearbeiten\"; Benutzer mit Recht, aber falscher Filiale → Meldung \"... einer anderen Filiale zu bearbeiten\".",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-005",
|
||||
@@ -416,7 +440,8 @@
|
||||
"tracelinks": "StRS-004; SwRS-006",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Versuch, ein nicht in der Whitelist enthaltenes Recht (z. B. Rechteverwaltung selbst) von der Administratorengruppe zu entziehen → RemoveAssignGroupToRight liefert false.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-006",
|
||||
@@ -432,7 +457,8 @@
|
||||
"tracelinks": "StRS-005; SwRS-007",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Nach AddRightToRightGroup existiert genau ein neuer AppRightLog-Eintrag mit Kind=AddRightToGroup und korrektem Beschreibungstext.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-007",
|
||||
@@ -448,7 +474,8 @@
|
||||
"tracelinks": "StRS-006; SwRS-008",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Für jede Unterklasse von ReceiptBase existieren gültige Implementierungen der vier abstrakten Members (Compile-Time-Prüfung).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-008",
|
||||
@@ -464,7 +491,8 @@
|
||||
"tracelinks": "StRS-006; SwRS-009",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Position P eines Angebots wurde in einen aktiven Auftrag übernommen → Versuch, P aus dem Angebot zu entfernen, wird als \"removedPositionsThatCouldNotBeRemoved\" erkannt.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-009",
|
||||
@@ -480,7 +508,8 @@
|
||||
"tracelinks": "StRS-007; SwRS-010",
|
||||
"konsolidierung": "Kandidat: SyRS-013 (beide betreffen UpdateReceiptIsPaid, unterschiedliche Prüfaspekte derselben Methode – im Zielsystem ggf. als eine zusammengesetzte Regel modellieren)",
|
||||
"pruefidee": "UpdateReceiptIsPaid auf einem Canceled-Beleg → Result.AsError, kein Datenbank-Write.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-010",
|
||||
@@ -496,7 +525,8 @@
|
||||
"tracelinks": "StRS-008; SwRS-011, SwRS-012",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Lasttest: N parallele Aufrufe von GetNextNumber(..., updateDatabase:true) auf demselben Nummernkreis liefern N paarweise verschiedene Nummern.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-011",
|
||||
@@ -513,7 +543,8 @@
|
||||
"tracelinks": "StRS-008; SwRS-013",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Zwei Filialen desselben Mandanten erzeugen unabhängig voneinander Rechnung Nr. 1000 ohne Kollision (unterschiedliche NumberGroup-Objekte).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-012",
|
||||
@@ -529,7 +560,8 @@
|
||||
"tracelinks": "StRS-009; SwRS-014",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Speichern mit veralteter ConcurrencyControlGuid → Fehler ChangedByOtherInstance; Speichern mit übersprungener Versionsnummer (z. B. v1→v3) → Fehler \"keine gültige Versionsnummer\".",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-013",
|
||||
@@ -545,7 +577,8 @@
|
||||
"tracelinks": "StRS-010; SwRS-010",
|
||||
"konsolidierung": "Kandidat: SyRS-009 (siehe dort)",
|
||||
"pruefidee": "Benutzer mit ausschließlich INCOMING_PAYMENT_TRANSACTIONS-Recht kann UpdateReceiptIsPaid erfolgreich ausführen, obwohl CanUserEditReceipt für ihn fehlschlägt.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-014",
|
||||
@@ -561,7 +594,8 @@
|
||||
"tracelinks": "StRS-011; SwRS-015",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Stornierte Rechnung mit aktivierter ZUGFeRD-Einstellung wird gedruckt → resultierendes PDF enthält KEINE ZUGFeRD-Struktur.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-015",
|
||||
@@ -577,7 +611,8 @@
|
||||
"tracelinks": "StRS-012; SwRS-016",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Auslesen der zugrunde liegenden ApplicationSettings-Datensätze außerhalb der BL zeigt Base64/verschlüsselten, nicht lesbaren Wert für Zertifikat und Passwort.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-016",
|
||||
@@ -593,7 +628,8 @@
|
||||
"tracelinks": "StRS-013; SwRS-017",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Aufruf der Route mit gültigem Token in einem Browser ohne bestehende Session zeigt den Beleg an.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-017",
|
||||
@@ -609,7 +645,8 @@
|
||||
"tracelinks": "StRS-014; SwRS-018",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Benutzer mit Recht, aber deaktiviertem Feature-Flag → \"Insufficient rights!\"; Benutzer ohne Recht, aber aktiviertem Flag → ebenfalls \"Insufficient rights!\".",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-018",
|
||||
@@ -625,7 +662,8 @@
|
||||
"tracelinks": "StRS-014; SwRS-018",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Vergleich des Datenbankinhalts (betroffene Tabellen) vor und nach Aufruf von DataSecurityExecuteCleanUp mit denselben Filterkriterien wie zuvor in GetDataSecurityCleanUpStats verwendet → keine Änderung erwartet (bestätigt Lücke).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-019",
|
||||
@@ -641,7 +679,8 @@
|
||||
"tracelinks": "StRS-015; SwRS-019",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Anlage eines neuen HelpdeskStateBase-Datensatzes über die Stammdatenverwaltung; neuer Status steht danach für Tickets zur Auswahl (Detailmechanismus der UI-Anbindung nicht vollständig verifiziert).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-020",
|
||||
@@ -657,7 +696,8 @@
|
||||
"tracelinks": "StRS-015; SwRS-020",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Zwei Bearbeiter öffnen dasselbe Ticket; zweiter Bearbeiter erhält Hinweis auf Sperre durch ersten (LockUserName gesetzt).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-021",
|
||||
@@ -673,7 +713,8 @@
|
||||
"tracelinks": "StRS-016; SwRS-021",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Für ReceiptKind=InvoiceClass mit CanChangeDateInInvoices=false → BillingDateIsEnabled=false, Hinweistext enthält \"der Rechnung\"; für DeliveryListClass entsprechend \"des Lieferscheins\".",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-022",
|
||||
@@ -689,7 +730,8 @@
|
||||
"tracelinks": "StRS-017; SwRS-022",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Wareneingang mit Preis A, danach Wareneingang mit Preis B auf denselben Artikel im Hauptlager → nach zweiter Buchung: RawEk1=B, RawEk2=A.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-023",
|
||||
@@ -706,7 +748,8 @@
|
||||
"tracelinks": "StRS-018, StRS-019; SwRS-023",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Mandant ohne Lizenz CentronInternal ruft geschützten Endpunkt mit gültigem JWT eines berechtigten Benutzers auf → Zugriff dennoch verweigert.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-024",
|
||||
@@ -722,7 +765,8 @@
|
||||
"tracelinks": "StRS-019; SwRS-024",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Manuell abgelaufener JWT wird bei Aufruf eines geschützten Endpunkts mit 401 abgelehnt (ValidateLifetime).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-025",
|
||||
@@ -738,7 +782,8 @@
|
||||
"tracelinks": "StRS-019; SwRS-025",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Ein gültiger SecretKey ohne gültiges JWT erlaubt Zugriff auf ausschließlich SecretKey-geschützte Endpunkte, nicht auf JWT-geschützte Endpunkte (und umgekehrt).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-026",
|
||||
@@ -754,7 +799,8 @@
|
||||
"tracelinks": "StRS-001",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Controller mit [AuthorizeUserRight(SETTINGS)] und Action mit zusätzlichem [AuthorizeUserRight(ADVANCED_SETTINGS)]: Benutzer mit nur SETTINGS erhält 403 auf dieser Action.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-027",
|
||||
@@ -770,7 +816,8 @@
|
||||
"tracelinks": "StRS-020; SwRS-017",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Wechsel der BrandingConfig für einen Mandanten führt ohne Neubau der Anwendung zu geändertem Logo auf der Web-Angebots-Seite.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-028",
|
||||
@@ -786,7 +833,8 @@
|
||||
"tracelinks": "StRS-020",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Deployment desselben Images für einen Mandanten in einer anderen Zeitzone → Serverzeit bleibt Europe/Berlin (durch Log-Zeitstempel im Container zu verifizieren).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-029",
|
||||
@@ -802,7 +850,8 @@
|
||||
"tracelinks": "StRS-001; SwRS-001",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Performance-Test: N aufeinanderfolgende HasUserRight-Aufrufe für denselben Benutzer erzeugen genau einen SQL-Query (Query-Zähler-Messung).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-030",
|
||||
@@ -818,7 +867,8 @@
|
||||
"tracelinks": "StRS-018",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Start des gebauten Images ohne vorinstallierte .NET-Runtime auf dem Host → Anwendung startet erfolgreich (self-contained-Nachweis).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-031",
|
||||
@@ -835,7 +885,8 @@
|
||||
"tracelinks": "StRS-012",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Build ohne gültigen DevExpress-Lizenzschlüssel → Build- oder Laufzeitfehler in signatur-/reportbezogenen Funktionen (nicht im Rahmen dieser statischen Analyse ausführbar getestet).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-032",
|
||||
@@ -853,7 +904,8 @@
|
||||
"tracelinks": "StRS-018",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Migration einer einzelnen BL-Klasse mit Raw-SQL auf eine andere Datenbank ohne Anpassung der SQL-Strings schlägt fehl (z. B. IIF ist keine Standard-SQL-Funktion in PostgreSQL).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-033",
|
||||
@@ -870,7 +922,8 @@
|
||||
"tracelinks": "StRS-001, StRS-006 bis StRS-018",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Statische Codeanalyse: Anteil von BL-Methoden mit Rückgabetyp Result/Result\\<T\\> an rechteprüfenden/validierenden Methoden (Stichprobe zeigt nahezu 100 % in den analysierten Klassen).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-034",
|
||||
@@ -887,7 +940,8 @@
|
||||
"tracelinks": "StRS-018",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "n/a (dokumentierender Befund, keine funktionale Prüfidee) - relevanter Hinweis für Datenmigrationsplanung.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-001",
|
||||
@@ -903,7 +957,8 @@
|
||||
"tracelinks": "SyRS-001, SyRS-029",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Codeanalyse: keine weiteren Vorkommen von direktem SQL-Zugriff auf Sichtrus/Sichmemb außerhalb AppRightsBL im Backend-Quellcode.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-002",
|
||||
@@ -919,7 +974,8 @@
|
||||
"tracelinks": "SyRS-001",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Benutzer in zwei Gruppen mit überschneidenden Rechten → Ergebnisliste enthält jedes Recht nur gemäß SQL-JOIN-Semantik (Duplikate möglich, da kein DISTINCT im Statement).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-003",
|
||||
@@ -935,7 +991,8 @@
|
||||
"tracelinks": "SyRS-002",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Unit-Test des Filters mit gemocktem HttpContext ohne User → context.Result ist UnauthorizedResult; mit User ohne Recht → ForbidResult.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-004",
|
||||
@@ -951,7 +1008,8 @@
|
||||
"tracelinks": "SyRS-003",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Statischer Codepfad-Test: bei IsWebAccountLogin==true wird _specificLogics.Execute nicht erreicht (Branch-Coverage).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-005",
|
||||
@@ -967,7 +1025,8 @@
|
||||
"tracelinks": "SyRS-004",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Neue Testimplementierung von HasRightToEditReceipt für eine fiktive Belegart wird korrekt von CanUserEditReceipt verwendet, ohne dass die Methode selbst angepasst werden muss.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-006",
|
||||
@@ -983,7 +1042,8 @@
|
||||
"tracelinks": "SyRS-005",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Aufruf von RemoveAssignGroupToRight mit einer nicht in der Liste enthaltenen Recht-I3D und der Administratorengruppe → Rückgabewert false, keine Datenbankänderung.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-007",
|
||||
@@ -999,7 +1059,8 @@
|
||||
"tracelinks": "SyRS-006",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Für jede der sieben Operationen existiert ein Test, der nach Ausführung einen AppRightLog mit korrektem Kind-Wert erwartet.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-008",
|
||||
@@ -1015,7 +1076,8 @@
|
||||
"tracelinks": "SyRS-007",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Compile-Test: jede konkrete Receipt-Unterklasse implementiert alle vier abstrakten Members (Compiler erzwingt dies bereits strukturell).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-009",
|
||||
@@ -1031,7 +1093,8 @@
|
||||
"tracelinks": "SyRS-008",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Position in storniertem Folgebeleg → Entfernung aus Ursprungsbeleg wird nicht blockiert; Position in aktivem Folgebeleg → wird blockiert.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-010",
|
||||
@@ -1047,7 +1110,8 @@
|
||||
"tracelinks": "SyRS-009, SyRS-013",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Vier getrennte Testfälle, je einer pro Prüfschritt, der isoliert zum Fehlschlagen der Methode führt.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-011",
|
||||
@@ -1063,7 +1127,8 @@
|
||||
"tracelinks": "SyRS-010",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Manuelles Vorbelegen der Zieltabelle mit der rechnerisch nächsten Nummer → FindNextNumber überspringt diese und liefert die übernächste.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-012",
|
||||
@@ -1079,7 +1144,8 @@
|
||||
"tracelinks": "SyRS-010",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Zwei simulierte parallele Aufrufe (z. B. über zwei Threads/Sessions) auf dieselbe NumberGroup → beide terminieren erfolgreich mit unterschiedlichem Ergebnis; kein Deadlock, keine Endlosschleife bei realistischer Last.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-013",
|
||||
@@ -1096,7 +1162,8 @@
|
||||
"tracelinks": "SyRS-011",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Speichern eines Belegs für den konfigurierten Vorlagen-Kunden → erzeugte Nummer stammt nachweislich nicht aus derselben Zählersequenz wie reguläre Belege desselben Typs.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-014",
|
||||
@@ -1112,7 +1179,8 @@
|
||||
"tracelinks": "SyRS-012",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Speichern eines Belegs mit Version=Vorgänger+2 → Fehlermeldung \"keine gültige Versionsnummer\"; Version=Vorgänger (Überschreiben) und Version=Vorgänger+1 → jeweils erfolgreich.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-015",
|
||||
@@ -1128,7 +1196,8 @@
|
||||
"tracelinks": "SyRS-014",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Rechnung mit global deaktiviertem, aber lokal aktiviertem ZUGFeRD → PDF enthält ZUGFeRD-Struktur (bestätigt ODER-Semantik der Aktivierungsquelle).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-016",
|
||||
@@ -1144,7 +1213,8 @@
|
||||
"tracelinks": "SyRS-015",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Direktes Auslesen der zugrunde liegenden ApplicationSettings-Zeile für PdfSigningCertificatePassword zeigt keinen erkennbaren Klartextwert.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-017",
|
||||
@@ -1160,7 +1230,8 @@
|
||||
"tracelinks": "SyRS-016, SyRS-027",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Aufruf mit syntaktisch validem, aber nicht existierendem Token → definiertes Fehlverhalten (z. B. leere Seite/Fehlermeldung; exakter Mechanismus nicht verifiziert, siehe Hypothesen.md).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-018",
|
||||
@@ -1176,7 +1247,8 @@
|
||||
"tracelinks": "SyRS-017, SyRS-018",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Aufruf von DataSecurityExecuteCleanUp mit denselben Filterkriterien wie eine zuvor als \"zu bereinigen\" ausgewiesene Statistik → betroffene Datensätze bleiben unverändert (Regressionstest zur Schließung dieser Lücke empfohlen).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-019",
|
||||
@@ -1192,7 +1264,8 @@
|
||||
"tracelinks": "SyRS-019",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Datenbankseitiges Anlegen eines neuen HelpdeskStateBase-Datensatzes wird von der Anwendung ohne Codeänderung akzeptiert (keine Enum-Validierung im Entitätscode erkennbar).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-020",
|
||||
@@ -1208,7 +1281,8 @@
|
||||
"tracelinks": "SyRS-020",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Serialisierung/Deserialisierung eines Helpdesk-Datensatzes bewahrt alle genannten Feldwerte verlustfrei (Struktur-Test).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-021",
|
||||
@@ -1224,7 +1298,8 @@
|
||||
"tracelinks": "SyRS-021",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Property-Change-Test: Setzen von ReceiptKind=InvoiceClass löst automatisch einen Aufruf von UpdateBillingDateIsEnabled aus (SetProperty-Callback, Z. 195-199 im Diff).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-022",
|
||||
@@ -1240,7 +1315,8 @@
|
||||
"tracelinks": "SyRS-022",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Zwei Hauptlagerbuchungen mit identischem Preis → PurchasePrice bleibt unverändert, RawEk1/RawEk1Date werden dennoch aktualisiert (Else-Zweig Z. 3639-3651).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-023",
|
||||
@@ -1256,7 +1332,8 @@
|
||||
"tracelinks": "SyRS-023",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Unit-Test: HasLicense liefert false → context.HasSucceeded bleibt false nach Aufruf; HasLicense liefert true → context.HasSucceeded==true.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-024",
|
||||
@@ -1272,7 +1349,8 @@
|
||||
"tracelinks": "SyRS-024",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Token mit falscher Audience → Ablehnung (ValidateAudience); Token mit Claim \"sub\", DefaultMapInboundClaims=false → Claim bleibt \"sub\", nicht auf ClaimTypes.NameIdentifier gemappt.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-025",
|
||||
@@ -1289,7 +1367,8 @@
|
||||
"tracelinks": "SyRS-025",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Request mit korrektem SecretKey, aber ohne JWT/Ticket → Zugriff auf SecretKey-Policy-geschützte Endpunkte erfolgreich, auf JWT-geschützte Endpunkte weiterhin verweigert.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-026",
|
||||
@@ -1305,7 +1384,8 @@
|
||||
"tracelinks": "SyRS-033",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Stichprobenartige Codeanalyse über weitere *BL-Klassen außerhalb der explizit gelesenen Stichprobe bestätigt dasselbe Muster (Konsistenzprüfung, im Rahmen dieser Iteration nicht flächendeckend durchgeführt).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-027",
|
||||
@@ -1322,7 +1402,8 @@
|
||||
"tracelinks": "SyRS-033",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Codeanalyse: Anteil öffentlicher BL-Methoden mit Rückgabetyp Result/Result\\<T\\> in den analysierten Klassen (Stichprobe: deutlich überwiegend, exakte Quote nicht vollständig erhoben).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-028",
|
||||
@@ -1338,6 +1419,7 @@
|
||||
"tracelinks": "SyRS-007, SyRS-034",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Historische Konsistenzprüfung: keine doppelt vergebenen numerischen Werte in der Enum-Definition (Stichprobenprüfung während der Analyse ergab keine Duplikate, siehe Analysebericht Konsistenzcheck).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
}
|
||||
]
|
||||
+7
@@ -2,6 +2,8 @@
|
||||
|
||||
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
|
||||
|
||||
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
|
||||
|
||||
### Verteilung über die Ebenen
|
||||
|
||||
| Ebene | Anzahl | Anteil |
|
||||
@@ -38,6 +40,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
|
||||
| Belege je Anforderung (Median) | 1,0 |
|
||||
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 80 (97,6 %) |
|
||||
|
||||
### Übernahmewürdigkeit
|
||||
|
||||
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
|
||||
|
||||
### Status
|
||||
|
||||
| Kategorie | Anzahl | Anteil |
|
||||
@@ -55,5 +61,6 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
|
||||
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
|
||||
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (40 risikorelevante Anforderungen, alle gedeckt) |
|
||||
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
|
||||
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
|
||||
| **Traceability** – Verknüpfung zwischen den Ebenen | 82 von 82 mit Tracelinks (100,0 %) |
|
||||
|
||||
|
||||
+7
@@ -97,6 +97,8 @@ Ohne Subagenten sind Haupt- und Gesamtwerte für `claude-sonnet-5` identisch.
|
||||
|
||||
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
|
||||
|
||||
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
|
||||
|
||||
### Verteilung über die Ebenen
|
||||
|
||||
| Ebene | Anzahl | Anteil |
|
||||
@@ -132,6 +134,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
|
||||
| Belege je Anforderung (Median) | 1,0 |
|
||||
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 45 (75,0 %) |
|
||||
|
||||
### Übernahmewürdigkeit
|
||||
|
||||
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
|
||||
|
||||
### Status
|
||||
|
||||
| Kategorie | Anzahl | Anteil |
|
||||
@@ -149,6 +155,7 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
|
||||
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
|
||||
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **verletzt** – 1 von 26 ungedeckt: SwRS-003 |
|
||||
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
|
||||
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
|
||||
| **Traceability** – Verknüpfung zwischen den Ebenen | 59 von 60 mit Tracelinks (98,3 %) |
|
||||
|
||||
## V1-Reihe: fünf Messpunkte unter identischer Bedingung
|
||||
|
||||
+120
-60
@@ -15,7 +15,8 @@
|
||||
"tracelinks": "SyRS-001, SyRS-002",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Einem Testbenutzer wird gezielt ein Einzelrecht (z. B. ADD_NEW_HELPDESK) entzogen; Ticketanlage muss verweigert werden, während andere Helpdesk-Funktionen weiter verfügbar bleiben.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-002",
|
||||
@@ -32,7 +33,8 @@
|
||||
"tracelinks": "SyRS-001, SyRS-002",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Zwei Benutzer derselben Gruppe, einer zusätzlich mit SHOW_HELPDESK_ONLY_OWN: Ersterer sieht alle Tickets der Filiale, Zweiterer nur eigene.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-003",
|
||||
@@ -49,7 +51,8 @@
|
||||
"tracelinks": "SyRS-003, SyRS-004",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Für jede Belegart existiert eine Entity-Klasse, die von ReceiptBase erbt und ReceiptKind/GetReceiptItems() implementiert (Code-Review/Reflektion).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-004",
|
||||
@@ -66,7 +69,8 @@
|
||||
"tracelinks": "SyRS-005, SwRS-005",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Nach Änderung eines Rechnungsfeldes existiert ein neuer Datensatz in RechKopfVersions mit dem vorherigen Wert und OriginalI3D-Referenz auf den aktuellen Datensatz.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-005",
|
||||
@@ -83,7 +87,8 @@
|
||||
"tracelinks": "SyRS-006, SyRS-007",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Kunde ruft Link auf, ändert Menge einer Position, klickt „Annehmen“ → Zustand AcceptWebReceiptWithChangeRequests wird gesetzt, keine automatische Auftragsanlage ohne weiteren Schritt (siehe SyRS-006).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-006",
|
||||
@@ -100,7 +105,8 @@
|
||||
"tracelinks": "SyRS-007, SyRS-008, SwRS-010",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Bei AllowAcceptReceiptWithoutSignature=false darf ReceiptBL.AcceptWebReceipt keinen Auftrag erzeugen, bevor der Signaturvorgang abgeschlossen ist (Statuscheck WebReceiptState.WebOfferSign vor Abschluss).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-007",
|
||||
@@ -118,7 +124,8 @@
|
||||
"tracelinks": "SyRS-007, SwRS-010",
|
||||
"konsolidierung": "Kandidat: StRS-006 (gleiche fachliche Funktion „Auftragserteilung“, unterschiedliche Ausprägung der Signaturpflicht – im Zielsystem als ein konfigurierbarer Ablauf statt zwei Codepfade zu modellieren)",
|
||||
"pruefidee": "Beleg mit AllowAcceptReceiptWithoutSignature=true: Nach Klick „Annehmen“ entsteht sofort ein Auftrag, WebReceiptState wird nicht auf WebOfferSign gesetzt.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-008",
|
||||
@@ -136,7 +143,8 @@
|
||||
"tracelinks": "SyRS-009, SyRS-010, SwRS-014",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Vertrag mit AutomatedBilling=true und BillingIntervalKind=Monthly erzeugt nach Ablauf des Intervalls automatisch eine neue Rechnung mit korrektem Betrag.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-009",
|
||||
@@ -152,7 +160,8 @@
|
||||
"tracelinks": "SyRS-010",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Vertrag mit ContingentLimitValue=100h und Verbrauch von 105h löst laut Konfiguration eine Zusatzberechnung/Benachrichtigung aus.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-010",
|
||||
@@ -169,7 +178,8 @@
|
||||
"tracelinks": "SyRS-011, SwRS-015, SwRS-016",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Benutzer ohne das entsprechende Recht öffnet Timer-Billing-Assistent für Rechnungen: Feld „Belegdatum“ ist deaktiviert, Info-Icon mit Tooltip „Sie besitzen nicht das Recht ... ist sichtbar.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-011",
|
||||
@@ -185,7 +195,8 @@
|
||||
"tracelinks": "SyRS-012",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Administrator legt neuen Status „Wartet auf Kunde“ an, weist ihn keinem der beiden Sondersettings zu: Status erscheint wählbar, löst aber keine Sonderlogik (Schließen/Reopen-Default) aus.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-012",
|
||||
@@ -201,7 +212,8 @@
|
||||
"tracelinks": "SyRS-012, SwRS-018",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Löschversuch eines Status, der auf 3 Tickets und 1 Task verwendet wird, liefert Fehlermeldung „... wird in 3 Tickets & 1 Task verwendet.“ und der Datensatz bleibt bestehen.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-013",
|
||||
@@ -218,7 +230,8 @@
|
||||
"tracelinks": "SyRS-013, SyRS-014",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Import einer ALSO-CH-Auftragsbestätigungsdatei führt zu aktualisiertem Auftragsstatus im referenzierten c-entron-Auftrag ohne manuellen Eingriff.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-014",
|
||||
@@ -234,7 +247,8 @@
|
||||
"tracelinks": "SyRS-013",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Code-Inspektion von SupplierEdiBL.Komsa.cs bestätigt Fehlen einer Invoice-Verarbeitungsmethode.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-015",
|
||||
@@ -251,7 +265,8 @@
|
||||
"tracelinks": "SyRS-015, SyRS-016, SwRS-020, SwRS-021",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Benutzer ohne Lizenz OpenIDConnectAuthentication erhält bei OIDC-Login-Versuch den Fehler „No license for OpenIDConnectAuthentication“, unabhängig von einem gültigen Microsoft-Token.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-016",
|
||||
@@ -268,7 +283,8 @@
|
||||
"tracelinks": "SyRS-015, SyRS-017",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "LicenseManager.Instance.HasLicense(LicenseGuids.PasswordManager) liefert false für einen Kunden ohne diese Lizenz, UI-Modul „Passwort-Manager“ wird nicht angezeigt.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-017",
|
||||
@@ -285,7 +301,8 @@
|
||||
"tracelinks": "SyRS-018, SwRS-024",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Ribbon minimieren, Modul wechseln: aktiver Tab zeigt sichtbare Unterstreichung/Hervorhebung ohne Ribbon-Expansion.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-001",
|
||||
@@ -302,7 +319,8 @@
|
||||
"tracelinks": "StRS-001",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Direkter Webservice-Aufruf (unter Umgehung der UI) einer rechtebehafteten Methode ohne das erforderliche Recht muss serverseitig abgelehnt werden, auch wenn die UI die Aktion nicht anbietet.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-002",
|
||||
@@ -319,7 +337,8 @@
|
||||
"tracelinks": "StRS-002",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Zwei Support-Mitarbeiter unterschiedlicher Filialen mit SHOW_HELPDESK_ONLY_OWN_BRANCH sehen bei identischer Suchanfrage jeweils nur Tickets ihrer eigenen Filiale.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-003",
|
||||
@@ -335,7 +354,8 @@
|
||||
"tracelinks": "StRS-003",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "SELECT * FROM Invoices liefert dieselben fachlichen Felder wie eine direkte Abfrage auf RechKopf, jedoch mit englischen Spaltennamen.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-004",
|
||||
@@ -351,7 +371,8 @@
|
||||
"tracelinks": "StRS-003",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Ein neues Rechnungsfeld wird nur im View/Entity ergänzt (nicht im Repository): Wert lädt korrekt, geht aber nach dem nächsten Speichervorgang verloren (Regressionstest).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-005",
|
||||
@@ -367,7 +388,8 @@
|
||||
"tracelinks": "StRS-004",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Nach zwei aufeinanderfolgenden Änderungen an einem Vertrag existieren zwei Datensätze in VertragKopfVersions mit korrektem OriginalI3D-Bezug und vollständigen historischen Werten.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-006",
|
||||
@@ -383,7 +405,8 @@
|
||||
"tracelinks": "StRS-005",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Zugriff auf `/weboffer/{Token}` mit geratenem/ungültigem Token liefert Fehlermeldung „Beleg konnte nicht geladen werden.“ statt Fremddaten.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-007",
|
||||
@@ -400,7 +423,8 @@
|
||||
"tracelinks": "StRS-005",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Zweiter Aufruf von ChangeWebReceiptState nach bereits erfolgter Annahme wird serverseitig abgelehnt (Statuscheck), nicht nur clientseitig durch deaktivierte Buttons verhindert.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-008",
|
||||
@@ -416,7 +440,8 @@
|
||||
"tracelinks": "StRS-006",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Manipulierter API-Request, der versucht, direkt einen Auftrag ohne vorherigen Signatur-Callback zu erzeugen, wird von ReceiptBL abgelehnt, da der Beleg noch im Zustand WebOfferSign verharrt.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-009",
|
||||
@@ -432,7 +457,8 @@
|
||||
"tracelinks": "StRS-008",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Vertrag mit BillingIntervalKind=Monthly, AutomatedBilling=true: Am Fälligkeitstag entsteht ohne manuellen Eingriff eine neue Rechnung.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-010",
|
||||
@@ -448,7 +474,8 @@
|
||||
"tracelinks": "StRS-009",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Änderung der Menge eines kontingentrelevanten Beleg-Items löst Neuberechnung von ContingentBalanceUsedHours aus.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-011",
|
||||
@@ -464,7 +491,8 @@
|
||||
"tracelinks": "StRS-010",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Änderung des zugrunde liegenden Rechts wirkt sich unmittelbar (nach Cache-Refresh) sowohl im Timer-Billing als auch in anderen Belegdatums-Kontexten gleich aus.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-012",
|
||||
@@ -480,7 +508,8 @@
|
||||
"tracelinks": "StRS-011, StRS-012",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Ändern der Anwendungseinstellung HelpdeskClosedState auf einen anderen Status-I3D bewirkt sofort, dass GetClosedHelpdeskStatus() den neuen Status liefert.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-013",
|
||||
@@ -497,7 +526,8 @@
|
||||
"tracelinks": "StRS-013",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Aufruf von ApplyDistriToCentron mit EdiDataType=Alltron delegiert nachweislich an eine SupplierEdiBL.Alltron.cs-Methode (z. B. per Log-Eintrag oder Debugger).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-014",
|
||||
@@ -513,7 +543,8 @@
|
||||
"tracelinks": "StRS-013, StRS-014",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "EDI-Testdatei mit einer fehlerhaften und neun korrekten Positionszeilen: Neun Positionen werden verarbeitet, eine wird mit Fehlerprotokoll übersprungen.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-015",
|
||||
@@ -529,7 +560,8 @@
|
||||
"tracelinks": "StRS-015",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Gültiges Microsoft-ID-Token, aber Mandant ohne Lizenz OpenIDConnectAuthentication → Login schlägt mit „No license for OpenIDConnectAuthentication“ fehl.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-016",
|
||||
@@ -545,7 +577,8 @@
|
||||
"tracelinks": "StRS-015",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Benutzer ändert seine Microsoft-E-Mail-Adresse (oid bleibt gleich): Login funktioniert unverändert.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-017",
|
||||
@@ -561,7 +594,8 @@
|
||||
"tracelinks": "StRS-015",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Ticket wird nach 31 Minuten Inaktivität bei nachfolgendem API-Call als abgelaufen erkannt und erfordert erneuten Login.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-018",
|
||||
@@ -577,7 +611,8 @@
|
||||
"tracelinks": "StRS-017",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Manuelle UI-Prüfung: Ribbon minimieren, mehrere Module durchklicken, aktives Modul muss stets erkennbar bleiben.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-019",
|
||||
@@ -593,7 +628,8 @@
|
||||
"tracelinks": "-",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Debug-Build sendet Testmail an externe.adresse@kunde.de: tatsächlicher Empfänger im Mailserver-Log ist test@nexoware.com.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-001",
|
||||
@@ -609,7 +645,8 @@
|
||||
"tracelinks": "SyRS-001",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Statische Code-Analyse: keine zwei Konstanten in UserRightsConst.cs besitzen denselben Integer-Wert.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-002",
|
||||
@@ -625,7 +662,8 @@
|
||||
"tracelinks": "SyRS-001",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Neue Codeverwendung einer obsoleten Konstante erzeugt eine Compiler-Warnung (CS0618), verhindert den Build aber nicht.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-003",
|
||||
@@ -641,7 +679,8 @@
|
||||
"tracelinks": "SyRS-001",
|
||||
"konsolidierung": "Kandidat: Vereinheitlichung der Rechteprüfung auf einen einzigen, schichtübergreifend wiederverwendbaren Mechanismus im Zielsystem (z. B. Policy-based Authorization statt drei paralleler APIs).",
|
||||
"pruefidee": "Code-Review: Für ein Beispielrecht wird geprüft, ob UI-Sichtbarkeitsprüfung und BL-Durchsetzungsprüfung unabhängig voneinander gepflegt werden (z. B. unterschiedliche Rechte-ID durch Copy-Paste-Fehler).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-004",
|
||||
@@ -657,7 +696,8 @@
|
||||
"tracelinks": "StRS-003",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Ein Beleg mit Number=-1 liefert IsTemplate=true; ein Beleg mit Number=0 oder positiv liefert IsTemplate=false.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-005",
|
||||
@@ -673,7 +713,8 @@
|
||||
"tracelinks": "StRS-003",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Für jeden Belegtyp lässt sich per Unit-Test verifizieren, dass State nur einen der drei Enum-Werte annehmen kann (Datenbankkonsistenzprüfung).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-006",
|
||||
@@ -689,7 +730,8 @@
|
||||
"tracelinks": "SyRS-007",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Ein Web-Angebot im Zustand WebOfferSign hat gleichzeitig ReceiptState.Active, bis die Signatur abgeschlossen ist.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-007",
|
||||
@@ -706,7 +748,8 @@
|
||||
"tracelinks": "StRS-005, SyRS-007",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Kunde ändert dieselbe Position zweimal (Menge 5 dann 3): Nach Annahme wird nur die letzte Änderung (3) im neuen Beleg übernommen.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-008",
|
||||
@@ -722,7 +765,8 @@
|
||||
"tracelinks": "StRS-005",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Beleg mit AllowChangeQuantity=false, AllowChangeReceiptItemArticlePositionKind=true: Nach Annahme wird nur die Positionsart-Änderung übernommen, eine vom Kunden vorgenommene Mengenänderung wird verworfen (potenziell ohne Information an den Kunden – siehe Hypothesen.md).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-009",
|
||||
@@ -738,7 +782,8 @@
|
||||
"tracelinks": "StRS-005",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Race-Condition-Test: Change-Requests werden zwischen Klick „Annehmen“ und Serververarbeitung durch einen parallelen Prozess gelöscht → Server antwortet mit Fehler statt fälschlicher Vollannahme.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-010",
|
||||
@@ -754,7 +799,8 @@
|
||||
"tracelinks": "StRS-006, SyRS-008",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Nach Auslösung des Signaturvorgangs erhält sowohl die Kunden-E-Mail-Adresse (receiptPdfDocument.MailAddress) als auch die Mitarbeiter-E-Mail-Adresse je eine E-Mail mit unterschiedlichem Template.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-011",
|
||||
@@ -770,7 +816,8 @@
|
||||
"tracelinks": "StRS-006",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "OfferSignExpiredDateCount=7: Link ist am Tag 7 nutzbar, am Tag 8 liefert der Aufruf „Ungültiger Link“.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-012",
|
||||
@@ -786,7 +833,8 @@
|
||||
"tracelinks": "StRS-006",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Für jede der drei SignatureType-Varianten entsteht ein gültiges, im PDF sichtbares Signaturbild.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-013",
|
||||
@@ -803,7 +851,8 @@
|
||||
"tracelinks": "StRS-008",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Reflection-Test: ReceiptContract.BaseType == typeof(ReceiptBase); Properties enthalten BillingIntervalKind und MandatI3D.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-014",
|
||||
@@ -819,7 +868,8 @@
|
||||
"tracelinks": "StRS-008",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Rechnung aus Vertrag mit MandatI3D erzeugt einen SEPA-Lastschrift-Exportdatensatz mit korrekter Mandatsreferenz.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-015",
|
||||
@@ -835,7 +885,8 @@
|
||||
"tracelinks": "StRS-010, SyRS-011",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Wechsel von ReceiptKind=InvoiceClass zu DeliveryList bei fehlendem Recht: Hinweistext wechselt von „der Rechnung“ zu „des Lieferscheins“ ohne Seiten-Reload.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-016",
|
||||
@@ -851,7 +902,8 @@
|
||||
"tracelinks": "StRS-010",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "UseBillingDate=false, Benutzer ohne Recht: Kein Info-Icon sichtbar. UseBillingDate=true, gleicher Benutzer: Info-Icon erscheint.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-017",
|
||||
@@ -867,7 +919,8 @@
|
||||
"tracelinks": "StRS-011",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Upload eines 512x512-PNG-Icons resultiert in einem gespeicherten 16x16-BMP-Icon.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-018",
|
||||
@@ -883,7 +936,8 @@
|
||||
"tracelinks": "StRS-012",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Status wird nur in einer TaskManagementHelpdeskAction referenziert (0 Tickets): Löschung wird dennoch verweigert mit Meldung „... wird in 1 Task verwendet.“",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-019",
|
||||
@@ -899,7 +953,8 @@
|
||||
"tracelinks": "StRS-013",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Hinzufügen eines neuen Lieferanten erfordert laut Doku nur eine neue Datei `SupplierEdiBL.NeuerLieferant.cs` plus Erweiterung des Dispatch in ApplyDistriToCentron.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-020",
|
||||
@@ -915,7 +970,8 @@
|
||||
"tracelinks": "SyRS-016",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Unit-Test instanziiert OpenIdConnectAuthObject mit einer ClaimsIdentity, die einen \"oid\"-Claim enthält: SubjectIdentifier liefert exakt diesen Wert.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-021",
|
||||
@@ -931,7 +987,8 @@
|
||||
"tracelinks": "SyRS-015, SyRS-016",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Token ohne oid-Claim führt zu Log-Eintrag „Could not find subject identifier 'oid' in JWT claims.“ ohne DB-Zugriff (verifizierbar per SQL-Profiler/Mock).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-022",
|
||||
@@ -947,7 +1004,8 @@
|
||||
"tracelinks": "SyRS-017",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Zwei aufeinanderfolgende API-Aufrufe im Abstand von 1 Minute lösen nur eine tatsächliche DB-Schreiboperation für ExpiryDate aus (per SQL-Profiler nachweisbar).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-023",
|
||||
@@ -963,7 +1021,8 @@
|
||||
"tracelinks": "SyRS-017",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Login mit ApplicationKind, der dem 24h-Fall zugeordnet ist, erzeugt ein Ticket mit ExpiryDate = jetzt + 1440 Minuten.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-024",
|
||||
@@ -979,6 +1038,7 @@
|
||||
"tracelinks": "StRS-017, SyRS-018",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Ribbon minimiert, verschiedene Module (auch mit abweichender visueller Struktur/Custom-Templates) angewählt: Unterstreichung erscheint in allen Fällen ohne Cast-Exception.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
}
|
||||
]
|
||||
+7
@@ -2,6 +2,8 @@
|
||||
|
||||
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
|
||||
|
||||
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
|
||||
|
||||
### Verteilung über die Ebenen
|
||||
|
||||
| Ebene | Anzahl | Anteil |
|
||||
@@ -37,6 +39,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
|
||||
| Belege je Anforderung (Median) | 1,0 |
|
||||
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 45 (75,0 %) |
|
||||
|
||||
### Übernahmewürdigkeit
|
||||
|
||||
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
|
||||
|
||||
### Status
|
||||
|
||||
| Kategorie | Anzahl | Anteil |
|
||||
@@ -54,5 +60,6 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
|
||||
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
|
||||
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **verletzt** – 1 von 26 ungedeckt: SwRS-003 |
|
||||
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
|
||||
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
|
||||
| **Traceability** – Verknüpfung zwischen den Ebenen | 59 von 60 mit Tracelinks (98,3 %) |
|
||||
|
||||
|
||||
+7
@@ -97,6 +97,8 @@ Ohne Subagenten sind Haupt- und Gesamtwerte für `claude-sonnet-5` identisch.
|
||||
|
||||
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
|
||||
|
||||
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
|
||||
|
||||
### Verteilung über die Ebenen
|
||||
|
||||
| Ebene | Anzahl | Anteil |
|
||||
@@ -127,6 +129,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
|
||||
| Belege je Anforderung (Median) | 1 |
|
||||
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 71 (97,3 %) |
|
||||
|
||||
### Übernahmewürdigkeit
|
||||
|
||||
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
|
||||
|
||||
### Status
|
||||
|
||||
| Kategorie | Anzahl | Anteil |
|
||||
@@ -144,6 +150,7 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
|
||||
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
|
||||
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (40 risikorelevante Anforderungen, alle gedeckt) |
|
||||
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
|
||||
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
|
||||
| **Traceability** – Verknüpfung zwischen den Ebenen | 73 von 73 mit Tracelinks (100,0 %) |
|
||||
|
||||
## V1-Reihe: fünf Messpunkte unter identischer Bedingung
|
||||
|
||||
+146
-73
@@ -15,7 +15,8 @@
|
||||
"tracelinks": "SyRS-01, SyRS-02",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Einen fixierten Auftrag ändern und prüfen, dass `Version` erhöht und der alte Datensatz weiterhin per `OriginalI3D`/Vorgängerversion referenzierbar ist.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-02",
|
||||
@@ -32,7 +33,8 @@
|
||||
"tracelinks": "SyRS-03, SyRS-04",
|
||||
"konsolidierung": "Kandidat: Analoge Stornoabläufe in OrderBL/OfferBL/DeliveryListBL/CreditVoucherBL wurden nicht im Detail geprüft (siehe Analysebericht.md) und sollten auf einheitliche Umsetzung verglichen werden.",
|
||||
"pruefidee": "Rechnung stornieren und prüfen: (a) neue Version wird angelegt, (b) State der neuen Version = 3, (c) Positionsmengen = 0, (d) Vorgängerversion bleibt abrufbar.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-03",
|
||||
@@ -49,7 +51,8 @@
|
||||
"tracelinks": "SyRS-05",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Für einen Kunden mit zwei offenen Lieferscheinen vor Stichtag und einem nach Stichtag prüfen, dass nur die beiden ersten in der Ergebnisliste erscheinen.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-04",
|
||||
@@ -66,7 +69,8 @@
|
||||
"tracelinks": "SyRS-06",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Vertrag mit Beginn 01.01., LaufzeitArt=Monatlich, LaufzeitDauer=1 anlegen und prüfen, dass das berechnete nächste Datum der 01.02. ist.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-05",
|
||||
@@ -83,7 +87,8 @@
|
||||
"tracelinks": "SyRS-07, SyRS-08",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "TimerBilling-Einstellungsseite öffnen, `ReceiptKind` zwischen Rechnung/Lieferschein wechseln und prüfen, dass der Hinweistext bei fehlender Berechtigung/Einstellung erscheint.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-06",
|
||||
@@ -100,7 +105,8 @@
|
||||
"tracelinks": "SyRS-09, SyRS-10",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Einem Benutzer ein Recht ausschließlich über eine neue Gruppenzuordnung erteilen und prüfen, dass `HasUserRight` anschließend `true` liefert.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-07",
|
||||
@@ -118,7 +124,8 @@
|
||||
"tracelinks": "SyRS-11",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Benutzer ohne Recht „SETTINGS“, aber in Gruppe „Administratoren“, ruft geschützte Funktion auf und erhält Zugriff.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-08",
|
||||
@@ -135,7 +142,8 @@
|
||||
"tracelinks": "SyRS-12",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Einem WebAccount ein Web-Recht zuweisen und prüfen, dass dies keine Auswirkung auf interne `Sichtrus`-Rechte desselben zugrunde liegenden Kunden hat (und umgekehrt).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-09",
|
||||
@@ -152,7 +160,8 @@
|
||||
"tracelinks": "SyRS-13",
|
||||
"konsolidierung": "Kandidat: Einheitliches Cross-Cutting-Konzern-Pattern über alle sechs Beleg-BL-Klassen hinweg; im Zielsystem als zentraler Autorisierungsfilter statt Einzelprüfung je Methode konsolidierbar.",
|
||||
"pruefidee": "Als WebAccount mit `CustomerI3D=100` eine Abfrage mit `filter.CustomerI3D=200` senden und prüfen, dass die Ergebnisliste leer ist.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-10",
|
||||
@@ -169,7 +178,8 @@
|
||||
"tracelinks": "SyRS-14",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Benutzer ohne hinterlegten Schlüssel führt Validierung durch und erhält die definierte Fehlermeldung statt eines Erfolgs.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-11",
|
||||
@@ -186,7 +196,8 @@
|
||||
"tracelinks": "SyRS-15, SyRS-16, SyRS-17",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Mit gültigem Zertifikat und konfiguriertem TSA-Server ein PDF signieren und die Signatur inkl. Zeitstempel technisch verifizieren.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-12",
|
||||
@@ -202,7 +213,8 @@
|
||||
"tracelinks": "SyRS-18",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Einen neuen Ticketstatus mit eigenem Icon/Farbe anlegen und prüfen, dass er in der Statusauswahl eines Tickets erscheint, ohne dass Code geändert wurde.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-13",
|
||||
@@ -218,7 +230,8 @@
|
||||
"tracelinks": "SyRS-19",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Benutzer mit `OnlyOwnBranch` meldet sich an und prüft, dass nur Tickets der eigenen Niederlassung in der Liste erscheinen.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-14",
|
||||
@@ -234,7 +247,8 @@
|
||||
"tracelinks": "SyRS-20",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Für einen Artikel mit `BarcodeScanen=1` zwei Barcodes erfassen und prüfen, dass der Bestand 2 beträgt, unabhängig vom `Bestand`-Feld in `NebenlagerArtikel`.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-15",
|
||||
@@ -250,7 +264,8 @@
|
||||
"tracelinks": "SyRS-21",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Kunde mit Rabatt=10% und Zahlungsziel „30 Tage netto“ anlegen; neuen Auftrag für diesen Kunden erstellen und prüfen, dass beide Werte im Beleg vorbelegt sind.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-16",
|
||||
@@ -266,7 +281,8 @@
|
||||
"tracelinks": "SyRS-22",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "`InvoiceReminderDays=14` konfigurieren, Rechnung anlegen und prüfen, dass `ReminderDate` = heute + 14 Tage beträgt; bei Einstellung 0/nicht gesetzt bleibt `ReminderDate` unverändert.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-17",
|
||||
@@ -283,7 +299,8 @@
|
||||
"tracelinks": "SyRS-23, SyRS-24",
|
||||
"konsolidierung": "Kandidat: Die drei Attribute teilen nahezu identische Filterlogik (Unterschied nur in Any/All/Single-Verknüpfung) und könnten im Zielsystem auf einen parametrisierten Autorisierungsfilter konsolidiert werden.",
|
||||
"pruefidee": "Endpunkt mit `[AuthorizeUserRight(X)]` ohne Session aufrufen → 401; mit Session aber ohne Recht X aufrufen → 403; mit Recht X aufrufen → 200.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-18",
|
||||
@@ -299,7 +316,8 @@
|
||||
"tracelinks": "SyRS-17",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "TSA-Passwort speichern und den Rohwert in der Einstellungstabelle prüfen — er darf nicht dem eingegebenen Klartext entsprechen.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-01",
|
||||
@@ -315,7 +333,8 @@
|
||||
"tracelinks": "StRS-01",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Sequenzieller Aufruf beobachten (z. B. per Log/Debugger) und prüfen, dass alle drei Phasen in der genannten Reihenfolge durchlaufen werden.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-02",
|
||||
@@ -331,7 +350,8 @@
|
||||
"tracelinks": "StRS-01",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Beleg mit gebundenem Barcode neu versionieren und prüfen, dass ein Historieneintrag mit der alten Versionsnummer erhalten bleibt.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-03",
|
||||
@@ -347,7 +367,8 @@
|
||||
"tracelinks": "StRS-02",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "`CancelInvoice` aufrufen und Rückgabewert von `StoreAsset` sowie den persistierten Datensatz prüfen (State=3, alle Positionsmengen=0).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-04",
|
||||
@@ -363,7 +384,8 @@
|
||||
"tracelinks": "StRS-02",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "`State`-Werte 1, 2, 3 und z. B. 4 an der UI anzeigen lassen und die jeweilige Beschriftung/leere Anzeige prüfen.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-05",
|
||||
@@ -379,7 +401,8 @@
|
||||
"tracelinks": "StRS-03",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Zwei Lieferscheine (vor/nach Stichtag) für denselben Kunden anlegen und prüfen, dass nur der Beleg vor dem Stichtag zurückgegeben wird.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-06",
|
||||
@@ -395,7 +418,8 @@
|
||||
"tracelinks": "StRS-04",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Vertrag mit `LaufzeitArt=null` anlegen und prüfen, dass keine Exception geworfen wird und kein Folgedatum berechnet wird.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-07",
|
||||
@@ -411,7 +435,8 @@
|
||||
"tracelinks": "StRS-05",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "`ReceiptKind` von Invoice auf DeliveryList umstellen und beobachten, dass `BillingDateIsEnabled`/`ShowBillingDateNoteEnabledInfo` neu ausgewertet werden.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-08",
|
||||
@@ -428,7 +453,8 @@
|
||||
"tracelinks": "StRS-05",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "`CanChangeDateInInvoices=false` setzen, ReceiptKind=Invoice wählen und prüfen, dass das Datumsfeld deaktiviert ist und der Hinweistext „... der Rechnung ...“ erscheint.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-09",
|
||||
@@ -444,7 +470,8 @@
|
||||
"tracelinks": "StRS-06",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Benutzer meldet sich an (Cache wird befüllt); Recht wird per Admin-Oberfläche entzogen; prüfen, ob und wann (gleiche Session/nach Neuanmeldung) `HasUserRight` das entzogene Recht noch als vorhanden meldet.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-10",
|
||||
@@ -460,7 +487,8 @@
|
||||
"tracelinks": "StRS-06",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Benutzer zwei Gruppen zuordnen, die ein gemeinsames Recht enthalten, und prüfen, dass es in der Ergebnisliste nur einmal vorkommt.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-11",
|
||||
@@ -477,7 +505,8 @@
|
||||
"tracelinks": "StRS-07",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Siehe StRS-07.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-12",
|
||||
@@ -493,7 +522,8 @@
|
||||
"tracelinks": "StRS-08",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Web-Recht für einen WebAccount setzen und prüfen, dass keine Zeile in `Sichtrus`/`Sichmemb` dafür angelegt wird.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-13",
|
||||
@@ -510,7 +540,8 @@
|
||||
"tracelinks": "StRS-09",
|
||||
"konsolidierung": "Kandidat: sechsfach dupliziertes Prüfmuster, siehe StRS-09.",
|
||||
"pruefidee": "Siehe StRS-09.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-14",
|
||||
@@ -526,7 +557,8 @@
|
||||
"tracelinks": "StRS-10",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Siehe StRS-10.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-15",
|
||||
@@ -542,7 +574,8 @@
|
||||
"tracelinks": "StRS-11",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Alle fünf Einstellungswerte setzen, Anwendung neu starten und prüfen, dass `GetPdfSigningSettings` dieselben Werte zurückliefert.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-16",
|
||||
@@ -558,7 +591,8 @@
|
||||
"tracelinks": "StRS-11",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Benutzer ohne Recht „SETTINGS“ ruft `SavePdfSigningSettings` auf und erhält `Result.AsError` mit Code `RightCheckFailed`.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-17",
|
||||
@@ -574,7 +608,8 @@
|
||||
"tracelinks": "StRS-11, StRS-18",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Siehe StRS-18.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-18",
|
||||
@@ -590,7 +625,8 @@
|
||||
"tracelinks": "StRS-12",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Siehe StRS-12.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-19",
|
||||
@@ -606,7 +642,8 @@
|
||||
"tracelinks": "StRS-13",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Siehe StRS-13.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-20",
|
||||
@@ -622,7 +659,8 @@
|
||||
"tracelinks": "StRS-14",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Siehe StRS-14.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-21",
|
||||
@@ -638,7 +676,8 @@
|
||||
"tracelinks": "StRS-15",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Siehe StRS-15.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-22",
|
||||
@@ -654,7 +693,8 @@
|
||||
"tracelinks": "StRS-16",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Siehe StRS-16.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-23",
|
||||
@@ -670,7 +710,8 @@
|
||||
"tracelinks": "StRS-17",
|
||||
"konsolidierung": "Kandidat: siehe SyRS-24 (gleiche Filterinfrastruktur, unterschiedliche Verknüpfung).",
|
||||
"pruefidee": "Siehe StRS-17.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-24",
|
||||
@@ -686,7 +727,8 @@
|
||||
"tracelinks": "StRS-17",
|
||||
"konsolidierung": "Kandidat: `AuthorizeUserRightAttribute`, `AuthorizeAnyUserRightAttribute` und `AuthorizeAllUserRightsAttribute` teilen fast identischen Aufbau (nur Any/All/Single-Verknüpfung unterscheidet sich) — im Zielsystem auf einen parametrisierten Filter konsolidierbar.",
|
||||
"pruefidee": "Attribut mit leerem Rechte-Array `[AuthorizeAnyUserRight()]` testen und prüfen, dass der Zugriff mit 403 verweigert wird (Fail-Closed-Verhalten).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-01",
|
||||
@@ -702,7 +744,8 @@
|
||||
"tracelinks": "SyRS-01",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Unit-Test: `asset.Version` vor/nach Aufruf vergleichen, Differenz muss exakt 1 sein.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-02",
|
||||
@@ -718,7 +761,8 @@
|
||||
"tracelinks": "SyRS-01",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Reflektion über eine beliebige abgeleitete Klasse (z. B. `Invoice`) prüfen, dass `State`/`OriginalI3D` vorhanden und vom Typ `int` sind.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-03",
|
||||
@@ -734,7 +778,8 @@
|
||||
"tracelinks": "SyRS-02",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Historieneintrag nach Versionswechsel abfragen und `Version`-Feld mit der tatsächlichen Belegversion zum Zeitpunkt der Erstellung vergleichen.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-04",
|
||||
@@ -750,7 +795,8 @@
|
||||
"tracelinks": "SyRS-03",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Siehe SyRS-03.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-05",
|
||||
@@ -766,7 +812,8 @@
|
||||
"tracelinks": "SyRS-04",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Converter mit Werten 0,1,2,3,4 aufrufen und exakte Rückgabewerte prüfen.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-06",
|
||||
@@ -782,7 +829,8 @@
|
||||
"tracelinks": "SyRS-05",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Siehe SyRS-05.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-07",
|
||||
@@ -798,7 +846,8 @@
|
||||
"tracelinks": "SyRS-06",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Siehe SyRS-06.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-08",
|
||||
@@ -814,7 +863,8 @@
|
||||
"tracelinks": "SyRS-06",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Aufruf mit `receiptKind=Invoice` und `receiptKind=CreditVoucher` und Vergleich der jeweils ausgeführten Named Query (z. B. per SQL-Profiler).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-09",
|
||||
@@ -830,7 +880,8 @@
|
||||
"tracelinks": "SyRS-07",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "`ReceiptKind` zweimal auf denselben Wert setzen und prüfen, dass `UpdateBillingDateIsEnabled()` nur beim ersten (wertändernden) Aufruf ausgeführt wird.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-10",
|
||||
@@ -846,7 +897,8 @@
|
||||
"tracelinks": "SyRS-08",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Siehe SyRS-08.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-11",
|
||||
@@ -862,7 +914,8 @@
|
||||
"tracelinks": "SyRS-09",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Zwei aufeinanderfolgende `HasUserRight`-Aufrufe für denselben Benutzer per SQL-Profiler beobachten; es darf nur eine `Sichtrus`/`Sichmemb`-Abfrage anfallen.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-12",
|
||||
@@ -878,7 +931,8 @@
|
||||
"tracelinks": "SyRS-09",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "SQL direkt gegen Testdatenbestand ausführen und Ergebnis mit erwarteten Gruppenrechten abgleichen.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-13",
|
||||
@@ -894,7 +948,8 @@
|
||||
"tracelinks": "SyRS-10",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Methode mit einem `AppUser`-Objekt aus einer bereits geschlossenen/fremden Session aufrufen und prüfen, dass kein `LazyInitializationException` auftritt.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-14",
|
||||
@@ -910,7 +965,8 @@
|
||||
"tracelinks": "SyRS-11",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Siehe SyRS-11.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-15",
|
||||
@@ -927,7 +983,8 @@
|
||||
"tracelinks": "SyRS-11",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Gruppe „Administratoren“ in Testsystem umbenennen und prüfen, dass `IsAdmin()` für ehemalige Mitglieder anschließend `false` liefert.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-16",
|
||||
@@ -943,7 +1000,8 @@
|
||||
"tracelinks": "SyRS-12",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Siehe SyRS-12.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-17",
|
||||
@@ -959,7 +1017,8 @@
|
||||
"tracelinks": "SyRS-12",
|
||||
"konsolidierung": "Kandidat: zwei Überladungen mit identischer Delegationslogik — im Zielsystem ggf. auf eine generische Signatur reduzierbar.",
|
||||
"pruefidee": "Beide Überladungen mit äquivalenten Werten aufrufen und identisches Ergebnis prüfen.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-18",
|
||||
@@ -975,7 +1034,8 @@
|
||||
"tracelinks": "SyRS-13",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Siehe SyRS-13.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-19",
|
||||
@@ -991,7 +1051,8 @@
|
||||
"tracelinks": "SyRS-13",
|
||||
"konsolidierung": "Kandidat: siehe SyRS-13.",
|
||||
"pruefidee": "Jede der fünf Dateien einzeln öffnen und die konkrete Bedingung mit dem Muster aus SwRS-18 vergleichen.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-20",
|
||||
@@ -1007,7 +1068,8 @@
|
||||
"tracelinks": "SyRS-14",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Aufruf mit leerem Schlüssel prüft spezifische Fehlermeldung; Aufruf mit korrektem/falschem TOTP-Code prüft jeweiliges Ergebnis.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-21",
|
||||
@@ -1023,7 +1085,8 @@
|
||||
"tracelinks": "SyRS-14",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Named Queries im Mapping/Query-Katalog auffinden und deren SQL-Text auf Plausibilität (korrekte Tabelle/Spalte) prüfen.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-22",
|
||||
@@ -1039,7 +1102,8 @@
|
||||
"tracelinks": "SyRS-15",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Siehe SyRS-15.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-23",
|
||||
@@ -1055,7 +1119,8 @@
|
||||
"tracelinks": "SyRS-16",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Siehe SyRS-16.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-24",
|
||||
@@ -1071,7 +1136,8 @@
|
||||
"tracelinks": "SyRS-17",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Siehe SyRS-17.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-25",
|
||||
@@ -1087,7 +1153,8 @@
|
||||
"tracelinks": "SyRS-18",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Siehe SyRS-18.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-26",
|
||||
@@ -1103,7 +1170,8 @@
|
||||
"tracelinks": "SyRS-19",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Siehe SyRS-19.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-27",
|
||||
@@ -1119,7 +1187,8 @@
|
||||
"tracelinks": "SyRS-20",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Siehe SyRS-20.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-28",
|
||||
@@ -1135,7 +1204,8 @@
|
||||
"tracelinks": "SyRS-21",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Siehe SyRS-21.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-29",
|
||||
@@ -1151,7 +1221,8 @@
|
||||
"tracelinks": "SyRS-22",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Siehe SyRS-22.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-30",
|
||||
@@ -1167,7 +1238,8 @@
|
||||
"tracelinks": "SyRS-23",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Siehe SyRS-23.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-31",
|
||||
@@ -1183,6 +1255,7 @@
|
||||
"tracelinks": "SyRS-24",
|
||||
"konsolidierung": "Kandidat: nahezu identischer Aufbau beider Filterklassen (siehe SyRS-24).",
|
||||
"pruefidee": "Siehe SyRS-24.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
}
|
||||
]
|
||||
+7
@@ -2,6 +2,8 @@
|
||||
|
||||
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
|
||||
|
||||
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
|
||||
|
||||
### Verteilung über die Ebenen
|
||||
|
||||
| Ebene | Anzahl | Anteil |
|
||||
@@ -32,6 +34,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
|
||||
| Belege je Anforderung (Median) | 1 |
|
||||
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 71 (97,3 %) |
|
||||
|
||||
### Übernahmewürdigkeit
|
||||
|
||||
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
|
||||
|
||||
### Status
|
||||
|
||||
| Kategorie | Anzahl | Anteil |
|
||||
@@ -49,5 +55,6 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
|
||||
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
|
||||
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (40 risikorelevante Anforderungen, alle gedeckt) |
|
||||
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
|
||||
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
|
||||
| **Traceability** – Verknüpfung zwischen den Ebenen | 73 von 73 mit Tracelinks (100,0 %) |
|
||||
|
||||
|
||||
+7
@@ -97,6 +97,8 @@ Ohne Subagenten sind Haupt- und Gesamtwerte für `claude-sonnet-5` identisch.
|
||||
|
||||
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
|
||||
|
||||
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
|
||||
|
||||
### Verteilung über die Ebenen
|
||||
|
||||
| Ebene | Anzahl | Anteil |
|
||||
@@ -133,6 +135,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
|
||||
| Belege je Anforderung (Median) | 1 |
|
||||
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 42 (62,7 %) |
|
||||
|
||||
### Übernahmewürdigkeit
|
||||
|
||||
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
|
||||
|
||||
### Status
|
||||
|
||||
| Kategorie | Anzahl | Anteil |
|
||||
@@ -150,6 +156,7 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
|
||||
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
|
||||
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **verletzt** – 5 von 31 ungedeckt: StRS-17, SyRS-05, SyRS-18, SwRS-10, SwRS-26 |
|
||||
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
|
||||
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
|
||||
| **Traceability** – Verknüpfung zwischen den Ebenen | 67 von 67 mit Tracelinks (100,0 %) |
|
||||
|
||||
## V1-Reihe: fünf Messpunkte unter identischer Bedingung
|
||||
|
||||
+134
-67
@@ -14,7 +14,8 @@
|
||||
"tracelinks": "SyRS-01",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Für jede der sieben Belegarten prüfen, dass Kopf-Objekt Number, Date, State, BranchI3D, CurrencyI3D, Receiver konsistent befüllt und persistiert wird; Test: Angebot anlegen → in Auftrag übernehmen → Referenz auf Ursprungsangebot prüfen.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-02",
|
||||
@@ -31,7 +32,8 @@
|
||||
"tracelinks": "SyRS-02",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Beleg stornieren, danach Versuch `SetPaid` aufzurufen → erwartete Fehlermeldung mit Code `DefaultMessageCodes.ErrorMessage`.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-03",
|
||||
@@ -48,7 +50,8 @@
|
||||
"tracelinks": "SyRS-03",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Beleg zweimal ändern und speichern; prüfen, dass für jede Änderung ein neuer Datensatz mit inkrementierendem `OriginalI3D`-Bezug in der *Versions-Tabelle entsteht und alle Positionswerte identisch zum historischen Stand sind.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-04",
|
||||
@@ -65,7 +68,8 @@
|
||||
"tracelinks": "SyRS-04",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Suche mit `ReceiptKinds = [Invoice]` und einem Kunden ohne Anzeigerecht für Rechnungen ausführen → 0 Treffer für diese Belegart trotz vorhandener Datensätze.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-05",
|
||||
@@ -82,7 +86,8 @@
|
||||
"tracelinks": "SyRS-05",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Vertrag mit `BillingIntervalKind=Monthly`, `AutomatedBilling=true` anlegen, Systemdatum auf Fälligkeitstag stellen, automatisierten Lauf ausführen → genau eine neue Rechnung mit Bezug `ContractI3D` entsteht.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-06",
|
||||
@@ -99,7 +104,8 @@
|
||||
"tracelinks": "SyRS-06",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "RMM-Dienst simulieren als nicht erreichbar, Vertrag mit RMM-Artikelreferenz abrechnen lassen → Rechnungserstellung schlägt mit definierter Fehlermeldung fehl, keine Teil-Rechnung wird gespeichert.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-07",
|
||||
@@ -116,7 +122,8 @@
|
||||
"tracelinks": "SyRS-07",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Kunde mit Limit 1000€ (Netto) anlegen, offene Belege mit Summe 900€ anlegen, neuen Beleg über 200€ ohne Override speichern → Bestätigungsdialog mit korrekt berechneter Differenz (100€) erscheint; mit `SaveAlthoughCustomerLimitExceeded=true` wird gespeichert.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-08",
|
||||
@@ -133,7 +140,8 @@
|
||||
"tracelinks": "SyRS-08",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Codestellen suchen, die `LockOrderAfterDunningLevel` lesend mit dem tatsächlichen `DunningLevel` eines Kunden vergleichen (z. B. in Order-/DeliveryList-SpecificLogic oder UI-ViewModels); falls keine gefunden wird, mit Fachbereich klären, ob die Sperre nur UI-seitig/manuell umgesetzt ist.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-09",
|
||||
@@ -150,7 +158,8 @@
|
||||
"tracelinks": "SyRS-09",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Benutzer ohne Recht `CREATE_CUSTOMER` versucht Kunde anzulegen → `AccountBL` liefert `Result.AsError(\"Fehlende Rechte um Accounts zu erstellen\")`, kein Datensatz wird angelegt.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-10",
|
||||
@@ -167,7 +176,8 @@
|
||||
"tracelinks": "SyRS-10, SyRS-11",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Benutzer ohne Passwort-Manager-Lizenz ruft `GetPasswordManagerCustomersEmployeesRights` auf → Fehler \"Sie besitzen keine Lizenz für den Passwort-Manager.\"; Benutzer mit hinterlegtem 2FA-Schlüssel gibt falsche PIN ein → Fehler \"Die eingegebene PIN ist ungültig!\".",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-11",
|
||||
@@ -184,7 +194,8 @@
|
||||
"tracelinks": "SyRS-12",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Feature mit Lizenz-GUID ohne zugeordnete Lizenz beim Kunden aufrufen → `HasLicense` liefert `false`, UI blendet Funktion aus (Beispiel Passwort-Manager, siehe StRS-10).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-12",
|
||||
@@ -200,7 +211,8 @@
|
||||
"tracelinks": "SyRS-13",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Test-EDI-Datei eines unterstützten Lieferanten (z. B. Alltron-Lieferavis) einspielen → zugehöriger c-entron-Auftrag wird um Lieferinformationen (Sendungsverfolgung, Seriennummern) ergänzt, Verarbeitungsstatus wird in `EDILogBL` protokolliert.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-13",
|
||||
@@ -216,7 +228,8 @@
|
||||
"tracelinks": "SyRS-14",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Aktionspreis mit `EffectiveUntil` in der Vergangenheit anlegen → erscheint nicht im Preisspiegel; Versuch, Aktionspreis ohne Distributor zu speichern → Validierungsfehler.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-14",
|
||||
@@ -232,7 +245,8 @@
|
||||
"tracelinks": "SyRS-15",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Benutzer ohne `BOOK_ARTICLE_STOCK_INTO_NEGATIVE` versucht Abbuchung, die den Bestand unter 0 bringen würde → Aktion wird verweigert; Benutzer mit Recht kann die Buchung durchführen.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-15",
|
||||
@@ -248,7 +262,8 @@
|
||||
"tracelinks": "SyRS-16",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Rechnung mit manipulierter Positionssumme (Abweichung > 3,00 vom Kopfbetrag) exportieren → Export schlägt mit Fehler fehl; Abweichung ≤ 3,00 → Export mit Warnung und korrigiertem Wert.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-16",
|
||||
@@ -265,7 +280,8 @@
|
||||
"tracelinks": "SyRS-17",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "In DEBUG-Build eine Mail an \"kunde@fremdefirma.de\" auslösen → tatsächlicher Empfänger ist \"test@nexoware.com\"; Mail an \"kollege@nexoware.com\" bleibt unverändert.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-17",
|
||||
@@ -281,7 +297,8 @@
|
||||
"tracelinks": "SyRS-18",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Ein Modul mit beiden Implementierungen identifizieren (z. B. `IAccountContractsLogic`) und prüfen, dass beide Implementierungen dieselbe Methode mit identischer Rückgabestruktur anbieten.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-18",
|
||||
@@ -298,7 +315,8 @@
|
||||
"tracelinks": "SyRS-19",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Suchfilter mit SQL-Metazeichen (`'; DROP TABLE ...`) in `SearchText` befüllen → Query wird als Parameterwert behandelt, keine strukturelle Änderung der Abfrage; Penetrationstest mit automatisiertem SQLi-Scanner auf Such-Endpunkt.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "StRS-19",
|
||||
@@ -315,7 +333,8 @@
|
||||
"tracelinks": "SyRS-20",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Stichprobenprüfung von 20 zufällig gewählten Fehlermeldungen/UI-Strings auf deutsche Sprache und Vorhandensein einer `.en.resx`-Übersetzung.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-01",
|
||||
@@ -331,7 +350,8 @@
|
||||
"tracelinks": "StRS-01",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Für alle sieben Belegarten per Reflection prüfen, dass sie von `ReceiptBase` erben und keine der Basiseigenschaften \"shadowen\"/überschreiben.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-02",
|
||||
@@ -348,7 +368,8 @@
|
||||
"tracelinks": "StRS-02",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Automatisierter Test: Beleg canceln, `SetPaid(true)` aufrufen → Fehler; Beleg mit State=Active, `SetPaid(true)` → State wird Completed und Log-Eintrag `CreateSetAsPaidEntry` wird erzeugt.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-03",
|
||||
@@ -365,7 +386,8 @@
|
||||
"tracelinks": "StRS-03",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Schema-Diff zwischen `AngKopf` und `AngKopfVersions` (bzw. `VertragPos`/`VertragPosVersions`) automatisiert prüfen: alle Spalten aus der Basistabelle (außer I3D) müssen 1:1 in der Versionstabelle vorhanden sein.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-04",
|
||||
@@ -381,7 +403,8 @@
|
||||
"tracelinks": "StRS-04",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Lasttest: Suche über alle sieben Belegarten mit großem Datenbestand (>100.000 Belege je Art) ausführen, Antwortzeit und Einhaltung des 5-Minuten-Timeouts messen.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-05",
|
||||
@@ -397,7 +420,8 @@
|
||||
"tracelinks": "StRS-05",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Verträge mit unterschiedlichen Intervallkombinationen (z. B. Monthly/1, Monthly/3, Yearly/1) anlegen und den automatisierten Lauf für verschiedene Stichtage simulieren; erwartete Rechnungstermine mit tatsächlich erzeugten vergleichen.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-06",
|
||||
@@ -413,7 +437,8 @@
|
||||
"tracelinks": "StRS-06",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Integrationstest mit simuliertem RMM-Dienstausfall: (a) Vertrag mit RMM-Artikelreferenzen → Exception und Log-Eintrag; (b) Vertrag ohne RMM-Bezug → Rechnung wird trotz RMM-Ausfall normal erstellt.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-07",
|
||||
@@ -429,7 +454,8 @@
|
||||
"tracelinks": "StRS-07",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Regressionstest mit mehrstufiger Belegkette (Angebot→Auftrag→Rechnung), bei dem derselbe Betrag nicht doppelt ins Limit einfließt (Prüfung `GetLimitUsedInOriginReceipts`-Abzug).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-08",
|
||||
@@ -445,7 +471,8 @@
|
||||
"tracelinks": "StRS-08",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Gezielte Codesuche nach lesendem Zugriff auf `LockOrderAfterDunningLevel` außerhalb von Zuweisung/Mapping; Rückfrage an Fachbereich, ob die Sperre ausschließlich manuell (Mitarbeiterhinweis) erfolgt.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-09",
|
||||
@@ -461,7 +488,8 @@
|
||||
"tracelinks": "StRS-09",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Benutzer mit 3 angefragten Rechten, von denen er nur 1 besitzt, aufrufen → Rückgabemenge enthält exakt dieses eine Recht.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-10",
|
||||
@@ -477,7 +505,8 @@
|
||||
"tracelinks": "StRS-10",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Direkter Webservice-Aufruf ohne UI (z. B. via Testclient) gegen einen Kunden ohne Passwort-Manager-Lizenz → Fehlerantwort mit `LicenseNotFound`, keine Daten im Response-Body.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-11",
|
||||
@@ -493,7 +522,8 @@
|
||||
"tracelinks": "StRS-10",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "PIN-Test mit korrektem TOTP-Wert (aus demselben Secret berechnet) → Erfolg; mit falschem/abgelaufenem Wert → \"Die eingegebene PIN ist ungültig!\"; Benutzer ohne Schlüssel → spezifischer Hinweistext.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-12",
|
||||
@@ -509,7 +539,8 @@
|
||||
"tracelinks": "StRS-11",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Lizenzserver offline simulieren → `HasLicense` liefert weiterhin Werte aus `FileLicenseCache`; Lizenz mit `count=3` grenzt eine vierte Nutzung ab (siehe Beispiel MyDay-Import in Dokumentation).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-13",
|
||||
@@ -525,7 +556,8 @@
|
||||
"tracelinks": "StRS-12",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Für jede in der Tabelle als \"✗\" markierte Kombination (z. B. Komsa+Invoice) prüfen, dass das System dies erkennt und keinen Verarbeitungsversuch unternimmt, statt eine Ausnahme unbehandelt zu werfen.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-14",
|
||||
@@ -541,7 +573,8 @@
|
||||
"tracelinks": "StRS-13",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Aktionspreis mit `EffectiveFrom > EffectiveUntil` speichern → Validierungsfehler; Aktionspreis mit `EffectiveUntil = gestern` → wird im Preisspiegel nicht angezeigt.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-15",
|
||||
@@ -557,7 +590,8 @@
|
||||
"tracelinks": "StRS-14",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Für jedes der 10 Rechte einen Benutzer ohne dieses Recht testen und sicherstellen, dass das zugehörige Flag `false` ist und die serverseitige Aktion verweigert wird (nicht nur UI-Ausblendung).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-16",
|
||||
@@ -573,7 +607,8 @@
|
||||
"tracelinks": "StRS-15",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "E-Rechnung mit Reverse-Charge-Fall exportieren → Steuerkategorie \"AE\" mit Hinweistext \"Steuerschuldnerschaft...\"; Testfall mit absichtlicher Rundungsdifferenz von 3,50 → Export schlägt fehl.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-17",
|
||||
@@ -589,7 +624,8 @@
|
||||
"tracelinks": "StRS-16",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Unit-Test: `ValidateAddress(\"kunde@fremd.de\")` in simuliertem DEBUG-Kontext → liefert `test@nexoware.com`; `ValidateAddress(\"kollege@nexoware.com\")` → liefert unverändert.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-18",
|
||||
@@ -605,7 +641,8 @@
|
||||
"tracelinks": "StRS-17",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Für ein bestehendes Modul (`IAccountContractsLogic`) beide Implementierungen gegen dieselbe Testsuite laufen lassen und identisches Verhalten (bei identischen Daten) verifizieren.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-19",
|
||||
@@ -622,7 +659,8 @@
|
||||
"tracelinks": "StRS-18",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Statische Codeanalyse (z. B. Regex-Suche nach String-Konkatenation mit `filter.` in SQL-Strings) über alle `*SearchConfiguration`- und `*BL`-Klassen; ergänzend automatisierter SQLi-Test gegen Such-Endpunkte.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SyRS-20",
|
||||
@@ -638,7 +676,8 @@
|
||||
"tracelinks": "StRS-19",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Stichprobe: für N zufällige Keys aus `LocalizedStrings.resx` prüfen, ob ein entsprechender Key in `LocalizedStrings.en.resx` existiert (Vollständigkeitsquote ermitteln).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-01",
|
||||
@@ -654,7 +693,8 @@
|
||||
"tracelinks": "SyRS-01",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Vererbungshierarchie aller Klassen mit Namensmuster `Receipt*` per Reflection prüfen: alle erben transitiv von `ReceiptBase`.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-02",
|
||||
@@ -670,7 +710,8 @@
|
||||
"tracelinks": "SyRS-01, SyRS-03",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Neues Feld nur in View + Entity ergänzen (nicht im Repository) → Wert wird nach Speichern+Neuladen NICHT persistiert; Regressionstest als Vorlage für künftige Feldänderungen einrichten.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-03",
|
||||
@@ -686,7 +727,8 @@
|
||||
"tracelinks": "SyRS-02",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Compile-Test: `default: throw new ArgumentOutOfRangeException()` in `GetReceiptStateString` deckt auf, wenn ein neuer Enum-Wert ohne Anpassung eingeführt wird.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-04",
|
||||
@@ -702,7 +744,8 @@
|
||||
"tracelinks": "SyRS-02",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Fehlermeldungstext exakt gegen Testfall abgleichen (inkl. Tippfehler-Erkennung als Regressionsschutz gegen unbeabsichtigte Textänderung); parallele Änderung mit veraltetem `ConcurrencyControlGuid` → Fehler `ChangedByOtherInstance`.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-05",
|
||||
@@ -718,7 +761,8 @@
|
||||
"tracelinks": "SyRS-03",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Automatisiertes Schema-Diff-Skript zwischen jeder `*Kopf`/`*Pos`-Tabelle und ihrer `*Versions`-Entsprechung als CI-Check.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-06",
|
||||
@@ -734,7 +778,8 @@
|
||||
"tracelinks": "SyRS-03",
|
||||
"konsolidierung": "Kandidat: SwRS-05 (gemeinsame Testbasis Schema+Kopiervorgang)",
|
||||
"pruefidee": "Beleg mit 5 Positionen zweimal ändern → 2 Kopf-Versionsdatensätze, 10 Positions-Versionsdatensätze mit korrektem `KopfVersionsI3D`-Bezug je Änderungszeitpunkt.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-07",
|
||||
@@ -750,7 +795,8 @@
|
||||
"tracelinks": "SyRS-04",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Filter setzen, der von genau einer von sieben Belegarten unterstützt wird → Ergebnis enthält ausschließlich Treffer dieser einen Belegart, keine Fehlermeldung für die anderen sechs.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-08",
|
||||
@@ -766,7 +812,8 @@
|
||||
"tracelinks": "SyRS-04, SyRS-09",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Benutzer ohne `ShowRight` für Verträge sucht mit `ReceiptKinds` leer (alle Belegarten) → Ergebnisliste enthält keine Vertragsbelege, auch wenn diese existieren.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-09",
|
||||
@@ -782,7 +829,8 @@
|
||||
"tracelinks": "SyRS-05",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Vertrag mit allen Kontingent-Feldern befüllen, Serialisierung/Deserialisierung (DTO-Mapping) auf Vollständigkeit prüfen.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-10",
|
||||
@@ -798,7 +846,8 @@
|
||||
"tracelinks": "SyRS-05",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Codereview/Komponententest: `AutomaticFacturaBL.Contracts.cs` auf Vorhandensein der beschriebenen Verantwortlichkeiten (Fälligkeitsselektion, RMM-Aufruf, Kontingent-Update) prüfen.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-11",
|
||||
@@ -814,7 +863,8 @@
|
||||
"tracelinks": "SyRS-06",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Rechnungsvorlage mit Platzhalter in Position 3 von 6 → RMM-Positionen erscheinen an Position 3; Vorlage ohne Platzhalter → RMM-Positionen erscheinen bei Position (Anzahl-2).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-12",
|
||||
@@ -830,7 +880,8 @@
|
||||
"tracelinks": "SyRS-06",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Zwei Testfälle wie in SyRS-06 beschrieben, zusätzlich Prüfung der geloggten Fehlermeldung (`_logger.Error(errorMsg)`).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-13",
|
||||
@@ -846,7 +897,8 @@
|
||||
"tracelinks": "SyRS-07",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Beleg über 500€ anlegen (Limitverbrauch 500€), danach auf 600€ ändern und erneut speichern → Limitverbrauch insgesamt 600€, nicht 1100€.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-14",
|
||||
@@ -863,7 +915,8 @@
|
||||
"tracelinks": "SyRS-07, SyRS-08",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Feldweise Persistenztest: alle genannten Felder setzen, speichern, neu laden, Werte vergleichen.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-15",
|
||||
@@ -879,7 +932,8 @@
|
||||
"tracelinks": "SyRS-08",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Vollständige Volltextsuche über die gesamte Codebasis (auch WPF.UI-ViewModels, Reports, gespeicherte Prozeduren) nach `LockOrderAfterDunningLevel`; falls keine Durchsetzung gefunden wird, Rückfrage an Fachbereich/Produktverantwortliche.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-16",
|
||||
@@ -895,7 +949,8 @@
|
||||
"tracelinks": "SyRS-09",
|
||||
"konsolidierung": "Kandidat: SwRS-08 (beide nutzen Rechteprüfung als Vorfilter, aber unterschiedliche Aufrufer/Mechanik — AppRightsBL arbeitet auf App-Usern, ReceiptSearcher auf konfigurierten ShowRight-Werten)",
|
||||
"pruefidee": "Unit-/Integrationstest mit bekannter Testdatenbank: Benutzer mit 2 von 5 angefragten Rechten → Rückgabe enthält exakt 2 IDs.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-17",
|
||||
@@ -912,7 +967,8 @@
|
||||
"tracelinks": "SyRS-09",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Statische Codeanalyse: Suche nach numerischen Literalen in `HasUserRight(...)`/`CheckRightsFromUser(...)`-Aufrufen als Verstoß gegen die Konvention.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-18",
|
||||
@@ -928,7 +984,8 @@
|
||||
"tracelinks": "SyRS-10",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Alle öffentlichen Methoden von `PasswordManagerBL` auflisten und prüfen, ob jede davon dieselbe Lizenzprüfung am Anfang durchführt (Konsistenzprüfung, da nur eine Methode im Detail gelesen wurde — siehe Analysebericht/Lücken).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-19",
|
||||
@@ -944,7 +1001,8 @@
|
||||
"tracelinks": "SyRS-11",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Drei Testfälle: kein Schlüssel hinterlegt, korrekte PIN, falsche PIN → jeweils erwartetes Result-Objekt.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-20",
|
||||
@@ -961,7 +1019,8 @@
|
||||
"tracelinks": "SyRS-12",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Drei Testfälle mit präparierten Lizenzdaten: keine Lizenz, unbegrenzte Lizenz, Lizenz mit count=3 → jeweils erwartetes Result-Verhalten.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-21",
|
||||
@@ -977,7 +1036,8 @@
|
||||
"tracelinks": "SyRS-13",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Neue Testlieferant-Integration nach Schema hinzufügen und prüfen, dass `ApplyDistriToCentron` sie ohne Änderung an bestehenden Partial-Classes korrekt dispatcht.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-22",
|
||||
@@ -993,7 +1053,8 @@
|
||||
"tracelinks": "SyRS-13",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Für jede der 7×4 theoretisch möglichen Kombinationen dokumentieren/testen, ob sie unterstützt wird (Abgleich mit Tabelle \"Document Types Supported\").",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-23",
|
||||
@@ -1009,7 +1070,8 @@
|
||||
"tracelinks": "SyRS-14",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Speicherversuch mit leerem Distributor → Fehler; mit `EffectiveFrom` nach `EffectiveUntil` → Fehler; gültiger Datensatz → erfolgreich gespeichert und im Preisspiegel sichtbar bei aktuellem Datum im Bereich.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-24",
|
||||
@@ -1025,7 +1087,8 @@
|
||||
"tracelinks": "SyRS-15",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Für jedes der 11 Rechte einzeln: Benutzer ohne dieses (aber mit allen anderen) Recht → nur das zugehörige Flag ist `false`.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-25",
|
||||
@@ -1041,7 +1104,8 @@
|
||||
"tracelinks": "SyRS-16",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Drei Testfälle: Abweichung 0,00 (kein Hinweis), 2,50 (Warnung + Korrektur), 5,00 (Fehler, kein Export).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-26",
|
||||
@@ -1057,7 +1121,8 @@
|
||||
"tracelinks": "SyRS-16",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Je einen Testfall pro Kategorie (Standard, steuerfrei Inland, innergemeinschaftlich, Export, Reverse Charge) mit erwartetem Code und Hinweistext abgleichen.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-27",
|
||||
@@ -1073,7 +1138,8 @@
|
||||
"tracelinks": "SyRS-17",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Randfalltests: leere Adresse, Adresse \"NEXOWARE.COM\"-Großschreibung, Adresse ohne @-Zeichen.",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
},
|
||||
{
|
||||
"id": "SwRS-28",
|
||||
@@ -1089,6 +1155,7 @@
|
||||
"tracelinks": "SyRS-18",
|
||||
"konsolidierung": "nein",
|
||||
"pruefidee": "Codebase-weite Suche nach Interfaces mit Suffix `Logic`, die NICHT dem Muster `I*Logic`/`BL*Logic`/`WS*Logic` folgen, als Qualitätsindikator für Konventionsabweichungen (siehe Konsolidierungshinweis Analysebericht).",
|
||||
"qm": ""
|
||||
"qm": "",
|
||||
"uebernahme": ""
|
||||
}
|
||||
]
|
||||
+7
@@ -2,6 +2,8 @@
|
||||
|
||||
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
|
||||
|
||||
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
|
||||
|
||||
### Verteilung über die Ebenen
|
||||
|
||||
| Ebene | Anzahl | Anteil |
|
||||
@@ -38,6 +40,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
|
||||
| Belege je Anforderung (Median) | 1 |
|
||||
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 42 (62,7 %) |
|
||||
|
||||
### Übernahmewürdigkeit
|
||||
|
||||
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
|
||||
|
||||
### Status
|
||||
|
||||
| Kategorie | Anzahl | Anteil |
|
||||
@@ -55,5 +61,6 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
|
||||
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
|
||||
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **verletzt** – 5 von 31 ungedeckt: StRS-17, SyRS-05, SyRS-18, SwRS-10, SwRS-26 |
|
||||
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
|
||||
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
|
||||
| **Traceability** – Verknüpfung zwischen den Ebenen | 67 von 67 mit Tracelinks (100,0 %) |
|
||||
|
||||
|
||||
Reference in New Issue
Block a user