Bitrix-D7  20.5.0
Класс ShipmentItem
Граф наследования:ShipmentItem:
CollectableEntity IEntityMarker Entity

Открытые члены

 delete ()
 Deletes shipment item. Подробнее...
 
 getQuantity ()
 
 checkMarkingCodeOnDeducted ()
 
 setQuantity ($quantity)
 
 getReservedQuantity ()
 
 getBasketId ()
 
 getBasketCode ()
 
 getProductId ()
 
 save ()
 
 getBasketItem ()
 
 getShipmentItemStoreCollection ()
 
 onBasketModify ($action, BasketItem $basketItem, $name=null, $oldValue=null, $value=null)
 
 isChanged ()
 
 tryReserve ()
 
 tryUnreserve ()
 
 verify ()
 
 createClone (\SplObjectStorage $cloneEntity)
 
 getErrorEntity ($value)
 
 canAutoFixError ($value)
 
 getAutoFixErrorsList ()
 
 tryFixError ($code)
 
 canMarked ()
 
 getMarkField ()
 
 clearChanged ()
 
 needReserve ()
 
 getNeedReserveQuantity ()
 
 toArray ()
 
- Открытые члены унаследованные от CollectableEntity
 setCollection (EntityCollection $collection)
 
 getCollection ()
 
 setInternalIndex ($index)
 
 getInternalIndex ()
 
 isStartField ($isMeaningfulField=false)
 
 clearStartField ()
 
 hasMeaningfulField ()
 
 doFinalAction ($hasMeaningfulField=false)
 
 setMathActionOnly ($value=false)
 
 isMathActionOnly ()
 
 isClone ()
 
- Открытые члены унаследованные от Entity
 initializeField ($fieldName, $fieldInfo)
 Fields factory. Подробнее...
 
 initialize ($className)
 
 postInitialize ()
 
 getObjectClass ()
 Returns class of Object for current entity. Подробнее...
 
 getObjectClassName ()
 Returns class name of Object for current entity. Подробнее...
 
 getCollectionClass ()
 
 getCollectionClassName ()
 
 createObject ($setDefaultValues=true)
 
 createCollection ()
 
 wakeUpObject ($row)
 
 wakeUpCollection ($rows)
 
 addField ($fieldInfo, $fieldName=null)
 
 getReferencesCountTo ($refEntityName)
 
 getReferencesTo ($refEntityName)
 
 getFields ()
 
 getField ($name)
 
 hasField ($name)
 
 getScalarFields ()
 
 getUField ($name)
 
 hasUField ($name)
 
 getName ()
 
 getFullName ()
 
 getNamespace ()
 
 getModule ()
 
 getDataClass ()
 
 getConnection ()
 
 getDBTableName ()
 
 getPrimary ()
 
 getPrimaryArray ()
 
 getAutoIncrement ()
 
 isUts ()
 
 isUtm ()
 
 getUfId ()
 
 setDefaultScope ($query)
 
 getCode ()
 
 getLangCode ()
 
 getTitle ()
 
 __clone ()
 
 compileDbTableStructureDump ()
 
 createDbTable ()
 Creates table according to Fields collection. Подробнее...
 
 readFromCache ($ttl, $cacheId, $countTotal=false)
 Reads data from cache. Подробнее...
 
 writeToCache (Main\DB\Result $result, $cacheId, $countTotal=false)
 
 getCacheTtl ($ttl)
 Returns cache TTL for the entity, possibly limited by the .settings.php: 'cache_flags' => array('value'=> array( "b_group_max_ttl" => 200, "b_group_min_ttl" => 100, )) Maximum is a higher-priority. Подробнее...
 
 cleanCache ()
 Cleans all cache entries for the entity. Подробнее...
 
 enableFullTextIndex ($field, $mode=true)
 Sets a flag indicating full text index support for a field. Подробнее...
 
 fullTextIndexEnabled ($field)
 Returns true if full text index is enabled for a field. Подробнее...
 

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

static getAvailableFields ()
 
static create (ShipmentItemCollection $collection, BasketItem $basketItem=null)
 Internal method, use ShipmentItemCollection::createItem() Подробнее...
 
static loadForShipment ($id)
 
static getRegistryType ()
 
static getRegistryEntity ()
 
static getList (array $parameters)
 
static getEntityEventName ()
 
- Открытые статические члены унаследованные от Entity
static get ($entityName)
 Returns entity object. Подробнее...
 
static has ($entityName)
 Checks if entity exists. Подробнее...
 
static getInstance ($entityName)
 
static getDefaultObjectClassName ($entityName)
 
static getDefaultCollectionClassName ($entityName)
 
static isExists ($name)
 
static normalizeEntityClass ($entityName)
 
static getEntityClassParts ($class)
 
static camel2snake ($str)
 
static snake2camel ($str)
 
static normalizeName ($entityName)
 
static getInstanceByQuery (Query $query, &$entity_name=null)
 
static compileEntity ($entityName, $fields=null, $parameters=array())
 
static compileObjectClass ($dataClass)
 
static compileCollectionClass ($dataClass)
 
static destroy ($entity)
 

Защищенные члены

 onFieldModify ($name, $oldValue, $value)
 
 loadBasketItem ()
 
 calculateDelivery ()
 
 addChangesToHistory ($name, $oldValue=null, $value=null)
 
 addInternal (array $data)
 
 updateInternal ($primary, array $data)
 
- Защищенные члены унаследованные от Entity
 appendField (Field $field)
 
 getCacheDir ()
 

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

static getMeaningfulFields ()
 
static generateXmlId ()
 
static getFieldsMap ()
 
- Защищенные статические члены унаследованные от Entity
static getInstanceDirect ($className)
 

