Обновление статусов заказов после выгрузки из 1С
Создаем периодический агент. Добавляем в файл /bitrix/php_interface/init.php следующую функцию:
<?
function ordersStatusUpdate()
{
chdir('/полный путь к папке');//Переходим в папку с xml-файлом выгрузки заказов /upload/1c_exchange
$arFile = array();
foreach (glob("*.xml") as $filename) {
$arFile[] = $filename;
}
if(count($arFile)==1){
$filetime = filemtime($arFile[0]);
if (file_exists('../status_exchange_date.txt')){
$time = file_get_contents('../status_exchange_date.txt', FILE_USE_INCLUDE_PATH);
if(intval(trim($filetime))>intval(trim($time))) $ok_date='Y';
else $ok_date='N';
}else{
$ok_date='Y';
}
if($ok_date=='Y') {
file_put_contents('../status_exchange_date.txt', $filetime);
CModule::IncludeModule("iblock");
CModule::IncludeModule("sale");
$obXMLFile = new CIBlockXMLFile;
$obXMLFile->DropTemporaryTables();// Удаляем результат предыдущей загрузки
$strError = '';
if(!$obXMLFile->CreateTemporaryTables()){// Подготавливаем БД
$strError .= 'Ошибка создания БД.'.PHP_EOL;
}
if($fp = fopen($arFile[0], "rb"))
{
$obXMLFile->ReadXMLToDatabase($fp, $NS, 0);// Чтение содержимого файла за один шаг
fclose($fp);
}
if(!CIBlockXMLFile::IndexTemporaryTables()){// Индексируем загруженные данные для ускорения доступа
$strError .= 'Ошибка создания индексов БД.'.PHP_EOL;
}
$CIBlockXMLFile = new CIBlockXMLFile();
$rs = $CIBlockXMLFile->GetList(array());
$arTemp = array();
$arGroups = array();
$step = 0;
$groupStep = 0;
while($ar = $rs->Fetch()){
$arTemp[] = $ar;
if($ar['NAME']=='Номер'){
$groupTemp = array();
$groupTemp['ORDER_ID'] = $ar['VALUE'];
$groupStep = 1;
}elseif($ar['NAME']=='Статус' && $groupStep == 1){
$groupTemp['ORDER_STATUS'] = $ar['VALUE'];
$groupStep = 2;
}
if($groupStep ==2 && count($groupTemp)==2){
$arGroups[$groupTemp['ORDER_ID']] = $groupTemp;
unset($groupTemp);
$groupStep = 0;
}
}
$strAllOrders = $strError;
$strAllOrders .= date("H:i:s d.m.Y").PHP_EOL;
foreach($arGroups as $arOrder){
if($arOrder['ORDER_STATUS']=='Создан') $arOrderFields = array("STATUS_ID" => "C");
elseif($arOrder['ORDER_STATUS']=='Принят') $arOrderFields = array("STATUS_ID" => "N");
elseif($arOrder['ORDER_STATUS']=='В работе') $arOrderFields = array("STATUS_ID" => "W");
elseif($arOrder['ORDER_STATUS']=='Отправлен в ТК') $arOrderFields = array("STATUS_ID" => "S");
elseif($arOrder['ORDER_STATUS']=='Доставлен') $arOrderFields = array("STATUS_ID" => "F");
elseif($arOrder['ORDER_STATUS']=='Удален') $arOrderFields = array("STATUS_ID" => "R");
$arOrder1 = CSaleOrder::GetByID(intval(trim($arOrder['ORDER_ID'])));
if(!empty($arOrderFields) && !empty($arOrder1)){
if (CSaleOrder::Update($arOrder1['ID'], $arOrderFields)){
$strAllOrders .= $arOrder['ORDER_ID'].' - '.$arOrder['ORDER_STATUS'].' (Статус заказа установлен)'.PHP_EOL;
}else{
$strAllOrders .= $arOrder['ORDER_ID'].' - '.$arOrder['ORDER_STATUS'].' (Ошибка установки нового статуса заказа)'.PHP_EOL;
}
}
}
file_put_contents('../ordersstatus.txt', $strAllOrders);
}
}
return "ordersStatusUpdate();";
}
?>
Строки 45-60 изменяем соответственно структуре xml-файла.
Строки 65-70 изменяем соответственно статусам заказов на сайте.
Комментарии (1)
необходимо добавить в начало функции
22 мая, 2020 в 1:25global $USER;
if (!is_object($USER)) $USER = new CUser;