Skip to main content

Bexio Integration

Zeitschätzung vollumfänglich

ArbeitspaketAufwand
Technische Analyse bexio API und API-Prototyp16h
OAuth-/Token-Handling bexio6h
Directus-/MySQL-Tabellen und Migrationen8h
Generischer bexio API Client in PHP16h
Polling, Cursor, Pagination und Retry16h
Lookup- und Benutzer-Mappings??? Wird im CRM über Subtabellen geregelt
Kontakte Firma ↔ Sage Accounts20h
Kontakte Person ↔ Sage Contacts20h
Firmen-/Personenbeziehungen12h
Dubletten- und Konfliktlogik Kontakte??? Regeln...
Auftragskopf bidirektional20h
Auftragspositionen bidirektional25h
Status-, Steuer- und Rundungsmapping Aufträge???? müssen wir hier etwas beachten
Rechnungen → Sage Sales16h
Lösch-/Stornoverhalten??? allenfalls über Status
Logging, Monitoring und Fehlerbehandlung12h
Integrations- und Regressionstests8h
Dokumentation und Deployment8h

203hCHF 25'375

Grundsätzliche Routine (Accounts, Contacts)

bexioSage Sales Management
Kontakt vom Typ FirmaAccount
Kontakt vom Typ Person ohne FirmenbezugContact, optional zusätzlicher Account „Privatkunde“
Kontakt vom Typ Person mit FirmenbezugContact mit Verknüpfung zu Account
LieferantAccount oder Contact mit Klassifikation „Lieferant“
Kunde und LieferantAccount/Contact mit mehreren Rollen

Verarbeitungsregeln

RegelSage Sales Management
bexio contact_type = FirmaAccount
bexio contact_type = Person + Firmenrelation vorhandenSage Contact unter bestehendem Sage Account
bexio contact_type = Person + keine FirmenrelationSage Contact, → optional technischer Account „Privatpersonen“ oder eigener B2C-Account

Feldzuordnung Bexio "Kontakte" ↔ Sage "Accounts"

bexio Kontakt vom Typ Firma ↔ Sage Account

bexio-FeldSage AccountRichtungBemerkung
idCustom Field bexio_contact_idB → SUnveränderbare technische Referenz
Sage Account-IDMappingtabelle sage_entity_idS → MiddlewareNicht zwingend als bexio-Feld verfügbar
nraccountCode / Custom Field bexio_contact_nrB ↔ SGeschäftsnummer, nicht als Primärschlüssel verwenden
contact_type_idCustom Field contact_typeB → SFirma/Person
name_1nameB ↔ SFirmenname
name_2additionalName / Custom FieldB ↔ SZusatzname oder Abteilung
addressaddress / address1B ↔ SStrasse und Hausnummer
postcodepostalCodeB ↔ S 
citycityB ↔ S 
country_idcountry / countryIdB ↔ SLookup-Mapping erforderlich
mailemailB ↔ SFirmen-E-Mail
mail_secondCustom Field email_secondaryB ↔ SOptional
phone_fixedphoneB ↔ S 
phone_fixed_secondCustom Field phone_secondaryB ↔ SOptional
phone_mobilemobilePhoneB ↔ SBei Firma eventuell leer
faxfax / Custom FieldB ↔ SFalls in Sage vorhanden
urlwebsiteB ↔ S 
remarkscomments / descriptionB ↔ SKonfliktanfällig bei bidirektionalem Mapping
language_idlanguage / Custom FieldB ↔ SLookup-Tabelle
user_idownerIdB ↔ SBenutzerzuordnung erforderlich
owner_idownerIdB ↔ SBedeutung in bexio vorgängig prüfen
is_leadAccount-Klassifikation / LeadstatusB ↔ SBusinessregel definieren
contact_group_idsTags / KlassifikationB ↔ SMany-to-many
contact_branch_idsBranche / SegmentB ↔ SLookup-Mapping
updated_atsource_updated_atB → MiddlewareGrundlage für Polling
Sage Änderungszeitsage_updated_atS → MiddlewareKonflikterkennung
technischer Hashpayload_hashinternVerhindert unnötige Updates

Zusätzliche Rollenfelder

Sage-FeldWerte
business_partner_rolesKunde, Lieferant, Interessent
is_customerBoolean
is_supplierBoolean
bexio_contact_typeFirma, Person
bexio_contact_idNumerische bexio-ID
bexio_contact_nrSichtbare bexio-Kontaktnummer

Feldzuordnung Bexio "Kontakte" ↔ Sage "Contacts"

bexio Kontakt vom Typ Person ↔ Sage Contact

