Implementation for the Damage history for the library items
Release Inventarsystem / release-docker (push) Successful in 2m15s

This commit is contained in:
2026-08-21 18:10:31 +02:00
parent 58ea4e5716
commit bb2c3f52e8
+68 -19
View File
@@ -9423,7 +9423,7 @@ def library_item_invoices(item_id):
item_id_str = str(item_id_obj) item_id_str = str(item_id_obj)
# ========================================== # ==========================================
# 1. RECHNUNGSHISTORIE (Bestehender Code) # 1. RECHNUNGSHISTORIE (Aus Ausleihen)
# ========================================== # ==========================================
borrow_docs = list(ausleihungen.find( borrow_docs = list(ausleihungen.find(
{ {
@@ -9455,7 +9455,9 @@ def library_item_invoices(item_id):
entries.append({ entries.append({
'borrow_id': str(borrow_doc.get('_id')), 'borrow_id': str(borrow_doc.get('_id')),
'borrow_status': borrow_doc.get('Status', ''), '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_start': borrow_doc.get('Start').strftime('%d.%m.%Y %H:%M') if isinstance(
borrow_doc.get('Start'), datetime.datetime) else '', 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'), '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 = [] raw_damages = []
# A: Schäden, die manuell am Element (Item-Dokument) hinterlegt wurden # A: Aktive / gemeldete Schäden aus 'DamageReports'
item_damages = item_doc.get('Damages', []) damage_reports = item_doc.get('DamageReports', [])
if not isinstance(item_damages, list): item_damages = [] if not isinstance(damage_reports, list):
# Fallback falls sie klein geschrieben wurden damage_reports = []
if isinstance(item_doc.get('damages', []), list):
item_damages.extend(item_doc.get('damages', []))
for d in item_damages: for d in damage_reports:
if not isinstance(d, dict): continue 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_damages.append({
'raw_date': d.get('date') or d.get('created_at'), 'raw_date': d.get('reported_at'),
'source': 'Manuell / Element', 'source': str(d.get('source', 'Meldung')).capitalize(),
'user': d.get('reported_by') or d.get('user') or 'System/Admin', 'user': d.get('reported_by', 'System/Admin'),
'description': d.get('description') or d.get('reason') or 'Keine Beschreibung', 'description': d.get('description', 'Keine Beschreibung') + extra_info,
'status': d.get('status', 'Unbekannt'), 'status': 'Offen',
'borrow_id': None '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( damage_borrow_docs = list(ausleihungen.find(
{ {
'Item': {'$in': [item_id_str, item_id_obj]}, 'Item': {'$in': [item_id_str, item_id_obj]},
'$or': [ '$or': [
{'Damage': {'$exists': True, '$ne': ''}}, {'Damage': {'$exists': True, '$ne': ''}},
{'DamageData': {'$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(): if desc and str(desc).strip():
raw_damages.append({ raw_damages.append({
'raw_date': d_data.get('reported_at') or b.get('End') or b.get('Start'), 'raw_date': d_data.get('reported_at') or b.get('End') or b.get('Start'),
'source': f"Ausleihe", 'source': "Ausleihe",
'user': borrow_user, 'user': borrow_user,
'description': desc, 'description': desc,
'status': d_data.get('status', 'Gemeldet'), 'status': d_data.get('status', 'Gemeldet'),
@@ -9549,7 +9598,7 @@ def library_item_invoices(item_id):
'isbn': item_doc.get('ISBN', ''), 'isbn': item_doc.get('ISBN', ''),
}, },
invoices=entries, invoices=entries,
damages=damage_entries, # << NEU damages=damage_entries,
library_module_enabled=cfg.MODULES.is_enabled('library'), library_module_enabled=cfg.MODULES.is_enabled('library'),
student_cards_module_enabled=cfg.MODULES.is_enabled('student_cards'), student_cards_module_enabled=cfg.MODULES.is_enabled('student_cards'),
mail_module_enabled=cfg.MODULES.is_enabled('mail') mail_module_enabled=cfg.MODULES.is_enabled('mail')