blinkyth Posted August 29, 2007 Report Share Posted August 29, 2007 währe den jemand so freundlich aus meiner alten shop csv mit den kunden daten: anrede, name, vorname, str, plz, ort, firma, e-mail eine sql csv datei oder sowas zu machen womit ich meine kunden in xtc bekomme??? biddö biddö biddö mail an: kontakt at blaulicht-shop.de gruß blinky Link to comment Share on other sites More sharing options...
chaosgenie Posted August 29, 2007 Report Share Posted August 29, 2007 Tach auch => http://www.xt-commerce.com/forum/showthread.php?t=52660 Link to comment Share on other sites More sharing options...
blinkyth Posted August 30, 2007 Report Share Posted August 30, 2007 ja da habe ich ja schon mitgemacht. aber was bringt es mir in 2 jahren oder so Link to comment Share on other sites More sharing options...
hofie81 Posted October 20, 2008 Report Share Posted October 20, 2008 Also, das Script funktioniert 1A (Shop Version 304SP2.1). Die Kunden werden sauber angelegt, nur die E-Mail an den Kunden ist leer. Der Kunde bekommt zwar eine E-Mail mit dem richtigen Betreff, aber sonst nichts. Wieso funktioniert das nicht??? Link to comment Share on other sites More sharing options...
isbn1 Posted November 17, 2008 Report Share Posted November 17, 2008 bin wohl zu blöd dafür: bekomme diese Meldung: ERROR: LKZ_CONVERT_ERROR lkz= countries_id= countries_name= ERROR: ENTRY_EMAIL_ADDRESS_ERROR fehler beim anlegen von , , , Natürlich wird da nichts angelegt. Irgendwer nen Vorschlag? Danke!! Link to comment Share on other sites More sharing options...
isbn1 Posted November 19, 2008 Report Share Posted November 19, 2008 kleiner, unauffälliger Schubs Link to comment Share on other sites More sharing options...
1a.technik Posted December 16, 2008 Report Share Posted December 16, 2008 Da ich soetwas gerade entwickelt habe, stelle ich es euch gerne zur verfügung! Damit habe ich gerade ca. 4900 Kunden über eine csv-datei importiert und jedem eine eMail geschickt mit einem neuen Passwort. <?php define('GZIP_COMPRESSION','false'); include ('includes/application_top.php'); require_once (DIR_FS_INC.'xtc_get_country_list.inc.php'); require_once (DIR_FS_INC.'xtc_validate_email.inc.php'); require_once (DIR_FS_INC.'xtc_encrypt_password.inc.php'); require_once (DIR_FS_INC.'xtc_get_geo_zone_code.inc.php'); require_once (DIR_FS_INC.'xtc_write_user_info.inc.php'); function getpass($laenge=10) { $newpass = ""; $string="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; mt_srand((double)microtime()*1000000); for ($i=1; $i <= $laenge; $i++) { $newpass .= substr($string, mt_rand(0,strlen($string)-1), 1); } return $newpass; } $lines = 0; $lines_ok = 0; $importfile="kunden_import.csv"; $fh = fopen($importfile, "r") or die ("Kann Datei nicht lesen."); while(!feof($fh)) { // zeile einlesen & werte zuweisen $zeile=fgets($fh); list($anrede, $firstname, $lastname, $company, $geburtsdatum, $street_address, $lkz, $postcode, $city, $suburb, $telephone, $fax, $email_address, $password) = split(";", $zeile); $lines+=1; // neues zufallspasswort erstelllen. $password = getpass(10); // vorhandene Daten aufbereiten. switch($anrede) { case "01": $gender = "m"; break; case "02": $gender = "f"; break; default: $gender = "m"; } // http://www.didihome.de/html/tab-lkz.htm // Problemkinder: BAL, EI switch(strtoupper($lkz)) { case "D": $lkz = "DE"; break; case "A": $lkz = "AT"; break; case "F": $lkz = "FR"; break; case "WD": $lkz = "DM"; break; case "CDN": $lkz = "CA"; break; case "I": $lkz = "IT"; break; case "N": $lkz = "NO"; break; case "U": $lkz = "UY"; break; // ?? P = POLEN!? case "P": $lkz = "PL"; break; case "J": $lkz = "JP"; break; case "E": $lkz = "ES"; break; case "H": $lkz = "HU"; break; case "AUS": $lkz = "AU"; break; case "FL": $lkz = "LI"; break; case "S": $lkz = "SE"; break; case "L": $lkz = "LU"; break; case "RB": $lkz = "BW"; break; case "FIN": $lkz = "FI"; break; case "RI": $lkz = "ID"; break; case "B": $lkz = "BE"; break; case "SGP": $lkz = "SG"; break; case "EST": $lkz = "EE"; break; case "IRL": $lkz = "IE"; break; case "RUS": $lkz = "RU"; break; case "SLO": $lkz = "SI"; break; case "USA": $lkz = "US"; break; } $country_query = xtc_db_query("SELECT * FROM `countries` WHERE `countries_iso_code_2` = '".strtoupper($lkz)."'"); $country_data = xtc_db_fetch_array($country_query); $country = $country_data['countries_id']; if(!is_numeric($country_data['countries_id'])) { echo " <b>ERROR:</b> LKZ_CONVERT_ERROR<br>\n"; echo "lkz=".$lkz." countries_id=".$country_data['countries_id']. " countries_name=".$country_data['countries_name']."<br>\n"; } if ($geburtsdatum != ".000000000" && $geburtsdatum != "") { list($jahr, $monat, $tag) = sscanf($geburtsdatum,"%4d%2d%2d.%d"); $dob = sprintf("%02d.%02d.%4d",$tag,$monat,$jahr); //echo $geburtsdatum . " = " . $dob ."<br>\n"; } else $dob=''; // sonnstige variablen $customers_status = DEFAULT_CUSTOMERS_STATUS_ID; $newsletter = "0"; $do_not_report = false; // daten in db eintragen require_once(DIR_WS_CLASSES.'vat_validation.php'); $vatID = new vat_validation($vat, '', '', $country); $customers_status = $vatID->vat_info['status']; $customers_vat_id_status = $vatID->vat_info['vat_id_status']; $error = $vatID->vat_info['error']; if($error==1) { //$messageStack->add('create_account', ENTRY_VAT_ERROR); echo " <b>ERROR:</b> ENTRY_VAT_ERROR<br>\n"; $error = true; } if(!is_numeric($country_data['countries_id'])) $error = true; $email_exists = false; $check_email_query = xtc_db_query("select count(*) as total from ".TABLE_CUSTOMERS." where customers_email_address = '".xtc_db_input($email_address)."' and account_type = '0'"); $check_email = xtc_db_fetch_array($check_email_query); if ($check_email['total'] > 0) { $email_exists = true; } if($email_exists == true) { $error = true; $do_not_report = true; //$messageStack->add('create_account', ENTRY_EMAIL_ADDRESS_ERROR_EXISTS); //echo " <b>ERROR:</b> ENTRY_EMAIL_ADDRESS_ERROR_EXISTS<br>\n"; } elseif (strlen($email_address) < ENTRY_EMAIL_ADDRESS_MIN_LENGTH) { $error = true; //$messageStack->add('create_account', ENTRY_EMAIL_ADDRESS_ERROR); echo " <b>ERROR:</b> ENTRY_EMAIL_ADDRESS_ERROR<br>\n"; } elseif (xtc_validate_email($email_address) == false) { $error = true; //$messageStack->add('create_account', ENTRY_EMAIL_ADDRESS_CHECK_ERROR); echo " <b>ERROR:</b> ENTRY_EMAIL_ADDRESS_CHECK_ERROR<br>\n"; /* $fp3 = fopen("kunden_import_mail-check-fail.csv", "a"); fputs($fp3, $zeile); fclose ($fp3); */ } if($dob != '') { if (checkdate(substr(xtc_date_raw($dob), 4, 2), substr(xtc_date_raw($dob), 6, 2), substr(xtc_date_raw($dob), 0, 4)) == false) { $error = true; echo " <b>ERROR:</b> ENTRY_DATE_OF_BIRTH_ERROR<br>\n"; //$messageStack->add('create_account', ENTRY_DATE_OF_BIRTH_ERROR); } } if($error != true) { $lines_ok += 1; $sql_data_array = array ('customers_vat_id' => $vat, 'customers_vat_id_status' => $customers_vat_id_status, 'customers_status' => $customers_status, 'customers_firstname' => $firstname, 'customers_lastname' => $lastname, 'customers_email_address' => $email_address, 'customers_telephone' => $telephone, 'customers_fax' => $fax, 'customers_newsletter' => $newsletter, 'customers_password' => xtc_encrypt_password($password),'customers_date_added' => 'now()','customers_last_modified' => 'now()'); $sql_data_array['customers_gender'] = $gender; $sql_data_array['customers_dob'] = xtc_date_raw($dob); xtc_db_perform(TABLE_CUSTOMERS, $sql_data_array); $user_id = xtc_db_insert_id(); //xtc_write_user_info($user_id); $sql_data_array = array ('customers_id' => $user_id, 'entry_firstname' => $firstname, 'entry_lastname' => $lastname, 'entry_street_address' => $street_address, 'entry_postcode' => $postcode, 'entry_city' => $city, 'entry_country_id' => $country,'address_date_added' => 'now()','address_last_modified' => 'now()'); $sql_data_array['entry_gender'] = $gender; $sql_data_array['entry_company'] = $company; if (ACCOUNT_SUBURB == 'true') $sql_data_array['entry_suburb'] = $suburb; if (ACCOUNT_STATE == 'true') { if ($zone_id > 0) { $sql_data_array['entry_zone_id'] = $zone_id; $sql_data_array['entry_state'] = ''; } else { $sql_data_array['entry_zone_id'] = '0'; $sql_data_array['entry_state'] = $state; } } xtc_db_perform(TABLE_ADDRESS_BOOK, $sql_data_array); $address_id = xtc_db_insert_id(); xtc_db_query("update ".TABLE_CUSTOMERS." set customers_default_address_id = '".$address_id."' where customers_id = '".(int) $user_id."'"); xtc_db_query("insert into ".TABLE_CUSTOMERS_INFO." (customers_info_id, customers_info_number_of_logons, customers_info_date_account_created) values ('".(int) $user_id."', '0', now())"); // create smarty elements $smarty = new Smarty; $smarty->assign('GENDER', $gender); $smarty->assign('FIRSTNAME', $firstname); $smarty->assign('LASTNAME', $lastname); $smarty->assign('EMAIL', $email_address); $smarty->assign('PASSWORT', $password); $smarty->caching = false; $txt_mail_customer = $smarty->fetch(DIR_FS_CATALOG.'kunden_import_mail.txt'); $mail_subject = "Unser neuer Onlineshop"; /* echo "<pre>\n"; echo $txt_mail_customer; echo "</pre>\n"; */ // mail versenden xtc_php_mail(STORE_OWNER_EMAIL_ADDRESS, STORE_OWNER, $email_address, $firstname.' '.$lastname, '', STORE_OWNER_EMAIL_ADDRESS, STORE_OWNER, '', '', $mail_subject, '', $txt_mail_customer); } else { if(!$do_not_report==true) { echo "<b color=\"red\">fehler beim anlegen von $firstname, $lastname, $company, $email_address</b><br>\n"; echo "<b>------------------------------------------------------------------------------------------------------</b><br>\n"; } } flush(); } fclose($fh); echo "$lines_ok von $lines Daten importiert!"; include ('includes/application_bottom.php'); ?> Und das Mail-Template: {if $GENDER == 'f'} Sehr geehrte Frau {$LASTNAME}, {else} Sehr geehrter Herr {$LASTNAME}, {/if} seit 01.02.2007 ist unser neuer Onlineshop unter [url=http://www.modellsport.de/shop/]Modellsport.de[/url] erreichbar. Da Sie bereits Kunde bei uns sind, haben wir Ihre Daten in den neuen Shop übernommen. Sie können sich mit folgenden Login-Daten anmelden: Benutzer: {$EMAIL} Passwort: {$PASSWORT} Bitte überprüfen Sie bei Gelegenheit, ob die Angaben, wie Name, Adresse usw. noch korrekt sind und geben uns Bescheid, wenn sich irgendwelche Fehler eingeschlichen oder Daten geändert haben sollten. Wir danken für Ihre Mithilfe und verbleiben mit freundlichen Grüßen MODELLSPORT VERLAG GMBH - Vertrtiebsleitung - Thomas Wäldele Es ist zwar kein allround script, aber man kann es entsprechend anpassen und dient deswegen mal als grundlage. Weiß jemand wie man dieses Script einbauen muß ??? Link to comment Share on other sites More sharing options...
Stalinstadt Posted January 19, 2009 Report Share Posted January 19, 2009 man muss die kundendaten nur auf die tabellen customers adress_book und customers_info verteilen Die feldnamen in diesen Tabellen sind eigentlich selbsterklärend. Das ist schön, wenn es so einfach ist. Ich wechsele von OSC zu XTC aus verschiedenen Gründen. Der Shop steht, nun müssen noch 2.800 Kunden incl. Bestellungen portiert werden. Das soll nun im XTC Shop 500 Euro kosten. Ich empfinde das auf Grund obiger Aussage als Frechheit und verstehe, warum dieses Tool nicht eingebaut ist oder irgendwo eine Anleitung zum do it yourself zu finden ist. Hat bitte jemand einen Tip, wo man dies für einen fairen Preis realisieren lassen kann? Link to comment Share on other sites More sharing options...
mzanier Posted January 19, 2009 Report Share Posted January 19, 2009 Das soll nun im XTC Shop 500 Euro kosten. Bitte genau hinsehen. Eine Übernahme von Kundendaten alleine kostet 125 Eur. 417 Eur fallen nur für Kunden+Bestellungen+Artikel an, da hierfür teilweise jeder Datensatz kontrolliert werden muss. Link to comment Share on other sites More sharing options...
Stalinstadt Posted January 19, 2009 Report Share Posted January 19, 2009 Danke für die schnelle Antwort, die allerdings drei Fragen bei mir aufwirft: 1.) Warum ist es ein pauschaler Preis? Ist es kein Unterschied im Aufwand, 500 oder 5000 Kunden oder Artikel zu portieren? Hieraus schliesst man doch, das es irgend eine Routine zur Portierung geben muss? 2.) "Nicht enthalten im Angebot sind Anpassungen, Programmierarbeiten...", bedeutet dies, das bei auftretenden Fehlern nochmals ein Bertag X hinzukommt oder betrifft dies nicht den Bereich der eigentlichen Portierung? 3.) Wenn es offenbar eine Routine dafür gibt oder zumindest einen Plan, welche Tabellen der Datenbank von beiden Shopsystemen hier zusammengeführt werden müssen, warum lässt man den Kunden nicht diese Handarbeit erledigen, bei der er nach eigener Sorgfalt auch Fehler wie falsche Namensschreibung, Groß-Kleinschrift etc. korrigieren kann? Eine halbe A4 Seite Anleitung kann doch hier nicht zuviel verlangt sein, so das man sich zumindest als halbwegs veranlagter Kunde selbst versuchen kann? Verstehen Sie mich nicht falsch Marco, es ist schon klar und korrekt das Sie mit Zusatzaufträgen Ihr Geld verdienen. Mich ärgert es nur, das ich nach den 800 Euro für eine professionelle Shoperstellung mit Zusatzmodulen noch einmal kräftig drauflegen soll. Zudem für eine Datenportierung, in der ich bei allen möglichen anstehenden Fragen vor dem Wechsel zu XTC wirklich keine Fragen erwartete da es mir selbstverständlich erschien, das dies in irgendeiner Form integriert oder zumindest nachzulesen ist. In diesem Fall steht man als Neukunde einfach da und ärgert sich. So als kaufe man einen Neuwagen bei dem sich herausstellt, das nachträglich die Montage des Tankstutzens beauftragt werden soll. Link to comment Share on other sites More sharing options...
mzanier Posted January 19, 2009 Report Share Posted January 19, 2009 1.) Warum ist es ein pauschaler Preis? Ist es kein Unterschied im Aufwand, 500 oder 5000 Kunden oder Artikel zu portieren? Hieraus schliesst man doch, das es irgend eine Routine zur Portierung geben muss? Ja dafür haben wir scripts, eine mauelle nachbearbeitung und kontrolle ist aber erforderlich. 500 Eur sind dafür auch kein großer Preis, das sind nichtmal 7 Arbeitsstunden, welche für eine Portierung aber schnell anfallen. 2.) "Nicht enthalten im Angebot sind Anpassungen, Programmierarbeiten...", bedeutet dies, das bei auftretenden Fehlern nochmals ein Bertag X hinzukommt oder betrifft dies nicht den Bereich der eigentlichen Portierung? Das bedeutet das die Portierung für eine Standardinstallation ist, sollte man zb eine modifizierte oscommerce version besitzen die nichtmehr über eine originale datenbankstruktur verfügt, enstehen kosten wenn dadurch ein mehraufwand seitens der portierung ensteht. 3.) Wenn es offenbar eine Routine dafür gibt oder zumindest einen Plan, welche Tabellen der Datenbank von beiden Shopsystemen hier zusammengeführt werden müssen, warum lässt man den Kunden nicht diese Handarbeit erledigen, bei der er nach eigener Sorgfalt auch Fehler wie falsche Namensschreibung, Groß-Kleinschrift etc. korrigieren kann? Das gab es bereits, aber zuviele Kunden hatten mit der komplexen Aufgabe Probleme, genau aus diesem Grund gibt es auch eine Dienstleistung dafür. Bitte beachten Sie das es auf dem Markt einige hundert verschiede Shopsysteme gibt, wir können nicht für jedes System fertige Portierungsscript und Anleitungen bereitstellen. Link to comment Share on other sites More sharing options...
Stalinstadt Posted January 19, 2009 Report Share Posted January 19, 2009 ... Bitte beachten Sie das es auf dem Markt einige hundert verschiede Shopsysteme gibt, wir können nicht für jedes System fertige Portierungsscript und Anleitungen bereitstellen. Ok, das ist andererseits verständlich. Dann werde ich wohl nicht umhinkommen, den Service in Anspruch zu nehmen. Vielen Dank zunächst für die Klarstellungen. Link to comment Share on other sites More sharing options...
Sir Knight Posted January 19, 2009 Report Share Posted January 19, 2009 ... das ich nach den 800 Euro für eine professionelle Shoperstellung mit Zusatzmodulen noch einmal kräftig drauflegen soll. Zudem für eine Datenportierung, in der ich bei allen möglichen anstehenden Fragen vor dem Wechsel zu XTC wirklich keine Fragen erwartete da es mir selbstverständlich erschien, das dies in irgendeiner Form integriert oder zumindest nachzulesen ist. In diesem Fall steht man als Neukunde einfach da und ärgert sich. So als kaufe man einen Neuwagen bei dem sich herausstellt, das nachträglich die Montage des Tankstutzens beauftragt werden soll. also wenn jemand für die Shoperstellung 800 Euro genommen hat ( und sicher informiert war das das ein wechsel von OS auf XT ist - dann sollte das doch wohl INKL. der Daten sein.... @stalinstadt=guck mal ins postfach - hab da nen link für ein oscommerce modul gefunden Link to comment Share on other sites More sharing options...
nieola Posted January 21, 2009 Report Share Posted January 21, 2009 Hast Du mal eine Antwort darauf bekommen. Habe ähnlichen Fehler. Link to comment Share on other sites More sharing options...
nieola Posted January 21, 2009 Report Share Posted January 21, 2009 Hallo, ich versuche das Script zu verwenden, bekomme aber folgenden Fehler: ERROR: LKZ_CONVERT_ERROR lkz= countries_id= countries_name= ERROR: ENTRY_EMAIL_ADDRESS_ERROR fehler beim anlegen von , , , ------------------------------------------------------------------------------------------------------ ERROR: LKZ_CONVERT_ERROR lkz= countries_id= countries_name= ERROR: ENTRY_EMAIL_ADDRESS_ERROR fehler beim anlegen von , , , ------------------------------------------------------------------------------------------------------ ERROR: LKZ_CONVERT_ERROR lkz= countries_id= countries_name= ERROR: ENTRY_EMAIL_ADDRESS_ERROR fehler beim anlegen von , , , ------------------------------------------------------------------------------------------------------ 0 von 3 Daten importiert! Das Problem wurde schon einmal angesprochen. Gibt es dafür eine Lösung? Was mache ich falsch Danke im Voraus Link to comment Share on other sites More sharing options...
Stalinstadt Posted January 22, 2009 Report Share Posted January 22, 2009 @ nieola, gehe hier hin: http://www.estelco.de/product_info.php/products_id/104/product/datenportierung-von-anderem-shop-zu-xt:commerce.html Für vergleichsweise wenig Geld bist Du den Stress los. Link to comment Share on other sites More sharing options...
nieola Posted January 22, 2009 Report Share Posted January 22, 2009 Danke für den Hinweis. Ich staune über dieses Forum nur noch. Hier müssen doch irgendwo kluge Köpfe sein, die diese Problem schon mal gelöst haben. Zumindest mal diejenigen, die die Threats seinerzeit aufgemacht haben. Link to comment Share on other sites More sharing options...
zauberwald Posted March 25, 2009 Report Share Posted March 25, 2009 Schon möglich. Aber die behalten ihr Wissen offensichtlich für sich oder verkaufen es für viel Geld. Ich muss schon etwas staunen über die "Kundenfreundlichkeit" die hier an den Tag gelegt wird. Seitens der Macher von xtc wird auf Daten verwiesen die es nicht mehr gibt, oder die User werden einfach schroff abgeblockt. Wenn das die Form von Support ist, mal abgesehen von der "Friss (bezahl) - oder - stirb - Manier", dann frag ich mich, warum sich xtc nicht mal gedanken darüber macht, dass auf andere Weise mit Sicherheit mehr Kunden gehalten oder wenigstens zufrieden gestellt werden. Auf diese Weise treibt man die Leute nur weg. Wie soll man guten Gewissens zu einem Produkt raten, bei dem man einfach allein im Regen stehen gelassen wird?! Nicht zuletzt hab ich von einer Firma die dafür bezahlt wurde die Info bekommen, dass sowas wie ein funktionierender Export / Import bei xt:commerce etwas sei dass es nicht gibt und auch nie geben wird. Danke für die Info. Link to comment Share on other sites More sharing options...
zremus Posted March 26, 2009 Report Share Posted March 26, 2009 Ich habe inzwischen alle Datenbanken in ein csv file exportiert dann aufbereitet für den Insert als Textdatei in den entsprechenden Datenbankfeldern. Einfach per SQL exportieren und importieren ist nun wirklich kein Akt, ABER wehe man hat einige externe Module in den Shop eingebaut, denn dann passen die Datenbankfelder nicht mehr und mann muss halt vorher die csv files anpassen. Und da wir ein SEO XT-Commerce Shop umziehen wollten passten einige Datenbank felder nicht mehr. Also wie gesagt, ist euer Shop immer noch der Standartshop von XTC, dann einfach per SQL-Export in eurer Datenbank alt die entsprechenden Datenbanken exportieren und in eurer neuen Datenbank importieren. Gruß Zacharias Link to comment Share on other sites More sharing options...
FreeGroup Posted April 25, 2010 Report Share Posted April 25, 2010 Hi, du könntest für jede Art von Import eventuell dbTube verwenden. Lieben Gruß Andreas Link to comment Share on other sites More sharing options...
Mathias Sohn Posted November 3, 2010 Report Share Posted November 3, 2010 Der Script von ThomasCr ist wow! Danke! Ich habe ein paar kleine Änderungen vorgenommen, so zB. wird immer 1 Satz über das Dateiende hinausgelesen, dann kommt die Meldung mit dem Land. Der Aufbau ist wert;wert;wert; also ohne Anführungsstriche, Semikolongetrennt, je Datensatz eine Zeile. Beispiel: 01;20123;Hans;Meier;MeineFirma; ;MeineStr. 4;D;77777;Irgendwo;Adresszusatz;0123-2342;0123-2349;[email protected];password die PHP-Datei wie die DIV- Datei im Root ablegen und die PHP über browser aufrufen. ggf. noch die PHP auf ausführbar setzen (chmod). Ich werde an dem Source dran bleiben, da ich so was für die Sage Classic Line brauche. Hier schon mal eine funktionierende und teildokumentierte Version. <?php define('GZIP_COMPRESSION','false'); include ('includes/application_top.php'); require_once (DIR_FS_INC.'xtc_get_country_list.inc.php'); require_once (DIR_FS_INC.'xtc_validate_email.inc.php'); require_once (DIR_FS_INC.'xtc_encrypt_password.inc.php'); require_once (DIR_FS_INC.'xtc_get_geo_zone_code.inc.php'); require_once (DIR_FS_INC.'xtc_write_user_info.inc.php'); //------------------------------------------------------------------------ function getpass($laenge=10) { $newpass = ""; $string="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; mt_srand((double)microtime()*1000000); for ($i=1; $i <= $laenge; $i++) { $newpass .= substr($string, mt_rand(0,strlen($string)-1), 1); } return $newpass; } //------------------------------------------------------------------------ // Programm startet hier $lines = 0; $lines_ok = 0; // Importdatei mit den Kundendaten // Das Format ist csv, d.h. Felder werden mit Semikolon getrennt, keine Anfuehrungszeichen, jeder Datensatz hat eine eigene Zeile // z.Beispiel: 01;20123;Hans;Meier;MeineFirma; ;MeineStr. 4;D;77777;Irgendwo;Adresszusatz;0123-2342;0123-2349;[email protected];password // '- leer gelassenes Feld // Der Dateiname kann hier geaendert werden. Die Datei muss im Stammverzeichnis des Shops liegen. // Aufruf über 'www.meinshop.de/kundenimport.php' $importfile="kunden_import.csv"; // Kundendatei öffnen $fh = fopen($importfile, "r") or die ("Kann Datei nicht lesen."); // Erste Zeile einlesen $zeile=fgets($fh); // Schleife wiederholen bis alle Datensaetze abgearbeitet sind while(!feof($fh)) { // Werte zerlegen (;)und Werte zuweisen list($anrede, $customer, $firstname, $lastname, $company, $geburtsdatum, $street_address, $lkz, $postcode, $city, $suburb, $telephone, $fax, $email_address, $password) = split(";", $zeile); $lines+=1; // neues Zufallspasswort erstellen. $password = getpass(10); // Daten 'anrede'aufbereiten, abhaengig von den Eingangswerten für die Anrede. // die Varianten koennen beliebig erweitert werden, indem neue case ... eingetragen werden. // xtc erwartet die Anrede (gender) als (m)ale oder (f)emale switch($anrede) { case "01": case "Herr": case "M": $gender = "m"; break; case "02": case "Frau": case "W": $gender = "f"; break; //nichts passt, dann Herr default: $gender = "m"; } // http://www.didihome.de/html/tab-lkz.htm // Problemkinder: BAL, EI switch($lkz) { case "D": case "DE": case "": $lkz = "DE"; break; case "A": $lkz = "AT"; break; case "F": $lkz = "FR"; break; case "WD": $lkz = "DM"; break; case "CDN": $lkz = "CA"; break; case "I": $lkz = "IT"; break; case "N": $lkz = "NO"; break; case "U": $lkz = "UY"; break; // ?? P = POLEN!? case "P": $lkz = "PL"; break; case "J": $lkz = "JP"; break; case "E": $lkz = "ES"; break; case "H": $lkz = "HU"; break; case "AUS": $lkz = "AU"; break; case "FL": $lkz = "LI"; break; case "S": $lkz = "SE"; break; case "L": $lkz = "LU"; break; case "RB": $lkz = "BW"; break; case "FIN": $lkz = "FI"; break; case "RI": $lkz = "ID"; break; case "B": $lkz = "BE"; break; case "SGP": $lkz = "SG"; break; case "EST": $lkz = "EE"; break; case "IRL": $lkz = "IE"; break; case "RUS": $lkz = "RU"; break; case "SLO": $lkz = "SI"; break; case "USA": $lkz = "US"; break; default: echo "Land nicht gefunden, DE gesetzt.<br>"; $lkz = "DE"; break; } // sql-Abfrage aufbauen mit ermitteltem Laenderkennzeichen $country_query = xtc_db_query("SELECT * FROM `countries` WHERE `countries_iso_code_2` = '".strtoupper($lkz)."'"); // sql-Abfrage abfeuern $country_data = xtc_db_fetch_array($country_query); // Land-ID als Ergebnis retten, es wird in der DB nicht die Kennung sondern der Index (ID) gespeichert $country = $country_data['countries_id']; // Keine Land-ID gefunden? Fehler sollte nicht auftreten, da zuvor ja 'DE' als default gesetzt wurde, es sei denn, // das Land DE existiert nicht im Shop if(!is_numeric($country_data['countries_id'])) { echo " <b>ERROR:</b> LKZ_CONVERT_ERROR<br>\n"; echo "lkz=".$lkz." countries_id=".$country_data['countries_id']. " countries_name=".$country_data['countries_name']."<br>\n"; } else { echo "Land ist " .$country . " / " . $country_data['countries_name']."<br>\n"; } // weiter mit Geburtstag, darf auch leer sein if ($geburtsdatum != ".000000000" && $geburtsdatum != "") // Geburtstag uebergeben { // Datum formatieren, hier koennen Anpassungen notwendig sein, je nach Eingangsdaten list($jahr, $monat, $tag) = sscanf($geburtsdatum,"%4d%2d%2d.%d"); // erstellt 'tt.mm.jjjj' - Zeichenfolge $dob = sprintf("%02d.%02d.%4d",$tag,$monat,$jahr); echo $geburtsdatum . " = " . $dob ."<br>\n"; } else // Geburtstag wurde nicht uebergeben (leer) { $dob=''; } // sonstige Variablen belegen // Kundenstatus mit Standardwert belegen, // Einstellung unter 'Konfiguration' / 'Mein Shop', hier Feld 'Kundenstatus für Neukunden'' $customers_status = DEFAULT_CUSTOMERS_STATUS_ID; $newsletter = "0"; $do_not_report = false; // daten in db eintragen require_once(DIR_WS_CLASSES.'vat_validation.php'); $vatID = new vat_validation($vat, '', '', $country); $customers_status = $vatID->vat_info['status']; $customers_vat_id_status = $vatID->vat_info['vat_id_status']; $error = $vatID->vat_info['error']; if($error==1) { //$messageStack->add('create_account', ENTRY_VAT_ERROR); echo " <b>ERROR:</b> ENTRY_VAT_ERROR<br>\n"; $error = true; } if(!is_numeric($country_data['countries_id'])) $error = true; // Pruefung der email- Adresse // Schalter vorbelegen $email_exists = false; // sql- Abfrage aufbauen $check_email_query = xtc_db_query("select count(*) as total from ".TABLE_CUSTOMERS." where customers_email_address = '".xtc_db_input($email_address)."' and account_type = '0'"); $check_email = xtc_db_fetch_array($check_email_query); if ($check_email['total'] > 0) { $email_exists = true; } if($email_exists == true) { $error = true; $do_not_report = true; //$messageStack->add('create_account', ENTRY_EMAIL_ADDRESS_ERROR_EXISTS); //echo " <b>ERROR:</b> ENTRY_EMAIL_ADDRESS_ERROR_EXISTS<br>\n"; } elseif (strlen($email_address) < ENTRY_EMAIL_ADDRESS_MIN_LENGTH) { $error = true; //$messageStack->add('create_account', ENTRY_EMAIL_ADDRESS_ERROR); echo " <b>ERROR:</b> ENTRY_EMAIL_ADDRESS_ERROR<br>\n"; } elseif (xtc_validate_email($email_address) == false) { $error = true; //$messageStack->add('create_account', ENTRY_EMAIL_ADDRESS_CHECK_ERROR); echo " <b>ERROR:</b> ENTRY_EMAIL_ADDRESS_CHECK_ERROR<br>\n"; /* $fp3 = fopen("kunden_import_mail-check-fail.csv", "a"); fputs($fp3, $zeile); fclose ($fp3); */ } if($dob != '') { if (checkdate(substr(xtc_date_raw($dob), 4, 2), substr(xtc_date_raw($dob), 6, 2), substr(xtc_date_raw($dob), 0, 4)) == false) { $error = true; echo " <b>ERROR:</b> ENTRY_DATE_OF_BIRTH_ERROR<br>\n"; //$messageStack->add('create_account', ENTRY_DATE_OF_BIRTH_ERROR); } } if($error != true) { $lines_ok += 1; $sql_data_array = array ('customers_vat_id' => $vat, 'customers_vat_id_status' => $customers_vat_id_status, 'customers_status' => $customers_status, 'customers_firstname' => $firstname, 'customers_lastname' => $lastname, 'customers_email_address' => $email_address, 'customers_telephone' => $telephone, 'customers_fax' => $fax, 'customers_newsletter' => $newsletter, 'customers_password' => xtc_encrypt_password($password),'customers_date_added' => 'now()','customers_last_modified' => 'now()'); $sql_data_array['customers_gender'] = $gender; $sql_data_array['customers_dob'] = xtc_date_raw($dob); xtc_db_perform(TABLE_CUSTOMERS, $sql_data_array); $user_id = xtc_db_insert_id(); xtc_write_user_info($user_id); $sql_data_array = array ('customers_id' => $user_id, 'entry_firstname' => $firstname, 'entry_lastname' => $lastname, 'entry_street_address' => $street_address, 'entry_postcode' => $postcode, 'entry_city' => $city, 'entry_country_id' => $country,'address_date_added' => 'now()','address_last_modified' => 'now()'); $sql_data_array['entry_gender'] = $gender; $sql_data_array['entry_company'] = $company; if (ACCOUNT_SUBURB == 'true') $sql_data_array['entry_suburb'] = $suburb; if (ACCOUNT_STATE == 'true') { if ($zone_id > 0) { $sql_data_array['entry_zone_id'] = $zone_id; $sql_data_array['entry_state'] = ''; } else { $sql_data_array['entry_zone_id'] = '0'; $sql_data_array['entry_state'] = $state; } } xtc_db_perform(TABLE_ADDRESS_BOOK, $sql_data_array); $address_id = xtc_db_insert_id(); xtc_db_query("update ".TABLE_CUSTOMERS." set customers_default_address_id = '".$address_id."' where customers_id = '".(int) $user_id."'"); xtc_db_query("insert into ".TABLE_CUSTOMERS_INFO." (customers_info_id, customers_info_number_of_logons, customers_info_date_account_created) values ('".(int) $user_id."', '0', now())"); // create smarty elements $smarty = new Smarty; $smarty->assign('GENDER', $gender); $smarty->assign('FIRSTNAME', $firstname); $smarty->assign('LASTNAME', $lastname); $smarty->assign('EMAIL', $email_address); $smarty->assign('PASSWORT', $password); $smarty->caching = false; $txt_mail_customer = $smarty->fetch(DIR_FS_CATALOG.'kunden_import_mail.txt'); echo DIR_FS_CATALOG; $mail_subject = "Unser neuer Onlineshop"; /* echo "<pre>\n"; echo $txt_mail_customer; echo "</pre>\n"; */ // mail versenden xtc_php_mail(STORE_OWNER_EMAIL_ADDRESS, STORE_OWNER, $email_address, $firstname.' '.$lastname, '', STORE_OWNER_EMAIL_ADDRESS, STORE_OWNER, '', '', $mail_subject, '', $txt_mail_customer); } else { if(!$do_not_report==true) { echo "<b color=\"red\">fehler beim anlegen von $firstname, $lastname, $company, $email_address</b><br>\n"; echo "<b>------------------------------------------------------------------------------------------------------</b><br>\n"; } } flush(); // Zeile einlesen $zeile=fgets($fh); echo "<br>"; } fclose($fh); echo "$lines_ok von $lines Daten importiert!"; include ('includes/application_bottom.php'); ?> Link to comment Share on other sites More sharing options...
pagelib Posted November 9, 2010 Report Share Posted November 9, 2010 Was macht das Script genau? Vergibt es ein zufälliges Passwort? Werden die Kunden dann informiert?? Danke vorab. pagelib Link to comment Share on other sites More sharing options...
Mathias Sohn Posted November 9, 2010 Report Share Posted November 9, 2010 Was macht das Script genau? Es liest jeden Satz der Importdatei, legt einen User an, verpasst diesem ein Zufalls-Passwort und schreibt dem Kunden eine eMail. -> Leider ist diese Mail leer, habe noch nicht herausgefunden, was ich falsch mache. Vergibt es ein zufälliges Passwort? JA Werden die Kunden dann informiert?? Ja, per Mail Link to comment Share on other sites More sharing options...
Manula123 Posted November 21, 2010 Report Share Posted November 21, 2010 Hi, bin nach der Beschreibung vorgegangen... Funktioniert auch soweit, bis auf zwei nicht unwesentliche punkte... Das Skript importiert nur den ersten Kunden aus der CSV und beendet damit die Abfrage… Wo kann ich das für X-Kunden machen? leider teilt das script nicht die Kundennummer und auch nicht das Bundesland mit. Ausserdem würde ich gerne die Kunden die Importiert werden automatisch mit in den Rundschreiben/Newsletter-Verteiler einsetzen, was müsst da noch hinzugeschrieben werden, diese können sich dann via Link wieder abmelden... Link to comment Share on other sites More sharing options...
Manula123 Posted November 21, 2010 Report Share Posted November 21, 2010 <?php define('GZIP_COMPRESSION','false'); include ('includes/application_top.php'); require_once (DIR_FS_INC.'xtc_get_country_list.inc.php'); require_once (DIR_FS_INC.'xtc_validate_email.inc.php'); require_once (DIR_FS_INC.'xtc_encrypt_password.inc.php'); require_once (DIR_FS_INC.'xtc_get_geo_zone_code.inc.php'); require_once (DIR_FS_INC.'xtc_write_user_info.inc.php'); //------------------------------------------------------------------------ function getpass($laenge=10) { $newpass = ""; $string="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; mt_srand((double)microtime()*1000000); for ($i=1; $i <= $laenge; $i++) { $newpass .= substr($string, mt_rand(0,strlen($string)-1), 1); } return $newpass; } //------------------------------------------------------------------------ // Programm startet hier $lines = 0; $lines_ok = 0; // Importdatei mit den Kundendaten // Das Format ist csv, d.h. Felder werden mit Semikolon getrennt, keine Anfuehrungszeichen, jeder Datensatz hat eine eigene Zeile // z.Beispiel: 01;20123;Hans;Meier;MeineFirma; ;MeineStr. 4;D;77777;Irgendwo;Adresszusatz;0123-2342;0123-2349;[email protected];password // '- leer gelassenes Feld // Der Dateiname kann hier geaendert werden. Die Datei muss im Stammverzeichnis des Shops liegen. // Aufruf über 'www.meinshop.de/kundenimport.php' $importfile="kunden_import.csv"; // Kundendatei öffnen $fh = fopen($importfile, "r") or die ("Kann Datei nicht lesen."); // Schleife wiederholen bis alle Datensaetze abgearbeitet sind while(!feof($fh)) { // zeile einlesen & werte zuweisen $zeile=fgets($fh); list($anrede, $customer, $firstname, $lastname, $geburtsdatum, $company, $street_address, $lkz, $postcode, $city, $suburb, $telephone, $fax, $email_address, $password) = split(";", $zeile); $lines+=1; // neues Zufallspasswort erstellen. $password = getpass(10); // Daten 'anrede'aufbereiten, abhaengig von den Eingangswerten für die Anrede. // die Varianten koennen beliebig erweitert werden, indem neue case ... eingetragen werden. // xtc erwartet die Anrede (gender) als (m)ale oder (f)emale switch($anrede) { case "01": case "Herr": case "M": $gender = "m"; break; case "02": case "Frau": case "W": $gender = "f"; break; //nichts passt, dann Herr default: $gender = "m"; } // http://www.didihome.de/html/tab-lkz.htm // Problemkinder: BAL, EI switch($lkz) { case "D": case "DE": case "": $lkz = "DE"; break; case "A": $lkz = "AT"; break; case "F": $lkz = "FR"; break; case "WD": $lkz = "DM"; break; case "CDN": $lkz = "CA"; break; case "I": $lkz = "IT"; break; case "N": $lkz = "NO"; break; case "U": $lkz = "UY"; break; // ?? P = POLEN!? case "P": $lkz = "PL"; break; case "J": $lkz = "JP"; break; case "E": $lkz = "ES"; break; case "H": $lkz = "HU"; break; case "AUS": $lkz = "AU"; break; case "FL": $lkz = "LI"; break; case "S": $lkz = "SE"; break; case "L": $lkz = "LU"; break; case "RB": $lkz = "BW"; break; case "FIN": $lkz = "FI"; break; case "RI": $lkz = "ID"; break; case "B": $lkz = "BE"; break; case "SGP": $lkz = "SG"; break; case "EST": $lkz = "EE"; break; case "IRL": $lkz = "IE"; break; case "RUS": $lkz = "RU"; break; case "SLO": $lkz = "SI"; break; case "USA": $lkz = "US"; break; default: echo "Land nicht gefunden, DE gesetzt.<br>"; $lkz = "DE"; break; } // sql-Abfrage aufbauen mit ermitteltem Laenderkennzeichen $country_query = xtc_db_query("SELECT * FROM `countries` WHERE `countries_iso_code_2` = '".strtoupper($lkz)."'"); // sql-Abfrage abfeuern $country_data = xtc_db_fetch_array($country_query); // Land-ID als Ergebnis retten, es wird in der DB nicht die Kennung sondern der Index (ID) gespeichert $country = $country_data['countries_id']; // Keine Land-ID gefunden? Fehler sollte nicht auftreten, da zuvor ja 'DE' als default gesetzt wurde, es sei denn, // das Land DE existiert nicht im Shop if(!is_numeric($country_data['countries_id'])) { echo " <b>ERROR:</b> LKZ_CONVERT_ERROR<br>\n"; echo "lkz=".$lkz." countries_id=".$country_data['countries_id']. " countries_name=".$country_data['countries_name']."<br>\n"; } else { echo "Land ist " .$country . " / " . $country_data['countries_name']."<br>\n"; } // weiter mit Geburtstag, darf auch leer sein if ($geburtsdatum != ".000000000" && $geburtsdatum != "") // Geburtstag uebergeben { // Datum formatieren, hier koennen Anpassungen notwendig sein, je nach Eingangsdaten list($jahr, $monat, $tag) = sscanf($geburtsdatum,"%4d%2d%2d.%d"); // erstellt 'tt.mm.jjjj' - Zeichenfolge $dob = sprintf("%02d.%02d.%4d",$tag,$monat,$jahr); echo $geburtsdatum . " = " . $dob ."<br>\n"; } else // Geburtstag wurde nicht uebergeben (leer) { $dob=''; } // sonstige Variablen belegen // Kundenstatus mit Standardwert belegen, // Einstellung unter 'Konfiguration' / 'Mein Shop', hier Feld 'Kundenstatus für Neukunden'' $customers_status = DEFAULT_CUSTOMERS_STATUS_ID; $newsletter = true; $do_not_report = false; // daten in db eintragen require_once(DIR_WS_CLASSES.'vat_validation.php'); $vatID = new vat_validation($vat, '', '', $country); $customers_status = $vatID->vat_info['status']; $customers_vat_id_status = $vatID->vat_info['vat_id_status']; $error = $vatID->vat_info['error']; if($error==1) { //$messageStack->add('create_account', ENTRY_VAT_ERROR); echo " <b>ERROR:</b> ENTRY_VAT_ERROR<br>\n"; $error = true; } if(!is_numeric($country_data['countries_id'])) $error = true; // Pruefung der email- Adresse // Schalter vorbelegen $email_exists = false; // sql- Abfrage aufbauen $check_email_query = xtc_db_query("select count(*) as total from ".TABLE_CUSTOMERS." where customers_email_address = '".xtc_db_input($email_address)."' and account_type = '0'"); $check_email = xtc_db_fetch_array($check_email_query); if ($check_email['total'] > 0) { $email_exists = true; } if($email_exists == true) { $error = true; $do_not_report = true; //$messageStack->add('create_account', ENTRY_EMAIL_ADDRESS_ERROR_EXISTS); //echo " <b>ERROR:</b> ENTRY_EMAIL_ADDRESS_ERROR_EXISTS<br>\n"; } elseif (strlen($email_address) < ENTRY_EMAIL_ADDRESS_MIN_LENGTH) { $error = true; //$messageStack->add('create_account', ENTRY_EMAIL_ADDRESS_ERROR); echo " <b>ERROR:</b> ENTRY_EMAIL_ADDRESS_ERROR<br>\n"; } elseif (xtc_validate_email($email_address) == false) { $error = true; //$messageStack->add('create_account', ENTRY_EMAIL_ADDRESS_CHECK_ERROR); echo " <b>ERROR:</b> ENTRY_EMAIL_ADDRESS_CHECK_ERROR<br>\n"; /* $fp3 = fopen("kunden_import_mail-check-fail.csv", "a"); fputs($fp3, $zeile); fclose ($fp3); */ } if($dob != '') { if (checkdate(substr(xtc_date_raw($dob), 4, 2), substr(xtc_date_raw($dob), 6, 2), substr(xtc_date_raw($dob), 0, 4)) == false) { $error = true; echo " <b>ERROR:</b> ENTRY_DATE_OF_BIRTH_ERROR<br>\n"; //$messageStack->add('create_account', ENTRY_DATE_OF_BIRTH_ERROR); } } if($error != true) { $lines_ok += 1; $sql_data_array = array ('customers_vat_id' => $vat, 'customers_vat_id_status' => $customers_vat_id_status, 'customers_status' => $customers_status, 'customers_firstname' => $firstname, 'customers_lastname' => $lastname, 'customers_email_address' => $email_address, 'customers_telephone' => $telephone, 'customers_fax' => $fax, 'customers_newsletter' => $newsletter, 'customers_password' => xtc_encrypt_password($password),'customers_date_added' => 'now()','customers_last_modified' => 'now()'); $sql_data_array['customers_gender'] = $gender; $sql_data_array['customers_dob'] = xtc_date_raw($dob); xtc_db_perform(TABLE_CUSTOMERS, $sql_data_array); $user_id = xtc_db_insert_id(); xtc_write_user_info($user_id); $sql_data_array = array ('customers_id' => $user_id, 'entry_firstname' => $firstname, 'entry_lastname' => $lastname, 'entry_street_address' => $street_address, 'entry_postcode' => $postcode, 'entry_city' => $city, 'entry_country_id' => $country,'address_date_added' => 'now()','address_last_modified' => 'now()'); $sql_data_array['entry_gender'] = $gender; $sql_data_array['entry_company'] = $company; if (ACCOUNT_SUBURB == 'true') $sql_data_array['entry_suburb'] = $suburb; if (ACCOUNT_STATE == 'true') { if ($zone_id > 0) { $sql_data_array['entry_zone_id'] = $zone_id; $sql_data_array['entry_state'] = ''; } else { $sql_data_array['entry_zone_id'] = '0'; $sql_data_array['entry_state'] = $state; } } xtc_db_perform(TABLE_ADDRESS_BOOK, $sql_data_array); $address_id = xtc_db_insert_id(); xtc_db_query("update ".TABLE_CUSTOMERS." set customers_default_address_id = '".$address_id."' where customers_id = '".(int) $user_id."'"); xtc_db_query("insert into ".TABLE_CUSTOMERS_INFO." (customers_info_id, customers_info_number_of_logons, customers_info_date_account_created) values ('".(int) $user_id."', '0', now())"); // create smarty elements $smarty = new Smarty; $smarty->assign('GENDER', $gender); $smarty->assign('FIRSTNAME', $firstname); $smarty->assign('LASTNAME', $lastname); $smarty->assign('EMAIL', $email_address); $smarty->assign('PASSWORT', $password); $smarty->caching = false; $txt_mail_customer = $smarty->fetch(DIR_FS_CATALOG.'kunden_import_mail.txt'); echo DIR_FS_CATALOG; $mail_subject = "Unser neuer Onlineshop"; /* echo "<pre>\n"; echo $txt_mail_customer; echo "</pre>\n"; */ // mail versenden xtc_php_mail(STORE_OWNER_EMAIL_ADDRESS, STORE_OWNER, $email_address, $firstname.' '.$lastname, '', STORE_OWNER_EMAIL_ADDRESS, STORE_OWNER, '', '', $mail_subject, '', $txt_mail_customer); } else { if(!$do_not_report==true) { echo "<b color=\"red\">fehler beim anlegen von $firstname, $lastname, $company, $email_address</b><br>\n"; echo "<b>------------------------------------------------------------------------------------------------------</b><br>\n"; } } flush(); // Zeile einlesen $zeile=fgets($fh); echo "<br>"; } fclose($fh); echo "$lines_ok von $lines Daten importiert!"; include ('includes/application_bottom.php'); ?> Und meine CSV dazu ist so aufgebaut: 01;20102;Mannvor;Mannnach;20000106;Firma;Irgendwostr. 45;Adresszusatz;666666;Stadtname;Deutschland;Tel;Fax;[email protected];passwort; 02;20101;Frauvor;Fraunach;20000106;Firma;Irgendwostr. 45;Adresszusatz;666666;Stadtname;Deutschland;Tel;Fax;[email protected];passwort; Hatte ich eben vergessen, Sorry Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.