# Testen von Use Cases

<section class="space-y-6" id="bkmrk-vertragsmanagement-t"><div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"></div></div>## **Vertragsmanagement**

### TC 5.1: Contract Synchronisation (Einzeln)

**Ziel:** Vertrag wird aus Gridware nach ERPNext synchronisiert.

**Testschritte:**

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none"><div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">1. Gehe zu becharged Settings → Feld "Gridware Contract ID"
2. Gib eine Contract ID ein (z.B. "12345")
3. Klicke Button "Fetch Contract by ID"
4. **Validieren:**
    - Gridware Contract wurde erstellt (Name: "GWC-......")
    - Alle Felder sind gefüllt: contract\_id, contract\_number, contract\_type
    - active\_from / active\_until sind gesetzt
    - VAT ist korrekt übertragen

</div></div></div></div></div></div>**Erfolgskriterium:** Contract ist bereit für Ladevorgang-Verarbeitung.

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none"><div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">---

</div></div></div></div></div></div>### TC 5.2: Contract Customers Sync

**Ziel:** Kunden-Liste des Contracts wird synchronisiert.

**Testschritte:**

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none"><div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">1. Öffne den Contract aus TC 5.1
2. Scrolla zu "Contract Customers" Tab
3. **Validieren:**
    - Mindestens eine Zeile vorhanden
    - customer\_id, subject\_id, subject\_name sind gefüllt
    - `gridware_party` Link ist gesetzt (Background Job)
    - `customer` Link ist gesetzt zu ERPNext Customer

</div></div></div></div></div></div>**Erfolgskriterium:** Alle Kunden sind korrekt verlinkt.

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none"><div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">---

</div></div></div></div></div></div>### TC 5.3: Contract Supplier Sync

**Ziel:** Lieferant wird korrekt verlinkt.

**Testschritte:**

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none"><div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">1. Öffne den Contract aus TC 5.1
2. Gehe zu "Supplier Details" Section
3. **Validieren:**
    - `gridware_supplier_party` ist gesetzt
    - `supplier` Link zeigt zu ERPNext Supplier
    - Supplier Name ist korrekt

</div></div></div></div></div></div>**Erfolgskriterium:** Supplier kann in Lieferantenabrechnung verwendet werden.

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none"><div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">---

</div></div></div></div></div></div>### TC 5.4: Contract Usage Fetch

**Ziel:** Ladevorgänge für Contract werden abgerufen.

**Testschritte:**

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none"><div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">1. Öffne Contract aus TC 5.1
2. Schaue in Links: "Usage" Sektion
3. **Validieren:**
    - Mindestens ein Gridware Usage vorhanden
    - Links zeigen zur Seite mit allen Usages
    - Usages haben gridware\_usage\_id

</div></div></div></div></div></div>**Erfolgskriterium:** Ladevorgänge sind synchronisiert.

## **Stammdatenverwaltung**

### TC 4.1: Gridware Party Synchronisation

**Ziel:** Stelle sicher, dass Parteien aus Gridware korrekt nach ERPNext synchronisiert werden.

**Testschritte:**

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">1. Öffne Contract aus TC 5.1
2. Wähle entweder einen Customer oder den Supplier
3. Öffne die Gridware Party
4. **Validieren:**
    - Gridware Party wurde in ERPNext erstellt (Name: "GDW-P-.....")
    - display\_name ist korrekt (z.B. "Tesla GmbH")
    - is\_customer = 1 oder is\_supplier = 1 gesetzt
    - gridware\_customer\_number / gridware\_supplier\_number sind gefüllt

</div></div></div>**Erfolgskriterium:** Party-Datensatz ist vollständig mit allen Daten aus Gridware.

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">---

</div></div></div>### TC 4.2: Customer Auto-Erstellung aus Party

**Ziel:** Customer wird automatisch aus Gridware Party erstellt.

