Changes so the edeting function can also adeit all the Codes and the entire mamunt of an itemgroup
Release Inventarsystem / release-docker (push) Successful in 2m14s
Release Inventarsystem / release-docker (push) Successful in 2m14s
This commit is contained in:
@@ -20,6 +20,7 @@ Collection Structure:
|
||||
"""
|
||||
from bson.objectid import ObjectId
|
||||
from bson.errors import InvalidId
|
||||
import uuid
|
||||
import datetime
|
||||
import Web.modules.database.settings as cfg
|
||||
from Web.modules.database.settings import MongoClient
|
||||
@@ -1147,4 +1148,77 @@ def get_current_status(item_id, decrypt=True):
|
||||
return None
|
||||
except Exception as e:
|
||||
print(f"Error retrieving current status for item {item_id}: {e}")
|
||||
return None
|
||||
return None
|
||||
|
||||
def sync_group_codes(primary_obj_id, base_code, individual_codes_list):
|
||||
"""
|
||||
Synchronisiert die Barcodes einer Gruppe beim Bearbeiten (abwärtskompatibel).
|
||||
Trennt sauber zwischen 'Basis-Code' und 'weiteren Einzelcodes'.
|
||||
"""
|
||||
if not base_code:
|
||||
return False
|
||||
|
||||
# Alle Codes zusammenführen und Duplikate filtern
|
||||
all_target_codes = [base_code]
|
||||
for c in individual_codes_list:
|
||||
if c and c not in all_target_codes:
|
||||
all_target_codes.append(c)
|
||||
|
||||
try:
|
||||
client = MongoClient(cfg.MONGODB_HOST, cfg.MONGODB_PORT)
|
||||
db = client[cfg.MONGODB_DB]
|
||||
items = db['items']
|
||||
|
||||
primary_item = items.find_one({'_id': ObjectId(primary_obj_id)})
|
||||
if not primary_item:
|
||||
client.close()
|
||||
return False
|
||||
|
||||
group_id = primary_item.get('SeriesGroupId')
|
||||
|
||||
# 1. Wenn mehrere Codes existieren, aber noch keine Gruppe: Gruppe erstellen
|
||||
if not group_id and len(all_target_codes) > 1:
|
||||
group_id = str(uuid.uuid4())
|
||||
items.update_one({'_id': primary_item['_id']}, {'$set': {'SeriesGroupId': group_id}})
|
||||
primary_item['SeriesGroupId'] = group_id
|
||||
|
||||
# 2. Wenn es weiterhin keine Gruppe gibt (nur 1 Code), updaten und beenden
|
||||
if not group_id:
|
||||
items.update_one({'_id': primary_item['_id']}, {'$set': {'Code_4': base_code}})
|
||||
client.close()
|
||||
return True
|
||||
|
||||
# 3. Bestand abgleichen
|
||||
existing_items = list(items.find({'SeriesGroupId': group_id}))
|
||||
existing_codes_map = {item.get('Code_4'): item['_id'] for item in existing_items if item.get('Code_4')}
|
||||
existing_codes_set = set(existing_codes_map.keys())
|
||||
target_codes_set = set(all_target_codes)
|
||||
|
||||
codes_to_add = target_codes_set - existing_codes_set
|
||||
codes_to_remove = existing_codes_set - target_codes_set
|
||||
|
||||
# 4. Entfernte Codes löschen (Haupt-Item wird niemals gelöscht)
|
||||
for code in codes_to_remove:
|
||||
item_id_to_delete = existing_codes_map.get(code)
|
||||
if item_id_to_delete and item_id_to_delete != primary_item['_id']:
|
||||
items.delete_one({'_id': item_id_to_delete})
|
||||
|
||||
# 5. Neue Items für neu eingetragene Codes als Klone erstellen
|
||||
for code in codes_to_add:
|
||||
new_item = primary_item.copy()
|
||||
if '_id' in new_item:
|
||||
del new_item['_id']
|
||||
new_item['Code_4'] = code
|
||||
new_item['is_grouped_sub_item'] = True
|
||||
new_item['parent_item_id'] = str(primary_item['_id'])
|
||||
items.insert_one(new_item)
|
||||
|
||||
# 6. Sicherstellen, dass das Haupt-Item den Basis-Code behält
|
||||
if primary_item.get('Code_4') != base_code:
|
||||
items.update_one({'_id': primary_item['_id']}, {'$set': {'Code_4': base_code}})
|
||||
|
||||
client.close()
|
||||
return True
|
||||
except Exception as e:
|
||||
print(f"Error syncing group codes: {e}")
|
||||
return False
|
||||
Reference in New Issue
Block a user