Bitrix-D7  20.0.0
Класс EntityMarker

Открытые статические члены

static addMarker (OrderBase $order, Internals\Entity $entity, Result $result)
 
static updateMarker ($id, array $values, Order $order, Internals\Entity $entity)
 
static getMarker ($orderCode, Internals\Entity $entity=null)
 
static saveMarkers (Order $order=null)
 
static tryFixErrorsByOrder (Order $order, $markerId=null)
 
static tryFixErrors ()
 
static loadFromDb (array $filter)
 
static getEntity (Order $order, $entityType, $entityId)
 
static getList (array $parameters=array())
 
static delete ($id)
 
static getPoolItemSuccess (Order $order, $id, $entityType, $entityId, $code)
 
static hasErrors (Order $order)
 
static getPoolAsResult (OrderBase $order=null)
 
static deleteByOrderId ($id)
 
static deleteByEntity (Internals\Entity $entity)
 
static deleteByFilter (array $values)
 
static refreshMarkers (Order $order)
 

Поля данных

const ENTITY_MARKED_TYPE_AUTO = 'AUTO'
 
const ENTITY_MARKED_TYPE_MANUAL = 'MANUAL'
 
const ENTITY_TYPE_ORDER = 'ORDER'
 
const ENTITY_TYPE_BASKET_ITEM = 'BASKET_ITEM'
 
const ENTITY_TYPE_SHIPMENT = 'SHIPMENT'
 
const ENTITY_TYPE_PAYMENT = 'PAYMENT'
 
const ENTITY_TYPE_PROPERTY_VALUE = 'PROPERTY_VALUE'
 
const ENTITY_SUCCESS_CODE_FAIL = 'N'
 
const ENTITY_SUCCESS_CODE_DONE = 'Y'
 

Защищенные статические члены

static addItem (OrderBase $order, $entityType, array $values)
 
static updateItem ($id, $values, Order $order, $entityType)
 
static getEntityTypeList ()
 
static getEntityType (Internals\Entity $entity)
 
static resetMarkers ($orderCode=null)
 
static addInternal (array $data)
 
static updateInternal ($primary, array $data)
 

Статические защищенные данные

static $pool = array()
 

Подробное описание

См. определение в файле entitymarker.php строка 13

Методы

◆ addInternal()

static addInternal ( array  $data)
staticprotected

См. определение в файле entitymarker.php строка 920

921  {
922  return Internals\EntityMarkerTable::add($data);
923  }

◆ addItem()

static addItem ( OrderBase  $order,
  $entityType,
array  $values 
)
staticprotected
Аргументы
OrderBase$order
$entityType
array$values
Возвращает
bool

См. определение в файле entitymarker.php строка 118

119  {
120  $orderCode = $order->getInternalId();
121 
122  if (!empty(static::$pool[$orderCode]) && !empty(static::$pool[$orderCode][$entityType]) && is_array(static::$pool[$orderCode][$entityType]))
123  {
124  foreach (static::$pool[$orderCode][$entityType] as $index => $fields)
125  {
126  $foundItem = false;
127 
128  foreach (static::getFieldsDuplicateCheck() as $checkField)
129  {
130  if (!empty($fields[$checkField]) && !empty($values[$checkField]) && $fields[$checkField] == $values[$checkField])
131  {
132  $foundItem = true;
133  continue;
134  }
135 
136  $foundItem = false;
137  break;
138  }
139 
140  if ($foundItem)
141  {
142  if (!empty($values['SUCCESS']))
143  {
144  static::$pool[$orderCode][$entityType][$index]['SUCCESS'] = $values['SUCCESS'];
145  return true;
146  }
147  }
148  }
149  }
150 
151  static::$pool[$orderCode][$entityType][] = $values;
152  return true;
153  }

◆ addMarker()

static addMarker ( OrderBase  $order,
Internals\Entity  $entity,
Result  $result 
)
static
Аргументы
OrderBase$order
Internals\Entity$entity
Result$result

См. определение в файле entitymarker.php строка 35

36  {
37  if (!$result->hasWarnings())
38  {
39  return;
40  }
41 
42  $entityType = static::getEntityType($entity);
43  if ($entityType === null)
44  {
45  return;
46  }
47 
48  $fields = array(
49  'ENTITY' => $entity,
50  'ORDER' => $order,
51  );
52 
53  if ($order->getId() > 0)
54  {
55  $fields['ORDER_ID'] = $order->getId();
56  }
57 
58  if ($entity->getId() > 0)
59  {
60  $fields['ENTITY_ID'] = $entity->getId();
61  }
62 
63  $fields['ENTITY_TYPE'] = $entityType;
64  /** @var ResultError $resultError */
65  foreach ($result->getWarnings() as $resultWarning)
66  {
67  $code = $resultWarning->getCode();
68  $message = $resultWarning->getMessage();
69  $isAutoFix = false;
70 
71  if ($entity instanceof \IEntityMarker)
72  {
73  $isAutoFix = $entity->canAutoFixError($code);
74  }
75 
76  $fields['CODE'] = $code;
77  $fields['MESSAGE'] = $message;
78  $fields['TYPE'] = $isAutoFix ? static::ENTITY_MARKED_TYPE_AUTO : static::ENTITY_MARKED_TYPE_MANUAL;
79  $fields['SUCCESS'] = static::ENTITY_SUCCESS_CODE_FAIL;
80  static::addItem($order, $entityType, $fields);
81  }
82  $lastWarning = end($result->getWarnings());
83  $order->setField('REASON_MARKED', $lastWarning->getMessage());
84 
85  }

