From bb2c3f52e8864903503f772048a5a033e6c4bb42 Mon Sep 17 00:00:00 2001 From: AIIrondev Date: Fri, 21 Aug 2026 18:10:31 +0200 Subject: [PATCH] Implementation for the Damage history for the library items --- Web/app.py | 87 ++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 68 insertions(+), 19 deletions(-) diff --git a/Web/app.py b/Web/app.py index 6385afd..662b58f 100755 --- a/Web/app.py +++ b/Web/app.py @@ -9423,7 +9423,7 @@ def library_item_invoices(item_id): item_id_str = str(item_id_obj) # ========================================== - # 1. RECHNUNGSHISTORIE (Bestehender Code) + # 1. RECHNUNGSHISTORIE (Aus Ausleihen) # ========================================== borrow_docs = list(ausleihungen.find( { @@ -9455,7 +9455,9 @@ def library_item_invoices(item_id): entries.append({ 'borrow_id': str(borrow_doc.get('_id')), 'borrow_status': borrow_doc.get('Status', ''), - 'borrow_user': decrypt_text(borrow_doc.get('User', '')), + 'borrow_user': decrypt_text(borrow_doc.get('User', '')) if hasattr(borrow_doc, + 'get') and borrow_doc.get( + 'User') else '', 'borrow_start': borrow_doc.get('Start').strftime('%d.%m.%Y %H:%M') if isinstance( borrow_doc.get('Start'), datetime.datetime) else '', 'borrow_end': borrow_doc.get('End').strftime('%d.%m.%Y %H:%M') if isinstance(borrow_doc.get('End'), @@ -9472,36 +9474,83 @@ def library_item_invoices(item_id): }) # ========================================== - # 2. SCHADENSHISTORIE (Neuer Code) + # 2. SCHADENSHISTORIE (Neues Format + Fallback) # ========================================== raw_damages = [] - # A: Schäden, die manuell am Element (Item-Dokument) hinterlegt wurden - item_damages = item_doc.get('Damages', []) - if not isinstance(item_damages, list): item_damages = [] - # Fallback falls sie klein geschrieben wurden - if isinstance(item_doc.get('damages', []), list): - item_damages.extend(item_doc.get('damages', [])) + # A: Aktive / gemeldete Schäden aus 'DamageReports' + damage_reports = item_doc.get('DamageReports', []) + if not isinstance(damage_reports, list): + damage_reports = [] - for d in item_damages: + for d in damage_reports: if not isinstance(d, dict): continue + + # Rechnungs-Metadaten anhängen, falls vorhanden + extra_info = "" + if d.get('invoice_number'): + amount = d.get('invoice_amount', '') + extra_info = f"\n(Mit Rechnung: {d['invoice_number']} - {amount}€)" + raw_damages.append({ - 'raw_date': d.get('date') or d.get('created_at'), - 'source': 'Manuell / Element', - 'user': d.get('reported_by') or d.get('user') or 'System/Admin', - 'description': d.get('description') or d.get('reason') or 'Keine Beschreibung', - 'status': d.get('status', 'Unbekannt'), + 'raw_date': d.get('reported_at'), + 'source': str(d.get('source', 'Meldung')).capitalize(), + 'user': d.get('reported_by', 'System/Admin'), + 'description': d.get('description', 'Keine Beschreibung') + extra_info, + 'status': 'Offen', 'borrow_id': None }) - # B: Schäden, die in Ausleih-Dokumenten vermerkt sind + # B: Behobene Schäden aus 'DamageRepairs' + damage_repairs = item_doc.get('DamageRepairs', []) + if not isinstance(damage_repairs, list): + damage_repairs = [] + + for r in damage_repairs: + if not isinstance(r, dict): continue + resolved_list = r.get('resolved_reports', []) + repaired_at = r.get('repaired_at') + repaired_by = r.get('repaired_by', 'Admin') + action_taken = r.get('action_taken', 'repair') + + # Status anhand der Aktion bestimmen + status_text = 'Repariert' if action_taken == 'repair' else 'Erledigt' + + if resolved_list and isinstance(resolved_list, list): + for res in resolved_list: + # Rechnungs-Metadaten aus dem ehemals offenen Report + extra_info = "" + if res.get('invoice_number'): + amount = res.get('invoice_amount', '') + extra_info = f"\n(Mit Rechnung: {res['invoice_number']} - {amount}€)" + + raw_damages.append({ + 'raw_date': res.get('reported_at') or repaired_at, + 'source': f"{status_text} von {repaired_by}", + 'user': res.get('reported_by', 'System/Admin'), + 'description': res.get('description', 'Keine Beschreibung') + extra_info, + 'status': status_text, + 'borrow_id': None + }) + else: + # Fallback, falls keine genauen Reports hinterlegt sind + raw_damages.append({ + 'raw_date': repaired_at, + 'source': 'Reparatur', + 'user': repaired_by, + 'description': 'Schaden behoben', + 'status': status_text, + 'borrow_id': None + }) + + # C: Legacy-Fallback: Schäden, die evtl. nur in alten Ausleih-Dokumenten vermerkt sind damage_borrow_docs = list(ausleihungen.find( { 'Item': {'$in': [item_id_str, item_id_obj]}, '$or': [ {'Damage': {'$exists': True, '$ne': ''}}, {'DamageData': {'$exists': True, '$ne': {}}}, - {'Condition': {'$exists': True, '$ne': ''}} # Falls Zustand gemeldet wurde + {'Condition': {'$exists': True, '$ne': ''}} ] } )) @@ -9517,7 +9566,7 @@ def library_item_invoices(item_id): if desc and str(desc).strip(): raw_damages.append({ 'raw_date': d_data.get('reported_at') or b.get('End') or b.get('Start'), - 'source': f"Ausleihe", + 'source': "Ausleihe", 'user': borrow_user, 'description': desc, 'status': d_data.get('status', 'Gemeldet'), @@ -9549,7 +9598,7 @@ def library_item_invoices(item_id): 'isbn': item_doc.get('ISBN', ''), }, invoices=entries, - damages=damage_entries, # << NEU + damages=damage_entries, library_module_enabled=cfg.MODULES.is_enabled('library'), student_cards_module_enabled=cfg.MODULES.is_enabled('student_cards'), mail_module_enabled=cfg.MODULES.is_enabled('mail')