**Testschritte:**

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">1. Öffne die Gridware Party aus TC 5.1
2. Markiere: `is_customer = 1`
3. Speichere
4. Warte auf Background Job (oder triggere manuell: `master_data_from_gridware_party()`)
5. **Validieren:**
    - Ein neuer Customer wurde erstellt
    - Customer Name = Gridware Party display\_name
    - `custom_gridware_party` Link ist gesetzt auf die Party
    - Kunde kann in Sales Invoice verwendet werden

</div></div></div>**Erfolgskriterium:** Customer ist einsatzbereit ohne manuelle Nacharbeit.

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">---

</div></div></div>### TC 4.3: Contact Auto-Erstellung

**Ziel:** Kontaktperson wird automatisch aus Party erstellt.

**Testschritte:**

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">1. Erstelle neue Gridware Party mit `party_kind = "Person"`
2. Fülle: `first_name = "Max"`, `last_name = "Müller"`, `email = "max@example.com"`
3. Speichere
4. **Validieren:**
    - Ein Contact wurde erstellt
    - Contact Name = "Max Müller"
    - Email ist gespeichert
    - `custom_gridware_party` ist gesetzt

</div></div></div>**Erfolgskriterium:** Contact kann für Customer verwendet werden.

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">---

</div></div></div>### TC 4.4: SEPA Mandate Synchronisation

**Ziel:** SEPA Mandat wird korrekt synchronisiert.

**Testschritte:**

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">1. Synchronisiere eine Party mit Payment Methods
2. Gehe zur Gridware Party → Tab "Payment Method"
3. **Validieren:**
    - Payment Method Row zeigt: payment\_type, iban, bic, sepa\_mandate\_id
    - `erpnext_sepa_mandate` Link ist gesetzt
    - ERPNext SEPA Mandate wurde erstellt
    - Bank Account ist verlinkt

</div></div></div>**Erfolgskriterium:** SEPA-Daten können in Sales Invoice verwendet werden.

### **Ladevorgang-Verarbeitung**

### TC 7.1: Usage Skeleton Creation

**Ziel:** Gridware Usage wird mit Status "Pending" erstellt.

**Testschritte:**

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">1. Öffne Gridware Usage List
2. Filtere nach: `status = "Pending"`
3. Öffne einen Usage
4. **Validieren:**
    - gridware\_usage\_id ist eindeutig gefüllt
    - gridware\_contract ist verlinkt
    - status = "Pending"
    - Detail-Felder sind LEER: start, end, consumption\_value\_in\_kwh, etc.

</div></div></div>**Erfolgskriterium:** Skeleton-Format ist korrekt (nur ID + Contract).

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">---

</div></div></div>### TC 7.2: Usage Detail Fill (Async Job)

**Ziel:** Background Job füllt Usage-Details auf.

**Testschritte:**

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">1. Warte 1-2 Minuten nach TC 7.1
2. Aktualisiere den Usage (F5)
3. **Validieren:**
    - status hat sich zu "Complete" geändert
    - start ist gefüllt mit echtem Datetime
    - end ist gefüllt
    - consumption\_value\_in\_kwh &gt; 0
    - usage\_price\_payment\_amount &gt; 0
    - rental\_object\_display\_name zeigt Ladesäule

</div></div></div>**Erfolgskriterium:** Alle Daten aus Gridware API sind übernommen.

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">---

</div></div></div>### TC 7.3: Usage Price Details

**Ziel:** Kostenaufschlüsselung ist korrekt.

**Testschritte:**

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">1. Öffne einen "Complete" Usage
2. Gehe zu "Usage Price Details" Section
3. **Validieren:**
    - total\_fix\_costs\_excl\_vat + total\_energy\_costs\_excl\_vat + ... = Gesamtnetto
    - Brutto-Werte sind ca. 19% höher (bei 19% VAT)
    - Beispiel: 100 € netto + 19 € VAT = 119 € brutto ✓

</div></div></div>**Erfolgskriterium:** Kostenaddition ist mathematisch korrekt.

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">---

</div></div></div>### TC 7.4: Usage Wh → kWh Conversion

**Ziel:** Energiewert wird korrekt von Wh zu kWh konvertiert.

