- Implemented `compare_beteiligte.py` script for comparing Beteiligte structures between EspoCRM and Advoware. - Created `beteiligte_comparison_result.json` to store comparison results. - Developed `EspoCRMAPI` service for handling API interactions with EspoCRM. - Added comprehensive documentation for the EspoCRM API service. - Included error handling and logging for API operations. - Enhanced entity management with CRUD operations and search capabilities.
8.1 KiB
8.1 KiB
Entity-Mapping: EspoCRM CBeteiligte ↔ Advoware Beteiligte
Basierend auf dem Vergleich von:
- EspoCRM: CBeteiligte Entity ID
68e4af00172be7924 - Advoware: Beteiligter ID
104860
Gemeinsame Felder (direkte Übereinstimmung)
| EspoCRM Feld | Advoware Feld | Typ | Notes |
|---|---|---|---|
name |
name |
string | Vollständiger Name |
rechtsform |
rechtsform |
string | Rechtsform (z.B. "GmbH", "Frau") |
id |
id |
mixed | Achtung: EspoCRM=string, Advoware=int |
Namenfelder
| EspoCRM Feld | Advoware Feld | Mapping |
|---|---|---|
firstName |
vorname |
✓ Direkt |
lastName |
name |
✓ Bei Personen |
middleName |
- | ❌ Kein direktes Mapping |
firmenname |
name |
✓ Bei Firmen |
| - | geburtsname |
← Nur in Advoware |
| - | kurzname |
← Nur in Advoware |
Kontaktdaten
| EspoCRM Feld | Advoware Feld | Mapping |
|---|---|---|
emailAddress |
emailGesch |
✓ Geschäftlich |
emailAddressData (array) |
email |
⚠️ Komplex: Array vs. String |
phoneNumber |
telGesch |
✓ Geschäftstelefon |
phoneNumberData (array) |
telPrivat |
⚠️ Komplex |
| - | mobil |
← Nur in Advoware |
| - | faxGesch / faxPrivat |
← Nur in Advoware |
| - | autotelefon |
← Nur in Advoware |
| - | internet |
← Nur in Advoware |
Hinweis: Advoware hat zusätzlich kommunikation Array mit strukturierten Kontaktdaten.
Adressdaten
| EspoCRM Feld | Advoware Feld | Mapping |
|---|---|---|
adressensIds / adressensNames |
adressen (array) |
⚠️ Beziehung |
| - | strasse |
← Hauptadresse in Advoware Root |
| - | plz |
← Hauptadresse in Advoware Root |
| - | ort |
← Hauptadresse in Advoware Root |
| - | anschrift |
← Formatierte Adresse |
Hinweis:
- EspoCRM: Adressen als Related Entities (IDs/Names)
- Advoware: Hauptadresse im Root-Objekt +
adressenArray für zusätzliche
Anrede & Titel
| EspoCRM Feld | Advoware Feld | Mapping |
|---|---|---|
salutationName |
anrede |
✓ (z.B. "Frau", "Herr") |
| - | bAnrede |
← Briefanrede ("Sehr geehrte...") |
| - | titel |
← Titel (Dr., Prof., etc.) |
| - | zusatz |
← Namenszusatz |
Geburtsdaten
| EspoCRM Feld | Advoware Feld | Mapping |
|---|---|---|
dateOfBirth |
geburtsdatum |
✓ Direkt |
| - | sterbedatum |
← Nur in Advoware |
| - | familienstand |
← Nur in Advoware |
Handelsregister (für Firmen)
| EspoCRM Feld | Advoware Feld | Mapping |
|---|---|---|
handelsregisterNummer |
handelsRegisterNummer |
✓ Direkt |
handelsregisterArt (z.B. "HRB") |
- | ❌ Nur in EspoCRM |
| - | registergericht |
← Nur in Advoware |
Bankverbindungen
| EspoCRM Feld | Advoware Feld | Mapping |
|---|---|---|
bankverbindungensIds / Names |
bankkverbindungen (array) |
⚠️ Related Entity vs. Array |
Beteiligungen/Akten
| EspoCRM Feld | Advoware Feld | Mapping |
|---|---|---|
| - | beteiligungen (array) |
← Nur in Advoware |
Hinweis: Advoware speichert die Akten-Beteiligungen direkt beim Beteiligten.
EspoCRM-spezifische Felder
| Feld | Zweck |
|---|---|
betnr |
Beteiligten-Nummer (= Advoware betNr) |
advowareLastSync |
Zeitstempel der letzten Synchronisation |
syncStatus |
Status: "clean", "dirty", "syncing" |
disgTyp |
DISC-Persönlichkeitstyp |
description |
Notizen/Beschreibung |
createdAt / createdById / createdByName |
Audit-Felder |
modifiedAt / modifiedById / modifiedByName |
Audit-Felder |
assignedUserId / assignedUserName |
Zuweisungen |
teamsIds / teamsNames |
Team-Zugehörigkeit |
deleted |
Soft-Delete Flag |
isFollowed / followersIds |
Social Features |
Advoware-spezifische Felder
| Feld | Zweck |
|---|---|
betNr |
Interne Beteiligten-Nummer |
rowId |
Datenbank Row-ID |
art |
Beteiligten-Art |
angelegtAm / angelegtVon |
Erstellt |
geaendertAm / geaendertVon |
Geändert |
kontaktpersonen (array) |
Kontaktpersonen bei Firmen |
ePost / bea |
Spezielle Kommunikationskanäle |
Mapping-Strategie
1. Person (Natürliche Person)
espocrm_to_advoware = {
'firstName': 'vorname',
'lastName': 'name',
'dateOfBirth': 'geburtsdatum',
'rechtsform': 'rechtsform', # z.B. "Herr", "Frau"
'salutationName': 'anrede',
'emailAddress': 'emailGesch',
'phoneNumber': 'telGesch',
}
2. Firma (Juristische Person)
espocrm_to_advoware = {
'firmenname': 'name',
'rechtsform': 'rechtsform', # z.B. "GmbH", "AG"
'handelsregisterNummer': 'handelsRegisterNummer',
'emailAddress': 'emailGesch',
'phoneNumber': 'telGesch',
}
3. Adressen
EspoCRM → Advoware:
- Lade Related Entity
AdressenviaadressensIds - Mappe Hauptadresse zu Root-Feldern
strasse,plz,ort - Zusätzliche Adressen in
adressenArray
Advoware → EspoCRM:
- Hauptadresse aus Root-Feldern
adressenArray → Related Entities in EspoCRM
4. Kontaktdaten (Komplex)
EspoCRM emailAddressData:
[
{
"emailAddress": "primary@example.com",
"primary": true,
"optOut": false,
"invalid": false
}
]
Advoware kommunikation:
[
{
"id": 88002,
"kommArt": 0, // 0=Telefon, 1=Email, etc.
"tlf": "0511/12345-60",
"online": false
}
]
Mapping: Erfordert Transformation basierend auf kommArt.
Sync-Richtungen
EspoCRM → Advoware (Webhook-getrieben)
- Webhook empfängt
CBeteiligtecreate/update/delete - Mappe Felder gemäß Tabelle oben
POST /api/v1/advonet/Beteiligte(create) oderPUT /api/v1/advonet/Beteiligte/{betNr}(update)- Update
advowareLastSyncundsyncStatusin EspoCRM
Advoware → EspoCRM (Polling oder Webhook)
- Überwache Änderungen in Advoware
- Mappe Felder zurück
PUT /api/v1/CBeteiligte/{id}in EspoCRM- Setze
syncStatus = "clean"
Konflikte & Regeln
| Szenario | Regel |
|---|---|
| Beide Systeme geändert | Advoware als Master (führendes System) |
| Feld nur in EspoCRM | Ignorieren beim Export, behalten |
| Feld nur in Advoware | Null/Leer in EspoCRM setzen |
betnr vs. betNr |
Sync-Link: Muss identisch sein |
ID-Mapping
Problem: EspoCRM und Advoware haben unterschiedliche ID-Systeme.
Lösung:
- EspoCRM
betnrFeld = AdvowarebetNr - Dies ist der Sync-Link zwischen beiden Systemen
- Bei Create in EspoCRM:
betnrerst nach Advoware-Insert setzen - Bei Create in Advoware: EspoCRM ID in Custom Field speichern?
Nächste Schritte
-
Mapper-Modul erstellen:
bitbylaw/services/espocrm_mapper.pymap_cbeteiligte_to_advoware(espo_data) -> advo_datamap_advoware_to_cbeteiligte(advo_data) -> espo_data
-
Sync-Event-Step implementieren:
bitbylaw/steps/vmh/beteiligte_sync_event_step.py- Subscribe to
vmh.beteiligte.create/update/delete - Fetch full entity from EspoCRM
- Transform via Mapper
- Write to Advoware
- Update sync metadata
- Subscribe to
-
Testing:
- Unit Tests für Mapper
- Integration Tests mit Sandbox-Daten
- Konflikt-Szenarien testen
-
Error Handling:
- Retry-Logic bei API-Fehlern
- Validation vor dem Sync
- Rollback bei Fehlern?
- Logging aller Sync-Operationen
-
Performance:
- Batch-Processing für mehrere Beteiligte
- Rate Limiting beachten
- Caching von Lookup-Daten
Beispiel-Transformation
EspoCRM CBeteiligte:
{
"id": "68e4af00172be7924",
"firstName": "Angela",
"lastName": "Mustermanns",
"rechtsform": "Frau",
"emailAddress": "angela@example.com",
"phoneNumber": "0511/12345",
"betnr": 104860,
"handelsregisterNummer": null
}
Advoware Beteiligter:
{
"betNr": 104860,
"vorname": "Angela",
"name": "Mustermanns",
"rechtsform": "Frau",
"anrede": "Frau",
"emailGesch": "angela@example.com",
"telGesch": "0511/12345"
}
Generiert am: 2026-02-07
Basierend auf: Real-Daten-Vergleich mit scripts/compare_beteiligte.py