- Fixed initial sync logic to respect actual timestamps, preventing unwanted overwrites. - Introduced exponential backoff for retry logic, with auto-reset for permanently failed entities. - Added validation checks to ensure data consistency during sync processes. - Corrected hash calculation to only include sync-relevant communications. - Resolved issues with empty slots ignoring user inputs and improved conflict handling. - Enhanced handling of Var4 and Var6 entries during sync conflicts. - Documented changes and added new fields required in EspoCRM for improved sync management. Also added a detailed analysis of syncStatus values in EspoCRM CBeteiligte, outlining responsibilities and ensuring robust sync mechanisms.
140 lines
5.2 KiB
Markdown
140 lines
5.2 KiB
Markdown
# Advoware Beteiligte API - Field Support
|
|
|
|
Getestet am: 2026-02-07
|
|
Test betNr: 104860
|
|
API Endpoint: `PUT /api/v1/advonet/Beteiligte/{betNr}`
|
|
|
|
## Schema vs. Reality
|
|
|
|
Das Swagger Schema `BeteiligterParameter` definiert viele Felder, aber **nicht alle funktionieren tatsächlich**.
|
|
|
|
### ✅ FUNKTIONIERENDE Felder (8)
|
|
|
|
Diese Felder wurden erfolgreich getestet und können via PUT geändert werden:
|
|
|
|
| Feld | Type | Max Length | Bemerkung |
|
|
|------|------|------------|-----------|
|
|
| `name` | string | 140 | Nachname / Firmenname |
|
|
| `vorname` | string | 30 | Vorname (nur bei natürlichen Personen) |
|
|
| `rechtsform` | string | 50 | Muss in GET /Rechtsformen sein |
|
|
| `titel` | string | 50 | z.B. "Dr.", "Prof." |
|
|
| `anrede` | string | 35 | z.B. "Herr", "Frau", "Mr." |
|
|
| `bAnrede` | string | 150 | Briefanrede, z.B. "Sehr geehrter Herr" |
|
|
| `zusatz` | string | 100 | Zusatzinformation |
|
|
| `geburtsdatum` | datetime | - | Format: "YYYY-MM-DDTHH:MM:SS" |
|
|
|
|
**Wichtig:** rowId ändert sich bei **jedem** PUT, auch wenn der gleiche Wert gesetzt wird!
|
|
|
|
### ⚠️ NICHT FUNKTIONIERENDE Felder (6)
|
|
|
|
Diese Felder sind im Swagger Schema definiert, werden aber im PUT **ignoriert**:
|
|
|
|
| Feld | Bemerkung |
|
|
|------|-----------|
|
|
| `art` | Wird ignoriert (evtl. Handelsregisterart?) |
|
|
| `kurzname` | Wird ignoriert |
|
|
| `geburtsname` | Wird ignoriert |
|
|
| `familienstand` | Wird ignoriert |
|
|
| `handelsRegisterNummer` | ❌ Wird ignoriert (trotz Swagger!) |
|
|
| `registergericht` | ❌ Wird ignoriert (trotz Swagger!) |
|
|
|
|
### 🚫 DEPRECATED Felder (16)
|
|
|
|
Diese Felder sind im Schema als `deprecated: true` markiert und sollten **nicht** verwendet werden:
|
|
|
|
Kontaktdaten (deprecated):
|
|
- `anschrift`, `strasse`, `plz`, `ort`
|
|
- `email`, `emailGesch`
|
|
- `telGesch`, `telPrivat`
|
|
- `faxGesch`, `faxPrivat`
|
|
- `mobil`, `autotelefon`, `sonstige`
|
|
- `internet`, `ePost`, `bea`
|
|
|
|
**Grund:** Kontaktdaten werden über separate Endpoints verwaltet:
|
|
- Adressen: `/api/v1/advonet/BeteiligteAdresse`
|
|
- Kommunikation: `/api/v1/advonet/BeteiligteKommunikation`
|
|
- Bankverbindungen: `/api/v1/advonet/BeteiligteBankverbindung`
|
|
|
|
### 📖 READ-ONLY Felder
|
|
|
|
GET Response enthält zusätzliche Felder die **nicht** im PUT Schema sind:
|
|
|
|
| Feld | Type | Bemerkung |
|
|
|------|------|-----------|
|
|
| `betNr` | int | Primary Key (readonly) |
|
|
| `id` | int | Alias für betNr |
|
|
| `rowId` | string | Binary-ID, ändert sich bei jedem Update |
|
|
| `adressen` | array | Nested array, separate Endpoint |
|
|
| `kommunikation` | array | Nested array, separate Endpoint |
|
|
| `bankkverbindungen` | array | Nested array, separate Endpoint |
|
|
| `beteiligungen` | array | Verknüpfungen zu Akten (readonly) |
|
|
| `kontaktpersonen` | array | Readonly |
|
|
| `geaendertAm` | datetime | System field (readonly) |
|
|
| `geaendertVon` | string | System field (readonly) |
|
|
| `angelegtAm` | datetime | System field (readonly) |
|
|
| `angelegtVon` | string | System field (readonly) |
|
|
|
|
## Best Practices
|
|
|
|
### ✅ DO
|
|
- Nur die 8 funktionierenden Felder im Mapper verwenden
|
|
- Read-Modify-Write Pattern verwenden (ganze Entity laden, dann ändern)
|
|
- Nach jedem PUT ein GET machen um neue rowId zu erhalten
|
|
- Nested arrays (adressen, kommunikation) aus PUT-Payload **entfernen**
|
|
|
|
### ❌ DON'T
|
|
- Nicht alle GET-Felder zurück im PUT schicken
|
|
- Keine deprecated Felder verwenden
|
|
- Nicht auf `handelsRegisterNummer` / `registergericht` verlassen (funktioniert nicht!)
|
|
- Keine nested arrays im PUT (führt zu Fehlern)
|
|
|
|
## Mapper Implementation
|
|
|
|
```python
|
|
# EspoCRM → Advoware (nur funktionierende Felder!)
|
|
def map_cbeteiligte_to_advoware(espo_entity: Dict) -> Dict:
|
|
# Read-Modify-Write: Lade erst die Entity
|
|
advo_entity = await advo.get_beteiligte(betnr)
|
|
|
|
# Überschreibe nur die 8 funktionierenden Felder
|
|
advo_entity['name'] = espo_entity.get('firmenname') or espo_entity.get('lastName')
|
|
advo_entity['vorname'] = espo_entity.get('firstName')
|
|
advo_entity['rechtsform'] = espo_entity.get('rechtsform')
|
|
advo_entity['titel'] = espo_entity.get('titel')
|
|
advo_entity['anrede'] = espo_entity.get('salutationName')
|
|
advo_entity['bAnrede'] = espo_entity.get('briefAnrede')
|
|
advo_entity['zusatz'] = espo_entity.get('zusatz')
|
|
advo_entity['geburtsdatum'] = espo_entity.get('dateOfBirth')
|
|
|
|
# Entferne nested arrays (wichtig!)
|
|
advo_entity.pop('adressen', None)
|
|
advo_entity.pop('kommunikation', None)
|
|
advo_entity.pop('bankkverbindungen', None)
|
|
advo_entity.pop('beteiligungen', None)
|
|
advo_entity.pop('kontaktpersonen', None)
|
|
|
|
return advo_entity
|
|
|
|
|
|
# Advoware → EspoCRM
|
|
def map_advoware_to_cbeteiligte(advo_entity: Dict) -> Dict:
|
|
# Nur die 8 Stammdaten-Felder
|
|
return {
|
|
'lastName': advo_entity.get('name'), # oder firmenname
|
|
'firstName': advo_entity.get('vorname'),
|
|
'rechtsform': advo_entity.get('rechtsform'),
|
|
'titel': advo_entity.get('titel'),
|
|
'salutationName': advo_entity.get('anrede'),
|
|
'briefAnrede': advo_entity.get('bAnrede'),
|
|
'zusatz': advo_entity.get('zusatz'),
|
|
'dateOfBirth': advo_entity.get('geburtsdatum'),
|
|
'advowareRowId': advo_entity.get('rowId') # für Change Detection
|
|
}
|
|
```
|
|
|
|
## Siehe auch
|
|
|
|
- [Advoware API Swagger](advoware/advoware_api_swagger.json)
|
|
- [Beteiligte Sync Implementation](../steps/vmh/beteiligte_sync_event_step.py)
|
|
- [Beteiligte Mapper](../services/espocrm_mapper.py)
|