예제 #1
0
 /**
  * @internal
  * @param string $action
  * @param array $fields
  *
  * @return Sale\Result
  * @throws Main\ArgumentNullException
  * @throws Main\ObjectNotFoundException
  */
 public static function modifyOrder($action, array $fields)
 {
     $result = new Sale\Result();
     try {
         $adminSection = defined('ADMIN_SECTION') && ADMIN_SECTION === true;
         /** @var Sale\Compatible\OrderCompatibility $orderCompatibility */
         $orderCompatibility = Sale\Compatible\OrderCompatibility::create($fields);
         /** @var Sale\Order $order */
         $order = $orderCompatibility->getOrder();
         $oldPrice = $order->getPrice();
         //			$isStartField = $order->isStartField();
         /** @var Sale\Basket $basket */
         $basket = $order->getBasket();
         if (!$basket && $action == static::ORDER_COMPAT_ACTION_SAVE) {
             $fUserId = null;
             $userId = $order->getUserId();
             if ($userId > 0) {
                 $fUserId = Sale\Fuser::getIdByUserId($userId);
             } else {
                 if (!empty($fields['BASKET_ITEMS']) && is_array($fields['BASKET_ITEMS'])) {
                     foreach ($fields['BASKET_ITEMS'] as $basketItemData) {
                         if (!empty($basketItemData['FUSER_ID']) && intval($basketItemData['FUSER_ID']) > 0) {
                             $fUserId = intval($basketItemData['FUSER_ID']);
                             break;
                         }
                     }
                 }
             }
             if (intval($fUserId) <= 0 && !$adminSection) {
                 $fUserId = Sale\Fuser::getId();
             }
             if (intval($fUserId) <= 0) {
                 $result->addError(new Sale\ResultError(Main\Localization\Loc::getMessage('SALE_COMPATIBLE_ORDER_FUSERID_NOT_FOUND'), "SALE_COMPATIBLE_ORDER_FUSERID_NOT_FOUND"));
                 return $result;
             }
             if (!$adminSection) {
                 $siteId = !empty($fields["SITE_ID"]) ? $fields["SITE_ID"] : (!empty($fields["LID"]) ? $fields['LID'] : null);
                 /** @var Sale\Basket $allBasket */
                 $allBasket = Sale\Basket::loadItemsForFUser($fUserId, $siteId);
                 if ($allBasket) {
                     $basket = $allBasket->getOrderableItems();
                 }
             }
             if (!$basket) {
                 $basket = Sale\Basket::create($order->getSiteId());
                 $basket->setFUserId($fUserId);
             }
         }
         $isStartField = $order->isStartField(true);
         if ($basket) {
             $basketCompatibility = BasketCompatibility::create($orderCompatibility);
             //				$orderCompatibility->resetOrderPrice($basket, $fields);
             /** @var Sale\Result $r */
             $r = $basketCompatibility->fillBasket($basket, $fields);
             if (!$r->isSuccess()) {
                 $result->addErrors($r->getErrors());
                 return $result;
             }
             if ($action == static::ORDER_COMPAT_ACTION_SAVE && $order->getId() == 0 && count($basket) > 0) {
                 $order->setMathActionOnly(true);
                 $order->setBasket($basket);
                 $order->setMathActionOnly(false);
             }
             if ($orderCompatibility->isExistPrice() && $oldPrice == $order->getPrice()) {
                 $order->setFieldNoDemand('PRICE', $orderCompatibility->externalPrice);
             }
         }
         /** @var Sale\Result $r */
         $r = $orderCompatibility->fillTaxFromRequest($order->getTax(), $fields);
         if (!$r->isSuccess()) {
             $result->addErrors($r->getErrors());
             return $result;
         }
         if ($isStartField) {
             $hasMeaningfulFields = $order->hasMeaningfulField();
             /** @var Sale\Result $r */
             $r = $order->doFinalAction($hasMeaningfulFields);
             if (!$r->isSuccess()) {
                 $result->addErrors($r->getErrors());
                 return $result;
             }
         }
         /** @var Sale\Result $r */
         $r = $orderCompatibility->fillShipmentCollectionFromRequest($order->getShipmentCollection(), $fields);
         if (!$r->isSuccess()) {
             $result->addErrors($r->getErrors());
             return $result;
         }
         $order->setMathActionOnly(false);
         /** @var Sale\Result $r */
         $r = $orderCompatibility->fillPaymentCollectionFromRequest($fields);
         if (!$r->isSuccess()) {
             $result->addErrors($r->getErrors());
             return $result;
         }
         /** @var Sale\Result $r */
         $r = Sale\Compatible\OrderCompatibility::fillOrderFromRequest($order, $fields);
         if (!$r->isSuccess()) {
             $result->addErrors($r->getErrors());
             return $result;
         }
     } catch (Sale\UserMessageException $e) {
         $result->addError(new Sale\ResultError($e->getMessage(), $e->getCode()));
         return $result;
     }
     static::transformationLocation($order);
     /** @var Sale\Result $r */
     $r = $order->save();
     if ($r->isSuccess()) {
         if ($orderData = $r->getData()) {
             $result->setData($orderData);
         }
         if ($orderId = $r->getId()) {
             $result->setId($orderId);
         }
         /** @var Sale\Result $r */
         $r = $orderCompatibility->saveRawFields($order, static::ENTITY_ORDER);
     }
     if (!$r->isSuccess()) {
         $result->addErrors($r->getErrors());
     } else {
         $oldFields = static::convertDateFieldsToOldFormat($order->getFieldValues());
         $oldFields = $oldFields + $orderCompatibility->rawFields;
         /** @var Sale\PaymentCollection $paymentCollection */
         if ($paymentCollection = $order->getPaymentCollection()) {
             /** @var Sale\Payment $payment */
             foreach ($paymentCollection as $payment) {
                 /** @var Sale\Result $r */
                 $r = $orderCompatibility->saveRawFields($payment, static::ENTITY_PAYMENT);
                 if (!$r->isSuccess()) {
                     $result->addErrors($r->getErrors());
                 }
             }
         }
         $result->setData(array('OLD_FIELDS' => $oldFields));
     }
     return $result;
 }
