749 lines
27 KiB
PHP
749 lines
27 KiB
PHP
|
|
<?php
|
|||
|
|
|
|||
|
|
// Папка для хранения временных файлов синхронизации
|
|||
|
|
$dir = 'simpla/cml/temp/';
|
|||
|
|
|
|||
|
|
// Обновлять все данные при каждой синхронизации
|
|||
|
|
$full_update = true;
|
|||
|
|
|
|||
|
|
// Название параметра товара, используемого как бренд
|
|||
|
|
$brand_option_name = 'Производитель';
|
|||
|
|
|
|||
|
|
$start_time = microtime(true);
|
|||
|
|
$max_exec_time = min(30, @ini_get("max_execution_time"));
|
|||
|
|
if(empty($max_exec_time))
|
|||
|
|
$max_exec_time = 30;
|
|||
|
|
|
|||
|
|
session_start();
|
|||
|
|
chdir('../..');
|
|||
|
|
include('api/Simpla.php');
|
|||
|
|
$simpla = new Simpla();
|
|||
|
|
|
|||
|
|
if($simpla->request->get('type') == 'sale' && $simpla->request->get('mode') == 'checkauth')
|
|||
|
|
{
|
|||
|
|
print "success\n";
|
|||
|
|
print session_name()."\n";
|
|||
|
|
print session_id();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if($simpla->request->get('type') == 'sale' && $simpla->request->get('mode') == 'init')
|
|||
|
|
{
|
|||
|
|
$tmp_files = glob($dir.'*.*');
|
|||
|
|
if(is_array($tmp_files))
|
|||
|
|
foreach($tmp_files as $v)
|
|||
|
|
{
|
|||
|
|
//unlink($v);
|
|||
|
|
}
|
|||
|
|
print "zip=no\n";
|
|||
|
|
print "file_limit=1000000\n";
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if($simpla->request->get('type') == 'sale' && $simpla->request->get('mode') == 'file')
|
|||
|
|
{
|
|||
|
|
$filename = $simpla->request->get('filename');
|
|||
|
|
|
|||
|
|
|
|||
|
|
$f = fopen($dir.$filename, 'ab');
|
|||
|
|
fwrite($f, file_get_contents('php://input'));
|
|||
|
|
fclose($f);
|
|||
|
|
|
|||
|
|
$xml = simplexml_load_file($dir.$filename);
|
|||
|
|
|
|||
|
|
foreach($xml->Документ as $xml_order)
|
|||
|
|
{
|
|||
|
|
$order = null;
|
|||
|
|
|
|||
|
|
$order->id = $xml_order->Номер;
|
|||
|
|
$existed_order = $simpla->orders->get_order(intval($order->id));
|
|||
|
|
|
|||
|
|
$order->date = $xml_order->Дата.' '.$xml_order->Время;
|
|||
|
|
$order->name = $xml_order->Контрагенты->Контрагент->Наименование;
|
|||
|
|
|
|||
|
|
if(isset($xml_order->ЗначенияРеквизитов->ЗначениеРеквизита))
|
|||
|
|
foreach($xml_order->ЗначенияРеквизитов->ЗначениеРеквизита as $r)
|
|||
|
|
{
|
|||
|
|
switch ($r->Наименование) {
|
|||
|
|
case 'Проведен':
|
|||
|
|
$proveden = ($r->Значение == 'true');
|
|||
|
|
break;
|
|||
|
|
case 'ПометкаУдаления':
|
|||
|
|
$udalen = ($r->Значение == 'true');
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if($udalen)
|
|||
|
|
$order->status = 3;
|
|||
|
|
elseif($proveden)
|
|||
|
|
$order->status = 1;
|
|||
|
|
elseif(!$proveden)
|
|||
|
|
$order->status = 0;
|
|||
|
|
|
|||
|
|
if($existed_order)
|
|||
|
|
{
|
|||
|
|
$simpla->orders->update_order($order->id, $order);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
$order->id = $simpla->orders->add_order($order);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
$purchases_ids = array();
|
|||
|
|
// Товары
|
|||
|
|
foreach($xml_order->Товары->Товар as $xml_product)
|
|||
|
|
{
|
|||
|
|
$purchase = null;
|
|||
|
|
// Id товара и варианта (если есть) по 1С
|
|||
|
|
$product_1c_id = $variant_1c_id = '';
|
|||
|
|
@list($product_1c_id, $variant_1c_id) = explode('#', $xml_product->Ид);
|
|||
|
|
if(empty($product_1c_id))
|
|||
|
|
$product_1c_id = '';
|
|||
|
|
if(empty($variant_1c_id))
|
|||
|
|
$variant_1c_id = '';
|
|||
|
|
|
|||
|
|
// Ищем товар
|
|||
|
|
$simpla->db->query('SELECT id FROM __products WHERE external_id=?', $product_1c_id);
|
|||
|
|
$product_id = $simpla->db->result('id');
|
|||
|
|
$simpla->db->query('SELECT id FROM __variants WHERE external_id=? AND product_id=?', $variant_1c_id, $product_id);
|
|||
|
|
$variant_id = $simpla->db->result('id');
|
|||
|
|
|
|||
|
|
$purchase->order_id = $order->id;
|
|||
|
|
$purchase->product_id = $product_id;
|
|||
|
|
$purchase->variant_id = $variant_id;
|
|||
|
|
|
|||
|
|
$purchase->sku = $xml_product->Артикул;
|
|||
|
|
$purchase->product_name = $xml_product->Наименование;
|
|||
|
|
$purchase->amount = $xml_product->Количество;
|
|||
|
|
$purchase->price = floatval($xml_product->ЦенаЗаЕдиницу);
|
|||
|
|
|
|||
|
|
if(isset($xml_product->Скидки->Скидка))
|
|||
|
|
{
|
|||
|
|
$discount = $xml_product->Скидки->Скидка->Процент;
|
|||
|
|
$purchase->price = $purchase->price*(100-$discount)/100;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
$simpla->db->query('SELECT id FROM __purchases WHERE order_id=? AND product_id=? AND variant_id=?', $order->id, $product_id, $variant_id);
|
|||
|
|
$purchase_id = $simpla->db->result('id');
|
|||
|
|
if(!empty($purchase_id))
|
|||
|
|
$purchase_id = $simpla->orders->update_purchase($purchase_id, $purchase);
|
|||
|
|
else
|
|||
|
|
$purchase_id = $simpla->orders->add_purchase($purchase);
|
|||
|
|
$purchases_ids[] = $purchase_id;
|
|||
|
|
}
|
|||
|
|
// Удалим покупки, которых нет в файле
|
|||
|
|
foreach($simpla->orders->get_purchases(array('order_id'=>intval($order->id))) as $purchase)
|
|||
|
|
{
|
|||
|
|
if(!in_array($purchase->id, $purchases_ids))
|
|||
|
|
$simpla->orders->delete_purchase($purchase->id);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
$simpla->db->query('UPDATE __orders SET discount=0, total_price=? WHERE id=? LIMIT 1', $xml_order->Сумма, $order->id);
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
print "success";
|
|||
|
|
$simpla->settings->last_1c_orders_export_date = date("Y-m-d H:i:s");
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if($simpla->request->get('type') == 'sale' && $simpla->request->get('mode') == 'query')
|
|||
|
|
{
|
|||
|
|
$no_spaces = '<?xml version="1.0" encoding="utf-8"?>
|
|||
|
|
<КоммерческаяИнформация ВерсияСхемы="2.04" ДатаФормирования="' . date ( 'Y-m-d' ) . '"></КоммерческаяИнформация>';
|
|||
|
|
$xml = new SimpleXMLElement ( $no_spaces );
|
|||
|
|
|
|||
|
|
$orders = $simpla->orders->get_orders(array('modified_from'=>$simpla->settings->last_1c_orders_export_date));
|
|||
|
|
foreach($orders as $order)
|
|||
|
|
{
|
|||
|
|
$date = new DateTime($order->date);
|
|||
|
|
|
|||
|
|
$doc = $xml->addChild ("Документ");
|
|||
|
|
$doc->addChild ( "Ид", $order->id);
|
|||
|
|
$doc->addChild ( "Номер", $order->id);
|
|||
|
|
$doc->addChild ( "Дата", $date->format('Y-m-d'));
|
|||
|
|
$doc->addChild ( "ХозОперация", "Заказ товара" );
|
|||
|
|
$doc->addChild ( "Роль", "Продавец" );
|
|||
|
|
$doc->addChild ( "Курс", "1" );
|
|||
|
|
$doc->addChild ( "Сумма", $order->total_price);
|
|||
|
|
$doc->addChild ( "Время", $date->format('H:i:s'));
|
|||
|
|
$doc->addChild ( "Комментарий", $order->comment);
|
|||
|
|
|
|||
|
|
|
|||
|
|
// Контрагенты
|
|||
|
|
$k1 = $doc->addChild ( 'Контрагенты' );
|
|||
|
|
$k1_1 = $k1->addChild ( 'Контрагент' );
|
|||
|
|
$k1_2 = $k1_1->addChild ( "Ид", $order->name);
|
|||
|
|
$k1_2 = $k1_1->addChild ( "Наименование", $order->name);
|
|||
|
|
$k1_2 = $k1_1->addChild ( "Роль", "Покупатель" );
|
|||
|
|
$k1_2 = $k1_1->addChild ( "ПолноеНаименование", $order->name );
|
|||
|
|
|
|||
|
|
// Доп параметры
|
|||
|
|
$addr = $k1_1->addChild ('АдресРегистрации');
|
|||
|
|
$addr->addChild ( 'Представление', $order->address );
|
|||
|
|
$addrField = $addr->addChild ( 'АдресноеПоле' );
|
|||
|
|
$addrField->addChild ( 'Тип', 'Страна' );
|
|||
|
|
$addrField->addChild ( 'Значение', 'RU' );
|
|||
|
|
$addrField = $addr->addChild ( 'АдресноеПоле' );
|
|||
|
|
$addrField->addChild ( 'Тип', 'Регион' );
|
|||
|
|
$addrField->addChild ( 'Значение', $order->address );
|
|||
|
|
|
|||
|
|
$contacts = $k1_1->addChild ( 'Контакты' );
|
|||
|
|
$cont = $contacts->addChild ( 'Контакт' );
|
|||
|
|
$cont->addChild ( 'Тип', 'Телефон' );
|
|||
|
|
$cont->addChild ( 'Значение', $order->phone );
|
|||
|
|
$cont = $contacts->addChild ( 'Контакт' );
|
|||
|
|
$cont->addChild ( 'Тип', 'Почта' );
|
|||
|
|
$cont->addChild ( 'Значение', $order->email );
|
|||
|
|
|
|||
|
|
|
|||
|
|
$purchases = $simpla->orders->get_purchases(array('order_id'=>intval($order->id)));
|
|||
|
|
|
|||
|
|
$t1 = $doc->addChild ( 'Товары' );
|
|||
|
|
foreach($purchases as $purchase)
|
|||
|
|
{
|
|||
|
|
if(!empty($purchase->product_id) && !empty($purchase->variant_id))
|
|||
|
|
{
|
|||
|
|
$simpla->db->query('SELECT external_id FROM __products WHERE id=?', $purchase->product_id);
|
|||
|
|
$id_p = $simpla->db->result('external_id');
|
|||
|
|
$simpla->db->query('SELECT external_id FROM __variants WHERE id=?', $purchase->variant_id);
|
|||
|
|
$id_v = $simpla->db->result('external_id');
|
|||
|
|
|
|||
|
|
// Если нет внешнего ключа товара - указываем наш id
|
|||
|
|
if(!empty($id_p))
|
|||
|
|
{
|
|||
|
|
$id = $id_p;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
$simpla->db->query('UPDATE __products SET external_id=id WHERE id=?', $purchase->product_id);
|
|||
|
|
$id = $purchase->product_id;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Если нет внешнего ключа варианта - указываем наш id
|
|||
|
|
if(!empty($id_v))
|
|||
|
|
{
|
|||
|
|
$id = $id.'#'.$id_v;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
$simpla->db->query('UPDATE __variants SET external_id=id WHERE id=?', $purchase->variant_id);
|
|||
|
|
$id = $id.'#'.$purchase->variant_id;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
$t1_1 = $t1->addChild ( 'Товар' );
|
|||
|
|
|
|||
|
|
if($id)
|
|||
|
|
$t1_2 = $t1_1->addChild ( "Ид", $id);
|
|||
|
|
|
|||
|
|
$t1_2 = $t1_1->addChild ( "Артикул", $purchase->sku);
|
|||
|
|
|
|||
|
|
$name = $purchase->product_name;
|
|||
|
|
if($purchase->variant_name)
|
|||
|
|
$name .= " $purchase->variant_name $id";
|
|||
|
|
$t1_2 = $t1_1->addChild ( "Наименование", $name);
|
|||
|
|
$t1_2 = $t1_1->addChild ( "ЦенаЗаЕдиницу", $purchase->price*(100-$order->discount)/100);
|
|||
|
|
$t1_2 = $t1_1->addChild ( "Количество", $purchase->amount );
|
|||
|
|
$t1_2 = $t1_1->addChild ( "Сумма", $purchase->amount*$purchase->price*(100-$order->discount)/100);
|
|||
|
|
|
|||
|
|
/*
|
|||
|
|
$t1_2 = $t1_1->addChild ( "Скидки" );
|
|||
|
|
$t1_3 = $t1_2->addChild ( "Скидка" );
|
|||
|
|
$t1_4 = $t1_3->addChild ( "Сумма", $purchase->amount*$purchase->price*(100-$order->discount)/100);
|
|||
|
|
$t1_4 = $t1_3->addChild ( "УчтеноВСумме", "true" );
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
$t1_2 = $t1_1->addChild ( "ЗначенияРеквизитов" );
|
|||
|
|
$t1_3 = $t1_2->addChild ( "ЗначениеРеквизита" );
|
|||
|
|
$t1_4 = $t1_3->addChild ( "Наименование", "ВидНоменклатуры" );
|
|||
|
|
$t1_4 = $t1_3->addChild ( "Значение", "Товар" );
|
|||
|
|
|
|||
|
|
$t1_2 = $t1_1->addChild ( "ЗначенияРеквизитов" );
|
|||
|
|
$t1_3 = $t1_2->addChild ( "ЗначениеРеквизита" );
|
|||
|
|
$t1_4 = $t1_3->addChild ( "Наименование", "ТипНоменклатуры" );
|
|||
|
|
$t1_4 = $t1_3->addChild ( "Значение", "Товар" );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Доставка
|
|||
|
|
if($order->delivery_price>0 && !$order->separate_delivery)
|
|||
|
|
{
|
|||
|
|
$t1 = $t1->addChild ( 'Товар' );
|
|||
|
|
$t1->addChild ( "Ид", 'ORDER_DELIVERY');
|
|||
|
|
$t1->addChild ( "Наименование", 'Доставка');
|
|||
|
|
$t1->addChild ( "ЦенаЗаЕдиницу", $order->delivery_price);
|
|||
|
|
$t1->addChild ( "Количество", 1 );
|
|||
|
|
$t1->addChild ( "Сумма", $order->delivery_price);
|
|||
|
|
$t1_2 = $t1->addChild ( "ЗначенияРеквизитов" );
|
|||
|
|
$t1_3 = $t1_2->addChild ( "ЗначениеРеквизита" );
|
|||
|
|
$t1_4 = $t1_3->addChild ( "Наименование", "ВидНоменклатуры" );
|
|||
|
|
$t1_4 = $t1_3->addChild ( "Значение", "Услуга" );
|
|||
|
|
|
|||
|
|
$t1_2 = $t1->addChild ( "ЗначенияРеквизитов" );
|
|||
|
|
$t1_3 = $t1_2->addChild ( "ЗначениеРеквизита" );
|
|||
|
|
$t1_4 = $t1_3->addChild ( "Наименование", "ТипНоменклатуры" );
|
|||
|
|
$t1_4 = $t1_3->addChild ( "Значение", "Услуга" );
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
// Статус
|
|||
|
|
if($order->status == 1)
|
|||
|
|
{
|
|||
|
|
$s1_2 = $doc->addChild ( "ЗначенияРеквизитов" );
|
|||
|
|
$s1_3 = $s1_2->addChild ( "ЗначениеРеквизита" );
|
|||
|
|
$s1_3->addChild ( "Наименование", "Статус заказа" );
|
|||
|
|
$s1_3->addChild ( "Значение", "[N] Принят" );
|
|||
|
|
}
|
|||
|
|
if($order->status == 2)
|
|||
|
|
{
|
|||
|
|
$s1_2 = $doc->addChild ( "ЗначенияРеквизитов" );
|
|||
|
|
$s1_3 = $s1_2->addChild ( "ЗначениеРеквизита" );
|
|||
|
|
$s1_3->addChild ( "Наименование", "Статус заказа" );
|
|||
|
|
$s1_3->addChild ( "Значение", "[F] Доставлен" );
|
|||
|
|
}
|
|||
|
|
if($order->status == 3)
|
|||
|
|
{
|
|||
|
|
$s1_2 = $doc->addChild ( "ЗначенияРеквизитов" );
|
|||
|
|
$s1_3 = $s1_2->addChild ( "ЗначениеРеквизита" );
|
|||
|
|
$s1_3->addChild ( "Наименование", "Отменен" );
|
|||
|
|
$s1_3->addChild ( "Значение", "true" );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
header ( "Content-type: text/xml; charset=utf-8" );
|
|||
|
|
print "\xEF\xBB\xBF";
|
|||
|
|
|
|||
|
|
print $xml->asXML ();
|
|||
|
|
|
|||
|
|
$simpla->settings->last_1c_orders_export_date = date("Y-m-d H:i:s");
|
|||
|
|
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if($simpla->request->get('type') == 'sale' && $simpla->request->get('mode') == 'success')
|
|||
|
|
{
|
|||
|
|
$simpla->settings->last_1c_orders_export_date = date("Y-m-d H:i:s");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
if($simpla->request->get('type') == 'catalog' && $simpla->request->get('mode') == 'checkauth')
|
|||
|
|
{
|
|||
|
|
print "success\n";
|
|||
|
|
print session_name()."\n";
|
|||
|
|
print session_id();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if($simpla->request->get('type') == 'catalog' && $simpla->request->get('mode') == 'init')
|
|||
|
|
{
|
|||
|
|
$tmp_files = glob($dir.'*.*');
|
|||
|
|
if(is_array($tmp_files))
|
|||
|
|
foreach($tmp_files as $v)
|
|||
|
|
{
|
|||
|
|
unlink($v);
|
|||
|
|
}
|
|||
|
|
unset($_SESSION['last_1c_imported_variant_num']);
|
|||
|
|
unset($_SESSION['last_1c_imported_product_num']);
|
|||
|
|
unset($_SESSION['features_mapping']);
|
|||
|
|
unset($_SESSION['categories_mapping']);
|
|||
|
|
unset($_SESSION['brand_id_option']);
|
|||
|
|
print "zip=no\n";
|
|||
|
|
print "file_limit=1000000\n";
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if($simpla->request->get('type') == 'catalog' && $simpla->request->get('mode') == 'file')
|
|||
|
|
{
|
|||
|
|
$filename = basename($simpla->request->get('filename'));
|
|||
|
|
$f = fopen($dir.$filename, 'ab');
|
|||
|
|
fwrite($f, file_get_contents('php://input'));
|
|||
|
|
fclose($f);
|
|||
|
|
print "success\n";
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if($simpla->request->get('type') == 'catalog' && $simpla->request->get('mode') == 'import')
|
|||
|
|
{
|
|||
|
|
$filename = basename($simpla->request->get('filename'));
|
|||
|
|
|
|||
|
|
if($filename === 'import.xml')
|
|||
|
|
{
|
|||
|
|
// Категории и свойства (только в первом запросе пакетной передачи)
|
|||
|
|
if(!isset($_SESSION['last_1c_imported_product_num']))
|
|||
|
|
{
|
|||
|
|
$z = new XMLReader;
|
|||
|
|
$z->open($dir.$filename);
|
|||
|
|
while ($z->read() && $z->name !== 'Классификатор');
|
|||
|
|
$xml = new SimpleXMLElement($z->readOuterXML());
|
|||
|
|
$z->close();
|
|||
|
|
import_categories($xml);
|
|||
|
|
import_features($xml);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Товары
|
|||
|
|
$z = new XMLReader;
|
|||
|
|
$z->open($dir.$filename);
|
|||
|
|
|
|||
|
|
while ($z->read() && $z->name !== 'Товар');
|
|||
|
|
|
|||
|
|
// Последний товар, на котором остановились
|
|||
|
|
$last_product_num = 0;
|
|||
|
|
if(isset($_SESSION['last_1c_imported_product_num']))
|
|||
|
|
$last_product_num = $_SESSION['last_1c_imported_product_num'];
|
|||
|
|
|
|||
|
|
// Номер текущего товара
|
|||
|
|
$current_product_num = 0;
|
|||
|
|
|
|||
|
|
while($z->name === 'Товар')
|
|||
|
|
{
|
|||
|
|
if($current_product_num >= $last_product_num)
|
|||
|
|
{
|
|||
|
|
$xml = new SimpleXMLElement($z->readOuterXML());
|
|||
|
|
|
|||
|
|
// Товары
|
|||
|
|
import_product($xml);
|
|||
|
|
|
|||
|
|
$exec_time = microtime(true) - $start_time;
|
|||
|
|
if($exec_time+1>=$max_exec_time)
|
|||
|
|
{
|
|||
|
|
header ( "Content-type: text/xml; charset=utf-8" );
|
|||
|
|
print "\xEF\xBB\xBF";
|
|||
|
|
print "progress\r\n";
|
|||
|
|
print "Выгружено товаров: $current_product_num\r\n";
|
|||
|
|
$_SESSION['last_1c_imported_product_num'] = $current_product_num;
|
|||
|
|
exit();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
$z->next('Товар');
|
|||
|
|
$current_product_num ++;
|
|||
|
|
}
|
|||
|
|
$z->close();
|
|||
|
|
print "success";
|
|||
|
|
//unlink($dir.$filename);
|
|||
|
|
unset($_SESSION['last_1c_imported_product_num']);
|
|||
|
|
}
|
|||
|
|
elseif($filename === 'offers.xml')
|
|||
|
|
{
|
|||
|
|
// Варианты
|
|||
|
|
$z = new XMLReader;
|
|||
|
|
$z->open($dir.$filename);
|
|||
|
|
|
|||
|
|
while ($z->read() && $z->name !== 'Предложение');
|
|||
|
|
|
|||
|
|
// Последний вариант, на котором остановились
|
|||
|
|
$last_variant_num = 0;
|
|||
|
|
if(isset($_SESSION['last_1c_imported_variant_num']))
|
|||
|
|
$last_variant_num = $_SESSION['last_1c_imported_variant_num'];
|
|||
|
|
|
|||
|
|
// Номер текущего товара
|
|||
|
|
$current_variant_num = 0;
|
|||
|
|
|
|||
|
|
while($z->name === 'Предложение')
|
|||
|
|
{
|
|||
|
|
if($current_variant_num >= $last_variant_num)
|
|||
|
|
{
|
|||
|
|
$xml = new SimpleXMLElement($z->readOuterXML());
|
|||
|
|
// Варианты
|
|||
|
|
import_variant($xml);
|
|||
|
|
|
|||
|
|
$exec_time = microtime(true) - $start_time;
|
|||
|
|
if($exec_time+1>=$max_exec_time)
|
|||
|
|
{
|
|||
|
|
header ( "Content-type: text/xml; charset=utf-8" );
|
|||
|
|
print "\xEF\xBB\xBF";
|
|||
|
|
print "progress\r\n";
|
|||
|
|
print "Выгружено ценовых предложений: $current_variant_num\r\n";
|
|||
|
|
$_SESSION['last_1c_imported_variant_num'] = $current_variant_num;
|
|||
|
|
exit();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
$z->next('Предложение');
|
|||
|
|
$current_variant_num ++;
|
|||
|
|
}
|
|||
|
|
$z->close();
|
|||
|
|
print "success";
|
|||
|
|
//unlink($dir.$filename);
|
|||
|
|
unset($_SESSION['last_1c_imported_variant_num']);
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
function import_categories($xml, $parent_id = 0)
|
|||
|
|
{
|
|||
|
|
global $simpla;
|
|||
|
|
global $dir;
|
|||
|
|
if(isset($xml->Группы->Группа))
|
|||
|
|
foreach ($xml->Группы->Группа as $xml_group)
|
|||
|
|
{
|
|||
|
|
$simpla->db->query('SELECT id FROM __categories WHERE external_id=?', $xml_group->Ид);
|
|||
|
|
$category_id = $simpla->db->result('id');
|
|||
|
|
if(empty($category_id))
|
|||
|
|
$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->Наименование ));
|
|||
|
|
$_SESSION['categories_mapping'][strval($xml_group->Ид)] = $category_id;
|
|||
|
|
import_categories($xml_group, $category_id);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
function import_features($xml)
|
|||
|
|
{
|
|||
|
|
global $simpla;
|
|||
|
|
global $dir;
|
|||
|
|
global $brand_option_name;
|
|||
|
|
|
|||
|
|
$property = array();
|
|||
|
|
if(isset($xml->Свойства->СвойствоНоменклатуры))
|
|||
|
|
$property = $xml->Свойства->СвойствоНоменклатуры;
|
|||
|
|
|
|||
|
|
if(isset($xml->Свойства->Свойство))
|
|||
|
|
$property = $xml->Свойства->Свойство;
|
|||
|
|
|
|||
|
|
foreach ($property as $xml_feature)
|
|||
|
|
{
|
|||
|
|
// Если свойство содержит производителя товаров
|
|||
|
|
if($xml_feature->Наименование == $brand_option_name)
|
|||
|
|
{
|
|||
|
|
// Запомним в сессии Ид свойства с производителем
|
|||
|
|
$_SESSION['brand_option_id'] = strval($xml_feature->Ид);
|
|||
|
|
}
|
|||
|
|
// Иначе обрабатываем как обычной свойство товара
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
$simpla->db->query('SELECT id FROM __features WHERE name=?', strval($xml_feature->Наименование));
|
|||
|
|
$feature_id = $simpla->db->result('id');
|
|||
|
|
if(empty($feature_id))
|
|||
|
|
$feature_id = $simpla->features->add_feature(array('name'=>strval($xml_feature->Наименование)));
|
|||
|
|
$_SESSION['features_mapping'][strval($xml_feature->Ид)] = $feature_id;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
function import_product($xml_product)
|
|||
|
|
{
|
|||
|
|
global $simpla;
|
|||
|
|
global $dir;
|
|||
|
|
global $brand_option_name;
|
|||
|
|
global $full_update;
|
|||
|
|
// Товары
|
|||
|
|
|
|||
|
|
|
|||
|
|
// Id товара и варианта (если есть) по 1С
|
|||
|
|
@list($product_1c_id, $variant_1c_id) = explode('#', $xml_product->Ид);
|
|||
|
|
if(empty($variant_1c_id))
|
|||
|
|
$variant_1c_id = '';
|
|||
|
|
|
|||
|
|
// Ид категории
|
|||
|
|
if(isset($xml_product->Группы->Ид))
|
|||
|
|
$category_id = $_SESSION['categories_mapping'][strval($xml_product->Группы->Ид)];
|
|||
|
|
|
|||
|
|
|
|||
|
|
// Подгатавливаем вариант
|
|||
|
|
$variant_id = null;
|
|||
|
|
$variant = null;
|
|||
|
|
$values = array();
|
|||
|
|
if(isset($xml_product->ХарактеристикиТовара->ХарактеристикаТовара))
|
|||
|
|
foreach($xml_product->ХарактеристикиТовара->ХарактеристикаТовара as $xml_property)
|
|||
|
|
$values[] = $xml_property->Значение;
|
|||
|
|
if(!empty($values))
|
|||
|
|
$variant->name = implode(', ', $values);
|
|||
|
|
$variant->sku = (string)$xml_product->Артикул;
|
|||
|
|
$variant->external_id = $variant_1c_id;
|
|||
|
|
|
|||
|
|
// Ищем товар
|
|||
|
|
$simpla->db->query('SELECT id FROM __products WHERE external_id=?', $product_1c_id);
|
|||
|
|
$product_id = $simpla->db->result('id');
|
|||
|
|
if(empty($product_id) && !empty($variant->sku))
|
|||
|
|
{
|
|||
|
|
$simpla->db->query('SELECT product_id, id FROM __variants WHERE sku=?', $variant->sku);
|
|||
|
|
$res = $simpla->db->result();
|
|||
|
|
$product_id = $res->product_id;
|
|||
|
|
$variant_id = $res->id;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Если такого товара не нашлось
|
|||
|
|
if(empty($product_id))
|
|||
|
|
{
|
|||
|
|
// Добавляем товар
|
|||
|
|
$description = '';
|
|||
|
|
if(!empty($xml_product->Описание))
|
|||
|
|
$description = $xml_product->Описание;
|
|||
|
|
$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));
|
|||
|
|
|
|||
|
|
// Добавляем товар в категории
|
|||
|
|
if(isset($category_id))
|
|||
|
|
$simpla->categories->add_product_category($product_id, $category_id);
|
|||
|
|
|
|||
|
|
|
|||
|
|
// Добавляем изображение товара
|
|||
|
|
if(isset($xml_product->Картинка))
|
|||
|
|
{
|
|||
|
|
foreach($xml_product->Картинка as $img)
|
|||
|
|
{
|
|||
|
|
$image = basename($xml_product->Картинка);
|
|||
|
|
if(!empty($image) && is_file($dir.$image) && is_writable($simpla->config->original_images_dir))
|
|||
|
|
{
|
|||
|
|
rename($dir.$image, $simpla->config->original_images_dir.$image);
|
|||
|
|
$simpla->products->add_image($product_id, $image);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
//Если нашелся товар
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
if(empty($variant_id) && !empty($variant_1c_id))
|
|||
|
|
{
|
|||
|
|
$simpla->db->query('SELECT id FROM __variants WHERE external_id=? AND product_id=?', $variant_1c_id, $product_id);
|
|||
|
|
$variant_id = $simpla->db->result('id');
|
|||
|
|
}
|
|||
|
|
elseif(empty($variant_id) && empty($variant_1c_id))
|
|||
|
|
{
|
|||
|
|
$simpla->db->query('SELECT id FROM __variants WHERE product_id=?', $product_id);
|
|||
|
|
$variant_id = $simpla->db->result('id');
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Обновляем товар
|
|||
|
|
if($full_update)
|
|||
|
|
{
|
|||
|
|
$description = '';
|
|||
|
|
if(!empty($xml_product->Описание))
|
|||
|
|
$description = $xml_product->Описание;
|
|||
|
|
$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));
|
|||
|
|
|
|||
|
|
// Обновляем категорию товара
|
|||
|
|
if(isset($category_id) && !empty($product_id))
|
|||
|
|
{
|
|||
|
|
$query = $simpla->db->placehold('DELETE FROM __products_categories WHERE product_id=?', $product_id);
|
|||
|
|
$simpla->db->query($query);
|
|||
|
|
$simpla->categories->add_product_category($product_id, $category_id);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Обновляем изображение товара
|
|||
|
|
if(isset($xml_product->Картинка))
|
|||
|
|
{
|
|||
|
|
foreach($xml_product->Картинка as $img)
|
|||
|
|
{
|
|||
|
|
$image = basename($img);
|
|||
|
|
if(!empty($image) && is_file($dir.$image) && is_writable($simpla->config->original_images_dir))
|
|||
|
|
{
|
|||
|
|
$simpla->db->query('SELECT id FROM __images WHERE product_id=? ORDER BY position LIMIT 1', $product_id);
|
|||
|
|
$img_id = $simpla->db->result('id');
|
|||
|
|
if(!empty($img_id))
|
|||
|
|
$simpla->products->delete_image($img_id);
|
|||
|
|
rename($dir.$image, $simpla->config->original_images_dir.$image);
|
|||
|
|
$simpla->products->add_image($product_id, $image);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Если не найден вариант, добавляем вариант один к товару
|
|||
|
|
if(empty($variant_id))
|
|||
|
|
{
|
|||
|
|
$variant->product_id = $product_id;
|
|||
|
|
$variant->stock = 0;
|
|||
|
|
$variant_id = $simpla->variants->add_variant($variant);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
$simpla->variants->update_variant($variant_id, $variant);
|
|||
|
|
}
|
|||
|
|
// Свойства товара
|
|||
|
|
if(isset($xml_product->ЗначенияСвойств->ЗначенияСвойства))
|
|||
|
|
{
|
|||
|
|
foreach ($xml_product->ЗначенияСвойств->ЗначенияСвойства as $xml_option)
|
|||
|
|
{
|
|||
|
|
if(isset($_SESSION['features_mapping'][strval($xml_option->Ид)]))
|
|||
|
|
{
|
|||
|
|
$feature_id = $_SESSION['features_mapping'][strval($xml_option->Ид)];
|
|||
|
|
if(isset($category_id) && !empty($feature_id))
|
|||
|
|
{
|
|||
|
|
$simpla->features->add_feature_category($feature_id, $category_id);
|
|||
|
|
$values = array();
|
|||
|
|
foreach($xml_option->Значение as $xml_value)
|
|||
|
|
$values[] = strval($xml_value);
|
|||
|
|
$simpla->features->update_option($product_id, $feature_id, implode(' ,', $values));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// Если свойство оказалось названием бренда
|
|||
|
|
elseif(isset($_SESSION['brand_option_id']) && !empty($xml_option->Значение))
|
|||
|
|
{
|
|||
|
|
$brand_name = strval($xml_option->Значение);
|
|||
|
|
// Добавим бренд
|
|||
|
|
// Найдем его по имени
|
|||
|
|
$simpla->db->query('SELECT id FROM __brands WHERE name=?', $brand_name);
|
|||
|
|
if(!$brand_id = $simpla->db->result('id'))
|
|||
|
|
// Создадим, если не найден
|
|||
|
|
$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)));
|
|||
|
|
if(!empty($brand_id))
|
|||
|
|
$simpla->products->update_product($product_id, array('brand_id'=>$brand_id));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
// Если нужно - удаляем вариант или весь товар
|
|||
|
|
if($xml_product->Статус == 'Удален')
|
|||
|
|
{
|
|||
|
|
$simpla->variants->delete_variant($variant_id);
|
|||
|
|
$simpla->db->query('SELECT count(id) as variants_num FROM __variants WHERE product_id=?', $product_id);
|
|||
|
|
if($simpla->db->result('variants_num') == 0)
|
|||
|
|
$simpla->products->delete_product($product_id);
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function import_variant($xml_variant)
|
|||
|
|
{
|
|||
|
|
global $simpla;
|
|||
|
|
global $dir;
|
|||
|
|
$variant = null;
|
|||
|
|
// Id товара и варианта (если есть) по 1С
|
|||
|
|
@list($product_1c_id, $variant_1c_id) = explode('#', $xml_variant->Ид);
|
|||
|
|
if(empty($variant_1c_id))
|
|||
|
|
$variant_1c_id = '';
|
|||
|
|
|
|||
|
|
$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);
|
|||
|
|
$variant_id = $simpla->db->result('id');
|
|||
|
|
|
|||
|
|
$variant->price = $xml_variant->Цены->Цена->ЦенаЗаЕдиницу;
|
|||
|
|
// Конвертируем цену из валюты 1С в базовую валюту магазина
|
|||
|
|
if(!empty($xml_variant->Цены->Цена->Валюта))
|
|||
|
|
{
|
|||
|
|
// Ищем валюту по коду
|
|||
|
|
$simpla->db->query("SELECT id, rate_from, rate_to FROM __currencies WHERE code like ?", $xml_variant->Цены->Цена->Валюта);
|
|||
|
|
$variant_currency = $simpla->db->result();
|
|||
|
|
// Если не нашли - ищем по обозначению
|
|||
|
|
if(empty($variant_currency))
|
|||
|
|
{
|
|||
|
|
$simpla->db->query("SELECT id, rate_from, rate_to FROM __currencies WHERE sign like ?", $xml_variant->Цены->Цена->Валюта);
|
|||
|
|
$variant_currency = $simpla->db->result();
|
|||
|
|
}
|
|||
|
|
// Если нашли валюту - конвертируем из нее в базовую
|
|||
|
|
if($variant_currency && $variant_currency->rate_from>0 && $variant_currency->rate_to>0)
|
|||
|
|
{
|
|||
|
|
$variant->price = floatval($variant->price)*$variant_currency->rate_to/$variant_currency->rate_from;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
$variant->stock = $xml_variant->Количество;
|
|||
|
|
$simpla->variants->update_variant($variant_id, $variant);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function translit($text)
|
|||
|
|
{
|
|||
|
|
$ru = explode('-', "А-а-Б-б-В-в-Ґ-ґ-Г-г-Д-д-Е-е-Ё-ё-Є-є-Ж-ж-З-з-И-и-І-і-Ї-ї-Й-й-К-к-Л-л-М-м-Н-н-О-о-П-п-Р-р-С-с-Т-т-У-у-Ф-ф-Х-х-Ц-ц-Ч-ч-Ш-ш-Щ-щ-Ъ-ъ-Ы-ы-Ь-ь-Э-э-Ю-ю-Я-я");
|
|||
|
|
$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");
|
|||
|
|
|
|||
|
|
$res = str_replace($ru, $en, $text);
|
|||
|
|
$res = preg_replace("/[\s]+/ui", '-', $res);
|
|||
|
|
$res = strtolower(preg_replace("/[^0-9a-zа-я\-]+/ui", '', $res));
|
|||
|
|
|
|||
|
|
return $res;
|
|||
|
|
}
|
|||
|
|
|