Защищенные данные

 $basketItem
 
 $shipmentItemStoreCollection
 
- Защищенные данные унаследованные от CollectableEntity
 $collection
 
 $internalIndex = null
 
 $isClone = false
 
- Защищенные данные унаследованные от Entity
 $className
 
 $module
 
 $uf_id
 
 $fields
 
 $fieldsMap
 
 $u_fields
 
 $code
 
 $references
 
 $isClone = false
 

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

static $errors = []
 
- Статические защищенные данные унаследованные от Entity
static $instances
 

Дополнительные унаследованные члены

- Поля данных унаследованные от Entity
 $name
 
 $connectionName
 
 $dbTableName
 
 $primary
 
 $autoIncrement
 
 $isUts
 
 $isUtm
 
const DEFAULT_OBJECT_PREFIX = 'EO_'
 

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

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

Методы

◆ addChangesToHistory()

addChangesToHistory (   $name,
  $oldValue = null,
  $value = null 
)
protected
Аргументы
string$name
null | string$oldValue
null | string$value
Исключения
Main

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

1020  {
1021  if ($this->getId() > 0)
1022  {
1023  /** @var ShipmentItemCollection $shipmentItemCollection */
1024  if (!$shipmentItemCollection = $this->getCollection())
1025  {
1026  throw new Main\ObjectNotFoundException('Entity "ShipmentItemCollection" not found');
1027  }
1028 
1029  /** @var Shipment $shipment */
1030  if (!$shipment = $shipmentItemCollection->getShipment())
1031  {
1032  throw new Main\ObjectNotFoundException('Entity "Shipment" not found');
1033  }
1034 
1035  if ($shipment->isSystem())
1036  return;
1037 
1038  /** @var ShipmentCollection $shipmentCollection */
1039  if (!$shipmentCollection = $shipment->getCollection())
1040  {
1041  throw new Main\ObjectNotFoundException('Entity "ShipmentCollection" not found');
1042  }
1043 
1044  $historyFields = [];
1045 
1046  /** @var BasketItem $basketItem */
1047  if ($basketItem = $this->getBasketItem())
1048  {
1049  $historyFields = [
1050  'NAME' => $basketItem->getField('NAME'),
1051  'PRODUCT_ID' => $basketItem->getField('PRODUCT_ID'),
1052  ];
1053  }
1054 
1055  /** @var Order $order */
1056  if (($order = $shipmentCollection->getOrder()) && $order->getId() > 0)
1057  {
1058  $registry = Registry::getInstance(static::getRegistryType());
1059 
1060  /** @var OrderHistory $orderHistory */
1061  $orderHistory = $registry->getOrderHistoryClassName();
1062  $orderHistory::addField(
1063  'SHIPMENT_ITEM',
1064  $order->getId(),
1065  $name,
1066  $oldValue,
1067  $value,
1068  $this->getId(),
1069  $this,
1070  $historyFields
1071  );
1072  }
1073 
1074 
1075  }
1076  }

◆ addInternal()

addInternal ( array  $data)
protected
Аргументы
array$data
Возвращает
Main\ORM\Data\AddResult
Исключения

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

1394  {
1395  return Internals\ShipmentItemTable::add($data);
1396  }

◆ calculateDelivery()

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

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

979  {
980  $result = new Result();
981 
982  /** @var ShipmentItemCollection $collection */
983  $collection = $this->getCollection();
984  /** @var Shipment $shipment */
985  $shipment = $collection->getShipment();
986 
987  /** @var ShipmentCollection $shipmentCollection */
988  $shipmentCollection = $shipment->getCollection();
989 
990  /** @var Order $order */
991  $order = $shipmentCollection->getOrder();
992 
993  if ($order->getId() > 0)
994  {
995  return $result;
996  }
997 
998  $deliveryCalculate = $shipment->calculateDelivery();
999  if (!$deliveryCalculate->isSuccess())
1000  {
1001  $result->addErrors($deliveryCalculate->getErrors());
1002  }
1003 
1004  if ($deliveryCalculate->getPrice() > 0)
1005  {
1006  $shipment->setField('BASE_PRICE_DELIVERY', $deliveryCalculate->getPrice());
1007  }
1008 
1009  return $result;
1010  }

◆ canAutoFixError()

canAutoFixError (   $value)
Аргументы
$value
Возвращает
bool

Замещает IEntityMarker.

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

1282  {
1283  $autoFix = false;
1284  $errorsList = static::getAutoFixErrorsList();
1285  if (is_array($errorsList) && in_array($value, $errorsList))
1286  {
1287  $autoFix = true;
1288  }
1289  else
1290  {
1291  /** @var ShipmentItemStoreCollection $shipmentItemStoreCollection */
1293  {
1294  $autoFix = $shipmentItemStoreCollection->canAutoFixError($value);
1295  }
1296  }
1297 
1298  return $autoFix;
1299  }

◆ canMarked()

canMarked ( )

Замещает IEntityMarker.

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

1320  {
1321  return false;
1322  }

◆ checkMarkingCodeOnDeducted()

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

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

442  {
443  $result = new Result();
444 
445  if (!$this->getBasketItem()->isSupportedMarkingCode())
446  {
447  return $result;
448  }
449 
450  if ($this->getShipmentItemStoreCollection()->count() < $this->getQuantity())
451  {
452  return $result->addError(
453  new Main\Error(
455  'SALE_SHIPMENT_ITEM_MARKING_CODE_LESS_ITEM_QUANTITY_LONG',
456  ['#PRODUCT_NAME#' => $this->getBasketItem()->getField('NAME')])
457  )
458  );
459  }
460 
461  /** @var ShipmentItemStore $itemStore */
462  foreach ($this->getShipmentItemStoreCollection() as $itemStore)
463  {
464  if ($itemStore->getMarkingCode() === '')
465  {
466  return $result->addError(
467  new Main\Error(
469  'SALE_SHIPMENT_ITEM_MARKING_CODE_LESS_ITEM_QUANTITY_LONG',
470  ['#PRODUCT_NAME#' => $this->getBasketItem()->getField('NAME')])
471  )
472  );
473  }
474  }
475 
476  return $result;
477  }
static getMessage($code, $replace=null, $language=null)
Returns translation by message code.
Definition: loc.php:29
trait Error
\IErrorable

