Zum Ende der Metadaten springen
Zum Anfang der Metadaten

Sie zeigen eine alte Version dieser Seite an. Zeigen Sie die aktuelle Version an.

Unterschiede anzeigen Seitenhistorie anzeigen

« Vorherige Version anzeigen Version 95 Nächste Version anzeigen »

profacto bietet einen token-gesicherten Zugriff auf ausgewählte Tabellen und Felder mit sehr flexibler Architektur. Bei Wünschen für zusätzliche Tabellen, API-Sets oder als externer Entwickler sprich uns gerne an. 

Lizenz

  • Ein API-Access beinhaltet einen parallelen Zugriff je API-Token + IP-Adress-Kombination für ein Zeitfenster von 15 Minuten ab dem erstem Aufruf.
  • Jeder neue Aufruf innerhalb dieses Zeitfenster verlängert die Nutzungsphase dieses API-Accesses um weitere 15 Minuten.
  • Je profacto Lizenz (exkl. TZE-Clients) ist ein freier Zugriff bereits integriert. In profacto SmallBusiness ist die API für die Zeiterfassung und Integration (s.u.) reduziert - Sonderfall ist die Craftboxx-Anbindung.
  • Zusätzlich erhält jede profacto Lizenz (inkl. Small Business, StartUp) einen parallelen OTA-Integration Zugriff, der wie ein zweckbestimmter API-Zugriff ebenso berechnet wird.
  • Weitere API-Accesses (auch für die OTA-Integration) können ab profacto 2021 für profacto (exkl. StartUp) separat erworben werden. Bis dahin wird kein erweitertes Entgelt erhoben, selbst wenn man mehr Zugänge nutzen möchte.

Limitierung

Sobald man das Limit der Lizenzen erreicht, wird der Aufruf umgeleitet. Man erhält je nach Aufruf der eigentlichen Zielseite eine Webseite mit weiteren Infos

HTML

Am Beispiel erläutert

Links sieht man, daß für 

API

  • In Gebrauch 0 = aktuell keine API-Zugriffe gebraucht werden
  • Lizensiert 5 = Gesamte API-Zugriffe, die lizensiert sind
  • inklusive 3 = da es 3 profacto Lizenzen gibt
  • AddOn 2 = weil 2 zusätzliche API-Lizenzen freigeschaltet worden sind
  • Frei 5 = da 0 in Gebrauch sind, bleiben 5 freie parallele API-Zugriffe

OTA

  • In Gerbauch 0 = aktuell kein Zugriff über die OTA-Integration erfolgt ist
  • Lizensiert 3 = da es 3 profacto Lizenzen gibt 
  • Frei 3 = da 0 in Gebrauch sind, bleiben 3 freie parallele OTA-Zugriffe



oder eine JSON-Response:

{"error":"licenses_exceeded","url":"http://mumpitz:8080/4DAction/api_license_redirect?response=HTML","errorMsg":"Lizenzen für API oder OTA erschöpft, weitere Infos unter http://mumpitz:8080/4DAction/api_license_redirect?response=HTML","clients":3,"otaAvailable":3,"apiAvailable":5,"AddOnAPICalls":2,"otainUse":0,"apiInUse":1,"otatokenslots":[],"apitokenslots":[{"timestamp":5649041,"iptoken":"192.168.2.1038E39C4BA44C643BBAA78DE0B80DBE3D4"}]}

OTA-Integration

Die Over the Air-Integration mit einem CAD ist gesondert dokumentiert: CAD ERP Integration

API - Wieso, weshalb, warum?

Access Protocol Interface - oder einfach formuliert, eine Softwareschnittstelle mit einem einheitlichen Zugriffsprotokoll für alle. 

Im Gegensatz zu einfachen Datenimporten aus zB per Excel vorbereiteten .csv-Dateien, einem manuellen Export in .csv-Datein oder dem Zugriff per ODBC bietet das profacto API einen umfassend lesenden Zugriff, der keinen profacto Client voraussetzt und keinen profacto-Client (Stand 23.09.2019) oder eine ähnliche Lizenz benötigt. Zudem erlaubt der API-Zugriff, daß die Datenintegrität  innerhalb  der Anwendung gesichert ist.

Dafür aber einen durch einen selbst erzeugten Token einen gesicherten Zugriff von außen auf bestimmte Bereiche von profacto erlaubt, die man für bestimmte Aufgaben nunmal benötigt.

Der ODBC-Zugriff erlaubt hier ein zuviel an Zugriffsrechten und hat keine Option Inhalte zu schreiben oder ändern.  Zudem ist er beschränkt auf profacto Server-Installationen auf Windows und braucht zusätzliche Treiber-Updates.

