Migration PrestaShop 1.7 zu Shopware 5

Hi zusammen,

wir haben vor einiger Zeit leider die Fehlentscheidung getroffen, unseren Shop in PrestaShop 1.7 aufzusetzen. Ich möchte hier niemanden schlecht machen, aber meiner Meinung nach ist das System einfach zu verbuggt und nicht einsatztauglich. Zudem bin ich von den Möglichkeiten begeistert bin, die Shopware bringt. Deshalb haben wir nun zu Shopware 5.6.2 migriert. Ich habe zur Migration von 1.7 online fast nichts gefunden, deshalb möchte ich nun kurz meine Erfahrungen teilen, damit ggf. jemand davon profitieren kann.

Problem: das von Shopware bereitgestellte Migrationstool ist leider nur bis PrestaShop 1.6 kompatibel. Da 1.7 aber eine komplette Neuentwicklung ist, lässt es sich nicht einsetzen. Ich habe es versucht, die Artikel und Kategorien wurden importiert, aber bei Kunden und Bestellungen ist das Tool gecrasht. Immerhin hat man so die Artikel und Kategorien - Preise wurden leider falsch importiert und die Artikelbilder fehlten ganz. Musste also händisch gepflegt werden.

Da man Bestellungen derzeit leider nicht in Shopware importieren kann, mussten wir vorerst darauf verzichten, dass unsere Kunden ihre Bestellhistorie einsehen können. Das ist aber aus unserer Sicht aktuell verkraftbar (und könnte man ggf. zu einem späteren Zeitpunkt noch nachholen). Viel wichtiger ist meiner Meinung nach der Import der Kundendaten mit Passwörtern , sodass sich die Kunden im neuen Shop unverändert in Ihr Kundenkonto einloggen können.

Die gute Nachricht: PrestaShop 1.7 nutzt dieselbe Passwortverschlüsselung bcrypt wie Shopware 5. (In den Vorgängerversionen war es noch ein md5-Hash.) D.h. wir können die verschlüsselten Kundenpasswörter einfach so ins neue System übernehmen und die Kunden können sich unverändert einloggen. Für den Import habe ich das Import/Export-Plugin von Shopware genutzt. Um die Kundendaten aus PrestaShop auf die Import-Struktur von Shopware anzupassen, habe ich ein kleines PHP-Skript geschrieben, das ihr gerne nutzen und für euch anpassen könnt:

$shopdb = new PDO(/*...*/); // PDO-Connection zur PrestaShop 1.7 Datenbank

// Die Länder haben unterschiedliche IDs, daher muss man für die in PrestaShop genutzten Länder die alte ID der neuen Länder-ID in Shopware zuweisen
$countryIdMapping = array(
    1 => 2, // Deutschland
    2 => 23,
    3 => 5,
    6 => 27,
    7 => 8,
    8 => 9,
    10 => 14,
    12 => 18,
    13 => 21,
    17 => 11,
    19 => 26,
    20 => 7,
    24 => 4,
    26 => 12,
    131 => 42
);

// Das Geschlecht ist auch etwas anders abgebildet und in Shopware Pflichtfeld - hier muss man ggf. händisch die fehlenden Geschlechter anpassen
$genderMapping = array(
    0 => "ms", // falls kein Geschlecht ausgewählt
    1 => "mr",
    2 => "ms"
);