◆ delete()

static delete (   $id)
static
Аргументы
$id
Возвращает
Main\Entity\DeleteResult
Исключения
Main

См. определение в файле entitymarker.php строка 910

911  {
912  if (intval($id) <= 0)
913  {
914  throw new Main\ArgumentNullException('ID');
915  }
916 
917  return Internals\EntityMarkerTable::delete($id);
918  }

◆ deleteByEntity()

static deleteByEntity ( Internals\Entity  $entity)
static
Аргументы
Internals\Entity$entity
Возвращает
bool

См. определение в файле entitymarker.php строка 1072

1073  {
1074  if($entity->getId() <= 0)
1075  return false;
1076 
1077  if ($entityType = static::getEntityType($entity))
1078  {
1079  $res = static::getList(array(
1080  'filter' => array(
1081  '=ENTITY_ID' => $entity->getId(),
1082  '=ENTITY_TYPE' => $entityType
1083  ),
1084  'select' => array('ID')
1085  ));
1086  while($data = $res->fetch())
1087  {
1088  static::delete($data['ID']);
1089  }
1090  }
1091  }

◆ deleteByFilter()

static deleteByFilter ( array  $values)
static

См. определение в файле entitymarker.php строка 1093

1094  {
1095  $res = static::getList(array(
1096  'filter' => $values,
1097  'select' => array('ID')
1098  ));
1099  while($data = $res->fetch())
1100  {
1101  static::delete($data['ID']);
1102  }
1103  }

◆ deleteByOrderId()

static deleteByOrderId (   $id)
static
Аргументы
$id
Возвращает
bool

См. определение в файле entitymarker.php строка 1050

1051  {
1052  if(intval($id) <= 0)
1053  return false;
1054 
1055  $res = static::getList(array(
1056  'filter' => array(
1057  '=ORDER_ID' => $id
1058  ),
1059  'select' => array('ID')
1060  ));
1061  while($data = $res->fetch())
1062  {
1063  static::delete($data['ID']);
1064  }
1065  }

◆ getEntity()

static getEntity ( Order  $order,
  $entityType,
  $entityId 
)
static
Аргументы
Order$order
string$entityType
int$entityId
Возвращает
Internals\Entity
Исключения
Main

См. определение в файле entitymarker.php строка 834

835  {
836  static $entityList = array();
837 
838  $hash = md5($order->getId(). '|'. $entityType . '|' . $entityId);
839 
840  if (!empty($entityList[$hash]))
841  {
842  return $entityList[$hash];
843  }
844 
845  $entity = null;
846  $entityCollection = null;
847 
848  if ($entityType == static::ENTITY_TYPE_ORDER)
849  {
850  if ($order->getId() == $entityId)
851  {
852  return $order;
853  }
854  return null;
855  }
856  elseif($entityType == static::ENTITY_TYPE_SHIPMENT)
857  {
858  /** @var Internals\EntityCollection $entityCollection */
859  $entityCollection = $order->getShipmentCollection();
860  }
861  elseif($entityType == static::ENTITY_TYPE_PAYMENT)
862  {
863  /** @var Internals\EntityCollection $entityCollection */
864  $entityCollection = $order->getPaymentCollection();
865  }
866  elseif($entityType == static::ENTITY_TYPE_BASKET_ITEM)
867  {
868  /** @var Internals\EntityCollection $entityCollection */
869  $entityCollection = $order->getBasket();
870  }
871 
872  if ($entity === null && !$entityCollection)
873  return null;
874 
875  if ($entity === null)
876  {
877  /** @var Internals\Entity $entity */
878  if (!$entity = $entityCollection->getItemById($entityId))
879  {
880  return null;
881  }
882  }
883 
884  if ($entity !== null)
885  {
886  $entityList[$hash] = $entity;
887  }
888 
889  return $entity;
890  }

◆ getEntityType()

static getEntityType ( Internals\Entity  $entity)
staticprotected
Аргументы
Internals\Entity$entity
Возвращает
null|string

См. определение в файле entitymarker.php строка 266

267  {
268  $typeList = static::getEntityTypeList();
269 
270  foreach ($typeList as $type => $entityClass)
271  {
272  if ($entity instanceof $entityClass)
273  {
274  return $type;
275  }
276  }
277 
278  return null;
279  }

◆ getEntityTypeList()

static getEntityTypeList ( )
staticprotected
Возвращает
array

См. определение в файле entitymarker.php строка 250

251  {
252  return array(
253  static::ENTITY_TYPE_ORDER => '\Bitrix\Sale\OrderBase',
254  static::ENTITY_TYPE_BASKET_ITEM => '\Bitrix\Sale\BasketItemBase',
255  static::ENTITY_TYPE_SHIPMENT => '\Bitrix\Sale\Shipment',
256  static::ENTITY_TYPE_PAYMENT => '\Bitrix\Sale\Payment',
257  static::ENTITY_TYPE_PROPERTY_VALUE => '\Bitrix\Sale\PropertyValue',
258  );
259  }

◆ getList()

