0

API Experten hier? Ninox & FastBill würde ich gern verknüpfen

Hi.

Nach vielen Ausprobierens der ganzen Anbieter habe ich mich entschieden, dass ich in Zukunft auf FastBill setzen möchte was die Belegsammelei für die Buchhaltung angeht. Das Tool sagt mir am meisten zu und ich kann meine in Ninox automatisch generierten Rechnungen dort via Mailimport schon mal reinfliegen lassen.

Ich würde aber Ninox und FastBill gern noch enger verzahnen, habe allerdings null Plan von diesem API Kram. FastBill hat eine sehr ausführliche API Dokumentation: https://apidocs.fastbill.com

 

Sollten sich hier Experten befinden: Ich würde das gern an jemanden geben der mir einige API Schnittstellen zu FastBill baut. Natürlich bezahle ich die Leistungen. Ich nutze Ninox mit der Ninox eigenen Cloud falls das wichtig ist.

 

Grüße an alle Ninoxer!

21 Antworten

null
    • T_Bartzsch
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Ich schau mir das mal mit einem Testaccount an...

    • T_Bartzsch
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Welche Funktionen würdest Du denn benötigen? Da lässt sich über die API ja einiges steuern.... 

    • Pyromixer.1
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Ich lasse ja von Ninox automatisiert Rechnungen schreiben. Daraus müssten die Daten (Feldeinträge) zu Fastbill, die dort auch für das normale Buchen einer Rechnung verwendet werden. Ich habe das Buchungsfeld aus Fastbill mal angemalt: die gelben Einträge müssten von Ninox rüber kommen. Die grünen Einträge müssten bei jeder neuen Ninox Rechnung in Fastbill automatisch auf diese Werte gestellt werden. Wobei es noch Rechnungen ins EU Ausland (Reverse-Charge) gibt bei denen die Umsatzsteuer auf steuerfreie innergemeinschaftliche Leistungen anstatt auf Erlöse 16%/19% gesetzt werden muss. Und das Rechnungs-PDF aus Ninox müsste noch in Fastbill bei der entsprechenden Buchung landen.

    fastbillbuchung

     

    Kundenabgleich damit man nicht verschiedene Nummern für Kunden in Ninox und Fastbill hat wäre sinnvoll. Und all die Dinge die ich grad nicht bedacht habe :)

     

    [img]https://up.picr.de/39099778tj.png[/img]

    • T_Bartzsch
    • vor 4 Jahren
    • Gemeldet - anzeigen

    :) juht, guck ich mir morgen mal an... 

    • Pyromixer.1
    • vor 4 Jahren
    • Gemeldet - anzeigen

    :) Cool... Danke Dir schon mal.

    • T_Bartzsch
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Also Grundsätzlich läuft die Anbindung... wie kann man dich erreichen? Mail mich doch mal bitte an tobias (ät) firstlineaudio punkt kom

    • T_Bartzsch
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Also Grundsätzlich läuft die Anbindung... wie kann man dich erreichen? Mail mich doch mal bitte an tobias (ät) firstlineaudio punkt kom

    • Pyromixer.1
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Nachricht ist unterwegs!

    • T_Bartzsch
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Juht, dieses geniale Forum hat uns allen schon viel geholfen, hier also das generelle Vorgehen für alle die das Thema auch interessieren mag:

    Für die Authentifizierung benötigt man den API Key vonFastBill sowie die zur Anmeldung genutzte eMail-Adresse.

    Die FastBill API nutzt die Basic Authentifizierung, dabei werden email und API Key im base64 Format verschlüsselt übertragen. Für die Verschlüsselung der eigenen "eMail:Key" kombination einfach einen Online Encoder nutzen (z.B. https://www.base64decode.org/ )

    Hier wird dann der string:     "emil@email.de:DeinAPIKey" eingegeben und zu "dG9iaWFzQGZpcnMoJK8bL...blabla Wirres Zeug" umgewandelt.

    Für Testumgebungen in Sachen API lege ich mir immer ein mehrzeiliges Textfeld namens APIResonse sowie einen Button an.

    In den Button kommt in "Beim Anklicken":

    APIResponse := null;
    let auth := {
    Authorization: "Basic derUmgewandelteBase64String",
    'Content-Type': "application/json"
    };
    let response := do as server
    http("POST", "https://my.fastbill.com/api/1.0/api.php", auth, {
    SERVICE: "invoice.create",
    DATA: {
    CUSTOMER_ID: KundenID,
    ITEMS: [{
    ARTICLE_NUMBER: 1003,
    DESCRIPTION: "Super Gerät",
    QUANTITY: 3,
    UNIT_PRICE: 30.5,
    VAT_PERCENT: 16
    }, {
    ARTICLE_NUMBER: 1045,
    DESCRIPTION: "Tolles Ding mit Deckel",
    QUANTITY: 3,
    UNIT_PRICE: 30.5,
    VAT_PERCENT: 16
    }]
    }
    })
    end;
    APIResponse := text(response)

    Die Authentifizierung ist der Übersicht halber als Variable ausgelagert... der Rest erklärt sich anhand der FastBill API Dokumentation eigentlich von selbst. ITEMS ist in diesem Fall ein Array [in eckigen Klammern] in welchem die einzelnen ITEMS kommagetrennt in {geschweiften Klammern}übertragen werden... also ITEMS: [{},{},{}] usw.

    Es wird immer ein SERVICE angesprochen.... "invoice.create", "customer.create", "customer.get" usw. und dazu im DATA Body die entsprechenden Felder übermittelt. Diese können entweder direkt "hardcoded" im Script übermittelt werden (siehe obiges Beispiel DESCRIPTION) oder es wird ein Feld aus dem Datensatz abgefragt (siehe CUSTOMER_ID - da fragt er das Feld KundenID aus der Ninox ab).

    WICHTIG: Zahlen mit Punkt statt Komma darstellen

    Wenn alles richtig ist, gibt der Aufruf einen JSON String zurück und legt ihn im Feld APIResonse ab. Das sieht dann so aus:

    {"result":{"REQUEST":{"SERVICE":"invoice.create","DATA":{"CUSTOMER_ID":"9326461","ITEMS":[{"ARTICLE_NUMBER":1003,"DESCRIPTION":"Super Gerät","QUANTITY":3,"UNIT_PRICE":30.5,"VAT_PERCENT":16},{"ARTICLE_NUMBER":1045,"DESCRIPTION":"Tolles Ding mit Deckel","QUANTITY":3,"UNIT_PRICE":30.5,"VAT_PERCENT":16}]}},"RESPONSE":{"STATUS":"success","INVOICE_ID":22584574,"DOCUMENT_ID":"","INVOICE_NUMBER":[]}}}

    Über einen JSON Beautifier (z.B. https://jsonformatter.org/) kann man sich die Struktur etwas "aufgehübscht" anzeigen lassen um die Verschachtelungen besser zu vertehen.

    Prinzipiell kann man in der NINOX nun mit dem zurückgegebenen JSON String arbeiten. Über die sog. Punkt-Navigation kann man z.B. aus dem obigen JSON String seine Datenfelder bestücken oder abfragen einrichten. 

    Lege ich z.B. ein Textfeld "Status" an, kann ich in den obigen Code noch

    Status := text(response.result.RESPONSE.STATUS)

    einfügen....

    "response" beinhaltet ja den komplette JSON String, "result" ist darin dann die erste Ebene, diese beinhaltet REQUEST und RESPONSE, darin wählen wir RESPONSE und wiederum darin wählen wir STATUS... der Wert von STATUS wird dann in unser Textfeld übertragen.

    Fertig...

    Nun steht uns Tür und Tor offen für alle möglichen Spielereien, dieser API Call kann sowohl in Buttons als auch in "Bei Änderung..." usw abgeschossen werden.

    Viel Spass damit :) 

    Tobias

    • Pyromixer.1
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Ja Wow, danke Tobias!

    Meine erste API Geschichte hat funktioniert. Der Rest ist nun tüfteln und es so zusammenbauen wie ich es brauche denke ich.

    ergebnisrechnung 

    Kleine Fallen über die ich noch gestolpert bin:

    In Deinem Link zum Base64 Encoder war der Link zum DEcoder drin, man muss natürlich den ENcoder verwenden (oben umswitchen oder direkt: www.base64encode.org

    Dann ist bei solchen Beschreibungen immer die Frage: Meint er nun mit Anführungszeichen eingeben oder ohne? Die E-Mail Adresse und der API Key (in diesem Fall von FastBill) muss OHNE Anführungstriche im Base64 Encoder gewandelt werden. Dieser dort dann rauskopierte String aber dann in Ninox Syntax mit Anführungsstrichen im Test API Button eingetragen werden. Und ich hatte auch das Wörtchen Basic am Anfang vergessen. Nach dem Wort Basic ein Leerzeichen, dann den Code von Base64 eintragen wie Tobias es oben beschrieben hat.

    In diesem Beispiel von Tobias musste ich nur das Feld "Kundennummer" aus meiner Ninox Tabelle verwenden. Dann klappte dieser erste Test schon mal.

    Das bei mir als Test funktionierende Zeug im Test API Button sieht also nun so aus:

    • Pyromixer.1
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Kann man natürlich nicht erkennen das Bild. Dieses "Forum" macht einen manchmal wahnsinnig...  Egal.

    Nun muss ich noch rausfinden wie ich ein PDF von Ninox zu FastBill bekomme. Denn am Ende will ich ja keine Rechnungen in FastBill erstellen sondern dort eine "Einnahme" erzeugen und dieser dann das Rechnungs PDF aus Ninox anheften.

    • T_Bartzsch
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Super dass das schonmal klappt.... ja, mit den Anführungszeichen ist das immer so ne Sache wenn man versucht Begriffe darzustellen ... sorry :))

    • Pyromixer.1
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Na entschuldigen musste Dich ja nun gar nicht :-) Dank Dir: Es löppt! Ausgaben werden zu FastBill korrekt übertragen. Noch hakt es nur beim Rechnungsdatum, es wird ein Formatierungsfehler sein. Ninox wirft da wohl aus dem Datumsfeld eine wirre Zahl raus die FastBill nicht versteht. Bei FastBill wird das Datum im Format XX.XX.XXXX dargestellt.

    Da kommt dann sowas bei raus:

    fb_faelligkeit

    • Pyromixer.1
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Wenn ich das Rechnungsdatum in einem Berechnungsfeld mit der Funktion

    format(Rechnungsdatum, "DD.MM.YYYY")

    umwandle, kommen bei FastBill immerhin schon logische Datumsangaben an aber völlig falsche Daten. Mal ist es der 20.06.2013, mal ein anderes willkürliches Datum. Was mach ich denn nur mal wieder falsch?

    • T_Bartzsch
    • vor 4 Jahren
    • Gemeldet - anzeigen

    format(Datum, "YYYY-MM-DD") ist die Antwort....

    Du kannst übrigens mal eine komplette Rechnung in FastBill anlegen und dann in der NINOX mit invoice.get abrufen... im JSON siehst Du dann die benötigte Struktur und kannst die sogar übernehmen... musst dann nur die " " wegnehmen...

    • Pyromixer.1
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hi... Exakt auch grad herausgefunden :-)

    Nun habe ich aber noch ein Problem: DUE_DATE also die Fälligkeit der Rechnung. Ich will dort einfach das Rechnungsdatum plus 10 Tage in einem Berechnungsfeld als Datum übergeben. Finde aber die passende Rechnung dazu nicht raus :/

    • Pyromixer.1
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hier erstmal der jetzige Stand der Sache. Ein Ausgabebeleg (z.B.Rechnung in Ninox geschrieben) wird korrekt an FastBill übertragen. Es fehlt jetzt nur noch das übertragen der dazugehörigen PDF Datei - was laut FastBill Support auch möglich ist.

     

    FB Support Antwort:

     

    Die PDF Datei kannst du übertragen, indem du diese als Mulitpart Request übergibst. Dieser Vorgang ist in der API-Dokumentation unter dem Punkt revenue.create beschrieben: https://apidocs.fastbill.com/fastbill/de/revenue.html#revenue.create

     

    Als nur 30% Nerd  verstehe ich da noch nicht wie die Syntax in Ninox angelegt werden muss, damit das funktioniert.

     

    Hier mal der Screenshot wie aber der Rest schon funktioniert. Hier im Beispiel ist damit ein Ninox Button belegt:

    Ausgabebeleg zu FastBill übertragen

    • T_Bartzsch
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Ahoi! Du kannst dein Rechnungsdatum-Feld mit number(Rechnungsdatum) auslesen. Dir wird hier die Anzahl der vergangenen Millisekunden seit 01.01.1970 (Beginn der UNIX- Zeit) angegeben. Beim DUE_DATE rechnest Du dann für 10 Tage einfach 864 000 000 dazu (Millisekunde x 1000 x 60 x 60 x 24 x 10).

    Ein NINOX Datumsfeld kannst du einfach mit diesem berechneten Wert belegen, da wir aber für die API das andere Datumsformat brauchen muss das erst in ein Datum umgewandelt werden und dann umformatiert werden... also:

    DUE_DATE: format(date(number(Rechnungsdatum) + 864000000)), "YYYY-MM-DD")

    • Pyromixer.1
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Oh wie schön... Das läuft auch nun... Eine Klammer zuviel - aber sowas finde ich ja mittlerweile auch schon selber raus :-)     Statt 864000000)) muss es 864000000) heissen. Nicht wegen Schlaumeierei sondern falls das hier jemand nachbasteln möchte.

    Dann läuft nun alles - nur noch das PDF Transportding lösen.

    • Pyromixer.1
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Copytexter hatte freundlicherweise auch noch einen Vorschlag, der ebenfalls funktioniert:

     

    format(Rechnungsdatum + 10, "YYYY-MM-DD")

     

    Hat den Vorteil, dass man die Zahlungsfrist besser erkennt und man schnell auch mal was ändern kann. Aber beide Wege haben nach Rom geführt :-)

    • T_Bartzsch
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Sauber! Ja, file upload via API im multipart/form-data aufruf klappt bei mir auch nicht, hab hier schon entsprechend angefragt im Forum.