From: Holger Lindemann Date: Tue, 8 May 2012 09:44:36 +0000 (+0200) Subject: Neue xtComm Shopschnittstelle. X-Git-Tag: release-3.0.0beta1~341 X-Git-Url: http://wagnertech.de/git?a=commitdiff_plain;h=9d3c499e4fccf77b2bd0a221dd4dc56053e56d2f;p=kivitendo-erp.git Neue xtComm Shopschnittstelle. Weitestgehend mit der PepperShop identisch. Sollte auch möglichst so bleiben!! Wenn möglich Änderungen am File erplib.php für beide/alle Shop anpassen. Mehrwert: Artikel aus dem Shop in LxO importieren. --- diff --git a/shopxtc/ArtikelErpToShop.php b/shopxtc/ArtikelErpToShop.php new file mode 100755 index 000000000..f22d15065 --- /dev/null +++ b/shopxtc/ArtikelErpToShop.php @@ -0,0 +1,77 @@ +\n\n\n\n\n"; + @apache_setenv('no-gzip', 1); + @ini_set('zlib.output_compression', 0); + @ini_set('implicit_flush', 1); + $shopnr = $_GET["Shop"]; + //$nofiles = ( $_GET["nofiles"] == '1' )?true:false; +} else { + if ( $argc > 1 ) { + $tmp = explode("=",trim($argv[1])); + if ( count($tmp) != 2 ) { + echo "Falscher Aufruf: php shop=1\n"; + exit (-1); + } else { + $shopnr = $tmp[1]; + } + } +} + +include_once("conf$shopnr.php"); +include_once("error.php"); +//Fehlerinstanz +$err = new error($api); + +include_once("dblib.php"); +include_once("xtc.php"); +include_once("erplib.php"); +include_once("PictureXTC.php"); + + +//Bilder +$pict = new picture($ERPftphost,$ERPftpuser,$ERPftppwd,$ERPimgdir,$SHOPftphost,$SHOPftpuser,$SHOPftppwd,$SHOPimgdir,$err); +//$pict->original = false; + +//ERP-Instanz +$erpdb = new mydb($ERPhost,$ERPdbname,$ERPuser,$ERPpass,$ERPport,'pgsql',$err,$debug); +if ($erpdb->db->connected_database_name == $ERPdbname) { + $erp = new erp($erpdb,$err,$divStd,$divVerm,$auftrnr,$kdnum,$preA,$preK,$invbrne,$mwstLX,$OEinsPart,$lager,$pricegroup,$ERPusrID); +} else { + $err->out('Keine Verbindung zur ERP',true); + exit(); +} +//Shop-Instanz +$shopdb = new mydb($SHOPhost,$SHOPdbname,$SHOPuser,$SHOPpass,$SHOPport,'mysql',$err,$debug); +if ($shopdb->db->connected_database_name == $SHOPdbname) { + $shop = new xtc($shopdb,$err,$SHOPdbname,$divStd,$divVerm,$minder,$nachn,$versandS,$versandV,$paypal,$treuhand,$mwstLX,$mwstS,$variantnr,$unit,$pict,$nopic,$nopicerr,$nofiles); +} else { + $err->out('Keine Verbindung zum Shop',true); + exit(); +} +$artikel = $erp->getParts($pricegroup); +$cnt = 0; +$errors = 0; +if ( $api != 'cli' ) ob_start(); + +$err->out("Artikelexport für Shop $shopnr",true); + +if ($artikel) foreach ($artikel as $row) { + $rc = $shop->saveArtikel($row,"de"); + if ($rc) { + $cnt++; + if ( $cnt % 10 == 0 ) $err->out("."); + } else { + $errors++; + } +} +$err->out('',true); +$err->out("$cnt Artikel übertragen, $errors Artikel nicht",true); +if ( $api != "cli" ) { + echo "\n\n"; +} +?> diff --git a/shopxtc/ArtikelShopToErp.php b/shopxtc/ArtikelShopToErp.php new file mode 100755 index 000000000..5b6a09ac7 --- /dev/null +++ b/shopxtc/ArtikelShopToErp.php @@ -0,0 +1,78 @@ +\n\n\n\n\n"; + @apache_setenv('no-gzip', 1); + @ini_set('zlib.output_compression', 0); + @ini_set('implicit_flush', 1); + $shopnr = $_GET["Shop"]; + $nofiles = ( $_GET["nofiles"] == '1' )?true:false; +} else { + if ( $argc > 1 ) { + $tmp = explode("=",trim($argv[1])); + if ( count($tmp) != 2 ) { + echo "Falscher Aufruf: php shop=1\n"; + exit (-1); + } else { + $shopnr = $tmp[1]; + } + } +} + +include_once("conf$shopnr.php"); +include_once("error.php"); +//Fehlerinstanz +$err = new error($api); + +include_once("dblib.php"); +include_once("xtc.php"); +include_once("erplib.php"); + + + +//ERP-Instanz +$erpdb = new mydb($ERPhost,$ERPdbname,$ERPuser,$ERPpass,$ERPport,'pgsql',$err,$debug); +if ($erpdb->db->connected_database_name == $ERPdbname) { + $erp = new erp($erpdb,$err,$divStd,$divVerm,$auftrnr,$kdnum,$preA,$preK,$invbrne,$mwstLX,$OEinsPart,$lager,$pricegroup,$ERPusrID); +} else { + $err->out('Keine Verbindung zur ERP',true); + exit(); +} + +//Shop-Instanz +$shopdb = new mydb($SHOPhost,$SHOPdbname,$SHOPuser,$SHOPpass,$SHOPport,'mysql',$err,$debug); +if ($shopdb->db->connected_database_name == $SHOPdbname) { + $shop = new xtc($shopdb,$err,$SHOPdbname,$divStd,$divVerm,$minder,$nachn,$versandS,$versandV,$paypal,$treuhand,$mwstLX,$mwstS,$variantnr,$unit); +} else { + $err->out('Keine Verbindung zum Shop',true); + exit(); +} + +$artikel = $shop->getAllArtikel(); +echo "
"; print_r($artikel); echo "
"; +$cnt = 0; +$errors = 0; +//Artikel die mehreren Warengruppen zugeordnet sind, werden nur einmal importiert. +//Es wird dann auch nur die erste Warengruppe angelegt. +if ( $api != 'cli' ) ob_start(); + +$err->out("Artikelimport von Shop $shopnr",true); + +if ($artikel) foreach ($artikel as $row) { + $rc = $erp->chkPartnumber($row,true); + if ($rc) { + $cnt++; + } else { + $err->out('Fehler: '.$row['partnumber'],true); + $errors++; + } +} +$err->out('',true); +$err->out("$cnt Artikel geprüft bzw. übertragen, $errors Artikel nicht",true); +if ( $api != "cli" ) { + echo "\n\n"; +} +?> diff --git a/shopxtc/BestellungShopToErp.php b/shopxtc/BestellungShopToErp.php new file mode 100755 index 000000000..f5f304804 --- /dev/null +++ b/shopxtc/BestellungShopToErp.php @@ -0,0 +1,86 @@ +\n\n\n\n\n"; + @apache_setenv('no-gzip', 1); + @ini_set('zlib.output_compression', 0); + @ini_set('implicit_flush', 1); + $shopnr = $_GET["Shop"]; + $nofiles = ( $_GET["nofiles"] == '1' )?true:false; +} else { + if ( $argc > 1 ) { + $tmp = explode("=",trim($argv[1])); + if ( count($tmp) != 2 ) { + echo "Falscher Aufruf: php shop=1\n"; + exit (-1); + } else { + $shopnr = $tmp[1]; + } + } +} + +include_once("conf$shopnr.php"); +include_once("error.php"); +//Fehlerinstanz +$err = new error($api); +include_once("dblib.php"); +include_once("xtc.php"); +include_once("erplib.php"); + +$err->out("Shop $shopnr, Bestellimport",true); + +//ERP-Instanz +$erpdb = new mydb($ERPhost,$ERPdbname,$ERPuser,$ERPpass,$ERPport,'pgsql',$err,$debug); +if ($erpdb->db->connected_database_name == $ERPdbname) { + $erp = new erp($erpdb,$err,$divStd,$divVerm,$auftrnr,$kdnum,$preA,$preK,$invbrne,$mwstLX,$OEinsPart,$lager,$pricegroup,$ERPusrID); +} else { + $err->out('Keine Verbindung zur ERP',true); + exit(); +} + +//Shop-Instanz +$shopdb = new mydb($SHOPhost,$SHOPdbname,$SHOPuser,$SHOPpass,$SHOPport,'mysql',$err,$debug); +if ($shopdb->db->connected_database_name == $SHOPdbname) { + $shop = new xtc($shopdb,$err,$SHOPdbname,$divStd,$divVerm,$minder,$nachn,$versandS,$versandV,$paypal,$mwstLX,$mwstS,$variantnr,$unit); +} else { + $err->out('Keine Verbindung zum Shop',true); + exit(); +} + +$bestellungen = $shop->getBestellung($ERPusrID); +$cnt = 0; +$errors = 0; + +$err->out("Bestellimport vom Shop $shopnr",true); + +if ($bestellungen) foreach ($bestellungen as $row) { + $rc = $erp->mkAuftrag($row,$shopnr,$longtxt); + echo "!$rc!"; + if ($rc>0) { + $rc = $shop->setKundenNr($row['customer']['shopid'],$rc); + if ($rc>0) { + $shop->setAbgeholt($row['cusordnumber']); + $cnt++; + $err->out("ok",true); + } else { + $errors++; + $err->out("Fehler setKdNr ".$row['customer']['shopid'],true); + } + } else if ($rc == -1) { + $errors++; + $err->out("Fehler mkAuftrag ".$row['cusordnumber'],true); + } else { + $err->out("Fehler Kunde zuordnen ".$row['customer']['shopid'].":".$row['cusordnumber'],true); + $errors++; + } +} +$err->out('Von '.count($bestellungen)." Bestellungen $cnt übertragen, $errors nicht",true); +if ( $api != "cli" ) { + echo "
Auftragsliste"; + echo "\n\n"; +} + +?> diff --git a/shopxtc/LiesMich.txt b/shopxtc/LiesMich.txt new file mode 100755 index 000000000..13d294c50 --- /dev/null +++ b/shopxtc/LiesMich.txt @@ -0,0 +1,33 @@ +Varianten können in LxO eigene Artikelnummern haben. +Die Artikelnummer wird dann automatisch ergänzt um "-" und die Variarions-ID. +Aus "A1001" wird z.B. "A1001-1" für die erste (Standard) Variante. +Variations-IDs MÜSSEN!! Lückenlos bei 1 beginnen, da sonst der Shop ins Schleudern kommt!!!!! + +Preise werden berechnet: Grundpreis + Preis für die Variante +Text wird ergänzt: Standardtext + ", Variantengruppe: Variante" + +Ein beschreibbares Verzeichnis "tmp" wird als Unterverzeichnis erwartet. +z.B.: +ln -s /tmp + +Wenn ein Platzhalterbild eingesetzt werden soll, so muß das Bild zuerst auf +den Shopserver übertragen werden. +.jpg + +Dann den Namen in der Maske eintragen. Man kann bestimmen, ob +das Bild immer genommen wird, wenn kein Bild angegeben wird oder nur wenn +der Upload schief gegangen ist. + +Artikelexport (Lx -> Shop) kann ohne Bilderupload durchgeführt werden. +Spart Bandbreite und Zeit, wenn nur Updates gemacht werden. +Parameterübergabe: nofiles=1 +[Shop--Warenexport] +module=shopxtc/ArtikelErpToShop.php +nofiles=1 + +Shop ist Mehrshopfähig. Shopnummer muß beim Aufruf übergeben werden: +Shop=1 + +Die Im-/Exportmodule lassen sich auch auf der Konsole oder per Cron-Job aufrufen: + +php ArtikelShopToErp.php shop=1 > /tmp/export.log diff --git a/shopxtc/PictureXTC.php b/shopxtc/PictureXTC.php new file mode 100644 index 000000000..7bd6c9617 --- /dev/null +++ b/shopxtc/PictureXTC.php @@ -0,0 +1,99 @@ +ERPftphost = $ERPhost; + $this->ERPftpuser = $ERPuser; + $this->ERPftppwd = $ERPpass; + $this->ERPimgdir = $ERPimgdir; + $this->SHOPftphost = $SHOPhost; + $this->SHOPftpuser = $SHOPuser; + $this->SHOPftppwd = $SHOPpass; + $this->SHOPimgdir = $SHOPimgdir; + $this->err = $err; + } + + function copyImage($id,$image,$typ) { + if ( !$this->fromERP($image) ) return false; + if ( !$this->mkbilder() ) return false; + return $this->toShop($id,$typ); + } + + function mkbilder() { + if ( !class_exists("Imagick") ) { $this->err->out("Imagick-Extention nicht installiert",true); return false; }; + $handle = new Imagick(); + if ( !$handle->readImage("./tmp/tmp.file_org") ) return false; + $d = $handle->getImageGeometry(); + if ( $d["width"]<$d["height"] ) { + $faktor = $d["height"]/$d["width"]; + } else { + $faktor = $d["width"]/$d["height"]; + } + + $thumbheight = floor($this->thumbwidth*$faktor); + $handle->thumbnailImage($this->thumbwidth, $thumbheight); + $rc = $handle->writeImage( "./tmp/tmp.file_thumb"); + + $handle->readImage("./tmp/tmp.file_org"); + $popupheight = floor($this->popupwidth * $faktor); + $handle->thumbnailImage( $this->popupwidth, $popupheight); + $rc = $handle->writeImage( "./tmp/tmp.file_popup"); + + $handle->readImage("./tmp/tmp.file_org"); + $infoheight = floor($this->infowidth * $faktor); + $handle->thumbnailImage( $this->infowidth, $infoheight); + $rc = $handle->writeImage( "./tmp/tmp.file_info"); + return $rc; + } + + function fromERP($image) { + if ( $this->ERPftphost == 'localhost' ) { + exec("cp $this->ERPimgdir/$image ./tmp/tmp.file_org",$aus,$rc2); + if ( $rc2>0 ) { $this->err->out("[Downloadfehler: $image]",true); return false; }; + } else { + $conn_id = ftp_connect($this->ERPftphost); + $rc = @ftp_login($conn_id,$this->ERPftpuser,$this->ERPftppwd); + $src = $this->ERPimgdir."/".$image; + $upload = @ftp_get($conn_id,"tmp/tmp.file_org","$src",FTP_BINARY); + if ( !$upload ) { $this->err->out("[Ftp Downloadfehler! $image]",true); return false; }; + ftp_quit($conn_id); + } + $this->image = $image; + return true; + } + + function toShop($id,$typ) { + $picname = $id."_0.".$typ; + if ( $this->SHOPftphost == 'localhost' ) { + exec("cp ./tmp/tmp.file_org $this->SHOPimgdir/original_images/$picname",$aus,$rc1); + exec("cp ./tmp/tmp.file_info $this->SHOPimgdir/info_images/$picname",$aus,$rc2); + exec("cp ./tmp/tmp.file_popup $this->SHOPimgdir/popup_images/$picname",$aus,$rc3); + exec("cp ./tmp/tmp.file_thumb $this->SHOPimgdir/thumbnail_images/$picname",$aus,$rc4); + if ( $rc1>0 || $rc2>0 || $rc3>0 || $rc4>0 ) { $this->err->out("[Uploadfehler: $this->image / $picname]",true); return false; }; + } else { + $conn_id = ftp_connect($this->SHOPftphost); + @ftp_login($conn_id,$this->SHOPftpuser,$this->SHOPftppwd); + @ftp_chdir($conn_id,$this->SHOPimgdir); + $upload = @ftp_put($conn_id,$this->SHOPimgdir."/original_images/$picname","tmp/tmp.file_org",FTP_BINARY); + if ( !$upload ) { $this->err->out("[Ftp Uploadfehler! original_images/$picname]",true); return false; }; + $upload = @ftp_put($conn_id,$this->SHOPimgdir."/info_images/$picname","tmp/tmp.file_info",FTP_BINARY); + if ( !$upload ) { $this->err->out("[Ftp Uploadfehler! info_images/$picname]",true); return false; }; + $upload = @ftp_put($conn_id,$this->SHOPimgdir."/popup_images/$picname","tmp/tmp.file_popup",FTP_BINARY); + if ( !$upload ) { $this->err->out("[Ftp Uploadfehler! popup_images/$picname]",true); return false; }; + $upload = @ftp_put($conn_id,$this->SHOPimgdir."/thumbnail_images/$picname","tmp/tmp.file_thumb",FTP_BINARY); + if ( !$upload ) { $this->err->out("[Ftp Uploadfehler! thumb_images/$picname]",true); return false; }; + @ftp_quit($conn_id); + } + return true; + } + + +} +?> diff --git a/shopxtc/conf.php.default b/shopxtc/conf.php.default new file mode 100644 index 000000000..77466edbd --- /dev/null +++ b/shopxtc/conf.php.default @@ -0,0 +1,90 @@ + diff --git a/shopxtc/confedit.php b/shopxtc/confedit.php new file mode 100755 index 000000000..824c41129 --- /dev/null +++ b/shopxtc/confedit.php @@ -0,0 +1,457 @@ +$ERPftpuser || $_SERVER['PHP_AUTH_PW']<>$ERPftppwd) { + Header("WWW-Authenticate: Basic realm='My Realm'"); + Header("HTTP/1.0 401 Unauthorized"); + echo "Sie müssen sich autentifizieren\n"; + exit; + } + echo $out; + } +} +$debug = true; + +include_once("error.php"); +include_once("dblib.php"); +$api = php_sapi_name(); +if ( $api == 'cli' ) { + echo "Nur im Browser benutzen\n"; + exit(-1); +}; +$err = new error($api); + +$zeichen = array("","UTF-8","ISO-8859-1","ISO-8859-15","Windows-1252","ASCII"); +function lager($sel,$db) { + if (!$db) return ''; + $sql = "select w.description as lager,b.description as platz,b.id from "; + $sql .= "bin b left join warehouse w on w.id=b.warehouse_id "; + $sql .= "order by b.warehouse_id,b.id"; + $bin=$db->getall($sql); + echo "\t