$stmt1=$shopdb->prepare("SELECT c.id_customer, c.email, c.passwd, c.active, c.id_gender, ba.id_address as billing_id, ba.company as billing_company, ba.firstname as billing_firstname, ba.lastname as billing_lastname, ba.address1 as billing_address1, ba.address2 as billing_address2, ba.postcode as billing_postcode, ba.city as billing_city, ba.phone as billing_phone, ba.id_country as billing_country, ba.vat_number as billing_vat_number, sa.id_address as shipping_id, sa.company as shipping_company, sa.firstname as shipping_firstname, sa.lastname as shipping_lastname, sa.address1 as shipping_address1, sa.address2 as shipping_address2, sa.postcode as shipping_postcode, sa.city as shipping_city, sa.id_country as shipping_country, c.newsletter, c.is_guest, c.date_add

FROM ps_orders o, ps_customer c
LEFT JOIN ps_address ba ON (c.id_customer = ba.id_customer AND ba.deleted = 0)
LEFT JOIN ps_address sa ON (c.id_customer = sa.id_customer AND sa.deleted = 0)

WHERE o.id_customer=c.id_customer AND ba.id_address = o.id_address_invoice AND sa.id_address = o.id_address_delivery AND c.id_default_group != 4

GROUP BY c.email ORDER BY o.date_add DESC");

$stmt1->execute();
$rows1 = $stmt1->fetchAll();

$list = array();
$list[] = array("customernumber","email","password","encoder","active","billing_company","billing_department","billing_salutation","billing_firstname","billing_lastname","billing_street","billing_zipcode","billing_city","phone","fax","billing_countryID","billing_stateID","ustid","shipping_company","shipping_department","shipping_salutation","shipping_firstname","shipping_lastname","shipping_street","shipping_zipcode","shipping_city","shipping_countryID","paymentID","newsletter","accountmode","customergroup","language","subshopID","first_login","last_login");
foreach ($rows1 as $row)
{
    $list[] = array($row['id_customer'], $row['email'], $row['passwd'], "bcrypt", $row['active'], $row['billing_company'], "", $genderMapping[$row['id_gender']], ucfirst($row['billing_firstname']), ucfirst($row['billing_lastname']), ucfirst($row['billing_address1'])." ".ucfirst($row['billing_address2']), $row['billing_postcode'], ucfirst($row['billing_city']), $row['billing_phone'], "", $countryIdMapping[$row['billing_country']], "", $row['billing_vat_number'], $row['shipping_company'], "", $genderMapping[$row['id_gender']], ucfirst($row['shipping_firstname']), ucfirst($row['shipping_lastname']), ucfirst($row['shipping_address1'])." ".ucfirst($row['shipping_address2']), $row['shipping_postcode'], ucfirst($row['shipping_city']), $countryIdMapping[$row['shipping_country']], 4, $row['newsletter'], $row['is_guest'], "EK", 1, 1, $row['date_add'], $row['date_add']);
}

$fp = fopen('byepresta.csv', 'w');

foreach ($list as $fields)
{
    fputcsv($fp, $fields, ";");
}

fclose($fp);

Das Skript hat einige Einschränkungen und erhebt keinerlei Anspruch auf Perfektion:

  • Es werden nur Kunden importiert, die schon mal bestellt haben, da ich nur über die Bestellungen die zuletzt verwendete Liefer- und Rechnungsadresse herausfinde.
  • Es werden genau die zuletzt verwendete Lieferadresse und die zuletzt verwendete Rechnungsadresse importiert, keine weiteren Adressen. Leider legt Shopware immer zwei Adressen an, auch wenn die beiden identisch sind (auch wenn ich im Import nur die billing_ Felder befülle und den Rest leer lasse).
  • Alle Kunden werden in die Kundengruppe EK eingefügt.
  • Wenn in PrestaShop die Geschlechter fehlen, können sie natürlich auch nicht korrekt importiert werden.
  • Ich habe unsere Amazon-Marketplace-Kunden ausgeschlossen, weil die sowieso kein Passwort haben (c.id_default_group != 4).
  • Ich habe das Import-Profil default_customers verwendet und um die Felder firstLogin und lastLogin erweitert, damit nicht alle Nutzer das Importdatum als Registrierungsdatum haben.

Für uns waren diese Einschränkungen OK, aber ich denke das kann jeder für sich anpassen und erweitern. Entscheidend ist: man bekommt nach Abschaltung des alten Shops mit dem Skript eine fertige CSV, die man so direkt ohne händische Anpassungen in den Import von Shopware laden kann und man hat binnen weniger Minuten alle Kunden importiert, die schon mal bestellt haben.

Ich hoffe, das hilft jemandem, der auch PrestaShop 1.7 nutzt und zu Shopware migrieren möchte. :slight_smile:

Liebe Grüße,
Matteo