Вход • Регистрация

синхронизация с Мой склад

  • 24 апреля 2015 г.
  • В целом все отлично работает, кроме статусов.
    После выгрузки заказов в МС, в диафане статус автоматом становится ВЫПОЛНЕН. Хотя при этом в "мой склад" стоит статус принят.
    Как их подружить?

    Галочка в "Мой склад" стоит. (выгружать статусы)
  • 18 мая 2015 г.
  • Есть идеи правильной настройки статусов в Диафан?
  • 15 ноября 2015 г.
  • Вот и меня тоже самое интересует.. С 1С УТ тоже самое происходит.. Как быть?
    • 16 ноября 2015 г.
    • С 1С и статусам заказа хуже дело обстоит, там нормально сделать только конфигурацию 1с править, обработку выгрузки. Так как приходит только статус "в обработке" остальные 1с не считает нужным присылать, в том числе "выполнен". Протокол не обязывает 1с присылать все статусы, а их там всего пара-тройка.
  • 16 ноября 2015 г.
  • Я вот какое решение делал для такого случая
    Сделал и на моем складе и на сайте одинаковые статусы заказов, чтобы при синхронизации по имени сопоставлять.
    Затем доделал функцию синхронизации заказов
    modules/shop/shop.1c.php 504 строка заменить функцию
    Код
    /**
    * Обмен информацией о заказах: отправка файла обмена на сайт
    *
    * @return void
    */
    private function sale_file()
    {
    $filename = basename($_GET['filename']);

    if(preg_match('/\.php$/', $filename))
    {
    return;
    }

    File::save_file(file_get_contents('php://input'), 'tmp/1c/'.$filename);

    $xml = simplexml_load_file(ABSOLUTE_PATH.'tmp/1c/'.$filename);

    File::delete_file('tmp/1c/'.$filename);

    foreach ($xml->Документ as $xml_order)
    {
    $id = $xml_order->Номер;
    list($y, $m, $d) = explode('-', $xml_order->Дата);
    list($h, $i, $s) = explode(':', $xml_order->Время);
    $created = mktime($h, $i, $s, $m, $d, $y);

    $status_name='';
    if(isset($xml_order->ЗначенияРеквизитов->ЗначениеРеквизита))
    {
    foreach($xml_order->ЗначенияРеквизитов->ЗначениеРеквизита as $r)
    {
    switch ($r->Наименование)
    {
    case 'Проведен':
    $proveden = ($r->Значение == 'true');
    break;

    case 'ПометкаУдаления':
    $udalen = ($r->Значение == 'true');
    break;
    case 'Статус заказа':
    $status_name = strval($r->Значение) ;
    break;
    }
    }
    }

    if(! empty($udalen))
    {
    $status = 2;
    }
    elseif(! empty($proveden))
    {
    $status = 3;
    }
    else
    {
    $status = 0;
    }

    if(!empty($status_name))
    {
    $status_id = DB::query_result("SELECT id FROM {shop_order_status} WHERE name1='%s' AND trash='0' LIMIT 1", $status_name);
    }
    else
    $status_id = DB::query_result("SELECT id FROM {shop_order_status} WHERE status='%d' AND trash='0' LIMIT 1", $status);

    if(DB::query_result("SELECT id FROM {shop_order} WHERE id=%d", $id))
    {
    $status_id_old=DB::query_result("SELECT status_id FROM {shop_order} WHERE id=%d", $id);
    if($status == 1)
    {
    $this->diafan->_shop->order_pay($id);
    }
    else if($status_id_old!=$status_id)
    {
    $this->diafan->_shop->order_send_mail_change_status($id, $status_id);
    }
    DB::query("UPDATE {shop_order} SET status='%d', status_id=%d, created=%d WHERE id=%d", $status, $status_id, $created, $id);
    }
    else
    {
    DB::query("INSERT INTO {shop_order} (status, status_id, created".($id ? ", id" : '').") VALUES ('%d', %d, %d".($id ? ", %d" : '').")", $status, $status_id, $created, $id);
    if(! $id)
    {
    $id = DB::insert_id();
    }
    }

    $order_goods = array();
    // Товары
    foreach ($xml_order->Товары->Товар as $xml_product)
    {
    $import_good_id = 0;
    $import_price_id = '';
    $order_goods_id = 0;
    $good_id = 0;
    if(strstr($xml_product->Ид, '#'))
    {
    list($import_good_id, $import_price_id) = explode('#', $xml_product->Ид, 2);
    }
    else
    {
    $import_good_id = $xml_product->Ид;
    }

    $article = $xml_product->Артикул;
    $name = $xml_product->Наименование;
    $count_goods = $xml_product->Количество;
    $price = $xml_product->ЦенаЗаЕдиницу;
    $discount_id = 0;

    if(isset($xml_product->Скидки->Скидка))
    {
    $discount_id = DB::query_result("SELECT id FROM {shop_discount} WHERE discount=%d", $xml_product->Скидки->Скидка->Процент);
    }
    $join_params = '';
    if($import_good_id)
    {
    $good_id = DB::query_result("SELECT id FROM {shop} WHERE import_id='%h'".(! preg_match('/[^0-9]+/', $import_good_id) ? " OR id='%s'" : ''), $import_good_id, $import_good_id);
    if($good_id && $import_price_id)
    {
    $price_id = DB::query_result("SELECT price_id FROM {shop_price} WHERE good_id=%d AND import_id='%h'".(! preg_match('/[^0-9]+/', $import_price_id) ? " OR price_id='%s'" : ''), $good_id,$import_price_id, $import_price_id);
    if($price_id)
    {
    $rs = DB::query_fetch_all("SELECT * FROM {shop_price_param} WHERE price_id=%d", $price_id);
    foreach ($rs as $r)
    {
    if($r["param_value"])
    {
    $i = (empty($i) ? 1 : $i + 1);
    $join_params .= " INNER JOIN {shop_order_goods_param} AS p".$i." ON p".$i.".order_goods_id=g.id AND p".$i.".param_id=".$r["param_id"]." AND p".$i.".value=".$r["param_value"];
    }
    }
    }
    }
    }
    if(! $good_id && $article)
    {
    if(! $good_id = DB::query_result("SELECT id FROM {shop} WHERE article='%h'", $article))
    continue;
    }
    if(! $good_id && $name)
    {
    if(! $good_id = DB::query_result("SELECT id FROM {shop} WHERE [name]='%h'", $name))
    continue;
    }

    $order_goods_id = DB::query_result("SELECT g.id FROM {shop_order_goods} AS g".$join_params." WHERE g.order_id=%d AND g.good_id=%d AND g.trash='0'", $id, $good_id);

    if($order_goods_id)
    {
    DB::query("UPDATE {shop_order_goods} SET count_goods=%d, price=%f, discount_id=%d WHERE id=%d", $count_goods, $price, $discount_id, $order_goods_id);
    }
    else
    {
    $order_goods_id = DB::query("INSERT INTO {shop_order_goods} (order_id, good_id, count_goods, price, discount_id) VALUES (%d, %d, %d, %f, %d)", $id, $good_id, $count_goods, $price, $discount_id);
    }
    $order_goods[] = $order_goods_id;
    }
    // удаляет покупки, которых нет в файле
    if($order_goods)
    {
    $del_goods = DB::query_fetch_value("SELECT id FROM {shop_order_goods} WHERE id NOT IN (%s) AND order_id=%d", implode(",", $order_goods), $id, "id");
    if($del_goods)
    {
    DB::query("DELETE FROM {shop_order_goods_param} WHERE order_goods_id IN (%s)", implode(",", $del_goods));
    DB::query("DELETE FROM {shop_order_goods} WHERE id IN (%s)", implode(",", $del_goods));
    }
    }
    DB::query("UPDATE {shop_order} SET summ=%f WHERE id=%d", $xml_order->Сумма, $id);
    }

    echo "success";
    }


    Там еще были доделки, я их убрал из кода, поэтому проверяйте, вместе исправим если что.
    • 04 февраля 2020 г.
    • С этим кодом статусы сопоставляются хорошо - спасибо!
      Может подскажите: почему сумма по заказу сбрасывается в диафан каждый раз после обмена информацией с "Мой склад".
      Причем если зайти в сам заказ в диафане и сохранить его, сумма появляется.

Новости

  • 18 июня
  • В сборке большое обновление demo-шаблона, дополнительная защита от спама, улучшение YML-импорта и еще много важного и интересного.
  • 24 апреля
  • В новой сборке совершили революцию в структурировании кастомизированной информации в шаблонах, добавили авторегистрацию пользователей, усовершенствовали защиту от спама, актуализировали накопительную скидку, а также улучшили производительность и стабильность работы системы.
  • 12 января
  • После выхода сборки 7.1 мы выпустили уже три патча, в каждом из которых улучшаем административную часть сайта. Сборка DIAFAN.CMS 7.1.3 уже доступна к установке. 

Форум