app = $app; /** @var \Xentral\Components\Logger\Logger $logger */ $this->logger = $this->app->Container->get('Logger'); if($intern){ return; } $this->app->ActionHandlerInit($this); $this->dump=true; $this->app->ActionHandler("list","Shopimporter_ShopifyList"); $this->app->ActionHandler("auth","ImportAuth"); $this->app->ActionHandler("getlist","ImportGetList"); $this->app->ActionHandler("sendlist","ImportSendList"); $this->app->ActionHandler("sendlistlager","ImportSendListLager"); $this->app->ActionHandler("getarticle","ImportGetArticle"); $this->app->ActionHandler("getauftraegeanzahl","ImportGetAuftraegeAnzahl"); $this->app->ActionHandler("getauftrag","ImportGetAuftrag"); $this->app->ActionHandler("deletearticle","ImportDeleteArticle"); $this->app->ActionHandler("deleteauftrag","ImportDeleteAuftrag"); $this->app->ActionHandler("updateauftrag","ImportUpdateAuftrag"); $this->app->ActionHandler("artikelgruppen","ImportArtikelgruppen"); $this->app->ActionHandler("getarticlelist","ImportGetArticleList"); $this->app->ActionHandler("test","ImportTest"); $this->app->ActionHandler("storniereauftrag","ImportStorniereAuftrag"); $this->app->DefaultActionHandler("list"); $this->app->ActionHandlerListen($app); } /** * @return string */ public function getClickByClickHeadline() { return 'Bitte im Shopify Backend eine eigene App für Xentral anlegen und die Zugangsdaten hier eintragen.'; } /** * @param array $data * * @return array */ public function checkApiApp($data) { if(empty($data['data']['ShopifyToken'])) { foreach (['ShopifyURL', 'ShopifyAPIKey', 'ShopifyPassword'] as $field) { if(empty($data['data'][$field])){ return ['success' => false, 'error' => sprintf('%s is empty', $field)]; } } } $shops = $this->app->DB->SelectArr( sprintf( "SELECT `einstellungen_json`, `bezeichnung`,`id` FROM `shopexport` WHERE `modulename` = 'shopimporter_shopify'" ) ); if(empty($shops)) { return [ 'info' => [ 'Shop' => 'Shopify', 'info' => $data['data']['ShopifyURL'], ] ]; } foreach($shops as $shop) { $json = @json_decode($shop['einstellungen_json'], true); if(empty($json['felder']) || empty($json['felder']['ShopifyURL'])) { continue; } if($json['felder']['ShopifyURL'] === $data['data']['ShopifyURL']) { return [ 'success'=>false, 'error' => sprintf('Shop with url %s allready exists', $data['data']['ShopifyURL']) ]; } } return [ 'info' => [ 'Shop' => 'Shopify', 'info' => $data['data']['ShopifyURL'], ] ]; } public function ImportGetArticleList() { $result = $this->adapter->call('products.json?fields=id&limit=100'); $productIds = $result['data']['products']; while(!empty($result['links']['next'])){ $result = $this->adapter->call('products.json?'.$result['links']['next']); $productIds = array_merge($productIds, $result['data']['products']); } $response = array_map(function($value) {return reset($value);}, $productIds); return $response; } public function Install() { $this->app->erp->CheckTable("shopimporter_shopify_auftraege"); $this->app->erp->CheckColumn("id", "int(11)", "shopimporter_shopify_auftraege", "NOT NULL AUTO_INCREMENT"); $this->app->erp->CheckColumn("shop", "INT(11)", "shopimporter_shopify_auftraege", "DEFAULT '0' NOT NULL"); $this->app->erp->CheckColumn("extid", "varchar(32)", "shopimporter_shopify_auftraege", "DEFAULT '' NOT NULL"); $this->app->erp->CheckColumn("status", "INT(11)", "shopimporter_shopify_auftraege", "DEFAULT '0' NOT NULL"); $this->app->erp->CheckColumn("bearbeiter", "varchar(32)", "shopimporter_shopify_auftraege", "DEFAULT '' NOT NULL"); $this->app->erp->CheckColumn("zeitstempel", "TIMESTAMP", "shopimporter_shopify_auftraege", "DEFAULT CURRENT_TIMESTAMP NOT NULL"); $this->app->erp->CheckColumn("transaction_id","varchar(64)","shopimporter_shopify_auftraege","DEFAULT '' NOT NULL"); $this->app->erp->CheckColumn("zahlungsweise","varchar(64)","shopimporter_shopify_auftraege","DEFAULT '' NOT NULL"); $this->app->erp->CheckIndex('shopimporter_shopify_auftraege','shop'); $this->app->erp->CheckIndex('shopimporter_shopify_auftraege','extid'); $this->app->erp->RegisterHook('shopexport_create', 'shopimporter_shopify', 'ShopifyImporterShopexportCreate'); $this->app->erp->RegisterHook('shopexport_show', 'shopimporter_shopify', 'ShopexportShow'); } public function ShopexportShow($id, $obj, $tab) { $json = $id <= 0?null:$this->app->DB->Select( sprintf( "SELECT `einstellungen_json` FROM `shopexport` WHERE `id` = %d AND `shoptyp` = 'intern' AND `modulename` = 'shopimporter_shopify'", $id ) ); if(empty($json)) { return; } $json = json_decode($json,true); if(!empty($json['felder']['locations']) && empty($json['felder']['location'])) { $this->app->Tpl->Add( 'MESSAGE', '
Bitte stellen Sie einen Lagerstandort ein.
' ); } } public function ShopifyImporterShopexportCreate($id) { if($id <= 0 || !$this->app->DB->Select("SELECT id FROM shopexport WHERE shoptyp = 'intern' AND id = '$id' AND modulename = 'shopimporter_shopify' LIMIT 1")){ return; } $this->app->DB->Update("UPDATE shopexport SET positionsteuersaetzeerlauben = 1 WHERE id = $id LIMIT 1"); } public function getKonfig($shopid, $data = null) { $this->app->DB->Select('SELECT transaction_id FROM shopimporter_shopify_auftraege LIMIT 1'); if($this->app->DB->error()){ $this->Install(); } $this->timezone = 'Europe/Berlin'; $this->shopid = $shopid; $this->data = $data; $this->bearbeiter = 'Cronjob'; if(isset($this->app->User) && $this->app->User && method_exists($this->app->User, 'GetName')){ $this->bearbeiter = $this->app->DB->real_escape_string($this->app->User->GetName()); } $einstellungen = $this->app->DB->Select("SELECT einstellungen_json FROM shopexport WHERE id = '$shopid' LIMIT 1"); if(!empty($einstellungen)){ $einstellungen = json_decode($einstellungen,true); } else { return; } $this->ShopifyURL=trim($einstellungen['felder']['ShopifyURL']); if(stripos($this->ShopifyURL,'http') === false){ $this->ShopifyURL = 'https://'.$this->ShopifyURL; } $this->ShopifyAPIKey=$einstellungen['felder']['ShopifyAPIKey']; $this->ShopifyPassword=$einstellungen['felder']['ShopifyPassword']; $this->ShopifyToken = $einstellungen['felder']['ShopifyToken']; if(empty($this->ShopifyToken)) { if(strpos($this->ShopifyURL, 'https://') !== false) { $this->ShopifyURL = 'https://' . $this->ShopifyAPIKey . ':' . $this->ShopifyPassword . '@' . str_replace('https://', '', $this->ShopifyURL); } else{ $this->ShopifyURL = 'http://' . $this->ShopifyAPIKey . ':' . $this->ShopifyPassword . '@' . str_replace('http://', '', $this->ShopifyURL); } } $this->table = 'shopimporter_shopify_auftraege'; $this->partial = (int)$einstellungen['felder']['partial']; $this->logging = (int)$einstellungen['felder']['logging']; $this->variantnameauseigenschaften = (int)$einstellungen['felder']['variantnameauseigenschaften']; $this->optionsnameauseigenschaften = (int)$einstellungen['felder']['optionsnameauseigenschaften']; $this->eigenschaftenzubeschreibung = (int)$einstellungen['felder']['eigenschaftenzubeschreibung']; $this->allow0 = (int)$einstellungen['felder']['allow0']; $this->fulfilledabziehen = (int)$einstellungen['felder']['fulfilledabziehen']; $this->gotpendig = (int)$einstellungen['felder']['gotpendig']; $this->preisalsnetto = (int)$einstellungen['felder']['preisalsnetto']; $this->shopifytracking = (int)$einstellungen['felder']['shopifytracking']; $this->location = $einstellungen['felder']['location']; $this->locations = $einstellungen['felder']['locations']; $this->autofullfilltax = $einstellungen['felder']['autofullfilltax']; if($this->adapter === null){ $this->adapter = new Shopimporter_Shopify_Adapter($this->app, $this->ShopifyURL, $this->shopid, $this->ShopifyToken); } } /** * @param $adapter */ public function setAdapter($adapter){ $this->adapter = $adapter; } public function getAdapter(){ return $this->adapter; } public function EinstellungenStruktur($id = 0) { $options = $this->getKonfig($id,null); if(!empty($this->locations)) { $options = json_decode(base64_decode($this->locations),true); }else{ $options = array(); } return array( 'ausblenden'=>array('abholmodus'=>array('ab_nummer','status')), 'functions'=>array('getarticlelist'), 'felder'=>array( 'logging'=>array('typ'=>'checkbox','bezeichnung'=>'{|Erweiterte Protokollierung|}:'), 'ShopifyURL'=>array('typ'=>'text','bezeichnung'=>'{|Shopify URL|}:','size'=>40), 'ShopifyAPIKey'=>array('typ'=>'text','bezeichnung'=>'{|Shopify API-Key|}:','size'=>40), 'ShopifyPassword'=>array('typ'=>'text','bezeichnung'=>'{|Shopify Passwort|}:','size'=>40), 'ShopifyToken'=>array('typ'=>'text','bezeichnung'=>'{|Shopify Token|}:','size'=>40), 'preisalsnetto'=>array('typ'=>'checkbox', 'bezeichnung'=>'{|Preise als Netto uebertragen|}:', 'default'=>0), 'partial'=>array('typ'=>'checkbox','bezeichnung'=>'{|auch Teilversendete Aufträge abholen|}:'), 'allow0'=>array('typ'=>'checkbox', 'bezeichnung'=>'{|erlaube Verkauf von Varianten mit Lagerzahl 0|}:', 'default'=>1), 'fulfilledabziehen'=>array('typ'=>'checkbox', 'bezeichnung'=>'{|Teilgelieferte Mengen abziehen|}:', 'default'=>0,'defaultcreate'=>1), 'gotpendig'=>array('typ'=>'checkbox', 'bezeichnung'=>'{|auch Pending Payment abholen|}:', 'default'=>0), 'shopifytracking'=>array('typ'=>'checkbox','bezeichnung'=>'{|Tracking E-Mails über Shopify versenden|}:','default'=>0), 'variantnameauseigenschaften'=>array('typ'=>'checkbox','bezeichnung'=>'{|Variantentitel aus Eigenschaften zusammensetzen|}:','default'=>0), 'optionsnameauseigenschaften'=>array('typ'=>'checkbox','bezeichnung'=>'{|Bei Export Optionenname aus Eigenschaftenbezeichnungen zusammensetzen|}:','default'=>0), 'eigenschaftenzubeschreibung'=>array('typ'=>'checkbox','bezeichnung'=>'{|Bei Import Optionen in Shopify zu Artikelbeschreibung übernehmen|}:','default'=>0), 'locations'=>array('typ'=>'hidden'), 'location'=>array('typ'=>'select','bezeichnung'=>'{|Lagerstandort|}:','optionen'=>$options), 'autofullfilltax'=>array('typ'=>'checkbox','bezeichnung'=>'{|Versandsteuer nach Positionen ermitteln|}:'), )); } public function Shopimporter_ShopifyList() { $this->app->DB->Select('SELECT transaction_id FROM shopimporter_shopify_auftraege LIMIT 1'); if($this->app->DB->error()){ $this->Install(); } if($id = $this->app->DB->Select("SELECT id FROM shopexport WHERE modulename = 'shopimporter_shopify' ORDER BY aktiv = 1 DESC LIMIT 1")) { header('Location: index.php?module=onlineshops&action=edit&id='.$id); exit; } $msg = $this->app->erp->base64_url_encode('
Sie können hier die Shops einstellen
'); header('Location: index.php?module=onlineshops&action=list&msg='.$msg); exit; } /** * @return float|null */ public function getTaxRateFromCountries() { $tax = null; $countries = $this->adapter->call('countries.json'); if(empty($countries['data']) || empty($countries['data']['countries'])) { return null; } $xentralCountry = $this->app->erp->Firmendaten('land'); foreach($countries['data']['countries'] as $country) { if($country['code'] !== $xentralCountry) { continue; } if(isset($country['tax'])) { return (float)$country['tax']; } return null; } return null; } // Wenn WaWision Artikel abholt wird diese Funktion aufgerufen / es muss das $data array gefüllt werden public function ImportGetArticle() { $tmp = $this->CatchRemoteCommand('data'); $tax = 1.0 + (float)$this->getTaxRateFromCountries(); $nummer = $tmp['nummer']; if(isset($tmp['nummerintern'])) { $nummer = $tmp['nummerintern']; } $result = $this->adapter->call('products/'.$nummer.'.json'); if(!isset($result['data']['product']) || !isset($result['data']['product']['id'])) { $resultv = $this->adapter->call('variants/'.$nummer.'.json'); if(!empty($resultv['data']['variant']) && !empty($resultv['data']['variant']['product_id'])) { $result = $this->adapter->call('products/'.$resultv['data']['variant']['product_id'].'.json'); }else{ return $resultv['data']; } } if(empty($result['data']['product']) || empty($result['data']['product']['id'])) { $this->error[]='Artikel in der Shop Datenbank nicht gefunden!'; } else { // erlaubte felder $fields = array('name_de','kurztext_de','uebersicht_de','name_en','kurztext_en','uebersicht_en','beschreibung_de','beschreibung_en','metakeywords_de','metakeywords_en','metadescription_de','metadescription_en', 'inaktiv','pseudopreis','lieferzeitmanuell','pseudolager','autolagerlampe','restmenge','gewicht','downloadartikel'); if(isset($result['data']['product'])) { $data['name']=$result['data']['product']['title']; $data['uebersicht_de']=$result['data']['product']['body_html']; $data['hersteller']=$result['data']['product']['vendor']; $data['result'] = $result['data']; $this->adapter->call("products/".$result['data']['product']['id']."/metafields.json", 'POST', array('metafield' => [ 'key' => 'sync_status', 'value' => 1, 'type' => 'number_integer', 'namespace' => 'xentral', ])); if($result['data']['product']['id'] == $nummer) { $data['fremdnummern'][] = [ 'nummer' => $nummer, 'bezeichnung' => $this->bezprodukt, ]; } if(isset($result['data']['product']['options']) && $result['data']['product']['options']) { foreach($result['data']['product']['options'] as $k2 => $v) { $data['matrixprodukt_gruppe'.$v['position']] = $v['name']; foreach($v['values'] as $k3 => $v3) { $data['matrixprodukt_optionen'.$v['position']][] = $v3; } } } if(!empty($result['data']['product']['variants']) && !empty($result['data']['product']['variants'][0])) { if(!empty($resultv)) { foreach($result['data']['product']['variants'] as $k => $v) { if($v['id'] == $resultv['data']['variant']['id']) { $data['variante_von'] = $resultv['data']['variant']['product_id']; $this->adapter->call("variants/".$resultv['variant']['id']."/metafields.json", 'POST', array('metafield' => [ 'key' => 'sync_status', 'value' => 1, 'type' => 'number_integer', 'namespace' => 'xentral', ])); $data['nummer'] = $resultv['data']['variant']['sku']; $data['name'] .= ' '.$resultv['data']['variant']['title']; $data['uebersicht_de']='';//$result['product']['body_html']; // use from parent article $data['hersteller']='';//$result['product']['vendor']; // use from parent article break; } } } else { $k = 0; } if(isset($tmp['nummerintern'])){ unset($data['nummer']); } /* if(isset($tmp['nummerintern']) && isset($result['product']['variants'][$k]['sku']) && $result['product']['variants'][$k]['sku'] != '' && !isset($result['product']['variants'][1])) { $data['nummer'] = $result['product']['variants'][$k]['sku']; }elseif($tmp['nummerintern']){ $data['nummer'] = $this->app->erp->GetNextArtikelnummer("",1,$this->app->DB->Select("SELECT projekt FROM shopexport WHERE id = '".$this->shopid."' LIMIT 1")); }*/ if($result['data']['product']['variants'][$k]['grams']) { $data['gewicht']=$result['data']['product']['variants'][$k]['grams']/1000;//kg }else{ $data['gewicht']=$result['data']['product']['variants'][$k]['weight']; } if(!empty($result['data']['product']['variants'][$k]['taxable'])) { $data['preis_netto'] = $result['data']['product']['variants'][$k]['price'] / $tax; } else{ $data['preis_netto'] = $result['data']['product']['variants'][$k]['price']; } $data['restmenge'] = $result['data']['product']['variants'][$k]['inventory_quantity']; if(!empty($result['data']['product']['variants'][$k]['barcode'])){ $data['ean'] = $result['data']['product']['variants'][$k]['barcode']; } if(!(isset($tmp['nummerintern']) && isset($result['data']['product']['variants'][1]))) { if(!empty($result['data']['product']['variants'][$k]['option1'])){ $data['matrixprodukt_wert1'] = $result['data']['product']['variants'][$k]['option1']; } if(!empty($result['data']['product']['variants'][$k]['option2'])){ $data['matrixprodukt_wert2'] = $result['data']['product']['variants'][$k]['option2']; } if(!empty($result['data']['product']['variants'][$k]['option3'])){ $data['matrixprodukt_wert3'] = $result['data']['product']['variants'][$k]['option3']; } if($nummer == $result['data']['product']['variants'][$k]['id'] && !empty($result['data']['product']['variants'][$k]['sku'])) { $data['artikelnummerausshop'] = $result['data']['product']['variants'][$k]['sku']; $data['fremdnummern'][] = [ 'nummer' => $nummer, 'bezeichnung' => $this->bezvariant, ]; } } $tmpid = null; if(!empty($result['data']['product']['image']) && !empty($result['data']['product']['image']['src'])) { $tmpid = $result['data']['product']['image']['id']; $data['bilder'][] = array('path'=>$result['data']['product']['image']['src'], 'content'=>@base64_encode(@file_get_contents($result['data']['product']['image']['src']))); } if(isset($result['data']['product']['images']) && $result['data']['product']['images']) { foreach($result['data']['data']['product']['images'] as $v) { if($v['id'] != $tmpid) { $data['bilder'][] = array('path'=>$v['src'], 'content'=>@base64_encode(@file_get_contents($v['src']))); } } } if(isset($tmp['nummerintern']) && !empty($result['data']['product']['variants'][1])) { //$data['variante_von'] = $result['product']['variants'][0]['product_id']; $data['shoparticleid'] = $result['data']['product']['variants'][0]['product_id']; if(isset($data['nummer'])){ unset($data['nummer']); } if(isset($data['result'])){ unset($data['result']); } $_data[] = $data; unset($data['uebersicht_de']); if(isset($data['result'])){ unset($data['result']); } $_name = $data['name']; foreach($result['data']['product']['variants'] as $k2 => $v2) { unset($data['nummer'],$data['bilder']); $data['variante_von'] = $result['data']['product']['variants'][$k2]['product_id']; $data['nummerintern'] = $result['data']['product']['variants'][$k2]['id']; $data['shoparticleid'] = $result['data']['product']['variants'][$k2]['id']; $data['name'] = trim($_name . ' '.$result['data']['product']['variants'][$k2]['title']); if(isset($result['data']['product']['variants'][$k2]['sku']) && $result['data']['product']['variants'][$k2]['sku'] != '') { $data['nummer'] = $result['data']['product']['variants'][$k2]['sku']; $data['artikelnummerausshop'] = $result['data']['product']['variants'][$k2]['sku']; }//else $data['nummer'] = $result['product']['variants'][$k2]['id']; if($result['data']['product']['variants'][$k2]['grams']) { $data['gewicht']=$result['data']['product']['variants'][$k2]['grams']/1000;//kg }else{ $data['gewicht']=$result['data']['product']['variants'][$k2]['weight']; } if(!empty($result['data']['product']['variants'][$k2]['taxable'])){ $data['preis_netto'] = $result['data']['product']['variants'][$k2]['price'] / $tax; } else { $data['preis_netto'] = $result['data']['product']['variants'][$k2]['price']; } $data['restmenge'] = $result['data']['product']['variants'][$k2]['inventory_quantity']; if(!empty($result['data']['product']['variants'][$k2]['option1'])){ $data['matrixprodukt_wert1'] = $result['data']['product']['variants'][$k2]['option1']; } if(!empty($result['data']['product']['variants'][$k2]['option2'])){ $data['matrixprodukt_wert2'] = $result['data']['product']['variants'][$k2]['option2']; } if(!empty($result['data']['product']['variants'][$k2]['option3'])){ $data['matrixprodukt_wert3'] = $result['data']['product']['variants'][$k2]['option3']; } if($nummer == $result['data']['product']['variants'][$k2]['id'] && !empty($result['data']['product']['variants'][$k2]['sku'])) { $data['artikelnummerausshop'] = $result['data']['product']['variants'][$k2]['sku']; } if(!empty($result['data']['product']['variants'][$k2]['barcode'])){ $data['ean'] = $result['data']['product']['variants'][$k2]['barcode']; } $data['result'] = $result['data']; $_data[]= $data; } return $_data; } } }else{ $data['name']=$result['data']['product']['title']; $data['uebersicht_de']=$result['data']['product']['body_html']; $data['hersteller']=$result['data']['product']['vendor']; } $this->DumpVar($data); } if($this->app->Conf->Debug ){ $data['result'] = $result['data']; } return $data; } public function ImportTest() {//$result = $this->ApiConnect("/admin/orders.json?status=any&since_id=".$_tmp['ab_nummer']."&limit=25"); //$result = $this->ApiConnect("/admin/orders.json?fulfillment_status=unshipped"); //$result = json_decode($result,true); //$result = "Test"; // $result = $this->ApiConnect('/admin/product_listings.json'); $result = $this->adapter->call('locations.json'); return $result['links']; } // receive all new articles public function ImportSendListLager() { $tmp = $this->CatchRemoteCommand('data'); $bezprodukt = $this->bezprodukt; $bezvariant = $this->bezvariant; //Falls mehrere Locations existieren, hier aufbohren: if(!empty($this->location)) { $locationid = $this->location; }else{ $location = $this->adapter->call('locations.json'); $locationid = $location['data']['locations'][0]['id']; } $anzahl = 0; $ctmp = !empty($tmp)?count($tmp):0; for($i=0;$i<$ctmp;$i++) { if(isset($tmp[$i]['artikel_varianten'])){ foreach ($tmp[$i]['artikel_varianten'] as $key => $value) { $variantid = ''; foreach ($value['artikelnummer_fremdnummern'] as $fkey => $fvalue) { if(strtolower($fvalue['bezeichnung']) === $bezvariant){ $variantid = $fvalue['nummer']; break; } } if($variantid != ''){ $resultv = $this->adapter->call('variants/'.$variantid.'.json'); if(!isset($resultv['data']['errors'])){ $lag = $value['lag']; $pseudolag = $value['pseudolager']; if($pseudolag != '') { $lag=$pseudolag; } $inventoryitemid = $resultv['data']['variant']['inventory_item_id']; $resulti = $this->adapter->call("inventory_levels.json?inventory_item_ids=$inventoryitemid&location_ids=$locationid"); if(!is_array($resulti['data'])){ $this->ShopifyLog('Shopify Lagerzahlübertragung Fehler für Artikel: '.$value['nummer'], $resulti['data']); return 'error: '.$resulti['data']; } $vorhanden = $resulti['data']['inventory_levels'][0]['available']; $adjust = $lag - $vorhanden; if($adjust != 0){ $data = array("location_id" => $locationid, "inventory_item_id"=> $inventoryitemid, "available_adjustment"=> $adjust); $result = $this->adapter->call('inventory_levels/adjust.json', 'POST',$data); $this->ShopifyLog("Sendlistlager A Variant $variantid",$result['data']); } } } } }else{ if(isset($tmp[$i]['artikelnummer_fremdnummern'])){ foreach ($tmp[$i]['artikelnummer_fremdnummern'] as $key => $value) { if(strtolower($value['bezeichnung']) === $bezprodukt){ $productid = $value['nummer']; } if(strtolower($value['bezeichnung']) === $bezvariant){ $variantid = $value['nummer']; } } } if($productid != ''){ if($variantid !=''){ $resultv = $this->adapter->call('variants/'.$variantid.'.json'); if(isset($resultv['data']['errors'])){ $variantid = ''; } } if($variantid == ''){ $result = $this->adapter->call('products/'.$productid.'.json'); $variantid = $result['data']['product']['variants'][0]['id']; $this->FremdnummerInsert($tmp[$i]['artikel'],$variantid,$bezvariant); } } if($variantid != ''){ $resultv = $this->adapter->call('variants/'.$variantid.'.json'); if(isset($resultv['data']['errors'])){ $variantid = ''; } $lageranzahl = $tmp[$i]['anzahl_lager']; $pseudolager = trim($tmp[$i]['pseudolager']); if($pseudolager != '') { $lageranzahl=$pseudolager; } $inventoryitemid = $resultv['data']['variant']['inventory_item_id']; $resulti = $this->adapter->call("inventory_levels.json?inventory_item_ids=$inventoryitemid&location_ids=$locationid"); $vorhanden = $resulti['data']['inventory_levels'][0]['available']; $adjust = floatval($lageranzahl) - floatval($vorhanden); if($adjust != 0){ $data = array("location_id" => $locationid, "inventory_item_id"=> $inventoryitemid, "available_adjustment"=> $adjust); $result = $this->adapter->call('inventory_levels/adjust.json', 'POST',$data); $this->ShopifyLog("Sendlistlager B Variant $variantid",$result['data']); } } } $anzahl++; } return $anzahl; } // artikel von wawision zu shop uebertragen public function ImportSendList() { $shopid = $this->shopid; $location = $this->adapter->call('locations.json'); $locationid = $location['data']['locations'][0]['id']; $tmp = $this->CatchRemoteCommand('data'); $this->DumpVar($tmp); // hier alle Datenfelder sehen $denycontinue = 'continue'; if(!$this->allow0){ $denycontinue = 'deny'; } $anzahl = 0; if($this->preisalsnetto){ $preisart = "preis"; }else{ $preisart = "bruttopreis"; } $shopeinstellungen = $this->app->DB->SelectArr("SELECT * FROM shopexport WHERE id = '".$this->shopid."' AND aktiv = 1 LIMIT 1"); if(!empty($shopeinstellungen)) { $shopeinstellungen = reset($shopeinstellungen); $eigenschaftenuebertragen = $shopeinstellungen['eigenschaftenuebertragen']; $kategorienuebertragen = $shopeinstellungen['kategorienuebertragen']; $shopbilderuebertragen = $shopeinstellungen['shopbilderuebertragen']; $variantenuebertragen = $shopeinstellungen['variantenuebertragen']; $crosssellingartikeluebertragen = $shopeinstellungen['crosssellingartikeluebertragen']; }else{ $eigenschaftenuebertragen = 0; $kategorienuebertragen = 0; $shopbilderuebertragen = 0; $variantenuebertragen = 0; $crosssellingartikeluebertragen = 0; } $bezprodukt = $this->bezprodukt; $bezvariant = $this->bezvariant; $ctmp = !empty($tmp)?count($tmp):0; for($i=0;$i<$ctmp;$i++) { if($tmp[$i]['variante'] && $tmp[$i]['variantevon'] != ''){ return "error: Variantenexport ist nur über den Hauptartikel möglich."; } $artikel = $tmp[$i]['artikel']; if($artikel == 'ignore'){ continue; } $name_de = $tmp[$i]['name_de']; $name_en = $tmp[$i]['name_en']; if(isset($tmp[$i]['artikelnummer'])) { $nummer = $tmp[$i]['artikelnummer']; } else { $nummer = $tmp[$i]['nummer']; } $laststock = $tmp[$i]['restmenge']; $inaktiv = $tmp[$i]['inaktiv']; $shippingtime = $tmp[$i]['lieferzeitmanuell']; $gewicht = str_replace(",", ".", $tmp[$i]['gewicht']); $preis = (float)$tmp[$i][$preisart]; $abverkauf = $tmp[$i]['restmenge']; $kategorie = $tmp[$i]['kategoriename']; $zolltarifnummer = $tmp[$i]['zolltarifnummer']; $metatitle_de = $tmp[$i]['metatitle_de']; $metadescription_de = $tmp[$i]['metadescription_de']; $metakeywords_de = $tmp[$i]['metakeywords_de']; $metatitle_en = $tmp[$i]['metatitle_en']; $metadescription_en = $tmp[$i]['metadescription_en']; $metakeywords_en = $tmp[$i]['metakeywords_en']; $lageranzahl = $tmp[$i]['anzahl_lager']; $pseudopreis = trim($tmp[$i]['pseudopreis']); $ean = $tmp[$i]['ean']; $hersteller = $tmp[$i]['hersteller']; $pseudolager = trim($tmp[$i]['pseudolager']); if($pseudolager != '') $lageranzahl=$pseudolager; $productid = ''; $variantid = ''; $variantidhauptartikel = ''; $eigenschaften = array(); $eigenschaften[] = array( 'namespace' => 'global', 'key' => 'metatitle_de', 'value' => $metatitle_de, 'value_type' => 'string'); $eigenschaften[] = array( 'namespace' => 'global', 'key' => 'metadescription_de', 'value' => $metadescription_de, 'value_type' => 'string'); $eigenschaften[] = array( 'namespace' => 'global', 'key' => 'metakeywords_de', 'value' => $metakeywords_de, 'value_type' => 'string'); $eigenschaften[] = array( 'namespace' => 'ml_en', 'key' => 'title', 'value' => $name_en, 'value_type' => 'string'); $eigenschaften[] = array( 'namespace' => 'ml_en', 'key' => 'description', 'value' => htmlspecialchars_decode($tmp[$i]['uebersicht_en']), 'value_type' => 'string'); $eigenschaften[] = array( 'namespace' => 'ml_en', 'key' => 'title', 'value' => $metatitle_en, 'value_type' => 'string'); $eigenschaften[] = array( 'namespace' => 'ml_en', 'key' => 'meta_description', 'value' => $metadescription_en, 'value_type' => 'string'); $eigenschaften[] = array( 'namespace' => 'ml_en', 'key' => 'metakeywords', 'value' => $metakeywords_en, 'value_type' => 'string'); if(isset($tmp[$i]['freifelder'])){ foreach ($tmp[$i]['freifelder'] as $iso => $ffdata) { foreach ($ffdata as $ffkey => $ffvalue) { $metakey = $ffkey; $metavalue = $ffvalue; if($iso != 'DE'){ $metakey = substr($iso."_".$ffvalue['mapping'],0,30); $metavalue = $ffvalue['wert']; } $eigenschaften[] = array( 'namespace' => 'global', 'key' => $metakey, 'value' => $metavalue, 'value_type' => 'string'); } } } if($eigenschaftenuebertragen){ foreach ($tmp[$i]['eigenschaften'] as $key => $value) { $eigenschaften[] = array( 'namespace' => 'global', 'key' => substr($value['name'],0,30), 'value' => $value['values'], 'value_type' => 'string'); } } if(!empty($tmp[$i]['eigenschaftenuebersetzungen'])){ $eigenschaftenuebersetzungen = array(); foreach ($tmp[$i]['eigenschaftenuebersetzungen'] as $eukey => $euvalue) { $eigenschaftenuebersetzungen[$euvalue['language_from']."_".$euvalue['language_to']][$euvalue['property_from']] = $euvalue['property_to']; $eigenschaftenwerteuebersetzungen[$euvalue['language_from']."_".$euvalue['language_to']][$euvalue['property_value_from']] = $euvalue['property_value_to']; } foreach ($eigenschaftenwerteuebersetzungen as $eutranslationkey => $eutranslationvalues) { if($eutranslationkey!= ''){ foreach ($eutranslationvalues as $eufrom => $euto) { if($eufrom != '' && $euto != ''){ $eigenschaften[] = array( 'namespace' => 'translation_'.$eutranslationkey, 'key' => substr($eufrom,0,30), 'value' => $euto, 'value_type' => 'string'); } } } } foreach ($eigenschaftenuebersetzungen as $eutranslationkey => $eutranslationvalues) { if($eutranslationkey!= ''){ foreach ($eutranslationvalues as $eufrom => $euto) { if($eufrom != '' && $euto != ''){ $eigenschaften[] = array( 'namespace' => 'ktranslation_'.$eutranslationkey, 'key' => substr($eufrom,0,30), 'value' => $euto, 'value_type' => 'string'); } } } } } if(!empty($tmp[$i]['artikelnummer_fremdnummern'])){ foreach ($tmp[$i]['artikelnummer_fremdnummern'] as $key => $value) { if(strtolower($value['bezeichnung']) === $bezprodukt){ $productid = $value['nummer']; } if(strtolower($value['bezeichnung']) === $bezvariant){ $variantid = $value['nummer']; } } } $variantidskumatching = array(); if($productid == '' && $variantid == '' && $tmp[$i]['variantevon'] == ''){ //Suche über Titel $result = $this->adapter->call("products.json?title=".urlencode($name_de)); if(count($result['data']['products']) == 1){ //Artikel gefunden -> ID verwenden $productid = $result['data']['products'][0]['id']; $this->FremdnummerInsert($artikel,$productid,$bezprodukt); foreach ($result['data']['products'][0]['variants'] as $key => $value) { $variantidskumatching[$value['sku']] = $value['id']; } }else if(count($result['data']['products']) > 1){ //zu viel -> Abbruch }else{ //Artikel nicht gefunden -> Neu anlegen } } if(isset($tmp[$i]['artikel_varianten'])){ $allvariantsinactive = true; foreach ($tmp[$i]['artikel_varianten'] as $key => $value) { if(!$value['inaktiv'] && !$value['gesperrt']){ $allvariantsinactive = false; break; } } if(isset($tmp[$i]['matrix_varianten'])){ $matrixtmp = array(); foreach ($tmp[$i]['matrix_varianten']['artikel'] as $key => $value) { foreach ($value as $mkey => $mvalue) { $matrixtmp[$key][$mvalue['name']] = $mvalue['values']; } } foreach ($tmp[$i]['artikel_varianten'] as $key => $value) { $tmp[$i]['artikel_varianten'][$key]['matrix'] = $matrixtmp[$value['artikel']]; } }else{ $optionsname = "Title"; if($eigenschaftenuebertragen && $this->optionsnameauseigenschaften){ if(isset($tmp[$i]['artikel_varianten'])){ if(isset($tmp[$i]['artikel_varianten'][0]['eigenschaften'])){ $optionsteile = array(); foreach ($tmp[$i]['artikel_varianten'][0]['eigenschaften'] as $ekey => $evalue) { $optionsteile[] = $evalue['name']; } if((!empty($optionsteile)?count($optionsteile):0) > 0){ $optionsname = implode(' | ', $optionsteile); } } } } } //Wenn für einen Artikel mit Varianten keine aktive Variante vorliegt: Artikel ausblenden if($allvariantsinactive){ $inaktiv = true; } } $productanlegen = false; $variantanlegen = false; if($productid != ''){ $result = $this->adapter->call('products/'.$productid.'.json'); if(!$result['data']['product']['id']){ $this->app->DB->Delete("DELETE FROM artikelnummer_fremdnummern WHERE artikel='$artikel' AND aktiv='1' AND shopid='$shopid' AND bezeichnung='$bezprodukt'"); $productanlegen = true; $variantidskumatching = array(); } }else{ $productanlegen = true; } if($variantid != ''){ $resultv = $this->adapter->call('variants/'.$variantid.'.json'); if(!$resultv['data']['variant']['id']){ $this->app->DB->Delete("DELETE FROM artikelnummer_fremdnummern WHERE artikel='$artikel' AND aktiv='1' AND shopid='$shopid' AND bezeichnung='$bezvariant'"); $variantanlegen = true; } }else{ $variantanlegen = true; } $matrixvarianthilfsid = ''; $dataproduct = array(); $datavariant = array(); if($tmp[$i]['variante'] && $tmp[$i]['variantevon'] != ''){ //Artikel ist eine Variante -> Export nur über Hauptartikel }else{ $dataproduct['product']['title'] = $name_de; $dataproduct['product']['body_html'] = htmlspecialchars_decode($tmp[$i]['uebersicht_de']); $dataproduct['product']['vendor'] = $hersteller; if($kategorienuebertragen){ $dataproduct['product']['product_type'] = $kategorie; } if(isset($tmp[$i]['artikel_varianten'])){ if(isset($tmp[$i]['matrix_varianten'])){ $counter = 1; foreach ($tmp[$i]['matrix_varianten']['gruppen'] as $key => $value) { $dataproduct['product']['options'][] = array("name" => $key, "position" =>$counter, "values"=>array("x")); $dataproduct['product']['variants'][0]['option'.$counter] = key($value); $counter++; } }else{ $dataproduct['product']['options'][] = array("name" => $optionsname, "position" =>1, "values"=>array("x")); //Variante ohne Matrixartikel $dataproduct['product']['published'] = false; } }else{ $dataproduct['product']['variants'][0]['weight'] = $gewicht; $dataproduct['product']['variants'][0]['price'] = $preis; $dataproduct['product']['variants'][0]['inventory_management'] = "shopify"; $dataproduct['product']['variants'][0]['sku'] = $nummer; $dataproduct['product']['variants'][0]['barcode'] = $ean; $dataproduct['product']['variants'][0]['inventory_policy'] = ($abverkauf?"deny":"continue"); $dataproduct['product']['variants'][0]['metafields'] = array(array( "key" => "harmonized_system_code", "value"=> $zolltarifnummer, "type"=> "text", "namespace"=> "global"), [ 'key' => 'sync_status', 'value' => 1, 'type' => 'number_integer', 'namespace' => 'xentral', ]); if($pseudopreis != ''){ $dataproduct['product']['variants'][0]['compare_at_price'] = round($pseudopreis,2); } } if(!$inaktiv){ $dataproduct['product']['published'] = true; } else { $dataproduct['product']['published'] = false; } if($productanlegen){ $result = $this->adapter->call('products.json','POST', $dataproduct); $this->ShopifyLog("Sendlist POST Artikel $nummer",$result['data']); $productid = $result['data']['product']['id']; if(!isset($result['data']['errors'])){ $this->FremdnummerInsert($artikel,$productid,$bezprodukt); $variantidhauptartikel = $result['data']['product']['variants'][0]['id']; if($variantid == ''){ $variantid = $variantidhauptartikel; $variantanlegen = false; } if(!isset($tmp[$i]['matrix_varianten'])){ $this->FremdnummerInsert($artikel,$variantidhauptartikel,$bezvariant); }else{ $matrixvarianthilfsid = $variantidhauptartikel; } } }else{ $tempvar = $dataproduct['product']['variants']; if(isset($tmp[$i]['artikel_varianten'])){ unset($dataproduct['product']['variants']); } $result = $this->adapter->call('products/'.$productid.'.json','PUT', $dataproduct); $this->ShopifyLog("Sendlist POST Artikel $nummer Product $productid",$result['data']); if(isset($tmp[$i]['artikel_varianten'])){ if(isset($tmp[$i]['matrix_varianten'])){ $matrixvarianthilfsid = $result['data']['product']['variants'][0]['id']; } }else{ $tmpres = $this->adapter->call('variants/'.$variantid.'.json', 'PUT',array('variant' => $tempvar[0])); $this->ShopifyLog("Sendlist PUT Artikel $nummer Variant 0 $variantid", $tmpres['data']); } } $this->ImportSendListLager(); $vorhandenemetafelder = $this->adapter->call("products/$productid/metafields.json", 'GET'); $metafieldkeys = array(); foreach ($vorhandenemetafelder['data']['metafields'] as $key => $value) { $metafieldkeys[$value['key']] = $value['id']; } foreach ($eigenschaften as $key => $value) { if($value['value']){ $this->adapter->call("products/$productid/metafields.json", 'POST', array('metafield' => $value)); }else{ if(array_key_exists($value['key'], $metafieldkeys)){ $metafieldid = $metafieldkeys[$value['key']]; $this->adapter->call("metafields/$metafieldid.json", 'DELETE'); } } } if($shopbilderuebertragen && isset($tmp[$i]['Dateien'])){ $altebilder = $this->adapter->call("products/$productid/images.json"); foreach ($altebilder['data']['images'] as $key => $value) { $this->adapter->call("products/$productid/images/".$value['id'].'.json', 'DELETE'); } foreach ($tmp[$i]['Dateien'] as $key => $value) { $this->adapter->call("products/$productid/images.json", 'POST',array('image' => array('attachment' => $value['datei'], 'filename' => $value['filename']))); } } } if(isset($tmp[$i]['artikel_varianten'])){ $productdata = $this->adapter->call('products/'.$productid.'.json'); foreach ($tmp[$i]['artikel_varianten'] as $key => $value) { $variantid = $this->app->DB->Select("SELECT nummer FROM artikelnummer_fremdnummern WHERE artikel='".$value['artikel']."' AND bezeichnung='$bezvariant' AND shopid='$shopid' AND aktiv='1' LIMIT 1"); if($variantid){ $resultv = $this->adapter->call('variants/'.$variantid.'.json'); if(isset($resultv['data']['errors'])){ $this->app->DB->Delete("DELETE FROM artikelnummer_fremdnummern WHERE artikel='".$value['artikel']."' AND aktiv='1' AND shopid='$shopid' AND bezeichnung='$bezvariant'"); $variantid = ''; } } if(!$variantid){ foreach ($productdata['data']['product']['variants'] as $varkey => $vardata){ if($vardata['sku'] === $value['nummer']){ $variantid = $vardata['id']; $this->FremdnummerInsert($value['artikel'],$variantid,$bezvariant); break; } } } if(!$variantid){ $variantid = $variantidskumatching[$value['nummer']]; if($variantid){ $resultv = $this->adapter->call('variants/'.$variantid.'.json'); if(isset($resultv['data']['errors'])){ $this->app->DB->Delete("DELETE FROM artikelnummer_fremdnummern WHERE artikel='".$value['artikel']."' AND aktiv='1' AND shopid='$shopid' AND bezeichnung='$bezvariant'"); $variantid = ''; }else{ $this->FremdnummerInsert($value['artikel'],$variantid,$bezvariant); } } } //Falls Artikel gesperrt oder inaktiv: Variante nicht übertragen, bzw. von Elternartikel entfernen $deletevariant = false; if($value['gesperrt']){ $deletevariant = true; } if($value['inaktiv']){ $deletevariant = true; } if($deletevariant){ if($variantid){ $this->adapter->call("products/$productid/variants/$variantid.json", 'DELETE'); $this->app->DB->Delete("DELETE FROM artikelnummer_fremdnummern WHERE artikel='".$value['artikel']."' AND aktiv='1' AND shopid='$shopid' AND bezeichnung='$bezvariant'"); $this->ShopifyLog('Sendlist DELETE Variant '.$value['nummer'],json_decode($tmpres,true)); } continue; } $lag = $value['lag']; $pseudolag = $value['pseudolager']; if($pseudolag !== '') { $lag=$pseudolag; } $vabverkauf = $value['restmenge']; $datavariant = array(); $titel = $value['name_de']; if($eigenschaftenuebertragen && $this->variantnameauseigenschaften){ $eigenschaftenwerte = array(); foreach ($value['eigenschaften'] as $ekey => $evalue){ $eigenschaftenwerte[] = $evalue['values']; } if((!empty($eigenschaftenwerte)?count($eigenschaftenwerte):0) > 0){ $titel = implode(' | ', $eigenschaftenwerte); } } $datavariant['title'] = $titel; $datavariant['sku'] = $value['nummer']; $weight = (float)$value['gewicht']; if(strpos($value['gewicht'], ',') !== false){ $weight = (float)str_replace(',','.', $value['gewicht']); } if(!empty($weight)){ $datavariant['weight'] = $weight; } $datavariant['barcode'] = $value['ean']; $datavariant['compare_at_price'] = round($value['pseudopreis'],2); $datavariant['price'] = (float)$value[$preisart]; $datavariant['inventory_management'] = "shopify"; $datavariant['inventory_policy'] = ($vabverkauf?"deny":"continue"); $veigenschaften = array(); $veigenschaften[] = array( "key" => "harmonized_system_code", "value"=> $value['zolltarifnummer'], "type"=> "text", "namespace"=> "global"); $veigenschaften[] = [ 'key' => 'sync_status', 'value' => 1, 'type' => 'number_integer', 'namespace' => 'xentral', ]; $query = sprintf('SELECT uebersicht_en,metatitle_de,metadescription_de,metakeywords_de,name_en,metatitle_en, metadescription_en,metakeywords_en FROM artikel WHERE id=%d', $value['artikel']); $variantenArtikelDaten = $this->app->DB->SelectRow($query); $veigenschaften[] = array( 'namespace' => 'global', 'key' => 'metatitle_de', 'value' => $variantenArtikelDaten['metatitle_de'], 'value_type' => 'string'); $veigenschaften[] = array( 'namespace' => 'global', 'key' => 'metadescription_de', 'value' => $variantenArtikelDaten['metadescription_de'], 'value_type' => 'string'); $veigenschaften[] = array( 'namespace' => 'global', 'key' => 'metakeywords_de', 'value' => $variantenArtikelDaten['metakeywords_de'], 'value_type' => 'string'); $veigenschaften[] = array( 'namespace' => 'ml_en', 'key' => 'title', 'value' => $variantenArtikelDaten['name_en'], 'value_type' => 'string'); $veigenschaften[] = array( 'namespace' => 'ml_en', 'key' => 'description', 'value' => htmlspecialchars_decode($variantenArtikelDaten['uebersicht_en']), 'value_type' => 'string'); $veigenschaften[] = array( 'namespace' => 'ml_en', 'key' => 'title', 'value' => $variantenArtikelDaten['metatitle_en'], 'value_type' => 'string'); $veigenschaften[] = array( 'namespace' => 'ml_en', 'key' => 'meta_description', 'value' => $variantenArtikelDaten['metadescription_en'], 'value_type' => 'string'); $veigenschaften[] = array( 'namespace' => 'ml_en', 'key' => 'metakeywords', 'value' => $variantenArtikelDaten['metakeywords_en'], 'value_type' => 'string'); foreach ($value['freifelder'] as $iso => $ffdata){ foreach ($ffdata as $ffkey => $ffvalue) { $vmetakey = substr($ffkey,0,30); $vmetavalue = $ffvalue; if($iso != 'DE'){ $vmetakey = substr($iso."_".$ffvalue['mapping'],0,30); $vmetavalue = $ffvalue['wert']; } if($vmetavalue != ''){ $veigenschaften[] = array( 'key' => $vmetakey, 'value' => $vmetavalue, 'value_type' => 'string', 'namespace' => 'variant'); } } } if(count($value['eigenschaftenuebersetzungen'])>0){ $eigenschaftenuebersetzungen = array(); $eigenschaftenwerteuebersetzungen = array(); foreach ($value['eigenschaftenuebersetzungen'] as $eukey => $euvalue) { $eigenschaftenuebersetzungen[$euvalue['language_from']."_".$euvalue['language_to']][$euvalue['property_from']] = $euvalue['property_to']; $eigenschaftenwerteuebersetzungen[$euvalue['language_from']."_".$euvalue['language_to']][$euvalue['property_value_from']] = $euvalue['property_value_to']; } foreach ($eigenschaftenwerteuebersetzungen as $eutranslationkey => $eutranslationvalues) { if($eutranslationkey!= ''){ foreach ($eutranslationvalues as $eufrom => $euto) { if($eufrom != '' && $euto != ''){ $veigenschaften[] = array( 'key' => substr($eufrom,0,30), 'value' => $euto, 'value_type' => 'string', 'namespace' => 'vtranslation_'.$eutranslationkey); } } } } foreach ($eigenschaftenuebersetzungen as $eutranslationkey => $eutranslationvalues) { if($eutranslationkey!= ''){ foreach ($eutranslationvalues as $eufrom => $euto) { if($eufrom != '' && $euto != ''){ $veigenschaften[] = array( 'key' => substr($eufrom,0,30), 'value' => $euto, 'value_type' => 'string', 'namespace' => 'vktranslation_'.$eutranslationkey); } } } } } if(array_key_exists($value['artikel'], $tmp[$i]['matrix_varianten']['artikel'])){ $counter = 1; foreach ($tmp[$i]['matrix_varianten']['artikel'][$value['artikel']] as $mvalue) { if($counter <= 3){ $datavariant['option'.$counter] = $mvalue['values']; } $counter +=1; } }else{ $datavariant['option1'] = $titel; } $result = null; if($variantid == ''){ $result = $this->adapter->call('products/'.$productid.'/variants.json', 'POST',array('variant' => $datavariant)); $this->ShopifyLog("Sendlist POST Variant ".$value['nummer'],$result['data']); if(isset($result['data']['errors']) && $matrixvarianthilfsid != ''){ $result = $this->adapter->call('variants/'.$matrixvarianthilfsid.'.json', 'PUT',array('variant' => $datavariant)); $this->ShopifyLog("Sendlist PUT A Variant ".$value['nummer'],$result['data']); $variantid = $matrixvarianthilfsid; $matrixvarianthilfsid = ''; }else{ $variantid = $result['data']['variant']['id']; } $this->FremdnummerInsert($value['artikel'],$variantid,$bezvariant); }else{ $result = $this->adapter->call('variants/'.$variantid.'.json', 'PUT',array('variant' => $datavariant)); $this->ShopifyLog("Sendlist PUT B Variant ".$value['nummer'],$result['data']); } if(!empty($variantid) && !empty($result['data']['variant']['inventory_item_id'])){ $inventoryitemid = $result['data']['variant']['inventory_item_id']; $resulti = $this->adapter->call("inventory_levels.json?inventory_item_ids=$inventoryitemid&location_ids=$locationid"); if(!is_array($resulti['data'])){ $this->ShopifyLog('Shopify Lagerzahlübertragung Fehler für Artikel: '.$value['nummer'], $resulti['data']); return 'error: '.$resulti['data']; } $vorhanden = $resulti['data']['inventory_levels'][0]['available']; $adjust = $lag - $vorhanden; if($adjust != 0){ $data = array("location_id" => $locationid, "inventory_item_id"=> $inventoryitemid, "available_adjustment"=> $adjust); $result = $this->adapter->call('inventory_levels/adjust.json', 'POST',$data); $this->ShopifyLog("Sendlistlager A Variant $variantid",$result['data']); } } if($shopbilderuebertragen && $variantid != ''){ if(isset($value['Dateien'])){ $altebilder = $this->adapter->call("variants/$variantid/images.json"); foreach ($altebilder['data']['images'] as $ikey => $ivalue) { $this->adapter->call("variants/$variantid/images/".$ivalue['id'].'.json', 'DELETE'); } $cdateien = !empty($value['Dateien']['filename'])?count($value['Dateien']['filename'])-1:0; for ($im = $cdateien; $im >= 0; $im--) { $this->adapter->call("products/$productid/images.json", 'POST',array('image' => array('variant_ids' => array($variantid),'attachment' => $value['Dateien']['datei'][$im], 'filename' => $value['Dateien']['filename'][$im]))); } } } $vorhandenemetafeldervariant = $this->adapter->call("variants/$variantid/metafields.json", 'GET'); $metafieldkeysvariant = array(); foreach ($vorhandenemetafeldervariant['data']['metafields'] as $vmkey => $vmvalue) { $metafieldkeysvariant[$vmvalue['key']] = $vmvalue['id']; } foreach ($veigenschaften as $vekey => $vevalue) { if($vevalue['value'] != ''){ $this->adapter->call("variants/$variantid/metafields.json", 'POST', array('metafield' => $vevalue)); }else{ if(array_key_exists($vevalue['key'], $metafieldkeysvariant)){ $metafieldid = $metafieldkeysvariant[$vevalue['key']]; $this->adapter->call("metafields/$metafieldid.json", 'DELETE'); } } } } if(!isset($tmp[$i]['matrix_varianten'])){ //Variante 0 entfernen, falls vorhanden: if($variantidhauptartikel != ''){ $this->adapter->call("variants/$variantidhauptartikel.json", 'DELETE'); $this->app->DB->Delete("DELETE FROM artikelnummer_fremdnummern WHERE artikel='$artikel' AND aktiv='1' AND shopid='$shopid' AND bezeichnung='$bezvariant' AND nummer = '$variantidhauptartikel'"); } } } if($inaktiv){ $this->adapter->call("product_listings/$productid.json", 'DELETE'); }else{ $this->adapter->call("product_listings/$productid.json", 'PUT'); } $productTranslations = []; $productTranslations['de'] = [ 'title' => $name_de, 'meta_title' => $metatitle_de, 'body_html' => htmlspecialchars_decode($tmp[0]['uebersicht_de']), 'meta_description' => $metadescription_de ]; $productTranslations['en'] = [ 'title' => $name_en, 'meta_title' => $metatitle_en, 'body_html' => htmlspecialchars_decode($tmp[0]['uebersicht_en']), 'meta_description' => $metadescription_en ]; foreach ($tmp[0]['texte'] as $explicitTranslation){ $productTranslations[strtolower($explicitTranslation['sprache'])] = [ 'title' => $explicitTranslation['name'], 'meta_title' => $explicitTranslation['meta_title'], 'body_html' => $explicitTranslation['beschreibung_online'], 'meta_description' => $explicitTranslation['meta_description'] ]; } $this->translateProduct($productid, $productTranslations); if(!empty($variantTranslations = $tmp[$i]['matrix_varianten']['texte'])){ $this->translateVariants($productid, $variantTranslations = $tmp[$i]['matrix_varianten']['texte']); } $freeFieldTranslations = []; foreach ($tmp[0]['freifelder'] as $iso => $freeFields){ if($iso === 'DE'){ continue; } foreach ($freeFields as $freeField){ $freeFieldTranslations[$freeField['mapping']][strtolower($iso)] = $freeField['wert']; } } $this->translateFreeFields($productid, $freeFieldTranslations); $anzahl++; } return $anzahl; } // delete an article function ImportDeleteArticle() { return; } function DumpVar($variable) { } // receive all new articles public function ImportArtikelgruppen() { return; $tmp = $this->CatchRemoteCommand('data'); $anzahl = 0; $this->app->DB->Delete("DELETE FROM artikelgruppen"); $ctmp = !empty($tmp)?count($tmp):0; for($i=0;$i<$ctmp;$i++) { $id = $tmp[$i]['id']; $this->app->DB->Insert("INSERT INTO artikelgruppen (id) VALUES ('$id')"); foreach($tmp[$i] as $key=>$value) { $this->app->DB->Update("UPDATE artikelgruppen SET $key='$value' WHERE id='$id' LIMIT 1"); } $anzahl++; } return $anzahl; } //get checksum list from onlineshop public function ImportGetAuftraegeAnzahl() { $tmp = $this->CatchRemoteCommand('data'); if(!empty($tmp['ab_nummer'])){ $tmp['ab_nummer']--; } if(!empty($tmp['ab_nummer'])) { if(!empty($tmp['holeallestati']) && $tmp['holeallestati'] == 1) { $result = $this->adapter->call('orders.json?status=any&since_id='.$tmp['ab_nummer'].'&limit=25'); }else{ $result = $this->adapter->call('orders.json?fulfillment_status=unshipped&since_id='.$tmp['ab_nummer'].'&limit=25'); if(!(isset($result['data']['orders']) && count($result['data']['orders']) >= 25) && $this->partial) { $result2 = $this->adapter->call('orders.json?fulfillment_status=partial&since_id='.$tmp['ab_nummer'].'&limit=25'); if(isset($result2['data']['orders'])) { return count($result['orders'])+count($result2['data']['orders']); } return count($result['orders']); } } if(isset($result['data']['orders'])) { return count($result['data']['orders']); } return 0; }elseif(!empty($tmp['nummer'])) { $result = $this->adapter->call('orders.json?status=any&ids='.$tmp['nummer']); if(!empty($result['data']['orders'])) { return 1; } return 0; }else{ if((int)$tmp['count'] >= 25 || !$this->partial){ return $tmp['count']; } $result2 = $this->adapter->call('orders/count.json?fulfillment_status=partial&financial_status=paid&limit=25'); return (int)$tmp['count']+(int)$result2['data']['count']; } } private function validateDate($date, $format='Y-m-d H:i:s') { if(strpos($date, '.') !== False){ $date = strstr($date, '.', True); } $d = DateTime::createFromFormat($format, $date); $valid = ($d && ($d->format($format) === $date)); if(($valid === False) && ($date != '0000-00-00 00:00:00') && ($date != NULL) && ($date != '')){ if($this->Debug){ $this->DumpVar("ERROR: Falsche Datumsangabe: $date"); } $this->error[] = "ERROR: Falsche Datumsangabe: $date"; } return $valid; } function CheckOldAuftrag($anz = 50) { $arr = $this->app->DB->SelectArr("SELECT id,extid FROM shopimporter_shopify_auftraege WHERE shop = '".$this->shopid."' AND extid <> '' AND transaction_id = '' AND getestet = 0 ORDER BY id LIMIT $anz"); if(!$arr){ return; } foreach($arr as $v) { $i = 0; $checkid = $v['id']; $_tmp['nummer'] = $v['extid']; $result = $this->adapter->call('orders.json?status=any&ids='.$_tmp['nummer']); if(!isset($result['data']['orders']) || !isset($result['data']['orders'][$i]['id']) || !$result['data']['orders'][$i]['id']) { }else{ $transactionsarr = $this->adapter->call('orders/'.$result['data']['orders'][$i]['id'].'/transactions.json'); if(isset($transactionsarr['data']['transactions']) && isset($transactionsarr['data']['transactions'][0])) { $transactionsarr = $transactionsarr['data']['transactions'][0]; if(isset($transactionsarr['data']['authorization']) && (String)$transactionsarr['data']['authorization'] !== '') { if(isset($transactionsarr['data']['receipt']) && isset($transactionsarr['data']['receipt']['transaction_id']) && (String)$transactionsarr['data']['receipt']['transaction_id'] !== '') { $transaction_id = $this->app->DB->real_escape_string($transactionsarr['data']['receipt']['transaction_id']); }else{ $transaction_id = $this->app->DB->real_escape_string($transactionsarr['data']['authorization']); } $this->app->DB->Update("UPDATE shopimporter_shopify_auftraege SET transaction_id = '$transaction_id',zahlungsweise ='".$this->app->DB->real_escape_string((String)$result['orders'][$i]['gateway'])."' WHERE id = '$checkid' LIMIT 1"); } } } $this->app->DB->Update("UPDATE shopimporter_shopify_auftraege SET getestet = 1 WHERE id = '$checkid' LIMIT 1"); } } protected function log(string $message, array $context = []) { if(!$this->logging){ return; } $this->logger->debug($message, $context); } public function ImportGetAuftrag() { $this->log('Shopify Import started'); $alleabholen = false; $_tmp = $this->CatchRemoteCommand('data'); if(!empty($_tmp['archive'])) { $this->archive = true; } $minTime = $this->validateDate($_tmp['datumvon']) ? $_tmp['datumvon'] : 'now - 90 days'; $von = new DateTime($minTime, new DateTimeZone($this->timezone)); $von->setTimeZone(new DateTimeZone('UTC')); $von = $von->format('Y-m-d\\TH:i:s\\Z'); $maxTime = $this->validateDate($_tmp['datumbis']) ? $_tmp['datumbis'] : 'now'; $bis = new DateTime($maxTime, new DateTimeZone($this->timezone)); $bis->setTimeZone(new DateTimeZone("UTC")); $bis = $bis->format("Y-m-d\TH:i:s\Z"); $bismax = new DateTime("now", new DateTimeZone($this->timezone)); $bismax->setTimeZone(new DateTimeZone("UTC")); $bismax = $bismax->format("Y-m-d\TH:i:s\Z"); if(strtotime($bis) > strtotime($bismax)){ $bis = $bismax; } $demomodus = $this->app->DB->Select("SELECT demomodus FROM shopexport WHERE id = '".$this->shopid."' LIMIT 1"); // Wenn man keinen kleinen timeout eingestellt hat und kein Problem damit das es etwas länger dauert, // kann man hier die Anzahl der Aufträge die auf eimal abgeholt werden sollen einstellen. $anzGleich = empty($_tmp['anzgleichzeitig'])? 0 : (int)$_tmp['anzgleichzeitig']; $exitzeitstempel = null; if($anzGleich < 1){ $anzGleich = 1; } $_anzGleich = $anzGleich; if($anzGleich >= 50){ $anzGleich = 100; } if($anzGleich == 1){ $anzGleich = 100; } if(empty($_tmp['nummer'])) { $this->CheckOldAuftrag(); $paid = 'paid'; if($this->gotpendig){ $paid = 'paid,pending'; } if($alleabholen) { $result = $this->adapter->call("orders.json?financial_status=$paid&limit=".$anzGleich."&updated_at_min=".$von."&updated_at_max=".$bis); $result = $result['data']; }else{ $result = $this->adapter->call("orders.json?fulfillment_status=unshipped&financial_status=$paid&limit=".$anzGleich."&updated_at_min=".$von."&updated_at_max=".$bis); $result = $result['data']; if($this->partial) { $result2 = $this->adapter->call("orders.json?fulfillment_status=partial&financial_status=$paid&limit=".$anzGleich."&updated_at_min=".$von."&updated_at_max=".$bis); $result2 = $result2['data']; if(count($result2['orders']) > 0 && count($result['orders']) == 0) { $result = $result2; }elseif(count($result2['orders']) > 0 && count($result['orders']) > 0) { $result['orders'] = array_merge($result['orders'], $result2['orders']); unset($result2); } } } $this->log('Shopify Log at LOC 1649',[ 'querystring' => "1limit=".$anzGleich."&updated_at_min=".$von."&updated_at_max=".$bis ]); if(count($result['orders']) == 0) { $this->log('Finished: order count 0'); return; } $maxzaehler = 40; $startdate = $this->app->DB->Select( "SELECT `startdate` FROM shopexport WHERE `id` = {$this->shopid} AND startdate!= '0000-00-00'" ); $startdate = empty($startdate)?0:(int)strtotime($startdate); //$erg[] = array(0,count($result['orders']),"/admin/orders.json?fulfillment_status=shipped&status=any&financial_status=paid&limit=".$anzGleich."&updated_at_min=".$von."&updated_at_max=".$bis); while(count($result['orders']) >= $anzGleich || count($result['orders']) == 0) { $maxzaehler--; if($maxzaehler <= 0) { if($exitzeitstempel) { $this->app->DB->Insert("INSERT INTO `shopexport_log` (`shopid`,`typ`,`bearbeiter`,`parameter1`,`parameter2`) VALUES ('".$this->shopid."','GetAuftrag','".$this->bearbeiter."','Es sind Aufträge vorhanden, wurden aber nicht abgeholt','')"); date_default_timezone_set($this->timezone); $this->log('Shopify import finished LOC: 1675', ['zeitstempel'=>date("Y-m-d H:i:s",strtotime($exitzeitstempel))]); return array('zeitstempel'=>date("Y-m-d H:i:s",strtotime($exitzeitstempel))); }else{ return ''; } } if(count($result['orders']) == 0) { date_default_timezone_set('UTC'); $von = !empty($zwischen)?$zwischen:$von; $_von = strtotime($von); $_bis = strtotime($bis); $_zwischen = ceil(($_bis + $_von)/2); $zwischen = date('Y-m-d\TH:i:s\Z', $_zwischen); if($alleabholen) { $result = $this->adapter->call("orders.json?financial_status=$paid&limit=".$anzGleich."&updated_at_min=".$von."&updated_at_max=".$zwischen); $result = $result['data']; }else{ $result = $this->adapter->call("orders.json?fulfillment_status=unshipped&financial_status=$paid&limit=".$anzGleich."&updated_at_min=".$von."&updated_at_max=".$zwischen); $this->log('Shopify Log at LOC: 1696', ['querystring'=> "2limit=".$anzGleich."&updated_at_min=".$von."&updated_at_max=".$zwischen]); $result = $result['data']; if($this->partial) { $result2 = $this->adapter->call("orders.json?fulfillment_status=partial&financial_status=$paid&limit=".$anzGleich."&updated_at_min=".$von."&updated_at_max=".$zwischen); $result2 = $result2['data']; if(count($result2['orders']) > 0 && count($result['orders']) == 0) { $result = $result2; }elseif(count($result2['orders']) > 0 && count($result['orders']) > 0) { $result['orders'] = array_merge($result['orders'], $result2['orders']); unset($result2); } } } $this->log('Shopify Log at LOC 1715', [ 'von' => date('Y-m-d\TH:i:s\Z', $von), 'zwischen' => date('Y-m-d\TH:i:s\Z', $zwischen), 'bis' => date('Y-m-d\TH:i:s\Z', $bis), ]); $erg[] = array(3,count($result['orders']), "orders/count.json?fulfillment_status=shipped&status=any&financial_status=$paid&updated_at_min=".$von."&updated_at_max=".$zwischen); if((count($result['orders']) < $anzGleich) && count($result['orders']) > 0){ break; } if(count($result['orders']) == 0){ $exitzeitstempel = $zwischen; } }else{ date_default_timezone_set('UTC'); $_von = strtotime($von); if(isset($zwischen)) { $_bis = strtotime($zwischen); }else{ $_bis = strtotime($bis); } $_zwischen = ceil(($_bis + $_von)/2); $zwischen = date('Y-m-d\TH:i:s\Z', $_zwischen); if($alleabholen) { $result = $this->adapter->call("orders.json?financial_status=$paid&limit=".$anzGleich."&updated_at_min=".$von."&updated_at_max=".$zwischen); $result = $result['data']; }else{ $result = $this->adapter->call("orders.json?fulfillment_status=unshipped&financial_status=$paid&limit=".$anzGleich."&updated_at_min=".$von."&updated_at_max=".$zwischen); $result = $result['data']; if($this->partial) { $result2 = $this->adapter->call("orders.json?fulfillment_status=partial&financial_status=$paid&limit=".$anzGleich."&updated_at_min=".$von."&updated_at_max=".$zwischen); $result2 = $result2['data']; if(count($result2['orders']) > 0 && count($result['orders']) == 0) { $result = $result2; }elseif(count($result2['orders']) > 0 && count($result['orders']) > 0) { $result['orders'] = array_merge($result['orders'], $result2['orders']); unset($result2); } } } $this->log('Shopify Log at LOC: 1764', [ 'querystring' => "3limit=".$anzGleich."&updated_at_min=".$von."&updated_at_max=".$zwischen, 'von' => date('Y-m-d\TH:i:s\Z', $_von), 'zwischen' => date('Y-m-d\TH:i:s\Z', $zwischen), 'bis' => date('Y-m-d\TH:i:s\Z', $_bis), ]); if((count($result['orders']) < $anzGleich) && count($result['orders']) > 0){ break; } if(count($result['orders']) == 0){ $exitzeitstempel = $zwischen; } } } }else{ if(!empty($_tmp['ab_nummer'])){ $_tmp['ab_nummer']--; } if(!empty($_tmp['ab_nummer'])) { if(!empty($_tmp['holeallestati']) && $_tmp['holeallestati'] == 1) { $result = $this->adapter->call('orders.json?status=any&since_id='.$_tmp['ab_nummer']); $result = $result['data']; }else{ $result = $this->adapter->call('orders.json?fulfillment_status=unshipped&since_id='.$_tmp['ab_nummer']); $result = $result['data']; if($this->partial) { $result2 = $this->adapter->call('orders.json?fulfillment_status=partial&since_id='.$_tmp['ab_nummer']); $result2 = $result2['data']; if(count($result2['orders']) > 0 && count($result['orders']) == 0) { $result = $result2; }elseif(count($result2['orders']) > 0 && count($result['orders']) > 0) { $result['orders'] = array_merge($result['orders'], $result2['orders']); unset($result2); } } } }elseif(!empty($_tmp['nummer'])) { $result = $this->adapter->call('orders.json?status=any&ids='.$_tmp['nummer']); $result = $result['data']; }else{ $result = $this->adapter->call('orders.json?fulfillment_status=unshipped&financial_status=paid&limit=1'); $result = $result['data']; if($this->partial) { $result2 = $this->adapter->call('orders.json?fulfillment_status=partial&financial_status=paid&limit=1'); $result2 = $result2['data']; if(count($result2['orders']) > 0 && count($result['orders']) == 0) { $result = $result2; }elseif(count($result2['orders']) > 0 && count($result['orders']) > 0) { $result['orders'] = array_merge($result['orders'], $result2['orders']); unset($result2); } } } } if($anzGleich >= 1) { $anzahl = count($result['orders']); }else{ $anzahl = 1; } if(($_anzGleich == 1 || $demomodus) && $anzahl > 1){ $anzahl = 1; } $j = -1; for($i = 0; $i < $anzahl; $i++) { $auftrag = (String)$result['orders'][$i]['id']; if($auftrag === ''){ continue; } $this->app->DB->Select('SELECT transaction_id FROM shopimporter_shopify_auftraege LIMIT 1'); if($this->app->DB->error()) { $this->Install(); } if(!$this->archive && ($checkid = $this->app->DB->Select("SELECT id FROM `".$this->table."` WHERE extid = '$auftrag' AND extid <> '' AND shop = '".$this->shopid."' LIMIT 1")))// && (($i < $anzahl - 1) || $j > -1)) { if($result['orders'][$i]['updated_at']) { if($exitzeitstempel) { if(strtotime($exitzeitstempel) < strtotime($result['orders'][$i]['updated_at'])){ $exitzeitstempel = $result['orders'][$i]['updated_at']; } }else{ $exitzeitstempel = $result['orders'][$i]['updated_at']; } } if($this->app->DB->Select("SELECT id FROM shopimporter_shopify_auftraege WHERE id = '$checkid' AND transaction_id = '' LIMIT 1")) { $transactionsarr = $this->adapter->call('orders/'.$result['orders'][$i]['id'].'/transactions.json'); $transactionsarr = $transactionsarr['data']; if(isset($transactionsarr['transactions']) && isset($transactionsarr['transactions'][0])) { $transactionsarr = $transactionsarr['transactions'][0]; if(isset($transactionsarr['authorization']) && (String)$transactionsarr['authorization'] !== '') { if(isset($transactionsarr['receipt']) && isset($transactionsarr['receipt']['transaction_id']) && (String)$transactionsarr['receipt']['transaction_id'] !== '') { $transaction_id = $this->app->DB->real_escape_string($transactionsarr['receipt']['transaction_id']); }else{ $transaction_id = $this->app->DB->real_escape_string($transactionsarr['authorization']); } $this->app->DB->Update("UPDATE shopimporter_shopify_auftraege SET transaction_id = '$transaction_id',zahlungsweise ='".$this->app->DB->real_escape_string((String)$result['orders'][$i]['gateway'])."' WHERE id = '$checkid' LIMIT 1"); } } } continue; } if(!$this->archive && ($result['orders'][$i]['fulfillment_status'] === 'fulfilled' && empty($_tmp['nummer']))) { continue; } $purchaseDate = substr($result['orders'][$i]['created_at'],0,10); if($purchaseDate > 0 && $startdate > strtotime($purchaseDate) && $startdate > 0) { continue; } $j++; $warenkorb = []; $warenkorb2 = []; //if($this->app->Conf->Debug)$warenkorb['result'] = $result; $warenkorb['auftrag'] = $result['orders'][$i]['id']; $warenkorb['auftragsdaten'] = $result['orders'][$i]; $warenkorb['orderData'] = $result['orders'][$i]; date_default_timezone_set($this->timezone); $warenkorb['zeitstempel'] = date('Y-m-d H:i:s',strtotime($result['orders'][$i]['updated_at'])); $warenkorb['gesamtsumme'] = $result['orders'][$i]['total_price']; if(!empty($result['orders'][$i]['note_attributes']) && is_array($result['orders'][$i]['note_attributes']) && count($result['orders'][$i]['note_attributes']) > 0) { foreach($result['orders'][$i]['note_attributes'] as $kn => $vn) { if(isset($vn['name']) && isset($vn['value']) && $vn['name'] === 'vat_id') { $warenkorb['ustid'] = (String)$vn['value']; } elseif ($vn['name'] === 'Delivery-Date' && $vn['value']) { try{ $wunschlieferdatum = DateTime::createFromFormat('d/m/Y', (String)$vn['value']); $warenkorb['lieferdatum'] = $wunschlieferdatum->format('Y-m-d'); unset($result['orders'][$i]['note_attributes'][$kn]); }catch (Exception $x){ } } } } $steuersaetze = []; //$warenkorb['result'] = $result; $warenkorb['transaktionsnummer'] = $result['orders'][$i]['token']; $transactionsarr = $this->adapter->call('/orders/'.$result['orders'][$i]['id'].'/transactions.json'); $transactionsarr = $transactionsarr['data']; $warenkorb['orderData']['transactions'] = $transactionsarr; $warenkorb['zahlungsweise'] = (string)$result['orders'][$i]['gateway']; if(isset($transactionsarr['transactions']) && isset($transactionsarr['transactions'][0])) { foreach($transactionsarr['transactions'] as $transAction) { if(isset($transAction['authorization']) && (string)$transAction['authorization'] !== ''){ if(!empty($transAction['status']) && $transAction['status'] === 'failure') { continue; } $warenkorb['transaktionsnummer'] = $transAction['authorization']; if(!empty($transAction['receipt']) && isset($transAction['receipt']['transaction_id']) && (string)$transAction['receipt']['transaction_id'] !== ''){ $warenkorb['transaktionsnummer'] = $transAction['receipt']['transaction_id']; } if(!empty($transAction['receipt']['user_variable_0']) && $transAction['authorization'] === $transAction['receipt']['transaction']){ $warenkorb['transaktionsnummer'] = $transAction['receipt']['user_variable_0']; } } if( in_array($result['orders'][$i]['financial_status'], ['pending', 'paid']) && !empty($transAction['gateway']) && !empty($transAction['status']) && $transAction['status'] === $result['orders'][$i]['financial_status'] ) { $warenkorb['zahlungsweise'] = (string)$transAction['gateway']; $warenkorb['transaktionsnummer'] = $transAction['authorization']; if(!empty($transAction['receipt']) && isset($transAction['receipt']['transaction_id']) && (string)$transAction['receipt']['transaction_id'] !== ''){ $warenkorb['transaktionsnummer'] = $transAction['receipt']['transaction_id']; } if(!empty($transAction['receipt']['user_variable_0']) && $transAction['authorization'] === $transAction['receipt']['transaction']){ $warenkorb['transaktionsnummer'] = $transAction['receipt']['user_variable_0']; } if($transAction['status'] === 'paid') { break; } } } unset($transAction); } unset($transactionsarr); $warenkorb['onlinebestellnummer'] = $result['orders'][$i]['name']; if(empty($warenkorb['onlinebestellnummer'])){ $warenkorb['onlinebestellnummer'] = $result['orders'][$i]['order_number']; } $taxes_included = (int)$result['orders'][$i]['taxes_included']; if($taxes_included) { $taxFromShippingCountry = !empty( $this->app->DB->Select( sprintf( 'SELECT `steuerfreilieferlandexport` FROM `shopexport` WHERE `id` = %d', $this->shopid ) ) ); $addressField = $taxFromShippingCountry?'shipping_address':'billing_address'; $isTaxFree = $this->app->erp->Export($result['orders'][$i][$addressField]['country_code']); if(!empty($warenkorb['ustid']) && !$isTaxFree) { $isTaxFree = $this->app->erp->IsEU($result['orders'][$i][$addressField]['country_code']); } if($result['orders'][$i]['total_tax'] == 0 && $isTaxFree){ $warenkorb['versandkostennetto'] = $result['orders'][$i]['shipping_lines'][0]['price']; }else{ $warenkorb['versandkostenbrutto'] = $result['orders'][$i]['shipping_lines'][0]['price']; } }else{ if(isset($result['orders'][$i]['shipping_lines'][0]['tax_lines']) && isset($result['orders'][$i]['shipping_lines'][0]['tax_lines'][0]) && isset($result['orders'][$i]['shipping_lines'][0]['tax_lines'][0]['price']) && $result['orders'][$i]['shipping_lines'][0]['tax_lines'][0]['price'] > 0) { if(isset($result['orders'][$i]['shipping_lines'][0]['tax_lines'][0]['rate']) && $result['orders'][$i]['shipping_lines'][0]['tax_lines'][0]['rate'] > 0 && $result['orders'][$i]['shipping_lines'][0]['tax_lines'][0]['rate'] <= 0.1) { $warenkorb['portosteuersatz'] = 'ermaessigt'; } if(isset($result['orders'][$i]['shipping_lines'][0])){ $warenkorb['versandkostenbrutto'] = $result['orders'][$i]['shipping_lines'][0]['price']*(1+$result['orders'][$i]['shipping_lines'][0]['tax_lines'][0]['rate']); } }else{ if(isset($result['orders'][$i]['shipping_lines'][0])){ $warenkorb['versandkostennetto'] = $result['orders'][$i]['shipping_lines'][0]['price']; } } } //$warenkorb[versandkostennetto] = $result[data][invoiceShippingNet]; //TODO $artikelsteuer = 0; foreach ($result['orders'][$i]['line_items'] as $likey => $livalue) { if($livalue['tax_lines'][0]['rate'] > $artikelsteuer){ $artikelsteuer = $livalue['tax_lines'][0]['rate']; } } if($artikelsteuer < 0.1 && $artikelsteuer> 0){ $warenkorb['portosteuersatz'] = 'ermaessigt'; } if(isset($result['orders'][$i]['shipping_lines'][0])){ $warenkorb['lieferung'] = (String)$result['orders'][$i]['shipping_lines'][0]['carrier_identifier']; } if(isset($result['orders'][$i]['shipping_lines'][0]) && $warenkorb['lieferung'] === ''){ $warenkorb['lieferung'] = (String)$result['orders'][$i]['shipping_lines'][0]['title']; } $warenkorb['rabattnetto'] = -abs($result['orders'][$i]['total_discounts']); $warenkorb['rabattsteuer'] = 0; if($result['orders'][$i]['billing_address']['company']!='') { $warenkorb['name'] = $result['orders'][$i]['billing_address']['company']; $warenkorb['ansprechpartner'] = $result['orders'][$i]['billing_address']['name']; if($this->app->DB->Select("SELECT id FROM adresse_typ WHERE type = 'firma' AND aktiv = 1 AND geloescht = 0 LIMIT 1")){ $warenkorb['anrede'] = 'firma'; } } else { $warenkorb['name'] = $result['orders'][$i]['billing_address']['name']; $warenkorb['ansprechpartner'] = ''; $projekt = $this->app->DB->Select("SELECT projekt FROM shopexport WHERE id = '".$this->shopid."' LIMIT 1"); if($this->app->DB->Select("SELECT id FROM adresse_typ WHERE type = 'privat' AND aktiv = 1 AND geloescht = 0 AND (projekt = 0 OR projekt = '".$projekt."') LIMIT 1")){ $warenkorb['anrede'] = 'privat'; } } if(strlen($result['orders'][$i]['billing_address']['address2'])<5){ $warenkorb['strasse'] = $result['orders'][$i]['billing_address']['address1'] . ' ' . $result['orders'][$i]['billing_address']['address2']; } else { $warenkorb['strasse'] = $result['orders'][$i]['billing_address']['address1']; $warenkorb['adresszusatz'] = $result['orders'][$i]['billing_address']['address2']; } $warenkorb['plz'] = $result['orders'][$i]['billing_address']['zip']; $warenkorb['ort'] = $result['orders'][$i]['billing_address']['city']; $warenkorb['land'] = $result['orders'][$i]['billing_address']['country_code']; $warenkorb['email'] = $result['orders'][$i]['contact_email']; if(isset($result['orders'][$i]['billing_address']['province']) && $result['orders'][$i]['billing_address']['province'] != '') { $warenkorb['bundesstaat'] = $result['orders'][$i]['billing_address']['province']; } $warenkorb['waehrung'] = $result['orders'][$i]['currency']; $warenkorb['bestelldatum'] = substr($result['orders'][$i]['created_at'],0,10); $warenkorb['telefon'] = $result['orders'][$i]['billing_address']['phone']; if(!empty($result['orders'][$i]['note'])){ $warenkorb['freitext'] = (String)$result['orders'][$i]['note']; } if(empty($warenkorb['freitext']) && !empty($result['orders'][$i]['note_attributes'][0]) && (String)$result['orders'][$i]['note_attributes'][0]['value'] != '' && (String)$result['orders'][$i]['note_attributes'][0]['value'] != 'true' && (String)$result['orders'][$i]['note_attributes'][0]['value'] != 'false'){ $warenkorb['freitext'] = (String)$result['orders'][$i]['note_attributes'][0]['value']; } //$warenkorb[telefax] = $result[data][billing][fax]; //TODO //$warenkorb[ustid] = $result[data][billing][vatId]; //TODO //$warenkorb[anrede]="firma"; //TODO //if(!$warenkorb['subshop'])$warenkorb['subshop'] = $result[data][customer][shopId]; //$warenkorb[abteilung] = $result[data][billing][department]; //$warenkorb[steuerfrei] = $result[data][taxFree]; //$warenkorb[unterabteilung] = $result[data][billing][additionalAddressLine1]; //TODO if($result['orders'][$i]['shipping_address']['company']!='') { $warenkorb2['lieferadresse_name'] = $result['orders'][$i]['shipping_address']['company']; $warenkorb2['lieferadresse_ansprechpartner'] = $result['orders'][$i]['shipping_address']['name']; } else { $warenkorb2['lieferadresse_name'] = $result['orders'][$i]['shipping_address']['name']; $warenkorb2['lieferadresse_ansprechpartner'] = ''; } if(strlen($result['orders'][$i]['shipping_address']['address2'])<5) { $warenkorb2['lieferadresse_strasse'] = $result['orders'][$i]['shipping_address']['address1'].' '.$result['orders'][$i]['shipping_address']['address2']; $warenkorb2['lieferadresse_adresszusatz'] = ''; } else { $warenkorb2['lieferadresse_strasse'] = $result['orders'][$i]['shipping_address']['address1']; $warenkorb2['lieferadresse_adresszusatz'] = $result['orders'][$i]['shipping_address']['address2']; } $warenkorb2['lieferadresse_plz'] = $result['orders'][$i]['shipping_address']['zip']; $warenkorb2['lieferadresse_ort'] = $result['orders'][$i]['shipping_address']['city']; $warenkorb2['lieferadresse_land'] = $result['orders'][$i]['shipping_address']['country_code']; if(!empty($result['orders'][$i]['shipping_address']['province'])) { $warenkorb2['lieferadresse_bundesstaat'] = $result['orders'][$i]['shipping_address']['province']; } //$warenkorb2[lieferadresse_abteilung] = $result[data][shipping][department]; //TODO //$warenkorb2[lieferadresse_unterabteilung] = $result[data][shipping][additionalAddressLine1]; //TODO $bruttosumme = 0; if($warenkorb2['lieferadresse_name']!=$warenkorb['name'] || $warenkorb2['lieferadresse_ansprechpartner']!=$warenkorb['ansprechpartner'] || $warenkorb2['lieferadresse_strasse']!=$warenkorb['strasse'] || $warenkorb2['lieferadresse_plz']!=$warenkorb['plz'] || $warenkorb2['lieferadresse_ort']!=$warenkorb['ort'] || $warenkorb2['lieferadresse_land']!=$warenkorb['land'] //|| $warenkorb2['lieferadresse_abteilung']!=$warenkorb['abteilung'] ) { $warenkorb['abweichendelieferadresse']="1"; $warenkorb['lieferadresse_name'] = $warenkorb2['lieferadresse_name'] ; $warenkorb['lieferadresse_ansprechpartner'] = $warenkorb2['lieferadresse_ansprechpartner']; $warenkorb['lieferadresse_strasse'] = $warenkorb2['lieferadresse_strasse']; $warenkorb['lieferadresse_plz'] = $warenkorb2['lieferadresse_plz']; $warenkorb['lieferadresse_ort'] = $warenkorb2['lieferadresse_ort']; $warenkorb['lieferadresse_land'] = $warenkorb2['lieferadresse_land']; //$warenkorb['lieferadresse_abteilung'] = $warenkorb2['lieferadresse_abteilung']; //$warenkorb['lieferadresse_unterabteilung'] = $warenkorb2['lieferadresse_unterabteilung']; $warenkorb['lieferadresse_adresszusatz'] = $warenkorb2['lieferadresse_adresszusatz']; if(isset($warenkorb2['lieferadresse_bundesstaat'])){ $warenkorb['lieferadresse_bundesstaat'] = $warenkorb2['lieferadresse_bundesstaat']; } }elseif(empty($warenkorb['telefon']) && !empty($result['orders'][$i]['shipping_address']['phone'])){ $warenkorb['telefon'] = $result['orders'][$i]['shipping_address']['phone']; } unset($warenkorb2); $steuermenge = 0; $citems = !empty($result['orders'][$i]['line_items'])?count($result['orders'][$i]['line_items']):0; $discount_applications_percent = array(); $discount_applications_absolute = array(); $lineDiscounts = []; $lineDiscountsValues = []; $lineDiscountsToItems = []; $linePercentageDiscounts = []; $linePercentageDiscountsValues = []; $linePercentageDiscountsToItems = []; $itemsToLineDiscount = []; $itemsPercentageToLineDiscount = []; $discount_applications_index = -1; $discount_applications_absolute_index = -1; $discount_applications_absolute_sum = 0; $fullprecent_discount = false; $absolute_discount = false; $sumdiscountApplicationsAmount = 0; $shippingDiscountValue = 0; $shippingDiscountName = 0; $fixedApplicationIndexes = []; if(!empty($result['orders'][$i]['discount_applications'])) { $rabattartikelid = $this->app->DB->Select("SELECT artikelrabatt FROM shopexport WHERE id='$this->shopid' LIMIT 1"); $rabattartikelnummer = $this->app->DB->Select("SELECT nummer FROM artikel WHERE id='$rabattartikelid' LIMIT 1"); if($taxes_included && !empty($rabattartikelnummer)) { foreach ($result['orders'][$i]['discount_applications'] as $k => $v) { $isFixedAmount = $v['value_type'] === 'fixed_amount'; $isLineItem = $v['target_type'] === 'line_item'; $isShipping = $v['target_type'] === 'shipping_line'; $isAllocationMethodOne = $v['allocation_method'] === 'one'; $hasCode = !empty($v['code']); $hasTitle = !empty($v['title']); $tmpTotalDiscount = abs($warenkorb['rabattnetto']); //$warenkorb['rabattnetto'] = -abs($result['orders'][$i]['total_discounts']); if($isFixedAmount && $isLineItem && $isAllocationMethodOne && !$hasCode && $hasTitle && abs($v['value']) <= $tmpTotalDiscount){ $found = 0; $lineDiscountsToItem = -1; foreach ($result['orders'][$i]['line_items'] as $likey => $livalue) { if(empty($livalue['discount_allocations'])){ continue; } foreach ($livalue['discount_allocations'] as $discount_allocationVal) { if(!isset($discount_allocationVal['discount_application_index'])){ continue; } if($discount_allocationVal['discount_application_index'] == $k){ $found++; $lineDiscountsToItem = $likey; break; } } } if($found === 1) { $v['nummer'] = $rabattartikelnummer; $lineDiscounts[] = $k; $lineDiscountsValues[] = $v; $lineDiscountsToItems[] = $lineDiscountsToItem; $warenkorb['rabattnetto'] += abs($v['value']); if($result['orders'][$i]['total_discounts'] < 0) { $result['orders'][$i]['total_discounts'] += abs($v['value']); } elseif($result['orders'][$i]['total_discounts'] > 0) { $result['orders'][$i]['total_discounts'] -= abs($v['value']); } unset($result['orders'][$i]['discount_applications'][$k]); } } elseif(!$isFixedAmount && $isLineItem) { $found = 0; $lineDiscountsToItem = -1; foreach ($result['orders'][$i]['line_items'] as $likey => $livalue) { if(empty($livalue['discount_allocations'])){ continue; } foreach ($livalue['discount_allocations'] as $discount_allocationVal) { if(!isset($discount_allocationVal['discount_application_index'])){ continue; } if($discount_allocationVal['discount_application_index'] == $k){ $found++; $lineDiscountsToItem = $likey; break; } } } if($found === 1) { $v['nummer'] = $rabattartikelnummer; $linePercentageDiscounts[] = $k; $linePercentageDiscountsValues[] = $v; $linePercentageDiscountsToItems[] = $lineDiscountsToItem; unset($result['orders'][$i]['discount_applications'][$k]); } } elseif($isShipping && $isFixedAmount) { $shippingDiscount = abs($v['value']); if($shippingDiscount <= $warenkorb['versandkostenbrutto'] && $shippingDiscount <= $tmpTotalDiscount) { $warenkorb['rabattnetto'] += abs($v['value']); $shippingDiscountValue = $shippingDiscount; $shippingDiscountName = !empty($v['description'])?$v['description']:$v['title']; unset($result['orders'][$i]['discount_applications'][$k]); } } } $itemsPercentageToLineDiscount = array_flip($linePercentageDiscountsToItems); $itemsToLineDiscount = array_flip($lineDiscountsToItems); $warenkorb['lineDiscountsValues'] = $lineDiscountsValues; $warenkorb['linePercentageDiscountsValues'] = $linePercentageDiscountsValues; } foreach ($result['orders'][$i]['discount_applications'] as $k => $v) { if(in_array($k, $lineDiscounts)) { continue; } $isFixedAmount = $v['value_type'] === 'fixed_amount'; $isLineItem = $v['target_type'] === 'line_item'; if($isFixedAmount) { $sumdiscountApplicationsAmount += $v['value']; $fixedApplicationIndexes[] = $k; } if($v['value_type'] === 'percentage' && $isLineItem && $v['target_selection'] === 'all'){ $discount_applications_index = $k; if($v['value'] == 100.0) { $fullprecent_discount = true; } } elseif($isFixedAmount && $isLineItem) { $discount_applications_absolute_index = $k; $absolute_discount = true; } } } foreach ($result['orders'][$i]['discount_codes'] as $discount_code){ $warenkorb['gutscheincode'] = $discount_code['code']; } if($sumdiscountApplicationsAmount == 0 || abs($result['orders'][$i]['total_discounts']) != $sumdiscountApplicationsAmount) { $fixedApplicationIndexes = []; } for($ii=0; $ii < $citems; $ii++) { $variante_id = $result['orders'][$i]['line_items'][$ii]['variant_id']; $variante_id = $this->app->DB->Select("SELECT af.nummer FROM `artikelnummer_fremdnummern` af INNER JOIN artikel art ON af.artikel = art.id AND art.geloescht <> 1 AND art.nummer <> 'DEL' WHERE af.nummer = '$variante_id' AND af.nummer <> '' AND af.shopid = '".$this->shopid."' AND af.aktiv = 1 LIMIT 1"); $product_id = $result['orders'][$i]['line_items'][$ii]['product_id']; $product_id = $this->app->DB->Select("SELECT af.nummer FROM `artikelnummer_fremdnummern` af INNER JOIN artikel art ON af.artikel = art.id AND art.geloescht <> 1 AND art.nummer <> 'DEL' WHERE af.nummer = '$product_id' AND af.nummer <> '' AND af.shopid = '".$this->shopid."' AND af.aktiv = 1 LIMIT 1"); $options = []; if($this->eigenschaftenzubeschreibung && !empty($result['orders'][$i]['line_items'][$ii]['properties'])){ foreach ($result['orders'][$i]['line_items'][$ii]['properties'] as $option){ if(!empty($option['name']) && !empty($option['value'])){ $options[] = $option['name'].' : '.$option['value']; } } } if(!empty($options)){ $hilfsarray['options'] = implode("\n",$options); } if($taxes_included) { $taxcol = 'price'; if($warenkorb['rabattnetto'] == 0) { $taxcol = 'rate'; } $articleData = array('articleid'=> empty($result['orders'][$i]['line_items'][$ii]['sku'])? ($variante_id == ''?($product_id == ''?$result['orders'][$i]['line_items'][$ii]['variant_id']:$product_id):$variante_id):$result['orders'][$i]['line_items'][$ii]['sku'], 'fremdnummer'=>$result['orders'][$i]['line_items'][$ii]['variant_id'], 'webid' => $result['orders'][$i]['line_items'][$ii]['id'], 'name'=>$result['orders'][$i]['line_items'][$ii]['name'], 'price'=>$result['orders'][$i]['line_items'][$ii]['price'], 'quantity'=>$result['orders'][$i]['line_items'][$ii]['quantity'], 'price_netto'=>$result['orders'][$i]['line_items'][$ii]['price'] ); if(!empty($options)){ $articleData['options'] = implode("\n",$options); } if(!empty($fixedApplicationIndexes) && !empty($result['orders'][$i]['line_items'][$ii]['discount_allocations'])) { $itemDiscountAllocation = $result['orders'][$i]['line_items'][$ii]['discount_allocations'][0]['discount_application_index']; $discountApplictionByItem = $result['orders'][$i]['discount_applications'][$itemDiscountAllocation]['value']; if(in_array($itemDiscountAllocation, $fixedApplicationIndexes) && $discountApplictionByItem == $result['orders'][$i]['line_items'][$ii]['discount_allocations'][0]['amount'] && $discountApplictionByItem == $result['orders'][$i]['line_items'][$ii]['total_discount'] ) { $articleData['price'] = $result['orders'][$i]['line_items'][$ii]['price']; $articleData['price_netto'] = $result['orders'][$i]['line_items'][$ii]['price'] / ($result['orders'][$i]['line_items'][$ii]['tax_lines'][0][$taxcol] != 0? (1+ (!empty($result['orders'][$i]['line_items'][$ii]['tax_lines'][0]['rate'])?$result['orders'][$i]['line_items'][$ii]['tax_lines'][0]['rate']:0)): 1 ); } } if($discount_applications_absolute_index > -1 && !empty($result['orders'][$i]['line_items'][$ii]['discount_allocations']) && $result['orders'][$i]['line_items'][$ii]['discount_allocations'][0]['discount_application_index'] == $discount_applications_absolute_index) { $ssatz = 100*(!empty($result['orders'][$i]['line_items'][$ii]['tax_lines'][0]['rate'])?$result['orders'][$i]['line_items'][$ii]['tax_lines'][0]['rate']:0); if(empty($discount_applications_absolute[(String)$ssatz])){ $discount_applications_absolute[(String)$ssatz] = 0; } $discount_applications_absolute_sum += $result['orders'][$i]['line_items'][$ii]['discount_allocations'][0]['amount']; $discount_applications_absolute[(String)$ssatz] += $result['orders'][$i]['line_items'][$ii]['discount_allocations'][0]['amount']; } } else { $taxRate = !empty($result['orders'][$i]['line_items'][$ii]['tax_lines'][0]['rate'])?$result['orders'][$i]['line_items'][$ii]['tax_lines'][0]['rate']:0; $articleData = array( 'articleid'=> empty($result['orders'][$i]['line_items'][$ii]['sku'])? ($variante_id == ''?($product_id == ''?$result['orders'][$i]['line_items'][$ii]['variant_id']:$product_id):$variante_id):$result['orders'][$i]['line_items'][$ii]['sku'], 'fremdnummer'=>$result['orders'][$i]['line_items'][$ii]['variant_id'], 'webid' => $result['orders'][$i]['line_items'][$ii]['id'], 'name'=>$result['orders'][$i]['line_items'][$ii]['name'], 'price_netto'=> $result['orders'][$i]['line_items'][$ii]['price'], 'quantity'=>$result['orders'][$i]['line_items'][$ii]['quantity'], 'price'=>$result['orders'][$i]['line_items'][$ii]['price'] * (1+ $taxRate) ); if(!empty($options)){ $articleData['options'] = implode("\n",$options); } if(!empty($fixedApplicationIndexes) && !empty($result['orders'][$i]['line_items'][$ii]['discount_allocations'])) { $itemDiscountAllocation = $result['orders'][$i]['line_items'][$ii]['discount_allocations'][0]['discount_application_index']; $discountApplictionByItem = $result['orders'][$i]['discount_applications'][$itemDiscountAllocation]['value']; if(in_array($itemDiscountAllocation, $fixedApplicationIndexes) && $discountApplictionByItem == $result['orders'][$i]['line_items'][$ii]['discount_allocations'][0]['amount'] && $discountApplictionByItem == $result['orders'][$i]['line_items'][$ii]['total_discount'] ) { $articleData['price'] = $result['orders'][$i]['line_items'][$ii]['price'] * ($result['orders'][$i]['line_items'][$ii]['tax_lines'][0]['price'] != 0? (1+ (!empty($result['orders'][$i]['line_items'][$ii]['tax_lines'][0]['rate'])?$result['orders'][$i]['line_items'][$ii]['tax_lines'][0]['rate']:0)): 1 ); $articleData['price_netto'] = $result['orders'][$i]['line_items'][$ii]['price']; } } } if($result['orders'][$i]['line_items'][$ii]['tax_lines'][0]['rate'] > $steuermenge && !(isset($result['orders'][$i]['line_items'][$ii]['tax_lines'][0]) && $result['orders'][$i]['line_items'][$ii]['tax_lines'][0]['price'] == 0)) { $steuermenge = $result['orders'][$i]['line_items'][$ii]['tax_lines'][0]['rate']; } $isdiscountpercent = !empty($result['orders'][$i]['discount_codes'][0]['amount']) && !empty($result['orders'][$i]['discount_codes'][0]['type']) && $result['orders'][$i]['discount_codes'][0]['type'] === 'percentage' && $discount_applications_index > -1; if(isset($result['orders'][$i]['line_items'][$ii]['tax_lines'][0])) { if($result['orders'][$i]['line_items'][$ii]['tax_lines'][0]['price'] == 0 && !$isdiscountpercent && $result['orders'][$i]['total_price'] == 0 ) { $articleData['steuersatz']=0; $bruttosumme += $articleData['price'] * $articleData['quantity']; $articleData['steuersatz_orig']=$result['orders'][$i]['line_items'][$ii]['tax_lines'][0]['rate']*100; unset($articleData['price']); }else{ $articleData['steuersatz']=$result['orders'][$i]['line_items'][$ii]['tax_lines'][0]['rate']*100; $steuersaetze[(String)round($result['orders'][$i]['line_items'][$ii]['tax_lines'][0]['rate']*100,2)] = true; } } //$this->archive = true; //Debug sent Orders if(!$this->archive){ if($result['orders'][$i]['line_items'][$ii]['fulfillable_quantity'] < $articleData['quantity'] && $this->fulfilledabziehen){ $abziehen = $articleData['quantity'] - $result['orders'][$i]['line_items'][$ii]['fulfillable_quantity']; if($articleData['quantity'] > $abziehen){ $articleData['quantity'] -= $abziehen; if(isset($articleData['price'])){ $warenkorb['gesamtsumme'] -= $articleData['price'] * $abziehen; }else{ $warenkorb['gesamtsumme'] -= $articleData['price_netto'] * $abziehen; } }else{ if(isset($articleData['price'])){ $warenkorb['gesamtsumme'] -= $articleData['price'] * $result['orders'][$i]['line_items'][$ii]['quantity']; }else{ $warenkorb['gesamtsumme'] -= $articleData['price_netto'] * $result['orders'][$i]['line_items'][$ii]['quantity']; } unset($articleData); } } } if(empty($articleData)){ continue; } if(empty($result['orders'][$i]['line_items'][$ii]['tax_lines'])){ $articleData['steuersatz'] = 0; }else{ foreach ($result['orders'][$i]['line_items'][$ii]['tax_lines'] as $taxLine){ if($taxLine['title'] === 'VAT' || $taxLine['rate'] > 0){ $articleData['steuersatz'] = $taxLine['rate']*100; } } } $articlearray[] = $articleData; if($taxes_included) { if(!empty($itemsToLineDiscount) && isset($itemsToLineDiscount[$ii])) { $lineDiscountsValue = $lineDiscountsValues[$itemsToLineDiscount[$ii]]; $articlearray[] = array( 'articleid'=> $lineDiscountsValue['nummer'], 'name'=>$lineDiscountsValue['title'], 'price'=> -abs($lineDiscountsValue['value']), 'quantity'=>1, 'steuersatz' => ( !empty($result['orders'][$i]['line_items'][$ii]['tax_lines'][0]['rate'])? $result['orders'][$i]['line_items'][$ii]['tax_lines'][0]['rate'] * 100: 0 ) ); } if(!empty($itemsPercentageToLineDiscount) && isset($itemsPercentageToLineDiscount[$ii])) { $linePercentageDiscountsKey = $linePercentageDiscounts[$itemsPercentageToLineDiscount[$ii]]; $linePercentageDiscountsValue = $linePercentageDiscountsValues[$itemsPercentageToLineDiscount[$ii]]; if(!empty($result['orders'][$i]['line_items'][$ii]['discount_allocations'])) { foreach($result['orders'][$i]['line_items'][$ii]['discount_allocations'] as $discountAll) { if(isset($discountAll['discount_application_index']) && $discountAll['discount_application_index'] == $linePercentageDiscountsKey) { $rabattItemPrice = -(!empty($discountAll['amount_set']['shop_money']['amount'])?$discountAll['amount_set']['shop_money']['amount']:$discountAll['amount']); if(isset($articlearray[(!empty($articlearray)?count($articlearray):0) -1]['price_netto']) && $articlearray[(!empty($articlearray)?count($articlearray):0) -1]['price_netto'] == -$rabattItemPrice) { unset($articlearray[(!empty($articlearray)?count($articlearray):0) -1]['price_netto']); $articlearray[(!empty($articlearray)?count($articlearray):0) -1]['price'] = abs($rabattItemPrice); } $articlearray[] = array( 'articleid'=> $linePercentageDiscountsValue['nummer'], 'name'=> !empty($linePercentageDiscountsValue['title'])? $linePercentageDiscountsValue['title']: (!empty($linePercentageDiscountsValue['code'])?$linePercentageDiscountsValue['code']:'Rabatt'), 'price'=> $rabattItemPrice, 'quantity'=>1, 'steuersatz' => ( !empty($result['orders'][$i]['line_items'][$ii]['tax_lines'][0]['rate'])? $result['orders'][$i]['line_items'][$ii]['tax_lines'][0]['rate'] * 100: 0 ) ); $itemKey = (!empty($articlearray)?count($articlearray):0) - 2; if(!empty($articlearray[$itemKey]['price_netto']) && round(-$rabattItemPrice, 2) === round($articlearray[$itemKey]['price_netto'] * $articlearray[$itemKey]['quantity'], 2) ) { if(!empty($articlearray[$itemKey]['steuersatz_orig'])) { $articlearray[$itemKey]['steuersatz'] = $articlearray[$itemKey]['steuersatz_orig']; unset($articlearray[$itemKey]['steuersatz_orig']); } $articlearray[$itemKey]['price'] = $articlearray[$itemKey]['price_netto']; unset($articlearray[$itemKey]['price_netto']); } if(isset($warenkorb['rabattnetto'])){ $warenkorb['rabattnetto'] -= $rabattItemPrice; $warenkorb['rabattnetto'] = round($warenkorb['rabattnetto'],5); } if(!empty($warenkorb['rabattnetto']) && abs($warenkorb['rabattnetto']) >= abs($rabattItemPrice)) { if($warenkorb['rabattnetto'] < 0) { $warenkorb['rabattnetto'] += abs($rabattItemPrice); } elseif($warenkorb['rabattnetto'] > 0) { $warenkorb['rabattnetto'] -= abs($rabattItemPrice); } } $lastKey = (!empty($articlearray)?count($articlearray):0) - 1; if($articlearray[$lastKey]['steuersatz'] == 0 && !empty($articlearray[$lastKey]['price']) && !isset($articlearray[$lastKey]['price_netto'])) { if(!empty($articlearray[$lastKey - 1]['price']) && !isset($articlearray[$lastKey - 1]['price_netto']) && round($articlearray[$lastKey - 1]['price'] * $articlearray[$lastKey - 1]['quantity'],2) ==round(- $articlearray[$lastKey]['price'],2) ) { $articlearray[$lastKey - 1]['price_netto'] = $articlearray[$lastKey - 1]['price']; $articlearray[$lastKey - 1]['steuersatz'] = 0; unset($articlearray[$lastKey - 1]['price']); } $articlearray[$lastKey]['price_netto'] = $articlearray[$lastKey]['price']; unset($articlearray[$lastKey]['price']); } break; } } } } } //total_discount } if(isset($result['orders'][$i]['discount_codes']) && is_array($result['orders'][$i]['discount_codes']) && isset($result['orders'][$i]['discount_codes'][0])) { if($result['orders'][$i]['discount_codes'][0]['amount'] && isset($result['orders'][$i]['discount_codes'][0]['type']) && $result['orders'][$i]['discount_codes'][0]['type'] === 'fixed_amount') { $warenkorb['rabattnetto'] = -$result['orders'][$i]['discount_codes'][0]['amount']; $warenkorb['rabattname'] = !empty($result['orders'][$i]['discount_codes'][0]['code'])?$result['orders'][$i]['discount_codes'][0]['code']:'Rabatt'; $bruttosumme += $warenkorb['rabattnetto']; $warenkorb['rabattsteuer'] = 0; if(round($bruttosumme,4) == 0) { foreach($articlearray as $k => $v) { if(isset($v['price_netto']) && !isset($v['price'])) { $articlearray[$k]['price'] = $v['price_netto']; unset($articlearray[$k]['price_netto']); } } } }elseif($result['orders'][$i]['discount_codes'][0]['amount'] && isset($result['orders'][$i]['discount_codes'][0]['type']) && $result['orders'][$i]['discount_codes'][0]['type'] === 'percentage'){ if($discount_applications_index > -1){ foreach ($articlearray as $k => $v) { if( !empty($result['orders'][$i]['line_items'][$k]['discount_allocations']) //&& !empty($v['steuersatz']) ){ foreach($result['orders'][$i]['line_items'][$k]['discount_allocations'] as $kd => $vd) { if(isset($vd['discount_application_index']) && $vd['discount_application_index'] == $discount_applications_index) { $v['steuersatz'] = empty($v['steuersatz'])?'':(String)$v['steuersatz']; if($fullprecent_discount) { if(empty($discount_applications_percent[$v['steuersatz']])){ $discount_applications_percent[$v['steuersatz']] = array('price'=>0,'price_netto'=>0); } if(!empty($v['price'])) { $discount_applications_percent[$v['steuersatz']]['price'] += $v['price'] * $v['quantity']; } if(!empty($v['price_netto'])) { if(!empty($v['price']) && $v['price'] == $v['price_netto'] && !empty($v['steuersatz']) && $v['steuersatz'] != 0) { $articlearray[$k]['price_netto'] = $v['price'] / (1+$v['steuersatz']/100); $v['price_netto'] = $articlearray[$k]['price_netto']; } $discount_applications_percent[$v['steuersatz']]['price_netto'] += $v['price_netto'] * $v['quantity']; } }else{ if(empty($discount_applications_percent[$v['steuersatz']])){ $discount_applications_percent[$v['steuersatz']] = 0; } $discount_applications_percent[$v['steuersatz']] += $vd['amount']; } } } } } } } } if($warenkorb['zahlungsweise'] === '') { if($warenkorb['gesamtsumme'] == 0 && (isset($warenkorb['rabattnetto']) || isset($warenkorb['rabattnetto']))){ $warenkorb['zahlungsweise'] = 'Gutschein'; } } if(isset($warenkorb['rabattnetto']) && $warenkorb['rabattnetto'] == 0) { unset($warenkorb['rabattnetto']); if(isset($warenkorb['rabattname'])){ unset($warenkorb['rabattname']); } } if(!empty($warenkorb['rabattsteuer']) && !empty($warenkorb['rabattnetto'] && !empty($result['orders'][$i]['total_discounts'])) && !empty($result['orders'][$i]['taxes_included']) && $warenkorb['rabattsteuer'] > 0 && $warenkorb['rabattnetto'] > 0 && $warenkorb['rabattnetto'] == $result['orders'][$i]['total_discounts'] ) { $warenkorb['rabattbrutto'] = $warenkorb['rabattnetto']; unset($warenkorb['rabattnetto']); }elseif(!empty($warenkorb['rabattnetto']) && $result['orders'][$i]['tax_inculeded'] && $steuermenge > 0) { if($result['orders'][$i]['total_discount'] + $result['orders'][$i]['subtotal_price'] + (!empty($warenkorb['versandkostenbrutto'])?$warenkorb['versandkostenbrutto']:0) == $result['orders'][$i]['total_line_item_price']) { $warenkorb['rabattnetto'] /= (1+$steuermenge); } } $warenkorb['rabattsteuer'] = $steuermenge*100; if($warenkorb['rabattnetto'] != 0){ $steuersatzzugruppe = array(); $steuergruppen = array(); $summegesamt = 0; foreach ($articlearray as $key => $value) { $steuerart = 'Befreit'; if($value['steuersatz'] > 0){ if($value['steuersatz'] <= 11){ $steuerart = 'Ermaessigt'; }else{ $steuerart = 'Normal'; } } $steuersatzzugruppe[$value['steuersatz']] = $steuerart; $positionskosten = (isset($value['price_netto'])?$value['price_netto']:$value['price'])*$value['quantity']; if(!isset($steuergruppen[$steuerart])){ $steuergruppen[$steuerart] = $positionskosten; }else{ $steuergruppen[$steuerart] += $positionskosten; } $summegesamt += (isset($value['price_netto'])?$value['price_netto']:$value['price'])*$value['quantity']; } if((!empty($steuergruppen)?count($steuergruppen):0) > 1){ if(!empty($discount_applications_absolute) && (!empty($discount_applications_absolute)?count($discount_applications_absolute):0) === 1 && round(-$discount_applications_absolute_sum,2) == round($warenkorb['rabattnetto'],2)){ $absolutekey = array_keys($discount_applications_absolute); $absolutekey = reset($absolutekey); $warenkorb['rabattbrutto'] = $warenkorb['rabattnetto']; $warenkorb['rabattsteuer'] = $absolutekey; unset($warenkorb['rabattnetto']); }elseif(!empty($discount_applications_absolute) && (!empty($discount_applications_absolute)?count($discount_applications_absolute):0) > 1 && round(-$discount_applications_absolute_sum,2) == round($warenkorb['rabattnetto'],2)){ $rabattartikelid = $this->app->DB->Select("SELECT artikelrabatt FROM shopexport WHERE id='$this->shopid' LIMIT 1"); $rabattartikelnummer = $this->app->DB->Select("SELECT nummer FROM artikel WHERE id='$rabattartikelid' LIMIT 1"); foreach($discount_applications_absolute as $steuersatz => $value) { $key = !empty($steuersatzzugruppe[$steuersatz]) ? $steuersatzzugruppe[$steuersatz] : $steuersatz; if(!is_numeric($key)){ $articlearray[] = array( 'articleid' => $rabattartikelnummer, 'name' => 'Rabatt ' . $key, 'quantity' => '1', 'umsatzsteuer' => strtolower($key), 'price' => -abs($value) ); }else{ $articlearray[] = array( 'articleid' => $rabattartikelnummer, 'name' => 'Rabatt ' . $key, 'quantity' => '1', 'steuersatz' => $key, 'price' => -abs($value) ); } if(is_numeric($steuersatz)) { $articlearray[(!empty($articlearray)?count($articlearray):0)-1]['steuersatz'] = $steuersatz; $articlearray[(!empty($articlearray)?(!empty($articlearray)?count($articlearray):0):0)-1]['price_netto'] = $articlearray[count($articlearray)-1]['price'] / (1+$steuersatz/100); } } unset($warenkorb['rabattnetto']); unset($warenkorb['rabattbrutto']); unset($warenkorb['rabattname']); }else{ $rabattartikelid = $this->app->DB->Select("SELECT artikelrabatt FROM shopexport WHERE id='$this->shopid' LIMIT 1"); $rabattartikelnummer = $this->app->DB->Select("SELECT nummer FROM artikel WHERE id='$rabattartikelid' LIMIT 1"); if(!empty($discount_applications_percent)){ if(!$fullprecent_discount){ foreach ($discount_applications_percent as $steuersatz => $value) { $key = !empty($steuersatzzugruppe[$steuersatz]) ? $steuersatzzugruppe[$steuersatz] : $steuersatz; if(!is_numeric($key)){ $articlearray[] = array( 'articleid' => $rabattartikelnummer, 'name' => 'Rabatt ' . $key, 'quantity' => '1', 'umsatzsteuer' => strtolower($key), 'price' => -abs($value) ); }else{ $articlearray[] = array( 'articleid' => $rabattartikelnummer, 'name' => 'Rabatt ' . $key, 'quantity' => '1', 'steuersatz' => $key, 'price' => -abs($value) ); } if(is_numeric($steuersatz)) { $articlearray[(!empty($articlearray)?count($articlearray):0)-1]['steuersatz'] = $steuersatz; $articlearray[(!empty($articlearray)?(!empty($articlearray)?count($articlearray):0):0)-1]['price_netto'] = $articlearray[count($articlearray)-1]['price'] / (1+$steuersatz/100); } } }else{ foreach ($discount_applications_percent as $steuersatz => $value) { $pricekey = !empty($value['price_netto']) && $value['price_netto'] != 0 ? 'price_netto' : 'price'; $key = !empty($steuersatzzugruppe[$steuersatz]) ? $steuersatzzugruppe[$steuersatz] : $steuersatz; if(!is_numeric($key)){ $articlearray[] = array( 'articleid' => $rabattartikelnummer, 'name' => 'Rabatt ' . $key, 'quantity' => '1', 'umsatzsteuer' => strtolower($key), 'steuersatz' => $steuersatz, $pricekey => -abs($value[$pricekey]) ); }else{ $articlearray[] = array( 'articleid' => $rabattartikelnummer, 'name' => 'Rabatt ' . $key, 'quantity' => '1', 'steuersatz' => $key, $pricekey => -abs($value[$pricekey]) ); } } } }else{ foreach ($steuergruppen as $key => $value) { if($value > 0){ $anteil = $value / $summegesamt; $articlearray[] = array( 'articleid' => $rabattartikelnummer, 'name' => 'Rabatt ' . $key, 'quantity' => '1', 'umsatzsteuer' => strtolower($key), 'price' => $warenkorb['rabattnetto'] * $anteil ); } } } unset($warenkorb['rabattnetto']); unset($warenkorb['rabattsteuer']); } } } foreach($articlearray as $key => $value) { if(!empty($value['price']) && !empty($value['price_netto']) && !empty($value['steuersatz']) && $value['price'] == $value['price_netto']) { $articlearray[$key]['price_netto'] /= 1+($value['steuersatz'] / 100); } } $warenkorb['articlelist']=$articlearray; if($result['orders'][$i]['total_tax'] == 0 && $this->app->erp->Export($warenkorb['land'])) { $warenkorb['steuerfrei']=1; } if((!empty($steuersaetze)?count($steuersaetze):0) === 1) { $steuersaetze = array_keys($steuersaetze); $steuersaetze = reset($steuersaetze); if($steuersaetze >= 14) { $warenkorb['umsatzsteuer_normal'] = $steuersaetze; }elseif($steuersaetze <= 10 && $steuersaetze > 0){ $warenkorb['umsatzsteuer_ermassigt'] = $steuersaetze; } }elseif((!empty($steuersaetze)?count($steuersaetze):0) === 2) { $steuersaetze = array_keys($steuersaetze); if($steuersaetze[0] > 0 && $steuersaetze[1] > 0 && $steuersaetze[0] > $steuersaetze[1]) { $warenkorb['umsatzsteuer_normal'] = $steuersaetze[0]; $warenkorb['umsatzsteuer_ermassigt'] = $steuersaetze[1]; }elseif($steuersaetze[0] > 0 && $steuersaetze[1] > 0 && $steuersaetze[0] < $steuersaetze[1]) { $warenkorb['umsatzsteuer_normal'] = $steuersaetze[1]; $warenkorb['umsatzsteuer_ermassigt'] = $steuersaetze[0]; } } if(!empty($steuersaetze) && !empty($warenkorb['lieferadresse_land']) && $result['orders'][$i]['total_tax'] != 0 && $this->app->erp->IstEU($warenkorb['lieferadresse_land']) && !$this->app->erp->Export($warenkorb['lieferadresse_land']) ) { $warenkorb['ust_befreit'] = 1; } if(empty($warenkorb['ust_befreit']) && !empty($warenkorb['rabattnetto']) && empty($warenkorb['rabattbrutto']) && empty($warenkorb['versandkostennetto']) && $result['orders'][$i]['taxes_included'] ) { if((!empty($warenkorb['versandkostenbrutto'])?$warenkorb['versandkostenbrutto']:0)+ $result['orders'][$i]['total_line_items_price'] - $result['orders'][$i]['total_discounts'] == $result['orders'][$i]['total_price'] ){ $warenkorb['rabattbrutto'] = $warenkorb['rabattnetto']; unset($warenkorb['rabattnetto']); } } if(!empty($steuergruppen) && (!empty($steuergruppen)?count($steuergruppen):0) === 1 && empty($warenkorb['rabattsteuer']) && !empty($warenkorb['rabattbrutto']) && empty($warenkorb['rabattnetto'])) { if(!empty($discount_applications_percent) && (!empty($discount_applications_percent)?count($discount_applications_percent):0) === 1){ foreach($discount_applications_percent as $tax_percent => $prices) { if(is_numeric($tax_percent)){ $warenkorb['rabattsteuer'] = $tax_percent; } break; } }elseif(!empty($discount_applications_absolute) && (!empty($discount_applications_absolute)?count($discount_applications_absolute):0) === 1) { foreach($discount_applications_absolute as $tax_percent => $prices) { if(is_numeric($tax_percent)){ $warenkorb['rabattsteuer'] = $tax_percent; } break; } } } if($this->autofullfilltax && empty($warenkorb['versandkostennetto']) && !empty($warenkorb['versandkostenbrutto'])) { if(is_array($steuersaetze) && (!empty($steuersaetze)?count($steuersaetze):0) > 1){ $itemtaxes = []; foreach ($articlearray as $value) { if(!empty($value['steuersatz']) && $value['steuersatz']){ if(!empty($value['price_netto'])){ if(empty($itemtaxes[$value['steuersatz']])){ $itemtaxes[$value['steuersatz']] = 0; } $itemtaxes[$value['steuersatz']] += $value['price_netto'] * $value['quantity']; } } } if((!empty($itemtaxes)?count($itemtaxes):0) > 1){ arsort($itemtaxes); $itemtaxes = array_keys($itemtaxes); $itemtaxes = reset($itemtaxes); if(!empty($warenkorb['umsatzsteuer_normal']) && $itemtaxes == $warenkorb['umsatzsteuer_normal']) { $warenkorb['portosteuersatz'] = 'normal'; }elseif(!empty($warenkorb['umsatzsteuer_ermassigt']) && $itemtaxes == $warenkorb['umsatzsteuer_ermassigt']) { $warenkorb['portosteuersatz'] = 'ermaessigt'; } } }elseif(is_numeric($steuersaetze)) { if(!empty($warenkorb['umsatzsteuer_normal']) && $steuersaetze == $warenkorb['umsatzsteuer_normal']) { $warenkorb['portosteuersatz'] = 'normal'; }elseif(!empty($warenkorb['umsatzsteuer_ermassigt']) && $steuersaetze == $warenkorb['umsatzsteuer_ermassigt']) { $warenkorb['portosteuersatz'] = 'ermaessigt'; } } }elseif($taxes_included && !$this->autofullfilltax && empty($warenkorb['versandkostennetto']) && !empty($warenkorb['versandkostenbrutto'])){ if(!empty($result['orders'][$i]['shipping_lines'][0]) && !empty($result['orders'][$i]['shipping_lines'][0]['tax_lines']) && !empty($result['orders'][$i]['shipping_lines'][0]['tax_lines'][0]['rate']) ){ if(!empty($warenkorb['umsatzsteuer_ermassigt']) && round(100*$result['orders'][$i]['shipping_lines'][0]['tax_lines'][0]['rate'],2) === round($warenkorb['umsatzsteuer_ermassigt'],2)) { $warenkorb['portosteuersatz'] = 'ermaessigt'; }elseif(!empty($warenkorb['umsatzsteuer_normal']) && round(100*$result['orders'][$i]['shipping_lines'][0]['tax_lines'][0]['rate'],2) === round($warenkorb['umsatzsteuer_normal'],2)) { $warenkorb['portosteuersatz'] = 'normal'; } } } if(isset($warenkorb['rabattsteuer']) && $warenkorb['rabattsteuer'] == 0 && !empty($warenkorb['rabattbrutto']) && empty($warenkorb['rabattnetto'])) { $warenkorb['rabattnetto'] = $warenkorb['rabattbrutto']; unset($warenkorb['rabattbrutto']); }elseif(!empty($warenkorb['rabattsteuer']) && $warenkorb['rabattsteuer'] > 0 && !empty($warenkorb['rabattnetto']) && $warenkorb['rabattnetto'] == -$result['orders'][$i]['total_discounts']) { $warenkorb['rabattbrutto'] = $warenkorb['rabattnetto']; unset($warenkorb['rabattnetto']); } if(empty($warenkorb['steuerfrei']) && $taxes_included && ($result['orders'][$i]['total_tax'] == 0)) { $warenkorb = $this->removeNetIfEqualToGross($warenkorb); } $warenkorb = $this->changeNetGrossIfDiscount($warenkorb); $warenkorb = $this->changeItemPercentDiscountTax($warenkorb, $result['orders'][$i]); if($taxes_included && !empty($warenkorb['versandkostenbrutto']) && $warenkorb['versandkostenbrutto'] != 0 && empty($warenkorb['versandkostennetto']) && empty($warenkorb['versandkostensteuersatz'])) { if($warenkorb['portosteuersatz'] === 'ermaessigt' && !empty($warenkorb['umsatzsteuer_ermassigt']) && $warenkorb['umsatzsteuer_ermassigt'] > 0 && $warenkorb['umsatzsteuer_ermassigt'] != $this->app->erp->Firmendaten('steuersatz_ermaessigt')) { $warenkorb['versandkostensteuersatz'] = $warenkorb['umsatzsteuer_ermassigt']; } elseif(!empty($warenkorb['umsatzsteuer_normal']) && $warenkorb['umsatzsteuer_normal'] > 0 && (empty($warenkorb['portosteuersatz']) || $warenkorb['portosteuersatz'] === 'normal') && $warenkorb['umsatzsteuer_normal'] != $this->app->erp->Firmendaten('steuersatz_normal')) { $warenkorb['versandkostensteuersatz'] = $warenkorb['umsatzsteuer_normal']; } } if(!empty($warenkorb['rabattnetto']) && $result['orders'][$i]['total_tax'] > 0){ $warenkorb['rabattbrutto'] = $warenkorb['rabattnetto']; unset($warenkorb['rabattnetto']); } if($shippingDiscountValue > 0) { $shippingDiscountItem = array( 'articleid' => $rabattartikelnummer, 'name' => $shippingDiscountName, 'quantity' => '1', 'umsatzsteuer' => $warenkorb['portosteuersatz'], ); if(!empty($warenkorb['versandkostensteuersatz'])) { $shippingDiscountItem['steuersatz'] = $warenkorb['versandkostensteuersatz']; } foreach ($result['orders'][$i]['shipping_lines'] as $shippingLine){ $shippingDiscountItem['steuersatz'] = 0; if(!empty($shippingLine['tax_lines'])){ foreach ($shippingLine['tax_lines'] as $taxLine){ if($taxLine['title'] === 'VAT' || $taxLine['rate'] > 0){ $shippingDiscountItem['steuersatz'] = $taxLine['rate'] * 100; } } } } $shippingDiscountTax = isset($shippingDiscountItem['steuersatz']) ? $shippingDiscountItem['steuersatz'] : 0; if($shippingDiscountTax > 0){ $shippingDiscountItem['price_netto'] = -$shippingDiscountValue / (1 + $shippingDiscountTax / 100); } elseif($warenkorb['portosteuersatz'] === 'ermaessigt' && !empty($warenkorb['umsatzsteuer_ermassigt'])) { $shippingDiscountTax = $warenkorb['umsatzsteuer_ermassigt']; $shippingDiscountItem['steuersatz'] = $shippingDiscountTax; $shippingDiscountItem['price_netto'] = -$shippingDiscountValue / (1 + $shippingDiscountTax / 100); } elseif($warenkorb['portosteuersatz'] === 'normal' && !empty($warenkorb['umsatzsteuer_normal'])) { $shippingDiscountTax = $warenkorb['umsatzsteuer_normal']; $shippingDiscountItem['steuersatz'] = $shippingDiscountTax; $shippingDiscountItem['price_netto'] = -$shippingDiscountValue / (1 + $shippingDiscountTax / 100); } else{ $shippingDiscountItem['price'] = -$shippingDiscountValue; } $warenkorb['articlelist'][] = $shippingDiscountItem; } if(!empty($warenkorb['rabattbrutto']) && !empty($result['orders'][$i]['total_discounts']) && !empty($rabattartikelnummer)) { $articleListRabatt = 0; foreach($warenkorb['articlelist'] as $subatricle) { if($subatricle['articleid'] == $rabattartikelnummer && !empty($subatricle['price'])) { $articleListRabatt -= $subatricle['price']; } } $rabattbrutto = round($result['orders'][$i]['total_discounts'] - $articleListRabatt,7); if($rabattbrutto == 0) { unset($warenkorb['rabattbrutto']); if(!empty($warenkorb['rabattsteuer'])) { unset($warenkorb['rabattsteuer']); } } elseif($rabattbrutto > 0 && $rabattbrutto < $warenkorb['rabattbrutto']) { $warenkorb['rabattbrutto'] = $rabattbrutto; } } if(!empty($warenkorb['rabattbrutto']) && !isset($warenkorb['rabattnetto']) && !empty($warenkorb['rabattsteuer']) && is_numeric($warenkorb['rabattsteuer']) ) { $warenkorb['rabattnetto'] = $warenkorb['rabattbrutto'] / (1+$warenkorb['rabattsteuer'] / 100); unset($warenkorb['rabattbrutto']); } if($result['orders'][$i]['total_tax'] > 0 && !empty($warenkorb['articlelist'])) { foreach($warenkorb['articlelist'] as $articleKey => $article) { if(!empty($article['steuersatz']) && is_numeric($article['steuersatz']) && isset($article['price']) && !isset($article['price_netto']) ) { $warenkorb['articlelist'][$articleKey]['price_netto'] = $article['price'] / (1+$article['steuersatz'] / 100); } } } if($taxes_included && abs($warenkorb['rabattnetto']) > 0 && $warenkorb['rabattsteuer'] == 0) { $isItemNetGross = true; foreach($warenkorb['articlelist'] as $article) { if(!isset($article['price']) || !isset($article['price_netto']) || $article['price'] != $article['price_netto']) { $isItemNetGross = false; break; } } if($isItemNetGross) { foreach($warenkorb['articlelist'] as $articleKey => $article) { $warenkorb['articlelist'][$articleKey]['steuersatz'] = 0; } } } unset($steuersaetze); unset($articlearray); $tmp[$j]['id'] = $warenkorb['auftrag']; $tmp[$j]['warenkorb'] = base64_encode(serialize($warenkorb)); unset($warenkorb); } if(isset($tmp)) { $this->log('Shopify import finished at LOC: 3023', ['tmp' => $tmp]); return $tmp; } date_default_timezone_set($this->timezone); $this->log('Shopify import finished at LOC: 3029', ['zeitstempel'=>date("Y-m-d H:i:s",strtotime($exitzeitstempel))]); return array('zeitstempel'=>date('Y-m-d H:i:s',strtotime($exitzeitstempel))); } /** * @param array $warenkorb * @param array $order * * @return array */ protected function changeItemDiscountTax($warenkorb, $order) { if(empty($order['taxes_included']) || empty($warenkorb['rabattnetto'])) { return $warenkorb; } if(isset($warenkorb['rabattsteuer']) && $warenkorb['rabattsteuer'] > 0) { return $warenkorb; } if(empty($order['discount_applications']) || count($order['discount_applications']) > 0) { return $warenkorb; } if($order['discount_applications'][0]['value_type'] !== 'percentage' || $order['discount_applications'][0]['target_type'] !== 'line_item' || $order['discount_applications'][0]['value'] != 100.0 ) { return $warenkorb; } $shopexport = $this->app->DB->SelectRow( sprintf( 'SELECT art.umsatzsteuer, s.artikelrabattsteuer FROM shopexport AS s INNER JOIN artikel AS art ON s.artikelrabatt = art.id WHERE s.id = %d', $this->shopid ) ); if(empty($shopexport) || $shopexport['artikelrabattsteuer'] === 0.0 || $shopexport['artikelrabattsteuer'] === 'befreit') { return $warenkorb; } $tax = false; foreach($warenkorb['articlelist'] as $article) { if(!isset($article['steuersatz'])) { return $warenkorb; } if($tax === false) { $tax = $article['steuersatz']; } elseif($tax !== $article['steuersatz']) { return $warenkorb; } } if($tax === false) { return $warenkorb; } if(!empty($warenkorb['umsatzsteuer_ermassigt']) && $tax == $warenkorb['umsatzsteuer_ermassigt'] && $shopexport['artikelrabattsteuer'] === 'ermaessigt' ) { $warenkorb['rabattbrutto'] = $warenkorb['rabattnetto']; unset($warenkorb['rabattnetto']); $warenkorb['rabattsteuer'] = $tax; return $warenkorb; } if(!empty($warenkorb['umsatzsteuer_normal']) && $tax == $warenkorb['umsatzsteuer_normal'] && $shopexport['artikelrabattsteuer'] === 'normal' ) { $warenkorb['rabattbrutto'] = $warenkorb['rabattnetto']; unset($warenkorb['rabattnetto']); $warenkorb['rabattsteuer'] = $tax; return $warenkorb; } return $warenkorb; } /** * @param array $warenkorb * @param array $order * * @return array */ protected function changeItemPercentDiscountTax($warenkorb, $order) { if(empty($order['taxes_included']) || empty($warenkorb['rabattnetto'])) { return $warenkorb; } if(isset($warenkorb['rabattsteuer']) && $warenkorb['rabattsteuer'] > 0) { return $warenkorb; } if(empty($order['discount_applications']) || count($order['discount_applications']) > 0) { return $warenkorb; } if($order['discount_applications'][0]['value_type'] !== 'percentage' || $order['discount_applications'][0]['target_type'] !== 'line_item' || $order['discount_applications'][0]['value'] != 100.0 ) { return $warenkorb; } $shopexport = $this->app->DB->SelectRow( sprintf( 'SELECT art.umsatzsteuer, s.artikelrabattsteuer FROM shopexport AS s INNER JOIN artikel AS art ON s.artikelrabatt = art.id WHERE s.id = %d', $this->shopid ) ); if(empty($shopexport) || $shopexport['artikelrabattsteuer'] === 0.0 || $shopexport['artikelrabattsteuer'] === 'befreit') { return $warenkorb; } $tax = false; foreach($warenkorb['articlelist'] as $article) { if(!isset($article['steuersatz'])) { return $warenkorb; } if($tax === false) { $tax = $article['steuersatz']; } elseif($tax !== $article['steuersatz']) { return $warenkorb; } } if($tax === false) { return $warenkorb; } if(!empty($warenkorb['umsatzsteuer_ermassigt']) && $tax == $warenkorb['umsatzsteuer_ermassigt'] && $shopexport['artikelrabattsteuer'] === 'ermaessigt' ) { $warenkorb['rabattbrutto'] = $warenkorb['rabattnetto']; unset($warenkorb['rabattnetto']); $warenkorb['rabattsteuer'] = $tax; return $warenkorb; } if(!empty($warenkorb['umsatzsteuer_normal']) && $tax == $warenkorb['umsatzsteuer_normal'] && $shopexport['artikelrabattsteuer'] === 'normal' ) { $warenkorb['rabattbrutto'] = $warenkorb['rabattnetto']; unset($warenkorb['rabattnetto']); $warenkorb['rabattsteuer'] = $tax; return $warenkorb; } return $warenkorb; } /** * @param array $warenkorb * * @return array */ protected function changeNetGrossIfDiscount($warenkorb) { if(empty($warenkorb['articlelist'])){ return $warenkorb; } foreach ($warenkorb['articlelist'] as $key => $article){ if($article['steuersatz']===0 && !empty($article['steuersatz_orig'])){ $warenkorb['articlelist'][$key]['steuersatz'] = $article['steuersatz_orig']; } } if($warenkorb['gesamtsumme'] != 0 || empty($warenkorb['rabattnetto'])) { return $warenkorb; } if(!empty($warenkorb['land']) && ($this->app->erp->Export($warenkorb['land']) || $this->app->erp->IstEU($warenkorb['land']))) { return $warenkorb; } $steuersatz = false; $price = 0; foreach($warenkorb['articlelist'] as $articleKey => $article) { if(empty($article['price']) || !empty($article['price_netto'])) { return $warenkorb; } $tmpSteuersatz = !empty($article['steuersatz_orig'])?$article['steuersatz_orig']:$article['steuersatz']; if(empty($tmpSteuersatz)) { return $warenkorb; } if($steuersatz === false) { $steuersatz = $tmpSteuersatz; }elseif($steuersatz != $tmpSteuersatz) { return $warenkorb; } $price += $article['price'] * $article['quantity']; } if(round(-$price,2) === round($warenkorb['rabattnetto'],2)) { $warenkorb['rabattbrutto'] = $warenkorb['rabattnetto']; unset($warenkorb['rabattnetto']); $warenkorb['rabattsteuer'] = $steuersatz; foreach($warenkorb['articlelist'] as $articleKey => $article) { $warenkorb['articlelist'][$articleKey]['steuersatz'] = $steuersatz; } } return $warenkorb; } /** * @param array $warenkorb * * @return array */ protected function removeNetIfEqualToGross($warenkorb) { if(!empty($warenkorb['rabattnetto']) || !empty($warenkorb['rabattbrutto']) || empty($warenkorb['articlelist'])) { return $warenkorb; } if(!empty($warenkorb['versandkostenbrutto']) && !empty($warenkorb['versandkostennetto']) && $warenkorb['versandkostenbrutto'] != $warenkorb['versandkostennetto']) { return $warenkorb; } foreach($warenkorb['articlelist'] as $article) { if(empty($article['price'])) { return $warenkorb; } if(!empty($article['price_netto'])) { if(!empty($article['price']) && $article['price'] != $article['price_netto']) { return $warenkorb; } } } foreach ($warenkorb['articlelist'] as $articleKey => $article) { unset($warenkorb['articlelist']['price_netto']); } if(!empty($warenkorb['versandkostenbrutto']) && !empty($warenkorb['versandkostennetto'])) { unset($warenkorb['versandkostennetto']); } return $warenkorb; } //TODO: Umstellen des Auftrags nach dem er abgeholt wurde auf in inbearbeitung o.ä. public function ImportDeleteAuftrag() { $tmp = $this->CatchRemoteCommand('data'); $bearbeiter = 'Cronjob'; if(!empty($this->app->User) && method_exists($this->app->User,'GetName')){ $bearbeiter = $this->app->DB->real_escape_string($this->app->User->GetName()); } // pruefe ob $tmp[datei] vorhanden wenn nicht lege an sonst update [inhalt] und [checksum] $auftrag = $tmp['auftrag']; if(isset($this->app->DB) && $this->app->DB->connection) { if(!$this->app->DB->Select("SELECT id FROM `".$this->table."` WHERE `extid` = '".$auftrag."' AND shop = '".$this->shopid."' LIMIT 1")) { $this->app->DB->Insert("INSERT INTO `".$this->table."` (`extid`, `zeitstempel`,`shop`,`bearbeiter`) VALUES ('$auftrag', now(),'".$this->shopid."','$bearbeiter')"); } } $this->adapter->call('orders/' . $auftrag . '/metafields.json', 'POST', array('metafield' => [ 'key' => 'sync_status', 'value' => 1, 'type' => 'number_integer', 'namespace' => 'xentral', ])); return 'ok'; } public function ImportStorniereAuftrag() { $tmp = $this->CatchRemoteCommand('data'); $auftrag = $tmp['auftrag']; if($auftrag != ''){ $this->adapter->call('orders/'.$auftrag.'/cancel.json','POST'); $result = $this->adapter->call('orders/'.$auftrag.'.json'); $gesamtpreis = $result['data']['order']['total_price']; $lineitems = array(); if(!empty($result['data']['order']['line_items'])){ foreach ($result['data']['order']['line_items'] as $key => $value) { $lineitems[] = array('line_item_id' => $value['id'], 'quantity' => $value['quantity'],); } } $data = array('refund' => array('amount' => $gesamtpreis, 'refund_line_items' => $lineitems)); $this->adapter->call('orders/'.$auftrag.'/refunds.json','POST',$data); $result = $this->adapter->call('orders/'.$auftrag.'/transactions.json'); $transaktionsid = $result['data']['transactions'][0]['id']; $data = array('transaction' => array('amout' => $gesamtpreis, 'kind' => 'void', 'parent_id' => $transaktionsid)); $this->adapter->call('orders/'.$auftrag.'/transactions.json','POST',$data); $this->adapter->call('orders/' . $auftrag . '/metafields.json', 'POST', array('metafield' => [ 'key' => 'sync_status', 'value' => 3, 'type' => 'number_integer', 'namespace' => 'xentral', ])); } return 'OK'; } public function ImportUpdateAuftrag() { /** @var OrderStatusUpdateRequest $req */ $req = $this->CatchRemoteCommand('data'); if ($req->orderStatus !== OrderStatus::Completed) return; // pruefe ob $tmp[datei] vorhanden wenn nicht lege an sonst update [inhalt] und [checksum] $auftrag = $req->shopOrderId; if(!empty($auftrag)){ $data = array(); $data['fulfillment'] = [ 'tracking_numbers' => $req->getTrackingNumberList(), 'tracking_company' => $req->shipments[0]?->shippingMethod, 'notify_customer' => false, 'tracking_urls' => $req->getTrackingUrlList() ]; if(!empty($this->location)){ $data['fulfillment']['location_id'] = $this->location; } elseif(!empty($this->locations)) { $options = json_decode(base64_decode($this->locations),true); if(!empty($options) && is_array($options)) { if(isset($options[''])){ unset($options['']); } if((!empty($options)?count($options):0) === 1) { $options = array_keys($options); $data['fulfillment']['location_id'] = reset($options); } } } if($this->shopifytracking){ $data['fulfillment']['notify_customer'] = true; } $result = $this->adapter->call('orders/' . $auftrag . '/fulfillments.json', 'POST', $data); if($this->logging){ $this->app->erp->LogFile(array($data, $auftrag, $data, $result['data'])); } $this->adapter->call('orders/' . $auftrag . '/metafields.json', 'POST', array('metafield' => [ 'key' => 'sync_status', 'value' => 2, 'type' => 'number_integer', 'namespace' => 'xentral', ])); }else{ if($this->logging){ $this->app->erp->LogFile(array($data, $auftrag,'Kein Auftrag')); } } return 'OK'; } //TODO fuer Artikelexport // get checksum list from onlineshop public function ImportGetList() { } public function translateVariants($productId, $variantTranslations): void{ $variantsInShopify = $this->adapter->call("products/$productId/variants.json", 'GET'); $translationQuery = 'mutation translationsRegister($resourceId: ID!, $translations: [TranslationInput!]!) { translationsRegister(resourceId: $resourceId, translations: $translations) { translations { key locale outdated value } userErrors { code field message } } }'; foreach ($variantsInShopify['data']['variants'] as $variant){ $variantId = $variant['id']; $digestQuery = '{ translatableResource(resourceId: "gid://shopify/ProductVariant/'.$variantId.'") { resourceId translatableContent { key value digest locale } } }'; $data = ['query' => $digestQuery]; $digestInformation = $this->adapter->call('graphql.json', 'POST', $data, true); $digestMapping = []; foreach ($digestInformation['data']['data']['translatableResource']['translatableContent'] as $information){ $digestMapping[$information['key']] = $information['digest']; } foreach ($variantTranslations['werte'] as $iso => $optionTranslations){ $translationBlocks = []; for ($i = 1; $i <= 3; $i++){ $key = 'option'.$i; if(!empty($variant[$key]) && array_key_exists($variant[$key], $optionTranslations) && array_key_exists($key, $digestMapping)){ $translationBlocks[] = [ 'locale' => strtolower($iso), 'key' => $key, 'value' => $optionTranslations[$variant[$key]], 'translatableContentDigest' => $digestMapping[$key] ]; } } if(empty($translationBlocks)){ continue; } $variables = [ 'resourceId' => $digestInformation['data']['data']['translatableResource']['resourceId'], 'translations' => $translationBlocks ]; $translationRegister = [ 'operationName' => 'translationsRegister', 'query' => $translationQuery, 'variables' => $variables ]; $this->adapter->call('graphql.json', 'POST', $translationRegister, true, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); } } } /** * @param string $productId * @param string $freeFieldTranslationData */ public function translateFreeFields($productId, $freeFieldTranslationData): void { $query = '{ product(id: "gid://shopify/Product/' . $productId . '") {'; $counter = 0; foreach ($freeFieldTranslationData as $metaFieldKey => $x) { $query .= sprintf('metafield_%d: metafield(namespace: "global", key: "%s") { key id}', $counter, $metaFieldKey); $counter++; } $query .= ' } }'; $data = ['query' => $query]; $productKeysData = $this->adapter->call('graphql.json', 'POST', $data, true); $metaFieldIdInformation = []; foreach ($productKeysData['data']['data']['product'] as $metaFieldData) { $metaFieldIdInformation[$metaFieldData['key']] = $metaFieldData['id']; } $translationQuery = 'mutation translationsRegister($resourceId: ID!, $translations: [TranslationInput!]!) { translationsRegister(resourceId: $resourceId, translations: $translations) { translations { key locale outdated value } userErrors { code field message } } }'; foreach ($freeFieldTranslationData as $metaFieldKey => $translationData) { if (!isset($metaFieldIdInformation[$metaFieldKey])) { continue; } $digestQuery = '{ translatableResource(resourceId: "' . $metaFieldIdInformation[$metaFieldKey] . '") { resourceId translatableContent { key value digest } } }'; $data = ['query' => $digestQuery]; $digestInformation = $this->adapter->call('graphql.json', 'POST', $data, true); if (empty($digestInformation['data']['data']['translatableResource']['translatableContent'][0]['digest'])) { continue; } $digest = $digestInformation['data']['data']['translatableResource']['translatableContent'][0]['digest']; $translationBlocks = []; foreach ($translationData as $iso => $translation) { $translationBlocks[] = [ 'locale' => $iso, 'key' => 'value', 'value' => $translation, 'translatableContentDigest' => $digest ]; } if (!empty($translationBlocks)) { $variables = [ 'resourceId' => $metaFieldIdInformation[$metaFieldKey], 'translations' => $translationBlocks ]; $translationRegister = [ 'operationName' => 'translationsRegister', 'query' => $translationQuery, 'variables' => $variables ]; $this->adapter->call('graphql.json', 'POST', $translationRegister, true, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); } } } /** * @param string $productId * @param array $translationData */ public function translateProduct($productId, $translationData): void { $data = ['query' => 'query { translatableResource(resourceId: "gid://shopify/Product/'.$productId.'") { resourceId translatableContent { key value digest locale } } }']; $productInformationData = $this->adapter->call('graphql.json', 'POST', $data, true); $digestInformation = []; foreach ($productInformationData['data']['data']['translatableResource']['translatableContent'] as $information) { $digestInformation[$information['key']] = $information['digest']; } $translationQuery = 'mutation translationsRegister($resourceId: ID!, $translations: [TranslationInput!]!) { translationsRegister(resourceId: $resourceId, translations: $translations) { translations { key locale outdated value } userErrors { code field message } } }'; foreach ($translationData as $iso => $translations) { $translationBlocks = []; foreach ($translations as $key => $translation) { $translationBlocks[] = [ 'locale' => $iso, 'key' => $key, 'value' => $translation, 'translatableContentDigest' => $digestInformation[$key] ]; } if (!empty($translationBlocks)) { $variables = [ 'resourceId' => 'gid://shopify/Product/' . $productId, 'translations' => $translationBlocks ]; $translationRegister = [ 'operationName' => 'translationsRegister', 'query' => $translationQuery, 'variables' => $variables ]; $this->adapter->call('graphql.json', 'POST', $translationRegister, true, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); } } } public function ImportAuth() { if((String)$this->ShopifyToken !== '' || ((String)$this->ShopifyURL !== '' && (String)$this->ShopifyAPIKey !== '' && (String)$this->ShopifyPassword !== '') ) { $data = $this->CatchRemoteCommand('data'); if($data) { $result = $this->adapter->call('locations.json','','',false); if(strpos($result['data'], '') === 0) { $result = $this->adapter->call('orders/count.json?fulfillment_status=unshipped&financial_status=paid','','',false); }else{ $result['data'] = json_decode($result['data'],true); if(!$result['data']){ $result = $this->adapter->call('orders/count.json?fulfillment_status=unshipped&financial_status=paid','','',false); }else{ if(!empty($result['data']['locations'])) { $locations = array(''=>''); foreach($result['data']['locations'] as $v) { if($v['active']) { $locations[$v['id']] = $v['name']; } } if(!empty($this->shopid)){ $einstellungen = $this->app->DB->Select("SELECT einstellungen_json FROM shopexport WHERE id = '$this->shopid' LIMIT 1"); if(!empty($einstellungen)){ $einstellungen = json_decode($einstellungen, true); }else{ $einstellungen = []; } $einstellungen['felder']['locations'] = base64_encode(json_encode($locations)); if(empty($einstellungen['felder']['location'])){ foreach ($locations as $locationId => $locationName){ if(!empty($locationId)){ $einstellungen['felder']['location'] = $locationId; break; } } } $this->app->DB->UPDATE("UPDATE shopexport SET einstellungen_json = '" . $this->app->DB->real_escape_string(json_encode($einstellungen)) . "' WHERE id = '$this->shopid'"); } return 'success'; } } } if(strpos($result['data'], '') === 0) { return 'Bitte URL prüfen'; } $result['data'] = json_decode($result['data'],true); if(!$result['data']){ return 'Bitte API-Daten prüfen'; } if(isset($result['data']['errors'])){ return $result['data']['errors']; } } return 'success'; } return 'Bitte API-Daten ausfüllen'; } function ShopifyLog($nachricht, $dump = ''){ if($this->logging){ $this->app->erp->LogFile($nachricht, print_r($dump,true)); } } function ApiConnect($path, $anweisung = '', $data = '', $withheader = 0) { if(empty(self::$requestcount[$this->shopid])) { self::$requestcount[$this->shopid] = 1; }else{ self::$requestcount[$this->shopid]++; } if(self::$requestcount[$this->shopid] >= 30) { sleep(2); self::$requestcount[$this->shopid]-=2; }elseif(self::$requestcount[$this->shopid] >= 20) { sleep(2); self::$requestcount[$this->shopid]-=2; } $url = $this->ShopifyURL.$path; $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/json; charset=utf-8')); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_VERBOSE, 0); //curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_HEADER, $withheader); if($anweisung != '')curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $anweisung); if($data != '')curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data)); $response = curl_exec ($curl); $httpcode = curl_getinfo($curl); $httpcode = $httpcode['http_code']; if($httpcode == '429') { sleep(5); self::$requestcount[$this->shopid] = 40; return $this->ApiConnect($path, $anweisung, $data, $withheader); } curl_close ($curl); if(!empty($response['errors']) && preg_match_all('/\This action requires merchant approval for ([a-zA-Z\_]+) scope/',$response['errors'], $erg) && !empty($erg[1])) { $this->SetError($erg[1][0], $response['errors']); } return $response; } public function SetError($scope, $error) { $scope = $this->app->DB->real_escpa_string($scope); $error = $this->app->DB->real_escpa_string($error); $bearbeiter = $this->app->erp->GetBearbeiter(true); $this->app->DB->Insert('INSERT INTO shopexport_log (shopid, typ,parameter1,parameter2,bearbeiter,zeitstempel) VALUES ('.$this->shopid.",'fehler','Fehlendes API-Recht: $scope','$error','$bearbeiter',now())"); } function SendResponseAES($value) { $z = $this->app->Conf->ImportKey;//"12345678912345678912345678912345"; // 256-bit key $aes = new AES($z); return base64_encode($aes->encrypt(serialize($value))); } function FremdnummerInsert($artikelid, $fremdnummer, $bezeichnung){ $shopid = $this->shopid; if(!empty($fremdnummer)){ $fremdnummerid = $this->app->DB->Select("SELECT id FROM artikelnummer_fremdnummern WHERE artikel=$artikelid AND shopid='$shopid' AND aktiv='1' AND bezeichnung='$bezeichnung'"); if($fremdnummerid ){ $this->app->DB->Update("UPDATE artikelnummer_fremdnummern SET nummer='$fremdnummer' WHERE id ='$fremdnummerid'"); }else{ $this->app->DB->Insert("INSERT INTO artikelnummer_fremdnummern (shopid, artikel, nummer, bezeichnung, bearbeiter) VALUES ('$shopid','$artikelid','$fremdnummer','$bezeichnung', 'Shopimporter')"); } } } /** * @param array $shopArr * @param array $postData * * @return array */ public function updateShopexportArr($shopArr, $postData) { $shopArr['anzgleichzeitig'] = 50; $shopArr['datumvon'] = date('Y-m-d H:i:s'); $shopArr['demomodus'] = 0; return $shopArr; } /** * @return JsonResponse|null */ public function AuthByAssistent() { $shopifyURL = $this->app->Secure->GetPOST('ShopifyURL'); $this->shopifytracking = !empty($this->app->Secure->GetPOST('shopifytracking')); if(empty($shopifyURL)) { return new JsonResponse(['error' => 'Bitte die URL des Shops angeben.'], JsonResponse::HTTP_BAD_REQUEST); } $shopifyURL = trim($shopifyURL); if(stripos($shopifyURL,'http') === false){ $shopifyURL = 'https://'.$shopifyURL; } $shopifyAPIKey = $this->app->Secure->GetPOST('ShopifyAPIKey'); $shopifyPassword = $this->app->Secure->GetPOST('ShopifyPassword'); $shopifyToken = $this->app->Secure->GetPOST('ShopifyToken'); $step = (int)$this->app->Secure->GetPOST('step'); $this->ShopifyToken = $shopifyToken; $this->ShopifyAPIKey = $shopifyAPIKey; $this->ShopifyPassword = $shopifyPassword; if(empty($shopifyToken) && (empty($shopifyAPIKey) || empty($shopifyPassword))) { return new JsonResponse(['error' => 'Bitte ApiKey/Passwort oder Token angeben'], JsonResponse::HTTP_BAD_REQUEST); } if(empty($shopifyToken)) { if(strpos($shopifyURL, 'https://') !== false) { $shopifyURL = 'https://' . $shopifyAPIKey . ':' . $shopifyPassword . '@' . str_replace('https://', '', $shopifyURL); } else{ $shopifyURL = 'http://' . $shopifyAPIKey . ':' . $shopifyPassword . '@' . str_replace('http://', '', $shopifyURL); } } $this->ShopifyURL = $shopifyURL; if($step < 1){ $adapter = new Shopimporter_Shopify_Adapter($this->app, $shopifyURL, 0, $shopifyToken); $this->setAdapter($adapter); $this->data = true; $result = $this->adapter->call('locations.json', '', '', false); if(strpos($result['data'], '') === 0){ return new JsonResponse(['error' => 'bitte prüfen Sie die Zugangsdaten'], JsonResponse::HTTP_BAD_REQUEST); } $result['data'] = @json_decode($result['data'], true); if(!$result['data']){ return new JsonResponse(['error' => 'bitte prüfen Sie die Zugangsdaten'], JsonResponse::HTTP_BAD_REQUEST); } if(empty($result['data']['locations'])){ return null; } $locations = ['' => '']; $this->location = ''; $activeCount = 0; foreach ($result['data']['locations'] as $location) { if($location['active']){ $activeCount++; $locations[$location['id']] = $location['name']; if($this->location === '') { $this->location = $location['id']; } } } $this->locations = base64_encode(json_encode($locations)); if($activeCount > 1) { $this->location = ''; } return $this->getStorageSelectionPage(null, $locations); } return null; } /** * @return array */ public function getVueLocations() { $ret = []; $locations = json_decode(base64_decode($this->locations), true); foreach($locations as $locationId => $location) { $ret[] = [ 'value' => $locationId, 'text' => $location, ]; } return $ret; } /** * @param null|array $requiredForSubmit * * @return JsonResponse */ public function getStorageSelectionPage($requiredForSubmit = null, $locations = []) { if($requiredForSubmit === null) { $requiredForSubmit = $this->app->Secure->POST; $requiredForSubmit['step'] = 1; $requiredForSubmit = $this->updatePostDataForAssistent($requiredForSubmit); } $page = [ 'type' => 'form', 'submitType' => 'submit', 'icon'=> 'password-icon', 'headline' => 'Shopify', 'subHeadline' => 'Bitte wähle den Shop aus?', 'submitUrl' => 'index.php?module=onlineshops&action=create&cmd=saveassistent&shopmodule=shopimporter_shopify', 'form' => [ ], 'ctaButtons' => [ [ 'title' => 'Weiter', 'type' => 'submit', 'action' => 'submit', ], ] ]; if((!empty($locations)?count($locations):0) > 2) { $page['form'][] = [ 'id' => 0, 'name' => 'exportArticlesGroup', 'inputs' => [ [ 'label' => 'Shop', 'type' => 'select', 'name' => 'location', 'validation' => false, 'options' => $this->getVueLocations(), ], ], ]; } $page['form'][] = [ 'id' => 1, 'name' => 'sendTrackingGroup', 'inputs' => [ [ 'label' => 'Tracking E-Mails über Shopify versenden', 'type' => 'checkbox', 'name' => 'shopifytracking', ], ], ]; return new JsonResponse( [ 'page' => $page, 'dataRequiredForSubmit' => $requiredForSubmit, ] ); } /** * @param array $postData * * @return array */ public function updatePostDataForAssistent($postData) { if(!empty($this->ShopifyURL)) { $url = $this->ShopifyURL; if(!empty($this->ShopifyAPIKey) && !empty($this->ShopifyPassword) && empty($this->ShopifyToken)) { $url = str_replace($this->ShopifyAPIKey . ':' . $this->ShopifyPassword . '@','', $url); } $postData['ShopifyURL'] = $url; } if(!empty($this->shopifytracking)) { $postData['shopifytracking'] = 1; } if(!empty($this->locations)) { $postData['locations'] = $this->locations; } if(!empty($this->location) && empty($postData['location'])) { $postData['location'] = $this->location; } return $postData; } /** * @return array */ public function getStructureDataForClickByClickSave() { $ret = []; $locations = $this->app->Secure->GetPOST('locations'); if(!empty($locations)) { $ret['locations'] = $locations; } $location = $this->app->Secure->GetPOST('location'); if(!empty($location)) { $ret['location'] = $location; } if(!empty($this->app->Secure->GetPOST('shopifytracking'))) { $ret['shopifytracking'] = 1; } return $ret; } /** * @return array[] */ public function getCreateForm() { return [ [ 'id' => 0, 'name' => 'urls', 'inputs' => [ [ 'label' => 'URL des Shops', 'type' => 'text', 'name' => 'ShopifyURL', 'validation' => true, ], ], ], [ 'id' => 1, 'name' => 'username', 'inputs' => [ [ 'label' => 'API-Key aus Shopify', 'type' => 'text', 'name' => 'ShopifyAPIKey', 'validation' => false, ], ], ], [ 'id' => 2, 'name' => 'password', 'inputs' => [ [ 'label' => 'Passwort aus Shopify', 'type' => 'password', 'name' => 'ShopifyPassword', 'validation' => false, ], ], ], [ 'id' => 3, 'name' => 'token', 'inputs' => [ [ 'label' => 'Token aus Shopify', 'type' => 'text', 'name' => 'ShopifyToken', 'validation' => false, ], ], ], ]; } public function getBoosterHeadline(): string { return 'Shopify Business Booster App'; } public function getBoosterSubHeadline(): string { return 'Bitte gehe auf dein Shopify Shop und installiere dort die App Xentral Business Booster App. Dort kann man sich dann mit ein paar Klicks mit Xentral verbinden'; } /** * @return string */ public function getYoutubeLink(): string { return 'https://www.youtube.com/embed/xEBl3h8mIPg'; } }