static getList ( array  $parameters = array())
static
Аргументы
array$parameters
Возвращает
Main\DB\Result
Исключения
Main

См. определение в файле entitymarker.php строка 898

899  {
900  return Internals\EntityMarkerTable::getList($parameters);
901  }

◆ getMarker()

static getMarker (   $orderCode,
Internals\Entity  $entity = null 
)
static
Аргументы
int$orderCode
Internals\Entity | null$entity
Возвращает
array|null

См. определение в файле entitymarker.php строка 224

225  {
226  if (empty(static::$pool[$orderCode]))
227  {
228  return null;
229  }
230 
231  if ($entity !== null)
232  {
233  $entityType = static::getEntityType($entity);
234  if ($entityType !== null && array_key_exists($entityType, static::$pool[$orderCode]))
235  {
236  return static::$pool[$orderCode][$entityType];
237  }
238  }
239  else
240  {
241  return static::$pool[$orderCode];
242  }
243 
244  return null;
245  }

◆ getPoolAsResult()

static getPoolAsResult ( OrderBase  $order = null)
static
Аргументы
null | OrderBase$order
Возвращает
Result

См. определение в файле entitymarker.php строка 1008

1009  {
1010  $result = new Result();
1011 
1012 
1013  foreach (static::$pool as $entityList)
1014  {
1015  foreach ($entityList as $entityType => $fieldsList)
1016  {
1017  foreach ($fieldsList as $fieldIndex => $values)
1018  {
1019  if ($values['ORDER'] instanceof Order)
1020  {
1021  if ($order instanceof Order && $values['ORDER']->getInternalId() != $order->getInternalId())
1022  {
1023  continue 2;
1024  }
1025  }
1026 
1027  $result->addError(new ResultError($values['MESSAGE'], $values['CODE']));
1028  }
1029  }
1030  }
1031 
1032  return $result;
1033  }

◆ getPoolItemSuccess()

static getPoolItemSuccess ( Order  $order,
  $id,
  $entityType,
  $entityId,
  $code 
)
static
Аргументы
Order$order
int$id
string$entityType
int$entityId
string$code
Возвращает
string|null

См. определение в файле entitymarker.php строка 939

940  {
941  $orderCode = $order->getInternalId();
942 
943  if (!empty(static::$pool[$orderCode]))
944  {
945  foreach (static::$pool[$orderCode] as $poolEntityType => $fieldsList)
946  {
947  foreach ($fieldsList as $fieldIndex => $values)
948  {
949  if ($values['ORDER'] instanceof Order)
950  {
951  if ($order instanceof Order && $values['ORDER']->getInternalId() != $order->getInternalId())
952  {
953  continue 2;
954  }
955  }
956 
957  if (!empty($values['SUCCESS'])
958  && (isset($values['ENTITY_ID']) && intval($values['ENTITY_ID']) == intval($entityId))
959  && (isset($values['ENTITY_TYPE']) && $values['ENTITY_TYPE'] == $entityType)
960  && (isset($values['CODE']) && $values['CODE'] == $code)
961  )
962  {
963  if ((!empty($values['ID']) && $values['ID'] == $id) || !isset($values['ID']))
964  {
965  return $values['SUCCESS'];
966  }
967  }
968  }
969  }
970  }
971 
972  return null;
973  }

◆ hasErrors()

static hasErrors ( Order  $order)
static

См. определение в файле entitymarker.php строка 975

976  {
977  $orderCode = $order->getInternalId();
978  if (!empty(static::$pool[$orderCode]))
979  {
980  foreach (static::$pool[$orderCode] as $poolEntityType => $fieldsList)
981  {
982  foreach ($fieldsList as $fieldIndex => $values)
983  {
984  if ($values['ORDER'] instanceof Order)
985  {
986  if ($order instanceof Order && $values['ORDER']->getInternalId() != $order->getInternalId())
987  {
988  continue 2;
989  }
990  }
991 
992  if(empty($values['SUCCESS']) || ($values['SUCCESS'] != static::ENTITY_SUCCESS_CODE_DONE))
993  {
994  return true;
995  }
996  }
997  }
998  }
999 
1000  return false;
1001  }

◆ loadFromDb()

static loadFromDb ( array  $filter)
static

См. определение в файле entitymarker.php строка 815

816  {
817  $entityDat = static::getList($filter)->fetch();
818  if ($entityDat)
819  {
820  return $entityDat;
821  }
822 
823  return false;
824  }

◆ refreshMarkers()

static refreshMarkers ( Order  $order)
static
Аргументы
Order$order
Исключения
Main

См. определение в файле entitymarker.php строка 1115

