Files
motia/bitbylaw/scripts/analyze_beteiligte_endpoint.py
bitbylaw ebbbf419ee feat: Implement bidirectional synchronization utilities for Advoware and EspoCRM communications
- Added KommunikationSyncManager class to handle synchronization logic.
- Implemented methods for loading data, computing diffs, and applying changes between Advoware and EspoCRM.
- Introduced 3-way diffing mechanism to intelligently resolve conflicts.
- Added helper methods for creating empty slots and detecting changes in communications.
- Enhanced logging for better traceability during synchronization processes.
2026-02-08 19:53:40 +00:00

153 lines
5.0 KiB
Python

"""
Detaillierte Analyse: Was liefert /api/v1/advonet/Beteiligte/{id}?
Prüfe:
1. Kommunikation-Array: Alle Felder
2. kommKz und kommArt Werte
3. Adressen-Array (falls enthalten)
4. Vollständige Struktur
"""
import asyncio
import json
from services.advoware import AdvowareAPI
TEST_BETNR = 104860
class SimpleContext:
class Logger:
def info(self, msg): print(f"[INFO] {msg}")
def error(self, msg): print(f"[ERROR] {msg}")
def warning(self, msg): print(f"[WARN] {msg}")
def debug(self, msg): pass
def __init__(self):
self.logger = self.Logger()
def print_section(title):
print("\n" + "="*70)
print(title)
print("="*70)
async def main():
print("\n" + "="*70)
print("DETAILLIERTE ANALYSE: Beteiligte Endpoint")
print("="*70)
context = SimpleContext()
advo = AdvowareAPI(context)
# Hole kompletten Beteiligte
print(f"\n📋 GET /api/v1/advonet/Beteiligte/{TEST_BETNR}")
result = await advo.api_call(f'api/v1/advonet/Beteiligte/{TEST_BETNR}')
print(f"\nResponse Type: {type(result)}")
if isinstance(result, list):
print(f"Response Length: {len(result)}")
beteiligte = result[0]
else:
beteiligte = result
# Zeige Top-Level Struktur
print_section("TOP-LEVEL FELDER")
print(f"\nVerfügbare Keys:")
for key in sorted(beteiligte.keys()):
value = beteiligte[key]
if isinstance(value, list):
print(f"{key:30s}: [{len(value)} items]")
elif isinstance(value, dict):
print(f"{key:30s}: {{dict}}")
else:
value_str = str(value)[:50]
print(f"{key:30s}: {value_str}")
# Kommunikationen
print_section("KOMMUNIKATION ARRAY")
kommunikationen = beteiligte.get('kommunikation', [])
print(f"\n{len(kommunikationen)} Kommunikationen gefunden")
if kommunikationen:
print(f"\n📋 Erste Kommunikation - ALLE Felder:")
first = kommunikationen[0]
print(json.dumps(first, indent=2, ensure_ascii=False))
print(f"\n📊 Übersicht aller Kommunikationen:")
print(f"\n{'ID':>8s} | {'kommKz':>6s} | {'kommArt':>7s} | {'online':>6s} | {'Wert':40s} | {'Bemerkung'}")
print("-" * 120)
for k in kommunikationen:
komm_id = k.get('id', 'N/A')
kommkz = k.get('kommKz', 'N/A')
kommart = k.get('kommArt', 'N/A')
online = k.get('online', False)
wert = (k.get('tlf') or '')[:40]
bemerkung = (k.get('bemerkung') or '')[:20]
# Highlighting
kommkz_str = f"{kommkz}" if kommkz not in [0, 'N/A'] else f"{kommkz}"
kommart_str = f"{kommart}" if kommart not in [0, 'N/A'] else f"{kommart}"
print(f"{komm_id:8} | {kommkz_str:>6s} | {kommart_str:>7s} | {str(online):>6s} | {wert:40s} | {bemerkung}")
# Adressen
print_section("ADRESSEN ARRAY")
adressen = beteiligte.get('adressen', [])
print(f"\n{len(adressen)} Adressen gefunden")
if adressen:
print(f"\n📋 Erste Adresse - Struktur:")
first_addr = adressen[0]
print(json.dumps(first_addr, indent=2, ensure_ascii=False))
# Bankverbindungen
print_section("BANKVERBINDUNGEN")
bankverb = beteiligte.get('bankkverbindungen', []) # Typo im API?
if not bankverb:
bankverb = beteiligte.get('bankverbindungen', [])
print(f"\n{len(bankverb)} Bankverbindungen gefunden")
if bankverb:
print(f"\n📋 Erste Bankverbindung - Keys:")
print(list(bankverb[0].keys()))
# Analyse
print_section("ZUSAMMENFASSUNG")
print(f"\n📊 Verfügbare Daten:")
print(f" • Kommunikationen: {len(kommunikationen)}")
print(f" • Adressen: {len(adressen)}")
print(f" • Bankverbindungen: {len(bankverb)}")
print(f"\n🔍 kommKz/kommArt Status:")
if kommunikationen:
kommkz_values = [k.get('kommKz', 0) for k in kommunikationen]
kommart_values = [k.get('kommArt', 0) for k in kommunikationen]
kommkz_non_zero = [v for v in kommkz_values if v != 0]
kommart_non_zero = [v for v in kommart_values if v != 0]
print(f" • kommKz unique values: {set(kommkz_values)}")
print(f" • kommKz non-zero count: {len(kommkz_non_zero)} / {len(kommunikationen)}")
print(f" • kommArt unique values: {set(kommart_values)}")
print(f" • kommArt non-zero count: {len(kommart_non_zero)} / {len(kommunikationen)}")
if kommkz_non_zero:
print(f"\n ✅✅✅ JACKPOT! kommKz HAT WERTE im Beteiligte-Endpoint!")
print(f" → Wir können den Typ korrekt erkennen!")
elif kommart_non_zero:
print(f"\n ✅ kommArt hat Werte (Email/Phone unterscheidbar)")
else:
print(f"\n ❌ Beide sind 0 - müssen Typ aus Wert ableiten")
if __name__ == "__main__":
asyncio.run(main())