В целом все отлично работает, кроме статусов.
После выгрузки заказов в МС, в диафане статус автоматом становится ВЫПОЛНЕН. Хотя при этом в "мой склад" стоит статус принят.
Как их подружить?
С 1С и статусам заказа хуже дело обстоит, там нормально сделать только конфигурацию 1с править, обработку выгрузки. Так как приходит только статус "в обработке" остальные 1с не считает нужным присылать, в том числе "выполнен". Протокол не обязывает 1с присылать все статусы, а их там всего пара-тройка.
Я вот какое решение делал для такого случая
Сделал и на моем складе и на сайте одинаковые статусы заказов, чтобы при синхронизации по имени сопоставлять.
Затем доделал функцию синхронизации заказов
modules/shop/shop.1c.php 504 строка заменить функцию
Код
/**
* Обмен информацией о заказах: отправка файла обмена на сайт
*
* @return void
*/
private function sale_file()
{
$filename = basename($_GET['filename']);
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();
}
}
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";
}
Там еще были доделки, я их убрал из кода, поэтому проверяйте, вместе исправим если что.
С этим кодом статусы сопоставляются хорошо - спасибо!
Может подскажите: почему сумма по заказу сбрасывается в диафан каждый раз после обмена информацией с "Мой склад".
Причем если зайти в сам заказ в диафане и сохранить его, сумма появляется.
В новой сборке совершили революцию в структурировании кастомизированной информации в шаблонах, добавили авторегистрацию пользователей, усовершенствовали защиту от спама, актуализировали накопительную скидку, а также улучшили производительность и стабильность работы системы.
После выхода сборки 7.1 мы выпустили уже три патча, в каждом из которых улучшаем административную часть сайта. Сборка DIAFAN.CMS 7.1.3 уже доступна к установке.