◆ clearChanged()

clearChanged ( )

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

1333  {
1334  parent::clearChanged();
1335 
1337  {
1338  foreach ($shipmentItemStoreCollection as $shipmentItemStore)
1339  {
1340  $shipmentItemStore->clearChanged();
1341  }
1342  }
1343  }

◆ create()

static create ( ShipmentItemCollection  $collection,
BasketItem  $basketItem = null 
)
static

Internal method, use ShipmentItemCollection::createItem()

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

50  {
51  $fields = [
52  'XML_ID' => static::generateXmlId()
53  ];
54 
55  if ($basketItem !== null && $basketItem->getId() > 0)
56  {
57  $fields["BASKET_ID"] = $basketItem->getId();
58  }
59 
60  $shipmentItem = static::createShipmentItemObject();
61  $shipmentItem->setFieldsNoDemand($fields);
62  $shipmentItem->setCollection($collection);
63 
64  if ($basketItem !== null)
65  {
66  $shipmentItem->basketItem = $basketItem;
67  }
68 
69  return $shipmentItem;
70  }

◆ createClone()

createClone ( \SplObjectStorage  $cloneEntity)

Переопределяет метод предка CollectableEntity.

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

1208  {
1209  if ($this->isClone() && $cloneEntity->contains($this))
1210  {
1211  return $cloneEntity[$this];
1212  }
1213 
1214  /** @var ShipmentItem $shipmentItemClone */
1215  $shipmentItemClone = parent::createClone($cloneEntity);
1216 
1217  /** @var BasketItem $basketItem */
1218  if ($basketItem = $this->getBasketItem())
1219  {
1220  if (!$cloneEntity->contains($basketItem))
1221  {
1222  $cloneEntity[$basketItem] = $basketItem->createClone($cloneEntity);
1223  }
1224 
1225  if ($cloneEntity->contains($basketItem))
1226  {
1227  $shipmentItemClone->basketItem = $cloneEntity[$basketItem];
1228  }
1229  }
1230 
1231  /** @var ShipmentItemStoreCollection $shipmentItemStoreCollection */
1233  {
1234  if (!$cloneEntity->contains($shipmentItemStoreCollection))
1235  {
1236  $cloneEntity[$shipmentItemStoreCollection] = $shipmentItemStoreCollection->createClone($cloneEntity);
1237  }
1238 
1239  if ($cloneEntity->contains($shipmentItemStoreCollection))
1240  {
1241  $shipmentItemClone->shipmentItemStoreCollection = $cloneEntity[$shipmentItemStoreCollection];
1242  }
1243  }
1244 
1245  return $shipmentItemClone;
1246  }

◆ delete()

delete ( )

Deletes shipment item.

Исключения
Main

Переопределяет метод предка CollectableEntity.

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

88  {
89  $result = new Result();
90  /** @var ShipmentItemCollection $shipmentItemCollection */
91  if (!$shipmentItemCollection = $this->getCollection())
92  {
93  throw new Main\ObjectNotFoundException('Entity "ShipmentItemCollection" not found');
94  }
95 
96  /** @var Shipment $shipment */
97  if (!$shipment = $shipmentItemCollection->getShipment())
98  {
99  throw new Main\ObjectNotFoundException('Entity "Shipment" not found');
100  }
101 
102  /** @var array $oldEntityValues */
103  $oldEntityValues = $this->fields->getOriginalValues();
104 
105  /** @var Main\Event $event */
106  $event = new Main\Event('sale', "OnBeforeSaleShipmentItemEntityDeleted", [
107  'ENTITY' => $this,
108  'VALUES' => $oldEntityValues,
109  ]);
110  $event->send();
111 
112  if ($event->getResults())
113  {
114  /** @var Main\EventResult $eventResult */
115  foreach($event->getResults() as $eventResult)
116  {
117  if($eventResult->getType() == Main\EventResult::ERROR)
118  {
119  $errorMsg = new ResultError(
120  Loc::getMessage('SALE_EVENT_ON_BEFORE_SALESHIPMENTITEM_ENTITY_DELETED_ERROR'),
121  'SALE_EVENT_ON_BEFORE_SALESHIPMENTITEM_ENTITY_DELETED_ERROR'
122  );
123  if ($eventResultData = $eventResult->getParameters())
124  {
125  if (isset($eventResultData) && $eventResultData instanceof ResultError)
126  {
127  /** @var ResultError $errorMsg */
128  $errorMsg = $eventResultData;
129  }
130  }
131 
132  $result->addError($errorMsg);
133  }
134  }
135 
136  if (!$result->isSuccess())
137  {
138  return $result;
139  }
140  }
141 
142 
143  if (!$shipment->isSystem())
144  {
145  if ($shipment->isShipped())
146  {
147  /** @var BasketItem $basketItem */
148  if (!$basketItem = $this->getBasketItem())
149  {
150  throw new Main\ObjectNotFoundException('Entity "BasketItem" not found');
151  }
152 
153  $result->addError(new ResultError(Loc::getMessage(
154  'SALE_SHIPMENT_ITEM_SHIPMENT_ALREADY_SHIPPED_CANNOT_DELETE',
155  [
156  '#PRODUCT_NAME#' => $basketItem->getField('NAME')
157  ]), 'SALE_SHIPMENT_ITEM_SHIPMENT_ALREADY_SHIPPED_CANNOT_DELETE'));
158 
159  return $result;
160  }
161 
162  $r = $this->setField("QUANTITY", 0);
163 
164  if (!$r->isSuccess())
165  {
166  $result->addErrors($r->getErrors());
167  return $result;
168  }
169  }
170  elseif ($shipment->isSystem() && $this->getQuantity() > 0)
171  {
172  throw new \ErrorException('System shipment not empty');
173  }
174 
175  $r = parent::delete();
176  if (!$r->isSuccess())
177  {
178  $result->addErrors($r->getErrors());
179  }
180 
181 
182  /** @var array $oldEntityValues */
183  $oldEntityValues = $this->fields->getOriginalValues();
184 
185  /** @var Main\Event $event */
186  $event = new Main\Event('sale', "OnSaleShipmentItemEntityDeleted", [
187  'ENTITY' => $this,
188  'VALUES' => $oldEntityValues,
189  ]);
190  $event->send();
191 
192  if ($event->getResults())
193  {
194  /** @var Main\EventResult $eventResult */
195  foreach($event->getResults() as $eventResult)
196  {
197  if($eventResult->getType() == Main\EventResult::ERROR)
198  {
199  $errorMsg = new ResultError(
200  Loc::getMessage('SALE_EVENT_ON_SALESHIPMENTITEM_ENTITY_DELETED_ERROR'),
201  'SALE_EVENT_ON_SALESHIPMENTITEM_ENTITY_DELETED_ERROR'
202  );
203  $eventResultData = $eventResult->getParameters();
204  if (isset($eventResultData) && $eventResultData instanceof ResultError)
205  {
206  /** @var ResultError $errorMsg */
207  $errorMsg = $eventResultData;
208  }
209 
210  $result->addError($errorMsg);
211  }
212  }
213 
214  if (!$result->isSuccess())
215  {
216  return $result;
217  }
218  }
219 
220  return $result;
221  }

