OCT-Datenintegration

REWE Modell mit DATEVconnect per WepAPI Step


Kurzanleitung für die Einrichtung des REWE Modells mit DATEVconnect Anbindung über WebAPI, funktioniert sowohl über Riecken in der Cloud, als auch on-premises.

Diese Anleitung bezieht sich auf OCT v2026.07 mit WebAPI Step - diese Lösung ist noch im BETA Stadium.

Voraussetzung

  • Ihnen liegen Benutzername und Kennwort für den Zugriff auf die DATEVconnect API Zugriff vor.

    • on-premises: Windows Benutzer

    • Cloud: Benutzername und Passwort für Riecken Gateway

Installation von OCT

  • OCT Datenbank an beliebigem Ort bereitstellen, Version 2026.07 (🔒 sxProzess)

Einrichtung der OCT Datenbank für die DATEVconnect Staging Daten

  • Über die Modulverwaltung das Modul GATEWAY-DATEVCONNECT-WEBAPI vom Contentserver herunterladen und einspielen. Dieses Modul erstellt:

    • Die Pipeline GWDC

    • Das Product GWDC in der Pipeline GWDC in der Factory VGW

    • Tabellen / Views im staging Schema

  • Im Bereich Datenflüsse → Datenquellen eine neue Datenquelle über das + Symbol hinzufügen

    • Quellsystemtyp Web API Authentifizierung auswählen, Einrichtung starten klicken

    • bei Datenquellen-ID “DATEV” eingeben

    • Name der DatenquellenID kann frei vergeben werden

    • Benutzername: den Benutzernamen des Riecken-Zugangs eingeben

    • Passwort: das Passwort des Riecken-Zugangs eingeben

Bearbeiten des Konfigurationsprodukts

Im Bereich Datenerfassung unter Validierung Gateways → Gateway DATEVconnect das Produkt Konfiguration Gateway DATEVconnect öffnen:

Konfiguration_Gateway_DATEVconnect.png

Spalte

Erklärung

Ist aktiviert

Ja (diese Zeile wird für den Aufbau der Steuerungstabelle berücksichtigt)

Nein (diese Zeile wird für den Aufbau der Steuerungstabelle nicht berücksichtigt)

DatenquellenID

DatenquellenID, die allen Daten der Mandanten/Wirtschaftsjahren aus dieser Zeile zugeordnet wird. Standardwert: DATEV. Sollte nur in Sonderfällen geändert werden.

API-URL

Die Basis-URL zur DATEVconnect Schnittstelle. Bei Riecken-CloudGateway: https://api.cloudgateway.riecken.io/datev/api/accounting/v1

Datev Client-ID

Filtermöglichkeit über die DATEV Mandanten-/Unternehmensnummer. Wenn dieses Feld leer ist, werden alle über die Zugangsdaten verfügbaren Mandanten in die Steuerungstabelle übertragen. Falls der Abruf auf bestimmte Mandantennummern eingeschränkt werden soll, können diese hier angegeben werden. (Format kommasepariert: 55004, 55001)

Startjahr(Fiscal_Year_ID)

Filter der ein Startjahr für die Steuerungstabelle festlegt. Format entspricht der FiscalYearID in DATEV: YYYYMMDD. Beispiel: 20250101 übernimmt nur Wirtschaftsjahre ab 2025 in die Steuerungstabelle.

Konfiguration der Pipeline GWDC

  • Deaktivieren Sie alle Pipelinesteps außer den ersten vier.

  • Pipeline ausführen → dadurch erhält man die Liste der Mandanten mit ihren Geschäftsjahren

  • Ergebnis im Validierungstab “Steuerungstabelle” der Productline GWDC anschauen und über die abzurufenden Mandanten entscheiden.

  • OPTIONAL: Relevante Mandanten, Datenbestände und Jahre im Step “Steuerungstabelle: Mandanten für den Datenabruf aktivieren” der Pipeline aktivieren. (Im Standard benutzt dieser Step einen globalen Parameter “G_DatenquellenID” über den die passenden Mandanten der Steuerungstabelle gefiltert werden. Die DatenquellenID(s) können hier im Step aber auch direkt hinterlegt werden.)
    Standardmäßig ist das Gateway bereits eingeschränkt, hier kann eine weitere Filterung erfolgen

