CSV-Export Versanddaten für DHL Privatkunden

Thema wurde von tannenhof_imshausen, 10. Oktober 2023 erstellt.

  1. tannenhof_imshausen

    tannenhof_imshausen Erfahrener Benutzer

    Registriert seit:
    26. Oktober 2022
    Beiträge:
    75
    Danke erhalten:
    20
    Danke vergeben:
    37
    #1 tannenhof_imshausen, 10. Oktober 2023
    Zuletzt bearbeitet: 11. September 2024
    Schon seit einer Weile habe ich folgendes Skript bei mir erfolgreich im Cloud-Shop im Einsatz, um die Versandadressen und Gewichtsangaben in eine CSV-Datei für das DHL Privatkunden-Portal zu exportieren.

    Ich habe einen anderen Ansatz verfolgt als @DKG - Die Kleine Geschenkidee (Peter) hier
    im Nachbar-Thema: Kein direkter Zugriff auf die Datenbank, sondern alles mit Gambio-Funktionen. Das Skript ist nicht schön und noch verbesserungswürdig, aber es funktioniert tadellos.

    Es ist darauf ausgelegt, dass Hausnummer und Straße getrennt erfasst werden, dass Deutsche Post Versandmodul benutzt wird und legt keine Datei auf dem Server ab, sondern bietet sie direkt zum Download an. Der Zugriffsschutz erfolgt direkt durch Gambio.

    Verbesserungswünsche:
    Die Liste der Bestellungen gleichzeitig nach mehreren Status zu durchsuchen, gekoppelt mit einer Abfrage, ob schon eine Sendungsnummer vorhanden ist.
    Kann da jemand helfen?

    Das Aufteilen auf mehrere Pakete ist derzeit anders gelöst als bei Gambio, ich habe es noch nicht benötigt.

    Ich habe das Skript unterhalb von /media/content/skripte/ gespeichert.


    EDIT 11.9.2024: Anhang aktualisiert
     

    Anhänge:

  2. tannenhof_imshausen

    tannenhof_imshausen Erfahrener Benutzer

    Registriert seit:
    26. Oktober 2022
    Beiträge:
    75
    Danke erhalten:
    20
    Danke vergeben:
    37
    Hat jemand einen Tipp, wie man mit Gambio-Funktionen die Bestellungen nach mehreren Status filtern kann und nur Bestellnummern zurückgeben, die noch keine Sendungsnummer haben?

    PHP:
    $orderStatusId=2;
    $orderReadService StaticGXCoreLoader::getService('OrderRead');
    // so kann ich nur nach einer Status-Id filtern
    $orderList $orderReadService->getOrderListByOrderStatusId(new IntType($orderStatusId));

    // Ich habe kein Beispiel in der Dokumentation gefunden, wie ich orderRead->searchOrders und orderRead->filterOrderList korrekt benutzen kann, keine der folgende Zeilen funktionieren bzw. liefert das gewünschte Ergebnis:
    $orderList            $orderReadService->filterOrderList(['orders.orders_status' => 'orders.shipping_class' => 'dp_dp']);
    $orderList            $orderReadService->filterOrderList(['status' => 'Rechnung erstellt''shipping' => 'Deutsche Post']);

     
    $orderList $orderReadService->searchOrders( new OrderSearchCondition("orders_status in(2,149,183) and shipping_class = 'dp_dp' and orders_id not in (SELECT DISTINCT order_id from orders_parcel_tracking_codes) "));
    @Hilke (Gambio) @Till (Gambio) Da wünschte ich mir, die Dokumentation wäre etwas ausführlicher und es gäbe auch Beispiele. Ich habe auch immer den Quellcode der aktuellen Version durchsucht, da habe ich jedoch auch nix passendes gefunden.

    Ich würde mich sehr über einen Tipp freuen!
     
  3. tannenhof_imshausen

    tannenhof_imshausen Erfahrener Benutzer

    Registriert seit:
    26. Oktober 2022
    Beiträge:
    75
    Danke erhalten:
    20
    Danke vergeben:
    37
    DHL hat jetzt auch ein 20kg-Paket innerhalb Deutschlands eingeführt, ich habe das Skript daraufhin angepasst, außerdem einen Fehler behoben, wenn die erste Bestellung in der OrderList keine mit DHL-Versand war.
    Im Versandmodul nicht vergessen, einen Preis für das 20 kg-Paket zu hinterlegen.
    Ich habe die neue Datei im ersten Post aktualisiert.


    Und noch ein Tipp zum Druck der DHL-Etiketten:

    Ich drucke mit meinem normalen Drucker (super sparsamer Epson ET-16500 mit Tintentanks) vier Etiketten auf A4 (diese hier: https://www.memo.de/memo-etiketten-105-x-148-5-400-stk-k9219 ) .
    Und nur die Etiketten, die sinnlose andere Hälfte der PDFs drucke ich gar nicht erst aus.

    Die Umwandlung der DHL-Etiketten erledige ich mit dem Programm PDF-Booklet https://pdfbooklet.sourceforge.io/wordpress/download/ und folgender, selbst entwickelter Projektdatei:

    Code:
    [options]
    rows = 2
    columns = 2
    booklet = 0
    step = 1
    numfolio = 5
    prependPages = 0
    appendPages = 0
    referencePage = 1
    creep =
    pageSelection = 1:1-1;2:1-1;3:1-1;4:1-1;5:1-1;6:1-1;7:1-1;8:1-1;9:1-1;10:1-1;11:1-1;12:1-1;13:1-1;14:1-1;15:1-1;16:1-1;17:1-1;18:1-1;19:1-1;20:1-1;21:1-1;22:1-1;23:1-1;24:1-1
    userLayout =
    inputs = /tmp/DHL/DHL-Paketmarke_leer.pdf|
    output = %F-DRUCK.pdf
    repeat = 1
    showPdf = True
    saveSettings = False
    autoscale = False
    width = 210
    height = 297
    noCompress = False
    righttoleft = False
    overwrite = False
    slowmode = False
    presets = radiopreset3
    size = radiosize3
    presetOrientation = presetOrientation1
    globalRotation = globalRotation0
    [mru]
    mru1 = /tmp/DHL/DHL-Paketmarke_leer.pdf
    [mru2]
    mru1 = /tmp/DHL/
    [output]
    htranslate = 0,0
    vtranslate = 0,0
    scale = 72
    rotate = 0
    xscale = 100
    yscale = 100
    vflip = False
    hflip = False
    [1,1]
    htranslate = -183,0
    vtranslate = -251,6
    scale = 100
    rotate = 270
    xscale = 100
    yscale = 100
    vflip = False
    hflip = False
    pdfRotate = 0
    [1,2]
    htranslate = -109
    vtranslate = -251.6
    scale = 100
    rotate = 90
    xscale = 100
    yscale = 100
    vflip = False
    hflip = False
    pdfRotate = 0
    [2,1]
    htranslate = -183
    vtranslate = -163.4
    scale = 100
    rotate = -90
    xscale = 100
    yscale = 100
    vflip = False
    hflip = False
    pdfRotate = 0
    [2,2]
    htranslate = -107.7
    vtranslate = -162
    scale = 100
    rotate = 90
    xscale = 100
    yscale = 100
    vflip = False
    hflip = False
    pdfRotate = 0
    [even]
    htranslate = 0.0
    vtranslate = 0,0
    scale = 100
    rotate = 0
    xscale = 100
    yscale = 100
    vflip = False
    hflip = False
    pdfRotate = 0
    [odd]
    htranslate = 0.0
    vtranslate = 0,0
    scale = 100
    rotate = 0
    xscale = 100
    yscale = 100
    vflip = False
    hflip = False
    pdfRotate = 0
    [page_numbers]
    page_numbers = False
    font_size = 10
    start_from = 0
    bottom_margin = 0

    Des weiteren habe ich ein Skript laufen, dass den temporären Download-Ordner vom Firefox überwacht, und immer wenn ich eine Zip-Datei mit den DHL-Etiketten runtergeladen habe, wird die ZIP-Datei automatisch entpackt und pdfbooklet gestartet (oder in der Vordergrund geholt, wenn es schon läuft.)
    Dann wähle ich die eben ausgepackten Dateien aus und generiere so die PDF mit jeweils 4 Etiketten pro Seite.

    Natürlich geht es nicht immer auf, dann bleiben Etiketten leer. Will ich diese Blätter dann weiter benutzen, setze ich wenn nötig die Datei /tmp/DHL/DHL-Paketmarke_leer.pdf , eine leere A4-Seite, an erste Stelle der Dateiliste. So kann ich alle 4 Etiketten auf jedem Blatt nutzen.


    Wie Du anhand der Dateipfade erkennen kannst, nutze ich Linux als Betriebssystem.
    Für Windows hat @Michaela Klaiber die Vorlage und das Skript angepasst.
     
  4. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    5. Mai 2022
    Beiträge:
    1.778
    Danke erhalten:
    712
    Danke vergeben:
    259
    #4 Anonymous, 11. September 2024
    Zuletzt bearbeitet: 13. September 2024 um 07:22 Uhr
    Nein, das automatische ZIP entpacken und Programm starten habe ich nicht umgesetzt. Ich hatte mir zwar von ChatGPT was schreiben lassen, das war mir dann aber doch zu unsicher, da ich mich damit nicht wirklich auskenne.

    Ich nutze die PHP zum exportieren der Adressen und die Projektdatei um in Booklet die Etiketten zusammenzufassen.
     
  5. Anonymous

    Anonymous Administrator
    Mitarbeiter

    Registriert seit:
    26. April 2011
    Beiträge:
    1.723
    Danke erhalten:
    1.312
    Danke vergeben:
    305
    @tannenhof_imshausen Auch wenn der Beitrag schon älter ist aber hier ein Beispiel für das Filtern der Bestellungen mit den Parametern:

    PHP:
    $orders $this->orderReadService->filterOrderList(['number' => $orderId]);
    Die entsprechenden Namen der Filter findest du in der /GXMainComponents/Services/Core/Order/OrderListGenerator.inc.php

    PHP:
    $orders $this->orderReadService->filterOrderList(['shippingMethod' => 'dp','status'=>2]);