API-Spezifikationen
Für die Nutzung der CAD-ERP-Integration mittels OTA werden hier das Datenmodell, die API-Aufrufe und die möglichen Befehle zusammen gestellt.
Als Basis muß profacto-seitig die Integration eingerichtet sein, für die Anbindung von interiorcad müssen die entsprechenden REST-Befehle wie hier beschrieben aufrufbar sein.
Implementierung in einem CAD
Folgende Kommandos werden verwendet, um Artikel, Projekte, Positionen abzuholen und die Stückliste zurückzuschreiben.
Das Grundschema hierbei ist analog zur profacto API-Dokumentation:
API-Basis = http://<Servername im LAN oder WAN |LAN oder WAN-IP|>:8080/4DAction/
API-Basis + Methode + Token = http://<Servername im LAN oder WAN |LAN oder WAN-IP|>:8080/4DAction/<api-Methode>?token=<Token>
profacto-seitig ist der Port 8080 und der URL-Pfad-Abschnitt 4DAction fest vorgegeben.
Feldtypen
Kürzel | Typ | Länge | Beschreibung | Beispiel |
---|---|---|---|---|
R | Real | klassische Fließkommazahl | 1367.986906707692242 | |
I | Integer | 32-bit | Ganzzahl | 19 |
A | Alpha | max. 255 | alphanumerisch mit fester Länge | Münster |
T | Text | max. 32000 | freier Text | Design in Wood - Münster |
B | Boolean | 1 | 1 = true und 0 = False | true |
D | Date | Datum mit Zeit | 0000-00-00T00:00:00.000Z 2020-04-27T09:33:48 | |
U | UUID | 32 | im Format mit geschweifter Klammer | {ABCD1234DEFG5678HIJK9012LMNO3456} {71E4C376-4C22-46B3-85C7-346292964D0B} |
O | Object | JSON Object |
Status
Speziell von profacto ausgehend kann man mit dem gegeben Token mittels eines Pings zum Server,
API-Basis/api_ping?token=<Token>
sehen, ob der Server überhaupt erreichbar ist und profacto-seitig die OTA-Integration aktiv.
Ein positives Ergebnis ist zB
{"restapi":"restintegration_active","theapi":"api_unknown","result":{"valid":true,"itemsync":true,"integration":true,"httpcode":"200","api":"Integration","personalnr":"10"}}
Ab profacto 2022.0.0 gibt es eine verbesserte und vereinfachte Steuerung:
API-Basis/api_get_integration?token=<Token>
Liefert mit dem attribut "active" per true/false zurück, ob die Integration in profacto überhaupt aktiviert ist.
API-Basis/api_put_integration?token=<Token>&active=true|false
Steuert ggf. die Integration für alle Anwender und gibt per success-Attribut zurück, ob eine Steuerung möglich war (wenn der Zugriff auf die Voreinstellung in profacto anderweitig vergeben ist, kann nicht gespeichert werden) und wie der Status nach der Ausfürhung ist.
Artikel
Um Artikel aus profacto zu holen gelten dieselben Regeln wie mit der klassischen SQLite-basierten Schnittstelle für den Artikelstamm.
Es werden Platten, Kanten, Beläge und Beschichtungen transferiert, keine Beschläge oder Fertigmöbel, Einbaugeräte, etc.
Gelöschte Artikeldaten
API-Befehl
Methode | Typ | Beispiel |
---|---|---|
ART_ICR_SendItems | GET | API-Basis/ART_ICR_SendItems?token=<Token>&checkutc=<date_time> |
Parameter
Name | Typ | Länge | Bemerkung | Beispiel |
---|---|---|---|---|
token | A | 32 | obligatorisch für profacto | 78F146AB85164846A60C14335B29E5AB |
checkutc | D | optional, um nur dann den Artikelstamm zu erhalten, wenn dieser erneuert wurde (immer vollständig) | 2020-04-27T09:33:48 |
Response
Attribut | Typ | Länge | Beschreibung |
---|---|---|---|
error | A | zB "no_items" wenn keine neuen Artikel vorhanden sind | |
itemno | A | 20 | Artikelnr / Artikeltypennr |
description | T | Bezeichunung | |
comment | T | Kommentar | |
shortdesc | A | 40 | Kurzbezeichnung |
itemgroup | A | 20 | Artikelgruppe |
itemtype | A | 20 | Artikeltyp Platte = 0 |
materialclass | A | 20 | Materialgruppe zur Gruppierug gleichartiger Materialien |
type | A | 20 | Materialtyp Veneer = veneer |
included_covering1_thickness | R | Belag-Materialstärke in mm | |
included_covering2_thickness | R | Belag-Materialstärke in mm | |
included_covering1_texture | A | 40 | Texturname des 1. Dekors bei Platten |
included_covering2_texture | A | 40 | Texturname des 2. Dekors bei Platten |
length | R | Länge in mm | |
width | R | Breite in mm | |
thickness | R | Stärke in mm | |
consumptionpersqm | R | Verbrauch pro Quadratmeter | |
uom | A | 10 | Mengeneinheit kalkulatorisch |
purchaseprice | R | EK // Einkaufspreis | |
calcprice | R | KK // Selbstkosten | |
salesprice | R | VK(1) // Verkaufspreis | |
texturename | A | 40 | Texturname des Trägermaterials bei Platten |
picturelink | T | Link zur Bilddatei (nicht in profacto implementiert) | |
waste | R | Verschnitt in % | |
supplierid | A | 12 | Lieferantennummer im ERP |
suppliername | A | 80 | ERP-Bezeichnung des Lieferanten |
supplierorderno | A | 40 | Bestellnummer beim Lieferanten |
Projekte
Um die Projekte bzw. Aufträge aus dem ERP zu holen gibt es einen Befehl
API-Befehl
Methode | Typ | Beispiel |
---|---|---|
Auf_ICR_SendAll | GET | API-Basis/Auf_ICR_SendAll?token=<Token> |
Parameter
Name | Typ | Länge | Bemerkung | Beispiel |
---|---|---|---|---|
token | A | 32 | obligatorisch für profacto | 78F146AB85164846A60C14335B29E5AB |
projectnr | A | 12 | optional, um nur ein Projekt zu holen. | M059 |
Response
Attribut | (Projekt-Element) | Attribut | Typ | Länge | |
---|---|---|---|---|---|
Projects | |||||
(0) | |||||
projectno | A | 12 | Projekt-Nr | ||
projectname | T | Kommission | |||
description | T | Bauvorhaben | |||
deliverydate | D | Fixtermin | |||
deliveryweek | I | Liefer-Kalenderwoche | |||
deliveryyear | I | Lieferwochenjahr | |||
customerno | A | 12 | Kundennummer | ||
name1 | A | 60 | Firmenname 1 | ||
name2 | A | 60 | Firmenname 2 | ||
street | A | 60 | Straße | ||
postalcode | A | 10 | PLZ | ||
city | A | 60 | Ort | ||
contrycode | A | 10 | Land | ||
projectfolderpath | T | Projektordnerpfad | |||
manager | A | 64 | Sachbearbeiter/Vertreter als Personalnr | ||
salutation | A | 64 | Anrede | ||
firstname | A | 64 | Vorname Ansprechpartner | ||
lastname | A | 64 | Nachname Ansprechpartner | ||
projectstate | A | 64 | Projektstatus | ||
engineername | A | 64 | Arbeitsvorbereiter - Name | ||
managername | A | 64 | Vertreter/Sachbearbeiter - Name | ||
procstate | I | (veraltet) | |||
procstateid | I | Prozessstatus | |||
projectstateid | I | Projektstatus | |||
creationyear | I | Jahr der Erstellung des Projekts | |||
creationdate | D | Erstellungsdatum des Projekts | |||
(1) |
Positionen
Positionen zu eine Projekt werden entweder generell abgeholt (beim ersten Aufruf zu einem Projekt) und danach gilt es die Veränderungen nachzuvollziehen, wenn zB Positionsnummern geändert werden.
Beispiel, welche Aktionen möglich sind, und wie diese abgefangen werden können:
Orignal-Position | Änderung | Aktuelle Position |
---|---|---|
P1 - Schrank | Text ändert sich | P1 - Regal |
P2 - Tisch | wird gelöscht | |
P3 - Kommode | Positionsnummer auf 2 ändern | P2 - Kommode |
API-Befehl
Methode | Typ | Beispiel |
---|---|---|
Pos_ICR_SendPositions | GET | API-Basis/Pos_ICR_SendPositions?token=<Token>&project=<projectnr> |
Parameter
Name | Typ | Länge | Bemerkung | Beispiel |
---|---|---|---|---|
token | A | 32 | obligatorisch für profacto | 78F146AB85164846A60C14335B29E5AB |
project | A | 12 | notwendig | M059 |
Response
Attribut | (Position-Element) | Attribut | Typ | Länge | |
---|---|---|---|---|---|
Positions | |||||
(0) | |||||
projectno | A | 12 | Projekt-Nr | ||
positionno | R | Positions-Nr | |||
quantity | R | Anzahl | |||
itemno | A | 20 | Artikel-Nr | ||
description | T | Bezeichnung | |||
itemgroup | A | 20 | Artikelgruppe | ||
length | R | ||||
width | R | ||||
thickness | R | ||||
purchasepriceunit | R | ||||
calcpriceunit | R | ||||
salespriceunit | R | ||||
purchasepricetotal | R | ||||
calcpricetotal | R | ||||
salespricetotal | R | ||||
posUUID | A | 32 | |||
(1) |
API-Befehl
Methode | Typ | Beispiel |
---|---|---|
api_getposdelta | GET | API-Basis/api_getposdelta?token=<Token>&projectnr=<projectid>&sinceutc=<date_time> |
Parameter
Name | Typ | Länge | Bemerkung | Beispiel |
---|---|---|---|---|
token | A | 32 | obligatorisch für profacto | 78F146AB85164846A60C14335B29E5AB |
projectnr | A | 12 | notwendig | M059 |
sinceutc | D | notwendig um das Delta auf die relevanten Änderungen zu begrenzen | 2020-04-27T09:33:48 |
Beispiel-Response
{ "deltas": [ { "2020-04-29T14:23:44": { "PositionID": "6E7093EDD578488D8E5A7895BDC738AD", "CurrentPosNr": 1, "Description": "Infomaterial Display X\r\rHochglanz weiß gemäß Entwurfskizze von Mies van der Rohe\r6 Flyerfäche\r4 Zeitschriften", "OldPosNr": 1, "Event": "Position_changed" } }, { "2020-04-29T14:23:55": { "PositionID": "AED06E22B90A492B8A85B59CD3CBE6FF", "CurrentPosNr": 14, "Description": "Videopräsentation und Wartebereich\r\rBank in L-Form\rProjektionsfläche mit Lautsprechern\rBeamerverkleidung an der Decke\r\r", "OldPosNr": 4, "Event": "Position_number_changed" } }, { "2020-04-29T14:24:00": { "PositionID": "B09B61BAB7924ABCAEF19A172B84F9E7", "CurrentPosNr": 6, "Description": "Garderobe\r\rTheke in mausgrau\r\rTaschenaufbewahrung\rSchirmständer\rSchließfächer\rGarderobensystem von alfa3 integriert", "OldPosNr": 6, "Event": "Position_deleted" } } ] }
Falls es den Auftrag gar nicht gibt
"error"="no_project_found"
"givenprojectno"="project" // die übergebene Projektnummer wird wieder zur Referenz zurückgegeben
"project"=false
Falls es keine Positionen gibt, die verändert wurden
"project"=true
"error"="no_posdeltas_found"
Stückliste
API-Befehl
Methode | Typ | Beispiel |
---|---|---|
STK_ICR_Receive | POST | API-Basis/STK_ICR_Receive?token=<Token> |
Daten
Die Daten werden im JSON-Format übertragen.
Attribut | Element | Attribut | Typ | Länge | Bemerkung |
---|---|---|---|---|---|
Coverings | |||||
0 | |||||
back | B | ||||
edge1 | B | ||||
edge2 | B | ||||
edge3 | B | ||||
edge4 | B | ||||
elementno | I | Lackschicht 1, 2, 3, etc. muß hochgezählt werden | |||
front | B | ||||
itemno | A | ||||
partid | I | ||||
positionno | A | ||||
projectno | A | ||||
unituid | U | Eindeutige KorpusID | |||
deleteduuids | U | UUID eines gelöschte Elements | |||
Parts | |||||
0 | O | je Bauteil ein Element | |||
caduuid | U | Bauteil ID - zentrale Identifikation | |||
comment | T | ||||
description | T | ||||
e13corner | K13Ecke: Integer - Kantenreihenfolge aus interiorcad
| ||||
e42corner | e42corner - K42Ecke: Integer - Gehrungsreihenfolge aus interiorcad
| ||||
edge1 | A | Artikelnummer der Kante | |||
edge1length | I | leer | |||
edge1thck | I | Bauteildicke | |||
edge2 | A | Artikelnummer der Kante | |||
edge2length | I | leer | |||
edge2thck | I | Bauteildicke | |||
edge3 | A | Artikelnummer der Kante | |||
edge3length | I | leer | |||
edge3thck | I | Bauteildicke | |||
edge4 | A | Artikelnummer der Kante | |||
edge4length | I | leer | |||
edge4thck | I | Bauteildicke | |||
graindirection | enum (L,W,N) - Maserrichtung Bauteil | ||||
graindirectionl1b | |||||
ispolygonal | B | definiert, ob das Bauteil polygonal, also nicht rechteckig ist | |||
itemno | A | Artikelnummer | |||
joblist | A | Name des CNC-Programms | |||
joblistpath | A | Pfad zum CNC-Programm | |||
joblistback | A | Name des CNC-Programms | |||
joblistbackpath | A | Pfad zum CNC-Programm | |||
joblistformat | A | Name des CNC-Programms | |||
joblistformatpath | A | Pfad zum CNC-Programm | |||
laminate1back | A | Belag innen | |||
laminate1backthck | R | Belagstäke | |||
laminate1front | A | Belag außen | |||
laminate1frontthck | R | Belagstärke | |||
Objects | |||||
0 | |||||
Fittings | |||||
0 | |||||
Shapes | |||||
0 | |||||
Document | Gesendet ab interiorcad 2021 F4.1 | ||||
documentid | T | UUID des Dokumentes | |||
path | T | Pfad des Dokumentes | |||
projectno | T | Projekt-Nummer des Dokumentes |
Beispiel JSON
Wie eine Stückliste mit diversen Teile aussehen kann, lässt sich exemplarisch an folgender Datei ansehen: