====== LU20.A01 - Bibliotheksverwaltung ======
Realisieren Sie die verschiedenen Programmteile der Applikation "library" gemäss den Beschreibungen.
===== Allgemeine Infos =====
==== Vorlage ====
Im Vorlage-Repository sind alle Funktionen als rudimentäre Stubs realisiert. Diese Stubs liefern, soweit nötig, einen statischen Returnwert.
Die Logik der Methode "main()" ist bereits vollständig umgesetzt.
==== Vorgehen ====
Wie immer beim Programmieren gilt:
- Wählen Sie einen Programmteil aus, dessen Vorgänger korrekt funktioniert.
- Codieren Sie den neuen Programmteil.
- Testen Sie den neuen Programmteil,
- Falls die Tests nicht erfolgreich sind, gehen Sie zurück zu Schritt 2.
- Führen Sie alle Tests mit ''pytest -vv'' aus.
- Falls mehr Tests erfolgreich sind als zuvor: Commit & Push.
^ Nr ^ Programmteil ^ Vorgänger ^ Tests ^
| 1 | Dataclass - Rental | - | rental_test.py > ''test_attribute_assignments'' |
| 2 | cost | 1 | rental_test.py > ''test_cost_no_overdue'' \\ rental_test.py > ''test_cost_with_overdue''|
| 3 | read_rental | 1,7,8 | library_test.py > ''test_read_rental'' |
| 4 | init_books | 1 | library_test.py > ''test_init_books'' |
| 5 | add_rental | 1, 3, 4 | library_test.py > ''test_add_rental_empty_books'' \\ library_test.py > ''test_add_rental_existing_books'' \\ library_test.py > ''test_add_rental_invalid_book_name'' \\ library_test.py > ''test_add_rental_multiple_rentals'' |
| 6 | show_balance | 1, 2 | library_test.py > ''test_show_balance'' |
| 7 | read_int | - | library_test.py > ''test_read_int_valid_input'' \\ library_test.py > ''test_read_int_invalid_input'' |
| 8 | read_date | - | library_test.py > ''test_read_date_valid_input'' \\ library_test.py > ''test_read_date_invalid_input'' |
==== Testing ====
Die einzelnen Programmteile (Funktionen, Attribute, Property) werden mittels Unit Tests überprüft. Die Testfunktionen finden Sie in ''library_test.py'' und ''rental_test.py''. Für jeden erfolgreichen Test erhalten Sie Punkte.
===== Beschreibungen =====
Der Code stellt ein terminalbasiertes Bibliotheksverwaltungssystem zur Verwaltung von Buchausleihen dar. Es wird mit einer Reihe von Büchern ("Herr der Ringe"-Trilogie) initialisiert und ermöglicht es den Benutzern, Ausleihdatensätze hinzuzufügen, indem sie Buchnamen und Ausleihdetails (Ausleih- und Rückgabedaten, Anzahl der Ausleihtage) eingeben. Das System berechnet und zeigt die Mietkosten an, einschließlich der Strafen für überfällige Rückgaben. Die Benutzer interagieren über ein einfaches Textmenü, in dem sie Optionen zum Hinzufügen von Vermietungen, zum Anzeigen von Salden oder zum Beenden des Programms auswählen. Die Schnittstelle besteht hauptsächlich aus dem Lesen von Benutzereingaben und dem Ausdrucken von Informationen direkt im Terminal.
**Fürs Testen:**
Es bibt nur 3 Bücher, ''LOTR 1'',''LOTR 2'',''LOTR 3''
==== Modul rental.py ====
=== Dataclass - Rental ===
* Datum der Ausleihe: Datum
* Rückgabedatum: Datum
* Anzahl inkludierte Miettage: Ganzzahl
=== @property cost() ===
| Argumente | self |
| Rückgabewerte | Kosten des Ausleihens (Dezimalzahl) |
**Logik**
Die Funktion berechnet die Kosten der Buchausleihe.
Die Kosten für die Buchausleihe sind normalerweise CHF 4.50 für die gesamte Zeitdauer der ''Anzahl Miettage''.
Wird diese Frist jedoch überschritten wird eine Strafgebühr von CHF 3.35 pro angefangene 24 Stunden berechnet.
Die effektive Anzahl Miettage wird berechnet aus ''Rückgabedatum - Datum der Ausleihe''
Der Returnwert wird auf 2 Nachkommastellen gerundet:
''return round(Ausleihgebür,2)''
==== Modul library.py ====
=== main() ===
| Argumente | keine |
| Rückgabewerte | keine |
**Logik**
Die Logik dieser Funktion ist bereits **vollständig umgesetzt**. Beachten Sie die Argumente und Returnwerte der jeweiligen Funktionen.
=== read_rental() ===
| Argumente | keine |
| Rückgabewerte | ''Rental''-Objekt |
**Logik**
Der Benutzer wird aufgefordert, die Angaben zur Ausleihung einzugeben:
* Datum der Ausleihe
* Anzahl Miettage
* Rückgabedatum
Die Benutzereingaben werden in ein neues Rental-Objekt gespeichert und zurückgegeben.
=== init_books() ===
| Argumente | keine |
| Rückgabewerte | Dictionary mit Büchern |
**Logik**
Die Funktion erstellt einen neuen Dictionary. Es werden drei Elemente in das Dictionary eingefügt:
^Schlüssel^ Inhalt (Wert)^
|''LOTR 1''|Leere Liste ''[]''|
|''LOTR 2''|Leere Liste ''[]''|
|''LOTR 3''|Leere Liste ''[]''|
=== add_rental() ===
| Argumente | Dictionary mit Büchern und Ausleihungen |
| Rückgabewerte | keiner |
**Logik**
Der Benutzer wird aufgefordert, einen Buchnamen einzugeben. Die Funktion wählt den Eintrag im Dictionary mit dem Buchnamen als Schlüssel.
Anschliessend wird ''read_rental()'' aufgerufen um ein ''Rental-Objekt'' zu erhalten.
Dieses ''Rental-Objekt'' wird beim gewählten Dictionary-Element am Ende der Liste mit den Buchungen eingefügt.
Anschliessend wird der Benutzer gefragt, ob er die Erfassung beenden will. Solange der Benutzer **''y''** eingibt, wird der gesamte Ablauf wiederholt.
=== show_balance() ===
| Argumente | Dictionary mit Büchern und Ausleihungen |
| Rückgabewerte | keiner |
**Logik**
Die Funktion gibt für jedes Buch …
* … den Buchtitel aus.
* … für jede Buchung (Ausleihe) des Buchs …
* … das Datum der Miete und die Kosten dieser Miete aus.
* … das Total aller Buchungen aus.
Beachten Sie die Darstellung gemäss diesem Beispiel:
Statement for LOTR 1
- 05.01.2023: CHF 4.50
- 06.03.2023: CHF 7.85
Total: CHF 12.35
Statement for LOTR 2
- 06.01.2023: CHF 4.50
- 23.02.2023: CHF 4.50
Total: CHF 9.00
Statement for LOTR 3
- 06.01.2023: CHF 4.50
- 23.02.2023: CHF 14.55
Total: CHF 19.05
=== read_int() ===
| Argumente | prompt: String |
| ::: | minimum: Integer (Optional) |
| ::: | maximum: Integer (Optional) |
| Rückgabewerte | Benutzereingabe als Ganzzahl |
**Logik**
Die Funktion fordert den Benutzer zur Eingabe einer Ganzzahl von ''minimum'' bis ''maximum'' auf.
Falls die Eingabe keine gültige Ganzzahl ist, wird …
* … die Meldung "Please, enter a whole number!" angezeigt.
* … der Benutzer zur erneuten Eingabe aufgefordert.
Falls die Eingabe zu klein / zu gross ist, wird …
* … die Meldung "Please, enter a number greater than or equal to ''number''" angezeigt.
* … die Meldung "Please, enter a number less than or equal to ''number''" angezeigt.
* … der Benutzer zur erneuten Eingabe aufgefordert.
=== read_date() ===
| Argumente | prompt: String |
| Rückgabewerte | Benutzereingabe als Datum/Uhrzeit-Objekt |
**Logik**
Die Funktion fordert den Benutzer zur Eingabe eines Zeitpunkts auf.
Die Eingabe muss im Format ''d(d).m(m).jjjj'' erfolgen, z.B. 15.7.2023
Falls die Eingabe kein gültiger Zeitpunkt ist, wird …
* … die Meldung "Please enter a valid date." angezeigt.
* … der Benutzer zur erneuten Eingabe aufgefordert.
----
//=> GitHub Repo für externe Besucher//
GitHub Repository https://github.com/templates-python/m319-lu20-a01-library
//Lernende am BZZ **müssen** den Link zum GitHub Classroom Assignment verwenden//
{{tag>m310-LU20}}
[[https://creativecommons.org/licenses/by-nc-sa/4.0/|{{https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png}}]] Kevin Maurizi, Marcel Suter