fix(product): fortlaufende ID-Generierung P-0001 implementiert #7
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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