1116  {
1117  if ($order->getId() == 0)
1118  {
1119  return;
1120  }
1121 
1122  $shipmentCollection = $order->getShipmentCollection();
1123  if (!$shipmentCollection)
1124  {
1125  throw new Main\ObjectNotFoundException('Entity "ShipmentCollection" not found');
1126  }
1127 
1128  $paymentCollection = $order->getPaymentCollection();
1129  if (!$paymentCollection)
1130  {
1131  throw new Main\ObjectNotFoundException('Entity "PaymentCollection" not found');
1132  }
1133 
1134  $basket = $order->getBasket();
1135  if (!$basket)
1136  {
1137  throw new Main\ObjectNotFoundException('Entity "Basket" not found');
1138  }
1139 
1140  $markList = [];
1141 
1142  $filter = [
1143  'filter' => [
1144  '=ORDER_ID' => $order->getId(),
1145  '!=SUCCESS' => static::ENTITY_SUCCESS_CODE_DONE
1146  ],
1147  'select' => ['ID', 'ENTITY_TYPE', 'ENTITY_ID', 'CODE', 'SUCCESS'],
1148  'order' => ['ID' => 'DESC']
1149  ];
1150 
1151  $res = static::getList($filter);
1152  while($markerData = $res->fetch())
1153  {
1154  if (!empty($markList[$markerData['ENTITY_TYPE']])
1155  && !empty($markList[$markerData['ENTITY_TYPE']][$markerData['ENTITY_ID']])
1156  && $markerData['CODE'] == $markList[$markerData['ENTITY_TYPE']][$markerData['ENTITY_ID']]
1157  )
1158  {
1159  continue;
1160  }
1161 
1162  if ($markerData['SUCCESS'] != static::ENTITY_SUCCESS_CODE_DONE)
1163  {
1164  $markList[$markerData['ENTITY_TYPE']][$markerData['ENTITY_ID']][] = $markerData['CODE'];
1165  }
1166 
1167  $poolItemSuccess = static::getPoolItemSuccess(
1168  $order,
1169  $markerData['ID'],
1170  $markerData['ENTITY_TYPE'],
1171  $markerData['ENTITY_ID'],
1172  $markerData['CODE']
1173  );
1174 
1175  if ($poolItemSuccess && $poolItemSuccess == static::ENTITY_SUCCESS_CODE_DONE)
1176  {
1177  foreach ($markList[$markerData['ENTITY_TYPE']][$markerData['ENTITY_ID']] as $markerIndex => $markerCode)
1178  {
1179  if ($markerData['CODE'] == $markerCode)
1180  {
1181  unset($markList[$markerData['ENTITY_TYPE']][$markerData['ENTITY_ID']][$markerIndex]);
1182  }
1183  }
1184 
1185  if (empty($markList[$markerData['ENTITY_TYPE']][$markerData['ENTITY_ID']]))
1186  {
1187  unset($markList[$markerData['ENTITY_TYPE']][$markerData['ENTITY_ID']]);
1188  }
1189  }
1190 
1191  if (empty($markList[$markerData['ENTITY_TYPE']]))
1192  {
1193  unset($markList[$markerData['ENTITY_TYPE']]);
1194  }
1195  }
1196 
1197  if (!empty($markList))
1198  {
1199  foreach ($markList as $markEntityType => $markEntityList)
1200  {
1201  foreach ($markEntityList as $markEntityId => $markEntityCodeList)
1202  {
1203  if (empty($markEntityCodeList))
1204  {
1205  if (($entity = static::getEntity($order, $markEntityType, $markEntityId)) && ($entity instanceof \IEntityMarker))
1206  {
1207  if ($entity->canMarked())
1208  {
1209  $markedField = $entity->getMarkField();
1210  $entity->setField($markedField, 'N');
1211  }
1212  }
1213  }
1214  }
1215  }
1216  }
1217 
1218  if (empty($markList) && !static::hasErrors($order))
1219  {
1220  if ($shipmentCollection->isMarked())
1221  {
1222  /** @var Shipment $shipment */
1223  foreach ($shipmentCollection as $shipment)
1224  {
1225  if ($shipment->isMarked())
1226  {
1227  $shipment->setField('MARKED', 'N');
1228  }
1229  }
1230  }
1231  if ($paymentCollection->isMarked())
1232  {
1233  /** @var Payment $payment */
1234  foreach ($paymentCollection as $payment)
1235  {
1236  if ($payment->isMarked())
1237  {
1238  $payment->setField('MARKED', 'N');
1239  }
1240  }
1241  }
1242 
1243  $order->setField('MARKED', 'N');
1244  }
1245  }

◆ resetMarkers()

static resetMarkers (   $orderCode = null)
staticprotected

См. определение в файле entitymarker.php строка 621

622  {
623  if (intval($orderCode) > 0)
624  {
625  unset(static::$pool[$orderCode]);
626  }
627  else
628  {
629  static::$pool = array();
630  }
631  }

◆ saveMarkers()

static saveMarkers ( Order  $order = null)
static
Аргументы
null | Order$order
Возвращает
Result
Исключения
Main

См. определение в файле entitymarker.php строка 288

