fix(product): fortlaufende ID-Generierung P-0001 implementiert
parent
e86071a403
commit
2ec8d5c89f
|
|
@ -9,6 +9,9 @@ import java.math.BigDecimal;
|
|||
*/
|
||||
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 bezeichnung;
|
||||
private BigDecimal einzelpreisNetto;
|
||||
|
|
@ -18,24 +21,33 @@ public class Product {
|
|||
|
||||
/**
|
||||
* 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() {
|
||||
// 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 bezeichnung Anzeigename des Artikels (1 bis 100 Zeichen) [cite: 55, 456]
|
||||
* @param einzelpreisNetto Netto-Einzelpreis mit exakt zwei Nachkommastellen (muss >= 0.00 sein) [cite: 55]
|
||||
* @param mwstSatz Zugeordneter Steuersatz aus der Enumeration MwstSatz (NORMAL oder ERMAESSIGT) [cite: 55]
|
||||
* @param beschreibung Optionaler Freitext zur Produktbeschreibung (maximal 500 Zeichen) [cite: 55]
|
||||
* @param kategorie Optionale Warengruppe oder hierarchische Zuordnung [cite: 55]
|
||||
* @param productId Eindeutiger systeminterner Identifikator (z. B. P-0001)
|
||||
* @param bezeichnung Anzeigename des Artikels (1 bis 100 Zeichen)
|
||||
* @param einzelpreisNetto Netto-Einzelpreis mit exakt zwei Nachkommastellen (muss >= 0.00 sein)
|
||||
* @param mwstSatz Zugeordneter Steuersatz aus der Enumeration MwstSatz (NORMAL oder ERMAESSIGT)
|
||||
* @param beschreibung Optionaler Freitext zur Produktbeschreibung (maximal 500 Zeichen)
|
||||
* @param kategorie Optionale Warengruppe oder hierarchische Zuordnung
|
||||
*/
|
||||
public Product(String productId, String bezeichnung, BigDecimal einzelpreisNetto,
|
||||
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.einzelpreisNetto = einzelpreisNetto;
|
||||
this.mwstSatz = mwstSatz;
|
||||
|
|
|
|||
|
|
@ -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("==================================================");
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue