Secure->GetGET('id'); $nurfehler = $app->YUI->TableSearchFilter($name, 10, 'nurfehler', 0,0,'checkbox'); $auftraege = $app->YUI->TableSearchFilter($name, 22, 'auftraege', 0,0,'checkbox'); $aenderungen = $app->YUI->TableSearchFilter($name, 28, 'aenderungen', 0,0,'checkbox'); $allowed['onlineshops'] = array('edit'); $heading = array('','Datum','Typ','Wert','Wert 2','Bearbeiter',''); $width = array('1%','20%','10%','20%','20%','15%','1%'); $findcols = array('open', 'sl.zeitstempel','sl.typ','sl.parameter1','sl.parameter2','sl.bearbeiter', 'sl.tid'); $searchsql = array('sl.zeitstempel','sl.typ','sl.parameter1','sl.parameter2','sl.bearbeiter'); $defaultorder = 2; //Optional wenn andere Reihenfolge gewuenscht $defaultorderdesc = 1; if($auftraege) { $arr[]="(SELECT id,logdatei as zeitstempel, 'Auftrag' as typ,extid as parameter1,bestellnummer as parameter2,bearbeiter, concat('2-',id) as tid FROM shopimport_auftraege WHERE shopid = '$id')"; }else{ $arr[] = "(SELECT id, zeitstempel, typ, parameter1,parameter2,bearbeiter, concat('1-',id) as tid FROM shopexport_log WHERE shopid = '$id')"; } if($aenderungen){ $arr[] = "(SELECT id, creation_timestamp, 'Einstellungsänderung',message, plaindiff,username, concat('3-',id) as tid FROM shopexport_change_log WHERE shop_id = '$id')"; } $sql = "SELECT SQL_CALC_FOUND_ROWS sl.id, 'Conf->WFconf['defaulttheme']}/images/details_open.png class=details>' as open, sl.zeitstempel, sl.typ, substring(sl.parameter1,1,50), sl.parameter2,sl.bearbeiter, sl.tid FROM ( ".implode(" UNION ALL ", $arr)." ) sl "; $menucol = 6; $moreinfo = true; $doppelteids = true; //$where = "shopid = '$id'"; $where = " 1 "; $menu = "id=%value%"; if($nurfehler)$where .= " AND sl.typ like 'fehler' "; break; case "shopexport_sprachen": $id = $app->Secure->GetGET('id'); $allowed['onlineshops'] = array('edit'); $heading = array('Land','Projekt','Sprache','Aktiv','Menü'); $width = array('10%','20%','20%','5%','1%'); $findcols = array('s.land', 'p.abkuerzung','s.sprache','s.aktiv','s.id'); $searchsql = array('s.land', 'p.abkuerzung','s.sprache','s.aktiv'); $defaultorder = 1; //Optional wenn andere Reihenfolge gewuenscht $defaultorderdesc = 0; $sql = "SELECT SQL_CALC_FOUND_ROWS s.id, s.land, p.abkuerzung, s.sprache, if(s.aktiv = 1, 'ja','-'), s.id FROM shopexport_sprachen s LEFT JOIN projekt p ON s.projekt = p.id "; $where = " s.shop = '$id'"; $menu = "
" . "" . "Conf->WFconf['defaulttheme']}/images/edit.svg\" border=\"0\">" . " " . "" . "Conf->WFconf['defaulttheme']}/images/delete.svg\" border=\"0\">" . " 
"; break; case "shopexport_kundengruppen": $id = $app->Secure->GetGET('id'); $allowed['onlineshops'] = array('edit'); $heading = array('Kennziffer','Kundengruppe','Bezeichnung Shop','Projekt','Rolle','Neukunden zuweisen','Aktiv','Menü'); $width = array('5%','40%','30%','10%','5%','%5','4%','1%'); $findcols = array('g.name', 'g.kennziffer','s.extgruppename','s.projekt','s.type',"if(s.apply_to_new_customers = 1, 'ja','-')","if(s.aktiv = 1, 'ja','-')",'s.id'); $searchsql = array('g.name', 'g.kennziffer','s.extgruppename','s.projekt','s.type',"if(s.apply_to_new_customers = 1, 'ja','-')","if(s.aktiv = 1, 'ja','-')"); $defaultorder = 1; //Optional wenn andere Reihenfolge gewuenscht $defaultorderdesc = 0; $sql = "SELECT SQL_CALC_FOUND_ROWS s.id, g.kennziffer, g.name, s.extgruppename, IF(s.projekt='','',p.name), s.type, IF(s.apply_to_new_customers=1,'ja','-'), IF(s.aktiv = 1, 'ja','-'), s.id FROM shopexport_kundengruppen s LEFT JOIN projekt p ON s.projekt = p.id LEFT JOIN gruppen g ON s.gruppeid = g.id "; $where = " s.shopid = '$id' AND g.aktiv = 1"; $menu = "
" . "" . "Conf->WFconf['defaulttheme']}/images/edit.svg\" border=\"0\">" . " " . "" . "Conf->WFconf['defaulttheme']}/images/delete.svg\" border=\"0\">" . " 
"; break; } $erg = []; foreach($erlaubtevars as $k => $v) { if(isset($$v)) { $erg[$v] = $$v; } } return $erg; } /** * Onlineshops constructor. * * @param Application $app * @param bool $intern */ public function __construct($app, $intern = false) { //parent::GenShopexport($app); $this->app=$app; if($intern) { return; } $this->tmpl = $this->app->Container->get('Template'); $this->tmpl->setDefaultNamespace('Modules/Onlineshop'); $this->app->ActionHandlerInit($this); $this->app->ActionHandler("create","ShopexportCreate"); $this->app->ActionHandler("edit","ShopexportEdit"); $this->app->ActionHandler("list","ShopexportList"); $this->app->ActionHandler("delete","ShopexportDelete"); $this->app->ActionHandler("zahlweisedelete","ShopexportZahlweisedelete"); $this->app->ActionHandler("versandartdelete","ShopexportVersandartdelete"); $this->app->ActionHandler("freifelddelete","ShopexportFreifelddelete"); $this->app->ActionHandler("subshopdelete","ShopexportSubshopdelete"); $this->app->ActionHandler("sprachendelete","ShopexportSprachendelete"); $this->app->ActionHandler("zahlweiseget","ShopexportZahlweiseget"); $this->app->ActionHandler("zahlweisesave","ShopexportZahlweisesave"); $this->app->ActionHandler("sprachenget","ShopexportSprachenget"); $this->app->ActionHandler("sprachensave","ShopexportSprachensave"); $this->app->ActionHandler("kundengruppenget","ShopexportKundengruppenget"); $this->app->ActionHandler("kundengruppensave","ShopexportKundengruppensave"); $this->app->ActionHandler("kundengruppeneditsave","ShopexportKundengruppensave"); $this->app->ActionHandler("kundengruppendelete","ShopexportKundengruppendelete"); $this->app->ActionHandler("zahlweiseeditsave","ShopexportZahlweiseeditsave"); $this->app->ActionHandler("exportartikelbaum","ShopexportArtikelbaumexport"); $this->app->ActionHandler("freifeldersave","ShopexportFreifeldsave"); $this->app->ActionHandler("subshopsave","ShopexportSubshopsave"); $this->app->ActionHandler("versandartget","ShopexportVersandartget"); $this->app->ActionHandler("freifeldget","ShopexportFreifeldget"); $this->app->ActionHandler("subshopget","ShopexportSubshopget"); $this->app->ActionHandler("versandartsave","ShopexportVersandartsave"); $this->app->ActionHandler("versandarteditsave","ShopexportVersandarteditsave"); $this->app->ActionHandler("freifeldereditsave","ShopexportFreifeldereditsave"); $this->app->ActionHandler("spracheneditsave","ShopexportSpracheneditsave"); $this->app->ActionHandler("subshopeditsave","ShopexportSubshopeditsave"); $this->app->ActionHandler("minidetail","ShopexportMinidetail"); $this->app->ActionHandler("features","ShopexportFeatures"); $this->app->ActionHandler('appnew', 'ShopexportAppNew'); $this->app->ActionHandler('getapi', 'ShopexportGetApi'); $this->app->ActionHandler('itemlink', 'ShopexportItemlink'); $this->app->ActionHandler('orderlink', 'ShopexportOrderlink'); $this->app->erp->Headlines('Shopexport'); $this->app->ActionHandlerListen($app); } public function InstallResouces() { $resourcesDir = dirname(__DIR__, 2).'/classes/Modules/Onlineshop/resources'; $cacheDir = dirname(__DIR__).'/cache/Onlineshop/resources'; $resourcesSubDirs = ['usecasesSvgDe', 'usecasesSvgEn',]; if(!is_dir($resourcesDir)) { return; } if(!is_dir($cacheDir) && !mkdir($cacheDir,0777, true) && !is_dir($cacheDir)) { return; } foreach($resourcesSubDirs as $subDir) { if(!is_dir($resourcesDir.'/'.$subDir)) { continue; } if(!is_dir($cacheDir.'/'.$subDir) && !mkdir($cacheDir.'/'.$subDir,0777, true) && !is_dir($cacheDir.'/'.$subDir)) { continue; } $handle = opendir($resourcesDir.'/'.$subDir); if(empty($handle)) { continue; } while($entry = readdir($handle)) { if(substr($entry, -4) === '.svg' && is_file($resourcesDir.'/'.$subDir.'/'.$entry)) { if(!is_file($cacheDir.'/'.$subDir.'/'.$entry)) { copy($resourcesDir.'/'.$subDir.'/'.$entry, $cacheDir.'/'.$subDir.'/'.$entry); } } } closedir($handle); } } /** * @param int $shopId * * @return array */ public function genearteApiAccount($shopId) { $shop = $this->app->DB->SelectRow( sprintf( 'SELECT se.`id`, se.`api_account_id`, ac.id AS `api_id`, `se`.bezeichnung FROM `shopexport` AS `se` LEFT JOIN `api_account` AS `ac` ON se.api_account_id = ac.id WHERE se.`id` = %d', $shopId ) ); if(empty($shop)) { return ['success' => false, 'error' => 'Shop nicht gefunden']; } if(!empty($shop['api_id'])) { return ['success' => false, 'error' => 'Api Account existiert bereits', 'api_id' => $shop['api_id']]; } $remoteDomain = $shop['bezeichnung']; $firstRemoteDomain = $remoteDomain; $apiName = $shop['bezeichnung']; $firstApiName = $apiName; $remoteIndex = 0; $key = sha1(uniqid('shopexport', true)); while( !empty( $this->app->DB->Select( sprintf( "SELECT `id` FROM `api_account` WHERE `remotedomain` = '%s' OR `bezeichnung` = '%s' LIMIT 1", $this->app->DB->real_escape_string($remoteDomain), $this->app->DB->real_escape_string($apiName) ) ) ) ) { $remoteIndex++; $remoteDomain = $firstRemoteDomain.'_'.$remoteIndex; $apiName = $firstApiName.' '.$remoteIndex; } $this->app->DB->Insert( sprintf( "INSERT INTO `api_account` (`bezeichnung`, `initkey`, `importwarteschlange_name`, `event_url`, `remotedomain`, `aktiv`, `importwarteschlange`, `cleanutf8`, `uebertragung_account`, `projekt`, `permissions`) VALUES ('%s', '%s', '', '', '%s', 1, 0, 0, 0, 0, '%s')", $this->app->DB->real_escape_string($apiName), $this->app->DB->real_escape_string($key), $this->app->DB->real_escape_string($remoteDomain), $this->app->DB->real_escape_string('["communicate_with_shop"]') ) ); $apiId = $this->app->DB->GetInsertID(); $this->app->DB->Update( sprintf( 'UPDATE `shopexport` SET `api_account_id` = %d WHERE `id` = %d', $apiId, $shopId ) ); return ['success' => true, 'api_id' => $apiId]; } public function ShopexportItemlink() { $id = (int)$this->app->Secure->GetGET('id'); $shop = $this->app->DB->Select(sprintf('SELECT `id` FROM `shopexport` WHERE `id` = %d', $id)); if(empty($shop)) { $this->app->Location->execute( 'index.php?module=onlineshops&action=list&msg='. $this->app->erp->base64_url_encode('
Shop nicht gefunden
') ); } $sid = base64_decode($this->app->Secure->GetGET('sid')); if(empty($sid)) { $this->app->Location->execute( 'index.php?module=onlineshops&action=list&msg='. $this->app->erp->base64_url_encode('
Artikel nicht angegeben
') ); } $article = $this->app->DB->SelectRow( sprintf( "SELECT art.id, art.projekt FROM `artikel` AS art LEFT JOIN `artikelnummer_fremdnummern` AS af on art.id = af.artikel AND af.aktiv = 1 AND af.shopid = %d WHERE (art.nummer = '%s' OR af.nummer = '%s') AND (art.geloescht = 0 OR art.geloescht IS NULL) ORDER BY af.id DESC LIMIT 1", $shop, $this->app->DB->real_escape_string($sid), $this->app->DB->real_escape_string($sid) ) ); if(empty($article)) { $this->app->Location->execute( 'index.php?module=onlineshops&action=list&msg='. $this->app->erp->base64_url_encode(sprintf('
Artikel %s nicht gefunden
', $sid)) ); } if(empty($article['projekt']) || $this->app->User->projectOk($article['projekt'])){ $this->app->Location->execute('index.php?module=artikel&action=edit&id=' . $article['id']); } $this->app->Location->execute( 'index.php?module=onlineshops&action=list&msg='. $this->app->erp->base64_url_encode( sprintf( '
Sie haben keine Rechte den Artikel %s aufzurufen
', $sid ) ) ); } /** * @param string $server * * @return string[][] */ public function getUserCases($server) { return [ 'batchpicking' => [ 'title_de' => 'Batch Kommissionierung', 'title_en' => 'Batch Picking', 'svg_de' => 'usecasesSvgDe/Batch_Kommissionierung@1x.svg', 'svg_en' => 'usecasesSvgEn/Batch_picking@1x.svg', 'link' => $server .'/index.php?module=batchpicking&action=list', 'link_alt' => 'https://xentral.com/helpdesk/kurzanleitung-batches-picklisten', ], 'buchhaltungsexport' => [ 'title_de' => 'Datev Export', 'title_en' => 'Data export', 'svg_de' => 'usecasesSvgDe/Datev_Export@1x.svg', 'svg_en' => 'usecasesSvgEn/Data_export@1x.svg', 'link' => $server .'/index.php?module=buchhaltungexport&action=list', 'link_alt' => 'https://xentral.com/helpdesk/kurzanleitung-export-fuer-die-buchhaltung', ], 'dropshipping' => [ 'title_de' => 'Dropshipping', 'title_en' => 'Dropshipping', 'svg_de' => 'usecasesSvgDe/Dropshipping@1x.svg', 'svg_en' => 'usecasesSvgEn/Dropshipping@1x.svg', 'link' => $server .'/index.php?module=dropshipping&action=list', 'link_alt' => 'https://xentral.com/helpdesk/dropshipping', ], 'kommissionierlauf' => [ 'title_de' => 'Einfache Pickliste', 'title_en' => 'Simple pick list', 'svg_de' => 'usecasesSvgDe/Einfache_Pickliste@1x.svg', 'svg_en' => 'usecasesSvgEn/Simple_pick_list@1x.svg', 'link' => $server .'/index.php?module=kommissionierlauf&action=list', 'link_alt' => 'https://xentral.com/helpdesk/kurzanleitung-logistikprozesse', ], 'mahnwesen' => [ 'title_de' => 'Mahnwesen', 'title_en' => 'Dunning', 'svg_de' => 'usecasesSvgDe/Mahnwesen@1x.svg', 'svg_en' => 'usecasesSvgEn/Dunning@1x.svg', 'link' => $server .'/index.php?module=mahnwesen&action=list', 'link_alt' => 'https://xentral.com/helpdesk/kurzanleitung-mahnwesen', ], 'versandarten' => [ 'title_de' => 'Paketmarken', 'title_en' => 'Parcel stamps', 'svg_de' => 'usecasesSvgDe/Paketmarken@1x.svg', 'svg_en' => 'usecasesSvgEn/Parcel_stamps@1x.svg', 'link' => $server .'/index.php?module=versandarten&action=list', 'link_alt' => 'https://xentral.com/helpdesk/kurzanleitung-versandarten', ], 'pos' => [ 'title_de' => 'POS Anbinden', 'title_en' => 'Connect POS', 'svg_de' => 'usecasesSvgDe/POS_Anbinden@1x.svg', 'svg_en' => 'usecasesSvgEn/Connect_POS@1x.svg', 'link' => $server .'/index.php?module=pos&action=list', 'link_alt' => 'https://xentral.com/helpdesk/kurzanleitung-arbeiten-mit-der-pos-kasse', ], 'retoure' => [ 'title_de' => 'Retouren', 'title_en' => 'Returns', 'svg_de' => 'usecasesSvgDe/Retouren@1x.svg', 'svg_en' => 'usecasesSvgEn/Returns@1x.svg', 'link' => $server .'/index.php?module=retoure&action=list', 'link_alt' => 'https://xentral.com/helpdesk/kurzanleitung-rma', ], 'wareneingang' => [ 'title_de' => 'Wareneingang', 'title_en' => 'Goods Receipt', 'svg_de' => 'usecasesSvgDe/Wareneingang@1x.svg', 'svg_en' => 'usecasesSvgEn/Goods_Receipt@1x.svg', 'link' => $server .'/index.php?module=warneingang&action=paketannahme', 'link_alt' => 'https://xentral.com/helpdesk/kurzanleitung-zentraler-wareneingang', ], ]; } /** * @param int $shopId * * @return array */ public function getModulelinks($shopId = 0) { $server = $this->app->Location->getServer(); $pos1 = strpos($server, 'api/index.php'); if((int)$pos1 > 0) { $server = substr($server, 0, (int)$pos1); } elseif((int)($pos1 = strpos($server, 'index.php')) > 0) { $server = substr($server, 0, (int)$pos1); } elseif((int)($pos1 = strpos($server, '/api/shopimport/modulelinks')) > 0) { $server = substr($server, 0, (int)$pos1); } $server = rtrim($server,'/'); /** @var Appstore $appstore */ $appstore = $this->app->loadModule('appstore'); $apps = $appstore->getAppsList(); $ret = $this->getUserCases($server); if(!empty($apps['kauf'])){ foreach ($ret as $module => $box) { if($this->app->erp->ModulVorhanden($module)){ continue; } foreach ($apps['kauf'] as $app) { if($app['key'] !== $module) { continue; } $ret[$module]['link'] = $server .'/index.php?module=appstore&action=list&cmd=detail&app='.$app['key']; break; } } } $cacheDir = dirname(__DIR__).'/cache/Onlineshop/resources'; foreach($ret as $key => $val) { if(!empty($val['svg_en'])) { $file = $cacheDir.'/'.$val['svg_en']; if(!is_file($cacheDir.'/'.$val['svg_en'])) { $this->InstallResouces(); break; } } if(!empty($val['svg_de'])) { if(!is_file($cacheDir.'/'.$val['svg_de'])) { $this->InstallResouces(); break; } } } foreach($ret as $key => $val) { if(!empty($val['svg_en'])) { $ret[$key]['svg_en'] = $server.'/cache/Onlineshop/resources/'. $val['svg_en']; } if(!empty($val['svg_de'])) { $ret[$key]['svg_de'] = $server.'/cache/Onlineshop/resources/'. $val['svg_de']; } } return $ret; } public function ShopexportOrderlink() { $id = (int)$this->app->Secure->GetGET('id'); $shop = $this->app->DB->Select(sprintf('SELECT `id` FROM `shopexport` WHERE `id` = %d', $id)); if(empty($shop)) { $this->app->Location->execute( 'index.php?module=onlineshops&action=list&msg='. $this->app->erp->base64_url_encode('
Shop nicht gefunden
') ); } $sid = base64_decode($this->app->Secure->GetGET('sid')); if(empty($sid)) { $this->app->Location->execute( 'index.php?module=onlineshops&action=list&msg='. $this->app->erp->base64_url_encode('
Auftrag nicht angegeben
') ); } $order = $this->app->DB->SelectRow( sprintf( "SELECT `id`, `projekt` FROM `auftrag` WHERE (`internet`= '%s' OR `shopextid` = '%s') AND `shop` = %d ORDER BY `status` = 'storniert' LIMIT 1", $this->app->DB->real_escape_string($sid), $this->app->DB->real_escape_string($sid), $id ) ); if(empty($order)) { $this->app->Location->execute( 'index.php?module=onlineshops&action=list&msg='. $this->app->erp->base64_url_encode(sprintf('
Auftrag %s nicht gefunden
', $sid)) ); } if(empty($order['projekt']) || $this->app->User->projectOk($order['projekt'])){ $this->app->Location->execute('index.php?module=auftrag&action=edit&id=' . $order['id']); } $this->app->Location->execute( 'index.php?module=onlineshops&action=list&msg='. $this->app->erp->base64_url_encode( sprintf( '
Sie haben keine Rechte den Auftrag %s aufzurufen
', $sid ) ) ); } /** * @param string $data * * @return array */ public function checkAppData($data) { $data = json_decode($data, true); if(empty($data['shoptype'])) { return ['success'=>false,'error' => 'no shoptype given']; } if(empty($data['token'])) { return ['success'=>false,'error' => 'no token given']; } if(strpos($data['shoptype'],'shopimporter_') !== 0) { return ['success'=>false,'error' => sprintf('Shopmodule %s not valid', $data['shoptype'])]; } if(!$this->app->erp->ModulVorhanden($data['shoptype'])) { return ['success'=>false,'error' => sprintf('Shopmodule %s not found', $data['shoptype'])]; } /** @var ShopimporterBase $shop */ $shop = $this->app->loadModule($data['shoptype']); if(!method_exists($shop, 'checkApiApp')) { return ['success'=>false,'error' => sprintf('Shopmodule %s provide no api', $data['shoptype'])]; } $info = null; $check = $shop->checkApiApp($data); if(!empty($check['error'])) { return $check; } if(!empty($check['info'])) { $info = $check['info']; } return ['success'=>true, 'data' => $data, 'info' => $info]; } /** * @return JsonResponse|void */ public function ShopexportAppNew() { $cmd = $this->app->Secure->GetGET('cmd'); $fromAjax = $cmd === 'createdata'; $fromCreateButton = $this->app->Secure->GetPOST('create'); if($fromAjax || $fromCreateButton) { $data = $this->app->Secure->GetPOST('data','','',true); $step = (int)$this->app->Secure->GetPOST('step'); $shopId = (int)$this->app->Secure->GetPOST('shopId'); if($step === 2 && $shopId > 0 && !empty($data)) { return $this->getVueShopexportAppNewSuccessPageYt($shopId, $data); } $check = $this->checkAppData($data); $shopId = $shopId <= 0?0:(int)$this->app->DB->Select( sprintf( "SELECT `id` FROM `shopexport` WHERE `geloescht` = 0 AND `aktiv` = 1 AND `id` = %d AND `modulename` = '%s'", $shopId, $this->app->DB->real_escape_string($check['data']['shoptype']) ) ); if(!empty($check['error'])) { if(!$fromCreateButton) { return new JsonResponse( ['error'=>'
'.$check['error'].'
'], JsonResponse::HTTP_INTERNAL_SERVER_ERROR ); } $this->app->Location->execute( 'index.php?module=onlineshops&action=appnew&msg=' .$this->app->erp->base64_url_encode('
'.$check['error'].'
') ); } if($shopId > 0) { $shop = ['id' => $shopId,]; } else { $shop = $this->createInternShop($check['data']['shoptype']); } if(!empty($shop['error'])) { if(!$fromCreateButton) { return new JsonResponse( ['error'=>'
'.$shop['error'].'
'], JsonResponse::HTTP_INTERNAL_SERVER_ERROR ); } $this->app->Location->execute( 'index.php?module=onlineshops&action=appnew&msg=' .$this->app->erp->base64_url_encode('
'.$shop['error'].'
') ); } $apiAccount = $this->genearteApiAccount($shop['id']); if(!empty($apiAccount['api_id'])) { $json = $this->app->DB->Select( sprintf( 'SELECT `einstellungen_json` FROM `shopexport` WHERE `id` = %d', $shop['id'] ) ); $json = json_decode($json, true); if(!is_array($json)) { $json = []; } if(empty($json['felder'])) { $json['felder'] = []; } if(!empty($check['data']['data'])) { foreach($check['data']['data'] as $fieldKey => $fieldValue) { $json['felder'][$fieldKey] = $fieldValue; } } $json = json_encode($json); $this->app->DB->Update( sprintf( "UPDATE `shopexport` SET `einstellungen_json` = '%s', `api_account_token` = '%s', `demomodus` = 0, `cronjobaktiv` = 1, `lagerexport` = 1 WHERE `id` = %d", $this->app->DB->real_escape_string($json), $this->app->DB->real_escape_string($check['data']['token']), $shop['id'] ) ); if(!$fromCreateButton) { return $this->getVueShopexportAppNewSuccessPage($shop['id'], $data); } $this->app->Location->execute( 'index.php?module=onlineshops&action=appnew&shopid='.$shop['id'] .'&url='.urlencode($check['data']['url']) ); } } if($cmd === 'checkdata') { $data = $this->app->Secure->GetPOST('data','','',true); $check = $this->checkAppData($data); if(!empty($check['error'])) { return new JsonResponse($check, JsonResponse::HTTP_INTERNAL_SERVER_ERROR); } return new JsonResponse(['html'=>'
Shoptyp: '.$check['data']['shoptype'].'
']); } $shopdata = $this->app->Secure->GetGET('shopdata'); if(!empty($shopdata)) { $shopdata = base64_decode($shopdata); $this->app->User->SetParameter('onlineshops_appnew', $shopdata); $this->app->User->SetParameter('onlineshops_appnew_time', date('Y-m-d H:i:s')); $this->app->erp->RegisterHook('welcome_start', 'onlineshops', 'OnlineShopsWelcomeStart'); $this->app->Location->execute('index.php?module=welcome&action=start'); } $this->app->erp->MenuEintrag('index.php?module=onlineshops&action=appnew', 'Shop mit API anlegen'); $shopId = $this->app->Secure->GetGET('shopid'); $url = $this->app->Secure->GetGET('url'); if(!empty($shopId)) { if(!empty($url)) { $this->app->Tpl->Add( 'MESSAGE', '
Es wurde ein neuer Shop angelegt. zurück zum Onlineshop
' ); } else { $this->app->Tpl->Add( 'MESSAGE', '
Es wurde ein neuer Shop angelegt.
' ); } } $this->app->Tpl->Parse('PAGE', 'onlineshop_appnew.tpl'); } /** * @param Welcome $welcomeObj */ public function OnlineShopsWelcomeStart($welcomeObj) { $appnew = $this->app->User->GetParameter('onlineshops_appnew'); if(empty($appnew)) { return; } $appnewTime = $this->app->User->GetParameter('onlineshops_appnew_time'); if(empty($appnewTime)) { return; } try { $lastDay = new DateTime(date('Y-m-d H:i:s')); $lastDay->sub(new DateInterval('P1D')); $appnewTime = new DateTime($appnewTime); if($appnewTime < $lastDay) { return; } } catch (Exception $e) { return; } $this->app->ModuleScriptCache->IncludeJavascriptFiles( 'onlineshops', ['./classes/Modules/Onlineshop/www/js/onlineshop_appnew.js'] ); $this->app->User->SetParameter('onlineshops_appnew', ''); $this->app->User->SetParameter('onlineshops_appnew_time', ''); $check = $this->checkAppData($appnew); if(!empty($check['success'])) { $shopModule = $check['data']['shoptype']; $shopModules = [['value' => '-1', 'text'=> 'Neu anlegen',],]; $shopModulesPair = $this->app->DB->SelectArr( sprintf( "SELECT `id` AS `value`, `bezeichnung` AS `text` FROM `shopexport` WHERE `geloescht` = 0 AND `modulename` = '%s' AND `aktiv` = 1 ORDER BY `bezeichnung`", $this->app->DB->real_escape_string($shopModule) ) ); if(!empty($shopModulesPair)) { $shopModules = array_merge( [['value'=>'', 'text'=> '']], $shopModulesPair,$shopModules ); } else { $shopModules = array_merge( [['value'=>'', 'text'=> '']], $shopModules ); } $this->app->Tpl->Set('APPNEWJSON', json_encode($shopModules)); $this->app->Tpl->Set('APPNEWDATA', htmlspecialchars($appnew)); $this->app->Tpl->Set('APPNEWINFO', empty($check['info']['info'])?'':$check['info']['info']); $this->app->Tpl->Set('APPNEWFIELDSET', empty($check['info']['Shop'])?'':$check['info']['Shop']); $this->app->Tpl->Parse('AUFGABENPOPUP','onlineshops_appnewpopup.tpl'); } else { $error =!empty($check['error'])?$check['error']:'Request ungültig'; $this->app->Tpl->Set('ERRORMSG', $error); $this->app->Tpl->Parse('AUFGABENPOPUP','onlineshops_appnewerrorpopup.tpl'); } $this->app->ModuleScriptCache->IncludeWidgetNew('ClickByClickAssistant'); } /** * @return JsonResponse */ public function ShopexportGetApi() { $token = $this->app->Secure->GetGET('token'); $cmd = $this->app->Secure->GetGET('cmd'); if($cmd === 'getusecases') { $data = $this->getModulelinks(); return new JsonResponse($data); } if(empty($token)) { $data = ['success' => false, 'error' => 'no Token given']; return new JsonResponse($data, JsonResponse::HTTP_INTERNAL_SERVER_ERROR); } $shopId = $this->app->DB->SelectRow( sprintf( "SELECT `id`, `api_account_id` FROM `shopexport` WHERE `api_account_token` = '%s' LIMIT 1", $token ) ); if(empty($shopId)) { $data = ['success' => false, 'error' => 'Token is invalid']; return new JsonResponse($data, JsonResponse::HTTP_INTERNAL_SERVER_ERROR); } $apiAccount = $this->app->DB->SelectRow( sprintf( 'SELECT `id`, `initkey`, `remotedomain` FROM `api_account` WHERE `id` = %d LIMIT 1', $shopId['api_account_id'] ) ); $data = ['success' => true]; $data['shopid'] = $shopId['id']; $data['api_account_id'] = $shopId['api_account_id']; $data['apiname'] = $apiAccount['remotedomain']; $data['apikey'] = $apiAccount['initkey']; $data['server'] = rtrim(str_replace('index.php','',$this->app->Location->getServer()),'/'); $data['api_auth'] = $data['server'].'/api/shopimport/auth'; $data['api_syncstorage'] = $data['server'].'/api/shopimport/syncstorage/{articlenumber_base64}'; $data['api_articletoxentral'] = $data['server'].'/api/shopimport/articletoxentral/{articlenumber_base64}'; $data['api_articletoshop'] = $data['server'].'/api/shopimport/articletoshop/{articlenumber_base64}'; $data['api_ordertoxentral'] = $data['server'].'/api/shopimport/ordertoxentral/{ordernumber_base64}'; $data['api_statistics'] = $data['server'].'/api/shopimport/statistics'; $data['api_modulelinks'] = $data['server'].'/api/shopimport/articletoshop/modulelinks'; $data['api_status'] = $data['server'].'/api/shopimport/articletoshop/status'; $data['api_disconnect'] = $data['server'].'/api/shopimport/articletoshop/disconnect'; $data['api_reconnect'] = $data['server'].'/api/shopimport/articletoshop/reconnect'; $data['item_link'] = $data['server'] .'/index.php?module=onlineshops&action=itemlink&id='.$shopId['id'].'&sid={articlenumber_base64}'; $data['order_link'] = $data['server'] .'/index.php?module=onlineshops&action=orderlink&id='.$shopId['id'].'&sid={ordernumber_base64}'; return new JsonResponse($data); } public function ShopexportMinidetail() { $ida = explode('-',$this->app->Secure->GetGET('id')); if(count($ida) < 2) { $this->app->ExitXentral(); } $id = $ida[1]; if($ida[0] == 1) { $wert = $this->app->DB->Select("SELECT parameter1 FROM shopexport_log WHERE id = '$id' LIMIT 1"); echo '
';
      echo htmlspecialchars($wert);
      echo '