**Testschritte:**

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">1. Öffne einen "Complete" Usage
2. Vergleiche: consumption\_value\_in\_wh vs. consumption\_value\_in\_kwh
3. **Validieren:**
    - consumption\_value\_in\_kwh = consumption\_value\_in\_wh / 1000
    - Beispiel: 45000 Wh = 45 kWh ✓

</div></div></div>**Erfolgskriterium:** Umrechnung ist korrekt.

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">---

</div></div></div>### TC 7.5: Usage Cent → Euro Conversion

**Ziel:** Preise werden korrekt von Cent zu Euro konvertiert.

**Testschritte:**

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">1. Öffne einen "Complete" Usage
2. Vergleiche: usage\_price\_payment\_amount Wert
3. **Validieren:**
    - Wenn API: 12500 Cent → DB: 125.00 € ✓
    - Wert ist in korrektem Format (2 Dezimalstellen)

</div></div></div>**Erfolgskriterium:** Währungsumrechnung ist korrekt.

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">---

</div></div></div>### TC 7.6: Failed Usage Retry

**Ziel:** Fehlgeschlagene Usages werden täglich wiederholt.

**Testschritte:**

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">1. Erstelle einen simulierten Failed Usage (manuell: status = "Failed")
2. Warte auf Scheduler (täglich)
3. Oder: Triggere manuell `retry_failed_usage_completion()`
4. **Validieren:**
    - Status hat sich zu "Complete" geändert
    - Error Log zeigt keine Fehler mehr

</div></div></div>**Erfolgskriterium:** Automatische Wiederholung funktioniert.

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">---

</div></div></div>## **Kundenabrechnung**

### TC 8.1: Auto-Fetch beim Öffnen

**Ziel:** Customer Usage Data holt automatisch Usages ab.

**Testschritte:**

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">1. Erstelle neue Customer Usage Data
2. Setze: customer = "Customer A", billing\_period = "01/2026"
3. Speichere
4. **Validieren:**
    - Ein Benachrichtigungs-Popup erscheint: "Auto-fetched X usage(s)"
    - usage\_details Tabelle ist NICHT leer
    - Mindestens eine Zeile pro verfügbarem Usage

</div></div></div>**Erfolgskriterium:** Auto-Fetch wurde triggert und hat Daten gefunden.

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">---

</div></div></div>### TC 8.2: Aggregation in usage\_details

**Ziel:** Ladevorgänge werden korrekt in Child Table aggregiert.

**Testschritte:**

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">1. Öffne die Customer Usage Data aus TC 8.1
2. Schaue zu "Usage Details"
3. **Validieren:**
    - Jede Zeile zeigt einen Usage
    - gridware\_usage Link ist gesetzt
    - consumption\_kwh ist &gt; 0
    - price\_excl\_vat ist &gt; 0
    - contract\_type ist nicht leer

</div></div></div>**Erfolgskriterium:** Alle Usages sind aggregiert.

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">---

</div></div></div>### TC 8.3: Item-Mapping

**Ziel:** Item Code wird korrekt aus Contract Type + VAT gemappt.

**Testschritte:**

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">1. Öffne Customer Usage Data aus TC 8.1
2. Schaue Spalte "item\_code" in usage\_details
3. **Validieren:**
    - Jede Zeile hat einen item\_code (z.B. "CHARGING-POSTPAID-19")
    - item\_code existiert in ERPNext Item Master
    - Mapping ist logisch: USAGE\_POSTPAID + 19% = CHARGING-POSTPAID-19

</div></div></div>**Erfolgskriterium:** Item-Mapping wurde korrekt durchgeführt.

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">---

</div></div></div>### TC 8.4: Totals Calculation

**Ziel:** Gesamtzahlen werden korrekt berechnet.

**Testschritte:**

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">1. Öffne Customer Usage Data aus TC 8.1
2. Gehe zu "Totals" Section
3. **Validieren (Beispiel mit 2 Usages):**
    - total\_consumption = 45 + 30 = 75 kWh
    - total\_charging\_sessions = 2
    - total\_price\_excl\_vat = SUM(price\_excl\_vat) von allen Details
    - total\_price\_incl\_vat = total\_price\_excl\_vat \* 1.19 (bei 19% VAT)