예제 #2
0
 /**
  * @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;
 }
예제 #3
0
 /**
  * @internal
  * @param string $action
  * @param array $fields
  *
  * @return Sale\Result
  * @throws Main\ArgumentNullException
  * @throws Main\ObjectNotFoundException
  */
 public static function modifyOrder($action, array $fields)
 {
     $result = new Sale\Result();
     try {
         $adminSection = defined('ADMIN_SECTION') && ADMIN_SECTION === true;
         /** @var Sale\Compatible\OrderCompatibility $orderCompatibility */
         $orderCompatibility = Sale\Compatible\OrderCompatibility::create($fields);
         /** @var Sale\Order $order */
         $order = $orderCompatibility->getOrder();
         $oldPrice = $order->getPrice();
         //			$isStartField = $order->isStartField();
         /** @var Sale\Basket $basket */
         $basket = $order->getBasket();
         if (!$basket && $action == static::ORDER_COMPAT_ACTION_SAVE) {
             $fUserId = Sale\Fuser::getIdByUserId($order->getUserId());
             if (!$adminSection) {
                 $siteId = !empty($fields["SITE_ID"]) ? $fields["SITE_ID"] : (!empty($fields["LID"]) ? $fields['LID'] : null);
                 $basket = Sale\Basket::loadItemsForFUser($fUserId, $siteId);
             }
             if (!$basket) {
                 $basket = Sale\Basket::create($order->getSiteId(), $fUserId);
             }
         }
         if ($basket) {
             $basketCompatibility = BasketCompatibility::create($orderCompatibility);
             //				$orderCompatibility->resetOrderPrice($basket, $fields);
             /** @var Sale\Result $r */
             $r = $basketCompatibility->fillBasket($basket, $fields);
             if (!$r->isSuccess()) {
                 $result->addErrors($r->getErrors());
                 return $result;
             }
             if ($action == static::ORDER_COMPAT_ACTION_SAVE && $order->getId() == 0 && count($basket->getOrderableItems()) > 0) {
                 $order->setMathActionOnly(true);
                 $order->setBasket($basket->getOrderableItems());
                 $order->setMathActionOnly(false);
             }
             if ($orderCompatibility->isExistPrice() && $oldPrice == $order->getPrice()) {
                 $order->setFieldNoDemand('PRICE', $orderCompatibility->externalPrice);
             }
         }
         /** @var Sale\Result $r */
         $r = Sale\Compatible\OrderCompatibility::fillTaxFromRequest($order->getTax(), $fields);
         if (!$r->isSuccess()) {
             $result->addErrors($r->getErrors());
             return $result;
         }
         /** @var Sale\Result $r */
         $r = OrderCompatibility::fillShipmentCollectionFromRequest($order->getShipmentCollection(), $fields);
         if (!$r->isSuccess()) {
             $result->addErrors($r->getErrors());
             return $result;
         }
         $order->setMathActionOnly(false);
         /** @var Sale\Result $r */
         $r = Sale\Compatible\OrderCompatibility::fillPaymentCollectionFromRequest($order->getPaymentCollection(), $fields);
         if (!$r->isSuccess()) {
             $result->addErrors($r->getErrors());
             return $result;
         }
         /** @var Sale\Result $r */
         $r = Sale\Compatible\OrderCompatibility::fillOrderFromRequest($order, $fields);
         if (!$r->isSuccess()) {
             $result->addErrors($r->getErrors());
             return $result;
         }
     } catch (Sale\UserMessageException $e) {
         $result->addError(new Sale\ResultError($e->getMessage(), $e->getCode()));
         return $result;
     }
     static::transformationLocation($order);
     /** @var Sale\Result $r */
     $r = $order->save();
     if ($r->isSuccess()) {
         if ($orderData = $r->getData()) {
             $result->setData($orderData);
         }
         if ($orderId = $r->getId()) {
             $result->setId($orderId);
         }
         /** @var Sale\Result $r */
         $r = $orderCompatibility->saveRawFields();
     }
     if (!$r->isSuccess()) {
         $result->addErrors($r->getErrors());
     } else {
         $oldFields = static::convertDateFieldsToOldFormat($order->getFieldValues());
         $oldFields = $oldFields + $orderCompatibility->rawFields;
         $result->setData(array('OLD_FIELDS' => $oldFields));
     }
     return $result;
 }
