Prüfungssimulation für Fachinformatiker/-in Anwendungsentwicklung nach neuer Ausbildungsordnung 2020. Realistisches 100-Punkte-Schema für alle 3 Prüfungsbereiche inklusive Live-Countdown, didaktischen Erwartungshorizonten und IHK-Notenrechner.
Die OmniCommerce GmbH ist ein international agierender E-Commerce- und ERP-Dienstleister. Im Rahmen der Modernisierung ihrer Kernplattform soll die monolithische Bestandsarchitektur sukzessive in eine modulare, cloudnative Microservice-Landschaft überführt werden. Sie sind als Lead Developer & Softwarearchitekt/-in mit der fachlichen Konzeption, Algorithmenimplementierung, Schnittstellenintegration und Qualitätssicherung betraut.
Given der Kunde hat eine Lieferadresse im EU-Ausland gewählt,When der Kunde eine gültige USt-IdNr. eingibt und über die VIES-Schnittstelle validiert wurde,Then wird die MwSt. auf 0,00 EUR gesetzt und der Hinweis 'Steuerfreie innergemeinschaftliche Lieferung gem. § 4 Nr. 1b UStG' auf der Rechnung vermerkt.
<<interface>> IPaymentStrategy mit Methode +process_payment(amount: Decimal): PaymentResult.CreditCardStrategy, PayPalStrategy, SepaStrategy implementieren das Interface (Realisierungspfeil: gestrichelte Linie mit geschlossener, nicht ausgefüllter Dreiecksspitze).CheckoutContext oder OrderService besitzt eine Referenz auf IPaymentStrategy (Aggregation oder gerichtete Assoziation: durchgezogene Linie mit Pfeil, Multiplizität 1 zu 1).:CheckoutController → :OrderService → :PaymentStrategy → :ExternalGateway.executePayment(orderId, amount) (ausgefüllte Pfeilspitze).alt-Kombiniertes Fragment (Bedingter Zweig):Bestellung (BestellNr, Bestelldatum, KundenNr, KundenName, KundenAdresse, ArtikelNr_1, ArtikelName_1, Menge_1, Preis_1, ArtikelNr_2, ...)
Kunde(KundenNr, Vorname, Nachname, Strasse, PLZ, Ort)Artikel(ArtikelNr, Bezeichnung, Einzelpreis, Lagerbestand)Bestellung(BestellNr, Bestelldatum, KundenNr, Gesamtbetrag, Status)Bestellposition(BestellNr, ArtikelNr, Menge, PreisBeiKauf)
CREATE TABLE customers (
id SERIAL PRIMARY KEY,
first_name VARCHAR(100) NOT NULL,
last_name VARCHAR(100) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL
);
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
customer_id INT NOT NULL REFERENCES customers(id) ON DELETE RESTRICT,
order_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
status VARCHAR(50) DEFAULT 'PENDING'
);
CREATE TABLE order_items (
order_id INT NOT NULL REFERENCES orders(id) ON DELETE CASCADE,
product_id INT NOT NULL REFERENCES products(id) ON DELETE RESTRICT,
quantity INT NOT NULL CHECK (quantity > 0),
unit_price NUMERIC(10, 2) NOT NULL CHECK (unit_price >= 0),
PRIMARY KEY (order_id, product_id)
);
CREATE INDEX idx_orders_cust_status ON orders(customer_id, status);EXPLAIN ANALYZE SELECT ...; zur Prüfung, ob ein Index Scan anstelle eines Sequential Scans ausgeführt wird.
aria-invalid="true", aria-describedby="error-id", sprechende Fehlermeldungen in Textform (nicht nur rote Farbe).:focus-visible), keine Tastaturfallen (Keyboard Traps).def apply_bundle_discounts(cart_items: list[dict], bundle_rules: list[dict]) -> float:
from collections import Counter
counts = Counter(item['sku'] for item in cart_items)
prices = {item['sku']: item['price'] for item in cart_items}
total_discount = 0.0
for rule in bundle_rules:
required_skus = rule['required_skus'] # z.B. ['SKU_A', 'SKU_B', 'SKU_C']
discount_rate = rule.get('discount_percent', 0.15)
# Ermitteln, wie oft das vollständige Bündel gebildet werden kann
matches = min(counts[sku] for sku in required_skus)
if matches > 0:
bundle_val = sum(prices[sku] for sku in required_skus)
total_discount += matches * (bundle_val * discount_rate)
for sku in required_skus:
counts[sku] -= matches
return round(total_discount, 2)
class OrderProcessor:
def process(self, order, customer_type, payment_method):
# 1. Rabatt berechnen mit 20 verschachtelten if/elif
if customer_type == "VIP": discount = 0.20
# 2. Bezahlen per hartkodierter Kreditkarten-API
# 3. SQL Query direkt ausführen
# 4. SMTP Email versenden
from typing import Protocol
class DiscountStrategy(Protocol):
def calculate_discount(self, total: float) -> float: ...
class VipDiscountStrategy:
def calculate_discount(self, total: float) -> float:
return total * 0.20
class StandardDiscountStrategy:
def calculate_discount(self, total: float) -> float:
return 0.0
class OrderService:
def __init__(self, discount_strategy: DiscountStrategy, notifier, repo):
self.discount_strategy = discount_strategy
self.notifier = notifier
self.repo = repo
def process_order(self, order):
discount = self.discount_strategy.calculate_discount(order.total)
order.final_amount = order.total - discount
self.repo.save(order)
self.notifier.send_confirmation(order)
weakref-Modul für Back-References (z.B. Kindelement kennt Elternelement als schwache Referenz, die den Reference Counter nicht erhöht).
/api/v1/orders bereit.
Mobile Apps und Partnerunternehmen greifen auf diese Endpunkte zu. Sicherheitslücken und API-Missbrauch müssen verhindert werden.
201 Created (mit Location-Header)400 Bad Request oder 422 Unprocessable Entity401 Unauthorized403 Forbidden409 Conflict
Base64Url(Header) + "." + Base64Url(Payload) mit geheimem Server-Key (HMAC) oder Private Key (RSA). Verhindert Manipulation der Payload./api/v1/orders/101 auf /102 und sieht fremde Bestelldaten, weil das Backend nur prüft, ob der Nutzer eingeloggt ist, aber nicht, ob ihm die Order gehört.SELECT * FROM orders WHERE id = :order_id AND user_id = :current_user_id;import pytest
from unittest.mock import patch, MagicMock
from app.services import CheckoutService
@pytest.mark.parametrize("subtotal,discount_pct,expected_final", [
(100.0, 0.10, 90.0),
(250.0, 0.20, 200.0),
(50.0, 0.00, 50.0)
])
@patch("app.gateways.BankGateway.charge")
def test_checkout_applies_discount_and_charges(mock_charge, subtotal, discount_pct, expected_final):
# Setup Mock
mock_charge.return_value = {"status": "SUCCESS", "tx_id": "TX_9999"}
service = CheckoutService()
result = service.execute(amount=subtotal, discount_rate=discount_pct)
assert result["final_amount"] == expected_final
assert result["is_paid"] is True
# Verifiziere, dass die Bank mit dem rabattierten Betrag aufgerufen wurde
mock_charge.assert_called_once_with(expected_final)
Lint & Static Check (Ruff, Flake8, Mypy) → 2. Test & Coverage (pytest --cov) → 3. Security Audit (Trivy / Bandit / Dependency Vulnerability Check) → 4. Build & Package (Docker Build & Push in Registry) → 5. Deploy Staging (Automatischer Rollout auf Testumgebung).main-Branch gepusht werden darf; benötigt mindestens ein Pull-Request Review und erfolgreiche CI-Pipeline-Durchläufe.