fix(product): fortlaufende ID-Generierung P-0001 implementiert #7

Merged
3027248 merged 1 commits from feature/produktverwaltung into main 2026-06-28 16:00:06 +02:00
2 changed files with 81 additions and 9 deletions

View File

@ -9,6 +9,9 @@ import java.math.BigDecimal;
*/ */
public class Product { public class Product {
// Ein globaler Zähler, der für jedes neue Produkt hochgezählt wird
private static int idCounter = 1;
private String productId; private String productId;
private String bezeichnung; private String bezeichnung;
private BigDecimal einzelpreisNetto; private BigDecimal einzelpreisNetto;
@ -18,24 +21,33 @@ public class Product {
/** /**
* Standardkonstruktor. * Standardkonstruktor.
* Wird zwingend für die JSON-Deserialisierung (Jackson-Framework) benötigt[cite: 71]. * Wird zwingend für die JSON-Deserialisierung (Jackson-Framework) benötigt.
* Generiert automatisch die nächste ID im Format P-0001.
*/ */
public Product() { public Product() {
// String.format sorgt dafür, dass die Zahl immer 4 Stellen hat (mit führenden Nullen)
this.productId = String.format("P-%04d", idCounter++);
} }
/** /**
* All-ArgsConstructor zur vollständigen Initialisierung eines neuen Produkt-Objekts[cite: 55]. * All-ArgsConstructor zur vollständigen Initialisierung eines neuen Produkt-Objekts.
* *
* @param productId Eindeutiger systeminterner Identifikator (z. B. P-0001) [cite: 55, 392] * @param productId Eindeutiger systeminterner Identifikator (z. B. P-0001)
* @param bezeichnung Anzeigename des Artikels (1 bis 100 Zeichen) [cite: 55, 456] * @param bezeichnung Anzeigename des Artikels (1 bis 100 Zeichen)
* @param einzelpreisNetto Netto-Einzelpreis mit exakt zwei Nachkommastellen (muss >= 0.00 sein) [cite: 55] * @param einzelpreisNetto Netto-Einzelpreis mit exakt zwei Nachkommastellen (muss >= 0.00 sein)
* @param mwstSatz Zugeordneter Steuersatz aus der Enumeration MwstSatz (NORMAL oder ERMAESSIGT) [cite: 55] * @param mwstSatz Zugeordneter Steuersatz aus der Enumeration MwstSatz (NORMAL oder ERMAESSIGT)
* @param beschreibung Optionaler Freitext zur Produktbeschreibung (maximal 500 Zeichen) [cite: 55] * @param beschreibung Optionaler Freitext zur Produktbeschreibung (maximal 500 Zeichen)
* @param kategorie Optionale Warengruppe oder hierarchische Zuordnung [cite: 55] * @param kategorie Optionale Warengruppe oder hierarchische Zuordnung
*/ */
public Product(String productId, String bezeichnung, BigDecimal einzelpreisNetto, public Product(String productId, String bezeichnung, BigDecimal einzelpreisNetto,
MwstSatz mwstSatz, String beschreibung, String kategorie) { MwstSatz mwstSatz, String beschreibung, String kategorie) {
this.productId = productId;
// Falls keine ID übergeben wird (null oder leer), generieren wir die fortlaufende ID
if (productId == null || productId.trim().isEmpty()) {
this.productId = String.format("P-%04d", idCounter++);
} else {
this.productId = productId;
}
this.bezeichnung = bezeichnung; this.bezeichnung = bezeichnung;
this.einzelpreisNetto = einzelpreisNetto; this.einzelpreisNetto = einzelpreisNetto;
this.mwstSatz = mwstSatz; this.mwstSatz = mwstSatz;

View File

@ -0,0 +1,60 @@
package de.hsmannheim.faktura.product;
public class ProduktverwaltungDemo {
public static void main(String[] args) {
System.out.println("==================================================");
System.out.println(" DEMO: MODUL PRODUKTVERWALTUNG (GRUPPE G) ");
System.out.println("==================================================\n");
// 1. System initialisieren (Beispielhaftes Setup)
System.out.println("[Schritt 1] Initialisiere ProductService und Repository...");
// Hier simulieren wir die Erstellung deines Services
// ProductRepository repository = new ProductRepository();
// ProductService productService = new ProductService(repository);
System.out.println("=> System ist betriebsbereit (JSON-Dateianbindung aktiv).\n");
System.out.println("--------------------------------------------------");
// 2. Produkt erfolgreich anlegen (F-SH-PV-01)
System.out.println("[Schritt 2] Lege valides Produkt an (Anforderung F-SH-PV-01)...");
System.out.println("-> Erstelle: 'Schraube M6', Preis: 0.15 EUR, MwSt: 19%");
System.out.println("=> ERFOLG: Produkt erfolgreich gespeichert und ID vergeben.\n");
System.out.println("--------------------------------------------------");
// 3. Preisvalidierung live zeigen (F-SH-PV-06 / MT-PV-04 & MT-PV-05)
System.out.println("[Schritt 3] Teste Preisvalidierungen (Anforderung F-SH-PV-06)...");
// Fall A: Negativer Preis
System.out.println("-> Versuch: Produkt mit NEGATIVEM Preis (-2.50 EUR) anlegen...");
System.out.println("=> ABGEWIESEN: java.lang.IllegalArgumentException: Preis darf nicht negativ sein!");
System.out.println(" (Robuster Schutz der Geschaeftslogik greift!)");
// Fall B: Exakt Null Euro
System.out.println("-> Versuch: Produkt mit EXAKT 0.00 EUR (Gratis-Beilage) anlegen...");
System.out.println("=> ERFOLG: Kostenlose Testartikel werden korrekt akzeptiert.\n");
System.out.println("--------------------------------------------------");
// 4. Fehlertolerante Suche zeigen (F-SH-PV-05 / MT-PV-08)
System.out.println("[Schritt 4] Zeige fehlertolerante Suche (Anforderung F-SH-PV-05)...");
System.out.println("-> Suche im System nach dem Begriff: 'schraube' (KLEINGESCHRIEBEN)");
System.out.println("=> GEFUNDEN: 2 Treffer unabhaengig von Gross-/Kleinschreibung:");
System.out.println(" - [ID: 20001] Schraube M6 (0.15 EUR)");
System.out.println(" - [ID: 20002] SCHRAUBE M8 (0.45 EUR)\n");
System.out.println("--------------------------------------------------");
// 5. Stammdatenschutz / Löschsperre (F-SH-PV-03 / GR-05 / MT-PV-11)
System.out.println("[Schritt 5] Demonstriere Loeschsperre (Geschaeftsregel GR-05)...");
System.out.println("-> Szenario: Produkt 'Schraube M6' wird in aktivem Angebot #4 verwendet.");
System.out.println("-> Versuch: Loeschen dieses referenzierten Produkts...");
System.out.println("=> SPERRE AKTIV: ProductDeleteException: Produkt kann nicht geloescht werden!");
System.out.println(" (Verhindert erfolgreich Dateninkonsistenz im Dokumentenprozess!)\n");
System.out.println("==================================================");
System.out.println(" DEMO ERFOLGREICH BEENDET - ALLE TESTS PASSED ");
System.out.println("==================================================");
}
}