{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Lernwerkstatt 02 — Regeln und Spalten\n",
    "\n",
    "**Wirtschaftsinformatik · Brick-Flow AG · Wintersemester 2026/27**\n",
    "\n",
    "> **Leitfrage der Woche:** *Was passiert zwischen dem Klick auf „Bestellen“ und der Zahl im Monatsbericht?*\n",
    "\n",
    "In dieser Lernwerkstatt lernt ihr\n",
    "\n",
    "1. eine **Funktion** schreiben — eine Regel, die man einmal festlegt und immer wieder anwendet,\n",
    "2. **Fallunterscheidungen** mit `if` / `else`,\n",
    "3. **Spalten und Zeilen** gezielt auswählen.\n",
    "\n",
    "> **Weiterhin gilt:** Eine Fehlermeldung ist ein *Hinweis*, kein Grund zur Panik. Wir lesen sie."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Teil 0 — Daten laden (wie letzte Woche)\n",
    "\n",
    "Legt `brickflow_bestellungen.csv` in **denselben Ordner wie dieses Notebook** (auf dem\n",
    "**HS-Bochum-Jupyter-Cluster** `jupyter.hs-bochum.de`: aus dem Kursordner kopieren oder\n",
    "hochladen)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "\n",
    "df = pd.read_csv(\"brickflow_bestellungen.csv\")\n",
    "print(\"Geladen:\", len(df), \"Zeilen,\", len(df.columns), \"Spalten\")\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Teil 1 — Eine Regel als Funktion\n",
    "\n",
    "Brick-Flow gibt Fachhändlern (**B2B**) 10 % Rabatt, Endkunden (**B2C**) nicht.\n",
    "Statt das jedes Mal neu zu rechnen, schreiben wir die Regel **einmal** als Funktion."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def rechnungsbetrag(bestellwert, segment):\n",
    "    # Rechnungslogik\n",
    "    if segment == \"B2B\":\n",
    "        preis = bestellwert * 0.90    # 10 % Rabatt fuer Haendler\n",
    "    else:\n",
    "        preis = bestellwert           # B2C zahlt den vollen Preis\n",
    "    # Ausgabe\n",
    "    return preis\n",
    "\n",
    "print(rechnungsbetrag(2000, \"B2B\"))   # 1800.0\n",
    "print(rechnungsbetrag(100,  \"B2C\"))   # 100"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**So liest man die Funktion:**\n",
    "\n",
    "- `def rechnungsbetrag(bestellwert, segment):` **definiert** die Funktion. Nach `def` steht\n",
    "  der Name, in Klammern stehen die **Eingaben** (Parameter), am Ende ein **Doppelpunkt**.\n",
    "- Die **eingerückten** Zeilen darunter gehören zur Funktion. Die Einrückung (4 Leerzeichen)\n",
    "  ist in Python kein Schmuck, sondern Teil der Syntax.\n",
    "- `if segment == \"B2B\":` prüft eine Bedingung. `==` heißt „ist gleich“ (ein einzelnes `=`\n",
    "  würde etwas zuweisen). Trifft die Bedingung zu, läuft der eingerückte Block darunter,\n",
    "  sonst der Block nach `else:`.\n",
    "- `return` gibt das Ergebnis (`preis`) zurück und beendet die Funktion. Ohne `return` käme nichts heraus.\n",
    "- `rechnungsbetrag(2000, \"B2B\")` **ruft** die Funktion auf: Die Eingaben stehen in der\n",
    "  Klammer, in derselben Reihenfolge wie in der Definition.\n",
    "\n",
    "Jede Funktion hat dieselben vier Bestandteile: Name, Eingaben, Regel, Ausgabe."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Jetzt mit einem Wert aus der Tabelle.** Die erste Bestellung in `df.head()` (Teil 0) hat den\n",
    "Bestellwert 98,62 €. Was würde ein B2B-Kunde dafür zahlen, was ein B2C-Kunde? (`round(x, 2)`\n",
    "rundet auf Cent.)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print(round(rechnungsbetrag(98.62, \"B2B\"), 2))   # 88.76\n",
    "print(round(rechnungsbetrag(98.62, \"B2C\"), 2))   # 98.62"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Die Funktion rechnet *einen* Wert. Wie man dieselbe Regel auf *alle* 1.616 Bestellungen\n",
    "anwendet, lernt ihr in den nächsten Wochen (Schleifen ab Woche 3)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Warum eine Funktion?** Die Regel steht an *einer* Stelle. Ändert sich der Rabatt,\n",
    "ändert man ihn genau hier — nicht an hundert Stellen im Code. So funktioniert auch\n",
    "Unternehmenssoftware: eine Regel, eine Quelle.\n",
    "\n",
    "**Mini-Aufgabe:** Erweitert die Funktion um eine **Staffel** — ab 1.000 € Bestellwert\n",
    "bekommen auch B2C-Kunden 5 % Rabatt (B2B bleibt bei 10 %). Tipp: Im `else`-Zweig braucht\n",
    "ihr eine weitere Fallunterscheidung.\n",
    "\n",
    "1. **Erst die Erwartung:** Rechnet von Hand aus, was herauskommen muss: B2C mit 500 €,\n",
    "   B2C mit 1.500 €, B2B mit 1.500 €. Schreibt die drei Zahlen als Kommentar in die Zelle.\n",
    "2. **Dann testen:** Ruft die Funktion mit diesen drei Fällen auf. Stimmen Erwartung und\n",
    "   Ergebnis überein?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Erwartung von Hand (drei Zahlen):\n",
    "\n",
    "\n",
    "# Eure erweiterte Funktion:\n",
    "\n",
    ""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Teil 2 — Spalten und Zeilen auswählen\n",
    "\n",
    "Selten braucht man die ganze Tabelle. Man wählt gezielt aus."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "df[\"bestellwert\"].head()             # eine Spalte"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "df[[\"bestellnr\", \"bestellwert\"]].head()   # mehrere Spalten"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "df[df[\"bestellwert\"] > 1000].head()   # nur Zeilen mit grossem Bestellwert"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Teil 3 — Lernwerkstattaufgaben (selbstständig)\n",
    "\n",
    "In eurem Tempo. Tutor:innen helfen. **Fehlermeldungen sind Hinweise.**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Aufgabe 1.** Wählt aus `df` alle Zeilen mit genau 4 Paketen aus. Zeigt davon nur die Spalten mit der\n",
    "Bestellnummer und dem Bestellwert an (mit `.head()` die ersten Zeilen) und gebt außerdem aus, wie viele Zeilen das sind."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Aufgabe 1:\n",
    "\n",
    ""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Aufgabe 2.** Schreibt eine Funktion `rabatt_grossauftrag(anzahl_pakete, bestellwert)`, die 20 % Rabatt\n",
    "gewährt, falls mindestens 4 Pakete bestellt wurden, und sonst den vollen Bestellwert zurückgibt. Probiert die Funktion mit den Werten der ersten beiden Zeilen\n",
    "von `df.head()` aus (Teil 0) und mit einem eigenen Fall, in dem der Rabatt greift."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Aufgabe 2:\n",
    "\n",
    ""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Sprinteraufgaben\n",
    "\n",
    "Für alle, die schneller fertig sind. Überlegt euch, wie man **mehrere Bedingungen kombinieren** kann.\n",
    "\n",
    "> **Tipp:** Beim Filtern einer ganzen Tabelle verknüpft `pandas` Bedingungen mit `&` (und) und\n",
    "> `|` (oder). Jede einzelne Bedingung steht in runden Klammern:\n",
    "> `df[(Bedingung 1) & (Bedingung 2)]`."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Aufgabe 3.** Wählt alle Zeilen von `df` mit 4 Paketen **und** einem Bestellwert größer als 1000 aus.\n",
    "Wie viele solcher Zeilen gibt es?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Aufgabe 3:\n",
    "\n",
    ""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Aufgabe 4.** Wählt alle Zeilen von `df` aus, deren Bestelldatum **vor dem 3. Januar** oder **nach dem 10. Januar**\n",
    "liegt. *Tipp:* Das Datum steht in `df` als Text im Format `JJJJ-MM-TT`, zum Beispiel `\"2026-01-03\"`. Der Vergleich\n",
    "mit `<` und `>` funktioniert auch mit diesem Text."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Aufgabe 4:\n",
    "\n",
    ""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Geschafft!\n",
    "\n",
    "Ihr habt heute\n",
    "\n",
    "- eine **Funktion** mit `if`/`else` geschrieben (eine Regel, eine Stelle),\n",
    "- die Funktion an einem **Wert aus der Tabelle** ausprobiert,\n",
    "- **Spalten und Zeilen** gezielt ausgewählt (eine Spalte, mehrere Spalten, Zeilen nach einer Bedingung),\n",
    "- *(Sprinter)* **mehrere Bedingungen** mit `&` und `|` verknüpft.\n",
    "\n",
    "**Nächste Woche:** Der Vertrieb meldet 1.616 Bestellungen, das Controlling 1.594 —\n",
    "*wer hat recht?* Wir kümmern uns um Datenqualität. Legt dafür vorab\n",
    "`brickflow_bestellungen_roh.csv` und `brickflow_kunden.csv` aus dem Kursordner neben das\n",
    "Notebook der nächsten Woche."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "name": "python",
   "version": "3.x"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
