Modul Bestellungen exportieren mit REST API

Thema wurde von Anonymous, 13. Februar 2021 erstellt.

  1. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    13. Mai 2019
    Beiträge:
    492
    Danke erhalten:
    234
    Danke vergeben:
    156
    Ich wollte nochmal eine Rückmeldung zur letzten Version des Scriptes geben. Leider funktioniert es bei mir immer noch nicht. Nach dem ich einen der Exports gestartet habe, sehe ich weiterhin eine weisse Seite mit der Überschrift "Bestellungsexport" und sonst nichts. Keine Fehlermeldungen, eine Datei wird nicht erzeugt.

    Gambio 4.3.3.0
    PHP 7.3.27
    curl 7.64.0
    MySQL 5.5.5-10.3.27-MariaDB-0+deb10u1

    Ist aber nicht weiter schlimm. Ich habe gestern meinen ersten API-Request mit Python gemacht. Mein Laden wird eh schon mit Python-Tools zusammengehalten, daher werde ich mir das auch noch in Python selbst schreiben, das kann ich auch viel leichter selbst warten. Dennoch finde ich die Bemühungen von L&B in diesem Bereich top, weiter so!
     
  2. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    13. Mai 2019
    Beiträge:
    492
    Danke erhalten:
    234
    Danke vergeben:
    156
    #22 Anonymous, 1. März 2021
    Zuletzt bearbeitet: 1. März 2021
    Ich wusste jetzt nicht, ob ich daraus ein neues Thema machen sollte, oder nicht, aber auch ich hab jetzt einen Export für Bestellungen geschrieben, mit der REST API, aber mit Python. Bei mir ist die Anbindung an GLS der Dauerbrenner, daher habe ich konkret dafür das Script geschrieben.

    Script hängt an, musste es als .zip packen, das Forum erlaubt keine .py Dateien.

    Die Idee ist ein bisschen eine andere als im Script von @L & B . Das Script lege ich beim PC am Packtisch einfach auf den Desktop. Wenn man Python installiert hat, kann man da einfach Doppelklicken. Es ist alles Voreingestellt, wir haben einen Status für Sendungen, die mit GLS rausgehen, der lautet "Bereit zum Versand - GLS". Das Script gibt eine .csv Datei aller Bestellungen aus, die diesen Status haben, die kann so im GLS Geschäftskundenportal hochgeladen werden. Dafür muss ein Import-Profil bei GLS angelegt werden, damit die wissen, an welcher Stelle was steht. Ich habs genauso sortiert wie GLS das auflistet, also muss man da gar nicht mehr nachdenken und kann einfach 1,2,3,4 .. bis 21 in die Felder tippen.

    Settings sind einstellbar in Zeile 8 bis 18:
    PHP:
    # Change settings here:
    admin_username "admin@shopurl.de"
    admin_password "yourPassword"
    admin_token ""
    # Folder can be left empty, in that case, the script will save the .csv in the same folder as
    # the script is in. Custom folder needs to be specified with escaped backslashes like so:
    # "C:\\Users\\Horst\\Downloads\\"
    folder ""
    filename "gls_export.csv" # Choose a filename, just leave the .csv in there
    shop_url "https://www.shopurl.de/" # Shop url with trailing "/" or with subfolder e.g. /shop/
    status_id 1
    Der Rest sollte auch sehr leicht verständlich sein, wenn jemand Lust hat, daraus was für sich zu basteln. Im Grunde ist das auch eine gute Basis für Auswertungen für den Steuerberater, Statistik oder was auch immer. Ich hab keine Ahnung, ob hier noch jemand mit Python arbeitet, aber why not... ich kanns ja mal zur Verfügung stellen.

    Was nicht funktioniert: Gewicht der Bestellung und die Telefonnummer der Kunden (Warum auch immer?). Gerade bei der Telefonnummer war ich verwirrt. Hier ist sie gelistet: https://developers.gambio.de/docs/4.3.3.0/rest/gambio-gx3-api/reference/orders/search-orders/, aber in der API Response ist sie nicht drin. @L & B hat sie in seinem Script auch nicht drin, vermutlich liege ich also richtig, dass das nicht geht?

    Für den Export an den Paketdienst eigentlich ein No-Go, wenn man die Telefonnummer nicht exportieren kann. Wenns stimmt, ein weiteres Argument in meinen Augen, warum man nicht funktionierende Tools (.csv Export für Paketdienste) einstellt bevor die neuen nicht vollständig funktionieren.

    Achso, ich arbeite mit Python 3.7, sollte auch mit neueren Versionen funktionieren, aber natürlich nicht mit Python 2 oder dergleichen. Das einzige Modul, was ich bei einer frischen Python 3.7.0 installation noch installieren musste, war 'requests'. Alles andere ist Python-Standard.
     

    Anhänge:

  3. Kai Schoelzke

    Kai Schoelzke Beta-Held

    Registriert seit:
    30. März 2016
    Beiträge:
    3.920
    Danke erhalten:
    588
    Danke vergeben:
    288
    Hallo an alle, erst mal vielen Dank an @L & B, @Til, @Till (Gambio) für Eure Bemühungen. Ich habe das ganze gerade mal getestet. Die CSV wird auch exportiert, nur bekomme ich bei der Mwst. eine Fehlermeldung
    Code:
    Warning: Division by zero in /www/htdocs/xxxxx/gx40/bestellexport/orders_export.php on line 149
     
  4. Kai Schoelzke

    Kai Schoelzke Beta-Held

    Registriert seit:
    30. März 2016
    Beiträge:
    3.920
    Danke erhalten:
    588
    Danke vergeben:
    288
    Frage an gambio, wie so kann man bei der Abfrage nur die country ID abfragen und nicht country oder country ISO Code
     
  5. Wilken (Gambio)

    Wilken (Gambio) Erfahrener Benutzer

    Registriert seit:
    7. November 2012
    Beiträge:
    18.737
    Danke erhalten:
    7.310
    Danke vergeben:
    2.208
    Weil das eine Redundanz und Uneindeutigkeit erzeugen würde, die man nur begrenzt will. In einer Order steht die country ID, nicht das Land. Du erwartest auch, dass sich nicht alle Orders ändern, wenn du das Land global manipulierst. Änderst du das Land im Shop bleibt die Order also gleich, das geht andersrum nicht. Im jetzigen Modus spiegelst du also genau die Realität.

    Dazu gibt es ja eben auch einen API Knoten für Länder, mit dem man an die anderen Daten kommt.
     
  6. Kai Schoelzke

    Kai Schoelzke Beta-Held

    Registriert seit:
    30. März 2016
    Beiträge:
    3.920
    Danke erhalten:
    588
    Danke vergeben:
    288
    ok, na dann schau ich mal.
     
  7. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    13. Mai 2019
    Beiträge:
    492
    Danke erhalten:
    234
    Danke vergeben:
    156
    Ich bin verwirrt.. reden wir über die gleiche Abfrage? Bei der Order Search gibt mein Shop mir brav "countryIsoCode" aus... keine ID. Ist das bei dir anders, @Kai Schoelzke ?
     
  8. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    19. Juni 2012
    Beiträge:
    4.831
    Danke erhalten:
    1.124
    Danke vergeben:
    947
    Er WILL die ID.
     
  9. Kai Schoelzke

    Kai Schoelzke Beta-Held

    Registriert seit:
    30. März 2016
    Beiträge:
    3.920
    Danke erhalten:
    588
    Danke vergeben:
    288
    @L & B ich möchte das Land Ausgeben, statt der ID 81 z.B. Deutschland
    @Til ich habe mich mal mit dem Script von L & B befasst, Wilken hat es aber ganz gut erklärt, warum das so ist.
     
  10. ecomplus.dev

    ecomplus.dev Erfahrener Benutzer

    Registriert seit:
    6. Mai 2013
    Beiträge:
    96
    Danke erhalten:
    74
    Danke vergeben:
    27
    In den Orders steht das Land als Value und nicht als ID. Irgendwie verwirrt mich die Aussage von Wilken etwas, weil mit der ID als Rueckgabewert hat man ja genau das Problem, wenn man den Namen des Landes aendert z.B. ID 81 in USA, wuerde ueber die API bei den Orders auf einmal USA ausgegeben werden.

    Weiterhin ist hier in der Doku ein Fehler:

    https://developers.gambio.de/docs/4.3.3.0/rest/gambio-gx3-api/resources/gxorderlistitem/
    Schema > "countryId": "int64",
    Example > "country": "Germany", "countryIsoCode": "DE"

    Also sehe ich sehe da im Beispiel gar keine ID erst ???
     
  11. Wilken (Gambio)

    Wilken (Gambio) Erfahrener Benutzer

    Registriert seit:
    7. November 2012
    Beiträge:
    18.737
    Danke erhalten:
    7.310
    Danke vergeben:
    2.208
    Üblicherweise kommen IDs, siehe hier:

    upload_2021-3-5_13-56-34.png

    Genau das ist beabsichtigt. Wenn du ein Land in sich veränderst, sollst du das als Ergebnis bekommen.
     
  12. ecomplus.dev

    ecomplus.dev Erfahrener Benutzer

    Registriert seit:
    6. Mai 2013
    Beiträge:
    96
    Danke erhalten:
    74
    Danke vergeben:
    27
    Fragt sich dann nur wieso ihr in den Bestellungen (Table orders) den Land des Names und ISO-Code 2 speichert und nicht die ID, wenn dies so beabsichtigt ist.
    Sollten bei einer Bestellung (nicht Adressbuch, wo deine Aussage durchaus Sinn macht) nicht die Daten gelten, die zum jeweiligen Zeitpunkt vorhanden waren und nicht was in Zukunft evtl. mal angepasst wurde?
    Die Bestellung wird ja inhaltlich falsch, wenn ich die ID 81 am Ende in USA anpasse, da die Lieferung ja entsprechend nach Deutschland erfolgte.
     
  13. Wilken (Gambio)

    Wilken (Gambio) Erfahrener Benutzer

    Registriert seit:
    7. November 2012
    Beiträge:
    18.737
    Danke erhalten:
    7.310
    Danke vergeben:
    2.208
    Wer hinter eine Länder ID ein anderes Land packt wird standesrechtlich erschossen. Ohne Anhörung.

    Davon ab: Die API gibt den Stand von Informationen ab, den wir für richtig für die Weitergabe halten. Das führt manchmal dazu, das wir vorläufig Dinge nach dem holen aus der Datenbank für API Ausgaben und Eingaben übersetzen müssen, und die in der Datenbank erst irgendwann anders angelegt werden.

    Die Datenbank selbst ist kein Ort für den wir Stabilität garantieren oder als letztes Wort ansehen, die Zeit ist vorbei.
     
  14. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    19. Juni 2012
    Beiträge:
    4.831
    Danke erhalten:
    1.124
    Danke vergeben:
    947
    Welches Script hast du denn, das von Til oder von mir? Und was gibst du ein? Vielleicht was mit dem Datumsformat?
     
  15. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    19. Juni 2012
    Beiträge:
    4.831
    Danke erhalten:
    1.124
    Danke vergeben:
    947
    Ich kann da keine Datensatz-Begrenzungen erkennen leider. Vielleicht ist es eine Standard-Einstellung oder eine automatische Begrenzung in der API zum Schutz vor Überlastung - oder ein Bug? Da muss Gambio mal was zu sagen, ob es sowas in deiner Version gibt.
     
  16. Anonymous

    Anonymous Administrator
    Mitarbeiter

    Registriert seit:
    26. April 2011
    Beiträge:
    1.757
    Danke erhalten:
    1.370
    Danke vergeben:
    305
    @LED-Fashion und @L & B Die API begrenzt standardmäßig den Export auf 50 Einträge pro Abruf.
    Wenn du mehr willst, musst du als Parameter per_page=100 übergeben, aber das wird standardmäßig gemacht damit die Abfragen nicht zu lange dauern.

    Man kann durch die Ergebnisse durchlaufen mit page=2 usw. die Anzahl der Seite wird im HTTP Header zurückgeliefert und z.B. den Parameter next und first und last auszulesen, da ist dann eine URL um die weiteren Seiten auszulesen.

    (Link nur für registrierte Nutzer sichtbar.)
     
  17. TobiasBerben

    TobiasBerben Erfahrener Benutzer

    Registriert seit:
    4. April 2017
    Beiträge:
    71
    Danke erhalten:
    20
    Danke vergeben:
    48
    #37 TobiasBerben, 29. März 2021
    Zuletzt bearbeitet: 29. März 2021
    Hallo,

    im Prinzip ein tolles Script, vielen Dank, aber ich bin gerade ziemlich verwirrt!

    Wenn ich es richtig verstanden habe, soll man sich im Shop-Backend einen API-Token erstellen, diesen unter $gtoken in die orders_export.php eintragen und dann die Datei auf den Server laden. Ruft man dann die Datei OHNE API-Token mit ...?sec=[API-Token] auf, dann soll die Meldung 'Zugriff verweigert! Token falsch!' kommen [if ($sec != $gtoken) { echo 'Zugriff verweigert! Token falsch!'; exit; }], wenn man den Token in der URL hat, wird die Seite angezeigt und man kann sie nutzen. Richtig? Bei mir aber lässt sich die Seite problemlos ohne Token aufrufen und auch der Export erzeugen, der dann auch nicht nur in der CSV-Datei gespeichert, sondern auch auf der Seite angezeigt wird.

    Wenn ich nun in der Datei den API-Token lösche [$gtoken= ''], dann kann ich die Seite immer noch aufrufen, aber nach Absenden der Anfragen kommen eine Fehlermeldung "Invalid syntax in Authorization header". Packe ich dagegen nun den Token in die URL mit ?sec=..., dann erst kommt "Zugriff verweigert! Token falsch!"

    Mache ich was falsch? Was habe ich übersehen? So auf jeden Fall darf das ja nicht gedacht sein, oder?

    Viele Grüße, Tobias Berben
     
  18. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    19. Juni 2012
    Beiträge:
    4.831
    Danke erhalten:
    1.124
    Danke vergeben:
    947
    #38 Anonymous, 29. März 2021
    Zuletzt bearbeitet: 30. März 2021
    Hallo,

    also wenn der Token falsch ist funktioniert das Script ordnungsgemäß, aber wenn GAR KEIN Token angegeben wird dann scheitert es? Richtig? Probierst du mal hiermit?


    Edit:
    Ich habe das update hier gelöscht und in den ersten Post gepackt, so dass die aktuellste Version immer ganz vorne ist. Ich empfehle jedem der das Script nutzt ein Update - einfach die Datei überschreiben.
    Download:
    (Link nur für registrierte Nutzer sichtbar.)
     
  19. TobiasBerben

    TobiasBerben Erfahrener Benutzer

    Registriert seit:
    4. April 2017
    Beiträge:
    71
    Danke erhalten:
    20
    Danke vergeben:
    48
    Hallo L&B,

    ja, jetzt funktioniert es wie erwartet: Ich kann Daten nur genau dann abfragen, wenn ich über die URL einen Token für $sec mitgesendet habe. Den von Dir korrigierten Fehler habe ich auch gesehen - Du hattest in den Hidden Fields $gtoken statt $sec eingetragen und $gtoken ist natürlich immer identisch mit $gtoken, aber wichtig ist ja, dass $sec mit $gtoken identisch ist ...

    1. Warum aber gibst Du eigentlich die ganze Ausgabe des Scripts noch auf den Schirm und nicht nur in die Datei? Da muss man dann, wenn man viele Bestellungen hatte, immer ganz nach unten scrollen ... ?

    2. Btw., kann man einfach für die CSV-Datei das Trennzeichen von ',' auf ';' ändern? So macht mir das Excel z. B. nicht vernünftig auf?

    3. Darf ich Dein Script als Grundlage für eine Seite nehmen, über die man von unterwegs mal eben im Browser schauen kann, welche Bestellungen aufgelaufen sind? Die würde ich dann natürlich auch hier für alle bereitstellen.

    Anyway, tolle Arbeit, vielen Dank!

    Viele Grüße, Tobias Berben
     
  20. TobiasBerben

    TobiasBerben Erfahrener Benutzer

    Registriert seit:
    4. April 2017
    Beiträge:
    71
    Danke erhalten:
    20
    Danke vergeben:
    48
    #40 TobiasBerben, 30. März 2021
    Zuletzt bearbeitet: 30. März 2021
    Hallo L&B,

    meine zweite Frage habe ich selber lösen können:

    Zeile 92: fputcsv($fp, $header, ';');
    Zeile 163: fputcsv($fp, $csvrow, ';');

    Dann wird es in meinem aktuellen Excel problemlos geöffnet. :)

    Und in Zeile 170 hat sich noch ein Fehler beim Link für das Löschen der CSV-Datei eingeschlichen:

    Falsch: echo '<a href="orders_export?sec=' . $gtoken .'&action=3">Exportdatei entfernen</a>';
    Richtig: echo '<a href="orders_export.php?sec=' . $gtoken .'&action=3">Exportdatei entfernen</a>';

    Und sollte man hier nicht auch besser $sec als $gtoken nehmen? Wohl egal, weil man durch die Prüfung ja durch ist, oder?

    Viele Grüße, Tobias Berben