grafik-20260702-153417.png
  • Reaktivieren Sie alle Steps außer der KOST, und AV Abrufe (falls die KOST und AV-Daten benötigt werden und im DATEVconnect verfügbar sind können diese auch aktiviert und mit abgerufen werden, ansonsten sollten diese Steps deaktiviert werden.)
    Die Steps sind jeweils so benannt, dass Sie die Zugehörigkeit zu KOST, OP oder AV am Namen erkennen.

  • Pipeline ausführen

  • Daten in den Tabs Finanzbuchhaltung / Kostenrechnung der Productline GWDC validieren.

Mit dem Staging der DATEV Daten ist man jetzt fertig - es folgt die Standardeinrichtung des REWE Modells

Einrichtung der OCT Datenbank für das REWE Modell

  • REWE Modul und Konnektor einspielen

    • REWE Modell incl. Modellierung über die OCT Modulverwaltung einspielen (Modul “REWE Basismodell mit Modellierung”) → erstellt die integration.tREWE* und result.tREWE* Tabellen + Views etc. und die Pipeline RESULTLOAD, erweitert Pipeline TRUNCATE und ATR

    • Konnektor über die OCT Modulverwaltung einspielen (Modul “REWE-KONNEKTOR-GATEWAY-DATEVCONNECT”) → erstellt die Pipeline GWDC_REWE

  • Modellierung einrichten

    • In TAB “GWDC” die Steuerungstabelle erneut prüfen und sich die dort eingesetzten Kontenrahmen. Der eingesetzte Kontenrahmen steht informativ hinter dem Geschäftsjahr.

    • In der Factory “Modellierung (M)”

      • aus der Produktline “Templates Modellierung (TM)” das Produkt “HGB Struktur” in die Produktline “Strukturen (MS)” kopieren (per Drag & Drop)

      • jeden benötigten Kontenrahmen aus Produktline “Templates Modellierung (TM)” in Produktline “Zuordnungen (MZ)” kopieren (per Drag & Drop)

    • Pipeline MODEL ausführen

  • Pipeline “GWDC_REWE” für Konnektor konfigurieren

    • Die Konfiguration muss nicht angepasst werden, die Pipeline wird einfach ausgeführt. → Diese Pipeline holt die Daten aus staging* nach integration*. Das Ergebnis kann in den Validierungstabellen der Produktline analysiert werden.

  • Pipeline REWELOAD

    • Die Konfiguration muss nicht angepasst werden, die Pipeline wird einfach ausgeführt. → Diese Pipeline holt die Daten aus integration* nach result*. Das Ergebnis kann in den Validierungstabellen der Produktline analysiert werden.

Optionale Komponenten

  • Modul “REWE-ADDON-CORPORATE-PLANNER” und “REWE-ADDON-BUCHUNGSKREISMAPPING” einspielen Doku → Dieses bereitet die Daten aus result* für CP auf. Das Ergebnis kann in den Validierungstabellen der Produktline analysiert werden.

  • Modul “REWE für Bissantz DeltaMaster” einspielen → dieses bereitet die Daten aus result* für DeltaMaster auf. Das Ergebnis kann in den Validierungstabellen der Produktline analysiert werden.

Abschließende Einstellungen

  • Sobald Ihre Konfiguration abgeschlossen ist, werden die Pipelines automatisiert.

  • Sie können die Pipelines in einen individuellen Ausführungsplan aufnehmen. Verwenden Sie hierfür die Bearbeiten-Option (Stift Symbol) für jede Pipeline und planen Sie deren Ausführung.

  • Alternativ können Sie eine weitere Pipeline zur gruppierten Ausführung anlegen. Erstellen Sie eine neue Pipeline und wählen den Step-Typ “Pipeline ausführen” im Bereich “Interne Funktion”.

image-20260724-092059.png
  • Erstellen Sie je einen Step für die benötigten Pipelines. Erstellen Sie nun für diese Pipelinegruppe einen Ausführungsplan.

Zusatzinformationen für Experten

Funktion des Riecken Gateways über ein Python Script testen