◆ generateXmlId()

static generateXmlId ( )
staticprotected
Возвращает
string

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

76  {
77  return uniqid('bx_');
78  }

◆ getAutoFixErrorsList()

getAutoFixErrorsList ( )
Возвращает
array

Замещает IEntityMarker.

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

1305  {
1306  return [];
1307  }

◆ getAvailableFields()

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

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

27  {
28  return ["QUANTITY", "RESERVED_QUANTITY", "XML_ID"];
29  }

◆ getBasketCode()

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

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

516  {
517  if ($basketItem = $this->getBasketItem())
518  {
519  return $basketItem->getBasketCode();
520  }
521 
522  return null;
523  }

◆ getBasketId()

getBasketId ( )
Возвращает
int

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

507  {
508  return $this->getField('BASKET_ID');
509  }

◆ getBasketItem()

getBasketItem ( )
Возвращает
BasketItem

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

924  {
925  if ($this->basketItem == null)
926  {
927  $this->basketItem = $this->loadBasketItem();
928  }
929 
930  return $this->basketItem;
931  }

◆ getEntityEventName()

static getEntityEventName ( )
static
Возвращает
null|string

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

1423  {
1424  return 'SaleShipmentItem';
1425  }

◆ getErrorEntity()

getErrorEntity (   $value)
Аргументы
$value
Возвращает
string

Замещает IEntityMarker.

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

1255  {
1256  static $className = null;
1257  $errorsList = static::getAutoFixErrorsList();
1258  if (is_array($errorsList) && in_array($value, $errorsList))
1259  {
1260  if ($className === null)
1261  $className = static::getClassName();
1262  }
1263  else
1264  {
1265  /** @var ShipmentItemStoreCollection $shipmentItemStoreCollection */
1267  {
1268  $className = $shipmentItemStoreCollection->getErrorEntity($value);
1269  }
1270  }
1271 
1272  return $className;
1273  }

◆ getFieldsMap()

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

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

1413  {
1415  }
static getMap()
Returns entity map definition.

◆ getList()

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

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

1190  {
1191  return Internals\ShipmentItemTable::getList($parameters);
1192  }

◆ getMarkField()

getMarkField ( )

Замещает IEntityMarker.

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

1325  {
1326  return null;
1327  }

◆ getMeaningfulFields()

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

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

35  {
36  return ['QUANTITY'];
37  }

◆ getNeedReserveQuantity()

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

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

1376  {
1377  if (!$this->needReserve())
1378  {
1379  return 0;
1380  }
1381 
1382  $changedFields = $this->fields->getChangedValues();
1383  $originalFields = $this->fields->getOriginalValues();
1384 
1385  return $changedFields['RESERVED_QUANTITY'] - $originalFields['RESERVED_QUANTITY'];
1386  }

◆ getProductId()

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

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

530  {
531  $basketItem = $this->getBasketItem();
532  if ($basketItem)
533  {
534  return $basketItem->getProductId();
535  }
536 
537  return null;
538  }

◆ getQuantity()

getQuantity ( )
Возвращает
float

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

227  {
228  return (float)$this->getField('QUANTITY');
229  }

◆ getRegistryEntity()

static getRegistryEntity ( )
static
Возвращает
string

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

877  {
879  }

◆ getRegistryType()

static getRegistryType ( )
static
Возвращает
string

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

869  {
871  }

◆ getReservedQuantity()

getReservedQuantity ( )
Возвращает
float

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

499  {
500  return floatval($this->getField('RESERVED_QUANTITY'));
501  }

◆ getShipmentItemStoreCollection()