'; }elseif($ida[0]==3){ $query = sprintf('SELECT shop_id FROM shopexport_change_log WHERE id=%d',$id); $shopId = $this->app->DB->Select($query); $query = sprintf('SELECT diff FROM shopexport_change_log WHERE shop_id=%d AND id<%d ORDER BY id ASC', $shopId,$id); $changeLogEntries = $this->app->DB->SelectArr($query); $fieldsToCompareTo = []; foreach ($changeLogEntries as $changeLogEntry){ $existingFields = json_decode($changeLogEntry['diff'],true); $fieldsToCompareTo = array_merge($fieldsToCompareTo,$existingFields); } $query = sprintf('SELECT diff FROM shopexport_change_log WHERE id=%d', $id); $lastChanges = json_decode($this->app->DB->Select($query),true); $message = ''; foreach ($lastChanges as $lastChangeFieldName => $lastChangeFieldValue){ $message .= ''; } $message .='
FeldnameUrsprünglicher WertAktualisierter Wert
'.$lastChangeFieldName.''.$fieldsToCompareTo[$lastChangeFieldName].''.$lastChangeFieldValue.'
'; echo $message; }else{ $shopimportCartRow = $this->app->DB->SelectRow( sprintf( 'SELECT * FROM `shopimport_auftraege` WHERE `id` = %d', $id ) ); if(!empty($shopimportCartRow['jsonencoded'])) { $warenkorb = json_decode(base64_decode($shopimportCartRow['warenkorb']), true); }else{ $warenkorb = unserialize(base64_decode($shopimportCartRow['warenkorb'])); } echo '
';
      echo print_r($warenkorb,true);
      echo '
