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!
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 thereshop_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.
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
Frage an gambio, wie so kann man bei der Abfrage nur die country ID abfragen und nicht country oder country ISO Code
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.
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 ?
@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.
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 ???
Üblicherweise kommen IDs, siehe hier: Genau das ist beabsichtigt. Wenn du ein Land in sich veränderst, sollst du das als Ergebnis bekommen.
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.
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.
Welches Script hast du denn, das von Til oder von mir? Und was gibst du ein? Vielleicht was mit dem Datumsformat?
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.
@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.)
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
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.)
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
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