289  {
290  global $USER;
291  $result = new Result();
292 
293  $saveList = array();
294 
295  $oldMarkerDataList = array();
296 
297  $orderCode = null;
298 
299  $newOrderList = array();
300 
301  if ($order instanceof Order && $order->getId() > 0)
302  {
303  $orderCode = $order->getInternalId();
304  }
305 
306  foreach (static::$pool as $orderIndex => $entityList)
307  {
308  foreach ($entityList as $entityType => $fieldsList)
309  {
310  foreach ($fieldsList as $fieldIndex => $values)
311  {
312  if ($values['ORDER'] instanceof Order)
313  {
314  if (empty($values['ORDER_ID']) && $values['ORDER']->getId() > 0)
315  {
316  $values['ORDER_ID'] = $values['ORDER']->getId();
317  $newOrderList[] = $values['ORDER_ID'];
318  }
319 
320  if ($order instanceof Order && $values['ORDER']->getInternalId() != $order->getInternalId())
321  {
322  continue 3;
323  }
324  }
325 
326  if (!empty($values['ENTITY']) && $values['ENTITY'] instanceof Internals\Entity)
327  {
328  if (empty($values['ENTITY_TYPE']))
329  {
330  $entityType = static::getEntityType($values['ENTITY']);
331 
332  if (strval($entityType) != '')
333  {
334  $values['ENTITY_TYPE'] = $entityType;
335  }
336  }
337 
338  if (intval($values['ENTITY_ID']) <= 0)
339  {
340  $values['ENTITY_ID'] = $values['ENTITY']->getId();
341  }
342  }
343 
344  $fields = array();
345 
346  if (empty($values['ID']))
347  {
348  if (intval($values['ENTITY_ID']) <= 0)
349  {
350  continue;
351  }
352 
353  if (empty($values['ENTITY_TYPE']))
354  {
355  throw new Main\ArgumentNullException('ENTITY_TYPE');
356  }
357 
358  $fields = array(
359  'ENTITY_TYPE' => $values['ENTITY_TYPE'],
360  'ENTITY_ID' => intval($values['ENTITY_ID']),
361  'TYPE' => $values['TYPE'],
362  'CODE' => $values['CODE'],
363  'MESSAGE' => $values['MESSAGE'],
364  'COMMENT' => $values['COMMENT'],
365  );
366 
367  if ($USER && $USER->IsAuthorized())
368  {
369  $fields['USER_ID'] = $USER->GetID();
370  }
371  }
372 
373  if (intval($values['ORDER_ID']) >= 0)
374  {
375  $fields['ORDER_ID'] = intval($values['ORDER_ID']);
376  }
377 
378  if (empty($fields['ENTITY_ID']) && intval($values['ENTITY_ID']) >= 0)
379  {
380  $fields['ENTITY_ID'] = intval($values['ENTITY_ID']);
381  }
382 
383  if (empty($fields['ENTITY_TYPE']) && !empty($values['ENTITY_TYPE']))
384  {
385  $fields['ENTITY_TYPE'] = $values['ENTITY_TYPE'];
386  }
387 
388  if (!empty($values['ID']))
389  {
390  $fields['ID'] = $values['ID'];
391  }
392 
393  if (!empty($values['SUCCESS']))
394  {
395  $fields['SUCCESS'] = $values['SUCCESS'];
396  }
397 
398  if (!empty($values['DATE_CREATE']) && $values['DATE_CREATE'] instanceof Main\Type\Date)
399  {
400  $fields['DATE_CREATE'] = $values['DATE_CREATE'];
401  }
402 
403  if (!empty($values['DATE_UPDATE']) && $values['DATE_UPDATE'] instanceof Main\Type\Date)
404  {
405  $fields['DATE_UPDATE'] = $values['DATE_UPDATE'];
406  }
407 
408  if ($values['ORDER'] instanceof Order)
409  {
410  unset(static::$pool[$values['ORDER']->getInternalId()][$entityType][$fieldIndex]);
411  }
412 
413  if (empty($fields))
414  continue;
415 
416  $markerOrderId = null;
417 
418  if (!empty($values['ORDER_ID']))
419  {
420  $markerOrderId = $values['ORDER_ID'];
421  }
422 
423  $saveList[$markerOrderId][] = $fields;
424  }
425  }
426  }
427 
428  if (!empty($saveList) && is_array($saveList))
429  {
430  $filter = array(
431  'select' => array(
432  'ID', 'ORDER_ID', 'ENTITY_TYPE', 'ENTITY_ID', 'CODE', 'SUCCESS', 'MESSAGE'
433  ),
434  'filter' => array(
435  '!=SUCCESS' => static::ENTITY_SUCCESS_CODE_DONE
436  ),
437  'order' => array('ID' => 'ASC')
438  );
439 
440  foreach ($saveList as $fieldsList)
441  {
442 
443  foreach ($fieldsList as $fields)
444  {
445  if (!empty($fields['ORDER_ID']) && in_array($fields['ORDER_ID'], $newOrderList))
446  {
447  continue;
448  }
449 
450  if (!empty($fields['ORDER_ID']) && (empty($filter['filter']['=ORDER_ID']) || !in_array($fields['ORDER_ID'], $filter['filter']['=ORDER_ID'])))
451  {
452  $filter['filter']['=ORDER_ID'][] = $fields['ORDER_ID'];
453  }
454 
455  if (!empty($fields['ENTITY_TYPE'])
456  && (empty($filter['filter']['=ENTITY_TYPE'])
457  || (is_array($filter['filter']['=ENTITY_TYPE']) && !in_array($fields['ENTITY_TYPE'], $filter['filter']['=ENTITY_TYPE']))))
458  {
459  $filter['filter']['=ENTITY_TYPE'][] = $fields['ENTITY_TYPE'];
460  }
461  }
462  }
463 
464 
465  if (!empty($filter['filter']['=ENTITY_TYPE']))
466  {
467  $res = static::getList($filter);
468  while($data = $res->fetch())
469  {
470  if (isset($saveList[$data['ORDER_ID']]) && is_array($saveList[$data['ORDER_ID']]))
471  {
472  foreach($saveList[$data['ORDER_ID']] as $key => $values)
473  {
474  if (!empty($values['ID']) && $data['ID'] == $values['ID'])
475  {
476  $oldMarkerDataList[$data['ID']] = $data;
477 
478  $values = array_merge($data, $values);
479  $saveList[$data['ORDER_ID']][$key] = $values;
480  continue;
481  }
482  $foundItem = false;
483 
484  if (!$foundItem)
485  {
486  foreach (static::getFieldsDuplicateCheck() as $checkField)
487  {
488  if (!empty($data[$checkField]) && !empty($values[$checkField]) && $data[$checkField] == $values[$checkField])
489  {
490  $foundItem = true;
491  continue;
492  }
493 
494  $foundItem = false;
495  break;
496  }
497  }
498 
499  if ($foundItem)
500  {
501  foreach($saveList[$data['ORDER_ID']] as $doubleKey => $doubleValues)
502  {
503  if ($doubleKey == $key)
504  continue;
505 
506  if (!empty($doubleValues['ID']) && $data['ID'] == $doubleValues['ID'])
507  {
508  if (empty($values['SUCCESS']))
509  {
510  unset($doubleValues['SUCCESS']);
511  }
512 
513  $values = array_merge($doubleValues, $values);
514  unset($saveList[$data['ORDER_ID']][$doubleKey]);
515  }
516  }
517 
518  $fields = array(
519  'ID' => $data['ID'],
520  );
521 
522  if (!empty($values['SUCCESS']) && $data['SUCCESS'] != $values['SUCCESS'])
523  {
524  $fields['SUCCESS'] = $values['SUCCESS'];
525  }
526 
527  $saveList[$data['ORDER_ID']][$key] = $fields;
528  }
529  }
530  }
531  }
532  }
533 
534  foreach ($saveList as $orderId => $fieldsList)
535  {
536  foreach ($fieldsList as $fields)
537  {
538  if (!empty($fields['ID']))
539  {
540  $elementId = intval($fields['ID']);
541  unset($fields['ID']);
542 
543  if (empty($fields))
544  continue;
545 
546  if (!empty($oldMarkerDataList) && !empty($oldMarkerDataList[$elementId]))
547  {
548  foreach($fields as $fieldName => $fieldValue)
549  {
550  if (array_key_exists($fieldName, $oldMarkerDataList[$elementId])
551  && $oldMarkerDataList[$elementId][$fieldName] == $fieldValue)
552  {
553  unset($fields[$fieldName]);
554  }
555  }
556  }
557 
558  if (empty($fields))
559  continue;
560 
561  if (empty($fields['DATE_UPDATE']))
562  {
563  $fields['DATE_UPDATE'] = new Main\Type\DateTime();
564  }
565 
566  if (!empty($fields['SUCCESS']) && $fields['SUCCESS'] == static::ENTITY_SUCCESS_CODE_DONE
567  && !empty($oldMarkerDataList) && !empty($oldMarkerDataList[$elementId]))
568  {
570  $oldMarkerDataList[$elementId]['ENTITY_TYPE'],
571  $oldMarkerDataList[$elementId]['ORDER_ID'],
572  'MARKER_SUCCESS',
573  $oldMarkerDataList[$elementId]['ENTITY_ID'],
574  null,
575  array(
576  "ENTITY_ID" => $oldMarkerDataList[$elementId]['ENTITY_ID'],
577  "MESSAGE" => $oldMarkerDataList[$elementId]['MESSAGE'],
578  "ENTITY_TYPE" => $oldMarkerDataList[$elementId]['ENTITY_TYPE'],
579  ),
581  );
582 
583  $r = static::delete($elementId);
584  if (!$r->isSuccess())
585  {
586  $result->addErrors($r->getErrors());
587  }
588 
589  continue;
590  }
591 
592  $r = static::updateInternal($elementId, $fields);
593  if (!$r->isSuccess())
594  {
595  $result->addErrors($r->getErrors());
596  }
597  }
598  else
599  {
600  if (empty($fields['DATE_CREATE']))
601  {
602  $fields['DATE_CREATE'] = new Main\Type\DateTime();
603  }
604 
605  $r = static::addInternal($fields);
606  if (!$r->isSuccess())
607  {
608  $result->addErrors($r->getErrors());
609  }
610  }
611  }
612  }
613  }
614 
615  static::resetMarkers($orderCode);
616 
617  return $result;
618  }