</div></div></div>**Erfolgskriterium:** Alle Summen sind mathematisch korrekt.

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">---

</div></div></div>### TC 8.5: Price Details Breakdown

**Ziel:** Kostenaufschlüsselung wird korrekt summiert.

**Testschritte:**

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">1. Öffne Customer Usage Data aus TC 8.1
2. Gehe zu "Price Details" Section
3. **Validieren:**
    - total\_fix\_costs\_excl\_vat = SUM aller Usage Fix Costs
    - total\_energy\_costs\_excl\_vat = SUM aller Usage Energy Costs
    - Summe aller Kosten = total\_price\_excl\_vat

</div></div></div>**Erfolgskriterium:** Kostenaufschlüsselung ist vollständig und korrekt.

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">---

</div></div></div>### TC 8.6: Duplicate Prevention

**Ziel:** Ein Usage kann nicht zweimal aggregiert werden.

**Testschritte:**

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">1. Erstelle eine zweite Customer Usage Data für denselben Customer/Period
2. **Validieren:**
    - Auto-Fetch findet KEINE Usages (weil bereits aggregiert)
    - Benachrichtigung: "No usages found"

</div></div></div>**Erfolgskriterium:** Duplikate sind ausgeschlossen.

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">---

</div></div></div>### TC 8.7: Status Transition

**Ziel:** Status wird automatisch abgeleitet.

**Testschritte:**

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">1. Öffne Customer Usage Data aus TC 8.1
2. Status sollte "Uninvoiced" sein
3. Klicke "Create Sales Invoice"
4. Speichere Invoice als Draft
5. **Validieren:**
    - Status ändert sich zu "Draft Invoice"
6. Submit Invoice
7. **Validieren:**
    - Status ändert sich zu "Invoiced"

</div></div></div>**Erfolgskriterium:** Status wird automatisch synchronisiert.

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">---

</div></div></div>### TC 8.8: Multiple Contracts Aggregation

**Ziel:** Mehrere Verträge werden korrekt aggregiert.

**Voraussetzung:** Customer hat 2 Contracts für Januar 2026

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">- Contract 1: USAGE\_POSTPAID, 19% VAT
- Contract 2: AUTHORIZATION, 0% VAT

</div></div></div>**Testschritte:**

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">1. Erstelle Customer Usage Data für diesen Customer
2. **Validieren:**
    - usage\_details hat mindestens 2 unterschiedliche contract\_type Zeilen
    - Zeilen sind nach Contract Type gruppiert

</div></div></div>**Erfolgskriterium:** Mehrere Verträge sind gemeinsam abgerechnet.

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">---

</div></div></div>### TC 8.9: Sales Invoice Creation

**Ziel:** Sales Invoice wird aus Customer Usage Data erstellt.

**Testschritte:**

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">1. Öffne "Uninvoiced" Customer Usage Data
2. Klicke Button "Create Sales Invoice"
3. **Validieren:**
    - Sales Invoice wird geöffnet (Draft Status)
    - customer ist korrekt gesetzt
    - Items sind gruppiert nach Contract Type + VAT
    - Summe = total\_price\_excl\_vat aus CUD
    - custom\_customer\_usage\_data Link ist gesetzt

</div></div></div>**Erfolgskriterium:** Invoice ist korrekt vorbereitet und bereit zum Submit.

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">---

</div></div></div>### TC 8.10: Pending Usage Blockade

**Ziel:** Customer Usage Data kann nicht erstellt werden mit Pending Usages.

**Testschritte:**

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">1. Erstelle einen Usage mit status = "Pending"
2. Versuche Customer Usage Data zu erstellen
3. **Validieren:**
    - Error-Nachricht: "Found X pending Gridware Usage record(s)"
    - Customer Usage Data wird NICHT erstellt

