/** * @return Entity\AddResult|Entity\UpdateResult * @throws ArgumentException * @throws ArgumentNullException * @throws \Exception */ public function save() { $id = $this->getId(); $changedFields = $this->fields->getChangedValues(); $isNew = $id <= 0; if (!empty($changedFields)) { /** @var array $oldEntityValues */ $oldEntityValues = $this->fields->getOriginalValues(); /** @var Event $event */ $event = new Event('sale', EventActions::EVENT_ON_BASKET_ITEM_BEFORE_SAVED, array('ENTITY' => $this, 'IS_NEW' => $isNew, 'VALUES' => $oldEntityValues)); $event->send(); if ($event->getResults()) { $result = new Result(); /** @var EventResult $eventResult */ foreach ($event->getResults() as $eventResult) { if ($eventResult->getType() == EventResult::ERROR) { $errorMsg = new ResultError(Loc::getMessage('SALE_EVENT_ON_BEFORE_BASKET_ITEM_SAVED'), 'SALE_EVENT_ON_BEFORE_BASKET_ITEM_SAVED'); if (isset($eventResultData['ERROR']) && $eventResultData['ERROR'] instanceof ResultError) { $errorMsg = $eventResultData['ERROR']; } $result->addError($errorMsg); } } if (!$result->isSuccess()) { return $result; } } } $fields = $this->fields->getValues(); if ($this->isBundleParent()) { $bundleBasketCollection = $this->getBundleCollection(); } if ($id > 0) { $fields = $changedFields; if (!isset($fields["ORDER_ID"]) || intval($fields["ORDER_ID"]) == 0) { $orderId = null; if ($this->getParentOrderId() > 0) { $orderId = $this->getParentOrderId(); } if ($this->isBundleChild() && $orderId === null) { /** @var BasketItem $parentBasket */ if (!($parentBasket = $this->getParentBasketItem())) { throw new ObjectNotFoundException('Entity parent "BasketItem" not found'); } $orderId = $parentBasket->getParentOrderId(); } if (intval($orderId) > 0 && $this->getField('ORDER_ID') != $orderId) { $fields['ORDER_ID'] = $orderId; } } if (!empty($fields) && is_array($fields)) { if (isset($fields["QUANTITY"]) && floatval($fields["QUANTITY"]) == 0) { return new Entity\UpdateResult(); } $fields['DATE_UPDATE'] = new DateTime(); $this->setFieldNoDemand('DATE_UPDATE', $fields['DATE_UPDATE']); $r = Internals\BasketTable::update($id, $fields); if (!$r->isSuccess()) { return $r; } } $result = new Entity\UpdateResult(); } else { $fields['ORDER_ID'] = $this->getParentOrderId(); $fields['DATE_INSERT'] = new DateTime(); $fields['DATE_UPDATE'] = new DateTime(); $this->setFieldNoDemand('DATE_INSERT', $fields['DATE_INSERT']); $this->setFieldNoDemand('DATE_UPDATE', $fields['DATE_UPDATE']); if (!$this->isBundleChild() && (!isset($fields["FUSER_ID"]) || intval($fields["FUSER_ID"]) <= 0)) { /** @var Basket $basket */ if (!($basket = $this->getCollection())) { throw new ObjectNotFoundException('Entity "Basket" not found'); } $fields["FUSER_ID"] = intval($basket->getFUserId()); } /** @var Basket $basket */ if (!($basket = $this->getCollection())) { throw new ObjectNotFoundException('Entity "Basket" not found'); } /** @var Order $order */ if ($order = $basket->getOrder()) { if (!isset($fields["LID"]) || strval($fields["LID"]) == '') { $fields['LID'] = $order->getField('LID'); } } else { if ($siteId = $basket->getSiteId()) { $fields['LID'] = $siteId; } } if ($this->isBundleChild()) { if (!($parentBasketItem = $this->getParentBasketItem())) { throw new ObjectNotFoundException('Entity parent "BasketItem" not found'); } $fields['LID'] = $parentBasketItem->getField('LID'); if (!isset($fields["FUSER_ID"]) || intval($fields["FUSER_ID"]) <= 0) { $fields['FUSER_ID'] = intval($parentBasketItem->getField('FUSER_ID')); } } if (!isset($fields["LID"]) || strval(trim($fields["LID"])) == '') { throw new ArgumentNullException('lid'); } if ($this->isBundleChild() && (!isset($fields["SET_PARENT_ID"]) || intval($fields["QUANTITY"]) <= 0)) { $fields["SET_PARENT_ID"] = $this->getParentBasketItemId(); $this->setFieldNoDemand('SET_PARENT_ID', $fields['SET_PARENT_ID']); } if (!isset($fields["QUANTITY"]) || floatval($fields["QUANTITY"]) == 0) { return new Entity\AddResult(); } if (!isset($fields["CURRENCY"]) || strval(trim($fields["CURRENCY"])) == '') { throw new ArgumentNullException('currency'); } $r = Internals\BasketTable::add($fields); if (!$r->isSuccess()) { return $r; } $id = $r->getId(); $this->setFieldNoDemand('ID', $id); $this->setFieldNoDemand('LID', $fields['LID']); $this->setFieldNoDemand('FUSER_ID', $fields['FUSER_ID']); if ($basket->getOrder() && $basket->getOrderId() > 0) { OrderHistory::addAction('BASKET', $order->getId(), 'BASKET_ADDED', $id, $this); } $result = new Entity\AddResult(); } if ($isNew || !empty($changedFields)) { /** @var array $oldEntityValues */ $oldEntityValues = $this->fields->getOriginalValues(); /** @var Event $event */ $event = new Event('sale', EventActions::EVENT_ON_BASKET_ITEM_SAVED, array('ENTITY' => $this, 'IS_NEW' => $isNew, 'VALUES' => $oldEntityValues)); $event->send(); if ($event->getResults()) { $result = new Result(); /** @var EventResult $eventResult */ foreach ($event->getResults() as $eventResult) { if ($eventResult->getType() == EventResult::ERROR) { $errorMsg = new ResultError(Loc::getMessage('SALE_EVENT_ON_BEFORE_BASKET_ITEM_SAVED'), 'SALE_EVENT_ON_BEFORE_BASKET_ITEM_SAVED'); if (isset($eventResultData['ERROR']) && $eventResultData['ERROR'] instanceof ResultError) { $errorMsg = $eventResultData['ERROR']; } $result->addError($errorMsg); } } if (!$result->isSuccess()) { return $result; } } } if ($eventName = static::getEntityEventName()) { /** @var array $oldEntityValues */ $oldEntityValues = $this->fields->getOriginalValues(); if (!empty($oldEntityValues)) { /** @var Event $event */ $event = new Event('sale', 'On' . $eventName . 'EntitySaved', array('ENTITY' => $this, 'VALUES' => $oldEntityValues)); $event->send(); } } $this->fields->clearChanged(); // bundle if ($this->isBundleParent()) { if (!empty($bundleBasketCollection)) { if (!($order = $bundleBasketCollection->getOrder())) { /** @var Basket $basketCollection */ $basketCollection = $this->getCollection(); if ($order = $basketCollection->getOrder()) { $bundleBasketCollection->setOrder($order); } } $itemsFromDb = array(); if (!$isNew) { $itemsFromDbList = Internals\BasketTable::getList(array("filter" => array("SET_PARENT_ID" => $id), "select" => array("ID"))); while ($itemsFromDbItem = $itemsFromDbList->fetch()) { if ($itemsFromDbItem["ID"] == $id) { continue; } $itemsFromDb[$itemsFromDbItem["ID"]] = true; } } /** @var BasketItem $bundleBasketItem */ foreach ($bundleBasketCollection as $bundleBasketItem) { $r = $bundleBasketItem->save(); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } if (isset($itemsFromDb[$bundleBasketItem->getId()])) { unset($itemsFromDb[$bundleBasketItem->getId()]); } } foreach ($itemsFromDb as $k => $v) { Internals\BasketTable::delete($k); } } } /** @var BasketPropertiesCollection $basketPropertyCollection */ $basketPropertyCollection = $this->getPropertyCollection(); $r = $basketPropertyCollection->save(); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } return $result; }
/** * @return Entity\AddResult|Entity\UpdateResult|Result|mixed * @throws Main\ArgumentOutOfRangeException */ public function save() { global $USER; $result = new Result(); $id = $this->getId(); $this->isNew = $id == 0; /** @var array $oldEntityValues */ $oldEntityValues = $this->fields->getOriginalValues(); /** @var Main\Entity\Event $event */ $event = new Main\Event('sale', EventActions::EVENT_ON_ORDER_BEFORE_SAVED, array('ENTITY' => $this, 'VALUES' => $oldEntityValues)); $event->send(); if ($event->getResults()) { $result = new Result(); /** @var Main\EventResult $eventResult */ foreach ($event->getResults() as $eventResult) { if ($eventResult->getType() == Main\EventResult::ERROR) { $errorMsg = new ResultError(Main\Localization\Loc::getMessage('SALE_EVENT_ON_BEFORE_ORDER_SAVED_ERROR'), 'SALE_EVENT_ON_BEFORE_ORDER_SAVED_ERROR'); if ($eventResultData = $eventResult->getParameters()) { if (isset($eventResultData['ERROR']) && $eventResultData['ERROR'] instanceof ResultError) { $errorMsg = $eventResultData['ERROR']; } } $result->addError($errorMsg); } } if (!$result->isSuccess()) { return $result; } } $r = Provider::onOrderSave($this); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); return $result; } $fields = $this->fields->getValues(); if ($id > 0) { $fields = $this->fields->getChangedValues(); if ($this->isChanged()) { $fields['DATE_UPDATE'] = new Type\DateTime(); $this->setFieldNoDemand('DATE_UPDATE', $fields['DATE_UPDATE']); $fields['VERSION'] = intval($this->getField('VERSION')) + 1; $this->setFieldNoDemand('VERSION', $fields['VERSION']); $fields['UPDATED_1C'] = 'N'; $this->setFieldNoDemand('UPDATED_1C', $fields['UPDATED_1C']); } if (!empty($fields) && is_array($fields)) { $result = Internals\OrderTable::update($id, $fields); if (!$result->isSuccess()) { return $result; } } else { $result = new Entity\UpdateResult(); } } else { $fields['DATE_UPDATE'] = $fields['DATE_INSERT'] = new Type\DateTime(); $this->setFieldNoDemand('DATE_INSERT', $fields['DATE_INSERT']); $this->setFieldNoDemand('DATE_UPDATE', $fields['DATE_UPDATE']); if ($USER->isAuthorized()) { $fields['CREATED_BY'] = $USER->getID(); $this->setFieldNoDemand('CREATED_BY', $fields['CREATED_BY']); } if (!isset($fields['STATUS_ID']) || strval($fields['STATUS_ID']) == '') { $orderStatus = OrderStatus::getInitialStatus(); if (!empty($orderStatus) && !is_array($orderStatus)) { $fields['STATUS_ID'] = $orderStatus; $this->setFieldNoDemand('STATUS_ID', $fields['STATUS_ID']); } } if (isset($fields['STATUS_ID']) && strval($fields['STATUS_ID']) != '') { if (!isset($fields['DATE_STATUS']) || strval($fields['DATE_STATUS']) == '') { $fields['DATE_STATUS'] = new Type\DateTime(); $this->setFieldNoDemand('DATE_STATUS', $fields['DATE_STATUS']); } if ((!isset($fields['EMP_STATUS_ID']) || (int) $fields['EMP_STATUS_ID'] <= 0) && $USER->isAuthorized()) { $fields['EMP_STATUS_ID'] = $USER->getID(); $this->setFieldNoDemand('EMP_STATUS_ID', $fields['EMP_STATUS_ID']); } } $result = Internals\OrderTable::add($fields); if (!$result->isSuccess()) { return $result; } $id = $result->getId(); $this->setFieldNoDemand('ID', $id); /** @var Result $r */ $r = static::setAccountNumber($id); if ($r->isSuccess()) { if ($accountData = $r->getData()) { if (array_key_exists('ACCOUNT_NUMBER', $accountData)) { $this->setField('ACCOUNT_NUMBER', $accountData['ACCOUNT_NUMBER']); } } } OrderHistory::addAction('ORDER', $id, 'ORDER_ADDED', $id, $this); } if ($eventName = static::getEntityEventName()) { $oldEntityValues = $this->fields->getOriginalValues(); if (!empty($oldEntityValues)) { /** @var Main\Event $event */ $event = new Main\Event('sale', 'On' . $eventName . 'EntitySaved', array('ENTITY' => $this, 'VALUES' => $oldEntityValues)); $event->send(); } } OrderHistory::collectEntityFields('ORDER', $id, $id); $this->fields->clearChanged(); /** @var Basket $basket */ $basket = $this->getBasket(); /** @var Result $r */ $r = $basket->save(); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } /** @var PaymentCollection $paymentCollection */ $paymentCollection = $this->getPaymentCollection(); /** @var Result $r */ $r = $paymentCollection->save(); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } // user budget Internals\UserBudgetPool::onUserBudgetSave($this->getUserId()); /** @var ShipmentCollection $shipmentCollection */ $shipmentCollection = $this->getShipmentCollection(); /** @var Result $r */ $r = $shipmentCollection->save(); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } /** @var Tax $tax */ $tax = $this->getTax(); /** @var Result $r */ $r = $tax->save(); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } /** @var PropertyValueCollection $propertyCollection */ $propertyCollection = $this->getPropertyCollection(); /** @var Result $r */ $r = $propertyCollection->save(); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } /** @var Discount $discount */ $discount = $this->getDiscount(); /** @var Result $r */ $r = $discount->save(); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } /** @var array $oldEntityValues */ $oldEntityValues = $this->fields->getOriginalValues(); $event = new Main\Event('sale', EventActions::EVENT_ON_ORDER_SAVED, array('ENTITY' => $this, 'IS_NEW' => $this->isNew, 'VALUES' => $oldEntityValues)); $event->send(); if (($eventList = Internals\EventsPool::getEvents($this)) && !empty($eventList) && is_array($eventList)) { foreach ($eventList as $eventName => $eventData) { $event = new Main\Event('sale', $eventName, $eventData); $event->send(); } Internals\EventsPool::resetEvents($this); } $this->isNew = false; return $result; }
/** * @return Entity\AddResult|Entity\UpdateResult|Result|mixed * @throws Main\ArgumentOutOfRangeException */ public function save() { global $USER, $CACHE_MANAGER; $result = new Result(); $id = $this->getId(); $this->isNew = $id == 0; if ($this->isNew) { $fields = $this->fields->getChangedValues(); if (empty($fields['STATUS_ID'])) { /** @var Result $r */ $r = $this->setField("STATUS_ID", OrderStatus::getInitialStatus()); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } } } /** @var array $oldEntityValues */ $oldEntityValues = $this->fields->getOriginalValues(); /** @var Main\Entity\Event $event */ $event = new Main\Event('sale', EventActions::EVENT_ON_ORDER_BEFORE_SAVED, array('ENTITY' => $this, 'VALUES' => $oldEntityValues)); $event->send(); if ($event->getResults()) { /** @var Main\EventResult $eventResult */ foreach ($event->getResults() as $eventResult) { if ($eventResult->getType() == Main\EventResult::ERROR) { $errorMsg = new ResultError(Main\Localization\Loc::getMessage('SALE_EVENT_ON_BEFORE_ORDER_SAVED_ERROR'), 'SALE_EVENT_ON_BEFORE_ORDER_SAVED_ERROR'); if ($eventResultData = $eventResult->getParameters()) { if (isset($eventResultData) && $eventResultData instanceof ResultError) { /** @var ResultError $errorMsg */ $errorMsg = $eventResultData; } } $result->addError($errorMsg); } } } if (!$result->isSuccess()) { return $result; } $r = $this->verify(); if (!$r->isSuccess()) { $oldErrorText = $this->getField('REASON_MARKED'); /** @var ResultError $error */ foreach ($r->getErrors() as $error) { if ($error instanceof ResultNotice) { continue; } elseif ($error instanceof ResultWarning) { $oldErrorText .= (strval($oldErrorText) != '' ? "\n" : "") . $error->getMessage(); continue; } else { $result->addError($error); } } if (strval(trim($oldErrorText)) != '') { $this->setField('MARKED', "Y"); $this->setField('REASON_MARKED', $oldErrorText); } if (!$result->isSuccess()) { return $result; } } $r = Provider::onOrderSave($this); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); return $result; } $fields = $this->fields->getValues(); if ($id > 0) { $fields = $this->fields->getChangedValues(); $isChanged = (bool) (!empty($fields)); if ($this->isChanged()) { if (!isset($fields['DATE_UPDATE']) || strval($fields['DATE_UPDATE']) == '') { $fields['DATE_UPDATE'] = new Type\DateTime(); $this->setFieldNoDemand('DATE_UPDATE', $fields['DATE_UPDATE']); } $fields['VERSION'] = intval($this->getField('VERSION')) + 1; $this->setFieldNoDemand('VERSION', $fields['VERSION']); if (array_key_exists('REASON_MARKED', $fields) && strlen($fields['REASON_MARKED']) > 255) { $fields['REASON_MARKED'] = substr($fields['REASON_MARKED'], 0, 255); } } if (!empty($fields) && is_array($fields)) { $r = Internals\OrderTable::update($id, $fields); if (!$r->isSuccess()) { OrderHistory::addAction('ORDER', $id, 'ORDER_UPDATE_ERROR', $id, $this, array("ERROR" => $r->getErrorMessages())); $result->addWarnings($r->getErrors()); return $result; } if ($resultData = $r->getData()) { $result->setData($resultData); } OrderHistory::addAction('ORDER', $id, 'ORDER_UPDATED', $id, $this); } } else { $isChanged = true; if (!isset($fields['DATE_INSERT']) || strval($fields['DATE_INSERT']) == '') { $fields['DATE_INSERT'] = new Type\DateTime(); $this->setFieldNoDemand('DATE_INSERT', $fields['DATE_INSERT']); } if (!isset($fields['DATE_UPDATE']) || strval($fields['DATE_UPDATE']) == '') { $fields['DATE_UPDATE'] = new Type\DateTime(); $this->setFieldNoDemand('DATE_UPDATE', $fields['DATE_UPDATE']); } if ($USER->isAuthorized()) { $fields['CREATED_BY'] = $USER->getID(); $this->setFieldNoDemand('CREATED_BY', $fields['CREATED_BY']); } if (!isset($fields['STATUS_ID']) || strval($fields['STATUS_ID']) == '') { $orderStatus = OrderStatus::getInitialStatus(); if (!empty($orderStatus) && !is_array($orderStatus)) { $fields['STATUS_ID'] = $orderStatus; $this->setFieldNoDemand('STATUS_ID', $fields['STATUS_ID']); } } if (isset($fields['STATUS_ID']) && strval($fields['STATUS_ID']) != '') { if (!isset($fields['DATE_STATUS']) || strval($fields['DATE_STATUS']) == '') { $fields['DATE_STATUS'] = new Type\DateTime(); $this->setFieldNoDemand('DATE_STATUS', $fields['DATE_STATUS']); } if ((!isset($fields['EMP_STATUS_ID']) || (int) $fields['EMP_STATUS_ID'] <= 0) && $USER->isAuthorized()) { $fields['EMP_STATUS_ID'] = $USER->getID(); $this->setFieldNoDemand('EMP_STATUS_ID', $fields['EMP_STATUS_ID']); } } if (array_key_exists('REASON_MARKED', $fields) && strlen($fields['REASON_MARKED']) > 255) { $fields['REASON_MARKED'] = substr($fields['REASON_MARKED'], 0, 255); } $r = Internals\OrderTable::add($fields); if (!$r->isSuccess()) { $result->addWarnings($r->getErrors()); return $result; } if ($resultData = $r->getData()) { $result->setData($resultData); } $id = $r->getId(); $this->setFieldNoDemand('ID', $id); /** @var Result $r */ $r = static::setAccountNumber($id); if ($r->isSuccess()) { if ($accountData = $r->getData()) { if (array_key_exists('ACCOUNT_NUMBER', $accountData)) { $this->setField('ACCOUNT_NUMBER', $accountData['ACCOUNT_NUMBER']); } } } OrderHistory::addAction('ORDER', $id, 'ORDER_ADDED', $id, $this); } if ($id > 0) { $result->setId($id); } if ($eventName = static::getEntityEventName()) { $oldEntityValues = $this->fields->getOriginalValues(); if (!empty($oldEntityValues)) { /** @var Main\Event $event */ $event = new Main\Event('sale', 'On' . $eventName . 'EntitySaved', array('ENTITY' => $this, 'VALUES' => $oldEntityValues)); $event->send(); } } $changeMeaningfulFields = array("PERSON_TYPE_ID", "CANCELED", "STATUS_ID", "MARKED", "PRICE", "SUM_PAID", "USER_ID", "EXTERNAL_ORDER"); if ($isChanged) { $logFields = array(); if (!$this->isNew) { $fields = $this->getFields(); $originalValues = $fields->getOriginalValues(); foreach ($originalValues as $originalFieldName => $originalFieldValue) { if (in_array($originalFieldName, $changeMeaningfulFields) && $this->getField($originalFieldName) != $originalFieldValue) { $logFields[$originalFieldName] = $this->getField($originalFieldName); $logFields['OLD_' . $originalFieldName] = $originalFieldValue; } } OrderHistory::addLog('ORDER', $id, "ORDER_UPDATE", $id, $this, $logFields, OrderHistory::SALE_ORDER_HISTORY_LOG_LEVEL_1); } } OrderHistory::collectEntityFields('ORDER', $id, $id); /** @var Basket $basket */ $basket = $this->getBasket(); /** @var Result $r */ $r = $basket->save(); if (!$r->isSuccess()) { $result->addWarnings($r->getErrors()); } /** @var PaymentCollection $paymentCollection */ $paymentCollection = $this->getPaymentCollection(); /** @var Result $r */ $r = $paymentCollection->save(); if (!$r->isSuccess()) { $result->addWarnings($r->getErrors()); } // user budget Internals\UserBudgetPool::onUserBudgetSave($this->getUserId()); /** @var ShipmentCollection $shipmentCollection */ $shipmentCollection = $this->getShipmentCollection(); /** @var Result $r */ $r = $shipmentCollection->save(); if (!$r->isSuccess()) { $result->addWarnings($r->getErrors()); } /** @var Tax $tax */ $tax = $this->getTax(); /** @var Result $r */ $r = $tax->save(); if (!$r->isSuccess()) { $result->addWarnings($r->getErrors()); } /** @var PropertyValueCollection $propertyCollection */ $propertyCollection = $this->getPropertyCollection(); /** @var Result $r */ $r = $propertyCollection->save(); if (!$r->isSuccess()) { $result->addWarnings($r->getErrors()); } /** @var Discount $discount */ $discount = $this->getDiscount(); /** @var Result $r */ $r = $discount->save(); if (!$r->isSuccess()) { $result->addWarnings($r->getErrors()); } /** @var array $oldEntityValues */ $oldEntityValues = $this->fields->getOriginalValues(); OrderHistory::addLog('ORDER', $this->getId(), 'ORDER_EVENT_ON_ORDER_SAVED', null, null, array(), OrderHistory::SALE_ORDER_HISTORY_LOG_LEVEL_1); $event = new Main\Event('sale', EventActions::EVENT_ON_ORDER_SAVED, array('ENTITY' => $this, 'IS_NEW' => $this->isNew, 'VALUES' => $oldEntityValues)); $event->send(); if (($eventList = Internals\EventsPool::getEvents($this)) && !empty($eventList) && is_array($eventList)) { foreach ($eventList as $eventName => $eventData) { $event = new Main\Event('sale', $eventName, $eventData); $event->send(); Notify::callNotify($this, $eventName); } Internals\EventsPool::resetEvents($this); } Notify::callNotify($this, EventActions::EVENT_ON_ORDER_SAVED); if (!$result->isSuccess()) { $errorMsg = $this->getField('REASON_MARKED'); $errorMsg .= (strval($errorMsg) != "" ? "\n" : "") . join("\n", $result->getErrors()); $updateFields = array('MARKED' => 'Y', 'DATE_MARKED' => new Type\DateTime(), 'EMP_MARKED_ID' => $USER->getId(), 'REASON_MARKED' => $errorMsg); Internals\OrderTable::update($id, $updateFields); OrderHistory::addLog('ORDER', $this->getId(), 'ORDER_EVENT_ON_ORDER_SAVED_ERROR', null, null, array("ERROR" => $errorMsg), OrderHistory::SALE_ORDER_HISTORY_LOG_LEVEL_1); } else { if (defined("CACHED_b_sale_order") && ($this->isNew || $this->isChanged() && $fields["UPDATED_1C"] != "Y")) { $CACHE_MANAGER->Read(CACHED_b_sale_order, "sale_orders"); $CACHE_MANAGER->SetImmediate("sale_orders", true); } } OrderHistory::collectEntityFields('ORDER', $id, $id); $this->fields->clearChanged(); $this->isNew = false; return $result; }
/** * @return Entity\AddResult|Entity\UpdateResult * @throws Main\ArgumentOutOfRangeException * @throws Main\ObjectNotFoundException * @throws \Exception */ public function save() { $id = $this->getId(); $fields = $this->fields->getValues(); if ($id > 0) { $fields = $this->fields->getChangedValues(); if (!empty($fields) && is_array($fields)) { // $fields['DATE_UPDATE'] = new Main\Type\DateTime(); $r = Internals\ShipmentTable::update($id, $fields); if (!$r->isSuccess()) { return $r; } } $result = new Entity\UpdateResult(); if (!empty($fields['TRACKING_NUMBER'])) { $oldEntityValues = $this->fields->getOriginalValues(); /** @var Main\Event $event */ $event = new Main\Event('sale', EventActions::EVENT_ON_SHIPMENT_TRACKING_NUMBER_CHANGE, array('ENTITY' => $this, 'VALUES' => $oldEntityValues)); $event->send(); } } else { $fields['ORDER_ID'] = $this->getParentOrderId(); $fields['DATE_INSERT'] = new Main\Type\DateTime(); $fields['SYSTEM'] = $fields['SYSTEM'] ? 'Y' : 'N'; $r = Internals\ShipmentTable::add($fields); if (!$r->isSuccess()) { return $r; } $id = $r->getId(); $this->setFieldNoDemand('ID', $id); $result = new Entity\AddResult(); /** @var ShipmentItemCollection $shipmentItemCollection */ if (!($shipmentItemCollection = $this->getShipmentItemCollection())) { throw new Main\ObjectNotFoundException('Entity "ShipmentItemCollection" not found'); } /** @var Shipment $shipment */ if (!($shipment = $shipmentItemCollection->getShipment())) { throw new Main\ObjectNotFoundException('Entity "Shipment" not found'); } /** @var ShipmentCollection $shipmentCollection */ if (!($shipmentCollection = $shipment->getCollection())) { throw new Main\ObjectNotFoundException('Entity "ShipmentCollection" not found'); } /** @var Order $order */ if (!($order = $shipmentCollection->getOrder())) { throw new Main\ObjectNotFoundException('Entity "Order" not found'); } if ($order->getId() > 0 && !$this->isSystem()) { OrderHistory::addAction('SHIPMENT', $order->getId(), 'SHIPMENT_ADDED', $id, $this); } } if ($result->isSuccess() && !$this->isSystem()) { $this->saveExtraServices(); $this->saveStoreId(); } /** @var ShipmentItemCollection $shipmentItemCollection */ if (!($shipmentItemCollection = $this->getShipmentItemCollection())) { throw new Main\ObjectNotFoundException('Entity "ShipmentItemCollection" not found'); } $r = $shipmentItemCollection->save(); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } if ($result->isSuccess()) { /** @var Shipment $shipment */ if (!($shipment = $shipmentItemCollection->getShipment())) { throw new Main\ObjectNotFoundException('Entity "Shipment" not found'); } /** @var ShipmentCollection $shipmentCollection */ if (!($shipmentCollection = $shipment->getCollection())) { throw new Main\ObjectNotFoundException('Entity "ShipmentCollection" not found'); } /** @var Order $order */ if (!($order = $shipmentCollection->getOrder())) { throw new Main\ObjectNotFoundException('Entity "Order" not found'); } if (!$this->isSystem()) { OrderHistory::collectEntityFields('SHIPMENT', $order->getId(), $id); } } return $result; }
/** * @return Entity\Result * @throws Main\ArgumentException * @throws Main\ObjectNotFoundException * @throws \Exception */ public function save() { $result = new Entity\Result(); $itemsFromDb = array(); if ($this->getOrder()->getId() > 0) { $itemsFromDbList = Internals\PaymentTable::getList(array("filter" => array("ORDER_ID" => $this->getOrder()->getId()), "select" => array("ID"))); while ($itemsFromDbItem = $itemsFromDbList->fetch()) { $itemsFromDb[$itemsFromDbItem["ID"]] = true; } } /** @var Payment $payment */ foreach ($this->collection as $payment) { if ($payment->isInner() && $payment->getSum() == 0 && $payment->getId() == 0) { $payment->delete(); } } /** @var Payment $payment */ foreach ($this->collection as $payment) { $r = $payment->save(); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } if (isset($itemsFromDb[$payment->getId()])) { unset($itemsFromDb[$payment->getId()]); } } foreach ($itemsFromDb as $k => $v) { Internals\PaymentTable::delete($k); /** @var Order $order */ if (!($order = $this->getOrder())) { throw new Main\ObjectNotFoundException('Entity "Order" not found'); } if ($order->getId() > 0) { OrderHistory::addAction('PAYMENT', $order->getId(), 'PAYMENT_REMOVE', $k); } } return $result; }
/** * @return Entity\Result|bool * @throws \Bitrix\Main\ArgumentException * @throws \Bitrix\Main\ArgumentNullException */ public function save() { $result = new Result(); /** @var Order $order */ $order = $this->getOrder(); $itemsFromDb = array(); $filter = array(); if (!$order) { /** @var Main\Entity\Event $event */ $event = new Main\Event('sale', EventActions::EVENT_ON_BASKET_BEFORE_SAVED, array('ENTITY' => $this)); $event->send(); if ($event->getResults()) { $result = new Result(); /** @var Main\EventResult $eventResult */ foreach ($event->getResults() as $eventResult) { if ($eventResult->getType() == Main\EventResult::ERROR) { $errorMsg = new ResultError(Main\Localization\Loc::getMessage('SALE_EVENT_ON_BEFORE_BASKET_SAVED'), 'SALE_EVENT_ON_BEFORE_BASKET_SAVED'); if (isset($eventResultData['ERROR']) && $eventResultData['ERROR'] instanceof ResultError) { $errorMsg = $eventResultData['ERROR']; } $result->addError($errorMsg); } } if (!$result->isSuccess()) { return $result; } } } $isNew = $order && $order->isNew() ? true : false; if ($order && !$isNew) { $filter['ORDER_ID'] = $order->getId(); } else { if ($this->isLoadForFuserId()) { $filter = array('FUSER_ID' => $this->getFUserId(), 'ORDER_ID' => null, 'LID' => $this->getSiteId()); } if ($isNew) { $fUserId = $this->getFUserId(true); if ($fUserId <= 0) { $userId = $order->getUserId(); if (intval($userId) > 0) { $fUserId = Fuser::getIdByUserId($userId); if ($fUserId > 0) { $this->setFUserId($fUserId); } } } } } if (!empty($filter)) { $itemsFromDbList = Internals\BasketTable::getList(array("filter" => $filter, "select" => array("ID", 'TYPE', 'SET_PARENT_ID', 'PRODUCT_ID', 'NAME', 'QUANTITY'))); while ($itemsFromDbItem = $itemsFromDbList->fetch()) { if (intval($itemsFromDbItem['SET_PARENT_ID']) > 0 && intval($itemsFromDbItem['SET_PARENT_ID']) != $itemsFromDbItem['ID']) { continue; } $itemsFromDb[$itemsFromDbItem["ID"]] = $itemsFromDbItem; } } /** @var BasketItem $basketItem */ foreach ($this->collection as $index => $basketItem) { $r = $basketItem->save(); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } if (isset($itemsFromDb[$basketItem->getId()]) && $basketItem->getQuantity() > 0) { unset($itemsFromDb[$basketItem->getId()]); } } if (!empty($filter)) { foreach ($itemsFromDb as $k => $v) { if ($v['TYPE'] == static::TYPE_SET) { Internals\BasketTable::deleteBundle($k); } else { Internals\BasketTable::deleteWithItems($k); } /** @var Order $order */ if ($order && $order->getId() > 0) { OrderHistory::addAction('BASKET', $order->getId(), 'BASKET_REMOVED', $k, null, array('NAME' => $v['NAME'], 'QUANTITY' => $v['QUANTITY'], 'PRODUCT_ID' => $v['PRODUCT_ID'])); } } } if ($order && $order->getId() > 0) { OrderHistory::collectEntityFields('BASKET', $order->getId()); } if (!$order) { /** @var Main\Entity\Event $event */ $event = new Main\Event('sale', EventActions::EVENT_ON_BASKET_SAVED, array('ENTITY' => $this)); $event->send(); if ($event->getResults()) { $result = new Result(); /** @var Main\EventResult $eventResult */ foreach ($event->getResults() as $eventResult) { if ($eventResult->getType() == Main\EventResult::ERROR) { $errorMsg = new ResultError(Main\Localization\Loc::getMessage('SALE_EVENT_ON_BASKET_SAVED'), 'SALE_EVENT_ON_BASKET_SAVED'); if (isset($eventResultData['ERROR']) && $eventResultData['ERROR'] instanceof ResultError) { $errorMsg = $eventResultData['ERROR']; } $result->addError($errorMsg); } } if (!$result->isSuccess()) { return $result; } } } return $result; }
/** * @return Entity\AddResult|Entity\UpdateResult * @throws Main\ArgumentOutOfRangeException * @throws Main\ObjectNotFoundException * @throws \Exception */ public function save() { $id = $this->getId(); $fields = $this->fields->getValues(); if ($id > 0) { $fields = $this->fields->getChangedValues(); if (!empty($fields) && is_array($fields)) { //$fields['DATE_UPDATE'] = new Main\Type\DateTime(); $r = Internals\PaymentTable::update($id, $fields); if (!$r->isSuccess()) { return $r; } } $result = new Entity\UpdateResult(); } else { $fields['ORDER_ID'] = $this->getParentOrderId(); /** @var PaymentCollection $paymentCollection */ if (!($paymentCollection = $this->getCollection())) { throw new Main\ObjectNotFoundException('Entity "PaymentCollection" not found'); } /** @var Order $order */ if (!($order = $paymentCollection->getOrder())) { throw new Main\ObjectNotFoundException('Entity "Order" not found'); } if (!isset($fields['CURRENCY']) || strval($fields['CURRENCY']) == "") { $fields['CURRENCY'] = $order->getCurrency(); } //$fields['DATE_INSERT'] = new Main\Type\DateTime(); $r = Internals\PaymentTable::add($fields); if (!$r->isSuccess()) { return $r; } $id = $r->getId(); $this->setFieldNoDemand('ID', $id); $result = new Entity\AddResult(); if ($order->getId() > 0) { OrderHistory::addAction('PAYMENT', $order->getId(), 'PAYMENT_ADDED', $id, array('PAY_SYSTEM' => $this->getPaymentSystemName(), 'SUM' => $this->getSum())); } } if ($result->isSuccess()) { /** @var PaymentCollection $paymentCollection */ if (!($paymentCollection = $this->getCollection())) { throw new Main\ObjectNotFoundException('Entity "PaymentCollection" not found'); } /** @var Order $order */ if (!($order = $paymentCollection->getOrder())) { throw new Main\ObjectNotFoundException('Entity "Order" not found'); } OrderHistory::collectEntityFields('PAYMENT', $order->getId(), $id); } return $result; }
/** * @return Entity\AddResult|Entity\UpdateResult * @throws Main\ArgumentOutOfRangeException * @throws Main\ObjectNotFoundException * @throws \Exception */ public function save() { $id = $this->getId(); $fields = $this->fields->getValues(); /** @var ShipmentItemCollection $shipmentItemCollection */ if (!($shipmentItemCollection = $this->getCollection())) { throw new Main\ObjectNotFoundException('Entity "ShipmentItemCollection" not found'); } /** @var Shipment $shipment */ if (!($shipment = $shipmentItemCollection->getShipment())) { throw new Main\ObjectNotFoundException('Entity "Shipment" not found'); } /** @var ShipmentCollection $shipmentCollection */ if (!($shipmentCollection = $shipment->getCollection())) { throw new Main\ObjectNotFoundException('Entity "ShipmentCollection" not found'); } /** @var Order $order */ if (!($order = $shipmentCollection->getOrder())) { throw new Main\ObjectNotFoundException('Entity "Order" not found'); } if ($id > 0) { $fields = $this->fields->getChangedValues(); if (!empty($fields) && is_array($fields)) { /** @var ShipmentItemCollection $shipmentItemCollection */ if (!($shipmentItemCollection = $this->getCollection())) { throw new Main\ObjectNotFoundException('Entity "ShipmentItemCollection" not found'); } /** @var Shipment $shipment */ if (!($shipment = $shipmentItemCollection->getShipment())) { throw new Main\ObjectNotFoundException('Entity "Shipment" not found'); } if (!$shipment->isSystem()) { if (isset($fields["QUANTITY"]) && floatval($fields["QUANTITY"]) == 0) { return new Entity\UpdateResult(); } } //$fields['DATE_UPDATE'] = new Main\Type\DateTime(); $r = Internals\ShipmentItemTable::update($id, $fields); if (!$r->isSuccess()) { return $r; } } $result = new Entity\UpdateResult(); if ($order && $order->getId() > 0) { OrderHistory::collectEntityFields('SHIPMENT_ITEM_STORE', $order->getId(), $id); } } else { $fields['ORDER_DELIVERY_ID'] = $this->getParentShipmentId(); $fields['DATE_INSERT'] = new Main\Type\DateTime(); $fields["BASKET_ID"] = $this->basketItem->getId(); if (!isset($fields["QUANTITY"]) || floatval($fields["QUANTITY"]) == 0) { return new Entity\UpdateResult(); } if (!isset($fields['RESERVED_QUANTITY'])) { $fields['RESERVED_QUANTITY'] = $this->getReservedQuantity() === null ? 0 : $this->getReservedQuantity(); } $r = Internals\ShipmentItemTable::add($fields); if (!$r->isSuccess()) { return $r; } $id = $r->getId(); $this->setFieldNoDemand('ID', $id); $result = new Entity\AddResult(); if (!$shipment->isSystem()) { OrderHistory::addAction('SHIPMENT', $order->getId(), 'SHIPMENT_ITEM_BASKET_ADDED', $shipment->getId(), $this->basketItem, array('QUANTITY' => $this->getQuantity())); } } if ($eventName = static::getEntityEventName()) { $oldEntityValues = $this->fields->getOriginalValues(); if (!empty($oldEntityValues)) { /** @var Main\Event $event */ $event = new Main\Event('sale', 'On' . $eventName . 'EntitySaved', array('ENTITY' => $this, 'VALUES' => $oldEntityValues)); $event->send(); } } $shipmentItemStoreCollection = $this->getShipmentItemStoreCollection(); $r = $shipmentItemStoreCollection->save(); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } if ($result->isSuccess()) { OrderHistory::collectEntityFields('SHIPMENT_ITEM', $order->getId(), $id); } $this->fields->clearChanged(); return $result; }
/** * @return Entity\Result * @throws Main\ArgumentException * @throws Main\ArgumentNullException * @throws Main\ObjectNotFoundException */ public function save() { $result = new Entity\Result(); $itemsFromDb = array(); if ($this->getOrder()->getId() > 0) { $itemsFromDbList = Internals\ShipmentTable::getList(array("filter" => array("ORDER_ID" => $this->getOrder()->getId()), "select" => array("ID", "DELIVERY_NAME"))); while ($itemsFromDbItem = $itemsFromDbList->fetch()) { $itemsFromDb[$itemsFromDbItem["ID"]] = $itemsFromDbItem; } } /** @var Shipment $shipment */ foreach ($this->collection as $shipment) { if ($shipment->isSystem()) { continue; } if (($systemShipment = $this->getSystemShipment()) && $systemShipment->getId() == 0) { /** @var Result $r */ $r = $this->cloneShipment($shipment, $systemShipment); if ($r->isSuccess()) { break; } else { $result->addErrors($r->getErrors()); } } } /** @var Shipment $shipment */ foreach ($this->collection as $shipment) { $r = $shipment->save(); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } if (isset($itemsFromDb[$shipment->getId()])) { unset($itemsFromDb[$shipment->getId()]); } } foreach ($itemsFromDb as $k => $v) { Internals\ShipmentTable::deleteWithItems($k); /** @var Order $order */ if (!($order = $this->getOrder())) { throw new Main\ObjectNotFoundException('Entity "Order" not found'); } if ($order->getId() > 0) { OrderHistory::addAction('SHIPMENT', $order->getId(), 'SHIPMENT_REMOVED', $k, null, array('ID' => $k, 'DELIVERY_NAME' => $v['DELIVERY_NAME'])); } } if ($this->getOrder()->getId() > 0) { OrderHistory::collectEntityFields('SHIPMENT', $this->getOrder()->getId()); } return $result; }
/** * @return Main\Entity\Result * @throws Main\ArgumentException * @throws Main\ArgumentNullException * @throws Main\ArgumentOutOfRangeException * @throws Main\ObjectNotFoundException */ public function save() { $result = new Main\Entity\Result(); $itemsFromDb = array(); if ($this->getShipment()->getId() > 0) { $itemsFromDbList = Internals\ShipmentItemTable::getList(array("filter" => array("ORDER_DELIVERY_ID" => $this->getShipment()->getId()), "select" => array("ID", 'BASKET_ID'))); while ($itemsFromDbItem = $itemsFromDbList->fetch()) { $itemsFromDb[$itemsFromDbItem["ID"]] = $itemsFromDbItem; } } /** @var ShipmentItem $shipmentItem */ foreach ($this->collection as $shipmentItem) { /** @var BasketItem $basketItem */ if (!($basketItem = $shipmentItem->getBasketItem())) { throw new Main\ObjectNotFoundException('Entity "BasketItem" not found'); } if ($basketItem->isBundleParent()) { $this->addBundleToCollection($basketItem); } } /** @var Shipment $shipment */ if (!($shipment = $this->getShipment())) { throw new Main\ObjectNotFoundException('Entity "Shipment" not found'); } /** @var ShipmentItem $shipmentItem */ foreach ($this->collection as $shipmentItem) { if ($shipment->isSystem() && $shipmentItem->getQuantity() == 0) { continue; } $r = $shipmentItem->save(); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } if (isset($itemsFromDb[$shipmentItem->getId()])) { unset($itemsFromDb[$shipmentItem->getId()]); } } /** @var ShipmentCollection $shipmentCollection */ if (!($shipmentCollection = $shipment->getCollection())) { throw new Main\ObjectNotFoundException('Entity "ShipmentCollection" not found'); } /** @var Order $order */ if (!($order = $shipmentCollection->getOrder())) { throw new Main\ObjectNotFoundException('Entity "Order" not found'); } /** @var Basket $basket */ if (!($basket = $order->getBasket())) { throw new Main\ObjectNotFoundException('Entity "Basket" not found'); } foreach ($itemsFromDb as $k => $v) { Internals\ShipmentItemTable::deleteWithItems($k); /** @var BasketItem $basketItem */ if ($basketItem = $basket->getItemById($k)) { OrderHistory::addAction('SHIPMENT', $order->getId(), 'SHIPMENT_ITEM_BASKET_REMOVED', $shipment->getId(), null, array('NAME' => $basketItem->getField('NAME'), 'QUANTITY' => $basketItem->getQuantity(), 'PRODUCT_ID' => $basketItem->getProductId())); } } return $result; }
static function DoSaveOrderTax($orderId, $taxList, &$arErrors) { $duplicateList = array(); $idList = array(); $res = CSaleOrderTax::GetList(array('ID' => 'ASC'), array("ORDER_ID" => $orderId), false, false, array("ID", "TAX_NAME", "CODE")); while ($data = $res->Fetch()) { $hash = $data["TAX_NAME"] . "|" . $data["CODE"]; if (!array_key_exists($hash, $idList)) { $idList[$data["TAX_NAME"] . "|" . $data["CODE"]] = $data["ID"]; } else { $duplicateList[$hash] = $data['ID']; } } $isChanged = false; if (is_array($taxList)) { foreach ($taxList as $itemData) { $fields = array("ORDER_ID" => $orderId, "TAX_NAME" => $itemData["NAME"], "IS_PERCENT" => $itemData["IS_PERCENT"], "VALUE" => $itemData["VALUE"], "VALUE_MONEY" => $itemData["VALUE_MONEY"], "APPLY_ORDER" => $itemData["APPLY_ORDER"], "IS_IN_PRICE" => $itemData["IS_IN_PRICE"], "CODE" => $itemData["CODE"]); $hash = $itemData["NAME"] . "|" . $itemData["CODE"]; $isNew = false; if (array_key_exists($hash, $idList)) { $taxId = CSaleOrderTax::Update($idList[$hash], $fields); unset($idList[$hash]); } elseif (!array_key_exists($hash, $duplicateList)) { $isNew = true; $taxId = CSaleOrderTax::Add($fields); } if ($orderId > 0) { \Bitrix\Sale\OrderHistory::addLog('TAX', $orderId, $isNew ? 'TAX_ADD' : 'TAX_UPDATE', $taxId, null, array("NAME" => $itemData["NAME"], "CODE" => $itemData["CODE"]), \Bitrix\Sale\OrderHistory::SALE_ORDER_HISTORY_LOG_LEVEL_1); $isChanged = true; } } } foreach ($idList as $code => $id) { CSaleOrderTax::Delete($id); if ($orderId > 0) { \Bitrix\Sale\OrderHistory::addLog('TAX', $orderId, 'TAX_DELETED', $id, null, array(), \Bitrix\Sale\OrderHistory::SALE_ORDER_HISTORY_LOG_LEVEL_1); } } if (!empty($duplicateList)) { foreach ($duplicateList as $hash => $id) { CSaleOrderTax::Delete($id); \Bitrix\Sale\OrderHistory::addLog('TAX', $orderId, 'TAX_DUPLICATE_DELETED', $id, null, array(), \Bitrix\Sale\OrderHistory::SALE_ORDER_HISTORY_LOG_LEVEL_1); } } if ($isChanged) { \Bitrix\Sale\OrderHistory::addAction('TAX', $orderId, "TAX_SAVED"); } }
/** * @return Entity\AddResult|Entity\UpdateResult * @throws Main\ArgumentOutOfRangeException * @throws Main\ObjectNotFoundException * @throws \Exception */ public function save() { $id = $this->getId(); $fields = $this->fields->getValues(); if ($id > 0) { $fields = $this->fields->getChangedValues(); if (!empty($fields) && is_array($fields)) { //$fields['DATE_UPDATE'] = new Main\Type\DateTime(); $r = Internals\PaymentTable::update($id, $fields); if (!$r->isSuccess()) { return $r; } } $result = new Entity\UpdateResult(); } else { $fields['ORDER_ID'] = $this->getParentOrderId(); /** @var PaymentCollection $paymentCollection */ if (!($paymentCollection = $this->getCollection())) { throw new Main\ObjectNotFoundException('Entity "PaymentCollection" not found'); } /** @var Order $order */ if (!($order = $paymentCollection->getOrder())) { throw new Main\ObjectNotFoundException('Entity "Order" not found'); } if (!isset($fields['CURRENCY']) || strval($fields['CURRENCY']) == "") { $fields['CURRENCY'] = $order->getCurrency(); } //$fields['DATE_INSERT'] = new Main\Type\DateTime(); $r = Internals\PaymentTable::add($fields); if (!$r->isSuccess()) { return $r; } $id = $r->getId(); $this->setFieldNoDemand('ID', $id); $result = new Entity\AddResult(); if ($order->getId() > 0) { OrderHistory::addAction('PAYMENT', $order->getId(), 'PAYMENT_ADDED', $id, $this); } } if ($result->isSuccess()) { /** @var PaymentCollection $paymentCollection */ if (!($paymentCollection = $this->getCollection())) { throw new Main\ObjectNotFoundException('Entity "PaymentCollection" not found'); } /** @var Order $order */ if (!($order = $paymentCollection->getOrder())) { throw new Main\ObjectNotFoundException('Entity "Order" not found'); } OrderHistory::collectEntityFields('PAYMENT', $order->getId(), $id); if ($eventName = static::getEntityEventName()) { $oldEntityValues = $this->fields->getOriginalValues(); if (!empty($oldEntityValues)) { /** @var Main\Event $event */ $event = new Main\Event('sale', 'On' . $eventName . 'EntitySaved', array('ENTITY' => $this, 'VALUES' => $oldEntityValues)); $event->send(); } } } $this->fields->clearChanged(); return $result; }
/** * @return Entity\Result|bool * @throws \Bitrix\Main\ArgumentException * @throws \Bitrix\Main\ArgumentNullException */ public function save() { $result = new Result(); /** @var Order $order */ $order = $this->getOrder(); $itemsFromDb = array(); $filter = array(); if (!$order) { /** @var Main\Entity\Event $event */ $event = new Main\Event('sale', EventActions::EVENT_ON_BASKET_BEFORE_SAVED, array('ENTITY' => $this)); $event->send(); if ($event->getResults()) { /** @var Main\EventResult $eventResult */ foreach ($event->getResults() as $eventResult) { if ($eventResult->getType() == Main\EventResult::ERROR) { $errorMsg = new ResultError(Main\Localization\Loc::getMessage('SALE_EVENT_ON_BEFORE_BASKET_SAVED'), 'SALE_EVENT_ON_BEFORE_BASKET_SAVED'); if ($eventResultData = $eventResult->getParameters()) { if (isset($eventResultData) && $eventResultData instanceof ResultError) { /** @var ResultError $errorMsg */ $errorMsg = $eventResultData; } } $result->addError($errorMsg); } } if (!$result->isSuccess()) { return $result; } } } $isNew = $order && $order->isNew() ? true : false; if ($order && !$isNew) { $filter['ORDER_ID'] = $order->getId(); } else { if ($this->isLoadForFuserId()) { $filter = array('FUSER_ID' => $this->getFUserId(), 'ORDER_ID' => null, 'LID' => $this->getSiteId()); } if ($isNew) { $fUserId = $this->getFUserId(true); if ($fUserId <= 0) { $userId = $order->getUserId(); if (intval($userId) > 0) { $fUserId = Fuser::getIdByUserId($userId); if ($fUserId > 0) { $this->setFUserId($fUserId); } } } } } if (!empty($filter)) { $itemsFromDbList = Internals\BasketTable::getList(array("filter" => $filter, "select" => array("ID", 'TYPE', 'SET_PARENT_ID', 'PRODUCT_ID', 'NAME', 'QUANTITY', 'FUSER_ID', 'ORDER_ID'))); while ($itemsFromDbItem = $itemsFromDbList->fetch()) { if (intval($itemsFromDbItem['SET_PARENT_ID']) > 0 && intval($itemsFromDbItem['SET_PARENT_ID']) != $itemsFromDbItem['ID']) { continue; } $itemsFromDb[$itemsFromDbItem["ID"]] = $itemsFromDbItem; } } if ($order && ($order->getId() > 0 && $this->getOrderId() == 0)) { $this->orderId = $order->getId(); } $changeMeaningfulFields = array("PRODUCT_ID", "QUANTITY", "PRICE", "DISCOUNT_VALUE", "VAT_RATE", "NAME"); /** @var BasketItem $basketItem */ foreach ($this->collection as $index => $basketItem) { $isNew = (bool) ($basketItem->getId() <= 0); $isChanged = $basketItem->isChanged(); if ($order && $order->getId() > 0 && $isChanged) { $logFields = array(); $fields = $basketItem->getFields(); $originalValues = $fields->getOriginalValues(); foreach ($originalValues as $originalFieldName => $originalFieldValue) { if (in_array($originalFieldName, $changeMeaningfulFields) && $basketItem->getField($originalFieldName) != $originalFieldValue) { $logFields[$originalFieldName] = $basketItem->getField($originalFieldName); $logFields['OLD_' . $originalFieldName] = $originalFieldValue; } } } $r = $basketItem->save(); if ($r->isSuccess()) { if ($order && $order->getId() > 0) { if ($isChanged) { OrderHistory::addLog('BASKET', $order->getId(), $isNew ? "BASKET_ITEM_ADD" : "BASKET_ITEM_UPDATE", $basketItem->getId(), $basketItem, $logFields, OrderHistory::SALE_ORDER_HISTORY_LOG_LEVEL_1); OrderHistory::addAction('BASKET', $order->getId(), "BASKET_SAVED", $basketItem->getId(), $basketItem); } } } else { $result->addErrors($r->getErrors()); } if (isset($itemsFromDb[$basketItem->getId()]) && $basketItem->getQuantity() > 0) { unset($itemsFromDb[$basketItem->getId()]); } } if (!empty($filter)) { $itemEventName = BasketItem::getEntityEventName(); foreach ($itemsFromDb as $k => $v) { /** @var Main\Event $event */ $event = new Main\Event('sale', "OnBefore" . $itemEventName . "Deleted", array('VALUES' => $v)); $event->send(); if ($v['TYPE'] == static::TYPE_SET) { if ($order && $order->getId() > 0) { OrderHistory::addLog('BASKET', $order->getId(), 'BASKET_ITEM_DELETE_BUNDLE', $k, null, array("PRODUCT_ID" => $v["PRODUCT_ID"], "NAME" => $v["NAME"], "QUANTITY" => $v["QUANTITY"]), OrderHistory::SALE_ORDER_HISTORY_LOG_LEVEL_1); } Internals\BasketTable::deleteBundle($k); } else { if ($order && $order->getId() > 0) { OrderHistory::addLog('BASKET', $order->getId(), 'BASKET_ITEM_DELETED', $k, null, array("PRODUCT_ID" => $v["PRODUCT_ID"], "NAME" => $v["NAME"], "QUANTITY" => $v["QUANTITY"]), OrderHistory::SALE_ORDER_HISTORY_LOG_LEVEL_1); } Internals\BasketTable::deleteWithItems($k); } /** @var Main\Event $event */ $event = new Main\Event('sale', "On" . $itemEventName . "Deleted", array('VALUES' => $v)); $event->send(); /** @var Order $order */ if ($order && $order->getId() > 0) { OrderHistory::addAction('BASKET', $order->getId(), 'BASKET_REMOVED', $k, null, array('NAME' => $v['NAME'], 'QUANTITY' => $v['QUANTITY'], 'PRODUCT_ID' => $v['PRODUCT_ID'])); } } } if ($order && $order->getId() > 0) { OrderHistory::collectEntityFields('BASKET', $order->getId()); } if (!$order) { /** @var Main\Entity\Event $event */ $event = new Main\Event('sale', EventActions::EVENT_ON_BASKET_SAVED, array('ENTITY' => $this)); $event->send(); if ($event->getResults()) { /** @var Main\EventResult $eventResult */ foreach ($event->getResults() as $eventResult) { if ($eventResult->getType() == Main\EventResult::ERROR) { $errorMsg = new ResultError(Main\Localization\Loc::getMessage('SALE_EVENT_ON_BASKET_SAVED'), 'SALE_EVENT_ON_BASKET_SAVED'); if ($eventResultData = $eventResult->getParameters()) { if (isset($eventResultData) && $eventResultData instanceof ResultError) { /** @var ResultError $errorMsg */ $errorMsg = $eventResultData; } } $result->addError($errorMsg); } } if (!$result->isSuccess()) { return $result; } } } return $result; }