- Модуль: sale
- Путь к файлу: ~/bitrix/modules/sale/lib/entitymarker.php
- Класс: BitrixSaleEntityMarker
- Вызов: EntityMarker::saveMarkers
static function saveMarkers(Order $order = null)
{
global $USER;
$result = new Result();
$saveList = array();
$oldMarkerDataList = array();
$orderCode = null;
$newOrderList = array();
if ($order instanceof Order && $order->getId() > 0)
{
$orderCode = $order->getInternalId();
}
foreach (static::$pool as $orderIndex => $entityList)
{
foreach ($entityList as $entityType => $fieldsList)
{
foreach ($fieldsList as $fieldIndex => $values)
{
if ($values['ORDER'] instanceof Order)
{
if (empty($values['ORDER_ID']) && $values['ORDER']->getId() > 0)
{
$values['ORDER_ID'] = $values['ORDER']->getId();
$newOrderList[] = $values['ORDER_ID'];
}
if ($order instanceof Order && $values['ORDER']->getInternalId() != $order->getInternalId())
{
continue 3;
}
}
if (!empty($values['ENTITY']) && $values['ENTITY'] instanceof InternalsEntity)
{
if (empty($values['ENTITY_TYPE']))
{
$entityType = static::getEntityType($values['ENTITY']);
if (strval($entityType) != '')
{
$values['ENTITY_TYPE'] = $entityType;
}
}
if (!isset($values['ENTITY_ID']) || intval($values['ENTITY_ID']) <= 0)
{
$values['ENTITY_ID'] = $values['ENTITY']->getId();
}
}
$fields = array();
if (empty($values['ID']))
{
if (intval($values['ENTITY_ID']) <= 0)
{
continue;
}
if (empty($values['ENTITY_TYPE']))
{
throw new MainArgumentNullException('ENTITY_TYPE');
}
$fields = array(
'ENTITY_TYPE' => $values['ENTITY_TYPE'],
'ENTITY_ID' => intval($values['ENTITY_ID']),
'TYPE' => $values['TYPE'] ?? '',
'CODE' => $values['CODE'] ?? '',
'MESSAGE' => $values['MESSAGE'] ?? '',
'COMMENT' => $values['COMMENT'] ?? '',
);
if (is_object($USER) && $USER->IsAuthorized())
{
$fields['USER_ID'] = $USER->GetID();
}
}
if (intval($values['ORDER_ID']) >= 0)
{
$fields['ORDER_ID'] = intval($values['ORDER_ID']);
}
if (empty($fields['ENTITY_ID']) && intval($values['ENTITY_ID']) >= 0)
{
$fields['ENTITY_ID'] = intval($values['ENTITY_ID']);
}
if (empty($fields['ENTITY_TYPE']) && !empty($values['ENTITY_TYPE']))
{
$fields['ENTITY_TYPE'] = $values['ENTITY_TYPE'];
}
if (!empty($values['ID']))
{
$fields['ID'] = $values['ID'];
}
if (!empty($values['SUCCESS']))
{
$fields['SUCCESS'] = $values['SUCCESS'];
}
if (!empty($values['DATE_CREATE']) && $values['DATE_CREATE'] instanceof MainTypeDate)
{
$fields['DATE_CREATE'] = $values['DATE_CREATE'];
}
if (!empty($values['DATE_UPDATE']) && $values['DATE_UPDATE'] instanceof MainTypeDate)
{
$fields['DATE_UPDATE'] = $values['DATE_UPDATE'];
}
if ($values['ORDER'] instanceof Order)
{
unset(static::$pool[$values['ORDER']->getInternalId()][$entityType][$fieldIndex]);
}
if (empty($fields))
continue;
$markerOrderId = null;
if (!empty($values['ORDER_ID']))
{
$markerOrderId = $values['ORDER_ID'];
}
$saveList[$markerOrderId][] = $fields;
}
}
}
if (!empty($saveList) && is_array($saveList))
{
$filter = array(
'select' => array(
'ID', 'ORDER_ID', 'ENTITY_TYPE', 'ENTITY_ID', 'CODE', 'SUCCESS', 'MESSAGE'
),
'filter' => array(
'!=SUCCESS' => static::ENTITY_SUCCESS_CODE_DONE
),
'order' => array('ID' => 'ASC')
);
foreach ($saveList as $fieldsList)
{
foreach ($fieldsList as $fields)
{
if (!empty($fields['ORDER_ID']) && in_array($fields['ORDER_ID'], $newOrderList))
{
continue;
}
if (!empty($fields['ORDER_ID']) && (empty($filter['filter']['=ORDER_ID']) || !in_array($fields['ORDER_ID'], $filter['filter']['=ORDER_ID'])))
{
$filter['filter']['=ORDER_ID'][] = $fields['ORDER_ID'];
}
if (!empty($fields['ENTITY_TYPE'])
&& (empty($filter['filter']['=ENTITY_TYPE'])
|| (is_array($filter['filter']['=ENTITY_TYPE']) && !in_array($fields['ENTITY_TYPE'], $filter['filter']['=ENTITY_TYPE']))))
{
$filter['filter']['=ENTITY_TYPE'][] = $fields['ENTITY_TYPE'];
}
}
}
if (!empty($filter['filter']['=ENTITY_TYPE']))
{
$res = static::getList($filter);
while($data = $res->fetch())
{
if (isset($saveList[$data['ORDER_ID']]) && is_array($saveList[$data['ORDER_ID']]))
{
foreach($saveList[$data['ORDER_ID']] as $key => $values)
{
if (!empty($values['ID']) && $data['ID'] == $values['ID'])
{
$oldMarkerDataList[$data['ID']] = $data;
$values = array_merge($data, $values);
$saveList[$data['ORDER_ID']][$key] = $values;
continue;
}
$foundItem = false;
if (!$foundItem)
{
foreach (static::getFieldsDuplicateCheck() as $checkField)
{
if (!empty($data[$checkField]) && !empty($values[$checkField]) && $data[$checkField] == $values[$checkField])
{
$foundItem = true;
continue;
}
$foundItem = false;
break;
}
}
if ($foundItem)
{
foreach($saveList[$data['ORDER_ID']] as $doubleKey => $doubleValues)
{
if ($doubleKey == $key)
continue;
if (!empty($doubleValues['ID']) && $data['ID'] == $doubleValues['ID'])
{
if (empty($values['SUCCESS']))
{
unset($doubleValues['SUCCESS']);
}
$values = array_merge($doubleValues, $values);
unset($saveList[$data['ORDER_ID']][$doubleKey]);
}
}
$fields = array(
'ID' => $data['ID'],
);
if (!empty($values['SUCCESS']) && $data['SUCCESS'] != $values['SUCCESS'])
{
$fields['SUCCESS'] = $values['SUCCESS'];
}
$saveList[$data['ORDER_ID']][$key] = $fields;
}
}
}
}
}
foreach ($saveList as $orderId => $fieldsList)
{
foreach ($fieldsList as $fields)
{
if (!empty($fields['ID']))
{
$elementId = intval($fields['ID']);
unset($fields['ID']);
if (empty($fields))
continue;
if (!empty($oldMarkerDataList) && !empty($oldMarkerDataList[$elementId]))
{
foreach($fields as $fieldName => $fieldValue)
{
if (array_key_exists($fieldName, $oldMarkerDataList[$elementId])
&& $oldMarkerDataList[$elementId][$fieldName] == $fieldValue)
{
unset($fields[$fieldName]);
}
}
}
if (empty($fields))
continue;
if (empty($fields['DATE_UPDATE']))
{
$fields['DATE_UPDATE'] = new MainTypeDateTime();
}
if (!empty($fields['SUCCESS']) && $fields['SUCCESS'] == static::ENTITY_SUCCESS_CODE_DONE
&& !empty($oldMarkerDataList) && !empty($oldMarkerDataList[$elementId]))
{
OrderHistory::addAction(
$oldMarkerDataList[$elementId]['ENTITY_TYPE'],
$oldMarkerDataList[$elementId]['ORDER_ID'],
'MARKER_SUCCESS',
$oldMarkerDataList[$elementId]['ENTITY_ID'],
null,
array(
"ENTITY_ID" => $oldMarkerDataList[$elementId]['ENTITY_ID'],
"MESSAGE" => $oldMarkerDataList[$elementId]['MESSAGE'],
"ENTITY_TYPE" => $oldMarkerDataList[$elementId]['ENTITY_TYPE'],
),
OrderHistory::SALE_ORDER_HISTORY_ACTION_LOG_LEVEL_1
);
$r = static::delete($elementId);
if (!$r->isSuccess())
{
$result->addErrors($r->getErrors());
}
continue;
}
$r = static::updateInternal($elementId, $fields);
if (!$r->isSuccess())
{
$result->addErrors($r->getErrors());
}
}
else
{
if (empty($fields['DATE_CREATE']))
{
$fields['DATE_CREATE'] = new MainTypeDateTime();
}
$r = static::addInternal($fields);
if (!$r->isSuccess())
{
$result->addErrors($r->getErrors());
}
}
}
}
}
static::resetMarkers($orderCode);
return $result;
}