/** * @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; }
/** * @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; }
/** * @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; }
/** * 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; }
/** * 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; }