CSV-Dateien müssen manuell erzeugt werden und erfordern eine Übertragung von Dateien, somit einen Speicherort. profacto API erfolgt über HTTP-GET-Aufrufe und liefert Daten im JSON-Format, welches sich insbesondere für Webseiten und Drittsoftware sehr einfach verarbeiten lässt.

Man kann die Daten mittels eines Standard-Browsers abrufen und sofort sehen. Man muß sich nicht im Firmennetzwerk bewegen.  Zugleich setzt die API ein tieferes technisches Verständnis von HTTP/REST-Zugriffen voraus und dient  in  erster Linie der Kommunikation von Anwendung zu Anwendung. 

Architektur

Im Kern setzt das API auf einem aufgaben- oder rollenbasierten Spektrum an Zugriffen, wie zB die Zeiterfassung oder die CAD-Integration (die künftig als Sonder-API im Bereich der Integration beschrieben wird).

Folgende APIs sind bereits zugänglich:

  • Integration
  • Zeiterfassung
  • Produktion
  • Kontakte
  • Kunden
  • Aktivitäten
  • Lieferanten
  • Projekte
  • Artikel
  • Personal
  • Lager
  • Bestellung
  • Dateien
  • API Pinger (Testzugriff)

Diese APIs befinden sich weiterhin im Aufbau, der sich nach aktuellen Anforderungen richtet.

Dazu gehört, daß man bestimmten Mitarbeitern (ein Personal-Datensatz ist Voraussetzung) ein Token gibt, mit dem der Zugriff gewährt, aber eben auch zeitlich limitiert oder entzogen werden kann. 

Zugriff

In den Voreinstellungen, profacto Administration werden die Tokens vergeben. 

Der Schlüssel öffnet die Token-Vergabe. 

Die WAN-Server-Adresse muß hinterlegt werden, um für die OTA-Integration eine spezielle Konfigurationsdatei zu erzeugen oder andere externe API-Zugriffe auf profacto zu ermöglichen.

Das eindeutige Token wird einer Personalnummer zugeordnet und danach der gewünschten API. Für diverse APIs muß man auch verschiedene Tokens erstellen. Standard ist eine Laufzeit von 5 Jahren, die email dient dazu es auch direkt übermitteln zu können.

Mittels Token wird zugleich identifiziert, welche API von wem aufgerufen wird.

Das Token kopieren Sie im Zweifelsfall einfach  heraus.

Aufruf

API-Basis = http://<Servername im LAN oder WAN |LAN oder WAN-IP|>:8080/4DAction/<api-Methode>?token=<Token>

Weil das darunter liegende Framework von Profacto Case-Insensitive ist verhält sich das auch so mit den API-Methoden bzw. Aufrufen.

Folgende API-Methoden stehen zur Verfügung:


api_getapilist (Alle API) - Gibt eine Liste der verfügbaren APIs der profacto Installation zurück

api_getmytokens (Alle API mit persönlichem Token) - Gibt eine List der APIs mit Token der aufrufenden Person (gemäß Token) zurück

api_getzeitmodell  (API Zeiterfassung) - liefert daß Zeitmodell von dem Mitarbeiter der dem Zeiterfassung-Token zugeordnet ist

api_cadtextures - (API Integration) - empfängt Texturnamen vom CAD

api_get (API diverse) - Daten aus der Datenbank lesen.

api_get_doccopybyid (API Projekte) - Gibt eine Datei bestimmt durch die id aus der Tabelle DokumentSeiten

api_get_filebyid - Gibt eine Datei bestimmt durch die id aus der Tabelle Alias

api_get_personaltokens - Liefert für die übergebene Personalnummer und ggf. API das notwendige Token

api_get_project_doccopylist (API Projekte)

api_get_project_filelist - Liefert eine Liste aller Dateien, die einem Projekt zugeordnet sind

api_get_qr - erlaubt URLs mit "/" statt "?", um aus der Tabellenkalkulation Daten abzurufen

api_getkunden -  Holt alle Kundendatensätze ab (veraltet - besser api_get benutzen)

api_getposdelta - Ermittelt die für das übergebene Projekt seit dem als zweiten Parameter gegebenen Zeitstempel erfolgten Änderungen an Projektpositionen

api_getproduction - Gibt eine Projektübersicht im HTML-Format wieder

api_license_redirect - Zeigt den Status der verfügbaren API & OTA Lizenzen an

api_newstockdemand - verarbeitet eine Artikel-UUID in einen Bestellvorschlag

api_partcncqrcode - gibt den QR-Code für ein CNC-Programm aus

