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)
# ==========================================
# 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')