</div></div></div>**Erfolgskriterium:** Pending Usages werden blockiert.

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">---

</div></div></div>## Integrations-Tests (End-to-End)

### E2E TC 1: Vollständiger Flow (Single Charging Session)

**Szenario:** Ein Ladevorgang eines Kunden in Januar 2026

**Testschritte:**

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">1. **Party Sync:** Synchronisiere Party (Kunde + Lieferant)
    
    
    - Party vorhanden
2. **Contract Sync:** Synchronisiere Vertrag
    
    
    - Contract vorhanden mit Kunden + Lieferant
3. **Usage Sync:** Warte auf Usage (Status: Pending → Complete)
    
    
    - Usage vorhanden mit allen Details
4. **Auto-Fetch:** Erstelle Customer Usage Data
    
    
    - Usage wurde aggregiert
5. **Totals:** Prüfe Gesamtzahlen
    
    
    - total\_consumption = 45 kWh
    - total\_price\_excl\_vat = 105.04 €
6. **Invoice:** Erstelle Sales Invoice
    
    
    - Invoice zeigt 45 kWh
    - Subtotal = 105.04 €
    - Total (mit 19% VAT) = 125.00 €

</div></div></div>**Erfolgskriterium:** Vollständiger Flow ohne Fehler.

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">---

</div></div></div>### E2E TC 2: Mehrere Ladevorgänge (Monthly Aggregation)

**Szenario:** 100 Ladevorgänge eines Kunden in Januar 2026

**Testschritte:**

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">1. Synchronisiere alle 100 Usages
2. Erstelle Customer Usage Data für Januar
3. **Validieren:**
    - Alle 100 Usages sind aggregiert
    - total\_charging\_sessions = 100
    - total\_consumption = 1.234 kWh (Beispiel)
    - Keine Duplikate
4. Erstelle Sales Invoice
5. **Validieren:**
    - Invoice zeigt alle Kosten
    - Gruppiert nach Contract Type + VAT (z.B. 2-3 Zeilen)

</div></div></div>**Erfolgskriterium:** Massenaggregation funktioniert.

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">---

</div></div></div>### E2E TC 3: Multiple Contracts Same Customer

**Szenario:** Kunde hat 3 Verträge, Ladevorgänge pro Vertrag

**Testschritte:**

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">1. Synchronisiere 3 Contracts für denselben Kunden
2. Synchronisiere Usages pro Contract
3. Erstelle Customer Usage Data
4. **Validieren:**
    - Alle Contracts sind aggregiert
    - Customer Usage Detail hat Zeilen pro Contract Type
    - Totals addieren sich korrekt
5. Erstelle Sales Invoice
6. **Validieren:**
    - Invoice hat separate Zeilen pro Contract Type
    - Gesamtbetrag ist korrekt

</div></div></div>**Erfolgskriterium:** Multi-Contract-Aggregation funktioniert.

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">---

</div></div></div>### E2E TC 4: USAGE\_ADHOC Handling

**Szenario:** Kunde hat auch USAGE\_ADHOC Ladevorgänge

**Testschritte:**

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">1. Synchronisiere Contract mit type = "USAGE\_ADHOC"
2. Synchronisiere Usages
3. Erstelle Customer Usage Data
4. **Validieren:**
    - USAGE\_ADHOC Usages sind NICHT aggregiert
    - Total enthält NICHT die USAGE\_ADHOC Kosten
5. Erstelle Sales Invoice
6. **Validieren:**
    - USAGE\_ADHOC Zeilen sind NICHT in Invoice

</div></div></div>**Erfolgskriterium:** USAGE\_ADHOC wird korrekt ignoriert.

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">---

</div></div></div>### E2E TC 5: Fehlerbehandlung &amp; Recovery

**Szenario:** API ist kurzzeitig nicht erreichbar

**Testschritte:**

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">1. Trenne API-Verbindung
2. Starte Usage Sync
3. **Validieren:**
    - Usage Sync schlägt fehl
    - Status = "Failed"
    - Error Log zeigt API-Fehler