Das Riecken Gateway kann über ein Python Script getestet werden.

Testscript für Riecken Gateway
Python

# Source: logikrepo-datev/src/main/Gateways/DATEVconnect/Entwicklung/Komponenten/Testabruf_Clients_Riecken.py
# Testscript für die Riecken Web API 
# Zuletzt modifiziert: 04/2026 - Gerd Tautenhahn für Saxess Software GmbH
# es wird testweise die Liste der clients (Mandanten abgerufen)
# bei erfolgreichem Aufruf erscheint ein JSON Objekt mit Mandantennamen und Nummern
# vom ersten Mandanten werden die Buchungen der Konten 1000 bis 2000 abgerufen, um zu testen um die Lizenz für Kontobuchungen vorhanden ist

import requests
from requests.auth import HTTPBasicAuth
from urllib.parse import quote
import json

username    = 'xxxxx-xxxxx-xxxxx-xxxxx'
password    = 'yyyy-yyyy-yyyy-yyyyy'
base_url    = 'https://api.cloudgateway.riecken.io/datev/api/accounting/v1'
url_clients = f'{base_url}/clients'
# url_clients = 'https://datevconnect.riecken-webservices.at/datev/api/accounting/v1/clients' -- alte URL Route


# ---------------------------------------------------------------
# 1. Abruf: Liste der Clients (Mandanten)
# ---------------------------------------------------------------
print("=" * 60)
print("1. Abruf: Clients (Mandanten)")
print("=" * 60)

response = requests.get(
    url_clients,
    auth=HTTPBasicAuth(username, password)
)
print(f"Status Code: {response.status_code}")
clients_data = response.json()
print(json.dumps(clients_data, indent=2, ensure_ascii=False))

# ---------------------------------------------------------------
# 2. Abruf: Buchungen (Account Postings) für den ersten Client
# ---------------------------------------------------------------
print()
print("=" * 60)
print("2. Abruf: Buchungen (Account Postings) für ersten Client")
print("=" * 60)

# client_id aus dem ersten Eintrag der zurückgegebenen Liste extrahieren
# Antwortformat: Liste von Objekten, jedes mit einem "id"-Feld
try:
    if isinstance(clients_data, list):
        clients_list = clients_data
    elif isinstance(clients_data, dict):
        # Falls die Liste unter einem Schlüssel wie "data" oder "value" liegt
        clients_list = clients_data.get('data') or clients_data.get('value') or []
    else:
        clients_list = []

    if not clients_list:
        raise ValueError("Keine Clients in der Antwort gefunden.")

    first_client = clients_list[0]
    client_id    = first_client.get('id') or first_client.get('client_id')
    client_name  = first_client.get('name', '(unbekannt)')

    if not client_id:
        raise ValueError(f"Kein 'id' oder 'client_id' Feld im ersten Client gefunden: {first_client}")

    print(f"Verwende Client: {client_name} (ID: {client_id})")

    # Buchungsabruf: Konten 1000–2000 (8-stellige Kontonummern: 10000000–20000000)
    fiscal_year   = '20250101'
    account_from  = 10000000   # entspricht Konto 1000 (8-stellig)
    account_to    = 20000000   # entspricht Konto 2000 (8-stellig)
    filter_param  = f'account_number ge {account_from} and account_number le {account_to}'

    url_postings = f'{base_url}/clients/{client_id}/fiscal-years/{fiscal_year}/account-postings'

    print(f"Basis-URL: {url_postings}")
    print(f"Filter:    {filter_param}")
    print()

    # Filter-Parameter manuell mit %20 kodieren (nicht + wie bei params=)
    url_postings_with_filter = f'{url_postings}?filter={quote(filter_param)}'

    response2 = requests.get(
        url_postings_with_filter,
        auth=HTTPBasicAuth(username, password)
    )
    print(f"Tatsächlich gesendete URL: {response2.request.url}")
    print(f"Status Code: {response2.status_code}")
    postings_data = response2.json()
    print(json.dumps(postings_data, indent=2, ensure_ascii=False))

except (IndexError, KeyError, ValueError) as e:
    print(f"Fehler beim Verarbeiten der Clients-Antwort: {e}")

Last updated: