• Модуль: 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;
}