4. Stelle API-Verbindung wieder her
5. Warte auf Scheduler oder trigger `retry_failed_usage_completion()`
6. **Validieren:**
    - Status ändert sich zu "Complete"
    - Usage ist jetzt verfügbar

</div></div></div>**Erfolgskriterium:** Error Recovery funktioniert.

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">---

</div></div></div>### E2E TC 6: SEPA Payment Integration

**Szenario:** Rechnung wird via SEPA bezahlt

**Testschritte:**

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">1. Erstelle und submit Sales Invoice (aus TC 8.9)
2. **Validieren:**
    - custom\_sepa\_mandate\_reference ist gesetzt vom Customer
3. Erstelle Payment Entry
4. **Validieren:**
    - SEPA-Konto ist vorgewählt
    - Mandat ist korrekt verlinkt
5. Submit Payment Entry
6. **Validieren:**
    - Invoice ist bezahlt
    - Status-Update

</div></div></div>**Erfolgskriterium:** SEPA-Integration funktioniert end-to-end.

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">---

</div></div></div>## Performance-Tests

### PT 1: Bulk Sync (1.000+ Usages)

**Ziel:** System verarbeitet große Mengen.

**Testschritte:**

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">1. Synchronisiere Contract mit 1.000+ Usages
2. **Validieren:**
    - Sync fertig in &lt;5 Minuten
    - Keine Datenverluste
    - Keine Duplikate

</div></div></div>**Erfolgskriterium:** Performance ist akzeptabel.

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">---

</div></div></div>### PT 2: Aggregation Performance (100+ Sessions pro Customer)

**Ziel:** Customer Usage Data verarbeitet große Datenmengen.

**Testschritte:**

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">1. Erstelle Customer Usage Data mit 100+ Usages
2. **Validieren:**
    - Aggregation fertig in &lt;10 Sekunden
    - Totals korrekt
    - UI responsive

</div></div></div>**Erfolgskriterium:** UI bleibt responsive.

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">---

</div></div></div>## Data Quality Tests

### DQ 1: Datenintegrität

**Testschritte:**

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">1. Exportiere Customer Usage Data
2. Vergleiche mit Gridware Export
3. **Validieren:**
    - Alle Usages vorhanden
    - Keine fehlenden oder doppelten Daten
    - Preise stimmen überein

---

</div></div></div>### DQ 2: Zahlen-Validierung

**Testschritte:**

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">1. Öffne mehrere Sales Invoices
2. **Validieren:**
    - Jede Invoice = genau 1 Customer Usage Data
    - Summen stimmen überein
    - Keine mathematischen Fehler

---

</div></div></div>## Checkliste für Kundenabnahme

<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 pb-4"><div class="space-y-4"><div class="w-full h-[300px] sm:h-96 lg:h-[450px] p-4 border border-gray-300 rounded-lg shadow-sm overflow-auto bg-white prose prose-slate max-w-none">- Alle TC 4.x (Stammdaten) bestanden
- Alle TC 5.x (Vertragsmanagement) bestanden
- Alle TC 7.x (Ladevorgang-Verarbeitung) bestanden
- Alle TC 8.x (Kundenabrechnung) bestanden
- Alle E2E TCs bestanden
- Alle PT TCs bestanden
- Alle DQ TCs bestanden
- Keine kritischen Error-Logs
- Performance-Anforderungen erfüllt
- Go-Live freigegebe

</div></div></div></section><div class="absolute left-0 top-0 bottom-0 w-1/2 overflow-hidden opacity-20 hidden md:block" id="bkmrk-">[![](https://markdowntotext.com/paperarchive/document-chaos.svg)](https://paperarchive.io/de/quiz?utm_source=markdowntotext&utm_medium=banner&utm_campaign=chaos_score)</div><div class="relative z-10 text-center px-6 py-8 sm:px-12 sm:py-10" id="bkmrk--1">[  ](https://paperarchive.io/de/quiz?utm_source=markdowntotext&utm_medium=banner&utm_campaign=chaos_score)</div>