◆ tryFixErrors()

static tryFixErrors ( )
static
Возвращает
Result
Исключения
Main

См. определение в файле entitymarker.php строка 729

730  {
731  static $orderList = array();
732  $orderSaveList = array();
733  $lastOrderId = null;
734 
736  /** @var Sale\Order $orderClass */
737  $orderClass = $registry->getOrderClassName();
738 
739  $result = new Result();
740  $res = static::getList(array(
741  'filter' => array(
742  '=TYPE' => static::ENTITY_MARKED_TYPE_AUTO,
743  '!=SUCCESS' => static::ENTITY_SUCCESS_CODE_DONE
744  ),
745  'select' => array('ID', 'ENTITY_TYPE', 'ENTITY_ID', 'CODE', 'ORDER_ID'),
746  'order' => array('ORDER_ID' => 'ASC', 'ID' => 'DESC')
747  ));
748  while($data = $res->fetch())
749  {
750  if (array_key_exists($data['ORDER_ID'], $orderList))
751  {
752  $order = $orderList[$data['ORDER_ID']];
753  }
754  else
755  {
756  $order = $orderClass::load($data['ORDER_ID']);
757  $orderList[$data['ORDER_ID']] = $order;
758  }
759 
760  if (!$entity = static::getEntity($order, $data['ENTITY_TYPE'], $data['ENTITY_ID']))
761  {
762  continue;
763  }
764 
765  if ($lastOrderId !== null && $lastOrderId !== $order->getId())
766  {
767  if (isset($orderSaveList[$lastOrderId]))
768  {
769  $r = $orderSaveList[$lastOrderId]->save();
770  unset($orderSaveList[$lastOrderId]);
771  }
772  }
773 
774  if (!($entity instanceof \IEntityMarker))
775  {
776  continue;
777  }
778 
779  $r = $entity->tryFixError($data['CODE']);
780  if ($r->isSuccess())
781  {
782  $data['SUCCESS'] = static::ENTITY_SUCCESS_CODE_DONE;
783 
784  if (!array_key_exists($data['ORDER_ID'], $orderSaveList))
785  {
786  $orderSaveList[$order->getId()] = $order;
787  }
788  }
789  else
790  {
791  $data['SUCCESS'] = static::ENTITY_SUCCESS_CODE_FAIL;
792  }
793 
794  static::updateMarker($data['ID'], $data, $order, $entity);
795 
796  $lastOrderId = $order->getId();
797  }
798 
799  if (!empty($orderSaveList))
800  {
801  foreach ($orderSaveList as $order)
802  {
803  $order->save();
804  }
805  }
806 
807  foreach ($orderList as $order)
808  {
809  static::saveMarkers($order);
810  }
811 
812  return $result;
813  }

