# VMH Webhook & Sync Steps

> **📚 Vollständige Sync-Dokumentation**: [../../docs/SYNC_OVERVIEW.md](../../docs/SYNC_OVERVIEW.md)

Dieser Ordner enthält die Webhook-Receiver für EspoCRM und den Event-basierten Synchronisations-Handler für Beteiligte-Entitäten.

## Übersicht

Die VMH-Steps implementieren eine vollständige Webhook-Pipeline:
1. **Webhook Receiver** empfangen Events von EspoCRM
2. **Redis Deduplication** verhindert Mehrfachverarbeitung
3. **Event Emission** triggert die Synchronisation
4. **Sync Handler** verarbeitet die Änderungen (✅ **Production Ready**)

## Webhook Receiver Steps

### 1. Create Webhook (`webhook/beteiligte_create_api_step.py`)

**Zweck:** Empfängt Create-Webhooks von EspoCRM für neue Beteiligte-Entitäten.

**Konfiguration:**
- **Type:** api
- **Name:** VMH Webhook Beteiligte Create
- **Path:** `/vmh/webhook/beteiligte/create`
- **Method:** POST
- **Flows:** vmh
- **Emits:** `vmh.beteiligte.create`

**Funktionalität:**
- Verarbeitet Batch-Payloads von EspoCRM
- Extrahiert Entity-IDs aus dem Payload
- Redis-basierte Deduplikation mit `vmh:beteiligte:create_pending`
- Emittiert Events für neue Entities

**Payload Format:**
```json
[
  {
    "id": "entity-123",
    "name": "John Doe",
    "createdAt": "2025-01-20T10:00:00Z"
  }
]
```

**Response:**
```json
{
  "status": "received",
  "action": "create",
  "new_ids_count": 1,
  "total_ids_in_batch": 1
}
```

### 2. Update Webhook (`webhook/beteiligte_update_api_step.py`)

**Zweck:** Empfängt Update-Webhooks von EspoCRM für geänderte Beteiligte-Entitäten.

**Konfiguration:**
- **Type:** api
- **Name:** VMH Webhook Beteiligte Update
- **Path:** `/vmh/webhook/beteiligte/update`
- **Method:** POST
- **Flows:** vmh
- **Emits:** `vmh.beteiligte.update`

**Funktionalität:**
- Ähnlich zum Create-Webhook
- Verwendet `vmh:beteiligte:update_pending` für Deduplikation
- Emittiert `vmh.beteiligte.update` Events

### 3. Delete Webhook (`webhook/beteiligte_delete_api_step.py`)

**Zweck:** Empfängt Delete-Webhooks von EspoCRM für gelöschte Beteiligte-Entitäten.

**Konfiguration:**
- **Type:** api
- **Name:** VMH Webhook Beteiligte Delete
- **Path:** `/vmh/webhook/beteiligte/delete`
- **Method:** POST
- **Flows:** vmh
- **Emits:** `vmh.beteiligte.delete`

**Funktionalität:**
- Ähnlich zum Create-Webhook
- Verwendet `vmh:beteiligte:delete_pending` für Deduplikation
- Emittiert `vmh.beteiligte.delete` Events

## Sync Handler Step

### Event Sync Handler (`beteiligte_sync_event_step.py`)

**Zweck:** Zentraler Event-Handler für die Synchronisation von Beteiligte-Änderungen.

**Status:** ✅ **Production Ready** - Vollständig implementiert

**Konfiguration:**
- **Type:** event
- **Name:** VMH Beteiligte Sync
- **Subscribes:** 
  - `vmh.beteiligte.create` - Neue Entities
  - `vmh.beteiligte.update` - Änderungen
  - `vmh.beteiligte.delete` - Löschungen
  - `vmh.beteiligte.sync_check` - Cron-Checks (alle 15min)
- **Flows:** vmh

**Funktionalität:**
- ✅ Empfängt Events von allen Webhook-Receivern + Cron
- ✅ Redis Distributed Lock (verhindert Race Conditions)
- ✅ Beteiligte Sync (Stammdaten): rowId-basierte Change Detection
- ✅ Kommunikation Sync (Phone/Email/Fax): Hash-basierte Change Detection
- ✅ Konflikt-Handling: EspoCRM wins mit Notification
- ✅ Retry-Logic: Exponential Backoff (1min, 5min, 15min, 1h, 4h)
- ✅ Auto-Reset nach 24h bei permanently_failed

**Dokumentation:** Siehe [../../docs/SYNC_OVERVIEW.md](../../docs/SYNC_OVERVIEW.md)

## Redis Deduplication

### Queue-Struktur
- `vmh:beteiligte:create_pending` - IDs warten auf Create-Sync
- `vmh:beteiligte:update_pending` - IDs warten auf Update-Sync
- `vmh:beteiligte:delete_pending` - IDs warten auf Delete-Sync

### Deduplication Logic
1. Sammle alle Entity-IDs aus Webhook-Payload
2. Prüfe gegen bestehende Pending-Queue
3. Nur neue IDs werden zur Queue hinzugefügt und Events emittiert
4. Sync-Handler entfernt erfolgreich verarbeitete IDs

## Testing

### Webhook Simulation
```bash
# Create Webhook
curl -X POST "http://localhost:3000/vmh/webhook/beteiligte/create" \
  -H "Content-Type: application/json" \
  -d '[{"id": "test-123", "name": "Test Entity"}]'

# Update Webhook
curl -X POST "http://localhost:3000/vmh/webhook/beteiligte/update" \
  -H "Content-Type: application/json" \
  -d '[{"id": "test-123", "name": "Updated Entity"}]'

# Delete Webhook
curl -X POST "http://localhost:3000/vmh/webhook/beteiligte/delete" \
  -H "Content-Type: application/json" \
  -d '[{"id": "test-123"}]'
```

### Redis Monitoring
```bash
# Prüfe Pending-Queues
redis-cli SMEMBERS vmh:beteiligte:create_pending
redis-cli SMEMBERS vmh:beteiligte:update_pending
redis-cli SMEMBERS vmh:beteiligte:delete_pending
```

### Log Monitoring
```bash
motia logs | grep "VMH Webhook"
motia logs | grep "PLATZHALTER"
```

## Konfiguration

### Umgebungsvariablen
- `REDIS_HOST` - Redis Host
- `REDIS_PORT` - Redis Port
- `REDIS_DB_ADVOWARE_CACHE` - Redis Database für Caching
- `ESPOCRM_WEBHOOK_SECRET` - Webhook Secret für Authentifizierung

### Dependencies
- `config.py` - Konfigurationsmanagement
- `services/advoware.py` - Advoware API Client (für zukünftige Integration)

## Erweiterungen

### Geplante Features
- Vollständige EspoCRM-API-Integration im Sync-Handler
- Batch-Verarbeitung für große Datenmengen
- Retry-Logic für fehlgeschlagene Syncs
- Metriken und Monitoring
- Webhook-Authentifizierung mit Secrets

### Error Handling
- Detaillierte Fehlerlogs
- Graceful Handling von Redis-Verbindungsfehlern
- Payload-Validation
- Dead-Letter-Queues für fehlgeschlagene Events

### Security
- Webhook-Secret Validation
- Input-Sanitization
- Rate-Limiting für Webhook-Endpunkte