getShipmentItemStoreCollection ( )
Возвращает
ShipmentItemStoreCollection

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

937  {
938  if (empty($this->shipmentItemStoreCollection))
939  {
940  $registry = Registry::getInstance(static::getRegistryType());
941 
942  /** @var ShipmentItemStoreCollection $itemStoreCollectionClassName */
943  $itemStoreCollectionClassName = $registry->getShipmentItemStoreCollectionClassName();
944  $this->shipmentItemStoreCollection = $itemStoreCollectionClassName::load($this);
945  }
947  }

◆ isChanged()

isChanged ( )
Возвращает
bool

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

1082  {
1083  if (parent::isChanged())
1084  {
1085  return true;
1086  }
1087 
1088  return $this->getShipmentItemStoreCollection()->isChanged();
1089  }

◆ loadBasketItem()

loadBasketItem ( )
protected
Возвращает
Internals\CollectableEntity|bool
Исключения
Main

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

886  {
887  /** @var ShipmentItemCollection $collection */
888  $collection = $this->getCollection();
889 
890  /** @var Shipment $shipment */
891  if (!$shipment = $collection->getShipment())
892  {
893  throw new Main\ObjectNotFoundException('Entity "Shipment" not found');
894  }
895 
896  /** @var ShipmentCollection $shipmentCollection */
897  if (!$shipmentCollection = $shipment->getCollection())
898  {
899  throw new Main\ObjectNotFoundException('Entity "ShipmentCollection" not found');
900  }
901 
902  /** @var Order $order */
903  if (!$order = $shipmentCollection->getOrder())
904  {
905  throw new Main\ObjectNotFoundException('Entity "Order" not found');
906  }
907 
908  /** @var Basket $basket */
909  if (!$basket = $order->getBasket())
910  {
911  throw new Main\ObjectNotFoundException('Entity "Basket" not found');
912  }
913 
914  // [performance]
915  // new ShipmentItem binds BasketItem on initialization
916  // here we find BasketItem for already saved ShipmentItem (his ID is equal to CODE)
917  return $basket->getItemByBasketCode($this->getBasketId());
918  }

◆ loadForShipment()

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

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

833  {
834  if (intval($id) <= 0)
835  throw new Main\ArgumentNullException("id");
836 
837  $items = [];
838 
839  $itemDataList = static::getList([
840  'filter' => [
841  '=ORDER_DELIVERY_ID' => $id,
842  '!BASKET.ID' => null
843  ],
844  'order' => ['DATE_INSERT' => 'ASC', 'ID' => 'ASC']
845  ]);
846 
847  while ($itemData = $itemDataList->fetch())
848  $items[] = static::createShipmentItemObject($itemData);
849 
850  return $items;
851  }

◆ needReserve()

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

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

1351  {
1352  $changedFields = $this->fields->getChangedValues();
1353 
1354  /** @var ShipmentItemCollection $shipmentItemCollection */
1355  $shipmentItemCollection = $this->getCollection();
1356  if (!$shipmentItemCollection)
1357  {
1358  throw new Main\ObjectNotFoundException('Entity "ShipmentItemCollection" not found');
1359  }
1360 
1361  /** @var Shipment $shipment */
1362  $shipment = $shipmentItemCollection->getShipment();
1363  if (!$shipment)
1364  {
1365  throw new Main\ObjectNotFoundException('Entity "Shipment" not found');
1366  }
1367 
1368  return array_key_exists('RESERVED_QUANTITY', $changedFields) || $shipment->getField('RESERVED') == 'Y';
1369  }

◆ onBasketModify()

onBasketModify (   $action,
BasketItem  $basketItem,
  $name = null,
  $oldValue = null,
  $value = null 
)
Аргументы
$action
BasketItem$basketItem
null$name
null$oldValue
null$value
Возвращает
Result
Исключения
Main

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

963  {
964  $result = new Result();
965 
966  if ($action === EventActions::ADD)
967  {
968  $this->setFieldNoDemand('QUANTITY', $basketItem->getQuantity());
969  }
970 
971  return $result;
972  }

◆ onFieldModify()

onFieldModify (   $name,
  $oldValue,
  $value 
)
protected
Аргументы
string$name
mixed$oldValue
mixed$value
Возвращает
Result
Исключения
Main

Переопределяет метод предка CollectableEntity.

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