◆ tryFixErrorsByOrder()

static tryFixErrorsByOrder ( Order  $order,
  $markerId = null 
)
static
Аргументы
Order$order
$markerId
Возвращает
Result
Исключения
Main

См. определение в файле entitymarker.php строка 640

641  {
642  $result = new Result();
643  if ($order->getId() <=0)
644  {
645  return $result;
646  }
647 
648  $resultList = array(
649  'LIST' => array(),
650  'ERRORS' => array(),
651  );
652 
653  $filter = array(
654  'filter' => array(
655  '=ORDER_ID' => $order->getId(),
656  '=TYPE' => static::ENTITY_MARKED_TYPE_AUTO,
657  ),
658  'select' => array('ID', 'ENTITY_TYPE', 'ENTITY_ID', 'CODE', 'SUCCESS'),
659  'order' => array('ID' => 'DESC')
660  );
661 
662  if (intval($markerId) > 0)
663  {
664  $filter['filter']['=ID'] = intval($markerId);
665  }
666  else
667  {
668  $filter['filter']['!=SUCCESS'] = static::ENTITY_SUCCESS_CODE_DONE;
669  }
670 
671  $res = static::getList($filter);
672  while($markerData = $res->fetch())
673  {
674  if ($markerData['SUCCESS'] == static::ENTITY_SUCCESS_CODE_DONE)
675  {
676  $resultList['LIST'][$markerData['ID']] = static::ENTITY_SUCCESS_CODE_DONE;
677  }
678  else
679  {
680  if (!$entity = static::getEntity($order, $markerData['ENTITY_TYPE'], $markerData['ENTITY_ID']))
681  {
682  $result->addError(new ResultError(Main\Localization\Loc::getMessage('SALE_ENTITY_MARKER_ENTITY_NOT_FOUND'), 'SALE_ENTITY_MARKER_ENTITY_NOT_FOUND'));
683  return $result;
684  }
685 
686  if (!($entity instanceof \IEntityMarker))
687  {
688  return $result;
689  }
690 
691  $r = $entity->tryFixError($markerData['CODE']);
692  if ($r->isSuccess() && !$r->hasWarnings())
693  {
694  $markerData['SUCCESS'] = static::ENTITY_SUCCESS_CODE_DONE;
695  }
696  else
697  {
698  $markerData['SUCCESS'] = static::ENTITY_SUCCESS_CODE_FAIL;
699  if (!isset($resultList['ERRORS'][$markerData['ID']]))
700  {
701  $resultList['ERRORS'][$markerData['ID']] = array();
702  }
703  $resultList['ERRORS'][$markerData['ID']] = array_merge($resultList['ERRORS'][$markerData['ID']], $r->getWarningMessages());
704  if (!$r->isSuccess())
705  {
706  $result->addErrors($r->getErrors());
707  }
708  }
709 
710  static::updateMarker($markerData['ID'], $markerData, $order, $entity);
711  $resultList['LIST'][$markerData['ID']] = ($markerData['SUCCESS'] == static::ENTITY_SUCCESS_CODE_DONE);
712  }
713  }
714 
715  if (!empty($resultList) && is_array($resultList))
716  {
717  $result->setData($resultList);
718  }
719 
720  return $result;
721  }

◆ updateInternal()

static updateInternal (   $primary,
array  $data 
)
staticprotected

См. определение в файле entitymarker.php строка 925

926  {
927  return Internals\EntityMarkerTable::update($primary, $data);
928  }

