Neuigkeiten
  • Die modified eCommerce Shopsoftware ist kostenlos, aber nicht umsonst.
    Spenden
  • Damit wir die modified eCommerce Shopsoftware auch zukünftig kostenlos anbieten können:
    Spenden
  • Thema: MODUL: Anzahl Bestellungen eines Kunden in Bestellübersicht anzeigen

    Timm

    • Fördermitglied
    • Beiträge: 6.343
    Nein noch nicht. Brauch ich etwas Zeit zu wo ich mich auch konzentrieren kann und im Moment haben Frau und Kind Urlaub und ich komm zu nichts  :flee-mrgreen:

    Ich versuche es Abends mal die Tage. Danke dir vielmals.

    Gruß Timm

    Timm

    • Fördermitglied
    • Beiträge: 6.343
    Sorry noch keine Zeit gehabt, aber ein Fehler ist mir noch aufgefallen.

    Neueste Version von dir ist drauf mit Einstellung Kommentare anzeigen ja; erster Kommentar anzeigen ja; try_count_guest_orders ja, compare_also_cust_address nein.

    Kunde bestellt zuerst als Neuer Kunde.
    Später bestellt er nochmal als Gast.

    Dann steht bei der ersten früheren Bestellung in schwarz eine (1) und bei der zweiten neueren Bestellung als Gast eine rote (2).

    Er scheint also nur bei Gastbestellungen auch die Bestellung von neuen Kunden hinzuzuzählen, aber nicht bei Bestellung eines neuen Kunden seine Bestellungen als Gast.

    Gruß Timm

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.745
    • Geschlecht:
    Eine Vermischung von "echten" Konten und Gast-Konten ist nie beabsichtigt gewesen.
    Daß ein Kunde als Gast und mit einem "echten" Konto mit jeweils derselben Mail-Adresse bestellen kann habe ich nicht bedacht.
    Ich habe deshalb beim Zählen der Bestellungen eines Gast-Kontos noch den account_type hinzugefügt, sodaß wirklich nur Gast-Bestellungen gezählt werden und es keine Vermischung gibt.

    Es werden gezählt
    • Alle Bestellungen mit demselben "echten" Konto.
    • Wenn $try_count_guest_orders auf true steht
      • alle Bestellungen eines Gasts mit derselben E-Mail-Adresse
      • wenn außerdem $compare_also_cust_address auf true steht
        alle Bestellungen eines Gastes mit derselben E-Mail-Adresse und derselben PLZ und desselben Ortes und derselben Strasse

    Code: PHP  [Auswählen]
    <?php
    /**************************************************************************************************
    * file: 13_add_to_ordlist.php
    * use: display total amount of orders per customer in order listing
           optional: display also comments of order (with option to display all or only first (oldest))
    * path: /admin/includes/extra/footer/
    *
    * (c) noRiddle 08-2019
    **************************************************************************************************/


    if(strpos($PHP_SELF, FILENAME_ORDERS) && !isset($_GET['action']) && xtc_db_num_rows($orders_query) > 0) {
        //BOC config
        $tot_ord_debug = false; //debug ? (true will display certain generated arrays in footer area for control purposes, see code)

        $we_have_ord_comments = true; //want to display comments of orders ?
        $only_first_comment = false; //if $we_have_ord_comments is set to true, want to display all comments or only first (oldest) one ?

        $try_count_guest_orders = true; //try to count also guest orders (comparing mail-address)
        $compare_also_cust_address = false; //compare not only mail-address but also customer-address when trying to count orders placed by guests
        //EOC config

        xtc_db_data_seek($orders_query, 0);

        $queried_custs = array();
        $ord_cust_map = array();
        if($we_have_ord_comments === true) {
            $ord_comm_arr = array();
        }
       
        while($ord = xtc_db_fetch_array($orders_query)) {
            $ord_cust_map[$ord['orders_id']] = $ord['customers_id'];
        }

        $collect_unique_custids = array_unique($ord_cust_map);
        $custs_str = implode(',', $collect_unique_custids);
        if($we_have_ord_comments === true) {
            $ord_id_array = array_keys($ord_cust_map);
            $ordc_in_str = implode(',', $ord_id_array);
        }

    //debug
    if($tot_ord_debug === true) {
        echo '<pre>$ord_cust_map: '.print_r($ord_cust_map, true).'</pre>';
        echo '<pre>$collect_unique_custids: '.print_r($collect_unique_custids, true).'</pre>';
    }
     
        $hmo_add_select = $try_count_guest_orders === true ? ' customers_email_address,'.($compare_also_cust_address === true ? ' customers_street_address, customers_city, customers_postcode,' : '') : '';
        $how_many_orders_query = xtc_db_query("SELECT COUNT(*) AS total_orders,".$hmo_add_select." account_type, customers_id FROM " . TABLE_ORDERS . " WHERE customers_id IN(".$custs_str.") GROUP BY customers_id");

        while($custs_total_arr = xtc_db_fetch_array($how_many_orders_query)) {
            if($try_count_guest_orders === true && $custs_total_arr['account_type'] == '1') {
                $hmo_add_guest_select = $compare_also_cust_address === true ? " AND customers_street_address = '".xtc_db_input($custs_total_arr['customers_street_address'])."'
                                                                                 AND customers_city = '"
    .xtc_db_input($custs_total_arr['customers_city'])."'
                                                                                 AND customers_postcode = '"
    .xtc_db_input($custs_total_arr['customers_postcode'])."'"
                                                                             : '';
                $how_many_orders_guest_query = xtc_db_query("SELECT COUNT(*) AS total_guest_orders
                                                               FROM "
    . TABLE_ORDERS . "
                                                              WHERE account_type = 1
                                                                AND customers_email_address = '"
    .xtc_db_input($custs_total_arr['customers_email_address'])."'"
                                                              .$hmo_add_guest_select);

                $how_many_orders_guest_arr = xtc_db_fetch_array($how_many_orders_guest_query);
            }
           
            $hmo_result_arr = array('total_orders' => $custs_total_arr['account_type'] == '0' ? $custs_total_arr['total_orders'] : ($custs_total_arr['account_type'] == '1' ? $how_many_orders_guest_arr['total_guest_orders'] : ''),
                                    'account_type' => $custs_total_arr['account_type']
                                   );
            if($tot_ord_debug === true) {
                if(isset($custs_total_arr['customers_email_address'])) { //which is effectively if($try_count_guest_orders === true)
                    $hmo_result_arr['customers_email_address'] = $custs_total_arr['customers_email_address'];

                    if($compare_also_cust_address === true) {
                        $hmo_result_arr['customers_street_address'] = $custs_total_arr['customers_street_address'];
                        $hmo_result_arr['customers_city'] = $custs_total_arr['customers_city'];
                        $hmo_result_arr['customers_postcode'] = $custs_total_arr['customers_postcode'];
                    }
                } //we don't need that, only for debugging purposes
            }

            $queried_custs[$custs_total_arr['customers_id']] = $hmo_result_arr;
        }

    //debug
    if($tot_ord_debug === true) {
        echo '<pre>$queried_custs: '.print_r($queried_custs, true).'</pre>';
    }

        if($we_have_ord_comments === true) {
            $orders_history_query = xtc_db_query("SELECT orders_id, comments FROM " . TABLE_ORDERS_STATUS_HISTORY . " WHERE orders_id IN(".$ordc_in_str.") ORDER BY orders_id DESC, date_added");

            if(xtc_db_num_rows($orders_history_query) > 0) {
                while($orders_comments = xtc_db_fetch_array($orders_history_query)) {
                    $ord_comm_arr[$orders_comments['orders_id']][] = $orders_comments['comments'];
                }
    if($tot_ord_debug === true) {
        echo '<pre>$ord_comm_arr: '.print_r($ord_comm_arr, true).'</pre>';
    }

                if(!empty($ord_comm_arr)) {
                    foreach($ord_comm_arr as $ordid => $comm_arr) {
                        $ord_comments = "";
                       
                        if($only_first_comment !== true) {
                            for($oc = 0, $ocl = count($comm_arr); $oc < $ocl; $oc++) {
                                if($comm_arr[$oc] != '') {
                                    $ord_comments .= '<span style="display:block; margin:0 0 3px 0; padding:0 0 3px 0; border-bottom:1px dotted #000;">'.nl2br($comm_arr[$oc]).'</span>';
                                }
                            }

                            echo '<span class="ord-comm tooltip" data-ord="ord-'.$ordid.'" style="padding:0 0 0 10px; float:right;">'.(!empty($ord_comments) ? '<img src="images/icons/comment2.gif" style="border:0;"><em>'.$ord_comments.'</em>' : '').'</span>';
                        } else {
                            if($comm_arr[0] != '') {
                                $ord_comments .= '<span style="display:block; margin:0 0 3px 0; padding:0 0 3px 0;">'.nl2br($comm_arr[0]).'</span>';
                            }

                            echo '<span class="ord-comm tooltip" data-ord="ord-'.$ordid.'" style="padding:0 0 0 10px; float:right;">'.(!empty($ord_comments) ? '<img src="images/icons/comment2.gif" style="border:0;"><em>'.$ord_comments.'</em>' : '').'</span>';
                        }
                    }
                }
            }
        }

        foreach($ord_cust_map as $ordid => $custid) {
            echo '<span class="ord-tot" data-ordc="ordc-'.$ordid.'" style="display:inline-block; padding:0 0 0 10px;'.($queried_custs[$custid]['account_type'] == '1' ? ' color:#c00;' : '').'" title="No. of orders'.($queried_custs[$custid]['account_type'] == '1' ? ' (GAST)' : '').'">('.$queried_custs[$custid]['total_orders'].')</span>';
        }
    ?>
    <style>
    .tooltip:hover em {bottom:auto; top:100%;}
    </style>
    <script>
    $(function() {
        var $tbc = $('.tableBoxCenter tbody tr');

        $tbc.each(function(index) {
            var $skip_header = $tbc.eq(index + 1),
                $tbc_dtc = $skip_header.find('.dataTableContent'),
                $tbc_dtc_oid = $tbc_dtc.eq(1).text(),
                $class_data_var = 'ordc-'+$tbc_dtc_oid;
    <?php
    if($we_have_ord_comments === true) {
    ?>
            var $class_data_cvar = 'ord-'+$tbc_dtc_oid;
    <?php
    }
    ?>

            $tbc_dtc.eq(0).addClass($class_data_var);
           
            $('span[data-ordc='+$class_data_var+']').appendTo($skip_header.find('.'+$class_data_var));
    <?php
    if($we_have_ord_comments === true) {
    ?>
            $('span[data-ord='+$class_data_cvar+']').appendTo($skip_header.find('.'+$class_data_var));
    <?php
    }
    ?>
        });
    });
    </script>
    <?php
    }
    ?>

    Natürlich kann es sein, daß man wissen will wieviele Bestellungen es gab mit ausschließlich derselben Mail-Adresse wie die in der angezeigten Bestellung verwendete, ohne Unterscheidung zwischen Gast- und "echtem" Konto.
    Das kann man sich ja erweitern wenn man das so möchte. Ich baue nicht mehr weiter daran.

    Gruß,
    noRiddle

    japadi83

    • Mitglied
    • Beiträge: 111
    • Geschlecht:
    Vielen Dank für den Code und die Anleitung noRiddle, funktioniert super!  :thumbs:

    Ich habe nun versucht die Anzahl auch auf der Bestelldetailseite (orders_info_blocks.php) einzubauen, bekomme jedoch dort kein Ergebnis angezeigt.
    Wäre es möglich die Anzahl auch dort anzeigen zu lassen?
    Da ich in der Regel die Bestellung direkt über die Berstellnummer-Suche aufrufe, wäre die Anzeige dort sehr hilfreich für mich.

    Danke und Gruß
    Patrick

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.745
    • Geschlecht:
    Für die Einzelansicht der Bestellungen müsstest du eine Datei in /admin/includes/extra/modules/orders/orders_info_blocks_end/ anlegen in welcher die nötigen Queries gemacht werden.
    Das Ergebnis in ein wenig HTML schreiben, ausgeben und mittels Javascript an die gewünschte Position schieben.

    Gruß,
    noRiddle

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.745
    • Geschlecht:
    @FräuleinGarn

    Hat sich hier eigentlich bezüglich deines Problemes mit dem Zählen der Bestellungen einzelner Kunden  noch etwas ergeben ?

    Gruß,
    noRiddle

    Timm

    • Fördermitglied
    • Beiträge: 6.343
    Natürlich kann es sein, daß man wissen will wieviele Bestellungen es gab mit ausschließlich derselben Mail-Adresse wie die in der angezeigten Bestellung verwendete, ohne Unterscheidung zwischen Gast- und "echtem" Konto.
    Das kann man sich ja erweitern wenn man das so möchte. Ich baue nicht mehr weiter daran.

    Gruß,
    noRiddle

    Ich hatte deinen letzten Satz ernst genommen und deshalb nicht weiter hier gefragt, da du schon mehr als genug getan hast. Im Verlauf der Zeit zeigt sich, dass das Modul sehr gut funktioniert und es nur bei bestimmten Konstellationen, die aber eher selten sind, nicht ganz richtig zählt. Ich hatte mir auch ein paar Beispielbestellungen dafür notiert, falls das Thema nochmal aufkommt.

    Bin grad nicht ganz im Thema drin, aber er zählt wohl nicht richtig, wenn Gast und Neukundenbestellungen eines Kunden gemischt sind. Und er zählt wohl nur nicht richtig, wenn die letzte Bestelllung eine Neukundenbestellung ist. Andersherum wenn es erst Neukunden und dann Gastbestellungen sind, dann zählt er das wohl richtig zusammen. Ich vermute, dass die Wahrscheinlichkeit höher ist, dass ein Kunde der den Shop erstmalig testet mit einer Gastbestellung und ab der zweiten Bestellung als Neuer Kunde bestellt häufiger ist, als erst als Neuer Kunde und dann als Gast. Insofern wäre es, wenn es denn kompliziert ist das in beide Richtungen richtig zu zählen, besser, wenn er bei erst Gast und dann Neuer Kunde richtig zählt.

    Auf jeden Fall nochmals vielen Dank - das Modul leistet mir gute Dienste.

    Gruß Timm

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.745
    • Geschlecht:
    "nicht ganz richtig zählt" wäre definitionswürdig.
    Da die Prüfung beim Zählen der Gast-Konten auch den account_type mit berücksichtigt (und der ist bei Gast-Konten == 1) dürfte eigtl. nichts verkehrt gezählt werden. Ich kann aber einen Denkfehler haben.
    Wenn du allerdings zufrieden bist, die mom. Funktion dir also ausreicht, will ich nichts gesagt haben.

    Gruß,
    noRiddle

    Timm

    • Fördermitglied
    • Beiträge: 6.343
    Ich bin gerade auswärts und wie gesagt nicht ganz im Thema drin. Ich glaube mich zu erinnern, dass wenn jemand bspw 3 mal als Gast bestellt hat und dann als Neuer Kunde, dass dann dort keine 4 steht sondern eine 1. Wenn jemand aber 3 mal als neuer Kunde bestellt und dann einmal als Gast, dann stünde dort eine 4. Wenn er dann wieder als Neuer Kunde bestellt würde vermutlich eine 4 dahinter stehen und nicht 5.

    Das andere Problem war wohl wenn Kunden mehrfach aber mit unterschiedlichen Emailadressen bestellen.

    Falls du irgendwann mal Zeit und Muße hast, könnte ich dir privat einen Zugang zu meinem Testshop schicken, in dem ich dann eine entsprechende Sicherung der DB einpflege, mit Angabe der entsprechenden Bestellnummern. Vielleicht ist es dann leichter nachvollziehbar. Müsste ich dann aber erstmal vorbereiten. Zur Zeit läuft da eine 2.0.5.0, die darauf wartet, dass endlich die 2.0.5.1 erscheint.

    Gruß Timm

    Andreas Kroll

    • Fördermitglied
    • Beiträge: 249
    • Geschlecht:
    Beitrag leider im falschen Thread eingefügt.
    Bitte löschen.
    MfG
    Andreas
    1 Antworten
    2092 Aufrufe
    07. Juli 2011, 13:20:36 von Tobi1981
    23 Antworten
    9109 Aufrufe
    29. Mai 2011, 14:52:59 von Tomcraft
    94 Antworten
    40565 Aufrufe
    14. August 2019, 14:43:16 von Timm