Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
114 changes: 73 additions & 41 deletions app/services/lending_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -341,56 +341,88 @@ def _process_consumable_lending(item_barcode: str, worker_barcode: str, action:

@staticmethod
def get_active_lendings() -> list:
"""Holt alle aktiven Ausleihen"""
"""Holt alle aktiven Ausleihen (Optimiert mit Aggregation Bolt ⚡)"""
try:
active_lendings = mongodb.find('lendings', {'returned_at': None})

# Erweitere mit Tool- und Worker-Informationen
enriched_lendings = []
for lending in active_lendings:
tool = mongodb.find_one('tools', {'barcode': lending['tool_barcode']})
worker = mongodb.find_one('workers', {'barcode': lending['worker_barcode']})

if tool and worker:
enriched_lendings.append({
**lending,
'tool_name': tool['name'],
'worker_name': f"{worker['firstname']} {worker['lastname']}",
'lent_at': lending['lent_at']
})

# Sortiere nach Datum (neueste zuerst)
enriched_lendings.sort(key=lambda x: x.get('lent_at', datetime.min), reverse=True)
return enriched_lendings
pipeline = [
{'$match': {'returned_at': None}},
{'$sort': {'lent_at': -1}},
{
'$lookup': {
'from': 'tools',
'localField': 'tool_barcode',
'foreignField': 'barcode',
'as': 'tool_info'
}
},
{'$unwind': '$tool_info'},
{
'$lookup': {
'from': 'workers',
'localField': 'worker_barcode',
'foreignField': 'barcode',
'as': 'worker_info'
}
},
{'$unwind': '$worker_info'},
{
'$project': {
'tool_barcode': 1,
'worker_barcode': 1,
'lent_at': 1,
'created_at': 1,
'sync_status': 1,
'tool_name': '$tool_info.name',
'worker_name': {
'$concat': ['$worker_info.firstname', ' ', '$worker_info.lastname']
}
}
}
]

return mongodb.aggregate('lendings', pipeline)

except Exception as e:
logger.error(f"Fehler beim Laden aktiver Ausleihen: [Interner Fehler]")
return []

@staticmethod
def get_recent_consumable_usage(limit: int = 10) -> list:
"""Holt die letzten Verbrauchsmaterial-Entnahmen"""
"""Holt die letzten Verbrauchsmaterial-Entnahmen (Optimiert mit Aggregation Bolt ⚡)"""
try:
recent_usages = mongodb.find('consumable_usages')
# Sortiere und limitiere
recent_usages.sort(key=lambda x: x.get('used_at', datetime.min), reverse=True)
recent_usages = recent_usages[:limit]

# Erweitere mit Consumable- und Worker-Informationen
enriched_usages = []
for usage in recent_usages:
consumable = mongodb.find_one('consumables', {'barcode': usage['consumable_barcode']})
worker = mongodb.find_one('workers', {'barcode': usage['worker_barcode']})

if consumable and worker:
enriched_usages.append({
'consumable_name': consumable['name'],
'quantity': usage['quantity'],
'worker_name': f"{worker['firstname']} {worker['lastname']}",
'used_at': usage['used_at']
})

return enriched_usages
pipeline = [
{'$sort': {'used_at': -1}},
{'$limit': limit},
{
'$lookup': {
'from': 'consumables',
'localField': 'consumable_barcode',
'foreignField': 'barcode',
'as': 'consumable_info'
}
},
{'$unwind': '$consumable_info'},
{
'$lookup': {
'from': 'workers',
'localField': 'worker_barcode',
'foreignField': 'barcode',
'as': 'worker_info'
}
},
{'$unwind': '$worker_info'},
{
'$project': {
'consumable_name': '$consumable_info.name',
'quantity': 1,
'worker_name': {
'$concat': ['$worker_info.firstname', ' ', '$worker_info.lastname']
},
'used_at': 1
}
}
]

return mongodb.aggregate('consumable_usages', pipeline)

except Exception as e:
logger.error(f"Fehler beim Laden der Verbrauchsmaterial-Entnahmen: [Interner Fehler]")
Expand Down