api_partdone - Fortschrittsmeldung in einer Stückliste

api_partitem - Liefert eine Stückliste aus (ElementID)

api_partstation - Setzt den Status einer Stückliste und gibt ihn wieder

api_ping - Gibt eine einfache Response zurück, ob eine API verfügbar ist

api_productionposition - Liefert alle zugehörigen Stücklisten zu einem Projekt

api_put_activity (API Aktivitäten) - Schreibt eine Aktivität.

api_put_bestellpos (API Bestellung) - Schreibt eine Bestellposition.

api_put_bestellung (API Bestellung) - Erstellt eine Bestellung

api_put_contact (API Kontakte) - Schreibt einen Kontakt zu einem vorhandenden Kunden oder Lieferanten.

api_put_customer (API Kunden) - Schreibt einen Kundendatensatz.

api_put_employee (API Personal) - Schreibt einen Personaldatensatz.

api_put_item (API Artikel) - Schreibt einen Artikeldatensatz.

api_put_project (Alle API) - Projekt anlegen.

api_put_projectpos - Schreiben einer Projektposition

api_put_supplier (API Lieferanten - Schreibt einen Lieferantendatensatz.

api_put_time (API Zeiterfassung)- Schreibt einen Zeitdatensatz.

api_qasignature - Speichert eine digitale Unterschrift oder liefert sie aus

api_sandbox - Gibt eine HTML-Seite wieder zur Verwendung des Proglove Handschuhs

api_stornostockdemand - Lagerbestellungen stornieren

api_time_getday - Liefert alle gebuchten Zeiten für gegebenen Tag für gegebenen Mitarbeiter aus

api_time_getpositions (API Zeiterfassung) - liefert zu gegebenem Projekt die Positionen

api_time_start (API Zeiterfassung) - Startet einen Zeiterfassungsvorgang im Browser - Kern der WebZE


OTA-Integration

Für die OTA-Integration bitte die Integrations-Dokumentation nach öffentlichem Release lesen.

http://<Servername im LAN oder WAN |LAN oder WAN-IP|>:8080/4DAction/api_get?token=<Token>

Der Port 8080 ist hart vorgegeben und darf nicht geändert werden.

Tabellen und Feld-Namen

Die Namen aller Tabellen und Felder in profacto können hier eingesehen werden

Link: Datenbankstruktur

Die APIs haben jeweils auch Felder, die nicht unterstützt werden, insbesondere BLOB- und Bild-Felder, aber auch unzulässige Felder. So braucht man für Zeiterfassung bestimmte Personal-Informationen, jedoch nicht das Gehalt oder andere private Informationen.

Für verschiedene Szenarien kann es daher sein, daß ein Aufruf abgelehnt wird, wenn man unzulässige Felder verwendet hat.

Daten  lesen mit api_get

API-Basis = http://<Servername im LAN oder WAN |LAN oder WAN-IP|>:8080/4DAction/api_get?token=<Token>

weitere Parameter:

table = je nach API eine darin zulässige Tabelle  - Beispiel API-Basis&table=Ansprechpartner

fields = eine kommagetrennte Liste von auszugebenden Feldern der Standardtabelle des APIs oder der per table-Parameters gewünschten Tabelle - Beispiel API-Basis&fields=KundenNr,Ort,PLZ,Name1

query = Ein query-String, der per URL-Encoding mit Prozentzeichen übergeben werden muss, also zB %20  für ein Leerzeichen, etc. siehe hier in Wikipedia: https://de.wikipedia.org/wiki/URL-Encoding#Relevante_ASCII-Zeichen_in_Prozentdarstellung - Beispiel 

API-Basis&query=KundenNr%3D131%20AND%20Ort%3DHildesheim

  (entspricht KundenNr=131 AND Ort=Hildesheim)

Vollständiges Beispiel: 

http://meinServer:8080/4DAction/api_get?token=124&table=Ansprechpartner&fields=Anrede,Geschlecht,Name,VorName,email,Telefon,MobilTel,isInaktiv,Suchfeld1&query=TypNr%3D131

Operatoren

Für eine Übersicht der query-Syntax bitte folgende Darstellung verwenden (Übersetzung folgt).

  • Symbole zum Vergleichen von Attribut und Value. Es gibt folgende Symbole:

    VergleichSymbol(e)Kommentar
    Ist gleich=, ==Erhält passende Daten, unterstützt den Joker @, berücksichtigt weder Groß- und Kleinschreibung noch diakritische Zeichen.

    ===, ISErhält passende Daten, bewertet @ als Standardzeichen und nicht als Joker, berücksichtigt weder Groß- und Kleinschreibung noch diakritische Zeichen.
    Ungleich zu#, !=unterstützt den Joker (@)

    !==, IS NOTbewertet @ als Standardzeichen und nicht als Joker
    Kleiner als<
    Größer als>
    Kleiner als oder gleich<=
    Größer als oder gleich>=
    Enthalten inINErhält Daten, die mit mindestens einem Wert in einer Collection bzw. einem Satz Werte übereinstimmt
    Nicht enthalten in einer AnweisungNOTKlammern sind zwingend, wenn NOT vor einer Anweisung mit mehreren Operatoren verwendet wird
    Enthält Schlüsselwort%Schlüsselwörter lassen sich in Attributen vom Typ String oder Bild verwenden
  • Value: Wert zum Vergleichen mit dem aktuellen Wert der Eigenschaft. 
    Für eine Suche nach einem String innerhalb eines anderen String (eine Suche "Enthalten in") verwenden Sie den Joker (@) in value, um den zu suchenden String zu isolieren, zum Beispiel: "@Smith@".
    Für numerische Werte dient Punkt als Dezimaltrenner. Datumsangeben müssen im Format "YYYY-MM-DD" sein.
    Bei einer Suche mit einem IN Vergleichsoperator muss value eine Collection sein bzw. Werte, die zum Typ des Attributspfads zwischen eckigen Klammern [] passen, getrennt durch Kommas (bei Strings müssen Anführungszeichen " mit "\" abschließen).
  • LogicalOperator: verbindet mehrere Bedingungen in der Suche (optional). Es gibt folgende logische Operatoren (Sie können Name oder Symbol übergeben):

    KonjunktionSymbol(e)
    AND&, &&, and
    OR|, ||, or
  • order by Attribut: Sie können eine Anweisung order by Attribute in der Suche hinzufügen, so dass die Ergebniswerte sortiert werden. Sie können mehrere Sortieranweisungen, durch Komma getrennt, verwenden, (z.B. order by Attribut1 desc, Attribut2 asc). Die Sortierung ist standardmäßig aufsteigend. Übergeben Sie 'desc' für absteigende Reihenfolge und 'asc' für aufsteigende Reihenfolge 

Die Tabellen- und Feldnamen für table und fields müssen nicht exakt der Groß-Kleinschreibung der Struktur folgen, für query ist dies jedoch zwingend.

Ausgabe der Daten

Die Daten werden als JSON-String zurückgegeben. 

Dazu gibt es stets initiale Objekte: Error, success, errorType und der aufgerufene Tabellenname.

Im Error steht  - möglichst menschenfreundlich in einem Satz formuliert - welche Fehler es gab. Gab es keine Fehler, enthält das Feld eine leere Kette.

In dem Objekt success steckt eine boolesche Variable mit true oder false, die bestimmt, ob der api_get Aufruf  erfolgreich war.

In dem Objekt errorType steht (falls es einen Fehler gab) ein oder mehrere Schlüsselwörter, die den Fehler beschreiben.

Danach kommen die eigentlichen Daten im Format Feldname:Feldinhalt.

Das sieht bei einem Aufruf mit einem nicht vorhandenen Quatschfeld wie folgt aus:

http://meinserver:8080/4DAction/api_get?token=5E05A427CD134432A28F2DAF11EC500E&table=Kunden&fields=KundenNr,Quatschfeld

JSON-Response:

{"Error":["Das Feld Quatschfeld ist nicht vorhanden."],"Kunden":[{"KundenNr":"100001"},{"KundenNr":"100019"},{"KundenNr":"100003"},{"KundenNr":"131"},{"KundenNr":"130"},{"KundenNr":"129"},{"KundenNr":"128"},{"KundenNr":"127"},{"KundenNr":"125"},{"KundenNr":"124"},{"KundenNr":"123"},{"KundenNr":"100018"},{"KundenNr":"100015"},{"KundenNr":"1000012"},{"KundenNr":"126"},{"KundenNr":"100013"},{"KundenNr":"100009"},{"KundenNr":"100008"},{"KundenNr":"100012"},{"KundenNr":"100006"},{"KundenNr":"100005"},{"KundenNr":"100003"},{"KundenNr":"100004"},{"KundenNr":"100002"}]}

Man sieht, daß trotzdem alle zulässigen Felder unterstützt werden, die Abfrage deswegen nicht komplett scheitert.

Beispiel api_get mit Bestellungen

Um sich alle Bestellungen abzuholen benötigt man einen Token für Bestellungen, die Tabelle Bestellungen und die auszugebenden Felder.

http://meinserver:8080/4DAction/api_get?token=C900BFE22DFF4B75917837006E247932&table=Bestellung&fields=BestellNr,Kurzbez,Bestelldatum,Bemerkung

Als Resultat erhält man alle Bestellungen die mit dem Token zugänglich sind:

"{"Error":[],"Bestellung":[{"BestellNr":130001,"Kurzbez":"WHG-Ahmerkamp GmbH - Warendorf","Bestelldatum":"0000-00-00","Bemerkung":""},{"BestellNr":130002,"Kurzbez":"Holzma - Calw-Holzbronn","Bestelldatum":"2015-07-08","Bemerkung":"\\rNeues Bauabnahmedatum: 07.07.15"}],"error":"finished"}"

Standard-Felder für die Tabelle "Bestellung" (Werden keine Felder angegeben, werden die Folgenden automatisch als Abruf-Felder bestimmt)

BestellNr, Bestelldatum, AuftragsNr

Verbotene Felder für das Abrufen der Tabelle "Bestellung"

PKUUID_104

Beispiel api_get mit Bestellpositionen

Das vorher gegangene Beispiel mit den Bestellungen nutzen wir um die Bestellpositionen für eine Bestellung abzurufen.

Dafür müssen wir den Parameter query dem API-Aufruf mitgeben. An dieser Stelle möchten wir alle Bestellpositionen für die Bestellung mit der BestellNr. 130076 abrufen.

Wir ändern die Tabelle auf BestellPos und suchen uns die entsprechenden Felder die wir in unserer Response ausgegeben bekommen möchten (e.g. BestellNr, ArtikelNr,Bestellmenge).

http://meinserver:8080/4DAction/api_get?token=C900BFE22DFF4B75917837006E247932&query=BestellNr=130076&table=BestellPos&fields=BestellNr,ArtikelNr,BestellMenge

Wir erhalten die dazugehörigen Positionen in einem JSON-Objekt:

{"Error":[],"BestellPos":[{"BestellNr":130076,"ArtikelNr":"KF-AH-19","BestellMenge":32},{"BestellNr":130076,"ArtikelNr":"KF-AH-19","BestellMenge":2}],"error":"finished"}

Standard-Felder für die Tabelle "BestellPos" (Werden keine Felder angegeben, werden die Folgenden automatisch als Abruf-Felder bestimmt)

BestellNr, ArtikelNr, LfdNr

Neue Daten schreiben mit api_put_*

API-Basis = http://<Servername im LAN oder WAN |LAN oder WAN-IP|>:8080/4DAction/api_put_<areaname>

weitere Parameter:

update - Werte: True oder False. Regelt, ob ein vorhandener Datensatz aktualisiert werden soll oder nicht. Bei Neuanlage kann dieses Flag weggelassen werden.

response - Werte: HTML oder JSON. Regelt, ob die Rückmeldung als HTML-Seite oder als JSON-Objekt erfolgen soll. Lassen Sie dieses Flag weg, wird JSON rückgeliefert.

Ausgeschlossene Parameter:

host - Dieser Parameter wird intern verwendet und kann nicht übergeben werden

Die obigen Angaben gelten für alle api_put_*-Aufrufe bis auf api_put_time, das einen Sonderstatus einnimmt.

Für die verschiedenen put-Befehle wird auf jeweils eine Tabelle schreibend zugriffen. Bestimmte Felder dürfen nicht geschrieben werden, dies ist unten in der Dokumentation jeweils aufgeführt.

Beispiel Templates (api_put_*)

Wir haben für das Testen der API-Methoden ein kleines Template-Paket auf GitHub bereitgestellt, ebenso stehen die Templates auch als Zip-Datei zur Verfügung.

Zum schnellen Ausprobieren der Methode api_put_customer in der Kunden-API und der Methode api_put_project in der Projekt-API haben wir auf unserem ftp-Server Templates zugänglich gemacht.

Verhalten bei gesperrten Datensätzen

Versuchen Sie mit einem api_put_* Aufruf Daten zu verändern die gerade in Profacto geöffnet sind schlägt der Aufruf fehl.

Daraufhin wird eine Response zurückgegeben die das ganz klar kommuniziert und ermöglicht automatisiert auf solche Situationen einzugehen.

Beispiel einer entsprechenden Response:

{"success":false,"error":"Datensatz der Tabelle Kunden mit Schlüssel KundenNr:100019 ist gesperrt und kann nicht geschrieben werden.","processingTime":7575,"errorMsg":"Datensatz der Tabelle Kunden mit Schlüssel KundenNr:100019 ist gesperrt und kann nicht geschrieben werden."}




  • Keine Stichwörter