Advertisement
Guest User

Untitled

a guest
Mar 29th, 2013
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 27.81 KB | None | 0 0
  1. <?php
  2.  
  3. // Папка для хранения временных файлов синхронизации
  4. $dir = 'simpla/cml/temp/';
  5.  
  6. // Обновлять все данные при каждой синхронизации
  7. $full_update = true;
  8.  
  9. // Название параметра товара, используемого как бренд
  10. $brand_option_name = 'Производитель';
  11.  
  12. $start_time = microtime(true);
  13. $max_exec_time = min(30, @ini_get("max_execution_time"));
  14. if(empty($max_exec_time))
  15.     $max_exec_time = 30;
  16.  
  17. session_start();
  18. chdir('../..');
  19. include('api/Simpla.php');
  20. $simpla = new Simpla();
  21.  
  22. if($simpla->request->get('type') == 'sale' && $simpla->request->get('mode') == 'checkauth')
  23. {
  24.     print "success\n";
  25.     print session_name()."\n";
  26.     print session_id();
  27. }
  28.  
  29. if($simpla->request->get('type') == 'sale' && $simpla->request->get('mode') == 'init')
  30. {
  31.     $tmp_files = glob($dir.'*.*');
  32.     if(is_array($tmp_files))
  33.     foreach($tmp_files as $v)
  34.     {
  35.         //unlink($v);
  36.     }
  37.     print "zip=no\n";
  38.     print "file_limit=1000000\n";
  39. }
  40.  
  41. if($simpla->request->get('type') == 'sale' && $simpla->request->get('mode') == 'file')
  42. {
  43.     $filename = $simpla->request->get('filename');
  44.    
  45.    
  46.     $f = fopen($dir.$filename, 'ab');
  47.     fwrite($f, file_get_contents('php://input'));
  48.     fclose($f);
  49.  
  50.     $xml = simplexml_load_file($dir.$filename);
  51.  
  52.     foreach($xml->Документ as $xml_order)
  53.     {
  54.         $order = null;
  55.  
  56.         $order->id = $xml_order->Номер;
  57.         $existed_order = $simpla->orders->get_order(intval($order->id));
  58.        
  59.         $order->date = $xml_order->Дата.' '.$xml_order->Время;
  60.         $order->name = $xml_order->Контрагенты->Контрагент->Наименование;
  61.  
  62.         if(isset($xml_order->ЗначенияРеквизитов->ЗначениеРеквизита))
  63.         foreach($xml_order->ЗначенияРеквизитов->ЗначениеРеквизита as $r)
  64.         {
  65.             switch ($r->Наименование) {
  66.             case 'Проведен':
  67.                 $proveden = ($r->Значение == 'true');
  68.                 break;
  69.             case 'ПометкаУдаления':
  70.                 $udalen = ($r->Значение == 'true');
  71.                 break;
  72.             }
  73.         }
  74.        
  75.         if($udalen)
  76.             $order->status = 3;
  77.         elseif($proveden)
  78.             $order->status = 1;
  79.         elseif(!$proveden)
  80.             $order->status = 0;
  81.        
  82.         if($existed_order)
  83.         {
  84.             $simpla->orders->update_order($order->id, $order);
  85.         }
  86.         else
  87.         {
  88.             $order->id = $simpla->orders->add_order($order);
  89.         }
  90.        
  91.         $purchases_ids = array();
  92.         // Товары
  93.         foreach($xml_order->Товары->Товар as $xml_product)
  94.         {
  95.             $purchase = null;
  96.             //  Id товара и варианта (если есть) по 1С
  97.             $product_1c_id = $variant_1c_id = '';
  98.             @list($product_1c_id, $variant_1c_id) = explode('#', $xml_product->Ид);
  99.             if(empty($product_1c_id))
  100.                 $product_1c_id = '';
  101.             if(empty($variant_1c_id))
  102.                 $variant_1c_id = '';
  103.                
  104.             // Ищем товар
  105.             $simpla->db->query('SELECT id FROM __products WHERE external_id=?', $product_1c_id);
  106.             $product_id = $simpla->db->result('id');
  107.             $simpla->db->query('SELECT id FROM __variants WHERE external_id=? AND product_id=?', $variant_1c_id, $product_id);
  108.             $variant_id = $simpla->db->result('id');
  109.                        
  110.             $purchase->order_id = $order->id;
  111.             $purchase->product_id = $product_id;
  112.             $purchase->variant_id = $variant_id;
  113.            
  114.             $purchase->sku = $xml_product->Артикул;         
  115.             $purchase->product_name = $xml_product->Наименование;
  116.             $purchase->amount = $xml_product->Количество;
  117.             $purchase->price = $xml_product->ЦенаЗаЕдиницу;
  118.            
  119.             if(isset($xml_product->Скидки->Скидка))
  120.             {
  121.                 $discount = $xml_product->Скидки->Скидка->Процент;
  122.                 $purchase->price = $purchase->price*(100-$discount)/100;
  123.             }
  124.            
  125.             $simpla->db->query('SELECT id FROM __purchases WHERE order_id=? AND product_id=? AND variant_id=?', $order->id, $product_id, $variant_id);
  126.             $purchase_id = $simpla->db->result('id');
  127.             if(!empty($purchase_id))
  128.                 $purchase_id = $simpla->orders->update_purchase($purchase_id, $purchase);
  129.             else
  130.                 $purchase_id = $simpla->orders->add_purchase($purchase);
  131.             $purchases_ids[] = $purchase_id;
  132.         }
  133.         // Удалим покупки, которых нет в файле
  134.         foreach($simpla->orders->get_purchases(array('order_id'=>intval($order->id))) as $purchase)
  135.         {
  136.             if(!in_array($purchase->id, $purchases_ids))
  137.                 $simpla->orders->delete_purchase($purchase->id);
  138.         }
  139.        
  140.         $simpla->db->query('UPDATE __orders SET total_price=? WHERE id=? LIMIT 1', $xml_order->Сумма, $order->id);
  141.        
  142.     }
  143.    
  144.  
  145.     print "success";
  146.     $simpla->settings->last_1c_orders_export_date = date("Y-m-d H:i:s");
  147.  
  148. }
  149.  
  150. if($simpla->request->get('type') == 'sale' && $simpla->request->get('mode') == 'query')
  151. {
  152.         $no_spaces = '<?xml version="1.0" encoding="utf-8"?>
  153.                             <КоммерческаяИнформация ВерсияСхемы="2.04" ДатаФормирования="' . date ( 'Y-m-d' )  . '"></КоммерческаяИнформация>';
  154.         $xml = new SimpleXMLElement ( $no_spaces );
  155.  
  156.         $orders = $simpla->orders->get_orders(array('modified_from'=>$simpla->settings->last_1c_orders_export_date));
  157.         foreach($orders as $order)
  158.         {
  159.             $date = new DateTime($order->date);
  160.            
  161.             $doc = $xml->addChild ("Документ");
  162.             $doc->addChild ( "Ид", $order->id);
  163.             $doc->addChild ( "Номер", $order->id);
  164.             $doc->addChild ( "Дата", $date->format('Y-m-d'));
  165.             $doc->addChild ( "ХозОперация", "Заказ товара" );
  166.             $doc->addChild ( "Роль", "Продавец" );
  167.             $doc->addChild ( "Курс", "1" );
  168.             $doc->addChild ( "Сумма", $order->total_price);
  169.             $doc->addChild ( "Время",  $date->format('H:i:s'));
  170.             $doc->addChild ( "Комментарий", $order->comment);
  171.            
  172.  
  173.             // Контрагенты
  174.             $k1 = $doc->addChild ( 'Контрагенты' );
  175.             $k1_1 = $k1->addChild ( 'Контрагент' );
  176.             $k1_2 = $k1_1->addChild ( "Ид", $order->name);
  177.             $k1_2 = $k1_1->addChild ( "Наименование", $order->name);
  178.             $k1_2 = $k1_1->addChild ( "Роль", "Покупатель" );
  179.             $k1_2 = $k1_1->addChild ( "ПолноеНаименование", $order->name );
  180.            
  181.             // Доп параметры
  182.             $addr = $k1_1->addChild ('АдресРегистрации');
  183.             $addr->addChild ( 'Представление', $order->address );
  184.             $addrField = $addr->addChild ( 'АдресноеПоле' );
  185.             $addrField->addChild ( 'Тип', 'Страна' );
  186.             $addrField->addChild ( 'Значение', 'RU' );
  187.             $addrField = $addr->addChild ( 'АдресноеПоле' );
  188.             $addrField->addChild ( 'Тип', 'Регион' );
  189.             $addrField->addChild ( 'Значение', $order->address );
  190.  
  191.             $contacts = $k1_1->addChild ( 'Контакты' );
  192.             $cont = $contacts->addChild ( 'Контакт' );
  193.             $cont->addChild ( 'Тип', 'Телефон' );
  194.             $cont->addChild ( 'Значение', $order->phone );
  195.             $cont = $contacts->addChild ( 'Контакт' );
  196.             $cont->addChild ( 'Тип', 'Почта' );
  197.             $cont->addChild ( 'Значение', $order->email );
  198.  
  199.  
  200.             $purchases = $simpla->orders->get_purchases(array('order_id'=>intval($order->id)));
  201.  
  202.             $t1 = $doc->addChild ( 'Товары' );
  203.             foreach($purchases as $purchase)
  204.             {
  205.                 if(!empty($purchase->product_id) && !empty($purchase->variant_id))
  206.                 {
  207.                     $simpla->db->query('SELECT external_id FROM __products WHERE id=?', $purchase->product_id);
  208.                     $id_p = $simpla->db->result('external_id');
  209.                     $simpla->db->query('SELECT external_id FROM __variants WHERE id=?', $purchase->variant_id);
  210.                     $id_v = $simpla->db->result('external_id');
  211.                    
  212.                     // Если нет внешнего ключа товара - указываем наш id
  213.                     if(!empty($id_p))
  214.                     {
  215.                         $id = $id_p;
  216.                     }
  217.                     else
  218.                     {
  219.                         $simpla->db->query('UPDATE __products SET external_id=id WHERE id=?', $purchase->product_id);
  220.                         $id = $purchase->product_id;
  221.                     }
  222.                    
  223.                     // Если нет внешнего ключа варианта - указываем наш id
  224.                     if(!empty($id_v))
  225.                     {
  226.                         $id = $id.'#'.$id_v;
  227.                     }
  228.                     else
  229.                     {
  230.                         $simpla->db->query('UPDATE __variants SET external_id=id WHERE id=?', $purchase->variant_id);
  231.                         $id = $id.'#'.$purchase->variant_id;
  232.                     }
  233.                        
  234.                     $t1_1 = $t1->addChild ( 'Товар' );
  235.                    
  236.                     if($id)
  237.                         $t1_2 = $t1_1->addChild ( "Ид", $id);
  238.                    
  239.                     $t1_2 = $t1_1->addChild ( "Артикул", $purchase->sku);
  240.                    
  241.                     $name = $purchase->product_name;
  242.                     if($purchase->variant_name)
  243.                         $name .= " $purchase->variant_name $id";
  244.                     $t1_2 = $t1_1->addChild ( "Наименование", $name);
  245.                     $t1_2 = $t1_1->addChild ( "ЦенаЗаЕдиницу", $purchase->price );
  246.                     $t1_2 = $t1_1->addChild ( "Количество", $purchase->amount );
  247.                     $t1_2 = $t1_1->addChild ( "Сумма", $purchase->amount*$purchase->price);
  248.                    
  249.                     $t1_2 = $t1_1->addChild ( "Скидки" );
  250.                     $t1_3 = $t1_2->addChild ( "Скидка" );
  251.                     $t1_4 = $t1_3->addChild ( "Сумма", $purchase->price*$order->discount/100);
  252.                     $t1_4 = $t1_3->addChild ( "УчтеноВСумме", "false" );
  253.                    
  254.                    
  255.                     $t1_2 = $t1_1->addChild ( "ЗначенияРеквизитов" );
  256.                     $t1_3 = $t1_2->addChild ( "ЗначениеРеквизита" );
  257.                     $t1_4 = $t1_3->addChild ( "Наименование", "ВидНоменклатуры" );
  258.                     $t1_4 = $t1_3->addChild ( "Значение", "Товар" );
  259.    
  260.                     $t1_2 = $t1_1->addChild ( "ЗначенияРеквизитов" );
  261.                     $t1_3 = $t1_2->addChild ( "ЗначениеРеквизита" );
  262.                     $t1_4 = $t1_3->addChild ( "Наименование", "ТипНоменклатуры" );
  263.                     $t1_4 = $t1_3->addChild ( "Значение", "Товар" );
  264.                 }
  265.             }
  266.            
  267.             // Доставка
  268.             if($order->delivery_price>0 && !$order->separate_delivery)
  269.             {
  270.                 $t1 = $t1->addChild ( 'Товар' );
  271.                 $t1->addChild ( "Ид", 'ORDER_DELIVERY');
  272.                 $t1->addChild ( "Наименование", 'Доставка');
  273.                 $t1->addChild ( "ЦенаЗаЕдиницу", $order->delivery_price);
  274.                 $t1->addChild ( "Количество", 1 );
  275.                 $t1->addChild ( "Сумма", $order->delivery_price);
  276.                 $t1_2 = $t1->addChild ( "ЗначенияРеквизитов" );
  277.                 $t1_3 = $t1_2->addChild ( "ЗначениеРеквизита" );
  278.                 $t1_4 = $t1_3->addChild ( "Наименование", "ВидНоменклатуры" );
  279.                 $t1_4 = $t1_3->addChild ( "Значение", "Услуга" );
  280.  
  281.                 $t1_2 = $t1->addChild ( "ЗначенияРеквизитов" );
  282.                 $t1_3 = $t1_2->addChild ( "ЗначениеРеквизита" );
  283.                 $t1_4 = $t1_3->addChild ( "Наименование", "ТипНоменклатуры" );
  284.                 $t1_4 = $t1_3->addChild ( "Значение", "Услуга" );
  285.                
  286.             }
  287.            
  288.  
  289.             // Статус        
  290.             if($order->status == 1)
  291.             {
  292.                 $s1_2 = $doc->addChild ( "ЗначенияРеквизитов" );
  293.                 $s1_3 = $s1_2->addChild ( "ЗначениеРеквизита" );
  294.                 $s1_3->addChild ( "Наименование", "Статус заказа" );
  295.                 $s1_3->addChild ( "Значение", "[N] Принят" );
  296.             }
  297.             if($order->status == 2)
  298.             {
  299.                 $s1_2 = $doc->addChild ( "ЗначенияРеквизитов" );
  300.                 $s1_3 = $s1_2->addChild ( "ЗначениеРеквизита" );
  301.                 $s1_3->addChild ( "Наименование", "Статус заказа" );
  302.                 $s1_3->addChild ( "Значение", "[F] Доставлен" );
  303.             }
  304.             if($order->status == 3)
  305.             {
  306.                 $s1_2 = $doc->addChild ( "ЗначенияРеквизитов" );
  307.                 $s1_3 = $s1_2->addChild ( "ЗначениеРеквизита" );
  308.                 $s1_3->addChild ( "Наименование", "Отменен" );
  309.                 $s1_3->addChild ( "Значение", "true" );
  310.             }          
  311.  
  312.         }
  313.  
  314.         header ( "Content-type: text/xml; charset=utf-8" );
  315.         print "\xEF\xBB\xBF";
  316.  
  317.         print $xml->asXML ();
  318.  
  319.         $simpla->settings->last_1c_orders_export_date = date("Y-m-d H:i:s");
  320.  
  321.  
  322. }
  323.  
  324. if($simpla->request->get('type') == 'sale' && $simpla->request->get('mode') == 'success')
  325. {
  326.         $simpla->settings->last_1c_orders_export_date = date("Y-m-d H:i:s");
  327. }
  328.  
  329.  
  330. if($simpla->request->get('type') == 'catalog' && $simpla->request->get('mode') == 'checkauth')
  331. {
  332.     print "success\n";
  333.     print session_name()."\n";
  334.     print session_id();
  335. }
  336.  
  337. if($simpla->request->get('type') == 'catalog' && $simpla->request->get('mode') == 'init')
  338. {  
  339.     $tmp_files = glob($dir.'*.*');
  340.     if(is_array($tmp_files))
  341.     foreach($tmp_files as $v)
  342.     {
  343.         unlink($v);
  344.     }
  345.     unset($_SESSION['last_1c_imported_variant_num']);
  346.     unset($_SESSION['last_1c_imported_product_num']);
  347.     unset($_SESSION['features_mapping']);
  348.     unset($_SESSION['categories_mapping']);
  349.     unset($_SESSION['brand_id_option']);    
  350.     print "zip=no\n";
  351.     print "file_limit=1000000\n";
  352. }
  353.  
  354. if($simpla->request->get('type') == 'catalog' && $simpla->request->get('mode') == 'file')
  355. {
  356.     $filename = basename($simpla->request->get('filename'));
  357.     $f = fopen($dir.$filename, 'ab');
  358.     fwrite($f, file_get_contents('php://input'));
  359.     fclose($f);
  360.     print "success\n";
  361. }
  362.  
  363. if($simpla->request->get('type') == 'catalog' && $simpla->request->get('mode') == 'import')
  364. {
  365.     $filename = basename($simpla->request->get('filename'));
  366.    
  367.     if($filename === 'import.xml')
  368.     {
  369.         // Категории и свойства (только в первом запросе пакетной передачи)
  370.         if(!isset($_SESSION['last_1c_imported_product_num']))
  371.         {
  372.             $z = new XMLReader;
  373.             $z->open($dir.$filename);      
  374.             while ($z->read() && $z->name !== 'Классификатор');
  375.             $xml = new SimpleXMLElement($z->readOuterXML());
  376.             $z->close();
  377.             import_categories($xml);
  378.             import_features($xml);
  379.         }
  380.        
  381.         // Товары            
  382.         $z = new XMLReader;
  383.         $z->open($dir.$filename);
  384.        
  385.         while ($z->read() && $z->name !== 'Товар');
  386.        
  387.         // Последний товар, на котором остановились
  388.         $last_product_num = 0;
  389.         if(isset($_SESSION['last_1c_imported_product_num']))
  390.             $last_product_num = $_SESSION['last_1c_imported_product_num'];
  391.        
  392.         // Номер текущего товара
  393.         $current_product_num = 0;
  394.  
  395.         while($z->name === 'Товар')
  396.         {
  397.             if($current_product_num >= $last_product_num)
  398.             {
  399.                 $xml = new SimpleXMLElement($z->readOuterXML());
  400.  
  401.                 // Товары
  402.                 import_product($xml);
  403.                
  404.                 $exec_time = microtime(true) - $start_time;
  405.                 if($exec_time+1>=$max_exec_time)
  406.                 {
  407.                     header ( "Content-type: text/xml; charset=utf-8" );
  408.                     print "\xEF\xBB\xBF";
  409.                     print "progress\r\n";
  410.                     print "Выгружено товаров: $current_product_num\r\n";
  411.                     $_SESSION['last_1c_imported_product_num'] = $current_product_num;
  412.                     exit();
  413.                 }
  414.             }
  415.             $z->next('Товар');
  416.             $current_product_num ++;
  417.         }
  418.         $z->close();
  419.         print "success";
  420.         //unlink($dir.$filename);
  421.         unset($_SESSION['last_1c_imported_product_num']);              
  422.     }
  423.     elseif($filename === 'offers.xml')
  424.     {
  425.         // Варианты        
  426.         $z = new XMLReader;
  427.         $z->open($dir.$filename);
  428.        
  429.         while ($z->read() && $z->name !== 'Предложение');
  430.        
  431.         // Последний вариант, на котором остановились
  432.         $last_variant_num = 0;
  433.         if(isset($_SESSION['last_1c_imported_variant_num']))
  434.             $last_variant_num = $_SESSION['last_1c_imported_variant_num'];
  435.        
  436.         // Номер текущего товара
  437.         $current_variant_num = 0;
  438.  
  439.         while($z->name === 'Предложение')
  440.         {
  441.             if($current_variant_num >= $last_variant_num)
  442.             {
  443.                 $xml = new SimpleXMLElement($z->readOuterXML());
  444.                 // Варианты
  445.                 import_variant($xml);
  446.                
  447.                 $exec_time = microtime(true) - $start_time;
  448.                 if($exec_time+1>=$max_exec_time)
  449.                 {
  450.                     header ( "Content-type: text/xml; charset=utf-8" );
  451.                     print "\xEF\xBB\xBF";
  452.                     print "progress\r\n";
  453.                     print "Выгружено ценовых предложений: $current_variant_num\r\n";
  454.                     $_SESSION['last_1c_imported_variant_num'] = $current_variant_num;
  455.                     exit();
  456.                 }
  457.             }
  458.             $z->next('Предложение');
  459.             $current_variant_num ++;
  460.         }
  461.         $z->close();
  462.         print "success";
  463.         //unlink($dir.$filename);
  464.         unset($_SESSION['last_1c_imported_variant_num']);              
  465.  
  466.     }
  467. }
  468.  
  469.  
  470. function import_categories($xml, $parent_id = 0)
  471. {
  472.     global $simpla;
  473.     global $dir;
  474.     if(isset($xml->Группы->Группа))
  475.     foreach ($xml->Группы->Группа as $xml_group)
  476.     {
  477.         $simpla->db->query('SELECT id FROM __categories WHERE external_id=?', $xml_group->Ид);
  478.         $category_id = $simpla->db->result('id');
  479.         if(empty($category_id))
  480.             $category_id = $simpla->categories->add_category(array('parent_id'=>$parent_id, 'external_id'=>$xml_group->Ид, 'url'=>translit($xml_group->Наименование), 'name'=>$xml_group->Наименование, 'meta_title'=>$xml_group->Наименование, 'meta_keywords'=>$xml_group->Наименование, 'meta_description'=>$xml_group->Наименование ));
  481.         $_SESSION['categories_mapping'][strval($xml_group->Ид)] = $category_id;
  482.         import_categories($xml_group, $category_id);
  483.     }
  484. }
  485.  
  486.  
  487. function import_features($xml)
  488. {
  489.     global $simpla;
  490.     global $dir;
  491.     global $brand_option_name;
  492.    
  493.     $property = array();
  494.     if(isset($xml->Свойства->СвойствоНоменклатуры))
  495.         $property = $xml->Свойства->СвойствоНоменклатуры;
  496.        
  497.     if(isset($xml->Свойства->Свойство))
  498.         $property = $xml->Свойства->Свойство;
  499.        
  500.     foreach ($property as $xml_feature)
  501.     {
  502.         // Если свойство содержит производителя товаров
  503.         if($xml_feature->Наименование == $brand_option_name)
  504.         {
  505.             // Запомним в сессии Ид свойства с производителем
  506.             $_SESSION['brand_option_id'] = strval($xml_feature->Ид);     
  507.         }
  508.         // Иначе обрабатываем как обычной свойство товара
  509.         else
  510.         {
  511.             $simpla->db->query('SELECT id FROM __features WHERE name=?', strval($xml_feature->Наименование));
  512.             $feature_id = $simpla->db->result('id');
  513.             if(empty($feature_id))
  514.                 $feature_id = $simpla->features->add_feature(array('name'=>strval($xml_feature->Наименование)));
  515.             $_SESSION['features_mapping'][strval($xml_feature->Ид)] = $feature_id;
  516.         }
  517.     }
  518. }
  519.  
  520.  
  521. function import_product($xml_product)
  522. {
  523.     global $simpla;
  524.     global $dir;
  525.     global $brand_option_name;
  526.     global $full_update;
  527.     // Товары
  528.  
  529.  
  530.     //  Id товара и варианта (если есть) по 1С
  531.     @list($product_1c_id, $variant_1c_id) = explode('#', $xml_product->Ид);
  532.     if(empty($variant_1c_id))
  533.         $variant_1c_id = '';
  534.    
  535.     // Ид категории
  536.     if(isset($xml_product->Группы->Ид))
  537.     $category_id = $_SESSION['categories_mapping'][strval($xml_product->Группы->Ид)];
  538.    
  539.    
  540.     // Подгатавливаем вариант
  541.     $variant_id = null;
  542.     $variant = null;
  543.     $values = array();
  544.     if(isset($xml_product->ХарактеристикиТовара->ХарактеристикаТовара))
  545.     foreach($xml_product->ХарактеристикиТовара->ХарактеристикаТовара as $xml_property)
  546.         $values[] = $xml_property->Значение;
  547.     if(!empty($values))
  548.         $variant->name = implode(', ', $values);
  549.     $variant->sku = (string)$xml_product->Артикул;
  550.     $variant->external_id = $variant_1c_id;
  551.    
  552.     // Ищем товар
  553.     $simpla->db->query('SELECT id FROM __products WHERE external_id=?', $product_1c_id);
  554.     $product_id = $simpla->db->result('id');
  555.     if(empty($product_id) && !empty($variant->sku))
  556.     {
  557.         $simpla->db->query('SELECT product_id, id FROM __variants WHERE sku=?', $variant->sku);
  558.         $res = $simpla->db->result();
  559.         $product_id = $res->product_id;
  560.         $variant_id = $res->id;
  561.     }
  562.    
  563.     // Если такого товара не нашлось      
  564.     if(empty($product_id))
  565.     {
  566.         // Добавляем товар
  567.         $description = '';
  568.         if(!empty($xml_product->Описание))
  569.             $description = $xml_product->Описание;
  570.         $product_id = $simpla->products->add_product(array('external_id'=>$product_1c_id, 'url'=>translit($xml_product->Наименование), 'name'=>$xml_product->Наименование, 'meta_title'=>$xml_product->Наименование, 'meta_keywords'=>$xml_product->Наименование, 'meta_description'=>$xml_product->$description,  'annotation'=>$description, 'body'=>$description));
  571.        
  572.         // Добавляем товар в категории
  573.         if(isset($category_id))
  574.         $simpla->categories->add_product_category($product_id, $category_id);
  575.  
  576.    
  577.         // Добавляем изображение товара
  578.         if(isset($xml_product->Картинка))
  579.         {
  580.             foreach($xml_product->Картинка as $img)
  581.             {
  582.                 $image = basename($xml_product->Картинка);
  583.                 if(!empty($image) && is_file($dir.$image) && is_writable($simpla->config->original_images_dir))
  584.                 {
  585.                     rename($dir.$image, $simpla->config->original_images_dir.$image);
  586.                     $simpla->products->add_image($product_id, $image);
  587.                 }
  588.             }
  589.         }
  590.  
  591.     }
  592.     //Если нашелся товар
  593.     else
  594.     {
  595.         if(empty($variant_id) && !empty($variant_1c_id))
  596.         {
  597.             $simpla->db->query('SELECT id FROM __variants WHERE external_id=? AND product_id=?', $variant_1c_id, $product_id);
  598.             $variant_id = $simpla->db->result('id');
  599.         }
  600.         elseif(empty($variant_id) && empty($variant_1c_id))
  601.         {
  602.             $simpla->db->query('SELECT id FROM __variants WHERE product_id=?', $product_id);
  603.             $variant_id = $simpla->db->result('id');       
  604.         }
  605.        
  606.         // Обновляем товар
  607.         if($full_update)
  608.         {
  609.             $description = '';
  610.             if(!empty($xml_product->Описание))
  611.                 $description = $xml_product->Описание;
  612.             $product_id = $simpla->products->update_product($product_id, array('external_id'=>$product_1c_id, 'url'=>translit($xml_product->Наименование), 'name'=>$xml_product->Наименование, 'meta_title'=>$xml_product->Наименование, 'meta_keywords'=>$xml_product->Наименование, 'meta_description'=>$xml_product->$description,  'annotation'=>$description, 'body'=>$description));
  613.            
  614.             // Обновляем категорию товара
  615.             if(isset($category_id) && !empty($product_id))
  616.             {
  617.                 $query = $simpla->db->placehold('DELETE FROM __products_categories WHERE product_id=?', $product_id);
  618.                 $simpla->db->query($query);
  619.                 $simpla->categories->add_product_category($product_id, $category_id);
  620.             }
  621.            
  622.         }
  623.        
  624.         // Обновляем изображение товара
  625.         if(isset($xml_product->Картинка))
  626.         {
  627.             foreach($xml_product->Картинка as $img)
  628.             {
  629.                 $image = basename($img);
  630.                 if(!empty($image) && is_file($dir.$image) && is_writable($simpla->config->original_images_dir))
  631.                 {
  632.                     $simpla->db->query('SELECT id FROM __images WHERE product_id=? ORDER BY position LIMIT 1', $product_id);
  633.                     $img_id = $simpla->db->result('id');
  634.                     if(!empty($img_id))
  635.                         $simpla->products->delete_image($img_id);
  636.                     rename($dir.$image, $simpla->config->original_images_dir.$image);
  637.                     $simpla->products->add_image($product_id, $image);
  638.                 }
  639.             }
  640.         }
  641.        
  642.     }
  643.    
  644.     // Если не найден вариант, добавляем вариант один к товару
  645.     if(empty($variant_id))
  646.     {
  647.         $variant->product_id = $product_id;
  648.         $variant->stock = 0;
  649.         $variant_id = $simpla->variants->add_variant($variant);
  650.     }
  651.     else
  652.     {
  653.         $simpla->variants->update_variant($variant_id, $variant);
  654.     }
  655.     // Свойства товара
  656.     if(isset($xml_product->ЗначенияСвойств->ЗначенияСвойства))
  657.     {
  658.         foreach ($xml_product->ЗначенияСвойств->ЗначенияСвойства as $xml_option)
  659.         {
  660.             if(isset($_SESSION['features_mapping'][strval($xml_option->Ид)]))
  661.             {
  662.                 $feature_id = $_SESSION['features_mapping'][strval($xml_option->Ид)];
  663.                 if(isset($category_id) && !empty($feature_id))
  664.                 {
  665.                     $simpla->features->add_feature_category($feature_id, $category_id);
  666.                     $values = array();
  667.                     foreach($xml_option->Значение as $xml_value)
  668.                         $values[] = strval($xml_value);
  669.                     $simpla->features->update_option($product_id, $feature_id, implode(' ,', $values));
  670.                 }
  671.             }
  672.             // Если свойство оказалось названием бренда
  673.             elseif(isset($_SESSION['brand_option_id']) && !empty($xml_option->Значение))
  674.             {
  675.                 $brand_name = strval($xml_option->Значение);
  676.                 // Добавим бренд
  677.                 // Найдем его по имени
  678.                 $simpla->db->query('SELECT id FROM __brands WHERE name=?', $brand_name);
  679.                 if(!$brand_id = $simpla->db->result('id'))
  680.                     // Создадим, если не найден
  681.                     $brand_id = $simpla->brands->add_brand(array('name'=>$brand_name, 'meta_title'=>$brand_name, 'meta_keywords'=>$brand_name, 'meta_description'=>$brand_name, 'url'=>translit($brand_name)));
  682.                 if(!empty($brand_id))
  683.                     $simpla->products->update_product($product_id, array('brand_id'=>$brand_id));
  684.             }
  685.         }      
  686.     }
  687.    
  688.    
  689.     // Если нужно - удаляем вариант или весь товар
  690.     if($xml_product->Статус == 'Удален')
  691.     {
  692.         $simpla->variants->delete_variant($variant_id);
  693.         $simpla->db->query('SELECT count(id) as variants_num FROM __variants WHERE product_id=?', $product_id);
  694.         if($simpla->db->result('variants_num') == 0)
  695.             $simpla->products->delete_product($product_id);
  696.  
  697.     }
  698. }
  699.  
  700. function import_variant($xml_variant)
  701. {
  702.     global $simpla;
  703.     global $dir;
  704.     $variant = null;
  705.     //  Id товара и варианта (если есть) по 1С
  706.     @list($product_1c_id, $variant_1c_id) = explode('#', $xml_variant->Ид);
  707.     if(empty($variant_1c_id))
  708.         $variant_1c_id = '';
  709.  
  710.     $simpla->db->query('SELECT v.id FROM __variants v WHERE v.external_id=? AND product_id=(SELECT p.id FROM __products p WHERE p.external_id=? LIMIT 1)', $variant_1c_id, $product_1c_id);
  711.     $variant_id = $simpla->db->result('id');
  712.    
  713.     $variant->price = $xml_variant->Цены->Цена->ЦенаЗаЕдиницу;
  714.     // Конвертируем цену из валюты 1С в базовую валюту магазина
  715.     if(!empty($xml_variant->Цены->Цена->Валюта))
  716.     {
  717.         // Ищем валюту по коду
  718.         $simpla->db->query("SELECT id, rate_from, rate_to FROM __currencies WHERE code like ?", $xml_variant->Цены->Цена->Валюта);
  719.         $variant_currency = $simpla->db->result();
  720.         // Если не нашли - ищем по обозначению
  721.         if(empty($variant_currency))
  722.         {
  723.             $simpla->db->query("SELECT id, rate_from, rate_to FROM __currencies WHERE sign like ?", $xml_variant->Цены->Цена->Валюта);
  724.             $variant_currency = $simpla->db->result();
  725.         }
  726.         // Если нашли валюту - конвертируем из нее в базовую
  727.         if($variant_currency && $variant_currency->rate_from>0 && $variant_currency->rate_to>0)
  728.         {
  729.             $variant->price = $variant->price*$variant_currency->rate_to/$variant_currency->rate_from;
  730.         }  
  731.     }
  732.    
  733.     $variant->stock = $xml_variant->Количество;
  734.     $simpla->variants->update_variant($variant_id, $variant);
  735. }
  736.  
  737. function translit($text)
  738. {
  739.     $ru = explode('-', "А-а-Б-б-В-в-Ґ-ґ-Г-г-Д-д-Е-е-Ё-ё-Є-є-Ж-ж-З-з-И-и-І-і-Ї-ї-Й-й-К-к-Л-л-М-м-Н-н-О-о-П-п-Р-р-С-с-Т-т-У-у-Ф-ф-Х-х-Ц-ц-Ч-ч-Ш-ш-Щ-щ-Ъ-ъ-Ы-ы-Ь-ь-Э-э-Ю-ю-Я-я");
  740.     $en = explode('-', "A-a-B-b-V-v-G-g-G-g-D-d-E-e-E-e-E-e-ZH-zh-Z-z-I-i-I-i-I-i-J-j-K-k-L-l-M-m-N-n-O-o-P-p-R-r-S-s-T-t-U-u-F-f-H-h-TS-ts-CH-ch-SH-sh-SCH-sch---Y-y---E-e-YU-yu-YA-ya");
  741.  
  742.     $res = str_replace($ru, $en, $text);
  743.     $res = preg_replace("/[\s]+/ui", '-', $res);
  744.     $res = strtolower(preg_replace("/[^0-9a-zа-я\-]+/ui", '', $res));
  745.    
  746.     return $res;  
  747. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement