# Mews House

# Webseite

## Übersicht

<div drawio-diagram="194"><img src="https://wiki.go-solution.ch/uploads/images/drawio/2026-07/ERACONokBsK3o56N-drawing-1-1783607585.png" alt=""/></div>

## Kontaktformulare

Wir benötigen die E-Mail-Adressen welche die Anfragen von den folgenden Formularen erhalten sollen

- Individuelle Anfragen: [https://mewshouse.go-solution.ch/individuelle-anfragen/](https://mewshouse.go-solution.ch/individuelle-anfragen/)
- Catering: [https://mewshouse.go-solution.ch/anfrage-catering/](https://mewshouse.go-solution.ch/anfrage-catering/)
- Event: [https://mewshouse.go-solution.ch/anfrage-event/](https://mewshouse.go-solution.ch/anfrage-event/)
- Blue Bar: [https://mewshouse.go-solution.ch/anfrage-blaue-bar/](https://mewshouse.go-solution.ch/anfrage-blaue-bar/)
- Mews Table: [https://mewshouse.go-solution.ch/anfrage-mews-table/](https://mewshouse.go-solution.ch/anfrage-mews-table/)

## Diverses

- AGB's sind auf der aktuellen Seite nur in Deutsch vorhanden

Newsletter-Integration wird innerhalb vom CRM-Projekt entschieden

## Infos zur Lotta Systemintegration:

Guten Tag Herr Novotny

Gerne erläutere ich hier das vorgeschlagene Vorgehen für die Nutzung der API im Objekt [**<u>Tiefenhöfe</u>**](https://www.google.com/maps/search/Tiefenh%C3%B6fe+6,+8001+Z%C3%BCrich?entry=gmail&source=g) in Kombination mit dem **Lotta Zutrittssystem** und der **Mews PMS-Software**.

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Vorschlag: Variante B – Minimal notwendige Rechte für den API-User**

Ich empfehle **Variante B**, da diese Lösung die geringsten Systemrechte für den API-User erfordert und gleichzeitig eine saubere, stabile Middleware-Funktion ermöglicht.

Der API-User wird einer **Systemgruppe** zugeordnet, in der ausschliesslich jene Zimmer enthalten sind, welche über Mews reservierbar sind.

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Ablauf bei neuen Reservierungen**

1. **Neuer Gast in Mews**  
    Wird im Mews ein neuer Gast erfasst, z. B. eine Suite für 10 Tage, löst die Middleware beim Antritt automatisch den API-Befehl aus.
2. **Visitor-Erstellung in Lotta**  
    Es wird ein *Visitor* angelegt mit:

- **user\_system\_ids** = jene IDs der Suite (z. B. 1)


3. **Zusätzliche Reservationen während des Aufenthalts**  
    Reserviert der Gast beispielsweise einen zusätzlichen Sitzungsraum, erfolgt ein **updateVisitor**, bei dem einfach weitere *user\_system\_ids* ergänzt werden, z. B. *1, 3*.
4. **Beendigung temporärer Räume**  
    Sobald der Sitzungsraum nicht mehr benötigt wird, erfolgt erneut ein **updateVisitor**, bei dem die *user\_system\_id 3* wieder entfernt wird.

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Logik für Start- und Enddaten**

- Bei jeder Änderung wird geprüft:
- **frühestes Startdatum**
- **spätestes Enddatum**

- Diese Daten bleiben für den gesamten Zutrittszeitraum massgebend. Hier gilt die gesammte Zeitspanne, die der Gast im Haus mindestens einen Zutritt hat.
- Die zeitliche Steuerung erfolgt ausschliesslich über **Mews**.

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**API-Befehle in der Lotta-Schnittstelle**

Die Middleware führt in Lotta nur die folgenden Aktionen aus:

- **createVisitor**
- **updateVisitor**
- **deleteVisitor**
- **sendAccessCode**

Es werden keine komplexen zeitlichen Berechnungen in der Lotta-API vorgenommen – sämtliche Zeitlogik übernimmt Mews.  
Sobald ein Visitor seine Endzeit erreicht hat, wird er gelöscht

# Pressmatix Aboverwaltung Integrationsmöglichkeiten

## Zielarchitektur

1. Benutzerauthentifizierung läuft über einen OIDC-Provider (PX-User, Auth0 oder Keycloak)
2. Benutzer Authentifiziert sich in der PressMatrix App oder im Web am Pressmatrix-Kontext \[läuft über den OIDC-Provider\]
3. Es wird ein Access Token-Generiert
4. Pressmatrix ruft beim Zugriff die eigene Middleware auf
5. Middleware erhält den OIDC-Token

Beispiel-Aufruf durch Pressmatrix

```bash
curl -X POST https://{auth-server-url}/pmx-api/v2/{profile_token}/authorize \
  -H "Authorization: Bearer {ACCESS_TOKEN}" \
  -H "OIDC-ID-Token: {OIDC_ID_TOKEN}" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{
    "issue_name": "Sample Issue May 2014",
    "issue_date": "2014-05-01",
    "category_name": "Sample Category",
    "category_ids": "20924,20925",
    "product_id_apple": "sample_issue_2014_05",
    "product_id_google": "sample_issue_2014_05",
    "product_id_amazon": "sample_issue_2014_05",
    "product_id_external": "sample_id_1,sample_id_2"
  }'
```

Die Middleware prüft zuerst ob der Token gültig ist \[Anfrage zum OIDC-Provider\]

Wenn der Token ungültig ist, wird der Status 401, Unauthorized zurückgegeben

Wenn der Token gültig ist, wird geprüft, ob der Kunde Zugriff auf die angefragte Ressource hat

falls ja: Rückgabe von granted: true

falls nein: Rückgabe von granted: false

<p class="callout info">Die Daten der Abonnemente müssen in eine eigene Datenbank der Middleware synchronisiert werden, damit beim zugriff nicht auf die Live-Daten im CRM zugegriffen werden müssen. Sonst kann der Kunde bei beispielsweise eines API-Problems bei Sage nicht auf eine Ausgabe zugreifen.</p>

[![image.png](https://wiki.go-solution.ch/uploads/images/gallery/2026-07/scaled-1680-/GdiqjQIHYm4nsDoo-image.png)](https://wiki.go-solution.ch/uploads/images/gallery/2026-07/GdiqjQIHYm4nsDoo-image.png)

## Mögliche CRM Datenstruktur

#### Kontakt beziehungsweise Benutzer

<div class="TyagGW_tableContainer" id="bkmrk-feld-beispiel-crm-co"><div class="group TyagGW_tableWrapper flex flex-col-reverse w-fit" tabindex="-1"><table class="w-fit min-w-(--thread-content-width)" data-end="3559" data-start="3382"><thead data-end="3401" data-start="3382"><tr data-end="3401" data-start="3382"><th class="last:pe-10" data-col-size="sm" data-end="3389" data-start="3382">Feld</th><th class="last:pe-10" data-col-size="sm" data-end="3401" data-start="3389">Beispiel</th></tr></thead><tbody data-end="3559" data-start="3412"><tr data-end="3439" data-start="3412"><td data-col-size="sm" data-end="3429" data-start="3412">CRM Account ID</td><td data-col-size="sm" data-end="3439" data-start="3429">`4711`</td></tr><tr data-end="3473" data-start="3440"><td data-col-size="sm" data-end="3455" data-start="3440">OIDC Subject</td><td data-col-size="sm" data-end="3473" data-start="3455">`8b153fb2-...`</td></tr><tr data-end="3505" data-start="3474"><td data-col-size="sm" data-end="3483" data-start="3474">E-Mail</td><td data-col-size="sm" data-end="3505" data-start="3483">`kunde@example.ch`</td></tr><tr data-end="3524" data-start="3506"><td data-col-size="sm" data-end="3515" data-start="3506">Status</td><td data-col-size="sm" data-end="3524" data-start="3515">aktiv</td></tr><tr data-end="3559" data-start="3525"><td data-col-size="sm" data-end="3545" data-start="3525">Identity Provider</td><td data-col-size="sm" data-end="3559" data-start="3545">`keycloak`</td></tr></tbody></table>

</div></div>Der wichtigste Schlüssel ist der **OIDC-Claim `sub`**. Die E-Mail-Adresse sollte nicht als dauerhafter Primärschlüssel verwendet werden, weil sie sich ändern kann.

#### Abonnement

<div class="TyagGW_tableContainer" id="bkmrk-feld-beispiel-subscr"><div class="group TyagGW_tableWrapper flex flex-col-reverse w-fit" tabindex="-1"><table class="w-fit min-w-(--thread-content-width)" data-end="4001" data-start="3741"><thead data-end="3760" data-start="3741"><tr data-end="3760" data-start="3741"><th class="last:pe-10" data-col-size="sm" data-end="3748" data-start="3741">Feld</th><th class="last:pe-10" data-col-size="sm" data-end="3760" data-start="3748">Beispiel</th></tr></thead><tbody data-end="4001" data-start="3771"><tr data-end="3809" data-start="3771"><td data-col-size="sm" data-end="3789" data-start="3771">Subscription ID</td><td data-col-size="sm" data-end="3809" data-start="3789">`SUB-2026-00123`</td></tr><tr data-end="3833" data-start="3810"><td data-col-size="sm" data-end="3823" data-start="3810">Contact ID</td><td data-col-size="sm" data-end="3833" data-start="3823">`4711`</td></tr><tr data-end="3869" data-start="3834"><td data-col-size="sm" data-end="3848" data-start="3834">Produktcode</td><td data-col-size="sm" data-end="3869" data-start="3848">`MAGAZIN-PREMIUM`</td></tr><tr data-end="3895" data-start="3870"><td data-col-size="sm" data-end="3879" data-start="3870">Beginn</td><td data-col-size="sm" data-end="3895" data-start="3879">`2026-01-01`</td></tr><tr data-end="3919" data-start="3896"><td data-col-size="sm" data-end="3903" data-start="3896">Ende</td><td data-col-size="sm" data-end="3919" data-start="3903">`2026-12-31`</td></tr><tr data-end="3938" data-start="3920"><td data-col-size="sm" data-end="3929" data-start="3920">Status</td><td data-col-size="sm" data-end="3938" data-start="3929">aktiv</td></tr><tr data-end="3969" data-start="3939"><td data-col-size="sm" data-end="3957" data-start="3939">Kündigungsdatum</td><td data-col-size="sm" data-end="3969" data-start="3957">optional</td></tr><tr data-end="4001" data-start="3970"><td data-col-size="sm" data-end="3989" data-start="3970">Grace Period bis</td><td data-col-size="sm" data-end="4001" data-start="3989">optional</td></tr></tbody></table>

</div></div>#### Produktzuordnung

<div class="TyagGW_tableContainer" id="bkmrk-crm-produktcode-pres"><div class="group TyagGW_tableWrapper flex flex-col-reverse w-fit" tabindex="-1"><table class="w-fit min-w-(--thread-content-width)" data-end="4212" data-start="4024"><thead data-end="4060" data-start="4024"><tr data-end="4060" data-start="4024"><th class="last:pe-10" data-col-size="sm" data-end="4042" data-start="4024">CRM-Produktcode</th><th class="last:pe-10" data-col-size="sm" data-end="4060" data-start="4042">PressMatrix-ID</th></tr></thead><tbody data-end="4212" data-start="4071"><tr data-end="4126" data-start="4071"><td data-col-size="sm" data-end="4091" data-start="4071">`MAGAZIN-PREMIUM`</td><td data-col-size="sm" data-end="4126" data-start="4091">`com.publisher.magazin.premium`</td></tr><tr data-end="4170" data-start="4127"><td data-col-size="sm" data-end="4144" data-start="4127">`MAGAZIN-2026`</td><td data-col-size="sm" data-end="4170" data-start="4144">`magazin_issue_2026_*`</td></tr><tr data-end="4212" data-start="4171"><td data-col-size="sm" data-end="4189" data-start="4171">`ARCHIV-ZUGANG`</td><td data-col-size="sm" data-end="4212" data-start="4189">Kategorie `archive`</td></tr></tbody></table>

</div></div>## Mögliche Middleware Datenbank:

```
                    Synchronisation
Sage CRM ─────────────────────────────────► Middleware-Datenbank
                                                   ▲
                                                   │ schnelle Abfrage
PressMatrix ───────────── authorize/issues ─────────┘




identity_mapping
----------------
issuer
oidc_subject
crm_contact_id

subscriptions
-------------
subscription_id
crm_contact_id
status
valid_from
valid_until
grace_until

entitlements
------------
subscription_id
product_code
pressmatrix_product_id
valid_from
valid_until
```

# Schnittstelle - Bexio

## Zeitschätzung vollumfänglich

**Bei Komplettintegration in unseren "Sales Data Hub"**

<table border="1" id="bkmrk-arbeitspaket-aufwand" style="border-collapse: collapse; width: 100%; height: 663.126px;"><thead><tr style="height: 29.7969px;"><th class="align-left" style="width: 40.1731%; height: 29.7969px;">Arbeitspaket</th><th align="right" class="align-left" style="width: 35.2287%; height: 29.7969px;">Aufwand</th><th class="align-right" style="width: 24.5983%; height: 29.7969px;">Preis</th></tr></thead><tbody><tr style="height: 46.5938px;"><td style="width: 40.1731%; height: 46.5938px;">Technische Analyse bexio API und API-Prototyp</td><td align="right" class="align-left" style="width: 35.2287%; height: 46.5938px;">16h</td><td style="width: 24.5983%; height: 46.5938px;">  
</td></tr><tr style="height: 29.7969px;"><td style="width: 40.1731%; height: 29.7969px;">OAuth-/Token-Handling bexio</td><td align="right" class="align-left" style="width: 35.2287%; height: 29.7969px;">6h</td><td style="width: 24.5983%; height: 29.7969px;">  
</td></tr><tr style="height: 29.7969px;"><td style="width: 40.1731%; height: 29.7969px;">Directus-/MySQL-Tabellen und Migrationen</td><td align="right" class="align-left" style="width: 35.2287%; height: 29.7969px;">8h</td><td style="width: 24.5983%; height: 29.7969px;">  
</td></tr><tr style="height: 29.7969px;"><td style="width: 40.1731%; height: 29.7969px;">Generischer bexio API Client in PHP</td><td align="right" class="align-left" style="width: 35.2287%; height: 29.7969px;">16h</td><td style="width: 24.5983%; height: 29.7969px;">  
</td></tr><tr style="height: 29.7969px;"><td style="width: 40.1731%; height: 29.7969px;">Polling, Cursor, Pagination und Retry</td><td align="right" class="align-left" style="width: 35.2287%; height: 29.7969px;">16h</td><td style="width: 24.5983%; height: 29.7969px;">  
</td></tr><tr style="height: 46.5938px;"><td style="width: 40.1731%; height: 46.5938px;">Lookup- und Benutzer-Mappings</td><td align="right" class="align-left" style="width: 35.2287%; height: 46.5938px;">??? Wird im CRM über Subtabellen geregelt</td><td style="width: 24.5983%; height: 46.5938px;">  
</td></tr><tr style="height: 29.7969px;"><td style="width: 40.1731%; height: 29.7969px;">Kontakte Firma ↔ Sage Accounts</td><td align="right" class="align-left" style="width: 35.2287%; height: 29.7969px;">20h</td><td style="width: 24.5983%; height: 29.7969px;">  
</td></tr><tr style="height: 29.7969px;"><td style="width: 40.1731%; height: 29.7969px;">Kontakte Person ↔ Sage Contacts</td><td align="right" class="align-left" style="width: 35.2287%; height: 29.7969px;">20h</td><td style="width: 24.5983%; height: 29.7969px;">  
</td></tr><tr style="height: 29.7969px;"><td style="width: 40.1731%; height: 29.7969px;">Firmen-/Personenbeziehungen</td><td align="right" class="align-left" style="width: 35.2287%; height: 29.7969px;">12h</td><td style="width: 24.5983%; height: 29.7969px;">  
</td></tr><tr style="height: 29.7969px;"><td style="width: 40.1731%; height: 29.7969px;">Dubletten- und Konfliktlogik Kontakte</td><td align="right" class="align-left" style="width: 35.2287%; height: 29.7969px;">??? Regeln...</td><td style="width: 24.5983%; height: 29.7969px;">  
</td></tr><tr style="height: 29.7969px;"><td style="width: 40.1731%; height: 29.7969px;">Auftragskopf bidirektional</td><td align="right" class="align-left" style="width: 35.2287%; height: 29.7969px;">20h</td><td style="width: 24.5983%; height: 29.7969px;">  
</td></tr><tr style="height: 29.7969px;"><td style="width: 40.1731%; height: 29.7969px;">Auftragspositionen bidirektional</td><td align="right" class="align-left" style="width: 35.2287%; height: 29.7969px;">25h</td><td style="width: 24.5983%; height: 29.7969px;">  
</td></tr><tr style="height: 46.5938px;"><td style="width: 40.1731%; height: 46.5938px;">Status-, Steuer- und Rundungsmapping Aufträge</td><td align="right" class="align-left" style="width: 35.2287%; height: 46.5938px;">???? müssen wir hier etwas beachten</td><td style="width: 24.5983%; height: 46.5938px;">  
</td></tr><tr style="height: 29.7969px;"><td style="width: 40.1731%; height: 29.7969px;">Rechnungen → Sage Sales</td><td align="right" class="align-left" style="width: 35.2287%; height: 29.7969px;">16h</td><td style="width: 24.5983%; height: 29.7969px;">  
</td></tr><tr style="height: 46.5938px;"><td style="width: 40.1731%; height: 46.5938px;">Lösch-/Stornoverhalten</td><td align="right" class="align-left" style="width: 35.2287%; height: 46.5938px;">??? allenfalls über Status</td><td style="width: 24.5983%; height: 46.5938px;">  
</td></tr><tr style="height: 29.7969px;"><td style="width: 40.1731%; height: 29.7969px;">Logging, Monitoring und Fehlerbehandlung</td><td align="right" class="align-left" style="width: 35.2287%; height: 29.7969px;">12h</td><td style="width: 24.5983%; height: 29.7969px;">  
</td></tr><tr style="height: 29.7969px;"><td style="width: 40.1731%; height: 29.7969px;">Integrations- und Regressionstests</td><td align="right" class="align-left" style="width: 35.2287%; height: 29.7969px;">8h</td><td style="width: 24.5983%; height: 29.7969px;">  
</td></tr><tr style="height: 29.7969px;"><td style="width: 40.1731%; height: 29.7969px;">Dokumentation und Deployment</td><td align="right" class="align-left" style="width: 35.2287%; height: 29.7969px;">8h</td><td style="width: 24.5983%; height: 29.7969px;">  
</td></tr><tr style="height: 29.7969px;"><td style="width: 40.1731%; height: 29.7969px;">**Gesamtentwicklung exkl. ?**</td><td class="align-left" style="width: 35.2287%; height: 29.7969px;">**203h à CHF 125.00**</td><td class="align-right" style="width: 24.5983%; height: 29.7969px;">**CHF 25'375**</td></tr></tbody></table>

## Grundsätzliche Routine (Accounts, Contacts)

<table border="1" id="bkmrk-bexio-sage-sales-man" style="border-collapse: collapse; width: 100%;"><thead><tr><th class="align-left">bexio</th><th class="align-left">Sage Sales Management</th></tr></thead><tbody><tr><td>Kontakt vom Typ Firma</td><td>Account</td></tr><tr><td>Kontakt vom Typ Person ohne Firmenbezug</td><td>Account mit Flag "natürliche Person"</td></tr><tr><td>Kontakt vom Typ Person mit Firmenbezug</td><td>Contact mit Verknüpfung zu Account</td></tr><tr><td>Kunde und Lieferant</td><td>Account/Contact mit mehreren Rollen</td></tr></tbody></table>

#### Verarbeitungsregeln

<table border="1" id="bkmrk-regel-sage-sales-man" style="border-collapse: collapse; width: 100%; height: 150.781px;"><thead><tr style="height: 27.7969px;"><th class="align-left" style="width: 45.2579%; height: 27.7969px;">Regel</th><th class="align-left" style="width: 54.6305%; height: 27.7969px;">Sage Sales Management</th></tr></thead><tbody><tr style="height: 29.7969px;"><td style="width: 45.2579%; height: 29.7969px;">bexio contact\_type = Firma</td><td style="width: 54.6305%; height: 29.7969px;">Account</td></tr><tr style="height: 46.5938px;"><td style="width: 45.2579%; height: 46.5938px;">bexio contact\_type = Person + Firmenrelation vorhanden</td><td style="width: 54.6305%; height: 46.5938px;">Sage Contact unter bestehendem Sage Account</td></tr><tr style="height: 46.5938px;"><td style="width: 45.2579%; height: 46.5938px;">bexio contact\_type = Person + keine Firmenrelation</td><td style="width: 54.6305%; height: 46.5938px;">Account mit Flag "natürlicher Person"</td></tr></tbody></table>

### Feldzuordnung Bexio "Kontakte" ↔ Sage "Accounts"

bexio Kontakt vom Typ Firma ↔ Sage Account

<table id="bkmrk-bexio-feld-sage-acco" style="width: 100%; height: 985.485px;"><thead><tr style="height: 29.7969px;"><th class="align-left" style="width: 19.8974%; height: 29.7969px;">bexio Kontakt Feld</th><th class="align-left" style="width: 31.5241%; height: 29.7969px;">Sage Account Feld</th><th align="right" style="width: 11.6193%; height: 29.7969px;">Richtung</th><th class="align-left" style="width: 36.8356%; height: 29.7969px;">Bemerkung</th></tr></thead><tbody><tr style="height: 29.7969px;"><td style="width: 19.8974%; height: 29.7969px;">`id`</td><td style="width: 31.5241%; height: 29.7969px;">Custom Field `bexio_contact_id`</td><td align="right" style="width: 11.6193%; height: 29.7969px;">B → S</td><td style="width: 36.8356%; height: 29.7969px;">Unveränderbare technische Referenz</td></tr><tr style="height: 46.5938px;"><td style="width: 19.8974%; height: 46.5938px;">Sage Account-ID</td><td style="width: 31.5241%; height: 46.5938px;">Mappingtabelle `sage_entity_id`</td><td align="right" style="width: 11.6193%; height: 46.5938px;">S → Middleware</td><td style="width: 36.8356%; height: 46.5938px;">Nicht zwingend als bexio-Feld verfügbar</td></tr><tr style="height: 46.5938px;"><td style="width: 19.8974%; height: 46.5938px;">`nr`</td><td style="width: 31.5241%; height: 46.5938px;">`accountCode` / Custom Field `bexio_contact_nr`</td><td align="right" style="width: 11.6193%; height: 46.5938px;">B ↔ S</td><td style="width: 36.8356%; height: 46.5938px;">Geschäftsnummer, nicht als Primärschlüssel verwenden</td></tr><tr style="height: 46.5938px;"><td style="width: 19.8974%; height: 46.5938px;">`contact_type_id`</td><td style="width: 31.5241%; height: 46.5938px;">Custom Field `contact_type`</td><td align="right" style="width: 11.6193%; height: 46.5938px;">B → S</td><td style="width: 36.8356%; height: 46.5938px;">Firma/Person</td></tr><tr style="height: 29.7969px;"><td style="width: 19.8974%; height: 29.7969px;">`name_1`</td><td style="width: 31.5241%; height: 29.7969px;">`name`</td><td align="right" style="width: 11.6193%; height: 29.7969px;">B ↔ S</td><td style="width: 36.8356%; height: 29.7969px;">Firmenname</td></tr><tr style="height: 29.7969px;"><td style="width: 19.8974%; height: 29.7969px;">`name_2`</td><td style="width: 31.5241%; height: 29.7969px;">`additionalName` / Custom Field</td><td align="right" style="width: 11.6193%; height: 29.7969px;">B ↔ S</td><td style="width: 36.8356%; height: 29.7969px;">Zusatzname oder Abteilung</td></tr><tr style="height: 29.7969px;"><td style="width: 19.8974%; height: 29.7969px;">`address`</td><td style="width: 31.5241%; height: 29.7969px;">`address` / `address1`</td><td align="right" style="width: 11.6193%; height: 29.7969px;">B ↔ S</td><td style="width: 36.8356%; height: 29.7969px;">Strasse und Hausnummer</td></tr><tr style="height: 29.7969px;"><td style="width: 19.8974%; height: 29.7969px;">`postcode`</td><td style="width: 31.5241%; height: 29.7969px;">`postalCode`</td><td align="right" style="width: 11.6193%; height: 29.7969px;">B ↔ S</td><td style="width: 36.8356%; height: 29.7969px;"> </td></tr><tr style="height: 29.7969px;"><td style="width: 19.8974%; height: 29.7969px;">`city`</td><td style="width: 31.5241%; height: 29.7969px;">`city`</td><td align="right" style="width: 11.6193%; height: 29.7969px;">B ↔ S</td><td style="width: 36.8356%; height: 29.7969px;"> </td></tr><tr style="height: 29.7969px;"><td style="width: 19.8974%; height: 29.7969px;">`country_id`</td><td style="width: 31.5241%; height: 29.7969px;">`country` / `countryId`</td><td align="right" style="width: 11.6193%; height: 29.7969px;">B ↔ S</td><td style="width: 36.8356%; height: 29.7969px;">Lookup-Mapping erforderlich</td></tr><tr style="height: 29.7969px;"><td style="width: 19.8974%; height: 29.7969px;">`mail`</td><td style="width: 31.5241%; height: 29.7969px;">`email`</td><td align="right" style="width: 11.6193%; height: 29.7969px;">B ↔ S</td><td style="width: 36.8356%; height: 29.7969px;">Firmen-E-Mail</td></tr><tr style="height: 29.7969px;"><td style="width: 19.8974%; height: 29.7969px;">`mail_second`</td><td style="width: 31.5241%; height: 29.7969px;">Custom Field `email_secondary`</td><td align="right" style="width: 11.6193%; height: 29.7969px;">B ↔ S</td><td style="width: 36.8356%; height: 29.7969px;">Optional</td></tr><tr style="height: 29.7969px;"><td style="width: 19.8974%; height: 29.7969px;">`phone_fixed`</td><td style="width: 31.5241%; height: 29.7969px;">`phone`</td><td align="right" style="width: 11.6193%; height: 29.7969px;">B ↔ S</td><td style="width: 36.8356%; height: 29.7969px;"> </td></tr><tr style="height: 46.5938px;"><td style="width: 19.8974%; height: 46.5938px;">`phone_fixed_second`</td><td style="width: 31.5241%; height: 46.5938px;">Custom Field `phone_secondary`</td><td align="right" style="width: 11.6193%; height: 46.5938px;">B ↔ S</td><td style="width: 36.8356%; height: 46.5938px;">Optional</td></tr><tr style="height: 29.7969px;"><td style="width: 19.8974%; height: 29.7969px;">`phone_mobile`</td><td style="width: 31.5241%; height: 29.7969px;">`mobilePhone`</td><td align="right" style="width: 11.6193%; height: 29.7969px;">B ↔ S</td><td style="width: 36.8356%; height: 29.7969px;">Bei Firma eventuell leer</td></tr><tr style="height: 29.7969px;"><td style="width: 19.8974%; height: 29.7969px;">`fax`</td><td style="width: 31.5241%; height: 29.7969px;">`fax` / Custom Field</td><td align="right" style="width: 11.6193%; height: 29.7969px;">B ↔ S</td><td style="width: 36.8356%; height: 29.7969px;">Falls in Sage vorhanden</td></tr><tr style="height: 29.7969px;"><td style="width: 19.8974%; height: 29.7969px;">`url`</td><td style="width: 31.5241%; height: 29.7969px;">`website`</td><td align="right" style="width: 11.6193%; height: 29.7969px;">B ↔ S</td><td style="width: 36.8356%; height: 29.7969px;"> </td></tr><tr style="height: 29.7969px;"><td style="width: 19.8974%; height: 29.7969px;">`remarks`</td><td style="width: 31.5241%; height: 29.7969px;">`comments` / `description`</td><td align="right" style="width: 11.6193%; height: 29.7969px;">B ↔ S</td><td style="width: 36.8356%; height: 29.7969px;">Konfliktanfällig bei bidirektionalem Mapping</td></tr><tr style="height: 29.7969px;"><td style="width: 19.8974%; height: 29.7969px;">`language_id`</td><td style="width: 31.5241%; height: 29.7969px;">`language` / Custom Field</td><td align="right" style="width: 11.6193%; height: 29.7969px;">B ↔ S</td><td style="width: 36.8356%; height: 29.7969px;">Lookup-Tabelle</td></tr><tr style="height: 29.7969px;"><td style="width: 19.8974%; height: 29.7969px;">`user_id`</td><td style="width: 31.5241%; height: 29.7969px;">`ownerId`</td><td align="right" style="width: 11.6193%; height: 29.7969px;">B ↔ S</td><td style="width: 36.8356%; height: 29.7969px;">Benutzerzuordnung erforderlich</td></tr><tr style="height: 29.7969px;"><td style="width: 19.8974%; height: 29.7969px;">`owner_id`</td><td style="width: 31.5241%; height: 29.7969px;">`ownerId`</td><td align="right" style="width: 11.6193%; height: 29.7969px;">B ↔ S</td><td style="width: 36.8356%; height: 29.7969px;">Bedeutung in bexio vorgängig prüfen</td></tr><tr style="height: 29.7969px;"><td style="width: 19.8974%; height: 29.7969px;">`is_lead`</td><td style="width: 31.5241%; height: 29.7969px;">Account-Klassifikation / Leadstatus</td><td align="right" style="width: 11.6193%; height: 29.7969px;">B ↔ S</td><td style="width: 36.8356%; height: 29.7969px;">Businessregel definieren</td></tr><tr style="height: 46.5938px;"><td style="width: 19.8974%; height: 46.5938px;">`contact_group_ids`</td><td style="width: 31.5241%; height: 46.5938px;">Tags / Klassifikation</td><td align="right" style="width: 11.6193%; height: 46.5938px;">B ↔ S</td><td style="width: 36.8356%; height: 46.5938px;">Many-to-many</td></tr><tr style="height: 46.5938px;"><td style="width: 19.8974%; height: 46.5938px;">`contact_branch_ids`</td><td style="width: 31.5241%; height: 46.5938px;">Branche / Segment</td><td align="right" style="width: 11.6193%; height: 46.5938px;">B ↔ S</td><td style="width: 36.8356%; height: 46.5938px;">Lookup-Mapping</td></tr><tr style="height: 46.5938px;"><td style="width: 19.8974%; height: 46.5938px;">`updated_at`</td><td style="width: 31.5241%; height: 46.5938px;">`source_updated_at`</td><td align="right" style="width: 11.6193%; height: 46.5938px;">B → Middleware</td><td style="width: 36.8356%; height: 46.5938px;">Grundlage für Polling</td></tr><tr style="height: 46.5938px;"><td style="width: 19.8974%; height: 46.5938px;">Sage Änderungszeit</td><td style="width: 31.5241%; height: 46.5938px;">`sage_updated_at`</td><td align="right" style="width: 11.6193%; height: 46.5938px;">S → Middleware</td><td style="width: 36.8356%; height: 46.5938px;">Konflikterkennung</td></tr><tr style="height: 46.5938px;"><td style="width: 19.8974%; height: 46.5938px;">technischer Hash</td><td style="width: 31.5241%; height: 46.5938px;">`payload_hash`</td><td align="right" style="width: 11.6193%; height: 46.5938px;">intern</td><td style="width: 36.8356%; height: 46.5938px;">Verhindert unnötige Updates</td></tr></tbody></table>

#### Zusätzliche Rollenfelder

<table border="1" id="bkmrk-sage-feld-werte-busi" style="border-collapse: collapse; width: 100%;"><thead><tr><th class="align-left">Sage-Feld</th><th class="align-left">Werte</th></tr></thead><tbody><tr><td>`business_partner_roles`</td><td>Kunde, Lieferant, Interessent</td></tr><tr><td>`is_customer`</td><td>Boolean</td></tr><tr><td>`is_supplier`</td><td>Boolean</td></tr><tr><td>`bexio_contact_type`</td><td>Firma, Person</td></tr><tr><td>`bexio_contact_id`</td><td>Numerische bexio-ID</td></tr><tr><td>`bexio_contact_nr`</td><td>Sichtbare bexio-Kontaktnummer</td></tr></tbody></table>

### Feldzuordnung Bexio "Kontakte" ↔ Sage "Contacts"

bexio Kontakt vom Typ Person ↔ Sage Contact

<table border="1" id="bkmrk-bexio-feld-sage-cont" style="border-collapse: collapse; width: 100%;"><thead><tr><th class="align-left">bexio Kontakt Feld</th><th class="align-left">Sage Contact Feld</th><th align="right">Richtung</th><th class="align-left">Bemerkung</th></tr></thead><tbody><tr><td>`id`</td><td>Custom Field `bexio_contact_id`</td><td align="right">B → S</td><td>Technische Referenz</td></tr><tr><td>Sage Contact-ID</td><td>Mappingtabelle</td><td align="right">S → Middleware</td><td> </td></tr><tr><td>`nr`</td><td>Custom Field `bexio_contact_nr`</td><td align="right">B ↔ S</td><td>Keine technische ID</td></tr><tr><td>`name_1`</td><td>`lastName`</td><td align="right">B ↔ S</td><td>Zuordnung anhand effektiver bexio-Nutzung prüfen</td></tr><tr><td>`name_2`</td><td>`firstName`</td><td align="right">B ↔ S</td><td>Kann je Datenpflege umgekehrt verwendet sein</td></tr><tr><td>`salutation_id`</td><td>`salutation`</td><td align="right">B ↔ S</td><td>Lookup erforderlich</td></tr><tr><td>`salutation_form`</td><td>Custom Field `salutation_form`</td><td align="right">B ↔ S</td><td>Optional</td></tr><tr><td>`title_id`</td><td>`title`</td><td align="right">B ↔ S</td><td>Lookup</td></tr><tr><td>`birthday`</td><td>`birthday`</td><td align="right">B ↔ S</td><td>Datenschutz beachten</td></tr><tr><td>`address`</td><td>`address`</td><td align="right">B ↔ S</td><td>Privat- oder Geschäftsadresse</td></tr><tr><td>`postcode`</td><td>`postalCode`</td><td align="right">B ↔ S</td><td> </td></tr><tr><td>`city`</td><td>`city`</td><td align="right">B ↔ S</td><td> </td></tr><tr><td>`country_id`</td><td>`country`</td><td align="right">B ↔ S</td><td>Lookup</td></tr><tr><td>`mail`</td><td>`email`</td><td align="right">B ↔ S</td><td>Empfohlenes Dublettenmerkmal</td></tr><tr><td>`mail_second`</td><td>Custom Field `email_secondary`</td><td align="right">B ↔ S</td><td> </td></tr><tr><td>`phone_fixed`</td><td>`phone`</td><td align="right">B ↔ S</td><td> </td></tr><tr><td>`phone_fixed_second`</td><td>Custom Field</td><td align="right">B ↔ S</td><td> </td></tr><tr><td>`phone_mobile`</td><td>`mobilePhone`</td><td align="right">B ↔ S</td><td> </td></tr><tr><td>`fax`</td><td>`fax` / Custom Field</td><td align="right">B ↔ S</td><td> </td></tr><tr><td>`skype_name`</td><td>Custom Field</td><td align="right">B ↔ S</td><td>Nur falls weiterhin relevant</td></tr><tr><td>`remarks`</td><td>`comments` / `description`</td><td align="right">B ↔ S</td><td>Konfliktregel notwendig</td></tr><tr><td>`language_id`</td><td>`language`</td><td align="right">B ↔ S</td><td>Lookup</td></tr><tr><td>Firmenrelation</td><td>`accountId`</td><td align="right">B ↔ S</td><td>Über Kontaktbeziehung bestimmen</td></tr><tr><td>`user_id` / `owner_id`</td><td>`ownerId`</td><td align="right">B ↔ S</td><td>Benutzer-Mapping</td></tr><tr><td>`contact_group_ids`</td><td>Tags / Kategorien</td><td align="right">B ↔ S</td><td> </td></tr><tr><td>`updated_at`</td><td>Middleware-Syncstatus</td><td align="right">B → intern</td><td> </td></tr></tbody></table>

<p class="callout info">Kritischer Punkt: Account-Verknüpfung  
Für eine Person mit Firmenbezug muss die Reihenfolge lauten:  
 1. Firmenkontakt in bexio identifizieren.  
 2. Zugehörigen Sage Account suchen oder erstellen.  
 3. Person als Sage Contact erstellen.  
 4. `accountId` des Contacts auf den Sage Account setzen.  
 5. Beziehung in einer Mappingtabelle speichern.  
Eine Person sollte nicht anhand des Firmennamens allein zugeordnet werden. Primär sollte die bexio-Beziehungs-ID beziehungsweise die externe Kontakt-ID verwendet werden.</p>

### Feldzuordnung Bexio "Aufträge" ↔Sage "Salesorders"

bexio stellt Aufträge als Dokumentressource bereit. Für eine vollständige Synchronisation müssen Dokumentkopf und Positionen getrennt betrachtet werden. Die bexio API bietet Verwaltungsfunktionen für Verkaufsaufträge und weitere Verkaufsdokumente.

#### AuftragsKopf

<table border="1" id="bkmrk-bexio-auftrag-sage-s" style="border-collapse: collapse; width: 100%;"><thead><tr><th class="align-left">bexio Auftrag Feld</th><th class="align-left">Sage Salesorder Feld</th><th align="right">Richtung</th><th class="align-left">Bemerkung</th></tr></thead><tbody><tr><td>`id`</td><td>Custom Field `bexio_order_id`</td><td align="right">B → S</td><td>Technischer Schlüssel</td></tr><tr><td>Sage Salesorder-ID</td><td>Mappingtabelle</td><td align="right">S → intern</td><td> </td></tr><tr><td>`document_nr`</td><td>`orderNumber`</td><td align="right">B ↔ S</td><td>Sichtbare Auftragsnummer</td></tr><tr><td>`title`</td><td>`name` / `title`</td><td align="right">B ↔ S</td><td> </td></tr><tr><td>`contact_id`</td><td>`accountId`</td><td align="right">B ↔ S</td><td>Über Kontaktmapping</td></tr><tr><td>`contact_sub_id`</td><td>`contactId`</td><td align="right">B ↔ S</td><td>Ansprechpartner</td></tr><tr><td>`user_id`</td><td>`ownerId`</td><td align="right">B ↔ S</td><td>Benutzer-Mapping</td></tr><tr><td>`project_id`</td><td>`projectId` / Custom Field</td><td align="right">B ↔ S</td><td>Optional</td></tr><tr><td>`language_id`</td><td>`language`</td><td align="right">B ↔ S</td><td>Lookup</td></tr><tr><td>`currency_id`</td><td>`currency`</td><td align="right">B ↔ S</td><td>Lookup, ISO-Code bevorzugen</td></tr><tr><td>`payment_type_id`</td><td>`paymentTerms`</td><td align="right">B ↔ S</td><td>Lookup</td></tr><tr><td>`bank_account_id`</td><td>Custom Field</td><td align="right">B ↔ S</td><td>Nur falls fachlich benötigt</td></tr><tr><td>Dokumentdatum</td><td>`orderDate`</td><td align="right">B ↔ S</td><td>Feldname in bexio prüfen</td></tr><tr><td>`is_valid_from`</td><td>`validFrom`</td><td align="right">B ↔ S</td><td>Optional</td></tr><tr><td>`is_valid_to`</td><td>`validUntil`</td><td align="right">B ↔ S</td><td>Optional</td></tr><tr><td>`header`</td><td>`headerText` / Beschreibung</td><td align="right">B ↔ S</td><td> </td></tr><tr><td>`footer`</td><td>`footerText` / Beschreibung</td><td align="right">B ↔ S</td><td> </td></tr><tr><td>`contact_address`</td><td>Rechnungsadresse</td><td align="right">B ↔ S</td><td>Snapshot des Dokuments</td></tr><tr><td>`delivery_address`</td><td>Lieferadresse</td><td align="right">B ↔ S</td><td> </td></tr><tr><td>`delivery_address_type`</td><td>Lieferadresstyp</td><td align="right">B ↔ S</td><td>Lookup</td></tr><tr><td>`total_net`</td><td>`netAmount`</td><td align="right">B → S</td><td>Berechnetes Feld möglichst nicht zurückschreiben</td></tr><tr><td>`total_taxes`</td><td>`taxAmount`</td><td align="right">B → S</td><td> </td></tr><tr><td>`total_gross`</td><td>`grossAmount`</td><td align="right">B → S</td><td> </td></tr><tr><td>`mwst_type`</td><td>`taxType`</td><td align="right">B ↔ S</td><td>Lookup</td></tr><tr><td>`mwst_is_net`</td><td>`pricesIncludeTax`</td><td align="right">B ↔ S</td><td>Boolean-Transformation</td></tr><tr><td>`show_position_taxes`</td><td>Custom Field</td><td align="right">B ↔ S</td><td>Darstellungsinformation</td></tr><tr><td>`kb_item_status_id`</td><td>`status`</td><td align="right">B ↔ S</td><td>Statustabelle erforderlich</td></tr><tr><td>`api_reference`</td><td>`externalReference`</td><td align="right">B ↔ S</td><td>Sehr gut für Integrationsreferenz geeignet</td></tr><tr><td>`updated_at`</td><td>Syncstatus</td><td align="right">B → intern</td><td>Polling</td></tr><tr><td>Sage Änderungszeit</td><td>Syncstatus</td><td align="right">S → intern</td><td>Konflikterkennung</td></tr></tbody></table>

#### Auftragspositionen

<table border="1" id="bkmrk-bexio-position-sage-" style="border-collapse: collapse; width: 100%;"><thead><tr><th class="align-left">bexio Position Feld</th><th class="align-left">Sage Salesorder Line Feld</th><th align="right">Richtung</th><th class="align-left">Bemerkung</th></tr></thead><tbody><tr><td>Positions-ID</td><td>`externalLineId`</td><td align="right">B → S</td><td>Mappingtabelle</td></tr><tr><td>`amount`</td><td>`quantity`</td><td align="right">B ↔ S</td><td> </td></tr><tr><td>`unit_id`</td><td>`unit`</td><td align="right">B ↔ S</td><td>Lookup</td></tr><tr><td>`text`</td><td>`description`</td><td align="right">B ↔ S</td><td> </td></tr><tr><td>`unit_price`</td><td>`unitPrice`</td><td align="right">B ↔ S</td><td> </td></tr><tr><td>`discount_in_percent`</td><td>`discountPercent`</td><td align="right">B ↔ S</td><td> </td></tr><tr><td>Artikelreferenz</td><td>`productId` / `articleId`</td><td align="right">B ↔ S</td><td>Nur mit Artikelmapping</td></tr><tr><td>Steuersatz-ID</td><td>`taxRate` / `taxId`</td><td align="right">B ↔ S</td><td>Lookup</td></tr><tr><td>Positionssumme</td><td>`lineTotal`</td><td align="right">B → S</td><td>Berechnetes Feld</td></tr><tr><td>Sortierung</td><td>`position` / `sortOrder`</td><td align="right">B ↔ S</td><td> </td></tr><tr><td>Positionstyp</td><td>`lineType`</td><td align="right">B ↔ S</td><td>Normal, Titel, Zwischensumme, Text etc.</td></tr></tbody></table>

### Feldzuordnung Bexio Rechnungen ↔Sage "Sales"

Hier würde es Sinn machen nur die Kopfdaten zu übermitteln

<table border="1" id="bkmrk-bexio-rechnung-sage-" style="border-collapse: collapse; width: 100%; height: 774.719px;"><thead><tr style="height: 29.7969px;"><th class="align-left" style="width: 21.8159%; height: 29.7969px;">bexio Rechnung Feld</th><th class="align-left" style="width: 32.9467%; height: 29.7969px;">Sage Sales Feld</th><th align="right" style="width: 12.1543%; height: 29.7969px;">Richtung</th><th class="align-left" style="width: 32.8967%; height: 29.7969px;">Bemerkung</th></tr></thead><tbody><tr style="height: 29.7969px;"><td style="width: 21.8159%; height: 29.7969px;">`id`</td><td style="width: 32.9467%; height: 29.7969px;">Custom Field `bexio_invoice_id`</td><td align="right" style="width: 12.1543%; height: 29.7969px;">B → S</td><td style="width: 32.8967%; height: 29.7969px;">Technische Referenz</td></tr><tr style="height: 29.7969px;"><td style="width: 21.8159%; height: 29.7969px;">`document_nr`</td><td style="width: 32.9467%; height: 29.7969px;">`saleNumber` / `invoiceNumber`</td><td align="right" style="width: 12.1543%; height: 29.7969px;">B → S</td><td style="width: 32.8967%; height: 29.7969px;"> </td></tr><tr style="height: 29.7969px;"><td style="width: 21.8159%; height: 29.7969px;">`title`</td><td style="width: 32.9467%; height: 29.7969px;">`name` / `title`</td><td align="right" style="width: 12.1543%; height: 29.7969px;">B → S</td><td style="width: 32.8967%; height: 29.7969px;"> </td></tr><tr style="height: 29.7969px;"><td style="width: 21.8159%; height: 29.7969px;">`contact_id`</td><td style="width: 32.9467%; height: 29.7969px;">`accountId`</td><td align="right" style="width: 12.1543%; height: 29.7969px;">B → S</td><td style="width: 32.8967%; height: 29.7969px;">Über Mapping</td></tr><tr style="height: 29.7969px;"><td style="width: 21.8159%; height: 29.7969px;">`contact_sub_id`</td><td style="width: 32.9467%; height: 29.7969px;">`contactId`</td><td align="right" style="width: 12.1543%; height: 29.7969px;">B → S</td><td style="width: 32.8967%; height: 29.7969px;">Ansprechpartner</td></tr><tr style="height: 29.7969px;"><td style="width: 21.8159%; height: 29.7969px;">`user_id`</td><td style="width: 32.9467%; height: 29.7969px;">`ownerId`</td><td align="right" style="width: 12.1543%; height: 29.7969px;">B → S</td><td style="width: 32.8967%; height: 29.7969px;">Benutzer-Mapping</td></tr><tr style="height: 29.7969px;"><td style="width: 21.8159%; height: 29.7969px;">`project_id`</td><td style="width: 32.9467%; height: 29.7969px;">Custom Field / Projekt</td><td align="right" style="width: 12.1543%; height: 29.7969px;">B → S</td><td style="width: 32.8967%; height: 29.7969px;">Optional</td></tr><tr style="height: 29.7969px;"><td style="width: 21.8159%; height: 29.7969px;">`currency_id`</td><td style="width: 32.9467%; height: 29.7969px;">`currency`</td><td align="right" style="width: 12.1543%; height: 29.7969px;">B → S</td><td style="width: 32.8967%; height: 29.7969px;">Lookup</td></tr><tr style="height: 29.7969px;"><td style="width: 21.8159%; height: 29.7969px;">`language_id`</td><td style="width: 32.9467%; height: 29.7969px;">Custom Field</td><td align="right" style="width: 12.1543%; height: 29.7969px;">B → S</td><td style="width: 32.8967%; height: 29.7969px;"> </td></tr><tr style="height: 29.7969px;"><td style="width: 21.8159%; height: 29.7969px;">Rechnungsdatum</td><td style="width: 32.9467%; height: 29.7969px;">`saleDate` / `invoiceDate`</td><td align="right" style="width: 12.1543%; height: 29.7969px;">B → S</td><td style="width: 32.8967%; height: 29.7969px;"> </td></tr><tr style="height: 29.7969px;"><td style="width: 21.8159%; height: 29.7969px;">Fälligkeitsdatum</td><td style="width: 32.9467%; height: 29.7969px;">`dueDate`</td><td align="right" style="width: 12.1543%; height: 29.7969px;">B → S</td><td style="width: 32.8967%; height: 29.7969px;"> </td></tr><tr style="height: 29.7969px;"><td style="width: 21.8159%; height: 29.7969px;">`payment_type_id`</td><td style="width: 32.9467%; height: 29.7969px;">`paymentTerms`</td><td align="right" style="width: 12.1543%; height: 29.7969px;">B → S</td><td style="width: 32.8967%; height: 29.7969px;">Lookup</td></tr><tr style="height: 29.7969px;"><td style="width: 21.8159%; height: 29.7969px;">`header`</td><td style="width: 32.9467%; height: 29.7969px;">`description` / Custom Field</td><td align="right" style="width: 12.1543%; height: 29.7969px;">B → S</td><td style="width: 32.8967%; height: 29.7969px;"> </td></tr><tr style="height: 29.7969px;"><td style="width: 21.8159%; height: 29.7969px;">`footer`</td><td style="width: 32.9467%; height: 29.7969px;">Custom Field</td><td align="right" style="width: 12.1543%; height: 29.7969px;">B → S</td><td style="width: 32.8967%; height: 29.7969px;"> </td></tr><tr style="height: 29.7969px;"><td style="width: 21.8159%; height: 29.7969px;">`total_net`</td><td style="width: 32.9467%; height: 29.7969px;">`netAmount`</td><td align="right" style="width: 12.1543%; height: 29.7969px;">B → S</td><td style="width: 32.8967%; height: 29.7969px;"> </td></tr><tr style="height: 29.7969px;"><td style="width: 21.8159%; height: 29.7969px;">`total_taxes`</td><td style="width: 32.9467%; height: 29.7969px;">`taxAmount`</td><td align="right" style="width: 12.1543%; height: 29.7969px;">B → S</td><td style="width: 32.8967%; height: 29.7969px;"> </td></tr><tr style="height: 29.7969px;"><td style="width: 21.8159%; height: 29.7969px;">`total_gross`</td><td style="width: 32.9467%; height: 29.7969px;">`grossAmount`</td><td align="right" style="width: 12.1543%; height: 29.7969px;">B → S</td><td style="width: 32.8967%; height: 29.7969px;"> </td></tr><tr style="height: 29.7969px;"><td style="width: 21.8159%; height: 29.7969px;">erhaltene Zahlungen</td><td style="width: 32.9467%; height: 29.7969px;">`paidAmount`</td><td align="right" style="width: 12.1543%; height: 29.7969px;">B → S</td><td style="width: 32.8967%; height: 29.7969px;">Falls Sales dies unterstützt</td></tr><tr style="height: 29.7969px;"><td style="width: 21.8159%; height: 29.7969px;">offener Betrag</td><td style="width: 32.9467%; height: 29.7969px;">`openAmount`</td><td align="right" style="width: 12.1543%; height: 29.7969px;">B → S</td><td style="width: 32.8967%; height: 29.7969px;"> </td></tr><tr style="height: 29.7969px;"><td style="width: 21.8159%; height: 29.7969px;">Rechnungsstatus</td><td style="width: 32.9467%; height: 29.7969px;">`status`</td><td align="right" style="width: 12.1543%; height: 29.7969px;">B → S</td><td style="width: 32.8967%; height: 29.7969px;">Entwurf, offen, bezahlt, storniert</td></tr><tr style="height: 29.7969px;"><td style="width: 21.8159%; height: 29.7969px;">`mwst_type`</td><td style="width: 32.9467%; height: 29.7969px;">`taxType`</td><td align="right" style="width: 12.1543%; height: 29.7969px;">B → S</td><td style="width: 32.8967%; height: 29.7969px;"> </td></tr><tr style="height: 29.7969px;"><td style="width: 21.8159%; height: 29.7969px;">`mwst_is_net`</td><td style="width: 32.9467%; height: 29.7969px;">`pricesIncludeTax`</td><td align="right" style="width: 12.1543%; height: 29.7969px;">B → S</td><td style="width: 32.8967%; height: 29.7969px;"> </td></tr><tr style="height: 29.7969px;"><td style="width: 21.8159%; height: 29.7969px;">`contact_address`</td><td style="width: 32.9467%; height: 29.7969px;">Rechnungsadresse</td><td align="right" style="width: 12.1543%; height: 29.7969px;">B → S</td><td style="width: 32.8967%; height: 29.7969px;">Dokument-Snapshot</td></tr><tr style="height: 29.7969px;"><td style="width: 21.8159%; height: 29.7969px;">`api_reference`</td><td style="width: 32.9467%; height: 29.7969px;">`externalReference`</td><td align="right" style="width: 12.1543%; height: 29.7969px;">B → S</td><td style="width: 32.8967%; height: 29.7969px;"> </td></tr><tr style="height: 29.7969px;"><td style="width: 21.8159%; height: 29.7969px;">`updated_at`</td><td style="width: 32.9467%; height: 29.7969px;">Syncstatus</td><td align="right" style="width: 12.1543%; height: 29.7969px;">B → intern</td><td style="width: 32.8967%; height: 29.7969px;"> </td></tr></tbody></table>

## Polling-Intervalle für alle Entitäten

<table border="1" id="bkmrk-entit%C3%A4t-empfehlung-k" style="border-collapse: collapse; width: 100%;"><thead><tr><th class="align-left">Entität</th><th align="right">Intervall</th></tr></thead><tbody><tr><td>Kontakte</td><td align="right">alle 5–15 Minuten</td></tr><tr><td>Aufträge</td><td align="right">alle 5 Minuten</td></tr><tr><td>Rechnungen</td><td align="right">alle 5–15 Minuten</td></tr><tr><td>Lookup-Daten</td><td align="right">täglich</td></tr><tr><td>vollständiger Abgleich</td><td align="right">nachts oder wöchentlich</td></tr></tbody></table>

# Schnittstelle E-Guma

<p class="callout info">Laut Schnittstellendokumentation können Kunden oder Firmen nicht explizit abgeholt werden. Kundendaten sind immer Bestandteil einer Bestellung..  
  
**Die Schnittstellen-Integration ist nach diesem Kriterium "fragwürdig"**</p>

- Gutscheinbestellungen können zeitlich gefiltert abgerufen werden.
- Einzelne Bestellungen können abgerufen werden.
- Neue Gutscheinbestellungen können angelegt werden.
- Für neu erstellte Bestellungen existiert ein Webhook.
- Kundendaten sind Bestandteil einer Bestellung.
- Es sind **keine öffentlich dokumentierten, eigenständigen CRUD-Endpunkte für Kunden oder Firmen** ersichtlich.

#### Realisierbarkeit

<table id="bkmrk-gew%C3%BCnschte-entit%C3%A4t-r" style="width: 100%;"><thead><tr><th style="width: 29.6623%;">Gewünschte Entität</th><th align="right" style="width: 21.6356%;">Realisierbarkeit</th><th style="width: 48.7021%;">Empfohlene Richtung</th></tr></thead><tbody><tr><td style="width: 29.6623%;">Accounts</td><td align="right" style="width: 21.6356%;">Teilweise, nur über Bestellung

<span style="background-color: rgb(248, 202, 198);">nicht sinnvoll weil keine eindeutige Kennung vorhanden ist</span>

</td><td style="width: 48.7021%;">e-guma → Sage Sales Management</td></tr><tr><td style="width: 29.6623%;">Kontakte</td><td align="right" style="width: 21.6356%;">Teilweise, nur über Bestellung  
<span style="background-color: rgb(248, 202, 198);">nicht sinnvoll weil keine eindeutige Kennung vorhanden ist</span>  
</td><td style="width: 48.7021%;">e-guma → Sage Sales Management</td></tr><tr><td style="width: 29.6623%;">Sales</td><td align="right" style="width: 21.6356%;">Gut möglich</td><td style="width: 48.7021%;">e-guma → Sage Sales Management</td></tr><tr><td style="width: 29.6623%;">Aufträge</td><td align="right" style="width: 21.6356%;">Gut möglich</td><td style="width: 48.7021%;">e-guma → Sage Sales Management; optional Sage → e-guma</td></tr><tr><td style="width: 29.6623%;">Gutschein-/Produktstammdaten</td><td align="right" style="width: 21.6356%;">Möglich</td><td style="width: 48.7021%;">e-guma → Sage Sales Management</td></tr><tr><td style="width: 29.6623%;">Marketing-Einwilligung</td><td align="right" style="width: 21.6356%;">Möglich</td><td style="width: 48.7021%;">e-guma → Sage Sales Management</td></tr></tbody></table>

Die Integration ist unidirektional theoretisch möglich

## Accounts und Kontakte

Die e-guma-Bestellungen enthalten ein eingebettetes `customer`-Objekt mit:

- Kunden-ID
- Anrede
- Vorname
- Nachname
- Firma
- Adresse
- E-Mail
- Telefon
- Marketing-Einwilligung
- Zeitpunkt des Double-Opt-ins

Diese Informationen können in Sage Sales Management als Accounts und Contacts erstellt beziehungsweise aktualisiert werden.

## Zeitschätzung

### Minimaler sinnvoller Umfang

Enthalten:

- e-guma → Sage Accounts
- e-guma → Sage Contacts
- e-guma → Sage Sales
- Polling
- Datenbanktabellen
- Mapping
- Logging
- Basis-Tests

**Schätzung: 90–135 Stunden**

### Empfohlener produktiver Umfang

Zusätzlich:

- Aufträge und Positionen
- Webhook
- Stornierungen
- robuster Delta-Abgleich
- umfassende Testfälle
- Monitoring und bessere Fehlerbehandlung

**Schätzung: 130–195 Stunden**

### Erweiterter Umfang

Zusätzlich:

- Sage → e-guma Gutscheinbestellungen
- Verarbeitung von Gutscheincodes/PDF-URLs
- erweiterte Konfigurationsoberfläche
- Initialimport-Assistent
- manuelles Replay fehlgeschlagener Datensätze

**Schätzung: 160–235 Stunden**

## **Geschätzte Entwicklung gesamte Anbindung mit allem: 380 - 565 Stunden**

# Mewshouse Middleware

## Todo: 

Tabelle der Gäste inkl. Bearbeitung  
Tabelle der Zugänge inkl. Bearbeitung  
Logging-Tabelle zur reinen Ansicht

#### Webhooks hinzufügen

Mews Webhook anpassen: Noch nicht analysiert... (zusätzlicher Webhook, wenn möglich)

aleno prod webhook id: fc1c3d1e90280b42c72f2706 (zusätzlicher Webhook, wenn möglich)

#### Crons einrichten

<p class="callout info">Damit der Zugriff funktioniert muss "CRON\_SECRET" in den Environment-Variabeln im header "authorization" als Bearer mitgegeben werden!</p>

<table border="1" id="bkmrk-endpunkt-beschreibun" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 26.2052%;"></col><col style="width: 48.1982%;"></col><col style="width: 25.7202%;"></col></colgroup><tbody><tr><td>Endpunkt</td><td>Beschreibung</td><td>Zeiten</td></tr><tr><td>/api/lotta/access-groups</td><td>Access-Groups synchronisieren</td><td>06:00, 12:00, 18:00</td></tr><tr><td>/api/aleno/sync-reservations</td><td>Aleno-Reservierungen synchronisieren</td><td>06:00, 12:00, 18:00</td></tr><tr><td>/api/mews/sync-reservations</td><td>Mews-Reservierungen synchronisieren</td><td>06:00, 12:00, 18:00</td></tr><tr><td>/api/guests/process</td><td>Gäste-Zugriffe synchronisieren / aktualisieren</td><td>alle 5 Minuten</td></tr><tr><td>  
</td><td>  
</td><td>  
</td></tr></tbody></table>

## Testszenarien

**Mews:**

1. Anders als beim Aleno-Flow muss hier das Mews-Dashboard verwendet werden, um eine Testbuchung anzulegen:  
    [https://app.mews.com/Commander/dbbef1f9-d4c5-4324-be7e-b3680081bef3/Reservation/Create](https://app.mews.com/Commander/dbbef1f9-d4c5-4324-be7e-b3680081bef3/Reservation/Create "https://app.mews.com/Commander/dbbef1f9-d4c5-4324-be7e-b3680081bef3/Reservation/Create")  
    Eine neue Buchung erstellen, idealerweise mit einem Datum in der weiter entfernten Zukunft. Als Nachname «Test» verwenden. Unbedingt die eigene Handynummer angeben, damit der Lotta-SMS-Versand funktioniert.
2. Sicherstellen, dass die Buchung den Status «Bestätigt» hat.
3. Lotta-Middleware-Dashboard öffnen:  
    URL: [https://mewshouse-lotta-middleware.vercel.app/](https://mewshouse-lotta-middleware.vercel.app/ "https://mewshouse-lotta-middleware.vercel.app/")  
    Login: Admin / M3W5H0U53L0TT7

→ Guests → entsprechendes Gastprofil suchen (falls noch nicht vorhanden, ein paar Minuten warten) → öffnen  
→ Prüfen, ob Start- und Enddatum korrekt sind  
→ Unter «Accesses» prüfen, ob ein entsprechender «Mews»-Eintrag vorhanden ist  
→ Eintrag öffnen und sicherstellen, dass «Type» mit der gebuchten Suite übereinstimmt

4. *(Optional: Sofort-Zugang testen)*

- Im Gastprofil den «Type» von «Automated» auf «Manual» ändern
- Start- und Enddatum manuell so anpassen, dass sofortiger Zugang möglich ist (Startdatum in der Vergangenheit, Enddatum in der Zukunft)
- Unter «Access Types» die gebuchte Suite manuell auswählen
- Speichern und ein paar Minuten warten
- Lotta Manager Dashboard öffnen: [https://manager.lottasystems.app/users/details/599](https://manager.lottasystems.app/users/details/599 "https://manager.lottasystems.app/users/details/599")  
    → Benutzer → API Tiefenhöhe → «Access» → «Access Codes»  
    → Prüfen, ob ein Eintrag für den Gast vorhanden ist
- Falls der Nachname «Test» verwendet wurde, prüfen, ob eine SMS eingegangen ist (Versand frühestens 24h vor Startdatum)
- Wenn du fertig bist mit Testen, den “Type” wieder auf “Automated” und speichern.


**Aleno:**

1. [https://www.mewshouse.ch/](https://www.mewshouse.ch/ "https://www.mewshouse.ch/") → Mews Table buchen  
    Ebenfalls ein Datum in der Zukunft wählen. Als Nachname «Test» verwenden und die eigene Handynummer angeben. Kreditkartenzahlung starten und anschliessend abbrechen.
2. Aleno-Dashboard öffnen:  
    [https://mytools.aleno.me/aleno3/booqIn?allTimeslotsExpanded=yes&amp;statusFilter=no&amp;showTimeslots=yes](https://mytools.aleno.me/aleno3/booqIn?allTimeslotsExpanded=yes&statusFilter=no&showTimeslots=yes "https://mytools.aleno.me/aleno3/booqIn?allTimeslotsExpanded=yes&statusFilter=no&showTimeslots=yes")  
    → booqin → Datum auswählen → STATUS FILTER OFF  
    → Buchung suchen und den Status von «CC Requested» auf «Confirmed» ändern → speichern
3. Lotta-Middleware-Dashboard öffnen (siehe oben)  
    → Guests → Gastprofil suchen → öffnen  
    → Prüfen, ob Start- und Enddatum korrekt sind  
    → Unter «Accesses» prüfen, ob ein entsprechender «Aleno»-Eintrag vorhanden ist  
    → Sicherstellen, dass «Type» = «Restaurant»
4. *(Optional: Sofort-Zugang testen)*

- Im Gastprofil den «Type» von «Automated» auf «Manual» ändern
- Start- und Enddatum manuell so anpassen, dass sofortiger Zugang möglich ist
- Unter «Access Types» den passenden Zugang manuell auswählen
- Speichern und ein paar Minuten warten
- Lotta Manager Dashboard öffnen: [https://manager.lottasystems.app/users/details/599](https://manager.lottasystems.app/users/details/599 "https://manager.lottasystems.app/users/details/599")  
    → Benutzer → API Tiefenhöhe → «Access» → «Access Codes»  
    → Prüfen, ob ein Eintrag vorhanden ist
- Falls der Nachname «Test» verwendet wurde, prüfen, ob eine SMS eingegangen ist (Versand frühestens 24h vor Startdatum)
- Wenn du fertig bist mit Testen, den “Type” wieder auf “Automated” und speichern.


Im Anschluss die Mews-/Aleno-Buchungen in den jeweiligen Systemen stornieren. Anschliessend ein paar Minuten warten und sicherstellen, dass sich die Einträge im Lotta-Middleware-Dashboard sowie im Lotta ManagerDashboard entsprechend aktualisieren.