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: BETA MODUL: Modifiziertes DPD Versandmodul (Versand nach Postleitzahlen PLZ)

    dmun

    • Mitglied
    • Beiträge: 241
    Hallo,

    Da ich mit den aktuell verfügbaren Versandmodulen nicht so glücklich bin habe ich mit einer kleinen Anpassung angefangen, welche ich hier gerne vorstellen möchte.

    Grundsätzlich ist das in der 1.06 enthaltene DPD oder GLS Modul von der Grundidee schon mal recht gut, da hierbei auch Versandkosten zu bestimmten Postleitzahlenbereich angegeben werden können. Allerdings ist die Pflege dieser Daten recht umständlich, da diese auf drei Tabellen pro Modul verteilt werden. Dies ist zwar datenbanktechnisch korrekt (keine redundante Datenhaltung) aber umständlich zu pflegen.

    Mein Ansatz ist eine Tabelle in der alle Daten enthalten sind. Diese lassen sich dann bequem über Excel und Co pflegen und per CSV in die DB kopieren.

    Das aus Shop 1.06 vorhandene DPD Modul habe ich angepasst sodass die Daten aus der zentralen Tabelle gelesen werden. Weiterhin habe ich das Modul versucht so weit wie möglich zu "neutralisieren" sodass man es schnell und einfach clonen und somit eine neues Versandmodul z.B. für GLS oder DHL erzeugen kann.

    Zusammenfassung was jetzt geht:
    - Zentrale Datenhaltung in einer Tabelle
    - Pro Land können mehrere PLZ Bereiche mit unterschiedlichen Kosten angegeben werden
    - Auf und Abschläge sind pro Datensatz möglich. Plus, Minus oder Multiplikation

    Im Anhang befindet sich das neue Versandmodul (bezeichnet als dpdlex) nebst Sprachdateien für englisch und deutsch welche einfach in die vorhandene Installation kopiert werden können. Aktivieren nicht vergessen. Es sind keine Überschneidungen mit vorhandenen Modulen zu befürchten und es muss auch sonst nichts geändert werden.
    Danach muss noch die SQL-Datei shipping.sql auf die DB angewendet werden. Diese erzeugt die neue Tabelle "shipping" und füllt diese auch gleich mit Testdaten.

    Wer also testen will... Feedback, Kritik und Anregungen nicht vergessen.

    Was ich mir noch wünsche:
    Die Daten aus der shipping Tabelle zusätzlich für die Erzeugung der "Versandkostenübersicht" (Link Versandkosten neben dem Preis) zu nehmen sodass aus den vorhandenen Daten immer eine aktuelle Übersicht generiert wird. Wie sich das umsetzen lässt weiss ich aber noch nicht. Tipps sind willkommen.

    Viele Grüße, Dirk

    Linkback: https://www.modified-shop.org/forum/index.php?topic=29508.0
    Templateshop - Eine große Auswahl an neuen und modernen Templates für die modified eCommerce Shopsoftware

    Tomcraft

    • modified Team
    • Gravatar
    • Beiträge: 46.369
    • Geschlecht:
    Das Modul habe ich leider erst jetzt gefunden, entsprechend umbenannt und in die Modulecke verschoben.

    Es wäre prima, wenn jemand drüber schaut, aber ich denke, dass die Lösung hier derzeit die besser gepflegte ist: MODUL: Lieferung / Versand nach Postleitzahlen (PLZ)

    Grüße

    Torsten

    dmun

    • Mitglied
    • Beiträge: 241
    Hallo Torsten,

    diese Version ist nicht mehr aktuell. Das Modul hatte ich zwischenzeitlich weiter entwickelt und bereits seit Monaten im produktivem Einsatz. Damit konnte ich alle meine Anforderungen an die Versandabwicklung erschlagen ABER es gibt keinen grafischen Admin für die Pflege der Daten. Dies erledige ich direkt über die DB bzw. über Excel.
    Mir fehlt derzeit auch die Zeit dies weiter aus zu bauen und zu dokumentieren. Daher Verwendung auf eigene Gefahr. Feedback ist erwünscht.

    Grüße, Dirk

    md_kks

    • Neu im Forum
    • Beiträge: 47
    Hi,

    da ich das Modul MODUL: Lieferung / Versand nach Postleitzahlen (PLZ) in meinem shops nicht ordentlich zum laufen bekomme, oder vielleicht auch einfach irgendwas falsch mache, habe ich mir dieses Modul installiert und muss sagen es funktioniert total einfach und gut für mich.

    Die Pflege der Daten über die Datenbank stört mich gar nicht und ist sehr übersichtlich und einfach.

    Eine Sache gibt es , die ich gerne verändern würde und bei der ich Hilfe gebrauchen könnte.

    Und zwar fragt dieses Modul erst das Land ab und dann die Postleitzahl. Wenn die Postleitzahl z.b. 99427 in der Datenbank nicht vorhanden ist, dann wird einfach von einer anderen Postleitzahl oder spalte der Wert für die Versandkosten übernommen.

    Ich würde es gerne so haben, das wenn ich in eine Postleitzahl nicht liefern möchte, das Modul einfach ausgeblendet wird oder die Benachrichtigung kommt das in dieses Gebiet nicht geliefert werden kann, so wie wenn der Wert für das Land auf 0 gesetzt wäre.

    Wenn mir da jemand helfen könnte, dann würde ich nach dieser Veränderung und allen Textänderungen ein Modul für alle zugänglich machen, das ebenfalls Versand nach Postleitzahlen berechnet.

    Das gibt es zwar schon aber vielleicht funzt das bei anderen ja auch nicht mehr.

    Ich hoffe das es nur ein kleiner eingriff ist und nichts kompliziertes. Hier ist auf jedenfall die php Datei, falls jemand die Muse hat mal reinzuschauen:

    Code: PHP  [Auswählen]
    <?php
    /*
       ------------------------------------------------------------------------------
       Extended Shipping Module V 1.0
       Anpassung für: DPD Proaktive Benachrichtigung
       27.02.2014 / (c) dmun
       
       Clonen:      _DPDFLEX_ als Teilstring
                            dpdflex als ganzes Wort
           
            Die Daten werden aus der zentrallen Tabelle "shipping" gelesen.
            Aufbau der Tabelle und Bedeutung der Felder:
            `shipping_module` VARCHAR(100): Name des Versandmoduls z.B. dpdflex
            `shipping_charge` VARCHAR(1024): Kostenstring. Aufbau wie in den anderen Versand
                    modulen auch.
                    Beispiel: 0-3:4.5,3-6:5.5 usw. bedeutet 0-3 kg = 4.5 Euro, 3-6 kg = 5.5 Euro
                    Alternative: 3:4.5,6:5.5 usw. gleiche Bedeutung wie oben nur kürzer
            `shipping_free_limit` INT : kostenloser Versand ab X Euro. Nur Ganzzahlen sind erlaubt
                    Beispiel: 500 bedeutet ab 500 Euro kostenloser Versand
            `shipping_country` VARCHAR(2): Land der Versandadresse
            `shipping_from_zip` VARCHAR(20): Optional PLZ von
            `shipping_to_zip` VARCHAR(20): Optional PLZ bis
                    Durch Angabe eines PLZ Bereiches können bestimmte Gebiete mit anderen Kosten
                    beaufschlagt werden. Sinnvoll zum Beispiel bei Inseln (Inselzuschlag).
            `shipping_addition_type` ENUM('+','-','*'):
            `shipping_addition` DECIMAL(4,2):
                    Mit diesen beiden Feldern kann ein Auf oder Abschlag zu den Versandkosten umgesetzt
                    werden. shipping_addition_type gibt die Rechenart an. Plus, Minus oder mal und
                    shipping_addition den "Wert".
                    Beispiel: + 10  = fester Aufschlag von 10 Euro auf die Versandkosten vor Steuern und
                    zusätzlichen Handlinggebühren, sinnvoll       bei einem festen Aufschlag für Inselzustellung
                    Beispiel: - 3 = fester Abschlag von 3 Euro von den Versandkosten vor Steuern und
                    zusätzlichen Handlinggebühren. Wenn man den Versand subventionieren will.
                    Beispiel: * 1.05 = Die Versandkosten vor Steuern und zusätzlichen Handlinggebühren werden
                    um 5% erhöht. Sinnvoll bei Preisanpassungen, Kraftstoffzuschlägen und anderen Preiserhöhungen
                    Beispiel: * 0.90 = Die Versandkosten vor Steuern und zusätzlichen Handlinggebühren werden
                    um 10% reduziert. Wenn es mal günstiger werden sollte....
            `shipping_enabled` ENUM('0','1'):  1 = Datensatz aktiv, 0 = Datensatz nicht aktiv
            `shipping_comment` VARCHAR(255): Optional für Kommentare. Achtung bei Sondernzeichen und CSV
                    Im- bzw. Export
       ------------------------------------------------------------------------------
       based on:
       Copyrigt (c) 2004 cigamth
       ------------------------------------------------------------------------------
       based on:
       XTC-GLS Shipping Module - Contribution for XT-Commerce http://www.(( Wir dulden keine kommerziellen Werbelinks - Bitte <a href="index.php?topic=3013.0">Forenregeln</a> beachten! ))
       modified by http://www.hhgag.com
       Copyright (c) 2004 H.H.G.
       -----------------------------------------------------------------------------
       based on:
       (c) 2003 Deutsche Post Module
       Original written by Marcel Bossert-Schwab (webmaster@wernich.de), Version 1.2b
       Addon Released under GLSL V2.0 by Gunter Sammet (Gunter@SammySolutions.com)
       Contribution based on:
       osCommerce, Open Source E-Commerce Solutions
       http://www.oscommerce.com
       Copyright (c) 2002 - 2003 osCommerce
       Released under the GNU General Public License
       ---------------------------------------------------------------------------*/



      class dpdflex {
        var $code, $title, $description, $enabled, $icon;
           
            // class constructor
        function dpdflex() {
          global $order;

          $this->code = 'dpdflex';
          $this->title = MODULE_SHIPPING_DPDFLEX_TEXT_TITLE;
          $this->description = MODULE_SHIPPING_DPDFLEX_TEXT_DESCRIPTION;
          $this->sort_order = MODULE_SHIPPING_DPDFLEX_SORT_ORDER;
          $this->icon = DIR_WS_ICONS . 'shipping_dpd.gif';
          $this->tax_class = MODULE_SHIPPING_DPDFLEX_TAX_CLASS;
          $this->enabled = ((MODULE_SHIPPING_DPDFLEX_STATUS == 'True') ? true : false);

          if ( ($this->enabled == true) && ((int)MODULE_SHIPPING_DPDFLEX_ZONE > 0) ) {
            $check_flag = false;
            $check_query_string = " select
                                                                            zone_id
                                                                    from "
    . TABLE_ZONES_TO_GEO_ZONES . "
                                                                    where
                                                                            geo_zone_id = '"
    . MODULE_SHIPPING_DPDFLEX_ZONE . "'
                                                                    and
                                                                            zone_country_id = '"
    . $order->delivery['country']['id'] . "'
                                                                    order by zone_id"
    ;
            $check_query = xtc_db_query($check_query_string);
            while ($check = xtc_db_fetch_array($check_query)) {
                            if ($check['zone_id'] < 1) {
                                    $check_flag = true;
                                    break;
                            }
                            elseif ($check['zone_id'] == $order->delivery['zone_id']) {
                                    $check_flag = true;
                                    break;
                            }
            }

            if ($check_flag == false) {
              $this->enabled = false;
            }
          }
        }


        function quote($method = '') {
          global    $shipping_quote_all,
                                    $shipping_weight,
                                    $shipping_quoted,
                                    $shipping_cost_total,
                                    $shipping_method,
                                    $order;

                    $shipping_error = false;
            $destination_country = $order->delivery['country']['iso_code_2'];
            $destination_zip_code = $order->delivery['postcode'];
            $destination_zip_code = strtoupper(str_replace(' ', '', $destination_zip_code));
            // bei GB nur die ersten beiden Stellen der PLZ
            if($destination_country == 'GB') {
              $destination_zip_code = substr($destination_zip_code, 0, 2);
            }
                   
                    // Abfragen ob ein oder mehrer Einträge vorhanden sind
                    $sQry = " SELECT
                                            count(shipping_country) as entries
                                    FROM
                                            shipping
                                    WHERE
                                            shipping_country = '"
    . $destination_country . "'
                                    AND
                                            shipping_module = 'dpdflex'
                                    AND
                                            shipping_enabled = '1'"
    ;
                    $rQry   = xtc_db_query($sQry);
                    $aRows  = xtc_db_fetch_array($rQry);
                   
                    //
                    // kein Eintrag vorhanden = kein Versand möglich
                    //
                    if ($aRows['entries'] == 0) {
                            $this->quotes = array(  'id' => $this->code,
                                                                            'module' => MODULE_SHIPPING_DPDFLEX_TEXT_TITLE,
                                                                            'error' => MODULE_SHIPPING_DPDFLEX_INVALID_ZONE,
                                                                            'methods' => array(array(       'id' => $this->code,
                                                                                                                                    'title' => MODULE_SHIPPING_DPDFLEX_TEXT_TITLE,
                                                                                                                                    'cost' => 0)));
                            if ($this->tax_class > 0) {
                                    $this->quotes['tax'] =  xtc_get_tax_rate($this->tax_class,
                                                                                    $order->delivery['country']['id'],
                                                                                    $order->delivery['zone_id']);
                            }
                            if (xtc_not_null($this->icon))
                                    $this->quotes['icon'] = xtc_image($this->icon, $this->title);

                            return $this->quotes;
                    }
                   
                    //
                    // 1 Eintrag vorhanden - Abfrage ohne PLZ Bereich durchführen
                    //
                    if ($aRows['entries'] == 1) {
                    $sQry = " SELECT
                                            *
                                    FROM
                                            shipping
                                    WHERE
                                            shipping_country = '"
    . $destination_country . "'

                                    AND
                                            shipping_module = 'dpdflex'
                                    AND
                                            shipping_enabled = '1'"
    ;
                    }
                    //
                    // Mehr als 1 Eintrag vorhanden - Abfrage mit PLZ Bereich durchführen
                    //
                    if ($aRows['entries'] > 1) {
                    $sQry = " SELECT
                                            *
                                    FROM
                                            shipping
                                    WHERE
                                            shipping_country = '"
    . $destination_country . "'

                                    AND
                                            shipping_enabled = '1'
                                    AND
                                            shipping_module = 'dpdflex'
                                    AND
                                            '"
    . $destination_zip_code . "' BETWEEN shipping_from_zip AND shipping_to_zip";
                    }

                    $rQry = xtc_db_query($sQry);
                    $shipping_charge = xtc_db_fetch_array($rQry);

                    $shipping_cost_tmp = -1;
                    $shipping_charge_array = preg_split("/[:,]/" , $shipping_charge['shipping_charge']);   
                    for ($i = 0; $i < count($shipping_charge_array); $i+=2) {
                            $p = strpos($shipping_charge_array[$i],'-');
                            if ( $p !== false) {
                                    $shipping_charge_array[$i] = substr($shipping_charge_array[$i],$p+1);
                                    }
                            $shipping_charge_array[$i] = trim($shipping_charge_array[$i]);
                            $shipping_charge_array[$i+1] = trim($shipping_charge_array[$i+1]);
                           
                            if ($shipping_weight <= $shipping_charge_array[$i]) {
                                    $shipping_cost_tmp = $shipping_charge_array[$i+1];
                                    $shipping_method = MODULE_SHIPPING_DPDFLEX_TEXT_WAY . ' ' . $destination_country . ': ' . $shipping_weight . ' ' . MODULE_SHIPPING_DPDFLEX_TEXT_UNITS;;
                break;
              }
                    }
                   
                    if ( $shipping_cost_tmp == -1) {
                            $shipping_cost_total = 0;
                            $shipping_method = MODULE_SHIPPING_DPDFLEX_UNDEFINED_RATE;
                            $shipping_error = true;
                            }
                    else {
                            if($shipping_charge['shipping_free_limit'] == 0){
                                    //Aufschläge prüfen
                                    if ($shipping_charge['shipping_addition'] !== 0) {
                                            if ($shipping_charge['shipping_addition_type'] == '+') {
                                                            $shipping_cost_tmp = $shipping_cost_tmp + $shipping_charge['shipping_addition'];
                                                    }
                                            else if ($shipping_charge['shipping_addition_type'] == '-') {
                                                            $shipping_cost_tmp = $shipping_cost_tmp - $shipping_charge['shipping_addition'];
                                                    }
                                            else if ($shipping_charge['shipping_addition_type'] == '*') {
                                                            $shipping_cost_tmp = $shipping_cost_tmp * $shipping_charge['shipping_addition'];
                                                    }
                                    }
                                    // Ende Aufschläge
                                    $shipping_cost_total = (        $shipping_cost_tmp +
                                                                                            MODULE_SHIPPING_DPDFLEX_HANDLING +
                                                                                            SHIPPING_HANDLING );
                            }
                            else if ($shipping_charge['shipping_free_limit'] !== 0) {
                                    if($order->info['subtotal'] >= $shipping_charge['shipping_free_limit']){
                                            $shipping_cost_total = 0;
                                            $shipping_method = MODULE_SHIPPING_DPDFLEX_FREE_SHIPPING;
                                            }
                            else {
                                    //Aufschläge prüfen
                                    if ($shipping_charge['shipping_addition'] != 0) {
                                            if ($shipping_charge['shipping_addition_type'] == '+') {
                                                            $shipping_cost_tmp = $shipping_cost_tmp + $shipping_charge['shipping_addition'];
                                                    }
                                            else if ($shipping_charge['shipping_addition_type'] == '-') {
                                                            $shipping_cost_tmp = $shipping_cost_tmp - $shipping_charge['shipping_addition'];
                                                    }
                                            else if ($shipping_charge['shipping_addition_type'] == '*') {
                                                            $shipping_cost_tmp = $shipping_cost_tmp * $shipping_charge['shipping_addition'];
                                                    }
                                    }
                                    // Ende Aufschläge
                                    $shipping_cost_total = (        $shipping_cost_tmp +
                                                                                            MODULE_SHIPPING_DPDFLEX_HANDLING +
                                                                                            SHIPPING_HANDLING);
                                    }
                            }
                    }
        $this->quotes = array(      'id' => $this->code,
                                                            'module' => MODULE_SHIPPING_DPDFLEX_TEXT_TITLE,
                                                            'methods' => array(array(       'id' => $this->code,
                                                                                                                    'title' => $shipping_method,
                                                                                                                    'cost' => $shipping_cost_total)));

        if ($this->tax_class > 0) {
                    $this->quotes['tax'] = xtc_get_tax_rate($this->tax_class, $order->delivery['country']['id'], $order->delivery['zone_id']);
                    }
            if (xtc_not_null($this->icon)) $this->quotes['icon'] = xtc_image($this->icon, $this->title);
            if($shipping_error){
            $this->quotes['error'] = $shipping_method;
                    }
        return $this->quotes;
        }

        function check() {
          $check_query = xtc_db_query("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_SHIPPING_DPDFLEX_STATUS'");
          $this->_check = xtc_db_num_rows($check_query);

          return $this->_check;
        }

        function install() {

            //disabled the next one because of some problems: If module is installed and this set to 0, checkout doesn't work.
          xtc_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_group_id, sort_order, set_function, date_added) VALUES ('MODULE_SHIPPING_DPDFLEX_STATUS', 'True', '6', '0', 'xtc_cfg_select_option(array(\'True\', \'False\'), ', now())");
          xtc_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_group_id, sort_order, date_added) values ('MODULE_SHIPPING_DPDFLEX_HANDLING', '0', '6', '0', now())");
          xtc_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_group_id, sort_order, date_added) values ('MODULE_SHIPPING_DPDFLEX_ALLOWED', '', '6', '0', now())");
          xtc_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_group_id, sort_order, date_added) values ('MODULE_SHIPPING_DPDFLEX_SORT_ORDER', '0', '6', '0', now())");
          xtc_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_group_id, sort_order, use_function, set_function, date_added) values ('MODULE_SHIPPING_DPDFLEX_TAX_CLASS', '0', '6', '0', 'xtc_get_tax_class_title', 'xtc_cfg_pull_down_tax_classes(', now())");
          xtc_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_group_id, sort_order, use_function, set_function, date_added) values ('MODULE_SHIPPING_DPDFLEX_ZONE', '0', '6', '0', 'xtc_get_zone_class_title', 'xtc_cfg_pull_down_zone_classes(', now())");

            // Zentrale Tabelle für die Speicherung der Versanddaten anlegen
            // wenn noch nicht vorhanden
        if (xtc_db_query("  CREATE TABLE IF NOT EXISTS `shipping` (
                                                            `shipping_module` VARCHAR(100) NULL DEFAULT '',
                                                            `shipping_charge` VARCHAR(1024) NULL DEFAULT '',
                                                            `shipping_free_limit` INT NULL DEFAULT '0',
                                                            `shipping_country` VARCHAR(2) NOT NULL DEFAULT 'DE',
                                                            `shipping_from_zip` VARCHAR(20) NULL DEFAULT '',
                                                            `shipping_to_zip` VARCHAR(20) NULL DEFAULT '',
                                                            `shipping_enabled` ENUM('0','1') NOT NULL DEFAULT '1',
                                                            `shipping_addition_type` ENUM('+','-','*') NOT NULL DEFAULT '+',
                                                            `shipping_addition` DECIMAL(4,2) NOT NULL DEFAULT '0.0000',
                                                            `shipping_comment` VARCHAR(255) NULL
                                                    )
                                                    COLLATE='latin1_german1_ci'
                                                    ENGINE=MyISAM"
    )) {
          } else {
             }

        }

        function remove() {
                xtc_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
        }
        function keys() {
                    $keys = array('MODULE_SHIPPING_DPDFLEX_STATUS', 'MODULE_SHIPPING_DPDFLEX_HANDLING','MODULE_SHIPPING_DPDFLEX_ALLOWED', 'MODULE_SHIPPING_DPDFLEX_SORT_ORDER', 'MODULE_SHIPPING_DPDFLEX_TAX_CLASS', 'MODULE_SHIPPING_DPDFLEX_ZONE');
                    return $keys;
        }
      }
    ?>

    dmun

    • Mitglied
    • Beiträge: 241
    Hallo,

    das Modul habe ich zwischenzeitlich weiter entwickelt damit ich auch aktuelle rechtliche Anforderungen wie Versandkosten im Warenkorb damit anzeigen kann. Da scheinbar kein Interesse an dem Modul vorhanden ist, habe ich von weiteren Veröffentlichungen abgesehen.

    Normalerweise wird, wenn eine bestimmte PLZ nicht vorhanden ist, kein Wert zurück geliefert.
    Beispiel - definiert wurde:
    PLZ 1000 - 2000
    PLZ 3000 - 4000

    Lautet die PLZ des Empfänger nun 2455, dann wird kein Wert zurück geliefert bzw. die Versandart erst gar nicht zur Auswahl angezeigt.
    Das sollte auch bereits so in der von Dir verwendeten Version funktionieren.

    Wenn dies nicht der Fall ist, dann kannst Du Dich auch gerne per PM melden und ich schicke Dir dann die aktuelle Version zum Test zu (nicht direkt live einsetzen, habe kein Feedback !). Allerdings müssen dann noch ein paar Änderungen bzw. Ergänzungen in der DB vorgenommen werden, damit alles funktioniert.

    Gruß dmun

    md_kks

    • Neu im Forum
    • Beiträge: 47
    Hi Dmun,

    danke für deine Antwort und du hast recht, es funktioniert wirklich so wie es soll.

    Es wird nur ein anderer Wert ausgegeben, wenn ich im checkout bin und die zeile in der datenbank mit der gültigen plz abschalte also shipping_enabled auf 0 setze. Aber wer macht das schon, hab also einfach nur falsch getestet.

    Ich finde das Modul total super, besser als das andere.

    Ich würde gern dein aktualisiertes Modul testen und dir feedback geben.
    77 Antworten
    36034 Aufrufe
    17. Oktober 2017, 13:39:10 von Hans Bambel
    3 Antworten
    6998 Aufrufe
    03. Januar 2010, 16:47:44 von guensi
               
    anything