◆ updateItem()

static updateItem (   $id,
  $values,
Order  $order,
  $entityType 
)
staticprotected
Аргументы
$id
$values
Order$order
$entityType
Возвращает
Result

См. определение в файле entitymarker.php строка 163

164  {
165  $orderCode = $order->getInternalId();
166  $result = new Result();
167 
168  if (!empty(static::$pool[$orderCode]) && !empty(static::$pool[$orderCode][$entityType]) && is_array(static::$pool[$orderCode][$entityType]))
169  {
170  foreach (static::$pool[$orderCode][$entityType] as $index => $fields)
171  {
172  $foundItem = false;
173  if ((isset($fields['ID']) && $id > 0 && intval($fields['ID']) == $id))
174  {
175  $foundItem = true;
176  }
177 
178  if (!$foundItem)
179  {
180  foreach (static::getFieldsDuplicateCheck() as $checkField)
181  {
182  if (!empty($fields[$checkField]) && !empty($values[$checkField]) && $fields[$checkField] == $values[$checkField])
183  {
184  $foundItem = true;
185  continue;
186  }
187 
188  $foundItem = false;
189  break;
190  }
191  }
192 
193  if ($foundItem)
194  {
195  static::$pool[$orderCode][$entityType][$index] = array_merge($fields, $values);
196  return $result;
197  }
198  }
199  }
200 
201  $values['ID'] = $id;
202 
203  if (empty($values['ORDER']))
204  {
205  $values['ORDER'] = $order;
206  }
207 
208  if ($order->getId() > 0)
209  {
210  $values['ORDER_ID'] = $order->getId();
211  }
212 
213  static::$pool[$orderCode][$entityType][] = $values;
214 
215  return $result;
216  }

◆ updateMarker()

static updateMarker (   $id,
array  $values,
Order  $order,
Internals\Entity  $entity 
)
static
Аргументы
$id
array$values
Order$order
Internals\Entity$entity
Возвращает
Result

См. определение в файле entitymarker.php строка 95

96  {
97  $result = new Result();
98  $entityType = static::getEntityType($entity);
99  if ($entityType !== null)
100  {
101  $r = static::updateItem($id, $values, $order, $entityType);
102  if (!$r->isSuccess())
103  {
104  $result->addErrors($r->getErrors());
105  }
106  }
107 
108  return $result;
109  }

Поля

◆ $pool

array $pool = array()
staticprotected

См. определение в файле entitymarker.php строка 28

◆ ENTITY_MARKED_TYPE_AUTO

const ENTITY_MARKED_TYPE_AUTO = 'AUTO'

См. определение в файле entitymarker.php строка 15

◆ ENTITY_MARKED_TYPE_MANUAL

const ENTITY_MARKED_TYPE_MANUAL = 'MANUAL'

См. определение в файле entitymarker.php строка 16

◆ ENTITY_SUCCESS_CODE_DONE

const ENTITY_SUCCESS_CODE_DONE = 'Y'

См. определение в файле entitymarker.php строка 25

◆ ENTITY_SUCCESS_CODE_FAIL

const ENTITY_SUCCESS_CODE_FAIL = 'N'

См. определение в файле entitymarker.php строка 24

◆ ENTITY_TYPE_BASKET_ITEM

const ENTITY_TYPE_BASKET_ITEM = 'BASKET_ITEM'

См. определение в файле entitymarker.php строка 19

◆ ENTITY_TYPE_ORDER

const ENTITY_TYPE_ORDER = 'ORDER'

См. определение в файле entitymarker.php строка 18

◆ ENTITY_TYPE_PAYMENT

const ENTITY_TYPE_PAYMENT = 'PAYMENT'

См. определение в файле entitymarker.php строка 21

◆ ENTITY_TYPE_PROPERTY_VALUE

const ENTITY_TYPE_PROPERTY_VALUE = 'PROPERTY_VALUE'

См. определение в файле entitymarker.php строка 22

◆ ENTITY_TYPE_SHIPMENT

const ENTITY_TYPE_SHIPMENT = 'SHIPMENT'

См. определение в файле entitymarker.php строка 20


Объявления и описания членов класса находятся в файле:
Bitrix\Main\Localization\Loc\getMessage
static getMessage($code, $replace=null, $language=null)
Returns translation by message code.
Definition: loc.php:29
Bitrix\Main\hasErrors
hasErrors()
Return true if collection has errors.
Definition: errorableimplementation.php:17
Bitrix\Sale\Registry\REGISTRY_TYPE_ORDER
const REGISTRY_TYPE_ORDER
Definition: sale/lib/registry.php:16
IEntityMarker
Definition: entitymarkerinterface.php:9
Bitrix\Main\Type
Definition: main/lib/type/collection.php:2
Bitrix\Sale\Registry\getInstance
static getInstance($type)
Definition: sale/lib/registry.php:161
Bitrix\Sale\OrderHistory\addAction
static addAction($entityName, $orderId, $type, $id=null, $entity=null, array $fields=array(), $level=null)
Definition: orderhistory.php:97
Sale
Class RestHandler.
Bitrix\Sale\OrderHistory\SALE_ORDER_HISTORY_ACTION_LOG_LEVEL_1
const SALE_ORDER_HISTORY_ACTION_LOG_LEVEL_1
Definition: orderhistory.php:29