LexSHOP GmbH & Co. KG Contact Details:
Main address: Celsiusstrasse 28 12207 Berlin, Germany ,
Tel:( 49 30) 55 14 54 38 , Fax:( 49 30) 70 01 43 11 28 , E-mail: info(at)lexwiki.de URL: https://lexwiki.de Logo LexWIKI Founder:
Udo Netzel Director (CEO)

vtiger-crmvtigerCRM 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 zugrunde liegende 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

  1. der unter ODBC beschriebene Zugang eingerichtet ist
  2. in php ist außerdem bereits der Sybase®-Support mit kompiliert oder als Modul geladen
  3. 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: Dieses Skript ist als Proof-of-concept zu sehen und es kann keine Gewähr übernommen werden.

 /*************
 * 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;
        }
 }

 

Veröffentlicht bzw. zuletzt aktualisiert am 19. Juli 2023 - Autor: Hans J. Martin

 

Schreiben Sie einen Kommentar

Ihre E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert