Changes to the formating and processing of the group codes
Release Inventarsystem / release-docker (push) Successful in 2m15s
Release Inventarsystem / release-docker (push) Successful in 2m15s
This commit is contained in:
@@ -1152,18 +1152,20 @@ def get_current_status(item_id, decrypt=True):
|
||||
|
||||
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'.
|
||||
Synchronisiert die Barcodes einer Gruppe im korrekten Schema
|
||||
(angelehnt an das 'Augenmodell groß'-Vorbild).
|
||||
"""
|
||||
if not base_code:
|
||||
return False
|
||||
|
||||
# Alle Codes zusammenführen und Duplikate filtern
|
||||
# Alle Ziel-Codes zusammenführen (Basis-Code an erster Stelle)
|
||||
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)
|
||||
|
||||
item_count = len(all_target_codes)
|
||||
|
||||
try:
|
||||
client = MongoClient(cfg.MONGODB_HOST, cfg.MONGODB_PORT)
|
||||
db = client[cfg.MONGODB_DB]
|
||||
@@ -1176,46 +1178,89 @@ def sync_group_codes(primary_obj_id, base_code, individual_codes_list):
|
||||
|
||||
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:
|
||||
# Wenn es mehr als 1 Item gibt und noch keine Gruppe existiert -> Neue GroupID erzeugen
|
||||
if not group_id and item_count > 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
|
||||
# Wenn es nun eine Gruppe gibt (item_count > 1)
|
||||
if item_count > 1:
|
||||
# 1. Haupt-Item (Parent) aktualisieren
|
||||
items.update_one(
|
||||
{'_id': primary_item['_id']},
|
||||
{'$set': {
|
||||
'Code_4': base_code,
|
||||
'SeriesGroupId': group_id,
|
||||
'SeriesCount': item_count,
|
||||
'SeriesPosition': 1,
|
||||
'IsGroupedSubItem': False,
|
||||
'ParentItemId': None
|
||||
}}
|
||||
)
|
||||
|
||||
# 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)
|
||||
# Bestehende Gruppenmitglieder laden
|
||||
existing_items = list(items.find({'SeriesGroupId': group_id}))
|
||||
existing_map = {it.get('Code_4'): it for it in existing_items if
|
||||
it.get('Code_4') and str(it['_id']) != str(primary_item['_id'])}
|
||||
|
||||
codes_to_add = target_codes_set - existing_codes_set
|
||||
codes_to_remove = existing_codes_set - target_codes_set
|
||||
# Alle verbleibenden Sub-Codes ab Position 2 abarbeiten
|
||||
processed_sub_ids = []
|
||||
for idx, code in enumerate(all_target_codes[1:], start=2):
|
||||
if code in existing_map:
|
||||
# Existiert bereits in der Gruppe -> Nur Position und Count aktualisieren
|
||||
sub_item = existing_map[code]
|
||||
processed_sub_ids.append(sub_item['_id'])
|
||||
items.update_one(
|
||||
{'_id': sub_item['_id']},
|
||||
{'$set': {
|
||||
'SeriesCount': item_count,
|
||||
'SeriesPosition': idx,
|
||||
'IsGroupedSubItem': True,
|
||||
'ParentItemId': str(primary_item['_id'])
|
||||
}}
|
||||
)
|
||||
else:
|
||||
# Neu hinzukommender Code -> Als Klon (Sub-Item) erstellen
|
||||
new_sub = primary_item.copy()
|
||||
if '_id' in new_sub:
|
||||
del new_sub['_id']
|
||||
|
||||
# 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})
|
||||
new_sub.update({
|
||||
'Code_4': code,
|
||||
'SeriesGroupId': group_id,
|
||||
'SeriesCount': item_count,
|
||||
'SeriesPosition': idx,
|
||||
'IsGroupedSubItem': True,
|
||||
'ParentItemId': str(primary_item['_id']),
|
||||
'LastUpdated': primary_item.get('LastUpdated')
|
||||
})
|
||||
inserted_res = items.insert_one(new_sub)
|
||||
processed_sub_ids.append(inserted_res.inserted_id)
|
||||
|
||||
# 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)
|
||||
# Nicht mehr benötigte Sub-Items aus dieser Gruppe entfernen
|
||||
for code, sub_item in existing_map.items():
|
||||
if sub_item['_id'] not in processed_sub_ids:
|
||||
items.delete_one({'_id': sub_item['_id']})
|
||||
|
||||
# 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}})
|
||||
else:
|
||||
# Fall: Nur 1 einziges Item (keine Gruppe / Gruppe aufgelöst)
|
||||
# Eventuelle alte Sub-Items dieser Gruppe löschen
|
||||
if group_id:
|
||||
items.delete_many({
|
||||
'SeriesGroupId': group_id,
|
||||
'_id': {'$ne': primary_item['_id']}
|
||||
})
|
||||
|
||||
items.update_one(
|
||||
{'_id': primary_item['_id']},
|
||||
{'$set': {
|
||||
'Code_4': base_code,
|
||||
'SeriesGroupId': None,
|
||||
'SeriesCount': 1,
|
||||
'SeriesPosition': 1,
|
||||
'IsGroupedSubItem': False,
|
||||
'ParentItemId': None
|
||||
}}
|
||||
)
|
||||
|
||||
client.close()
|
||||
return True
|
||||
|
||||
Reference in New Issue
Block a user