VtigerCrm
Aus LexWIKI
vtigerCRM ist eine Open-Source CRM Lösung, die mit beliebig vielen Clients kostenlos eingesetzt werden kann. Unter CRM verstehe ich grundsätzlich die Erfassung jeglicher Kontakte mit einem (potentiellen) Kunden, sei es Brief, E-Mail, Fax oder Telefon. Der Einsatz von vtigerCRM als OpenSource System ermöglicht eine nahtlose Integration in bestehende Systeme, z.B. die Telefonanlage.
Der hier zugrundeliegende Prozess sieht wie folgt aus: Vertrieb stellt Kontakt (lead) her -> Aus Kontakt wird Kundenbeziehung -> Vertrieb beantragt Kundennummer bei der FiBu/DebitorenBuHa -> BuHa legt neuen Kunden an und vergibt Kundennummer -> Neuer Kunde wird als Account/Organisation in CRM angelegt und Lead wird zugeordnet.
Da wir die Stammdaten nur einmal erfassen wollen, und nicht automatisch in Lexware® importieren können, erscheint dieses Vorgehen sinnvoll. Anmerkung: Ein Import ist natürlich über die WaWi auch möglich, jedoch brauchen wir die vollständig(eren) Daten ohnehin in der BuHa, da wir gleich ein DebKto anlegen
Import Stammdaten in vtigerCRM
- Wir gehen davon aus, dass der unter ODBC beschriebene Zugang eingerichtet ist
- in php ist außerdem bereits der Sybase®-Support mit kompiliert oder als Modul geladen
- in vTiger haben wir das zusätzliche Feld "DebitorenNr" angelegt für Kunden
Folgendes Skript schreibt nun mittels cronjob regelmäßig die Daten in vTiger Achtung: Ich bitte diese Skript erstmal mehr als Proof-of-concept zu sehen. Natürlich kann keine Gewähr übernommen werden, aber es wäre klasse, wenn es hier weiterentwickelt wird.
<?php /************* * Importiere Daten von Lexware in vTigerCRM * 2008-05-01 Hans J. Martin - e-netconsulting KG (hm at e-netconsulting.de) *************/ //@TODO komfortable Fehlermeldung bei nicht update eines Datensatze //@TODO checken der gesetzten Daten und Protokoll erstellen //@TODO checken ob Eintrag gelöscht! //@TODO Step2: Import der Lieferantentabelle /** Importiere in vTiger **/ /** Configdatei von vTiger einlesen **/ require_once("/var/www/vtigercrm/config.inc.php"); /** Datenbankconnect mit vTigerDB herstellen **/ $hdl=mysql_pconnect($dbconfig['db_hostname'],$dbconfig['db_username'],$dbconfig['db_password']) or die ("can't connect"); mysql_select_db ($dbconfig['db_name']); /** Start des Imports **/ getLXdata(getMtime()); /************ /* Funktion liest aus der vTiger Datenbank den letzten Update aus und gibt timestamp zurück /* /***********/ function getMtime() { $sql="SELECT max(modifiedtime) as mtime FROM vtiger_crmentity where description like \"Lexware Import\""; $rslt=mysql_query($sql); $arr=mysql_fetch_array($rslt); if($arr[0]!=""){ return $arr[0]; } else { return "2007-01-01 00:00:00"; } } /***** * Datenbank auslesen (SyBase): Trick: Datenbank und Host muessen in /etc/freetds.conf definiert sein. Sonst gehts nicht * $mtime ist der Timestamp des letzten Zugriffs. (ISO-Format (2007-12-03 10:00)) ****/ function getLXdata($mtime) { $cnn = sybase_connect( "LXOFFICE", 'ODBCLX', 'HierDasPasswortEintragen' ) or die ("!!! could not connect !!! n\n"); $result=sybase_query("SELECT * FROM IQF3.FK_KUNDE where System_updated > \"$mtime\" ",$cnn); while ($r = sybase_fetch_array($result)) { $resultset[]=$r; } foreach ($resultset as $r) { pushTiger($r); } } /** * Trägt die Daten in vTiger ein * **/ function pushTiger($row) { $new=false; // 1. Prüfen ob DebitorenNr vorhanden $crmRslt=mysql_query("SELECT accountid FROM vtiger_accountscf where cf_471=".$row["Kontierung_DebitorenNr"]); if (mysql_num_rows($crmRslt) < 1 ) { // Jetzt erstmal eine neue crmID besorgen: mysql_query("UPDATE vtiger_crmentity_seq set id=id + 1"); $idrslt=mysql_query("SELECT id as crmid from vtiger_crmentity_seq"); $crmIDarr=mysql_fetch_row($idrslt); $crmID=$crmIDarr[0]; #echo $crmID; $new=true; } else { $crmArr=mysql_fetch_array($crmRslt); $crmID=$crmArr["accountid"]; } if (isNew($crmID,$row["System_updated"]) || ($new)) { $row["crmID"]=$crmID; if ($row["Anschrift_Firma"]=="") { $row["Anschrift_Firma"]=$row["Anschrift_Name"]; if ($row["Anschrift_Vorname"]) { $row["Anschrift_Firma"].=", ".$row["Anschrift_Vorname"]; } } $row["Anschrift_Strasse"].=" ".$row["Anschrift_HausNr"]; $row["Liefer_Strasse"].=" ".$row["Liefer_HausNr"]; updateCRMentity($crmID,$row["System_updated_user"]); // 1. update vtiger_account $arrLXtoVTaccounts = array ( "crmID" => "accountid", "Anschrift_Firma" => "accountname", "Anschrift_Tel1" => "phone", "Anschrift_Web" => "website", "Anschrift_Fax" => "fax", "Anschrift_Tel2" => "otherphone", ); $sql=makeInsert($arrLXtoVTaccounts,$row,"vtiger_account"); mysql_query($sql); ($new)? mysql_query("INSERT into vtiger_accountscf (accountid,cf_471) values ($crmID,\"".$row["Kontierung_DebitorenNr"]."\")"):""; echo mysql_error()."INSERT into"; /* / 2. update vtiger_billads (fk accountaddressid) if (!$new) { // 2.1. Merken der Contactdaten // Prüfen, ob es überhaupt contacte gibt $contact=mysql_query("SELECT vtiger_contactaddress.* FROM vtiger_contactaddress,vtiger_contactdetails WHERE vtiger_contactdetails.accountid=$crmID and vtiger_contactdetails.contactid=vtiger_contactaddress.contactaddressid"); if (mysql_num_rows($contact) > 0) { while($contact_row=mysql_fetch_array($mysql_query)) { // Ist dieser Datensatz neuer als der Alte? Dann nichts machen. if (isNew($contact_row["contactaddressid"],$row["System_updated"])) { // jetzt für jedes Feld prüfen, ob wir es updaten können $addressFields=array("mailingcity","mailingstreet","mailingpobox","mailingzip") if (AUSDRUCK) { // 1. es leer ist (dann neue Daten eintragen) oder // 2. es gleich dem Eintrag im Account ist (dann neue Daten eintragen) // ** Nicht vergessen: updateCRMentity($contact_row["contactaddressid"],$row["System_updated_user"]); } else { // sonst: Meldung, dass dieser Contact nicht aktualisiert wurde } } } } } */ // 2.2. Updaten der Anschrift $arrLXtoVTaccbillads = array ( "crmID" => "accountaddressid", "Anschrift_Ort" => "bill_city", "Anschrift_Plz" => "bill_code", "Anschrift_Land" => "bill_country", "Anschrift_Strasse" => "bill_street", ); $sql=makeInsert($arrLXtoVTaccbillads,$row,"vtiger_accountbillads"); mysql_query($sql); // 3. update vtiger_shipads $arrLXtoVTaccshipads =array ( "crmID" => "accountaddressid", "Liefer_Ort" => "ship_city", "Liefer_Plz" => "ship_code", "Liefer_Land" => "ship_country", //"" => "ship_state", //"" => "ship_pobox", "Liefer_Strasse" => "ship_street", ); $sql=makeInsert($arrLXtoVTaccshipads,$row,"vtiger_accountshipads"); mysql_query($sql); // 4. Signalisieren, dass wir ein Update gemacht haben $return = TRUE; } else { // trouble: Daten im CRM sind neuer als Daten im LXOFFICE $return=FALSE; } } function makeInsert ($arr,$row,$table) { while (list($k,$v)=each($arr)) { $field.=$v.","; $value.='"'.$row[$k].'",'; if ($k != "crmID") { $update.=$v.'="'.$row[$k].'",'; } } $field=substr($field,0,-1); $value=substr($value,0,-1); $update=substr($update,0,-1); return "INSERT INTO $table ($field) VALUES ($value ) ON DUPLICATE KEY UPDATE $update "; /** * mapUser: Funktion zum Zuordnen der Lexware User zu vTigerUsern. Dies ermöglicht, dass beim Import noch der Username der Informationsquelle angegeben wird. * Beispiel hier für 3 User. **/ function mapUser($LXuser) { Switch ($LXuser) { case "U7": $user="3"; break; case "U8": $user="6"; break; case "U0": $user="1"; break; default: $user="1"; // Admin } return $user; } function updateCRMentity ($crmID,$userID) { $user=mapUser($userID); $timestamp=date("Y-m-d h:i:s"); $res=mysql_query("Select * from vtiger_crmentity where crmid=$crmID"); if (mysql_num_rows($res) > 0) { $sql="UPDATE vtiger_crmentity SET modifiedby=$user, description=\"Lexware Import\", modifiedtime=\"$timestamp\" WHERE crmid=$crmID"; } else { $sql="INSERT INTO vtiger_crmentity (`crmid`,`smcreatorid`, `smownerid`,`modifiedby`, `setype`,`description`, `createdtime`,`modifiedtime`, `viewedtime`,`status`, `version`,`presence`,`deleted`) values ($crmID, $user,$user,$user, \"Accounts\",\"Lexware Import\", \"$timestamp\",\"$timestamp\",NULL,NULL,0,1,0)"; } mysql_query($sql); } function isNew ($crmID,$timestamp) { $timestamp=date("Y-m-d h:i:s",strtotime($timestamp)); $res=mysql_query("Select * from vtiger_crmentity where crmid=$crmID and modifiedtime < \"$timestamp\""); if (mysql_num_rows($res) > 0) { return true; } else { return false; } } ?>