'; $cartInfos = $this->app->DB->SelectArr( sprintf( "SELECT * FROM `onlineshop_transfer_cart` WHERE `shop_id` = %d AND `extid` = '%s'", $shopimportCartRow['shopid'], $this->app->DB->real_escape_string($shopimportCartRow['extid']) ) ); if(!empty($cartInfos)) { $table = new EasyTable($this->app); $table->Query("SELECT '' AS `Datum`, '' AS `status`, '' AS `Template`, '' AS `Transformiert`"); $table->datasets = []; foreach($cartInfos as $cartInfo) { $cart = empty($cartInfo['cart_transfer'])?'' :print_r(json_decode(base64_decode($cartInfo['cart_transfer'], true))); $template = empty($cartInfo['template'])?'':$cartInfo['template']; $table->datasets[] = [ 'Datum' => $cartInfo['created_at'], 'status' => $cartInfo['status'], 'Template' =>nl2br(htmlspecialchars($template)), 'Transformiert' => nl2br(htmlspecialchars($cart)), ]; } echo $table->DisplayNew('return','Transformiert','noAction'); } } $this->app->ExitXentral(); } public function ShopexportKundengruppensave() { $id = (int)$this->app->Secure->GetPOST('id'); $aktiv = (int)$this->app->Secure->GetPOST('aktiv'); $neukundenzuweisen = (int)$this->app->Secure->GetPOST('kundengruppeneukundenzuweisen'); $rolle = $this->app->Secure->GetPOST('zuweisungrolle'); $shopId = (int)$this->app->Secure->GetPOST('shop'); $kundengruppeIdAusXentral = $this->app->Secure->GetPOST('kundengruppexentral'); $kundengruppeBezeichnungAusShop = $this->app->Secure->GetPOST('kundengruppeshop'); $projektAbkuerzung = $this->app->Secure->GetPOST('projekt'); $projekt = $this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung = '$projektAbkuerzung' AND abkuerzung <> '' AND ifnull(geloescht,0) = 0 LIMIT 1"); if(!$projekt){ $projekt = '0'; } $antwort = array( 'status' => 1, 'statusText' => 'Gespeichert.' ); if(!$shopId){ $antwort['status'] = 0; $antwort['statusText'] = 'Shopzuordnung kann nicht gefunden werden.'; } $eintragBereitsvorhanden = $this->app->DB->Select("SELECT id FROM shopexport_kundengruppen WHERE projekt='$projekt' AND shopid='$shopId' AND gruppeid='$kundengruppeIdAusXentral' AND extgruppename='$kundengruppeBezeichnungAusShop' AND id<>'$id'LIMIT 1"); if($eintragBereitsvorhanden){ $antwort['status'] = 0; $antwort['statusText'] = 'Identischer Eintrag bereits vorhanden.'; } if ($antwort['status']){ $bearbeiter = $this->app->DB->real_escape_string($this->app->User->GetName()); if($id){ $sql = "UPDATE shopexport_kundengruppen SET type='$rolle',gruppeid='$kundengruppeIdAusXentral',extgruppename='$kundengruppeBezeichnungAusShop', aktiv='$aktiv', apply_to_new_customers='$neukundenzuweisen',projekt = '$projekt', updated=NOW(),updatedby='$bearbeiter' WHERE id='$id'"; $this->app->DB->Update($sql); }else{ $aktiv = '1'; $sql = "INSERT INTO shopexport_kundengruppen (shopid, gruppeid, extgruppename, aktiv, apply_to_new_customers,type, projekt, updated, updatedby) VALUES ('$shopId','$kundengruppeIdAusXentral','$kundengruppeBezeichnungAusShop','$aktiv','$neukundenzuweisen','$rolle','$projekt',NOW(),'$bearbeiter')"; $this->app->DB->Insert($sql); } } echo json_encode($antwort); $this->app->ExitXentral(); } public function ShopexportSprachensave() { $id = (int)$this->app->Secure->GetGET('id'); $shop = (int)$this->app->Secure->GetPOST('shop'); $land = $this->app->Secure->GetPOST('land'); $sprache = $this->app->Secure->GetPOST('sprache'); $projekt = explode(' ',$this->app->Secure->GetPOST('projekt')); $projekt = reset($projekt); $projekt = $this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung = '$projekt' AND abkuerzung <> '' AND ifnull(geloescht,0) = 0 LIMIT 1"); /*$aktiv = $this->app->Secure->GetPOST('aktiv'); if($aktiv!="1") { $aktiv=0; }*/ $aktiv = 1; if ($shop) { $this->app->DB->Insert("INSERT INTO shopexport_sprachen (id,shop,land,projekt, aktiv, sprache) VALUES ('','$shop','$land','$projekt','$aktiv','$sprache')"); $insid = $this->app->DB->GetInsertID(); $bearbeiter = $this->app->DB->real_escape_string($this->app->User->GetName()); $this->app->DB->Update("UPDATE shopexport_sprachen SET updatedby = '$bearbeiter' WHERE id = '$insid' LIMIT 1"); } echo json_encode(array( 'status' => 1, 'statusText' => 'Gespeichert.' )); $this->app->ExitXentral(); } public function ShopexportZahlweisesave() { $id = (int)$this->app->Secure->GetGET('id'); $shop = (int)$this->app->Secure->GetPOST('shop'); $zahlweise_shop = $this->app->Secure->GetPOST('zahlweise_shop'); $zahlweise_wawision = $this->app->Secure->GetPOST('zahlweise_wawision'); $vorabbezahltmarkieren = $this->app->Secure->GetPOST('vorabbezahltmarkieren'); $autoversand = $this->app->Secure->GetPOST('autoversand'); $keinerechnung = $this->app->Secure->GetPOST('keinerechnung'); $fastlane = (int)$this->app->Secure->GetPOST('fastlane'); if($keinerechnung!="1") { $keinerechnung=0; } if($vorabbezahltmarkieren!="1") { $vorabbezahltmarkieren=0; } if($autoversand!="1") { $autoversand=0; } if($fastlane!==1) { $fastlane=0; } $aktiv = 1; if ($shop) { $this->app->DB->Insert("INSERT INTO shopexport_zahlweisen (id,shop,zahlweise_shop,zahlweise_wawision,vorabbezahltmarkieren,aktiv,autoversand,keinerechnung,fastlane) VALUES ('','$shop','$zahlweise_shop','$zahlweise_wawision','$vorabbezahltmarkieren','$aktiv','$autoversand','$keinerechnung',$fastlane)"); $insid = $this->app->DB->GetInsertID(); $bearbeiter = $this->app->DB->real_escape_string($this->app->User->GetName()); $this->app->DB->Update("UPDATE shopexport_zahlweisen SET updatedby = '$bearbeiter' WHERE id = '$insid' LIMIT 1"); } echo json_encode(array( 'status' => 1, 'statusText' => 'Gespeichert.' )); $this->app->ExitXentral(); } public function ShopexportSubshopsave() { $id = (int)$this->app->Secure->GetPOST('id'); $shop = (int)$this->app->Secure->GetPOST('shop'); $subshopkennung = $this->app->Secure->GetPOST('subshopkennung'); $projekt = $this->app->Secure->GetPOST('projekt'); $sprache = $this->app->Secure->GetPOST('sprache'); $aktiv = 1; $projekt = $this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung='$projekt' AND abkuerzung!='' LIMIT 1"); if ($shop && $subshopkennung && $projekt) { $this->app->DB->Insert("INSERT INTO shopexport_subshop (id,shop,subshopkennung,projekt,sprache, aktiv) VALUES ('','$shop','$subshopkennung','$projekt','$sprache','$aktiv')"); $insid = $this->app->DB->GetInsertID(); $bearbeiter = $this->app->DB->real_escape_string($this->app->User->GetName()); $this->app->DB->Update("UPDATE shopexport_subshop SET updatedby = '$bearbeiter' WHERE id = '$insid' LIMIT 1"); echo json_encode(array( 'status' => 1, 'statusText' => 'Gespeichert.' )); } else { echo json_encode(array( 'status' => 0, 'statusText' => 'Bitte alle Felder eingeben' )); } $this->app->ExitXentral(); } public function ShopexportFreifeldsave() { $id = (int)$this->app->Secure->GetPOST('id'); $shop = (int)$this->app->Secure->GetPOST('shop'); $freifeld_shop = $this->app->Secure->GetPOST('freifeld_shop'); $freifeld_wawi = $this->app->Secure->GetPOST('freifeld_wawi'); $aktiv = 1; if ($shop && $freifeld_shop) { $this->app->DB->Insert("INSERT INTO shopexport_freifelder (id,shop,freifeld_shop,freifeld_wawi,aktiv) VALUES ('','$shop','$freifeld_shop','$freifeld_wawi','$aktiv')"); $insid = $this->app->DB->GetInsertID(); $bearbeiter = $this->app->DB->real_escape_string($this->app->User->GetName()); $this->app->DB->Update("UPDATE shopexport_freifelder SET updatedby = '$bearbeiter' WHERE id = '$insid' LIMIT 1"); echo json_encode(array( 'status' => 1, 'statusText' => 'Gespeichert.' )); } else { echo json_encode(array( 'status' => 0, 'statusText' => 'Bitte Freifeld eingeben' )); } $this->app->ExitXentral(); } /** * @throws Exception */ public function ShopexportArtikelbaumexport(){ $shopid = (int)$this->app->Secure->GetPOST('id'); if($this->app->DB->Select(sprintf("SELECT id FROM prozessstarter WHERE parameter = 'onlineshops_tasks' AND aktiv = 1 LIMIT 1"))){ $command = 'sendartikelbaum'; $task = $this->app->DB->SelectRow('SELECT * FROM onlineshops_tasks WHERE shop_id=\'' . $shopid . '\' AND command=\'' . $command . '\''); if(!empty($task['id'])){ if($task['status'] !== 'running'){ $this->app->DB->Update('UPDATE onlineshop_tasks SET status=\'inactive\',counter=0 WHERE id=' . $task['id']); } } else{ $this->app->DB->Insert('INSERT INTO onlineshops_tasks (shop_id, command) VALUES (' . $shopid . ',\'' . $command . '\')'); } echo json_encode( array( 'status' => 1, 'statusText' => 'Aufgabe wurde zu Shoptasks hinzugefügt und wird im Hintergrund ausgeführt.' )); $this->app->ExitXentral(); } $shopinfo = $this->app->DB->SelectRow("SELECT * FROM shopexport WHERE id ='$shopid'"); if($shopinfo['shoptyp'] === 'intern' && $this->app->erp->ModulVorhanden($shopinfo['modulename'])){ $obj = $this->app->erp->LoadModul($shopinfo['modulename']); if($obj->canExportArticleTree()){ $kategorienbaum = null; $this->app->erp->GetKategorienbaum($kategorienbaum, 0, 0, $shopid); $this->app->remote->RemoteCommand($shopid, 'sendartikelbaum', $kategorienbaum); } } echo json_encode(array( 'status' => 1, 'statusText' => 'Übertragung abgeschlossen.' )); $this->app->ExitXentral(); } public function ShopexportZahlweiseeditsave() { $id = (int)$this->app->Secure->GetPOST('id'); $zahlweise_shop = $this->app->Secure->GetPOST('zahlweise_shop'); $zahlweise_wawision = $this->app->Secure->GetPOST('zahlweise_wawision'); $vorabbezahltmarkieren = $this->app->Secure->GetPOST('vorabbezahltmarkieren'); $autoversand = $this->app->Secure->GetPOST('autoversand'); $aktiv = $this->app->Secure->GetPOST('aktiv'); $keinerechnung = $this->app->Secure->GetPOST('keinerechnung'); $fastlane = (int)$this->app->Secure->GetPOST('fastlane'); if($vorabbezahltmarkieren!="1") { $vorabbezahltmarkieren=0; } if($keinerechnung!="1") { $keinerechnung=0; } if($autoversand!="1") { $autoversand=0; } if($aktiv!="1") { $aktiv=0; } if($fastlane!==1) { $fastlane=0; } if ($id) { $this->app->DB->Update("UPDATE shopexport_zahlweisen SET keinerechnung = '$keinerechnung', zahlweise_shop='$zahlweise_shop',zahlweise_wawision='$zahlweise_wawision',vorabbezahltmarkieren='$vorabbezahltmarkieren',autoversand='$autoversand',aktiv='$aktiv',fastlane = $fastlane WHERE id = '$id'"); $bearbeiter = $this->app->DB->real_escape_string($this->app->User->GetName()); $this->app->DB->Update("UPDATE shopexport_zahlweisen SET updatedby = '$bearbeiter', updated = now() WHERE id = '$id'"); } echo json_encode(array( 'status' => 1, 'statusText' => 'Gespeichert.' )); $this->app->ExitXentral(); } public function ShopexportSprachenget() { $id = $this->app->Secure->GetPOST('id'); $row = $this->app->DB->SelectRow(' SELECT s.id, s.sprache, s.land, s.aktiv, p.abkuerzung as projekt FROM shopexport_sprachen s LEFT JOIN projekt p ON s.projekt = p.id WHERE s.id = "' . $id . '" '); echo json_encode($row); $this->app->ExitXentral(); } public function ShopexportZahlweiseget() { $id = $this->app->Secure->GetPOST('id'); $row = $this->app->DB->SelectRow(' SELECT id, zahlweise_shop, zahlweise_wawision, vorabbezahltmarkieren, autoversand, aktiv, keinerechnung, fastlane FROM shopexport_zahlweisen WHERE id = "' . $id . '" '); echo json_encode($row); $this->app->ExitXentral(); } public function ShopexportZahlweisedelete() { $id = (int)$this->app->Secure->GetGET("id"); $sid = $this->app->DB->Select("SELECT shop FROM shopexport_zahlweisen WHERE id='$id' LIMIT 1"); if($id > 0) { $this->app->DB->Delete("DELETE FROM shopexport_zahlweisen WHERE id='$id' LIMIT 1"); $msg = $this->app->erp->base64_url_encode("
Der Eintrag wurde entfernt!
"); $this->app->Location->execute("index.php?module=onlineshops&action=edit&id=$sid&msg=$msg#tabs-3"); } } public function ShopexportVersandartsave() { $id = (int)$this->app->Secure->GetGET('id'); $shop = (int)$this->app->Secure->GetPOST('shop'); $versandart_shop = $this->app->Secure->GetPOST('versandart_shop'); $versandart_wawision = $this->app->Secure->GetPOST('versandart_wawision'); $versandart_ausgehend = $this->app->Secure->GetPOST('versandart_ausgehend'); $produkt_ausgehend = $this->app->Secure->GetPOST('produkt_ausgehend'); $land = $this->app->Secure->GetPOST('land'); $autoversand = $this->app->Secure->GetPOST('autoversand'); $fastlane = (int)$this->app->Secure->GetPOST('fastlane'); if($fastlane !== 1) { $fastlane = 0; } if($autoversand!="1") $autoversand=0; $aktiv = 1; if ($shop) { $this->app->DB->Update("INSERT INTO shopexport_versandarten (id,shop,versandart_shop,versandart_wawision,produkt_ausgehend,versandart_ausgehend,aktiv,autoversand,land,fastlane) VALUES ('','$shop','$versandart_shop','$versandart_wawision','{$produkt_ausgehend}','$versandart_ausgehend','$aktiv','$autoversand','$land',$fastlane)"); } echo json_encode(array( 'status' => 1, 'statusText' => 'Gespeichert.' )); $this->app->ExitXentral(); } public function ShopexportSpracheneditsave() { $id = (int)$this->app->Secure->GetPOST('id'); $sprache = $this->app->Secure->GetPOST('sprache'); $land = $this->app->Secure->GetPOST('land'); $projekt = explode (' ',$this->app->Secure->GetPOST('projekt')); $projekt = reset($projekt); if($projekt) { $projekt = $this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung = '$projekt' AND abkuerzung <> '' AND geloescht = 0 LIMIT 1"); } $aktiv = $this->app->Secure->GetPOST('aktiv'); if($aktiv!="1") { $aktiv=0; } if ($id) { $this->app->DB->Update("UPDATE shopexport_sprachen SET land='$land',sprache='$sprache',projekt='$projekt',land='$land', aktiv='$aktiv' WHERE id = '$id'"); $bearbeiter = $this->app->DB->real_escape_string($this->app->User->GetName()); $this->app->DB->Update("UPDATE shopexport_sprachen SET updatedby = '$bearbeiter', updated = now() WHERE id = '$id'"); } echo json_encode(array( 'status' => 1, 'statusText' => 'Gespeichert.' )); $this->app->ExitXentral(); } public function ShopexportVersandarteditsave() { $id = (int)$this->app->Secure->GetPOST('id'); $versandart_shop = $this->app->Secure->GetPOST('versandart_shop'); $versandart_wawision = $this->app->Secure->GetPOST('versandart_wawision'); $versandart_ausgehend = $this->app->Secure->GetPOST('versandart_ausgehend'); $produkt_ausgehend = $this->app->Secure->GetPOST('produkt_ausgehend'); $autoversand = $this->app->Secure->GetPOST('autoversand'); $land = $this->app->Secure->GetPOST('land'); $aktiv = $this->app->Secure->GetPOST('aktiv'); $fastlane = (int)$this->app->Secure->GetPOST('fastlane'); if($fastlane !== 1) { $fastlane = 0; } if($aktiv!='1') { $aktiv=0; } if ($id) { $this->app->DB->Update("UPDATE shopexport_versandarten SET versandart_shop='$versandart_shop',versandart_wawision='$versandart_wawision',versandart_ausgehend='$versandart_ausgehend',produkt_ausgehend='$produkt_ausgehend',autoversand='$autoversand',land='$land', aktiv='$aktiv',fastlane= $fastlane WHERE id = '$id'"); $bearbeiter = $this->app->DB->real_escape_string($this->app->User->GetName()); $this->app->DB->Update("UPDATE shopexport_versandarten SET updatedby = '$bearbeiter', updated = now() WHERE id = '$id'"); } echo json_encode(array( 'status' => 1, 'statusText' => 'Gespeichert.' )); $this->app->ExitXentral(); } public function ShopexportSubshopeditsave() { $id = (int)$this->app->Secure->GetPOST('id'); $subshopkennung = $this->app->Secure->GetPOST('subshopkennung'); $projekt = $this->app->Secure->GetPOST('projekt'); $aktiv = $this->app->Secure->GetPOST('aktiv'); $sprache = $this->app->Secure->GetPOST('sprache'); if($aktiv!='1') { $aktiv=0; } $projekt = $this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung='$projekt' AND abkuerzung!='' LIMIT 1"); if ($id && $projekt > 0) { $this->app->DB->Update("UPDATE shopexport_subshop SET subshopkennung='$subshopkennung',projekt='$projekt',sprache = '$sprache', aktiv='$aktiv' WHERE id = '$id'"); $bearbeiter = $this->app->DB->real_escape_string($this->app->User->GetName()); $this->app->DB->Update("UPDATE shopexport_subshop SET updatedby = '$bearbeiter', updated = now() WHERE id = '$id'"); echo json_encode(array( 'status' => 1, 'statusText' => 'Gespeichert.' )); } else { echo json_encode(array( 'status' => 0, 'statusText' => 'Projekt nicht vorhanden' )); } $this->app->ExitXentral(); } public function ShopexportFreifeldereditsave() { $id = (int)$this->app->Secure->GetPOST('id'); $freifeld_shop = $this->app->Secure->GetPOST('freifeld_shop'); $freifeld_wawi = $this->app->Secure->GetPOST('freifeld_wawi'); $aktiv = $this->app->Secure->GetPOST('aktiv'); if($aktiv!='1') { $aktiv=0; } if ($id) { $this->app->DB->Update("UPDATE shopexport_freifelder SET freifeld_wawi='$freifeld_wawi',freifeld_shop='$freifeld_shop', aktiv='$aktiv' WHERE id = '$id'"); $bearbeiter = $this->app->DB->real_escape_string($this->app->User->GetName()); $this->app->DB->Update("UPDATE shopexport_freifelder SET updatedby = '$bearbeiter', updated = now() WHERE id = '$id'"); } echo json_encode(array( 'status' => 1, 'statusText' => 'Gespeichert.' )); $this->app->ExitXentral(); } public function ShopexportVersandartget() { $id = $this->app->Secure->GetPOST('id'); $row = $this->app->DB->SelectRow(' SELECT id, versandart_shop, versandart_wawision, produkt_ausgehend, versandart_ausgehend, autoversand, land, aktiv, fastlane FROM shopexport_versandarten WHERE id = "' . $id . '" '); echo json_encode($row); $this->app->ExitXentral(); } public function ShopexportKundengruppenget() { $id = $this->app->Secure->GetPOST('id'); $row = $this->app->DB->SelectRow("SELECT s.id, s.gruppeid, s.extgruppename, s.aktiv, s.apply_to_new_customers AS neukundengruppezuweisen, s.type, IF(s.projekt=0,'',p.abkuerzung) AS projekt, s.shopid FROM shopexport_kundengruppen s LEFT JOIN projekt p ON s.projekt = p.id WHERE s.id='$id'"); echo json_encode($row); $this->app->ExitXentral(); } public function ShopexportSubshopget() { $id = $this->app->Secure->GetPOST('id'); $row = $this->app->DB->SelectRow(' SELECT s.id, s.subshopkennung, p.abkuerzung as projekt, s.sprache, s.aktiv FROM shopexport_subshop s LEFT JOIN projekt p ON p.id=s.projekt WHERE s.id = "' . $id . '" '); echo json_encode($row); $this->app->ExitXentral(); } public function ShopexportFreifeldget() { $id = $this->app->Secure->GetPOST('id'); $row = $this->app->DB->SelectRow(' SELECT id, freifeld_shop, freifeld_wawi, aktiv FROM shopexport_freifelder WHERE id = "' . $id . '" '); echo json_encode($row); $this->app->ExitXentral(); } public function ShopexportVersandartdelete() { $id = (int)$this->app->Secure->GetGET('id'); $sid = $this->app->DB->Select("SELECT shop FROM shopexport_versandarten WHERE id='$id' LIMIT 1"); if($id > 0) { $this->app->DB->Delete("DELETE FROM shopexport_versandarten WHERE id='$id' LIMIT 1"); $msg = $this->app->erp->base64_url_encode("
Der Eintrag wurde entfernt!
"); $this->app->Location->execute("index.php?module=onlineshops&action=edit&id=$sid&msg=$msg#tabs-4"); } } public function ShopexportKundengruppendelete() { $id = (int)$this->app->Secure->GetGET('id'); $sid = $this->app->DB->Select("SELECT shopid FROM shopexport_kundengruppen WHERE id='$id' LIMIT 1"); if($id > 0 ) { $this->app->DB->Delete("DELETE FROM shopexport_kundengruppen WHERE id='$id' LIMIT 1"); $msg = $this->app->erp->base64_url_encode("
Der Eintrag wurde entfernt!
"); $this->app->Location->execute("index.php?module=onlineshops&action=edit&id=$sid&msg=$msg#tabs-8"); } } public function ShopexportSprachendelete() { $id = (int)$this->app->Secure->GetGET('id'); $sid = $this->app->DB->Select("SELECT shop FROM shopexport_sprachen WHERE id='$id' LIMIT 1"); if($id > 0) { $this->app->DB->Delete("DELETE FROM shopexport_sprachen WHERE id='$id' LIMIT 1"); $msg = $this->app->erp->base64_url_encode("
Der Eintrag wurde entfernt!
"); $this->app->Location->execute("index.php?module=onlineshops&action=edit&id=$sid&msg=$msg#tabs-7"); } } public function ShopexportSubshopdelete() { $id = (int)$this->app->Secure->GetGET('id'); $sid = $this->app->DB->Select("SELECT shop FROM shopexport_subshop WHERE id='$id' LIMIT 1"); if($id > 0) { $this->app->DB->Delete("DELETE FROM shopexport_subshop WHERE id='$id' LIMIT 1"); $msg = $this->app->erp->base64_url_encode("
Der Eintrag wurde entfernt!
"); $this->app->Location->execute("index.php?module=onlineshops&action=edit&id=$sid&msg=$msg#tabs-6"); } } public function ShopexportFreifelddelete() { $id = (int)$this->app->Secure->GetGET('id'); $sid = $this->app->DB->Select("SELECT shop FROM shopexport_freifelder WHERE id='$id' LIMIT 1"); if($id > 0) { $this->app->DB->Delete("DELETE FROM shopexport_freifelder WHERE id='$id' LIMIT 1"); $msg = $this->app->erp->base64_url_encode("
Der Eintrag wurde entfernt!
"); $this->app->Location->execute("index.php?module=onlineshops&action=edit&id=$sid&msg=$msg#tabs-5"); } } protected function match($haystack, $needle) { $needle = strtolower($this->app->erp->UmlauteEntfernen($needle)); $haystack = strtolower($this->app->erp->UmlauteEntfernen($haystack)); $needlaa = explode(' ',$needle); foreach($needlaa as $v) { if($v &&strpos($haystack, $v) === false) { return false; } } return true; } public function getApps($val = '') { $val = (String)$val; $module = $this->app->erp->getApps(); if($module) { if(isset($module['installiert'])) { foreach($module['installiert'] as $k => $v) { $module['installiert'][$k]['match'] = $this->match($v['Bezeichnung'], $val); $module['installiert'][$k]['md5'] = md5($v['Bezeichnung']); } } if(isset($module['kauf'])) { foreach($module['kauf'] as $k => $v) { $module['kauf'][$k]['match'] = $this->match($v['Bezeichnung'], $val); $module['kauf'][$k]['md5'] = md5($v['Bezeichnung']); } } } return $module; } /** * @param int $shopId * * @return int|null */ public function createShippingArticleByShopId($shopId): ?int { $shop = $this->app->DB->SelectRow( sprintf( "SELECT `s`.`projekt`, `art`.`id` FROM `shopexport` AS `s` LEFT JOIN `artikel` AS `art` ON `s`.`artikelporto` = art.id AND (`art`.`geloescht` = 0 OR `art`.`geloescht` IS NULL) AND (`art`.`intern_gesperrt` = 0 OR `art`.`intern_gesperrt` IS NULL) WHERE `s`.`id` = %d ", $shopId ) ); if (empty($shop) || !empty($shop['id'])) { return null; } $firstShippingArticle = $this->app->DB->SelectRow( 'SELECT `art`.`id` FROM `artikel` AS `art` LEFT JOIN `projekt` AS `p` ON `art`.projekt = p.id WHERE `art`.`porto` = 1 AND (`art`.`geloescht` IS NOT NULL OR `art`.geloescht = 0) AND (`art`.`intern_gesperrt` = 0 OR `art`.`intern_gesperrt` IS NULL) AND (`p`.`id` IS NULL OR p.`oeffentlich` = 1) ' ); if (!empty($firstShippingArticle)) { $this->app->DB->Update( sprintf('UPDATE `shopexport` SET `artikelporto` = %d WHERE `id` = %d ', (int)$firstShippingArticle['id'], $shopId ) ); return (int)$firstShippingArticle['id']; } $shippingArticle = ['projekt' => $shop['projekt'], 'name_de' => 'Porto', 'proto' => 1]; $shippingArticle['nummer'] = $this->app->erp->GetNextArtikelnummer('', '1', $shop['projekt']); $shippingArticleId = (int)$this->app->erp->InsertUpdateArtikel($shippingArticle); if ($shippingArticleId <= 0) { return null; } $this->app->DB->Update( sprintf( 'UPDATE `shopexport` SET `artikelporto` = %d WHERE `id` = %d ', $shippingArticleId, $shopId ) ); return $shippingArticleId; } /** * @param int $shopId * * @return int|null */ public function createDiscountArticleForShop($shopId): ?int { $shop = $this->app->DB->SelectRow( sprintf( 'SELECT `s`.`projekt`, `art`.`id` FROM `shopexport` AS `s` LEFT JOIN `artikel` AS `art` ON `s`.`artikelrabatt` = art.id AND (`art`.`geloescht` = 0 OR `art`.`geloescht` IS NULL) AND (`art`.`intern_gesperrt` = 0 OR `art`.`intern_gesperrt` IS NULL) WHERE `s`.`id` = %d', $shopId ) ); if (empty($shop) || !empty($shop['id'])) { return null; } $discountArticle = [ 'projekt' => $shop['projekt'], 'name_de' => 'Rabatt', 'name_en' => 'Discount', 'lagerartikel' => 0, ]; $discountArticle['nummer'] = $this->app->erp->GetNextArtikelnummer('', '1', $shop['projekt']); $discountArticleId = (int)$this->app->erp->InsertUpdateArtikel($discountArticle); if ($discountArticleId <= 0) { return null; } $this->app->DB->Update( sprintf( 'UPDATE `shopexport` SET `artikelrabatt` = %d WHERE `id` = %d ', $discountArticleId, $shopId ) ); return $discountArticleId; } /** * @param string $auswahlmodul * * @return array */ public function createInternShop($auswahlmodul) { if($fehler = $this->app->erp->OnlineshopsLizenzFehler($auswahlmodul)) { return ['success'=>false,'error'=>$fehler['Error']]; } $bezeichnung = ucfirst(str_replace('shopimporter_','',$auswahlmodul)); $i = 1; while($this->app->DB->Select("SELECT id FROM shopexport WHERE bezeichnung = '$bezeichnung' LIMIT 1")) { $i++; $bezeichnung = ucfirst(str_replace('shopimporter_','',$auswahlmodul)).' '.$i; } $this->app->DB->Insert( sprintf( "INSERT INTO `shopexport` (`shoptyp`, `modulename`,`artikelimport`,`demomodus`,`bezeichnung`,`artikeltexteuebernehmen`, `versandartenmapping`, `zahlungsweisenmapping`,`lagerexport`,`artikelexport`,`datumvon`,`auftragabgleich`,`portoartikelanlegen`, `steuerfreilieferlandexport`,`multiprojekt`,`direktimport`,`rabatteportofestschreiben`) VALUES ('intern','%s',1,1,'%s',1,1,1,0,0,now(),1,1,1,1,1,1)", $auswahlmodul, $bezeichnung ) ); $id = $this->app->DB->GetInsertID(); $obj = $this->app->erp->LoadModul($auswahlmodul); if($obj && method_exists($obj, 'EinstellungenStruktur')) { $struktur = $obj->EinstellungenStruktur(); if(isset($struktur['defaultoncreate']) && is_array($struktur['defaultoncreate'])) { $this->app->DB->UpdateArr('shopexport',$id,'id',$struktur['defaultoncreate'],true); } } $this->app->erp->InstallModul($auswahlmodul); $this->app->erp->RunHook('shopexport_create', 1, $id); return ['id'=>$id]; } /** * @param int $shopId * @param null|array $post */ public function saveCreateData($shopId, $post = null) { $shop = $this->app->DB->SelectRow( sprintf('SELECT * FROM `shopexport` WHERE `id` = %d', $shopId) ); $obj = $this->app->loadModule($shop['modulename']); if($obj === null) { return; } $form = $obj->getCreateForm(); $data = json_decode($shop['einstellungen_json'], true); if(empty($data) || !is_array($data)) { $data = ['felder'=>[]]; } if(empty($data['felder']) || !is_array($data['felder'])) { $data['felder'] = []; } if($post === null) { foreach($form as $row) { if(empty($row['inputs'])) { continue; } foreach($row['inputs'] as $input) { if(!empty($input['name'])){ $post[$input['name']] = !isset($this->app->Secure->POST[$input['name']]) ?null:$this->app->Secure->POST[$input['name']]; } } } } if(empty($post)) { return; } foreach($post as $key => $value) { $data['felder'][$key] = $value; } $this->app->DB->Update( sprintf( "UPDATE `shopexport` SET `einstellungen_json` = '%s' WHERE `id` = %d", $this->app->DB->real_escape_string(json_encode($data)), $shopId ) ); } /** * @var int ShopId * * @return JsonResponse */ public function getVueShopexportSuccessPage($shopId) { $succespage = [ 'type' => 'defaultPage', 'icon' => 'add-person-icon', 'headline'=> 'Shop angelegt', 'subHeadline'=> 'Der Shop wurde angelegt', 'ctaButtons' => [ [ 'title' => 'Klasse', 'action' => 'close', 'link' => 'index.php?module=onlineshops&action=edit&id='.$shopId ] ] ]; return new JsonResponse( ['page'=>$succespage] ); } /** * @param $shopId * @param $data * * @return JsonResponse */ public function getVueShopexportAppNewSuccessPageYt($shopId, $data): JsonResponse { $youtubeLink = 'https://www.youtube.com/embed/49PICIq3XP8'; $shopType = $this->app->DB->Select( sprintf( 'SELECT `modulename` FROM `shopexport` WHERE `id` = %d', $shopId ) ); if(!empty($shopType) && ($shopModule = $this->app->loadModule($shopType)) !== null && method_exists($shopModule, 'getYoutubeLink') ) { $youtubeLink = $shopModule->getYoutubeLink(); } $buttons = []; $data = json_decode($data, true); if(!empty($data['url'])) { $buttons[] = [ 'title' => 'Zum Shop', 'action' => 'close', 'link' => $data['url'], ]; } $buttons[] = [ 'title' => 'In Xentral bleiben', 'action' => 'close', 'link' => 'index.php?module=onlineshops&action=edit&id='.$shopId, ]; $succespage = [ 'type' => 'defaultPage', 'icon' => 'add-person-icon', 'headline'=> 'Shop wurde verknüpft', 'subHeadline'=> '', 'headerMedia' => [ 'type' => 'video', 'link' => $youtubeLink ], 'ctaButtons' => $buttons, ]; return new JsonResponse( [ 'page'=>$succespage, ] ); } /** * @var int $shopId * * @return JsonResponse */ public function getVueShopexportAppNewSuccessPage($shopId, $data): JsonResponse { $succespage = [ 'type' => 'form', 'submitType' => 'submit', 'icon' => 'add-person-icon', 'headline'=> 'Shop wurde verknüpft', 'submitUrl' => 'index.php?module=onlineshops&action=appnew&cmd=createdata', 'form' => [ 'id' => 0, 'name' => 'createPriceGroupHead', 'inputs' => [], ], 'subHeadline'=> '', 'ctaButtons' => [ [ 'title' => 'Weiter', 'type' => 'submit', 'action' => 'submit', ] ] ]; return new JsonResponse( [ 'page'=>$succespage, 'dataRequiredForSubmit' => [ 'step' => 2, 'shopId' => $shopId, 'data' => $data, ] ] ); } /** * @return array[] */ public function getPriceGroupForm(): array { $ret = [ [ 'id' => 0, 'name' => 'createPriceGroupHead', 'inputs' => [ [ 'label' => 'Neue Preisgruppe erstellen', 'type' => 'checkbox', 'name' => 'createPriceGroup', 'validation' => false, ], ], ], [ 'id' => 1, 'name' => 'usePriceGroupHead', 'inputs' => [ [ 'label' => 'Bestehende Preisgruppe verwenden', 'type' => 'select', 'name' => 'usePriceGroup', 'validation' => false, 'options' => $this->getVuePriceGroups(), ] ], ] ]; return $ret; } /** * @return array */ public function getVuePriceGroups(): array { $priceGroups = array_merge( [''=>''], $this->app->DB->SelectPairs( sprintf( "SELECT g.kennziffer, g.name FROM `gruppen` AS `g` WHERE g.aktiv = 1 AND g.art = 'preisgruppe' %s ORDER BY g.name", $this->app->erp->ProjektRechte('g.projekt') ) ) ); return $this->convertArrayToVueOptions($priceGroups); } /** * @param array $array * * @return array */ public function convertArrayToVueOptions($array) { if(empty($array) || !is_array($array)) { return []; } $ret = []; foreach($array as $value => $text) { $ret[] = [ 'value' => $value, 'text' => $text, ]; } return $ret; } /** * @var null|array $options * * @return array[] */ public function getFeatureForm($options = null): array { $ret = []; if(!empty($options['canExportArticle'])) { $ret[] = [ 'id' => 0, 'name' => 'exportArticlesGroup', 'inputs' => [ [ 'label' => 'Artikel übertragen', 'type' => 'checkbox', 'name' => 'export_articles', 'validation' => false, ], ], ]; } if(!empty($options['canSyncArticles'])) { $ret[] = [ 'id' => 1, 'name' => 'syncArticlesGroup', 'inputs' => [ [ 'label' => 'Lagerbestände synchronisieren', 'type' => 'checkbox', 'name' => 'sync_articles', 'validation' => false, ], ], ]; } $ret[] = [ 'id' => 2, 'name' => 'autoOrderGroup', 'inputs' => [ [ 'label' => 'Neue Aufträge automatisch abholen', 'type' => 'checkbox', 'name' => 'auto_order', 'validation' => false, ], ], ]; return $ret; } /** * @var string $moduleName * @var string $shopName * @var null|array $requiredForSubmit * @var null|array $options * * @return JsonResponse */ public function getPriceGroupPage($moduleName, $shopName, $requiredForSubmit = null, $options = null) { if($requiredForSubmit === null) { $requiredForSubmit = $this->app->Secure->POST; $requiredForSubmit['step'] = 10; } $page = [ 'type' => 'form', 'submitType' => 'submit', 'icon'=> 'password-icon', 'headline' => $shopName, 'subHeadline' => sprintf('Möchtest Du eine Preisgruppe für %s verwenden?', $shopName), 'submitUrl' => 'index.php?module=onlineshops&action=create&cmd=saveassistent&shopmodule='.$moduleName, 'form' => $this->getPriceGroupForm(), 'ctaButtons' => [ [ 'title' => 'Weiter', 'type' => 'submit', 'action' => 'submit', ], ] ]; return new JsonResponse( [ 'page' => $page, 'dataRequiredForSubmit' => $requiredForSubmit, ] ); } /** * @var string $moduleName * @var string $shopName * @var null|array $requiredForSubmit * @var null|array $options * * @return JsonResponse */ public function getStep2Page($moduleName, $shopName, $requiredForSubmit = null, $options = null) { if($requiredForSubmit === null) { $requiredForSubmit = $this->app->Secure->POST; $requiredForSubmit['step'] = 2; } $page = [ 'type' => 'form', 'submitType' => 'submit', 'icon'=> 'password-icon', 'headline' => $shopName, 'subHeadline' => 'Welche Features möchtest du nutzen?', 'submitUrl' => 'index.php?module=onlineshops&action=create&cmd=saveassistent&shopmodule='.$moduleName, 'form' => $this->getFeatureForm($options), 'ctaButtons' => [ [ 'title' => 'Weiter', 'type' => 'submit', 'action' => 'submit', ], ] ]; return new JsonResponse( [ 'page' => $page, 'dataRequiredForSubmit' => $requiredForSubmit, ] ); } /** * @param string $moduleName * @param string $shopName * @param null|array $requiredForSubmit * @param null|array $options * * @return JsonResponse */ public function getExportArticlePage($moduleName, $shopName, $requiredForSubmit = null, $options = null) { if($requiredForSubmit === null) { $requiredForSubmit = $this->app->Secure->POST; $requiredForSubmit['step'] = 3; } $capabilites = ShopimporterBase::shopCapabilities(); $capabilites = empty($capabilites[$moduleName])?[]:$capabilites[$moduleName]; $pictures = !empty($capabilites['bilder']) && $capabilites['bilder']['createarticle'] === ShopimporterBase::CAN; $attributes = !empty($capabilites['eigenschaften']) && $capabilites['eigenschaften']['createarticle'] === ShopimporterBase::CAN; $categories= !empty($capabilites['kategorie']) && $capabilites['kategorie']['createarticle'] === ShopimporterBase::CAN; $variants = !empty($capabilites['varianten']) && $capabilites['varianten']['createarticle'] === ShopimporterBase::CAN; $crossselling = !empty($capabilites['crossselling']) && $capabilites['crossselling']['createarticle'] === ShopimporterBase::CAN; $bulkPrices = !empty($capabilites['staffelpreise']) && $capabilites['staffelpreise']['createarticle'] === ShopimporterBase::CAN; $exportOptions = [ [ 'text' => '', 'value' => '', ] ]; if(!empty($options['canExportArticle'])){ $exportOptions[] = [ 'text' => 'xentral zum Shop', 'value' => 'x2s', ]; } if(!empty($options['canImportArticle'])) { $exportOptions[] = [ 'text' => 'Shop zu xentral', 'value' => 's2x', ]; } $forms = [ [ 'id' => 0, 'name' => 'exportFromGroup', 'inputs' => [ [ 'label' => 'Richtung', 'type' => 'select', 'name' => 'exportFrom', 'validation' => false, 'options' => $exportOptions, ], ], ], ]; if($pictures) { $forms[] = [ 'id' => 1, 'name' => 'syncPicturesGroup', 'inputs' => [ [ 'label' => 'Bilder mit übertragen', 'type' => 'checkbox', 'name' => 'sync_picture', 'validation' => false, ], ], ]; } if($attributes) { $forms[] = [ 'id' => 2, 'name' => 'syncAttributesGroup', 'inputs' => [ [ 'label' => 'Eigenschaften mit übertragen', 'type' => 'checkbox', 'name' => 'sync_attributes', 'validation' => false, ], ], ]; } if($categories) { $forms[] = [ 'id' => 3, 'name' => 'syncCategoriesGroup', 'inputs' => [ [ 'label' => 'Kategorien mit übertragen', 'type' => 'checkbox', 'name' => 'sync_categories', 'validation' => false, ], ], ]; } if($variants) { $forms[] = [ 'id' => 4, 'name' => 'syncVariantsGroup', 'inputs' => [ [ 'label' => 'Varianten mit übertragen', 'type' => 'checkbox', 'name' => 'sync_variants', 'validation' => false, ], ], ]; } if($crossselling) { $forms[] = [ 'id' => 5, 'name' => 'syncCrosssellingGroup', 'inputs' => [ [ 'label' => 'Crossselling mit übertragen', 'type' => 'checkbox', 'name' => 'sync_crossselling', 'validation' => false, ], ], ]; } if($bulkPrices) { $forms[] = [ 'id' => 6, 'name' => 'syncBulkpricesGroup', 'inputs' => [ [ 'label' => 'Staffelpreise mit übertragen', 'type' => 'checkbox', 'name' => 'sync_bulkprices', 'validation' => false, ], ], ]; } $page = [ 'type' => 'form', 'submitType' => 'submit', 'icon'=> 'password-icon', 'headline' => $shopName, 'subHeadline' => 'Welche Artikeldaten sollen übertragen werden?', 'submitUrl' => 'index.php?module=onlineshops&action=create&cmd=saveassistent&shopmodule='.$moduleName, 'form' => $forms, 'ctaButtons' => [ [ 'title' => 'Weiter', 'type' => 'submit', 'action' => 'submit', ], ] ]; return new JsonResponse( [ 'page' => $page, 'dataRequiredForSubmit' => $requiredForSubmit, ] ); } /** * @param string $module * * @return JsonResponse */ public function getBoosterVue($module) { /** @var Appstore $appstore */ $appstore = $this->app->loadModule('appstore'); $moduleName = $appstore->getAppNameByKey($module); $shopModule = $this->app->loadModule($module); if($moduleName === null) { $moduleName = ucfirst(substr($module, 13)); } $headLine = $moduleName; $subHeadline = 'Bitte gehe auf '.$moduleName.' und verbinden Dich mit dienem Xentral'; if($shopModule !== null && method_exists($shopModule, 'getBoosterSubHeadline')) { $subHeadline = $shopModule->getBoosterSubHeadline(); } if($shopModule !== null && method_exists($shopModule, 'getBoosterHeadline')) { $headLine = $shopModule->getBoosterHeadline(); } $page = [ 'type' => 'defaultPage', 'icon'=> 'password-icon', 'headline' => $headLine, 'subHeadline' => $subHeadline, 'ctaButtons' => [ [ 'title' => 'OK', 'type' => 'close', 'action' => 'close', ], ] ]; $ret = [ 'pages'=> [ $page ], ]; return new JsonResponse($ret); } public function ShopexportCreate() { $cmd = $this->app->Secure->GetGET('cmd'); $auswahlmodul = (string)$this->app->Secure->GetPOST('auswahl'); if(empty($auswahlmodul)) { $auswahlmodul = (string)$this->app->Secure->GetGET('auswahl'); } if(empty($auswahlmodul)) { $auswahlmodul = (string)$this->app->Secure->GetPOST('shopmodule'); } if(strpos($auswahlmodul, 'shopimporter_') === 0 && substr($auswahlmodul, -7) === 'booster') { $module = substr($auswahlmodul, 0, -7); if($cmd === 'getassistant') { return $this->getBoosterVue($module); } $this->app->Location->execute('index.php?module=onlineshops&action=create&cmd='.$module.'&sid=booster'); } if(strpos($cmd, 'shopimporter_') === 0) { $sid = $this->app->Secure->GetGET('sid'); if($sid === 'booster') { $this->app->Tpl->Add( 'TAB1', '' ); } else{ /** @var ShopimporterBase $obj */ $obj = $this->app->loadModule($cmd); if($obj !== null && method_exists($obj, 'AuthByAssistent')){ $this->app->Tpl->Add( 'TAB1', '' ); } } } if($cmd === 'saveassistent') { $shopId = $this->app->Secure->GetPOST('id','','',true); $shopModule = $this->app->Secure->GetPOST('shopmodule'); $syncArticles = !empty($this->app->Secure->GetPOST('sync_articles')); $autoOrder = !empty($this->app->Secure->GetPOST('auto_order')); $syncPicture = !empty($this->app->Secure->GetPOST('sync_picture')); $syncCategories = !empty($this->app->Secure->GetPOST('sync_categories')); $syncAttributes = !empty($this->app->Secure->GetPOST('sync_attributes')); $syncVariants = !empty($this->app->Secure->GetPOST('sync_variants')); $syncCrossselling = !empty($this->app->Secure->GetPOST('sync_crossselling')); $syncBulkprices = !empty($this->app->Secure->GetPOST('sync_bulkprices')); $exportFrom = $this->app->Secure->GetPOST('exportFrom'); $step = (int)$this->app->Secure->GetPOST('step'); $exportArticles = !empty($this->app->Secure->GetPOST('export_articles')); $usePriceGroup = (string)$this->app->Secure->GetPOST('usePriceGroup'); $createPriceGroup = !empty($this->app->Secure->GetPOST('createPriceGroup')); if($shopId === 'NEW'){ $postData = $this->app->Secure->POST; /** @var ShopimporterBase $obj */ $obj = $this->app->loadModule($shopModule); $canImportArticle = false; if($obj !== null && method_exists($obj, 'AuthByAssistent')) { $json = $obj->AuthByAssistent(); if($json instanceof JsonResponse) { return $json; } if(method_exists($obj,'ImportGetArticleList')) { $canImportArticle = true; } } if($obj !== null && method_exists($obj, 'updatePostDataForAssistent')) { $postData = $obj->updatePostDataForAssistent($postData); } $options = [ 'canImportArticle' => $canImportArticle, 'canExportArticle' => true, 'canSyncArticles' => true, 'canExportPrice' => true, ]; if($obj !== null && method_exists($obj, 'getExportArticleOptions')) { $options = $obj->getExportArticleOptions($options); } if($step < 2) { $postData['step'] = 2; return $this->getStep2Page($shopModule, ucfirst(substr($shopModule, 13)), $postData, $options); } if($step === 2 && $exportArticles) { $postData['step'] = 3; return $this->getExportArticlePage( $shopModule, ucfirst(substr($shopModule, 13)), $postData, $options ); } if($step >= 2 && $step < 10 && !empty($options['canExportPrice'])) { $postData['step'] = 10; return $this->getPriceGroupPage($shopModule, ucfirst(substr($shopModule, 13)), $postData, $options); } $check = $this->createInternShop($shopModule); if(!empty($check['error'])){ $data = ['error' => $check['error']]; return new JsonResponse($data, JsonResponse::HTTP_BAD_REQUEST); } if(!empty($check['id'])){ $shopId = $check['id']; $this->createShippingArticleByShopId($shopId); $this->createDiscountArticleForShop($shopId); if(method_exists($obj, 'getStructureDataForClickByClickSave')) { $structureData = $obj->getStructureDataForClickByClickSave(); if(!empty($structureData)) { $this->saveCreateData($shopId, $structureData); } } if(method_exists($obj, 'afterCreateClickByClick')) { $obj->afterCreateClickByClick($shopId); } } } if($shopId > 0) { $this->saveCreateData($shopId); $shopArr = []; if($exportFrom === 'x2s') { $shopArr['autosendarticle'] = 1; $shopArr['artikelexport'] = 1; } if($syncPicture) { $shopArr['shopbilderuebertragen'] = 1; } if($syncCategories) { $shopArr['kategorienuebertragen'] = 1; } if($syncAttributes) { $shopArr['eigenschaftenuebertragen'] = 1; } if($syncVariants) { $shopArr['variantenuebertragen'] = 1; } if($syncCrossselling) { $shopArr['crosssellingartikeluebertragen'] = 1; } if($syncBulkprices) { $shopArr['staffelpreiseuebertragen'] = 1; } if($syncArticles) { $shopArr['lagerexport'] = 1; } if($autoOrder) { $shopArr['cronjobaktiv'] = 1; $shopArr['demomodus'] = 0; } if($obj !== null && method_exists($obj, 'updateShopexportArr')) { $shopArr = $obj->updateShopexportArr($shopArr, $postData); } if(empty($shopArr['preisgruppe'])){ if($usePriceGroup !== '') { $shopArr['preisgruppe'] = $this->getPriceGroupIdFromCode($usePriceGroup); } elseif($createPriceGroup){ $shopArr['preisgruppe'] = $this->createPriceGroupByShopId($shopId); } } if(!empty($shopArr)) { $this->app->DB->UpdateArr('shopexport', $shopId, 'id', $shopArr, true); } if($autoOrder && method_exists($obj, 'EinstellungenStruktur')) { $stucture = $obj->EinstellungenStruktur(); if(empty($stucture['ausblenden']) || !in_array('zeitraum',$stucture['ausblenden'])) { $shopArr = [ 'anzgleichzeitig' => 50, 'datumvon' => date('Y-m-d H:i:s'), ]; $this->app->DB->UpdateArr('shopexport', $shopId, 'id', $shopArr, true); } } if($exportFrom === 's2x') { $this->app->DB->Insert( sprintf( "INSERT INTO `onlineshops_tasks` (`shop_id`, `command`, `status`, `counter`, `created`, `lastupdate`) VALUES (%d, 'GetArticleList', 'created', 0, NOW(), NOW())", $shopId ) ); } return $this->getVueShopexportSuccessPage($shopId); } $data = ['error' => 'Unknown error']; return new JsonResponse($data, JsonResponse::HTTP_BAD_REQUEST); } if($cmd === 'getbooster') { $module = $this->app->Secure->GetPOST('shopmodule'); return $this->getBoosterVue($module); } if($cmd === 'getassistant') { $module = $this->app->Secure->GetPOST('shopmodule'); $isBooster = substr($module, -7) === 'booster'; $obj = $this->app->loadModule($module); if($obj === null && $isBooster) { $module = substr($module, 0, -7); return $this->getBoosterVue($module); } if(!method_exists($obj, 'getCreateForm')) { return new JsonResponse(['location' => 'index.php?module=onlineshops&action=create&auswahl='.$module]); } $form = $obj->getCreateForm(); if(!empty($form)) { $form[count($form) - 1]['link'] = [ 'link' => 'index.php?module=onlineshops&action=create&auswahl=' . $module, 'title' => 'Expertenmodus', ]; } $page = [ 'type' => 'form', 'dataRequiredForSubmit' => [ 'shopmodule' => $module, 'id' => 'NEW', ], 'submitType' => 'submit', 'icon'=> 'password-icon', 'headline' => ucfirst(substr($module, 13)), 'subHeadline' => method_exists($obj, 'getClickByClickHeadline')?$obj->getClickByClickHeadline():'Bitte Zugangsdaten eingeben', 'submitUrl' => 'index.php?module=onlineshops&action=create&cmd=saveassistent&shopmodule='.$module, 'form' => $form, 'ctaButtons' => [ [ 'title' => 'Weiter', 'type' => 'submit', 'action' => 'submit', ], ] ]; $ret = [ 'pages'=> [ $page ], ]; return new JsonResponse($ret); } $module = $this->getApps($this->app->Secure->GetPOST('val')); if($cmd === 'suche') { $anzeigen = ''; $ausblenden = ''; if($module) { if(isset($module['installiert'])) { foreach($module['installiert'] as $k => $v) { if($v['match']){ if($anzeigen != '') { $anzeigen .= ';'; } $anzeigen .= 'm'.md5($v['Bezeichnung']); } else { if($ausblenden != '') { $ausblenden .= ';'; } $ausblenden .= 'm'.md5($v['Bezeichnung']); } } } if(isset($module['kauf'])) { foreach($module['kauf'] as $k => $v) { if($v['match']) { if($anzeigen != '') { $anzeigen .= ';'; } $anzeigen .= 'm'.md5($v['Bezeichnung']); } else { if($ausblenden != '') { $ausblenden .= ';'; } $ausblenden .= 'm'.md5($v['Bezeichnung']); } } } } echo json_encode(array('anzeigen'=>$anzeigen,'ausblenden'=>$ausblenden)); $this->app->ExitXentral(); } if($this->app->Secure->GetGET('auswahl')) { //$bezeichnung = $this->app->Secure->GetPOST('bezeichnung'); $auswahlmodul = $this->app->Secure->GetGET('auswahl'); if($auswahlmodul === 'extern') { $bezeichnung = 'Onlineshop'; $i = 1; while($this->app->DB->Select( sprintf("SELECT `id` FROM `shopexport` WHERE `bezeichnung` = '%s' LIMIT 1", $bezeichnung))) { $i++; $bezeichnung = 'Onlineshop '.$i; } $this->app->DB->Insert( sprintf( "INSERT INTO `shopexport` ( `artikelimport`,`demomodus`,`bezeichnung`,`artikeltexteuebernehmen`,`versandartenmapping`, `zahlungsweisenmapping`, `lagerexport`,`artikelexport`,`datumvon`,`auftragabgleich`, `portoartikelanlegen`,`steuerfreilieferlandexport`,`multiprojekt` ) VALUES (1,1,'%s',1,1,1,0,0,now(),1,1,1,1)", $bezeichnung ) ); $id = $this->app->DB->GetInsertID(); $this->app->erp->RunHook('shopexport_create', 1, $id); $this->app->Location->execute('index.php?module=onlineshops&action=edit&id='.$id.'#tabs-2'); } if($this->app->erp->ModulVorhanden($auswahlmodul)) { $check = $this->createInternShop($auswahlmodul); if(!empty($check['error'])) { $msg = $this->app->erp->base64_url_encode('
'.$check['Error'].'
'); $this->app->Location->execute('index.php?module=onlineshops&action=list&msg='.$msg); } $this->app->Location->execute('index.php?module=onlineshops&action=edit&id='.$check['id']); } } /** @var Appstore $appstore */ $appstore = $this->app->erp->LoadModul('appstore'); $modullist = $this->app->erp->getApps(); $appstore->AddModuleHtml( $modullist, 'shopimporter_', 'index.php?module=onlineshops&action=create&get=', [ 'title' => 'Extern', 'link' => 'index.php?module=onlineshops&action=create&auswahl=extern', ] ); $this->ShopexportMenu(); $this->app->ModuleScriptCache->IncludeWidgetNew('ClickByClickAssistant'); $this->app->Tpl->Parse('PAGE', 'shopexport_neu.tpl'); } /** * @param int $shopId * * @return int|null */ public function createPriceGroupByShopId($shopId): ?int { $shopName = $this->app->DB->Select(sprintf('SELECT `bezeichnung` FROM `shopexport` WHERE `id` = %d', $shopId)); $startCode = preg_replace('/[^A-Z0-9]/','',str_replace(' ', '', strtoupper($shopName))); $code = $startCode; $startName = $shopName; $name = $startName; $counter = 0; while( (int)$this->app->DB->Select( sprintf( "SELECT COUNT(`id`) FROM `gruppen` WHERE `kennziffer` = '%s' OR `name` = '%s'", $this->app->DB->real_escape_string($code), $this->app->DB->real_escape_string($name) ) ) > 0 ) { $counter++; $code = $startCode.$counter; $name = $startName.' '.$counter; } $this->app->DB->Insert( sprintf( "INSERT INTO `gruppen` (`name`, `art`, `kennziffer`, `aktiv`, `webid`) VALUES ('%s', 'preisgruppe', '%s', 1, '') ", $this->app->DB->real_escape_string($name), $this->app->DB->real_escape_string($code) ) ); $groupId = (int)$this->app->DB->GetInsertID(); if($groupId <= 0) { return null; } return $groupId; } /** * @param string $code * * @return int|null */ public function getPriceGroupIdFromCode($code): ?int { $groupId = $this->app->DB->Select( sprintf( "SELECT g.id FROM `gruppen` AS `g` WHERE g.aktiv = 1 AND g.art = 'preisgruppe' AND g.kennziffer = '%s' %s ORDER BY g.name LIMIT 1", $this->app->DB->real_escape_string($code), $this->app->erp->ProjektRechte('g.projekt') ) ); if(empty($groupId)) { return null; } return (int)$groupId; } public function ShopexportList() { $this->ShopexportMenu(); if($this->app->DB->Select("SELECT id FROM shopexport WHERE aktiv = 1 AND cronjobaktiv LIMIT 1")) { if(!$this->app->DB->Select("SELECT id FROM prozessstarter WHERE parameter = 'shopimport' AND aktiv = 1 AND art = 'periodisch' LIMIT 1")) { if($this->app->DB->Select("SELECT id FROM prozessstarter WHERE parameter = 'shopimport' AND aktiv = 1 AND art <> 'periodisch' LIMIT 1")) { $this->app->Tpl->Add('MESSAGE', '
{|Der Prozessstarter "shopimport" ist auf "Uhrzeit" eingestellt. Es werden die Einstellungen "periodisch" mit der Periode 5 empfohlen|}
'); } } } parent::ShopexportList(); } /** * @param array $importerCapabilities * @param array $featureKeys * @param array $shopNames * @param array $sequence * * @return array */ protected function getShopFeaturesSorted($importerCapabilities, $featureKeys, $shopNames, $sequence): array { $data = []; $sequence = array_intersect($sequence, array_keys($importerCapabilities)); $cShops = count($sequence); $cTables = (int)ceil($cShops / 10); $cTablesPerRow = (int)ceil($cShops / $cTables); for($iTable = 0; $iTable < $cTables; $iTable++) { $data[$iTable]['tabheader']['tabdescription'] = ''; } foreach($sequence as $shopKey => $shop) { $iTable = (int)floor($shopKey / $cTablesPerRow); $data[$iTable]['tabheader'][$shop] = $shopNames[$shop]; } foreach($featureKeys as $featureKey) { $name = !empty($baseImporterCapabilities[$featureKey]['name'])?$baseImporterCapabilities[$featureKey]['name']:$featureKey; for($iTable = 0; $iTable < $cTables; $iTable++) { $data[$iTable][$featureKey]['tabdescription'] = html_entity_decode($name); } foreach($sequence as $shopKey => $shop) { $iTable = (int)floor($shopKey / $cTablesPerRow); $data[$iTable][$featureKey][$shop] = [ 'export' => !empty($importerCapabilities[$shop][$featureKey]['createarticle'])?$importerCapabilities[$shop][$featureKey]['createarticle']:null, 'import' => !empty($importerCapabilities[$shop][$featureKey]['importarticle'])?$importerCapabilities[$shop][$featureKey]['importarticle']:null]; } } return $data; } public function ShopexportFeatures() { $this->ShopexportMenu(); /** @var ShopimporterBase $obj */ $obj = new ShopimporterBase(); $baseImporterCapabilities = $obj->importerCapability(); $featureKeys = [array_keys($baseImporterCapabilities)]; $module = $this->getApps(); $importerCapabilities = []; $shopNames = []; $shopCapabilities = ShopimporterBase::shopCapabilities(); foreach ($shopCapabilities as $shopModule => $capabilities){ $importerCapabilities[$shopModule] = $capabilities; $featureKeys[] = array_keys($capabilities); $shopNames[$shopModule] = ucfirst(str_replace('shopimporter_','',$shopModule)); } $featureKeys = array_merge(...$featureKeys); $featureKeys = array_unique($featureKeys); //fuer marketing auftrag immer importierbar zeigen foreach ($importerCapabilities as &$item) { if ($item['auftrag']['importarticle'] === 4) { $item['auftrag']['importarticle'] = 3; } } unset($item); $sequenceShop = [ 'shopimporter_shopware', 'shopimporter_shopware6', 'shopimporter_shopify', 'shopimporter_magento', 'shopimporter_magento2', 'shopimporter_woocommerce', 'shopimporter_gambio', 'shopimporter_oxid', 'shopimporter_presta', 'shopimporter_getcore', 'shopimporter_epages', 'shopimporter_spryker', 'shopimporter_hhg', 'shopimporter_modified', ]; $sequenceMarket = [ 'shopimporter_amazon', 'shopimporter_ebay', 'shopimporter_real', 'shopimporter_hood', 'shopimporter_rakuten', 'shopimporter_manomano', 'shopimporter_etsy', 'shopimporter_cdiscount', ]; $sequenceMisc = [ 'shopimporter_tillhub', 'shopimporter_billbee', ]; $additionalMisc = array_diff(array_keys($importerCapabilities), $sequenceMarket, $sequenceShop, $sequenceMisc); $sequenceMisc = array_merge($sequenceMisc, $additionalMisc); $features = []; $features['shop'] = $this->getShopFeaturesSorted( $importerCapabilities, $featureKeys, $shopNames, $sequenceShop ); $features['market'] = $this->getShopFeaturesSorted( $importerCapabilities, $featureKeys, $shopNames, $sequenceMarket ); $features['misc'] = $this->getShopFeaturesSorted( $importerCapabilities, $featureKeys, $shopNames, $sequenceMisc ); /** @var \Xentral\Components\Template\Template $tmp */ $tmp = $this->app->Container->get('Template'); $tmp->setDefaultNamespace('Modules/Onlineshop'); $tmp->assign('features', $features); $table = $tmp->fetch('feature.tpl'); //$html $this->app->Tpl->Add('SHOPTABS', $table); //$this->app->Tpl->Add('TAB1','
'.print_r($featureKeys,true).'
'); $this->app->Tpl->Parse('PAGE','onlineshops_features.tpl'); } public function ShopexportMenu() { $id = $this->app->Secure->GetGET('id'); $this->app->erp->MenuEintrag('index.php?module=onlineshops&action=create','Neu'); $action = $this->app->Secure->GetGET('action'); if(($action==='list' || $action === 'features') && $id <= 0) { $this->app->erp->Headlines('Shops und Marktplätze'); $this->app->erp->MenuEintrag('index.php?module=onlineshops&action=list','Übersicht'); $this->app->erp->MenuEintrag('index.php?module=onlineshops&action=features','Shopfunktionen'); } if($id > 0) { $name = $this->app->DB->Select("SELECT bezeichnung FROM shopexport WHERE id='$id' LIMIT 1"); $this->app->erp->Headlines('', $name); //$this->app->Tpl->Add('KURZUEBERSCHRIFT2',$name); $this->app->erp->MenuEintrag('index.php?module=onlineshops&action=edit&id='.$id,'Details'); //$this->app->erp->MenuEintrag("index.php?module=shopexport&action=export&id=$id","Export"); $this->app->erp->MenuEintrag('index.php?module=shopexport&action=artikeluebertragung&id='.$id,'Artikel Übertragung'); if($this->app->DB->Select("SELECT modulename FROM shopexport WHERE id = '$id'") === 'shopimporter_shopware'){ //Soll nur in Shopware angezeigt werden, da nur in Shopware unterstüzt $this->app->erp->MenuEintrag('index.php?module=shopexport&action=adressuebertragung&id='.$id,'Adressen Übertragung'); } } $typ = $this->app->DB->Select("SELECT typ FROM shopexport WHERE id='$id' LIMIT 1"); if($typ==='wawision') { $this->app->erp->MenuEintrag("index.php?module=shopexport&action=navigationtab&id=$id","Navigation"); $this->app->erp->MenuEintrag("index.php?module=shopexport&action=artikelgruppen&id=$id","Artikelgruppen"); $this->app->erp->MenuEintrag("index.php?module=shopexport&action=live&id=$id","Live-Status"); $this->app->erp->MenuEintrag("index.php?module=inhalt&action=listshop&id=$id","Inhalte / E-Mailvorlagen"); } if($this->app->Secure->GetGET('action') !== 'list'){ $this->app->erp->MenuEintrag('index.php?module=onlineshops&action=list', 'Zurück zur Übersicht'); } $this->app->erp->RunMenuHook('onlineshops'); } public function ShopexportDelete() { $id = $this->app->Secure->GetGET('id'); if(is_numeric($id)) { $this->app->erp->RunHook('shopexportdelete', 1, $id); $this->app->DB->Delete("DELETE FROM shopexport WHERE id='$id' LIMIT 1"); } $this->app->Location->execute('index.php?module=onlineshops&action=list'); } /** * @return JsonResponse */ public function HandleUncheckTreeNodeAjaxAction() { $shopId = (int)$this->app->Secure->GetGET('shopId'); $id = (int)$this->app->Secure->GetGET('id'); $this->setJsonSettings($shopId, 'category_root_id', 0); $data = ['id' => $id,]; return new JsonResponse($data); } /** * @return JsonResponse */ public function HandleCheckTreeNodeAjaxAction() { $shopId = (int)$this->app->Secure->GetGET('shopId'); $id = (int)$this->app->Secure->GetGET('id'); $this->setJsonSettings($shopId, 'category_root_id', $id); $data = ['id' => $id,]; return new JsonResponse($data); } /** * @return JsonResponse */ public function HandleLoadDefaultTemplateAjaxAction() { $template = ''; $shopId = (int)$this->app->Secure->GetPOST('shopid'); $isJson = $this->app->Secure->GetPOST('format') === 'json'; $shopModule = $this->app->DB->Select(sprintf('SELECT `modulename` FROM `shopexport` WHERE `id` = %d', $shopId)); $file = dirname(dirname(__DIR__)).'/classes/Modules/Onlineshop/resources/smarty_templates/'.$shopModule.'_' .($isJson?'json':'xml').'.tpl'; if(is_file($file)) { $template = file_get_contents($file); } return new JsonResponse( [ 'success' => true, 'template' => $template ] ); } public function ShopexportEdit() { $cmd = $this->app->Secure->GetGET('cmd'); if($cmd === 'loadDefaultTemplate') { return $this->HandleLoadDefaultTemplateAjaxAction(); } if($cmd === 'loadTree') { return $this->HandleLoadTreeAjaxAction(); } if($cmd === 'uncheckTreeNode') { return $this->HandleUncheckTreeNodeAjaxAction(); } if($cmd === 'checkTreeNode') { return $this->HandleCheckTreeNodeAjaxAction(); } if($cmd === 'loadCart') { return $this->HandleLoadCartAjaxAction(); } if($cmd === 'runincomming') { return $this->HandleRunSmartyIncommingAjaxAction(); } if($cmd === 'savesmartyincomming') { return $this->HandleSaveSmartyIncommingAjaxAction(); } if($cmd === 'getnotimortedorders'){ $id = (int)$this->app->Secure->GetPOST('id'); $notImortedOrders = $this->app->DB->Select(sprintf('SELECT COUNT(id) FROM shopimport_auftraege WHERE shopid = %d AND imported = 0 AND trash = 0', $id)); echo json_encode(['count'=>$notImortedOrders]); $this->app->erp->ExitWawi(); } $id = (int)$this->app->Secure->GetGET('id'); if(!empty($id) && $this->app->Secure->GetPOST('speichern') === 'Speichern'){ $fieldsToSave = $_POST; unset($fieldsToSave['nurfehler'],$fieldsToSave['auftraege'],$fieldsToSave['aenderungen'],$fieldsToSave['shopexport_log_length']); $moduleName = $this->app->DB->Select("SELECT modulename FROM shopexport WHERE id = '$id' LIMIT 1"); try { $obj = $this->app->erp->LoadModul($moduleName); if(method_exists($obj,'EinstellungenStruktur')){ $struktur = $obj->EinstellungenStruktur($id); foreach ($struktur['felder'] as $fieldname => $fieldData){ if($fieldData['typ'] === 'password'){ if($fieldsToSave[$fieldname] === '***************') { $oldData = json_decode($this->app->DB->Select('SELECT einstellungen_json FROM shopexport WHERE id=' . $id), true); $fieldsToSave[$fieldname] = $oldData['felder'][$fieldname]; } $fieldsToSave[$fieldname] = substr(md5($fieldsToSave[$fieldname]),0,15); } } } }catch(Exception $ex){ $this->app->erp->LogFile('Fehlerhafter Aufruf in Modul: '.$moduleName); } $username = $this->app->DB->real_escape_string($this->app->User->GetUsername()); $query = sprintf('SELECT id FROM shopexport_change_log WHERE shop_id=%d',$id); $changeLogEntryExists = $this->app->DB->Select($query); if($changeLogEntryExists){ $query = sprintf('SELECT diff FROM shopexport_change_log WHERE shop_id=%d ORDER BY id ASC',$id); $existingChangeLogEntries = $this->app->DB->SelectArr($query); $fieldsToCompareTo = []; foreach ($existingChangeLogEntries as $existingChangeLogEntry){ $existingFields = json_decode($existingChangeLogEntry['diff'],true); $fieldsToCompareTo = array_merge($fieldsToCompareTo,$existingFields); } $differenceInValues = []; foreach ($fieldsToSave as $fieldToSaveName => $fieldToSaveValue){ if($fieldsToSave[$fieldToSaveName] !== $fieldsToCompareTo[$fieldToSaveName]){ $differenceInValues[$fieldToSaveName] = $fieldsToSave[$fieldToSaveName]; } unset($fieldsToCompareTo[$fieldToSaveName]); } foreach ($fieldsToCompareTo as $fieldToCompareToName => $fieldToCompareToValue){ if(!empty($fieldToCompareToValue)){ $differenceInValues[$fieldToCompareToName] = ''; } } $message = 'Geänderte Felder: '.count($differenceInValues); if(empty($differenceInValues)){ $message = 'Keine Änderung'; } $plaindiff = implode(', ',array_keys($differenceInValues)); if(strlen($plaindiff)>100){ $plaindiff = substr($plaindiff,0,97).'...'; } $query = sprintf("INSERT INTO shopexport_change_log (shop_id,diff,message,username,plaindiff) VALUES (%d,'%s','%s','%s','%s')", $id, $this->app->DB->real_escape_string(json_encode($differenceInValues)),$message,$username,$plaindiff); $this->app->DB->Insert($query); }else{ $query = sprintf("INSERT INTO shopexport_change_log (shop_id,diff,message,username,plaindiff) VALUES (%d,'%s','%s','%s','')", $id, $this->app->DB->real_escape_string(json_encode($fieldsToSave)),'Initiale Speicherung',$username); $this->app->DB->Insert($query); } } if($id && $cmd === 'archivspeichern') { //Prüfen ob Cronjob existiert, wenn nicht inaktiv anlegen $cronjobid = $this->app->DB->Select("SELECT id FROM prozessstarter WHERE parameter = 'shopimport_auftragarchiv' LIMIT 1"); if(!$cronjobid){ $this->app->DB->Insert("INSERT INTO prozessstarter (bezeichnung, bedingung, art, startzeit, letzteausfuerhung, periode, typ, parameter, aktiv) VALUES ('Shopimport Auftragsarchiv','','periodisch', NOW(), '0000-00-00 00:00:00', 10080,'cronjob', 'shopimport_auftragarchiv', 0)"); $cronjobid = $this->app->DB->GetInsertID(); }else { $this->app->DB->Update( sprintf( 'UPDATE prozessstarter SET letzteausfuerhung = DATE_SUB(NOW(), INTERVAL 10080 MINUTE) WHERE id = %d AND mutex = 0 AND aktiv = 1 AND letzteausfuerhung > DATE_SUB(NOW(), INTERVAL 10080 MINUTE)', $cronjobid ) ); } $this->app->DB->Update("UPDATE prozessstarter SET aktiv = 1 WHERE id = '$cronjobid'"); $check = $this->app->DB->Select("SELECT id FROM shopexport_archiv WHERE shop = '$id' LIMIT 1"); if(!$check) { $this->app->DB->Insert("INSERT INTO shopexport_archiv (shop) VALUES ('$id')"); $check = $this->app->DB->GetInsertID(); } if($check) { $this->app->DB->Update("UPDATE shopexport_archiv SET status = 'aktiv' WHERE id = '$check' LIMIT 1"); $typ = $this->app->Secure->GetPOST('typ'); $von = $this->app->Secure->GetPOST('von'); $bis = $this->app->Secure->GetPOST('bis'); $zeitvon = $this->app->Secure->GetPOST('zeitvon'); $zeitbis = $this->app->Secure->GetPOST('zeitbis'); $abschliessen = (int)$this->app->Secure->GetPOST('auftrag_abschliessen'); $rechnung_erzeugen = (int)$this->app->Secure->GetPOST('rechnung_erzeugen'); $rechnung_bezahlt = (int)$this->app->Secure->GetPOST('rechnung_bezahlt'); $stornierteabholen = (int)$this->app->Secure->GetPOST('stornierte_abholen'); $donotimport = (int)$this->app->Secure->GetPOST('donotimport'); $datumvon = ''; $datumbis = ''; $nummervon = ''; $nummerbis = ''; if($typ === 'zeitraum') { if($von != '') { $datumvon = $this->app->String->Convert($von, '%1.%2.%3', '%3-%2-%1').' '.$zeitvon; } if($bis != '') { $datumbis = $this->app->String->Convert($bis, '%1.%2.%3', '%3-%2-%1').' '.$zeitbis; } }else{ $nummervon = $von; $nummerbis = $bis; } if(($nummervon !='' && $nummerbis !='') || ($datumvon !='' && $datumbis !='')){ $bearbeiter = $this->app->DB->real_escape_string($this->app->User->GetName()); $this->app->DB->Update("UPDATE shopexport_archiv SET anzahl=0, erfolgreich=0,`type` = '$typ',bearbeiter = '$bearbeiter',abschliessen = '$abschliessen', rechnung_erzeugen = '$rechnung_erzeugen',rechnung_bezahlt = '$rechnung_bezahlt', nummervon = '$nummervon', nummerbis = '$nummerbis',datumvon = '$datumvon', datumbis = '$datumbis', stornierteabholen='$stornierteabholen' , donotimport = '$donotimport', letzteabgeholtenummer = 0 WHERE id = '$check' LIMIT 1"); $this->app->DB->LogIfError(); echo json_encode(array('status'=>1)); } else { echo json_encode(array('status'=>0)); } } $this->app->ExitXentral(); } if($cmd === 'changeaktiv') { $data = $this->app->DB->SelectRow("SELECT * FROM shopexport WHERE id = '$id' LIMIT 1"); if($data) { if($data['aktiv']) { $this->app->DB->Update("UPDATE shopexport SET aktiv = 0 WHERE id = '$id' LIMIT 1"); } else { if($data['shoptyp'] === 'custom' && $data['modulename'] !== '') { $data['modulename'] = trim($data['modulename'],'.'); $file = dirname(__DIR__) .'/plugins/external/shopimporter/'.$data['modulename']; if(is_file($file)) { include_once $file; } else { echo json_encode(array('aktiv'=> $data['aktiv'])); $this->app->ExitXentral(); } } else { $this->app->DB->Update("UPDATE shopexport SET aktiv = 1 WHERE id = '$id' LIMIT 1"); } } echo json_encode(array('aktiv'=> 1 - $data['aktiv'])); } $this->app->ExitXentral(); } if($cmd === 'testcustomfile') { $status = 0; $fehler = ''; if($data = $this->app->DB->SelectRow("SELECT * FROM shopexport WHERE id = '$id' AND shoptyp = 'custom' AND modulename <> '' LIMIT 1")) { $data['modulename'] = trim($data['modulename'],'.'); $file = dirname(__DIR__) .'/plugins/external/shopimporter/'.$data['modulename']; if(is_file($file)) { include_once $file; $status = 1; } else { $fehler = 'Datei nicht gefunden'; } } echo json_encode(array('status'=>$status,'fehler'=>$fehler)); $this->app->ExitXentral(); } if($this->app->Secure->GetPOST('savefile')) { if($data = $this->app->DB->SelectRow("SELECT * FROM shopexport WHERE id = '$id' AND shoptyp = 'custom' AND modulename <> '' LIMIT 1")) { $file = dirname(__DIR__) .'/plugins/external/shopimporter/'.$data['modulename']; if(is_file($file)) { $text = htmlspecialchars_decode($_POST['customdatei']); file_put_contents($file, $text); } } } if($this->app->Secure->GetPOST('pruefen')) { $className = 'Remote'; $methodName = 'RemoteConnection'; $r = new ReflectionMethod($className, $methodName); $params = $r->getParameters(); $anzargs = count($params); try { if($anzargs > 1){ $pageContents = $this->app->remote->RemoteConnection($id, true); } else { $pageContents = $this->app->remote->RemoteConnection($id); } } catch(Exception $e) { $pageContents = $e->getMessage(); } if(strpos($pageContents, 'success') === 0){ if($anzargs > 1) { $pageContents2 = $this->app->remote->RemoteConnection($id, 'info'); } if($anzargs > 1 && is_array($pageContents2)) { $json = $this->app->DB->Select("SELECT json FROM shopexport WHERE id = '$id' LIMIT 1"); if($json) { $json = array_merge(json_decode($json, true), $pageContents2); } else { $json = $pageContents2; } $this->app->DB->Update("UPDATE shopexport set json = '".$this->app->DB->real_escape_string(json_encode($json))."' WHERE id = '$id' LIMIT 1"); unset($json); $this->app->Tpl->Set('MESSAGE','
'); if(isset($pageContents2['subshops'])) { $this->app->Tpl->Add('MESSAGE','Subshops: '); foreach($pageContents2['subshops'] as $subshop) { $this->app->Tpl->Add('MESSAGE','"); } $this->app->Tpl->Add('MESSAGE','
IdNameAktiv
'.$subshop['id'].''.$subshop['name']."".($subshop['aktiv']?'ja':'nein')."
'); } else { $this->app->Tpl->Add('MESSAGE','Verbindung: success'); } $this->app->Tpl->Add('MESSAGE','
'); } else { $this->app->Tpl->Set('MESSAGE',"
Verbindung: $pageContents
"); } } else { $this->app->Tpl->Set('MESSAGE',"
Verbindungsproblem: Eventuell falsche Schlüssel! ($pageContents)
"); } } if($this->app->Secure->GetPOST('auftragabholen')) { /** @var Shopimport $obj */ $obj = $this->app->erp->LoadModul('shopimport'); if(!empty($obj)) { @ignore_user_abort(true); $anz = $obj->ShopimportImport($id, 0, true); } if($anz) { $this->app->Location->execute('index.php?module=shopimport&action=import'); } if($obj && !empty($obj->error)) { $this->app->Tpl->Add('MESSAGE', $obj->error); } else{ $this->app->Tpl->Add('MESSAGE', '
Aktuell sind keine Aufträge in den Online-Shops vorhanden!
'); } } $this->app->YUI->TableSearch('LOGTABELLE', 'shopexport_log', 'show','','',basename(__FILE__), __CLASS__); $this->app->YUI->TableSearch('TAB3','shopexport_zahlweisen'); $this->app->YUI->TableSearch('TAB4','shopexport_versandarten'); $this->app->YUI->TableSearch('TAB5','shopexport_freifelder'); $this->app->YUI->TableSearch('TAB6','shopexport_subshop'); $this->app->YUI->TableSearch('TAB7', 'shopexport_sprachen', 'show','','',basename(__FILE__), __CLASS__); $this->app->YUI->TableSearch('TAB8', 'shopexport_kundengruppen', 'show','','',basename(__FILE__), __CLASS__); $this->app->YUI->AutoComplete('b_projekt','projektname',1); $this->app->YUI->AutoComplete('sprachenprojekt', 'projektname' , 1); $this->app->YUI->AutoComplete('kundengruppeprojekt', 'projektname' , 1); $this->app->YUI->AutoComplete('k_projekt', 'projektname' , 1); $this->app->YUI->AutoComplete('d_projekt', 'projektname' , 1); $this->app->Tpl->Add('FREIFELDEROPTIONEN',''); for($i = 1; $i <= 40; $i++) { $freifeldname = $this->app->erp->Firmendaten('freifeld'.$i); if(!$freifeldname) { $freifeldname = 'Freifeld '.$i; } $freifeldname = explode('|',$freifeldname); $this->app->Tpl->Add('FREIFELDEROPTIONEN',''); } /* $this->CheckColumn("id","int(11)","shopexport_log","NOT NULL AUTO_INCREMENT"); $this->CheckColumn("shopid","int(11)","shopexport_log","DEFAULT '0' NOT NULL"); $this->CheckColumn("typ", "varchar(64)", "shopexport_log","DEFAULT '' NOT NULL"); $this->CheckColumn("parameter1", "varchar(64)", "shopexport_log","DEFAULT '' NOT NULL"); $this->CheckColumn("parameter2", "varchar(64)", "shopexport_log","DEFAULT '' NOT NULL"); $this->CheckColumn("bearbeiter", "varchar(64)", "shopexport_log","DEFAULT '' NOT NULL"); $this->CheckColumn("zeitstempel","timestamp","shopexport_log","DEFAULT CURRENT_TIMESTAMP"); */ $sprachenopt = $this->app->erp->GetSprachenSelect(); $sprachensel = ''; if($sprachenopt) { foreach($sprachenopt as $k => $v) { $sprachensel .= ''; } } $projektId = $this->app->DB->Select("SELECT projekt FROM shopexport WHERE id = '$id' LIMIT 1"); $selversandarten = ''; $selzahlungsweisen = ''; $zahlungsweisen = $this->app->erp->GetZahlungsweise(null,null,$projektId); if(!empty($zahlungsweisen)){ foreach ($zahlungsweisen as $k => $v) { $selzahlungsweisen .= ''; } } $versandartenarr = $this->app->DB->SelectArr("SELECT type,bezeichnung FROM versandarten WHERE aktiv = 1 AND (projekt=0 OR projekt='' OR projekt='$projektId')ORDER BY bezeichnung"); if(!empty($versandartenarr)) { $versandarten = []; foreach($versandartenarr as $v) { $versandarten[$v['type']] = $v['bezeichnung']; } foreach ($versandarten as $k => $v) { $selversandarten .= ''; } } $this->app->Tpl->Set('FORMULAR',''); $this->app->Tpl->Add('FORMULAR',''); $alleKundengruppenAusXentral = $this->app->DB->SelectArr("SELECT id,name FROM gruppen WHERE (art='gruppe' OR art='preisgruppe') AND (projekt='' OR projekt=0 OR projekt='$projektId') AND aktiv='1'"); $kundengruppenSelect =''; foreach ($alleKundengruppenAusXentral as $kundengruppe) { $kundengruppenSelect .= ''; } $this->app->Tpl->Add('FORMULAR',''); $this->app->Tpl->Add('FORMULAR',''); $this->app->Tpl->Add('FORMULAR',''); $this->app->Tpl->Add('FORMULAR',''); $this->app->Tpl->Set('NEUTAB3','
{|Anlegen|}
{|Zahlweise Shop|}:    {|Zahlweise Xentral|}:    {|Vorab als bezahlt markieren|}:    {|Autoversand aktiv|}:   (Haken muss standardmässig aktiviert sein)   {|keine Rechnung erstellen|}:    {|Fast-Lane|}:   
'); $this->app->Tpl->Set('NEUTAB4','
{|Anlegen|}
{|Versandart Shop|}:    {|Versandart Xentral|}:    {|Versandart Ausgehend|}:    {|Produkt Ausgehend|}:    {|Land (2-stellig ISO mit Komma getrennt)|}:    {|Autoversand aktiv|}:   (Haken muss standardmässig aktiviert sein)   {|Fast-Lane|}:   
'); $this->app->Tpl->Set('NEUTAB5','
{|Anlegen|}
{|Freifeld Xentral|}:    {|Bezeichnung in Shop|}:   
'); $this->app->Tpl->Set('NEUTAB6','
{|Anlegen|}
{|Subshop Kennung|}:    {|Sprache|}:    {|Projekt Xentral|}:   
'); $this->app->Tpl->Set('NEUTAB7','
{|Anlegen|}
{|Land|}:    {|Sprache|}:    {|Projekt Xentral|}:   
Bitte als ISO2-Länderkürzel eintragen
'); $this->app->Tpl->Set('NEUTAB8','
{|Anlegen|}
  {|von|}:    {|Projekt Xentral|}:    {|Gruppe im Shop|}:     
'); if($this->app->DB->Select("SELECT id FROM shopexport WHERE aktiv = 1 AND cronjobaktiv AND id = '$id' LIMIT 1")) { if(!$this->app->DB->Select("SELECT id FROM prozessstarter WHERE parameter = 'shopimport' AND aktiv = 1 AND art = 'periodisch' LIMIT 1")) { if($this->app->DB->Select("SELECT id FROM prozessstarter WHERE parameter = 'shopimport' AND aktiv = 1 AND art <> 'periodisch' LIMIT 1")) { $this->app->Tpl->Add('MESSAGE', '
{|Der Prozessstarter "shopimport" ist auf "Uhrzeit" eingestellt. Es werden die Einstellungen "periodisch" mit der Periode 5 empfohlen|}
'); } } } $this->ShopexportMenu(); if($id > 0) { $this->showBetaMessage($id); } parent::ShopexportEdit(); } /** * @param int $shopId */ public function showBetaMessage($shopId) { if(empty($shopId)) { return; } $module = $this->app->DB->SelectRow( sprintf( "SELECT `modulename`, `bezeichnung` FROM `shopexport` WHERE `id` = %d AND `shoptyp` = 'intern' LIMIT 1", $shopId ) ); if(empty($module)) { return; } /** @var Appstore $appstore */ $appstore = $this->app->erp->LoadModul('appstore'); if($appstore === null || !method_exists($appstore, 'isBeta')) { return; } if($appstore->isBeta($module['modulename'])) { $this->app->Tpl->Add( 'MESSAGE', '
Dieses Modul ist noch im Beta Stadium.
' ); $appstore->addBetaToHeadline(); } } /** * @param $json * * @return mixed */ public function SmartyJsonDecode($json) { return is_string($json)?json_decode($json):$json; } /** * @param mixed $data * * @return false|string */ public function SmartyJsonEncode($data) { return json_encode($data); } /** * @param $var * * @return string */ public function SmartyPrintR($var) { return print_r($var, true); } /** * @param array $array * * @return string */ public function SmartyArrayToList($array) { if(is_string($array)) { return $array; } if(!is_array($array)) { $array = json_decode(json_encode($array), true); } if(is_string($array)) { return $array; } if(!is_array($array)) { return ''; } foreach($array as $key => $val) { if(is_array($val)) { $array[$key] = json_encode($val); } } return implode('
', $array); } /** * @param array|SimpleXMLElement $attributes * * @return string */ protected function attributeKey($attributes) { $ret = ''; if(empty($attributes)) { return $ret; } foreach($attributes as $key => $attribute) { if((is_array($attribute) || is_object($attribute)) && count($attribute) === 1) { $ret .= ' '.$key.'="'.reset($attribute).'"'; continue; } $ret .= ' '.$key.'="'.$attribute.'"'; } return $ret; } /** * Kovertiert einen XML-String in ein Array * * @param string $xml * @param bool $wrap * * @return array * * @throws \RuntimeException */ public function convertXmlStringToArray($xml) { $namespaces = []; $simplexml = simplexml_load_string($xml, null, LIBXML_NOCDATA); if(is_object($simplexml)) { $namespaces = $simplexml->getNamespaces(); } if ($simplexml === false) { return []; } return $this->convertSimpleXmlToArray($simplexml, $namespaces); } /** * @param SimpleXMLElement $object * @param array|null $namespaces * @param bool $removeItemKey * * @return array|string */ public function convertSimpleXmlToArray($object, $namespaces = null, $removeItemKey = true) { $array = []; $isObject = is_object($object); $cobject = $isObject?count($object):0; if($isObject && $cobject === 0) { $name = $object->getName(); $attributes = $object->attributes(); $attributeKey = $this->attributeKey($attributes); $array[$name.$attributeKey] = (string)$object; return $array; } $arr = (array)$object; if(isset($arr['@attributes'])) { unset($arr['@attributes']); } $keys = array_keys($arr); $count = count($keys); if($isObject && !empty($arr)) { foreach($object as $key => $value) { if($key === '@attributes') { continue; } if($key === 0 && $count === 1) { return $value; } $valueArr = (array)$value; if(isset($valueArr['@attributes'])) { unset($valueArr['@attributes']); } if(is_object($value) && !empty($valueArr)) { $cValue = count($value); $cValueArr = count($valueArr); $attributes = $value->attributes(); $attributeKey = $this->attributeKey($attributes); if(isset($array[$key.$attributeKey])) { if(!isset($array[$key.$attributeKey][0])) { $array[$key.$attributeKey] = [$array[$key.$attributeKey]]; } if($cValue === 0 || ($cValue <= 1 && $cValueArr === 1)) { $valueReset = reset($valueArr); if(is_array($valueArr)) { $keys = array_keys($valueArr); if(reset($keys) === 0) { $array[$key.$attributeKey] = $valueReset; continue; } } /* if(!is_object($valueReset) && !is_array($valueReset)) { $array[$key.$attributeKey][] = $valueReset; continue; }*/ } $array[$key.$attributeKey][] = $this->convertSimpleXmlToArray($value, $namespaces, $removeItemKey); continue; } if($cValue === 0 || ($cValue <= 1 && $cValueArr === 1)) { $valueReset = reset($valueArr); if(is_array($valueArr)) { $keys = array_keys($valueArr); if(reset($keys) === 0) { $array[$key.$attributeKey] = $valueReset; continue; } } /* if (!is_object($valueReset) && !is_array($valueReset)) { $array[$key.$attributeKey] = $valueReset; continue; }*/ } if($removeItemKey && $attributeKey === '' && strpos($key,'item') === 0 && is_numeric(substr($key,4))) { $array[(int)substr($key,4)] = $this->convertSimpleXmlToArray($value, $namespaces, $removeItemKey); } else{ $array[$key . $attributeKey] = $this->convertSimpleXmlToArray($value, $namespaces, $removeItemKey); } } else { $array[$key] = (string)$value; } } return $array; } return (string)$object; } /** * @param array $cartArr * * @return array|null */ public function getArrayFromCart($cartArr) { if(empty($cartArr)) { return null; } $jsonEncoded = !empty($cartArr['jsonencoded']); $cart = base64_decode($cartArr['warenkorb']); if($jsonEncoded){ $cart = json_decode($cart, true); }else { $cart = unserialize($cart); } if(!is_array($cart)) { return []; } return $cart; } /** * @param int $categoryId * @param array $categories * * @return bool */ public function isIdInCategories($categoryId, $categories) { if(empty($categories)) { return false; } foreach($categories as $category) { if((int)$category['id'] === (int)$categoryId) { return true; } } return false; } /** * @param int $shopId * @param string $name * * @return mixed|null */ public function getJsonSettings($shopId, $name) { $json = $this->app->DB->Select(sprintf('SELECT `einstellungen_json` FROM `shopexport` WHERE `id` = %d', $shopId)); if(empty($json)) { return null; } $json = json_decode($json, true); if(empty($json['felder'])) { return null; } if(!isset($json['felder'][$name])) { return null; } return $json['felder'][$name]; } /** * @param int $shopId * @param string $name * @param mixed $value */ public function setJsonSettings($shopId, $name, $value) { $json = $this->app->DB->Select(sprintf('SELECT `einstellungen_json` FROM `shopexport` WHERE `id` = %d', $shopId)); if(!empty($json)){ $json = json_decode($json, true); } if(!is_array($json)) { $json = ['felder' => []]; } if(!isset($json['felder']) || !is_array($json['felder'])) { $json['felder'] = []; } $json['felder'][$name] = $value; $json = json_encode($json); $this->app->DB->Update( sprintf( "UPDATE `shopexport` SET `einstellungen_json` = '%s' WHERE `id` = %d", $this->app->DB->real_escape_string($json), $shopId ) ); } /** * @return JsonResponse */ public function HandleLoadTreeAjaxAction() { $shopId = (int)$this->app->Secure->GetGET('id'); $checkedId = (int)$this->getJsonSettings($shopId, 'category_root_id'); /** @var Artikelbaum $treeObject */ $treeObject = $this->app->loadModule('artikelbaum'); $categories = [['id'=> 0, 'bezeichnung'=>'root', 'parent' => 0,],]; $treeObject->getKategorien($categories, 0); if(count($categories) > 1) { if((string)$categories[count($categories) -1]['id'] === '0'){ unset($categories[count($categories) - 1]); } } if($checkedId > 0 && !$this->isIdInCategories($checkedId, $categories)) { $checkedId = 0; } $data = $treeObject->getTreeData( $categories, [ 'checkbox' => true, 'checked_ids' => [ $checkedId ], ] ); return new JsonResponse($data); } /** * @return JsonResponse */ public function HandleLoadCartAjaxAction() { $shopId = (int)$this->app->Secure->GetPOST('shopid'); $extid = $this->app->Secure->GetPOST('extid'); $useJson = $this->app->Secure->GetPOST('format') === 'json'; $merge = !(bool)(int)$this->app->Secure->GetPOST('replacecart'); $content = empty($this->app->Secure->POST['content'])?'':trim($this->app->Secure->POST['content']); $cart = $this->app->DB->SelectRow( sprintf( "SELECT `jsonencoded`, `warenkorb` FROM `shopimport_auftraege` WHERE `shopid` = %d AND `extid` = '%s' ORDER BY `id` DESC LIMIT 1", $shopId, $extid ) ); if(empty($cart)) { return new JsonResponse(['success' => false, 'error' => 'Warenkorb nicht gefunden']); } $cart = $this->getArrayFromCart($cart); $cart2 = $cart; if($useJson) { $xml_data = null; } else { $xml_data = $this->convertArrayToSimpleXml($cart); $xml_data = $this->formatXmlForOutput($xml_data->asXML()); } if($content === '') { return new JsonResponse( [ 'success' => true, 'input' => !$useJson?$xml_data:json_encode($cart), 'object' => '
'.print_r($cart,true).'
', 'preview' => '', ] ); } try { $cart2 = $this->addCartInfo($cart2, $shopId, $useJson, $merge, $content); } catch(Exception $e) { return new JsonResponse( [ 'success' => true, 'input' => !$useJson?$xml_data:json_encode($cart), 'object' => '
'.print_r($cart,true).'
', 'preview' => print_r($e->getMessage(),true), ] ); } $xmlDataPreview = ''; if(!$useJson) { try { $xmlDataPreview = $this->convertArrayToSimpleXml($cart2); $xmlDataPreview = $this->formatXmlForOutput($xmlDataPreview->asXML()); } catch(Exception $e) { $xmlDataPreview = ''; } } return new JsonResponse( [ 'success' => true, 'input' => !$useJson?$xml_data:json_encode($cart), 'object' => '
'.print_r($cart,true).'
', 'preview' => !$useJson?$xmlDataPreview:json_encode($cart), ] ); } /** * @param string $xmlstring * * @return string */ protected function formatXmlForOutput($xmlstring) { $ret = ''; $startpos = 0; $lvl = 1; $xmlstring = trim($xmlstring); while(($pos = strpos($xmlstring,'<',$startpos)) !== false) { $isOpening = true; $isClosing = false; $pos1 = strpos($xmlstring,' ', $pos+1); $pos2 = strpos($xmlstring,'>', $pos+1); if($pos1 !== false && $pos2 !== false) { if ($xmlstring[$pos + 1] === '/') { $isClosing = true; $isOpening = false; } elseif($xmlstring[$pos2 - 1] === '/') { $isClosing = true; $isOpening = true; } } elseif($pos2 !== false) { if ($xmlstring[$pos + 1] === '/') { $isClosing = true; $isOpening = false; } elseif($xmlstring[$pos2 - 1] === '/') { $isClosing = true; $isOpening = true; } } else { $pos2 = $pos; } $prev = trim(substr($xmlstring, $startpos, $pos-$startpos)); if($isClosing) { $lvl--; } $xmlPart = str_repeat(' ', $lvl).trim(substr($xmlstring, $pos, $pos2 - $pos + 1)). "\n"; if($isOpening) { $lvl++; } if($lvl < 1) { $lvl = 1; } if($prev !== '') { $ret = trim($ret).$prev.ltrim($xmlPart); } else{ $ret .= $prev . $xmlPart; } $startpos = $pos2 + 1; } $ret .= str_repeat(' ',$lvl).trim(substr($xmlstring, $startpos + 1)); return $ret; } /** * @param int $shopId * * @return mixed|null */ public function getSettingFields($shopId) { if(empty($shopId)) { return null; } $json = $this->app->DB->Select(sprintf('SELECT `einstellungen_json` FROM `shopexport` WHERE `id` = %d', $shopId)); if(empty($json)) { return null; } $json = json_decode($json, true); if(empty($json['felder'])) { return null; } return $json['felder']; } /** * @param int $shopId * * @return string|null */ protected function getTemplateFromShop($shopId) { $fields = $this->getSettingFields($shopId); if(empty($fields) || empty($fields['transform_cart_active']) || empty($fields['transform_cart'])) { return null; } return $fields['transform_cart']; } /** * @param int $addressId * @param array $cart * @param int $projekt * @param int $shopId */ public function ImportAuftragBeforeHook($addressId, &$cart, $projekt, $shopId) { try { $fields = $this->getSettingFields($shopId); if(empty($fields) || empty($fields['transform_cart_active']) || empty($fields['transform_cart'])) { return; } $content = $fields['transform_cart']; if(empty($content)){ return; } $isJson = !empty($fields['transform_cart_format']) && $fields['transform_cart_format'] === 'json'; $merge = empty($fields['transform_cart_replace']); if(!$isJson) { $xml = $this->convertArrayToSimpleXml($cart); $xmlString = $xml->asXML(); if(empty($xmlString)){ return; } } $extId = empty($cart['auftrag'])?'':$cart['auftrag']; $internet = empty($cart['onlinebestellnummer'])?'':$cart['onlinebestellnummer']; $this->app->DB->Insert( sprintf( "INSERT INTO `onlineshop_transfer_cart` (`shop_id`, `template`, `cart_original`, `extid`, `internet`, `status`) VALUES (%d, '%s', '%s', '%s', '%s', 'error') ", $shopId, $this->app->DB->real_escape_string($content), $this->app->DB->real_escape_string(base64_encode(json_encode($cart))), $this->app->DB->real_escape_string($extId), $this->app->DB->real_escape_string($internet) ) ); $transferId = (int)$this->app->DB->GetInsertID(); $cartWithItem = $this->convertSimpleXmlToArray($xml, null, false); $this->loadSmarty($shopId); if($isJson) { $newCart = $this->createCartObjectFromTemplateJson($cart, $content,$shopId, $merge); } else{ $newCarts = $this->createCartObjectFromTemplate($cart, $cartWithItem, $content, $shopId, $merge); $newCart = $newCarts[0]; } if(!empty($newCart)){ if($transferId > 0) { $this->app->DB->Update( sprintf( "UPDATE `onlineshop_transfer_cart` SET `cart_transfer` = '%s', `status` = 'transferred' WHERE `id` = %d", $this->app->DB->real_escape_string(base64_encode(json_encode($newCart))), $transferId ) ); } $cart = $newCart; } } catch (Exception $e) { } } /** * @param array $cart * @param int $shopId * @param bool $useJson * @param bool $merge * @param string|null $content * * @return array */ public function addCartInfo($cart, $shopId, $useJson = false, $merge = true, $content = null) { if($content === null) { $content = $this->getTemplateFromShop($shopId); } if(empty($content)) { if(!$merge) { return null; } return $cart; } if($useJson){ $this->loadSmarty($shopId); return $this->createCartObjectFromTemplateJson($cart, $content, $shopId, $merge); } $xml = $this->convertArrayToSimpleXml($cart); $xmlString = $xml->asXML(); if(empty($xmlString)) { if(!$merge) { return null; } return $cart; } $cartWithItem = $this->convertSimpleXmlToArray($xml, null, false); $this->loadSmarty($shopId); $newCarts = $this->createCartObjectFromTemplate($cart, $cartWithItem, $content, $shopId, $merge); $newCart = $newCarts[0]; if(!empty($newCart)) { return $newCart; } if(!$merge) { return null; } return $cart; } /** * @return JsonResponse */ public function HandleRunSmartyIncommingAjaxAction() { $shopId = (int)$this->app->Secure->GetPOST('shopid'); $input = !isset($this->app->Secure->POST['input'])?null:$this->app->Secure->POST['input']; $content = !isset($this->app->Secure->POST['content'])?null:$this->app->Secure->POST['content']; $isJson = $this->app->Secure->GetPOST('format') === 'json'; $replaceCart = (bool)(int)$this->app->Secure->GetPOST('replacecart'); $xml = null; $cart = null; $cartWithItem = null; if(is_string($input)) { $input = trim($input); } if(is_string($content)) { $content = trim($content); } try { if($isJson){ $cart = json_decode($input, true); } else { $xml = new SimpleXMLElement($input); $cart = $this->convertSimpleXmlToArray($xml, null, true); $cartWithItem = $this->convertSimpleXmlToArray($xml, null, false); } } catch (Exception $e) { $xml = null; $cart = null; $cartWithItem = null; } $this->loadSmarty($shopId); try { if($isJson) { $newCart = $this->createCartObjectFromTemplateJson($cart, $content, $shopId, !$replaceCart); } else{ $newCarts = $this->createCartObjectFromTemplate($cart, $cartWithItem, $content, $shopId, !$replaceCart); $newCart = $newCarts[0]; } } catch(Exception $e) { return new JsonResponse( [ 'success' => true, 'preview' => print_r($e->getMessage(), true), 'object' => '
'.print_r($cart, true).'
', ] ); } try{ if($isJson) { $xmlData = json_encode($newCart); } else { $xmlData = $this->convertArrayToSimpleXml($newCart); $xmlData = $this->formatXmlForOutput($xmlData->asXML()); } } catch(Exception $e) { } return new JsonResponse( [ 'success' => true, 'preview' => $xmlData, 'object' => '
'.print_r($cart, true).'
', ] ); } /** * @return JsonResponse */ public function HandleSaveSmartyIncommingAjaxAction() { $shopId = (int)$this->app->Secure->GetPOST('shopid'); $input = !isset($this->app->Secure->POST['input'])?null:$this->app->Secure->POST['input']; $content = !isset($this->app->Secure->POST['content'])?null:$this->app->Secure->POST['content']; $format = $this->app->Secure->GetPOST('format'); $replaceCart = (int)$this->app->Secure->GetPOST('replacecart'); $active = (int)$this->app->Secure->GetPOST('active'); $shopArr = $this->app->DB->SelectRow( sprintf( 'SELECT `einstellungen_json` FROM `shopexport` WHERE `id` = %d', $shopId ) ); if(!empty($shopArr)) { $json = json_decode($shopArr['einstellungen_json'], true); if(empty($json)) { $json = []; } $json['felder']['transform_cart'] = $content; $json['felder']['transform_cart_format'] = $format; $json['felder']['transform_cart_replace'] = $replaceCart; $json['felder']['transform_cart_active'] = $active; $json['felder']['transform_cart_data'] = $input; $json = json_encode($json); if(!empty($json) && !empty(json_decode($json, true))){ $this->app->DB->Update( sprintf( "UPDATE `shopexport` SET `einstellungen_json` = '%s' WHERE `id` = %d", $this->app->DB->real_escape_string($json), $shopId ) ); } return new JsonResponse( [ 'success' => true, ] ); } return new JsonResponse( [ 'success' => false, 'error' => 'Shop konnte nicht gespeichert werden', ], JsonResponse::HTTP_BAD_REQUEST ); } /** * @param array $array * @param string $rootNode Name des Root-Elements * * @return SimpleXMLElement */ public function convertArrayToSimpleXml($array, $rootNode = 'xml') { $rootNodeCloser = explode(' ', $rootNode); $rootNodeCloser = reset($rootNodeCloser); $xml = new SimpleXMLElement( sprintf('<%s>', $rootNode, $rootNodeCloser) ); $nameSpaces = $this->getNameSpacesByNode($rootNode); $this->arrayToXmlHelper($xml, $array, $nameSpaces); return $xml; } /** * @param string $key * @param array $nameSpaces * * @return array */ protected function getAttributesFromKey($key, $nameSpaces = []) { $keyArr = explode(' ', $key); $nameSpace = null; $node = $keyArr[0]; if(strpos($node, ':') !== false) { list($nameSpaceShort, $node) = explode(':', $node, 2); if($nameSpaceShort !== '' && isset($nameSpaces[$nameSpaceShort])) { $nameSpace = $nameSpaces[$nameSpaceShort]; } } unset($keyArr[0]); $attributes = []; foreach($keyArr as $attr) { if(empty($attr)) { continue; } $attrA = explode('=', $attr,2); if(!empty($attrA[1])) { $attrA[1] = trim($attrA[1],'"'); } $attributes[] = $attrA; } return [$node, $attributes, $nameSpace]; } /** * @see convertArrayToSimpleXml * * @param SimpleXMLElement $xmlObj * @param array $array * @param array $nameSpaces * @param string $parentTag * @param array $attributesFromParent */ protected function arrayToXmlHelper(&$xmlObj, $array, $nameSpaces = [], $parentTag = '', $attributesFromParent = []) { foreach ($array as $key => $value) { if(is_int($key)) { $key = 'item'.$key; } // Wenn kein Knotenname ermittelt werden konnte > den Knoten 'item' nennen $subNodeName = is_int($key) ? 'item' : $key; if(!empty($parentTag) && is_int($key)) { $subNodeName = $parentTag; } list($subNodeName, $attributes, $nameSpace) = $this->getAttributesFromKey($subNodeName, $nameSpaces); if (is_array($value)) { $useParentTag = false;// !empty($key); foreach ($value as $key2 => $value2) { if(!is_int($key2) || !$useParentTag) { $useParentTag = false; break; } } if($useParentTag) { $this->arrayToXmlHelper($xmlObj, $value, $nameSpaces, $subNodeName, $attributes); } else { $subNode = $xmlObj->addChild((string)$subNodeName, null, $nameSpace); if (!empty($attributes)) { foreach ($attributes as $attribute) { $subNode->addAttribute((string)$attribute[0], empty($attribute[1]) ? '' : (string)$attribute[1]); } } elseif(!empty($attributesFromParent)) { foreach ($attributesFromParent as $attribute) { $subNode->addAttribute((string)$attribute[0], empty($attribute[1]) ? '' : (string)$attribute[1]); } } $this->arrayToXmlHelper($subNode, $value, $nameSpaces,$subNodeName); } } else { $subNode = $xmlObj->addChild((string)$subNodeName, htmlspecialchars($value, ENT_QUOTES), $nameSpace); if(!empty($attributes)) { foreach($attributes as $attribute) { $subNode->addAttribute((string)$attribute[0], empty($attribute[1])?'':(string)$attribute[1]); } } elseif(!empty($attributesFromParent)) { foreach($attributesFromParent as $attribute) { $subNode->addAttribute((string)$attribute[0], empty($attribute[1])?'':(string)$attribute[1]); } } } } } /** * @param string $node * * @return array */ protected function getNameSpacesByNode($node) { $nameSpaces = []; $nodeArr = explode(' ', $node); unset($nodeArr[0]); foreach($nodeArr as $nodeVal) { $nodeVal = trim($nodeVal); if(empty($nodeVal)) { continue; } if(preg_match_all('/xmlns(:{0,1})([^=]*)="([^"]+)"/', $nodeVal, $matches)) { $nameSpaces[$matches[2][0]] = $matches[3][0]; } } return $nameSpaces; } /** * @param $id */ protected function loadSmarty($id) { $this->smartydir = 'Modules/Onlineshops'; $this->segment = 'online'.$id;// uniqid('online', true); $this->templateDir = $this->app->erp->GetTMP().$this->smartydir.'/template_'.$id.$this->segment; $this->tmpl = $this->app->Container->get('TransferSmartyTemplate'); if(!is_dir($this->templateDir) && !mkdir($this->templateDir, 0777, true) && !is_dir($this->templateDir)) { return; } $this->tmpl->addTemplateDir($this->segment, $this->templateDir . '/'); try { $this->tmpl->registerPlugin('modifier', 'jsondecode', [$this, 'SmartyJsonDecode']); $this->tmpl->registerPlugin('modifier', 'jsonencode', [$this, 'SmartyJsonEncode']); $this->tmpl->registerPlugin('modifier', 'arraytolist', [$this, 'SmartyArrayToList']); $this->tmpl->registerPlugin('modifier', 'print_r', [$this, 'SmartyPrintR']); $this->tmpl->registerPlugin('modifier', 'preg_replace', 'preg_replace'); $this->tmpl->registerPlugin('modifier', 'substr', 'substr'); $this->tmpl->registerPlugin('modifier', 'strtolower', 'strtolower'); $this->tmpl->registerPlugin('modifier', 'strtoupper', 'strtoupper'); $this->tmpl->registerPlugin('modifier', 'explode', 'explode'); $this->tmpl->registerPlugin('modifier', 'strstr', 'strstr'); $this->tmpl->registerPlugin('modifier', 'strlen', 'strlen'); $this->tmpl->registerPlugin('modifier', 'strtotime', 'strtotime'); $this->tmpl->registerPlugin('modifier', 'intval', 'intval'); } catch (Exception $e) { } } /** * @param string $content * * @return string */ protected function reformatTemplate($content) { return str_replace("\\\n",'', str_replace("\r", '', $content)); } /** * @param array $cartObj * @param string $template * @param int $shopId * @param bool $merge * * @return array */ protected function createCartObjectFromTemplateJson($cartObj, $template, $shopId, $merge = true) { if(!is_dir($this->templateDir) && !mkdir($this->templateDir, 0777, true) && !is_dir($this->templateDir)) { if($merge){ return $cartObj; } return null; } @file_put_contents( $this->templateDir.'/cart_'.$shopId.'.tpl', trim($this->reformatTemplate($template)) ); try { $object = json_decode(json_encode($cartObj)); $this->tmpl->assign('cart', $object); $this->tmpl->assign('cartarray', $cartObj); $this->tmpl->assign('object', $object); $this->tmpl->assign('objectarray', $cartObj); $shop = $this->app->DB->SelectRow(sprintf('SELECT * FROM `shopexport` WHERE `id` = %d', $shopId)); $settings = @json_decode($shop['einstellungen_json'], true); $settings = empty($settings['felder'])?null:$settings['felder']; $this->tmpl->assign( 'shop', $shop ); $this->tmpl->assign( 'shopsettings', json_decode(json_encode($settings)) ); } catch (Exception $e) { if($merge){ return $cartObj; } return null; } try { $content = $this->tmpl->fetch($this->segment, 'cart_' . $shopId . '.tpl'); } catch (Exception $e) { throw $e; } $content = trim($content); $ret = json_decode($content, true); if(!$merge) { return $ret; } return $this->mergeArrays($cartObj, $ret); } /** * @param array $cartObj * @param array $cartWithItemObj * @param string $template * @param int $shopId * @param bool $merge * * @return array */ protected function createCartObjectFromTemplate($cartObj, $cartWithItemObj, $template, $shopId, $merge = true) { if(!is_dir($this->templateDir) && !mkdir($this->templateDir, 0777, true) && !is_dir($this->templateDir)) { if($merge){ return [$cartObj, $cartWithItemObj]; } return [null, null]; } @file_put_contents( $this->templateDir.'/cart_'.$shopId.'.tpl', trim($this->reformatTemplate($template)) ); try { $object = json_decode(json_encode($cartWithItemObj)); $this->tmpl->assign('cart', $object); $this->tmpl->assign('object', $object); }catch (Exception $e) { if($merge){ return [$cartObj, $cartWithItemObj]; } return [null, null]; } try { $content = $this->tmpl->fetch($this->segment, 'cart_' . $shopId . '.tpl'); } catch (Exception $e) { throw $e; } try { $content = trim($content); $xml = new SimpleXMLElement($content); if($xml === false) { $ret = json_decode($content, true); if(is_array($ret)) { if($merge){ return [ $this->mergeArrays($cartObj, $ret), null, ]; } return [$ret, null]; } } $ret = $this->convertSimpleXmlToArray($xml); $retItem = $this->convertSimpleXmlToArray($xml, null, false); if(is_array($ret)) { if($merge){ return [ $this->mergeArrays($cartObj, $ret), $this->mergeArrays($cartWithItemObj, $retItem), ]; } return [$ret, $retItem]; } } catch (Exception $e) { } if($merge){ return [$cartObj, $cartWithItemObj]; } return [null, null]; } /** * @param array $from * @param array $to */ public function mergeArrays($from, $to) { $ret = $from; if(is_array($to)) { foreach($to as $key => $value) { if(!isset($ret[$key])) { $ret[$key] = $value; continue; } if(is_array($value)) { $ret[$key] = $this->mergeArrays($ret[$key], $value); continue; } $ret[$key] = $value; } } return $ret; } }