bexio-FeldSage ContactRichtungBemerkung
idCustom Field bexio_contact_idB → STechnische Referenz
Sage Contact-IDMappingtabelleS → Middleware 
nrCustom Field bexio_contact_nrB ↔ SKeine technische ID
name_1lastNameB ↔ SZuordnung anhand effektiver bexio-Nutzung prüfen
name_2firstNameB ↔ SKann je Datenpflege umgekehrt verwendet sein
salutation_idsalutationB ↔ SLookup erforderlich
salutation_formCustom Field salutation_formB ↔ SOptional
title_idtitleB ↔ SLookup
birthdaybirthdayB ↔ SDatenschutz beachten
addressaddressB ↔ SPrivat- oder Geschäftsadresse
postcodepostalCodeB ↔ S 
citycityB ↔ S 
country_idcountryB ↔ SLookup
mailemailB ↔ SEmpfohlenes Dublettenmerkmal
mail_secondCustom Field email_secondaryB ↔ S 
phone_fixedphoneB ↔ S 
phone_fixed_secondCustom FieldB ↔ S 
phone_mobilemobilePhoneB ↔ S 
faxfax / Custom FieldB ↔ S 
skype_nameCustom FieldB ↔ SNur falls weiterhin relevant
remarkscomments / descriptionB ↔ SKonfliktregel notwendig
language_idlanguageB ↔ SLookup
FirmenrelationaccountIdB ↔ SÜber Kontaktbeziehung bestimmen
user_id / owner_idownerIdB ↔ SBenutzer-Mapping
contact_group_idsTags / KategorienB ↔ S 
updated_atMiddleware-SyncstatusB → intern 

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.

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

bexio AuftragSage SalesorderRichtungBemerkung
idCustom Field bexio_order_idB → STechnischer Schlüssel
Sage Salesorder-IDMappingtabelleS → intern 
document_nrorderNumberB ↔ SSichtbare Auftragsnummer
titlename / titleB ↔ S 
contact_idaccountIdB ↔ SÜber Kontaktmapping
contact_sub_idcontactIdB ↔ SAnsprechpartner
user_idownerIdB ↔ SBenutzer-Mapping
project_idprojectId / Custom FieldB ↔ SOptional
language_idlanguageB ↔ SLookup
currency_idcurrencyB ↔ SLookup, ISO-Code bevorzugen
payment_type_idpaymentTermsB ↔ SLookup
bank_account_idCustom FieldB ↔ SNur falls fachlich benötigt
DokumentdatumorderDateB ↔ SFeldname in bexio prüfen
is_valid_fromvalidFromB ↔ SOptional
is_valid_tovalidUntilB ↔ SOptional
headerheaderText / BeschreibungB ↔ S 
footerfooterText / BeschreibungB ↔ S 
contact_addressRechnungsadresseB ↔ SSnapshot des Dokuments
delivery_addressLieferadresseB ↔ S 
delivery_address_typeLieferadresstypB ↔ SLookup
total_netnetAmountB → SBerechnetes Feld möglichst nicht zurückschreiben
total_taxestaxAmountB → S 
total_grossgrossAmountB → S 
mwst_typetaxTypeB ↔ SLookup
mwst_is_netpricesIncludeTaxB ↔ SBoolean-Transformation
show_position_taxesCustom FieldB ↔ SDarstellungsinformation
kb_item_status_idstatusB ↔ SStatustabelle erforderlich
api_referenceexternalReferenceB ↔ SSehr gut für Integrationsreferenz geeignet
updated_atSyncstatusB → internPolling
Sage ÄnderungszeitSyncstatusS → internKonflikterkennung

Auftragspositionen

bexio PositionSage Salesorder LineRichtungBemerkung
Positions-IDexternalLineIdB → SMappingtabelle
amountquantityB ↔ S 
unit_idunitB ↔ SLookup
textdescriptionB ↔ S 
unit_priceunitPriceB ↔ S 
discount_in_percentdiscountPercentB ↔ S 
ArtikelreferenzproductId / articleIdB ↔ SNur mit Artikelmapping
Steuersatz-IDtaxRate / taxIdB ↔ SLookup
PositionssummelineTotalB → SBerechnetes Feld
Sortierungposition / sortOrderB ↔ S 
PositionstyplineTypeB ↔ SNormal, Titel, Zwischensumme, Text etc.

Feldzuordnung Bexio Rechnungen ↔Sage "Sales"

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

bexio RechnungSage SalesRichtungBemerkung
idCustom Field bexio_invoice_idB → STechnische Referenz
document_nrsaleNumber / invoiceNumberB → S 
titlename / titleB → S 
contact_idaccountIdB → SÜber Mapping
contact_sub_idcontactIdB → SAnsprechpartner
user_idownerIdB → SBenutzer-Mapping
project_idCustom Field / ProjektB → SOptional
currency_idcurrencyB → SLookup
language_idCustom FieldB → S 
RechnungsdatumsaleDate / invoiceDateB → S 
FälligkeitsdatumdueDateB → S 
payment_type_idpaymentTermsB → SLookup
headerdescription / Custom FieldB → S 
footerCustom FieldB → S 
total_netnetAmountB → S 
total_taxestaxAmountB → S 
total_grossgrossAmountB → S 
erhaltene ZahlungenpaidAmountB → SFalls Sales dies unterstützt
offener BetragopenAmountB → S 
RechnungsstatusstatusB → SEntwurf, offen, bezahlt, storniert
mwst_typetaxTypeB → S 
mwst_is_netpricesIncludeTaxB → S 
contact_addressRechnungsadresseB → SDokument-Snapshot
api_referenceexternalReferenceB → S 
updated_atSyncstatusB → intern 

Polling-Intervalle für alle Entitäten

EntitätEmpfehlung
Kontaktealle 5–15 Minuten
Aufträgealle 5 Minuten
Rechnungenalle 5–15 Minuten
Lookup-Datentäglich
vollständiger Abgleichnachts oder wöchentlich