243  {
244  $result = new Result();
245 
246  /** @var ShipmentItemCollection $shipmentItemCollection */
247  if (!$shipmentItemCollection = $this->getCollection())
248  {
249  throw new Main\ObjectNotFoundException('Entity "ShipmentItemCollection" not found');
250  }
251 
252  /** @var Shipment $shipment */
253  if (!$shipment = $shipmentItemCollection->getShipment())
254  {
255  throw new Main\ObjectNotFoundException('Entity "Shipment" not found');
256  }
257 
258  /** @var ShipmentCollection $shipmentCollection */
259  if (!$shipmentCollection = $shipment->getCollection())
260  {
261  throw new Main\ObjectNotFoundException('Entity "ShipmentCollection" not found');
262  }
263 
264  /** @var Order $order */
265  if (!$order = $shipmentCollection->getOrder())
266  {
267  throw new Main\ObjectNotFoundException('Entity "Order" not found');
268  }
269 
270  if ($shipment->isShipped())
271  {
272  $result = new Result();
273  $result->addError(new ResultError(Loc::getMessage('SALE_SHIPMENT_ITEM_SHIPMENT_ALREADY_SHIPPED_CANNOT_EDIT'), 'SALE_SHIPMENT_ITEM_SHIPMENT_ALREADY_SHIPPED_CANNOT_EDIT'));
274  return $result;
275  }
276 
277  if ($name == "QUANTITY")
278  {
279  /** @var BasketItem $basketItem */
280  if (!$basketItem = $this->getBasketItem())
281  {
282  if ($value != 0)
283  {
284  throw new Main\ObjectNotFoundException('Entity "BasketItem" not found');
285  }
286 
287  }
288 
289 
290  $deltaQuantity = $value - $oldValue;
291 
292  if ($basketItem && $deltaQuantity > 0)
293  {
294 
295  /** @var ShipmentCollection $shipmentCollection */
296  if (!$shipmentCollection = $shipment->getCollection())
297  {
298  throw new Main\ObjectNotFoundException('Entity "ShipmentCollection" not found');
299  }
300 
301  /** @var Shipment $systemShipment */
302  if (!$systemShipment = $shipmentCollection->getSystemShipment())
303  {
304  throw new Main\ObjectNotFoundException('Entity "System Shipment" not found');
305  }
306 
307  $systemBasketItemQuantity = $systemShipment->getBasketItemQuantity($basketItem);
308  if ($systemBasketItemQuantity < abs($deltaQuantity))
309  {
310  $errorBasketCode = $basketItem->getBasketCode();
311 
312  if ($basketItem->isBundleChild())
313  {
314  /** @var BasketItem $parentBasketItem */
315  if (!($parentBasketItem = $basketItem->getParentBasketItem()))
316  {
317  throw new Main\ObjectNotFoundException('Entity "Parent Basket Item" not found');
318  }
319 
320  $errorBasketCode = $parentBasketItem->getBasketCode();
321  }
322 
323  if (isset(static::$errors[$errorBasketCode][$basketItem->getField('ORDER_DELIVERY_BASKET_ID')]['STORE_QUANTITY_LARGER_ALLOWED']))
324  {
325  static::$errors[$errorBasketCode][$basketItem->getField('ORDER_DELIVERY_BASKET_ID')]['STORE_QUANTITY_LARGER_ALLOWED'] += $basketItem->getQuantity();
326  }
327  else
328  {
329  $result->addError(
330  new ResultError(
332  'SALE_SHIPMENT_ITEM_LESS_AVAILABLE_QUANTITY',
333  [
334  '#PRODUCT_NAME#' => $basketItem->getField('NAME'),
335  ]
336  ), 'SALE_SHIPMENT_ITEM_LESS_AVAILABLE_QUANTITY'
337  )
338  );
339 
340  static::$errors[$errorBasketCode][$basketItem->getField('ORDER_DELIVERY_BASKET_ID')]['STORE_QUANTITY_LARGER_ALLOWED'] = $basketItem->getQuantity();
341  }
342 
343  return $result;
344  }
345  }
346 
347 
348  if ($basketItem)
349  {
350  if (!$this->isMathActionOnly())
351  {
352  $r = $this->calculateDelivery();
353  if (!$r->isSuccess())
354  {
355  $result->addErrors($r->getErrors());
356  }
357  }
358  }
359 
360  /** @var ShipmentItemStoreCollection $shipmentItemStoreCollection */
362  {
363  throw new Main\ObjectNotFoundException('Entity "ShipmentItemStoreCollection" not found');
364  }
365 
366 
367 
368  if ($value == 0)
369  {
370  $basketItemName = Loc::getMessage("SALE_SHIPMENT_ITEM_BASKET_WRONG_BASKET_ITEM");
371  $basketItemProductId = '1';
372 
373  if ($basketItem)
374  {
375  $basketItemName = $basketItem->getField('NAME');
376  $basketItemProductId = $basketItem->getProductId();
377  }
378 
379  $registry = Registry::getInstance(static::getRegistryType());
380 
381  /** @var OrderHistory $orderHistory */
382  $orderHistory = $registry->getOrderHistoryClassName();
383  $orderHistory::addAction(
384  'SHIPMENT',
385  $order->getId(),
386  'SHIPMENT_ITEM_BASKET_REMOVED',
387  $shipment->getId(),
388  null,
389  [
390  'NAME' => $basketItemName,
391  'PRODUCT_ID' => $basketItemProductId,
392  ]
393  );
394 
395  /** @var ShipmentItemStore $shipmentItemStore */
396  foreach ($shipmentItemStoreCollection as $shipmentItemStore)
397  {
398  $shipmentItemStore->delete();
399  }
400 
401  }
402  elseif (!$basketItem->isBundleParent())
403  {
404  // check barcodes
405  $r = $shipmentItemStoreCollection->onShipmentItemModify(EventActions::UPDATE, $this, $name, $oldValue, $value);
406  if (!$r->isSuccess())
407  {
408  $result->addErrors($r->getErrors());
409  return $result;
410  }
411 
412  $barcodeQuantity = $shipmentItemStoreCollection->getQuantityByBasketCode($basketItem->getBasketCode());
413  if ($barcodeQuantity > $value)
414  {
415  $result->addError(
416  new ResultError(
417  Loc::getMessage('SALE_SHIPMENT_ITEM_BARCODE_MORE_ITEM_QUANTITY'),
418  'BARCODE_MORE_ITEM_QUANTITY'
419  )
420  );
421 
422  return $result;
423  }
424  }
425 
426  if (!$basketItem)
427  {
428  return $result;
429  }
430  }
431 
432 
433  return parent::onFieldModify($name, $oldValue, $value);
434  }

◆ save()

save ( )

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