예제 #4
0
 /**
  * Convert coupon for saving in order.
  *
  * @param string|array $coupon			Coupon.
  * @param int $discount					Order discount id.
  * @return Sale\Result
  */
 protected static function convertCoupon($coupon, $discount)
 {
     $result = new Sale\Result();
     if (!is_array($coupon)) {
         $couponData = Sale\DiscountCouponsManager::getEnteredCoupon($coupon, true);
         if (empty($couponData)) {
             $result->addError(new Main\Entity\EntityError(Loc::getMessage('BX_SALE_DISCOUNT_ERR_COUPON_NOT_FOUND'), self::ERROR_ID));
             return $result;
         }
         $coupon = array('COUPON' => $couponData['COUPON'], 'TYPE' => $couponData['TYPE'], 'COUPON_ID' => $couponData['ID'], 'DATA' => $couponData);
         unset($couponData);
     }
     $coupon['ORDER_DISCOUNT_ID'] = $discount;
     $coupon['ID'] = 0;
     $orderCouponId = $coupon['COUPON'];
     if (!isset(self::$couponsCache[$orderCouponId])) {
         self::$couponsCache[$orderCouponId] = $coupon;
     }
     $result->setId($orderCouponId);
     $result->setData($coupon);
     unset($coupon, $orderCouponId);
     return $result;
 }
예제 #5
0
 /**
  * Save converted discount.
  *
  * @param array $discountData				Discount data.
  * @return Result
  * @throws Main\ArgumentException
  * @throws \Exception
  */
 private static function saveMigrateDiscount($discountData)
 {
     $result = new Result();
     $process = true;
     $hash = false;
     $resultData = array();
     $fields = Internals\OrderDiscountTable::prepareDiscountData($discountData);
     if (empty($fields) || !is_array($fields)) {
         $process = false;
         $result->addError(new Main\Entity\EntityError(Loc::getMessage('SALE_ORDER_DISCOUNT_ERR_BAD_PREPARE_DISCOUNT'), self::ERROR_ID));
     }
     if ($process) {
         $hash = Internals\OrderDiscountTable::calculateHash($fields);
         if ($hash === false) {
             $process = false;
             $result->addError(new Main\Entity\EntityError(Loc::getMessage('SALE_ORDER_DISCOUNT_ERR_BAD_DISCOUNT_HASH'), self::ERROR_ID));
         }
     }
     if ($process) {
         if (!isset(self::$migrateDiscountsCache[$hash])) {
             $orderDiscountIterator = Internals\OrderDiscountTable::getList(array('select' => array('*'), 'filter' => array('=DISCOUNT_HASH' => $hash)));
             if ($orderDiscount = $orderDiscountIterator->fetch()) {
                 self::$migrateDiscountsCache[$hash] = $orderDiscount;
             }
             unset($orderDiscount, $orderDiscountIterator);
         }
         if (!empty(self::$migrateDiscountsCache[$hash])) {
             $resultData = self::$migrateDiscountsCache[$hash];
             $resultData['ID'] = (int) $resultData['ID'];
             $resultData['NAME'] = (string) $resultData['NAME'];
             $resultData['ORDER_DISCOUNT_ID'] = $resultData['ID'];
             $result->setId($resultData['ID']);
         } else {
             $fields['DISCOUNT_HASH'] = $hash;
             $fields['ACTIONS_DESCR'] = array();
             if (isset($discountData['ACTIONS_DESCR'])) {
                 $fields['ACTIONS_DESCR'] = $discountData['ACTIONS_DESCR'];
             }
             $tableResult = Internals\OrderDiscountTable::add($fields);
             if ($tableResult->isSuccess()) {
                 $resultData = $fields;
                 $resultData['ID'] = (int) $tableResult->getId();
                 $resultData['NAME'] = (string) $resultData['NAME'];
                 $resultData['ORDER_DISCOUNT_ID'] = $resultData['ID'];
                 $result->setId($resultData['ID']);
             } else {
                 $process = false;
                 $result->addErrors($tableResult->getErrors());
             }
             unset($tableResult, $fields);
             if ($process) {
                 $moduleList = Internals\OrderDiscountTable::getDiscountModules($discountData);
                 if (!empty($moduleList)) {
                     $resultModule = Internals\OrderModulesTable::saveOrderDiscountModules($resultData['ORDER_DISCOUNT_ID'], $moduleList);
                     if (!$resultModule) {
                         Internals\OrderDiscountTable::clearList($resultData['ORDER_DISCOUNT_ID']);
                         $resultData = array();
                         $process = false;
                         $result->addError(new Main\Entity\EntityError(Loc::getMessage('SALE_ORDER_DISCOUNT_ERR_SAVE_DISCOUNT_MODULES'), self::ERROR_ID));
                     }
                     unset($resultModule);
                 }
                 unset($needDiscountModules, $moduleList);
             }
         }
     }
     if ($process) {
         $result->setData($resultData);
     }
     unset($resultData, $process);
     return $result;
 }