551  {
552  $this->checkCallingContext();
553 
554  $result = new Result();
555 
556  $id = $this->getId();
557  $fields = $this->fields->getValues();
558 
559  /** @var ShipmentItemCollection $shipmentItemCollection */
560  if (!$shipmentItemCollection = $this->getCollection())
561  {
562  throw new Main\ObjectNotFoundException('Entity "ShipmentItemCollection" not found');
563  }
564 
565  /** @var Shipment $shipment */
566  if (!$shipment = $shipmentItemCollection->getShipment())
567  {
568  throw new Main\ObjectNotFoundException('Entity "Shipment" not found');
569  }
570 
571  /** @var ShipmentCollection $shipmentCollection */
572  if (!$shipmentCollection = $shipment->getCollection())
573  {
574  throw new Main\ObjectNotFoundException('Entity "ShipmentCollection" not found');
575  }
576 
577  /** @var Order $order */
578  if (!$order = $shipmentCollection->getOrder())
579  {
580  throw new Main\ObjectNotFoundException('Entity "Order" not found');
581  }
582 
583 
584  if ($this->isChanged())
585  {
586  /** @var Main\Entity\Event $event */
587  $event = new Main\Event('sale', 'OnBeforeSaleShipmentItemEntitySaved', [
588  'ENTITY' => $this,
589  'VALUES' => $this->fields->getOriginalValues()
590  ]);
591  $event->send();
592  }
593 
594 
595  if ($id > 0)
596  {
597  $fields = $this->fields->getChangedValues();
598 
599  if (!empty($fields) && is_array($fields))
600  {
601  /** @var ShipmentItemCollection $shipmentItemCollection */
602  if (!$shipmentItemCollection = $this->getCollection())
603  {
604  throw new Main\ObjectNotFoundException('Entity "ShipmentItemCollection" not found');
605  }
606 
607  /** @var Shipment $shipment */
608  if (!$shipment = $shipmentItemCollection->getShipment())
609  {
610  throw new Main\ObjectNotFoundException('Entity "Shipment" not found');
611  }
612 
613  if (!$shipment->isSystem())
614  {
615  if (isset($fields["QUANTITY"]) && (floatval($fields["QUANTITY"]) == 0))
616  return $result;
617  }
618 
619  $r = $this->updateInternal($id, $fields);
620  if (!$r->isSuccess())
621  {
622  $registry = Registry::getInstance(static::getRegistryType());
623 
624  /** @var OrderHistory $orderHistory */
625  $orderHistory = $registry->getOrderHistoryClassName();
626  $orderHistory::addAction(
627  'SHIPMENT',
628  $order->getId(),
629  'SHIPMENT_ITEM_UPDATE_ERROR',
630  $id,
631  $this,
632  ["ERROR" => $r->getErrorMessages()]
633  );
634 
635  $result->addErrors($r->getErrors());
636  return $result;
637  }
638 
639  if ($resultData = $r->getData())
640  $result->setData($resultData);
641  }
642 
643  if ($order && $order->getId() > 0)
644  {
645  $registry = Registry::getInstance(static::getRegistryType());
646 
647  /** @var OrderHistory $orderHistory */
648  $orderHistory = $registry->getOrderHistoryClassName();
649  $orderHistory::collectEntityFields('SHIPMENT_ITEM_STORE', $order->getId(), $id);
650  }
651  }
652  else
653  {
654  $fields['ORDER_DELIVERY_ID'] = $this->getParentShipmentId();
655  $this->setFieldNoDemand('ORDER_DELIVERY_ID', $fields['ORDER_DELIVERY_ID']);
656 
657  $fields['DATE_INSERT'] = new Main\Type\DateTime();
658  $this->setFieldNoDemand('DATE_INSERT', $fields['DATE_INSERT']);
659 
660  $fields["BASKET_ID"] = $this->basketItem->getId();
661  $this->setFieldNoDemand('BASKET_ID', $fields['BASKET_ID']);
662 
663  if (intval($fields['BASKET_ID']) <= 0)
664  {
665 
666  $error = Loc::getMessage(
667  'SALE_SHIPMENT_ITEM_BASKET_ITEM_ID_EMPTY',
668  [
669  '#PRODUCT_NAME#' => $this->basketItem->getField('NAME')
670  ]
671  );
672 
673  $registry = Registry::getInstance(static::getRegistryType());
674 
675  /** @var OrderHistory $orderHistory */
676  $orderHistory = $registry->getOrderHistoryClassName();
677  $orderHistory::addAction(
678  'SHIPMENT',
679  $order->getId(),
680  'SHIPMENT_ITEM_BASKET_ITEM_EMPTY_ERROR',
681  null,
682  $this,
683  [
684  "ERROR" => $error
685  ]
686  );
687 
688  $result->addError(new ResultError($error, 'SALE_SHIPMENT_ITEM_BASKET_ITEM_ID_EMPTY'));
689 
690  return $result;
691  }
692 
693  if (!isset($fields["QUANTITY"]) || (floatval($fields["QUANTITY"]) == 0))
694  return $result;
695 
696  if (!isset($fields['RESERVED_QUANTITY']))
697  {
698  $fields['RESERVED_QUANTITY'] = $this->getReservedQuantity() === null ? 0 : $this->getReservedQuantity();
699  $this->setFieldNoDemand('RESERVED_QUANTITY', $fields['RESERVED_QUANTITY']);
700  }
701 
702  $r = $this->addInternal($fields);
703  if (!$r->isSuccess())
704  {
705  $registry = Registry::getInstance(static::getRegistryType());
706 
707  /** @var OrderHistory $orderHistory */
708  $orderHistory = $registry->getOrderHistoryClassName();
709  $orderHistory::addAction(
710  'SHIPMENT',
711  $order->getId(),
712  'SHIPMENT_ITEM_ADD_ERROR',
713  null,
714  $this,
715  ["ERROR" => $r->getErrorMessages()]
716  );
717 
718  $result->addErrors($r->getErrors());
719  return $result;
720  }
721 
722  if ($resultData = $r->getData())
723  $result->setData($resultData);
724 
725  $id = $r->getId();
726  $this->setFieldNoDemand('ID', $id);
727 
728  if (!$shipment->isSystem())
729  {
730  $registry = Registry::getInstance(static::getRegistryType());
731 
732  /** @var OrderHistory $orderHistory */
733  $orderHistory = $registry->getOrderHistoryClassName();
734  $orderHistory::addAction(
735  'SHIPMENT',
736  $order->getId(),
737  'SHIPMENT_ITEM_BASKET_ADDED',
738  $shipment->getId(),
739  $this->basketItem,
740  [
741  'QUANTITY' => $this->getQuantity(),
742  ]
743  );
744  }
745  }
746 
747  if ($id > 0)
748  {
749  $result->setId($id);
750  }
751 
752  if ($this->isChanged())
753  {
754  /** @var Main\Event $event */
755  $event = new Main\Event('sale', 'OnSaleShipmentItemEntitySaved', [
756  'ENTITY' => $this,
757  'VALUES' => $this->fields->getOriginalValues(),
758  ]);
759  $event->send();
760  }
761 
763  $r = $shipmentItemStoreCollection->save();
764  if (!$r->isSuccess())
765  {
766  $result->addErrors($r->getErrors());
767  }
768 
769  if ($result->isSuccess())
770  {
771  $registry = Registry::getInstance(static::getRegistryType());
772 
773  /** @var OrderHistory $orderHistory */
774  $orderHistory = $registry->getOrderHistoryClassName();
775  $orderHistory::collectEntityFields('SHIPMENT_ITEM', $order->getId(), $id);
776  }
777 
778  return $result;
779  }
updateInternal($primary, array $data)

◆ setQuantity()

setQuantity (   $quantity)
Аргументы
float$quantity
Возвращает
Result
Исключения
Main

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

488  {
489  if (!is_numeric($quantity))
490  throw new Main\ArgumentTypeException("quantity");
491 
492  return $this->setField('QUANTITY', (float)$quantity);
493  }

◆ toArray()

toArray ( )
Возвращает
array

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

1430  : array
1431  {
1432  $result = parent::toArray();
1433 
1434  $result['STORES'] = $this->getShipmentItemStoreCollection()->toArray();
1435 
1436  return $result;
1437  }

◆ tryFixError()

tryFixError (   $code)
Аргументы
$code
Возвращает
Result

Замещает IEntityMarker.

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

1315  {
1316  return new Result();
1317  }

◆ tryReserve()

tryReserve ( )
Исключения
Main

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

1097  {
1099  }
static tryReserveShipmentItem(Sale\ShipmentItem $shipmentItem, array $context=array())

◆ tryUnreserve()

tryUnreserve ( )
Исключения
Main

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

1107  {
1109  }
static tryUnreserveShipmentItem(Sale\ShipmentItem $shipmentItem)

◆ updateInternal()

updateInternal (   $primary,
array  $data 
)
protected
Аргументы
$primary
array$data
Возвращает
Main\ORM\Data\UpdateResult
Исключения

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

1405  {
1406  return Internals\ShipmentItemTable::update($primary, $data);
1407  }

◆ verify()

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

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

1117  {
1118  $result = new Result();
1119 
1120  /** @var ShipmentItemCollection $shipmentItemCollection */
1121  if (!$shipmentItemCollection = $this->getCollection())
1122  {
1123  throw new Main\ObjectNotFoundException('Entity "ShipmentItemCollection" not found');
1124  }
1125 
1126  /** @var Shipment $shipment */
1127  if (!$shipment = $shipmentItemCollection->getShipment())
1128  {
1129  throw new Main\ObjectNotFoundException('Entity "Shipment" not found');
1130  }
1131 
1132  if (!$basketItem = $this->getBasketItem())
1133  {
1134  $result->addError(
1135  new ResultError(
1137  'SALE_SHIPMENT_ITEM_BASKET_ITEM_NOT_FOUND',
1138  [
1139  '#BASKET_ITEM_ID#' => $this->getBasketId(),
1140  '#SHIPMENT_ID#' => $shipment->getId(),
1141  '#SHIPMENT_ITEM_ID#' => $this->getId(),
1142  ]
1143  ), 'SALE_SHIPMENT_ITEM_BASKET_ITEM_NOT_FOUND'
1144  )
1145  );
1146 
1147  return $result;
1148  }
1149 
1150  if ($this->getQuantity() <= 0)
1151  {
1152  $result->addError(
1153  new ResultError(
1155  'SALE_SHIPMENT_ITEM_ERR_QUANTITY_EMPTY',
1156  [
1157  '#BASKET_ITEM_NAME#' => $this->getBasketItem()->getField('NAME'),
1158  ]
1159  ), 'SALE_SHIPMENT_ITEM_ERR_QUANTITY_EMPTY'
1160  )
1161  );
1162 
1163  return $result;
1164  }
1165 
1166  /** @var ShipmentItemStoreCollection $shipmentItemCollection */
1168  {
1169  /** @var ShipmentItemStore $shipmentItemStore */
1170  foreach ($shipmentItemStoreCollection as $shipmentItemStore)
1171  {
1172  $r = $shipmentItemStore->verify();
1173  if (!$r->isSuccess())
1174  {
1175  $result->addErrors($r->getErrors());
1176  }
1177  }
1178  }
1179 
1180  return $result;
1181  }

Поля

◆ $basketItem

$basketItem
protected

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

◆ $errors

$errors = []
staticprotected

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

◆ $shipmentItemStoreCollection

$shipmentItemStoreCollection
protected

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


Объявления и описания членов класса находятся в файле: