Exemplo n.º 1
0
 /**
  * @param OrderBase $order
  * @return Entity\Result
  */
 public static function doCalculate(OrderBase $order)
 {
     $result = new Result();
     if ($order->getPersonTypeId() !== null) {
         if (!($personTypeList = static::load($order->getSiteId(), $order->getPersonTypeId()))) {
             $result->addError(new Entity\EntityError(GetMessage('SKGP_PERSON_TYPE_NOT_FOUND'), 'PERSON_TYPE_ID'));
         }
         return $result;
     }
     if (($personTypeList = static::load($order->getSiteId())) && !empty($personTypeList) && is_array($personTypeList)) {
         $firstPersonType = reset($personTypeList);
         $order->setPersonTypeId($firstPersonType["ID"]);
     } else {
         $result->addError(new Entity\EntityError(GetMessage('SKGP_PERSON_TYPE_EMPTY'), 'PERSON_TYPE_ID'));
     }
     return $result;
 }
Exemplo n.º 2
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;
 }
Exemplo n.º 3
0
 /**
  * @return Result
  */
 public function save()
 {
     $result = new Result();
     /** @var Order $order */
     $order = $this->getOrder();
     //DoSaveOrderTax
     \CSaleTax::DoSaveOrderTax($order->getId(), $this->getTaxList(), $errors = array());
     if (!empty($errors) && is_array($errors)) {
         foreach ($errors as $error) {
             $result->addError(new EntityError($error));
         }
     }
     return $result;
 }
Exemplo n.º 4
0
 /**
  * @param array $list
  * @return Sale\Result
  * @throws \Bitrix\Main\ArgumentNullException
  */
 public static function setBasketFields(array $list)
 {
     $result = new Sale\Result();
     $order = null;
     $basket = null;
     $basketItem = null;
     $orderId = null;
     foreach ($list as $basketId => $fields) {
         $basketItemResult = static::loadEntityFromBasket($basketId);
         if ($basketItemResult->isSuccess()) {
             $basketItemResultList = $basketItemResult->getData();
             if (isset($basketItemResultList['BASKET'])) {
                 /** @var Sale\Basket $basket */
                 $basket = $basketItemResultList['BASKET'];
             }
             if (isset($basketItemResultList['BASKET_ITEM'])) {
                 /** @var Sale\BasketItem $basketItem */
                 $basketItem = $basketItemResultList['BASKET_ITEM'];
             }
             if (isset($basketItemResultList['ORDER'])) {
                 /** @var Sale\Order $order */
                 $order = $basketItemResultList['ORDER'];
             }
         }
         if ($basketItem === null) {
             $result->addError(new Sale\ResultError(Main\Localization\Loc::getMessage('SALE_BASKET_COMPATIBLE_BASKET_ITEM_NOT_FOUND'), 'BASKET_ITEM_NOT_FOUND'));
             return $result;
         }
         if ($orderId === null && isset($fields['ORDER_ID']) && intval($fields['ORDER_ID']) > 0) {
             $orderId = (int) $fields['ORDER_ID'];
         }
         if (isset($fields['ORDER_ID'])) {
             unset($fields['ORDER_ID']);
         }
         $basketItem->setFields($fields);
         if ($order === null && intval($orderId) > 0) {
             /** @var Sale\Order $order */
             $order = Sale\Order::load($orderId);
         }
     }
     if ($order === null) {
         return $result;
     }
     if ($order !== null && $basket !== null) {
         $r = static::appendBasketToOrder($order, $basket->getOrderableItems());
         if (!$r->isSuccess()) {
             $result->addErrors($r->getErrors());
         }
     }
     /** @var Sale\Result $r */
     $r = $order->save();
     if (!$r->isSuccess()) {
         $result->addErrors($r->getErrors());
     }
     return $result;
 }
Exemplo n.º 5
0
 /**
  *
  */
 public function delete()
 {
     $result = new Result();
     /** @var Basket $basket */
     if (!($basket = $this->getCollection())) {
         throw new ObjectNotFoundException('Entity "Basket" not found');
     }
     /** @var Order $order */
     if ($order = $basket->getOrder()) {
         /** @var ShipmentCollection $shipmentCollection */
         if ($shipmentCollection = $order->getShipmentCollection()) {
             /** @var Shipment $shipment */
             foreach ($shipmentCollection as $shipment) {
                 if ($shipment->isSystem()) {
                     continue;
                 }
                 /** @var ShipmentItemCollection $shipmentItemCollection */
                 if ($shipmentItemCollection = $shipment->getShipmentItemCollection()) {
                     if ($shipmentItemCollection->getItemByBasketCode($this->getBasketCode()) && $shipment->isShipped()) {
                         $result->addError(new ResultError(Loc::getMessage('SALE_BASKET_ITEM_REMOVE_IMPOSSIBLE_BECAUSE_SHIPPED', array('#PRODUCT_NAME#' => $this->getField('NAME'))), 'SALE_BASKET_ITEM_REMOVE_IMPOSSIBLE_BECAUSE_SHIPPED'));
                         return $result;
                     }
                 }
             }
         }
     }
     $r = $this->setField("QUANTITY", 0);
     if (!$r->isSuccess()) {
         $result->addErrors($r->getErrors());
         return $result;
     }
     $bundleCollection = null;
     if ($this->isBundleParent()) {
         /** @var Basket $bundleCollection */
         $bundleCollection = $this->getBundleCollection();
     }
     if (!$this->isBundleChild()) {
         /** @var Result $r */
         $r = parent::delete();
         if (!$r->isSuccess()) {
             $result->addErrors($r->getErrors());
             return $result;
         }
     }
     if ($bundleCollection !== null) {
         /** @var BasketItem $bundleBasketItem */
         foreach ($bundleCollection as $bundleBasketItem) {
             /** @var Result $r */
             $r = $bundleBasketItem->delete();
             if (!$r->isSuccess()) {
                 $result->addErrors($r->getErrors());
             }
         }
     }
     return $result;
 }
Exemplo n.º 6
0
 /**
  * Delete the order
  * @param int $id		Order ID.
  * @return Sale\Result
  * @throws \Bitrix\Main\ArgumentNullException
  */
 public static function delete($id)
 {
     $result = new Sale\Result();
     if (intval($id) <= 0) {
         $result->addError(new Sale\ResultError(Main\Localization\Loc::getMessage('SALE_COMPATIBLE_ORDER_ID_NOT_FOUND'), 'SALE_COMPATIBLE_ORDER_ID_NOT_FOUND'));
         return $result;
     }
     /** @var Sale\Order $order */
     if (!($order = Sale\Order::load($id))) {
         $result->addError(new Sale\ResultError(Loc::getMessage('SALE_ORDER_ENTITY_NOT_FOUND'), 'SALE_ORDER_ENTITY_NOT_FOUND'));
         return $result;
     }
     /** @var Sale\PaymentCollection $paymentCollection */
     if ($paymentCollection = $order->getPaymentCollection()) {
         /** @var Sale\Payment $payment */
         foreach ($paymentCollection as $payment) {
             if ($payment->isPaid()) {
                 $payment->setPaid('N');
             }
         }
         /** @var Sale\Result $r */
         $r = $order->save();
         if (!$r->isSuccess()) {
             return $r;
         }
     }
     /** @var Sale\Result $r */
     $r = Sale\Order::delete($id);
     if (!$r->isSuccess()) {
         $result->addErrors($r->getErrors());
     }
     return $result;
 }
Exemplo n.º 7
0
 /**
  * @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;
 }
Exemplo n.º 8
0
 /**
  * @param $name
  * @param $oldValue
  * @param $value
  * @return Result
  */
 public function onOrderModify($name, $oldValue, $value)
 {
     $result = new Result();
     switch ($name) {
         case "CANCELED":
             if ($value == "Y") {
                 $isPaid = false;
                 /** @var Payment $payment */
                 foreach ($this->collection as $payment) {
                     if ($payment->isPaid()) {
                         $isPaid = true;
                         break;
                     }
                 }
                 if ($isPaid) {
                     $result->addError(new ResultError(Loc::getMessage('SALE_ORDER_CANCEL_PAYMENT_EXIST_ACTIVE'), 'SALE_ORDER_CANCEL_PAYMENT_EXIST_ACTIVE'));
                 }
             }
             break;
     }
     return $result;
 }
 /**
  * @param ShipmentItemStore $item
  * @return Result
  * @throws \Exception
  */
 public function checkAvailableQuantity(ShipmentItemStore $item)
 {
     $result = new Result();
     $shipmentItem = $this->getShipmentItem();
     $basketItem = $shipmentItem->getBasketItem();
     $itemStoreQuantity = floatval($this->getQuantityByBasketCode($shipmentItem->getBasketCode()));
     if ($shipmentItem->getQuantity() !== null && (floatval($item->getQuantity()) > floatval($shipmentItem->getQuantity()) || $itemStoreQuantity > floatval($shipmentItem->getQuantity()))) {
         if (isset(static::$errors[$basketItem->getBasketCode()][$item->getField('ORDER_DELIVERY_BASKET_ID')]['STORE_QUANTITY_LARGER_ALLOWED'])) {
             static::$errors[$basketItem->getBasketCode()][$item->getField('ORDER_DELIVERY_BASKET_ID')]['STORE_QUANTITY_LARGER_ALLOWED'] += $item->getQuantity();
         } else {
             $result->addError(new ResultError(Loc::getMessage('SALE_SHIPMENT_ITEM_STORE_QUANTITY_LARGER_ALLOWED', array('#PRODUCT_NAME#' => $basketItem->getField('NAME'))), 'SALE_SHIPMENT_ITEM_STORE_QUANTITY_LARGER_ALLOWED'));
             static::$errors[$basketItem->getBasketCode()][$item->getField('ORDER_DELIVERY_BASKET_ID')]['STORE_QUANTITY_LARGER_ALLOWED'] = $item->getQuantity();
         }
     }
     return $result;
 }
Exemplo n.º 10
0
 /**
  * @param $userId
  * @return Sale\Result
  */
 public static function onUserBudgetSave($userId)
 {
     $result = new Sale\Result();
     $pool = static::getUserBudgetPool($userId);
     foreach ($pool->get() as $key => $budgetDat) {
         $orderId = null;
         $paymentId = null;
         if (isset($budgetDat['ORDER']) && $budgetDat['ORDER'] instanceof Sale\OrderBase) {
             $orderId = $budgetDat['ORDER']->getId();
         }
         if (isset($budgetDat['PAYMENT']) && $budgetDat['PAYMENT'] instanceof Sale\Payment) {
             $paymentId = $budgetDat['PAYMENT']->getId();
         }
         //			if ($budgetDat['TYPE'] == Internals\UserBudgetPool::BUDGET_TYPE_ORDER_PAY_PART
         //				|| $budgetDat['TYPE'] == Internals\UserBudgetPool::BUDGET_TYPE_ORDER_PAY)
         //			{
         //				if (!\CSaleUserAccount::Pay($userId, ($budgetDat['SUM'] * -1), $budgetDat['CURRENCY'], $orderId, false, $paymentId))
         //				{
         //					$result->addError( new ResultError(Loc::getMessage("SALE_PROVIDER_USER_BUDGET_".$budgetDat['TYPE']."_ERROR"), "SALE_PROVIDER_USER_BUDGET_".$budgetDat['TYPE']."_ERROR") );
         //				}
         //			}
         //			else
         //			{
         if (!\CSaleUserAccount::UpdateAccount($userId, $budgetDat['SUM'], $budgetDat['CURRENCY'], $budgetDat['TYPE'], $orderId, '', $paymentId)) {
             $result->addError(new Sale\ResultError(Loc::getMessage("SALE_PROVIDER_USER_BUDGET_" . $budgetDat['TYPE'] . "_ERROR"), "SALE_PROVIDER_USER_BUDGET_" . $budgetDat['TYPE'] . "_ERROR"));
         }
         //			}
         $pool->delete($key);
     }
     return $result;
 }
Exemplo n.º 11
0
 function setValueFromPost(array $post)
 {
     $result = new Result();
     $property = $this->property;
     $key = isset($property["ID"]) ? $property["ID"] : "n" . $this->getId();
     $value = isset($post['PROPERTIES'][$key]) ? $post['PROPERTIES'][$key] : null;
     if (isset($post['PROPERTIES'][$key])) {
         $this->setValue($value);
     } else {
         $value = $this->getValue();
     }
     $error = Input\Manager::getError($property, $value);
     if ($property['IS_EMAIL'] == 'Y' && !check_email($value, true)) {
         $error['EMAIL'] = str_replace(array("#EMAIL#", "#NAME#"), array(htmlspecialcharsbx($value), htmlspecialcharsbx($property['NAME'])), Loc::getMessage("SALE_GOPE_WRONG_EMAIL"));
     }
     foreach ($error as $e) {
         $result->addError(new ResultError($property['NAME'] . ' ' . $e, "PROPERTIES[{$key}]"));
     }
     return $result;
 }
Exemplo n.º 12
0
 /**
  * @return Result
  */
 public function calculateDelivery()
 {
     /** @var Result $result */
     $result = new Result();
     $shipmentListResult = array();
     /** @var Shipment $shipment */
     foreach ($this->collection as $shipment) {
         if ($shipment->isSystem() || $shipment->getDeliveryId() == 0) {
             continue;
         }
         if ($shipment->isCustomPrice()) {
             //				$shipmentListResult[] = array(
             //					'SHIPMENT_ITEM' => $shipment,
             //					'PRICE' => $shipment->getPrice(),
             //					'AVAILABLE' => true,
             //				);
             //				continue;
             $priceDelivery = $shipment->getPrice();
             $shipment->setField('BASE_PRICE_DELIVERY', $priceDelivery);
         } else {
             $deliveryCalculate = $shipment->calculateDelivery();
             if (!$deliveryCalculate->isSuccess()) {
                 $result->addErrors($deliveryCalculate->getErrors());
                 continue;
             }
             $deliveryCalculateData = $deliveryCalculate->getData();
             if (!isset($deliveryCalculateData['AVAILABLE'])) {
                 $result->addError(new ResultError(Loc::getMessage('SALE_ORDER_DELIVERY_SERVICE_NOT_AVAILABLE'), 'DELIVERY_SERVICE_NOT_AVAILABLE'));
                 continue;
             }
             if ($deliveryCalculate->getPrice() < 0) {
                 $result->addError(new ResultError(Loc::getMessage('SALE_ORDER_SHIPMENT_WRONG_DELIVERY_PRICE'), 'WRONG_DELIVERY_PRICE'));
                 continue;
             }
             $shipment->setField('BASE_PRICE_DELIVERY', $deliveryCalculate->getPrice());
             //			$shipmentListResult[] = array(
             //				'SHIPMENT_ITEM' => $shipment,
             //				'PRICE' => $deliveryCalculate->getPrice(),
             //				'AVAILABLE' => $deliveryCalculateData['AVAILABLE'],
             //			);
         }
     }
     // event OnSaleCalculateOrderDelivery
     return $result;
 }
Exemplo n.º 13
0
 /**
  * @param $entity
  * @param $entityName
  *
  * @return Sale\Result
  * @throws ArgumentNullException
  * @throws ArgumentOutOfRangeException
  * @throws ObjectNotFoundException
  */
 public function saveRawFields($entity, $entityName)
 {
     global $DB;
     if (!static::checkEntityName($entityName)) {
         throw new ArgumentOutOfRangeException('entityName');
     }
     if (empty($this->rawFields[$entityName]) || !is_array($this->rawFields[$entityName])) {
         return new Sale\Result();
     }
     $tableName = null;
     if ($entityName == static::ENTITY_ORDER) {
         /** @var Sale\OrderBase $entity */
         if (!$entity instanceof Sale\OrderBase) {
             throw new ObjectNotFoundException('Entity "Order" not found');
         }
         $tableName = static::ENTITY_ORDER_TABLE;
     } elseif ($entityName == static::ENTITY_PAYMENT) {
         /** @var Sale\Payment $entity */
         if (!$entity instanceof Sale\Payment) {
             throw new ObjectNotFoundException('Entity "Payment" not found');
         }
         $tableName = static::ENTITY_PAYMENT_TABLE;
     }
     if ($entity->getId() <= 0) {
         throw new ArgumentNullException('id');
     }
     if (strval(trim($tableName)) == '') {
         throw new ArgumentNullException('tableName');
     }
     $result = new Sale\Result();
     $queryValue = $DB->PrepareUpdate($tableName, $this->rawFields[$entityName]);
     foreach ($this->rawFields[$entityName] as $key => $value) {
         if (substr($key, 0, 1) != "=") {
             continue;
         }
         if (strval($queryValue) != '') {
             $queryValue .= ", ";
         }
         $queryValue .= substr($key, 1) . "=" . $value . " ";
     }
     $sql = "UPDATE " . $tableName . " SET " . "\t" . $queryValue . " WHERE ID = " . $entity->getId() . " ";
     if (!$DB->Query($sql, true, "File: " . __FILE__ . "<br>Line: " . __LINE__)) {
         $result->addError(new Sale\ResultError(Loc::getMessage('SALE_COMPATIBLE_' . $entityName . '_RAW_FIELD_UPDATE_ERROR'), 'SALE_' . $entityName . '_COMPATIBLE_RAW_FIELD_UPDATE_ERROR'));
         return $result;
     }
     return $result;
 }
Exemplo n.º 14
0
 public static function saveProfileData($profileId, Order $order, array $formData)
 {
     $result = new Result();
     $errors = array();
     if (!($profileName = $order->getPropertyCollection()->getProfileName())) {
         $result->addError(new EntityError(Loc::getMessage("SALE_ORDEREDIT_PROFILE_ERROR_NAME")));
         return $result;
     }
     $res = \CSaleOrderUserProps::DoSaveUserProfile($order->getUserId(), $profileId, $profileName->getValue(), $order->getPersonTypeId(), $propCollection = $formData["PROPERTIES"], $errors);
     if ($res === false) {
         if (!empty($errors)) {
             foreach ($errors as $error) {
                 $result->addError(new EntityError($error . "<br>\n"));
             }
         } else {
             $result->addError(new EntityError(Loc::getMessage("SALE_ORDEREDIT_PROFILE_ERROR_SAVE")));
         }
     }
     return $result;
 }
Exemplo n.º 15
0
 protected function processStatusesByDelivery($deliveryId, $shipmentsData)
 {
     $result = new Result();
     $trackingObject = $this->getTrackingObjectByDeliveryId($deliveryId);
     if ($trackingObject) {
         $statusResults = $trackingObject->getStatuses(array_keys($shipmentsData));
         foreach ($statusResults as $number => $statusResult) {
             if ($statusResult->isSuccess()) {
                 $eventsParams = array();
                 if (empty($shipmentsData[$number])) {
                     continue;
                 }
                 if ($statusResult->status != $shipmentsData[$number]['TRACKING_STATUS']) {
                     $eventParams = new StatusChangeEventParam();
                     $eventParams->orderId = $shipmentsData[$number]['ORDER_ID'];
                     $eventParams->shipmentId = $shipmentsData[$number]['SHIPMENT_ID'];
                     $eventParams->status = $statusResult->status;
                     $eventParams->trackingNumber = $number;
                     $eventParams->description = $statusResult->description;
                     $eventParams->lastChangeTimestamp = $statusResult->lastChangeTimestamp;
                     $eventsParams[] = $eventParams;
                 }
                 $res = $this->updateShipment($shipmentsData[$number]['SHIPMENT_ID'], $statusResult);
                 if (!$res->isSuccess()) {
                     $result->addErrors($res->getErrors());
                 }
                 $result->setData($eventsParams);
             } else {
                 $result->addErrors($statusResult->getErrors());
             }
         }
     } else {
         $result->addError(new Error("Can't get tracking object for delivery service with id:\"" . $deliveryId . "\""));
     }
     return $result;
 }
Exemplo n.º 16
0
 protected function onFieldModify($name, $oldValue, $value)
 {
     $result = new Result();
     /** @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->isShipped()) {
         $result = new Result();
         $result->addError(new ResultError(Loc::getMessage('SALE_SHIPMENT_ITEM_SHIPMENT_ALREADY_SHIPPED_CANNOT_EDIT'), 'SALE_SHIPMENT_ITEM_SHIPMENT_ALREADY_SHIPPED_CANNOT_EDIT'));
         return $result;
     }
     if ($name == "QUANTITY") {
         /** @var BasketItem $basketItem */
         if (!($basketItem = $this->getBasketItem())) {
             throw new Main\ObjectNotFoundException('Entity "BasketItem" not found');
         }
         $deltaQuantity = $value - $oldValue;
         if ($deltaQuantity > 0) {
             /** @var ShipmentCollection $shipmentCollection */
             if (!($shipmentCollection = $shipment->getCollection())) {
                 throw new Main\ObjectNotFoundException('Entity "ShipmentCollection" not found');
             }
             /** @var Shipment $systemShipment */
             if (!($systemShipment = $shipmentCollection->getSystemShipment())) {
                 throw new Main\ObjectNotFoundException('Entity "System Shipment" not found');
             }
             $systemBasketItemQuantity = $systemShipment->getBasketItemQuantity($basketItem);
             if ($systemBasketItemQuantity < abs($deltaQuantity)) {
                 $errorBasketCode = $basketItem->getBasketCode();
                 if ($basketItem->isBundleChild()) {
                     /** @var BasketItem $parentBasketItem */
                     if (!($parentBasketItem = $basketItem->getParentBasketItem())) {
                         throw new Main\ObjectNotFoundException('Entity "Parent Basket Item" not found');
                     }
                     $errorBasketCode = $parentBasketItem->getBasketCode();
                 }
                 if (isset(static::$errors[$errorBasketCode][$basketItem->getField('ORDER_DELIVERY_BASKET_ID')]['STORE_QUANTITY_LARGER_ALLOWED'])) {
                     static::$errors[$errorBasketCode][$basketItem->getField('ORDER_DELIVERY_BASKET_ID')]['STORE_QUANTITY_LARGER_ALLOWED'] += $basketItem->getQuantity();
                 } else {
                     $result->addError(new ResultError(Loc::getMessage('SALE_SHIPMENT_ITEM_LESS_AVAILABLE_QUANTITY', array('#PRODUCT_NAME#' => $basketItem->getField('NAME'))), 'SALE_SHIPMENT_ITEM_LESS_AVAILABLE_QUANTITY'));
                     static::$errors[$errorBasketCode][$basketItem->getField('ORDER_DELIVERY_BASKET_ID')]['STORE_QUANTITY_LARGER_ALLOWED'] = $basketItem->getQuantity();
                 }
                 //
                 //					$result->addError(new ResultError(Loc::getMessage('SALE_SHIPMENT_ITEM_LESS_AVAILABLE_QUANTITY', array(
                 //						'#PRODUCT_NAME#' => $basketItem->getField('NAME')
                 //					)), 'SALE_SHIPMENT_ITEM_LESS_AVAILABLE_QUANTITY'));
                 return $result;
             }
         }
         if ($basketItem->isBundleParent()) {
             $r = parent::onFieldModify($name, $oldValue, $value);
             if (!$r->isSuccess()) {
                 $result->addErrors($r->getErrors());
             }
             if ($bundleCollection = $basketItem->getBundleCollection()) {
                 $bundleBaseQuantity = $basketItem->getBundleBaseQuantity();
                 /** @var BasketItem $bundleBasketItem */
                 foreach ($bundleCollection as $bundleBasketItem) {
                     /** @var ShipmentItem $shipmentItem */
                     if ($shipmentItem = $shipmentItemCollection->getItemByBasketCode($bundleBasketItem->getBasketCode())) {
                         $bundleProductId = $bundleBasketItem->getProductId();
                         if (!isset($bundleBaseQuantity[$bundleProductId])) {
                             throw new Main\ArgumentOutOfRangeException("bundle product id");
                         }
                         $quantity = $bundleBaseQuantity[$bundleProductId] * $value;
                         $r = $shipmentItem->setQuantity($quantity);
                         if (!$r->isSuccess()) {
                             $result->addErrors($r->getErrors());
                         }
                     }
                 }
             }
             if (!$this->isMathActionOnly()) {
                 $r = $this->calculateDelivery();
                 if (!$r->isSuccess()) {
                     $result->addErrors($r->getErrors());
                 }
             }
             return $result;
         }
         if (!$basketItem->isBundleChild()) {
             if (!$this->isMathActionOnly()) {
                 $r = $this->calculateDelivery();
                 if (!$r->isSuccess()) {
                     $result->addErrors($r->getErrors());
                 }
             }
         }
         /** @var ShipmentItemStoreCollection $shipmentItemStoreCollection */
         if (!($shipmentItemStoreCollection = $this->getShipmentItemStoreCollection())) {
             throw new Main\ObjectNotFoundException('Entity "ShipmentItemStoreCollection" not found');
         }
         if ($value == 0) {
             /** @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');
             }
             OrderHistory::addAction('SHIPMENT', $order->getId(), 'SHIPMENT_ITEM_BASKET_REMOVED', $shipment->getId(), null, array('NAME' => $basketItem->getField('NAME'), 'PRODUCT_ID' => $basketItem->getProductId()));
             /** @var ShipmentItemStore $shipmentItemStore */
             foreach ($shipmentItemStoreCollection as $shipmentItemStore) {
                 $shipmentItemStore->delete();
             }
         } else {
             // check barcodes
             /** @var ShipmentItemStoreCollection $shipmentItemStoreCollection */
             if ($this->getShipmentItemStoreCollection()) {
                 $barcodeQuantity = $shipmentItemStoreCollection->getQuantityByBasketCode($basketItem->getBasketCode());
                 if ($barcodeQuantity > $value) {
                     $result->addError(new ResultError(Loc::getMessage('SALE_SHIPMENT_ITEM_BARCODE_MORE_ITEM_QUANTITY'), 'BARCODE_MORE_ITEM_QUANTITY'));
                     return $result;
                 }
             }
         }
     }
     return parent::onFieldModify($name, $oldValue, $value);
 }
Exemplo n.º 17
0
 /**
  * @param Order $order
  * @param array $shipments
  * @return Result
  * @throws SystemException
  */
 public static function updateData(Order &$order, array $shipments)
 {
     global $USER;
     $result = new Result();
     $data = array();
     $basketResult = null;
     if (!$order) {
         $result->addError(new EntityError(Loc::getMessage('SALE_ORDER_SHIPMENT_ERROR_ORDER_NOT_FOUND')));
         return $result;
     }
     $shipmentCollection = $order->getShipmentCollection();
     $isStartField = $shipmentCollection->isStartField();
     foreach ($shipments as $item) {
         $shipmentId = intval($item['SHIPMENT_ID']);
         $isNew = $shipmentId <= 0;
         if ($isNew) {
             self::$shipment = $shipmentCollection->createItem();
         } else {
             self::$shipment = $shipmentCollection->getItemById($shipmentId);
             if (!self::$shipment) {
                 $result->addError(new EntityError(Loc::getMessage('SALE_ORDER_SHIPMENT_ERROR_SHIPMENT_NOT_FOUND')));
                 continue;
             }
         }
         self::$defaultFields = self::$shipment->getFieldValues();
         /** @var \Bitrix\Sale\BasketItem $product */
         $countItems = count(self::$shipment->getShipmentItemCollection());
         $systemShipment = $shipmentCollection->getSystemShipment();
         $systemShipmentItemCollection = $systemShipment->getShipmentItemCollection();
         $products = array();
         if (!isset($item['PRODUCT']) && self::$shipment->getId() <= 0) {
             $basket = $order->getBasket();
             if ($basket) {
                 $basketItems = $basket->getBasketItems();
                 foreach ($basketItems as $product) {
                     $systemShipmentItem = $systemShipmentItemCollection->getItemByBasketCode($product->getBasketCode());
                     if ($product->isBundleChild() || !$systemShipmentItem || $systemShipmentItem->getQuantity() <= 0) {
                         continue;
                     }
                     $products[] = array('AMOUNT' => $product->getQuantity(), 'BASKET_CODE' => $product->getBasketCode());
                 }
             }
         } else {
             $products = $item['PRODUCT'];
         }
         if ($item['DEDUCTED'] == 'Y') {
             $basketResult = OrderBasketShipment::updateData($order, self::$shipment, $products);
             if (!$basketResult->isSuccess()) {
                 $result->addErrors($basketResult->getErrors());
             }
         }
         $extraServices = $item['EXTRA_SERVICES'] ? $item['EXTRA_SERVICES'] : array();
         $shipmentFields = array('COMPANY_ID' => isset($item['COMPANY_ID']) && $item['COMPANY_ID'] > 0 ? $item['COMPANY_ID'] : 0, 'DEDUCTED' => $item['DEDUCTED'], 'DELIVERY_DOC_NUM' => $item['DELIVERY_DOC_NUM'], 'TRACKING_NUMBER' => $item['TRACKING_NUMBER'], 'CURRENCY' => $order->getCurrency(), 'COMMENTS' => $item['COMMENTS'], 'STATUS_ID' => $isNew ? DeliveryStatus::getInitialStatus() : $item['STATUS_ID']);
         if ($item['DELIVERY_DOC_DATE']) {
             try {
                 $shipmentFields['DELIVERY_DOC_DATE'] = new Date($item['DELIVERY_DOC_DATE']);
             } catch (Main\ObjectException $exception) {
                 $result->addError(new EntityError(Loc::getMessage('SALE_ORDER_SHIPMENT_ERROR_UNCORRECT_FORM_DATE')));
             }
         }
         $shipmentFields['DELIVERY_ID'] = $item['PROFILE'] > 0 ? $item['PROFILE'] : $item['DELIVERY_ID'];
         try {
             $service = Services\Manager::getService($shipmentFields['DELIVERY_ID']);
             if ($service->getParentService()) {
                 $shipmentFields['DELIVERY_NAME'] = $service->getParentService()->getName() . ':' . $service->getName();
             } else {
                 $shipmentFields['DELIVERY_NAME'] = $service->getName();
             }
         } catch (Main\ArgumentNullException $e) {
             $result->addError(new EntityError(Loc::getMessage('SALE_ORDER_SHIPMENT_ERROR_NO_DELIVERY_SERVICE')));
         }
         $responsibleId = self::$shipment->getField('RESPONSIBLE_ID');
         if ($item['RESPONSIBLE_ID'] != $responsibleId || empty($responsibleId)) {
             if (isset($item['RESPONSIBLE_ID'])) {
                 $shipmentFields['RESPONSIBLE_ID'] = $item['RESPONSIBLE_ID'];
             } else {
                 $shipmentFields['RESPONSIBLE_ID'] = $order->getField('RESPONSIBLE_ID');
             }
             if (!empty($shipmentFields['RESPONSIBLE_ID'])) {
                 $shipmentFields['EMP_RESPONSIBLE_ID'] = $USER->getID();
                 $shipmentFields['DATE_RESPONSIBLE_ID'] = new DateTime();
             }
         }
         if ($extraServices) {
             self::$shipment->setExtraServices($extraServices);
         }
         $setFieldsResult = self::$shipment->setFields($shipmentFields);
         if (!$setFieldsResult->isSuccess()) {
             $result->addErrors($setFieldsResult->getErrors());
         }
         self::$shipment->setStoreId($item['DELIVERY_STORE_ID']);
         if ($item['DEDUCTED'] == 'N') {
             $basketResult = OrderBasketShipment::updateData($order, self::$shipment, $products);
             if (!$basketResult->isSuccess()) {
                 $result->addErrors($basketResult->getErrors());
             }
         }
         try {
             $priceDeliveryInfo = array();
             if ($item['CUSTOM_PRICE_DELIVERY'] != 'Y') {
                 $totalPrice = self::getDeliveryPrice(self::$shipment);
             } else {
                 $totalPrice = (double) str_replace(',', '.', $item['BASE_PRICE_DELIVERY']);
             }
         } catch (\Exception $e) {
             $totalPrice = 0;
         }
         $priceDeliveryInfo['CUSTOM_PRICE_DELIVERY'] = $item['CUSTOM_PRICE_DELIVERY'];
         $priceDeliveryInfo['BASE_PRICE_DELIVERY'] = $totalPrice;
         self::$shipment->setFields($priceDeliveryInfo);
         self::$shipment->setField('ALLOW_DELIVERY', $item['ALLOW_DELIVERY']);
         $data['SHIPMENT'][] = self::$shipment;
     }
     if ($isStartField) {
         $hasMeaningfulFields = $shipmentCollection->hasMeaningfulField();
         /** @var Result $r */
         $r = $shipmentCollection->doFinalAction($hasMeaningfulFields);
         if (!$r->isSuccess()) {
             $result->addErrors($r->getErrors());
         }
     }
     $result->setData($data);
     return $result;
 }
Exemplo n.º 18
0
 /**
  * @internal
  * @return Sale\Result
  * @throws Main\ArgumentNullException
  * @throws Main\ObjectNotFoundException
  */
 public function saveRawFields()
 {
     global $DB;
     if (empty($this->rawFields) || !is_array($this->rawFields)) {
         return new Sale\Result();
     }
     /** @var Sale\Order $order */
     if (!($order = $this->getOrder())) {
         throw new Main\ObjectNotFoundException('Entity "Order" not found');
     }
     if ($order->getId() <= 0) {
         throw new Main\ArgumentNullException('id');
     }
     $result = new Sale\Result();
     $queryValue = $DB->PrepareUpdate("b_sale_order", $this->rawFields);
     // = fields
     foreach ($this->rawFields as $key => $value) {
         if (substr($key, 0, 1) != "=") {
             continue;
         }
         if (strval($queryValue) != '') {
             $queryValue .= ", ";
         }
         $queryValue .= substr($key, 1) . "=" . $value . " ";
     }
     $sql = "UPDATE b_sale_order SET " . "\t" . $queryValue . " WHERE ID = " . $order->getId() . " ";
     if (!$DB->Query($sql, true, "File: " . __FILE__ . "<br>Line: " . __LINE__)) {
         $result->addError(new Sale\ResultError(Main\Localization\Loc::getMessage('SALE_ORDER_COMPATIBLE_RAW_FIELD_UPDATE_ERROR'), 'SALE_ORDER_COMPATIBLE_RAW_FIELD_UPDATE_ERROR'));
         return $result;
     }
     return $result;
 }
Exemplo n.º 19
0
 public static function saveStores($deliveryId, array $storesList)
 {
     $result = new Result();
     $storesFields = self::getStoresFields($deliveryId);
     if (!empty($storesFields)) {
         $res = Table::update($storesFields["ID"], array("PARAMS" => array("STORES" => $storesList)));
     } else {
         $res = Table::add(array("CODE" => self::STORE_PICKUP_CODE, "NAME" => Loc::getMessage("DELIVERY_SERVICE_MANAGER_ES_NAME"), "DESCRIPTION" => Loc::getMessage("DELIVERY_SERVICE_MANAGER_ES_DESCRIPTION"), "CLASS_NAME" => self::STORE_PICKUP_CLASS, "DELIVERY_ID" => $deliveryId, "RIGHTS" => "YYY", "PARAMS" => array("STORES" => $storesList)));
     }
     if (!$res->isSuccess()) {
         foreach ($res->getErrors() as $error) {
             $result->addError($error);
         }
     }
     return $result;
 }
Exemplo n.º 20
0
 /**
  * @internal
  * @return Sale\Result
  * @throws Main\ArgumentNullException
  * @throws Main\ObjectNotFoundException
  */
 public function saveRawFields()
 {
     global $DB;
     if (empty($this->rawFields) || !is_array($this->rawFields)) {
         return new Sale\Result();
     }
     if (!($orderCompatibility = $this->getOrderCompatibility())) {
         throw new Main\ObjectNotFoundException('Entity "OrderCompatibility" not found');
     }
     /** @var Sale\Order $order */
     if (!($order = $this->getOrder())) {
         throw new Main\ObjectNotFoundException('Entity "Order" not found');
     }
     if ($order->getId() <= 0) {
         throw new Main\ArgumentNullException('id');
     }
     $result = new Sale\Result();
     if (!($basket = $order->getBasket())) {
         throw new Main\ObjectNotFoundException('Entity "Basket" not found');
     }
     foreach ($this->rawFields as $basketCode => $rawFields) {
         /** @var Sale\BasketItem $basketItem */
         if ($basketItem = $basket->getItemById($basketCode)) {
             $queryValue = $DB->PrepareUpdate("b_sale_basket", $rawFields);
             // = fields
             foreach ($this->rawFields as $key => $value) {
                 if (substr($key, 0, 1) != "=") {
                     continue;
                 }
                 if (strval($queryValue) != '') {
                     $queryValue .= ", ";
                 }
                 $queryValue .= $key . "=" . $value . " ";
             }
             if (!empty($queryValue)) {
                 $query = "update b_sale_basket set " . $queryValue . ", DATE_UPDATE = " . $DB->GetNowFunction() . " where ID = " . $basketItem->getId();
                 if (!($updated = $DB->Query($query, false, "File: " . __FILE__ . "<br>Line: " . __LINE__))) {
                     $result->addError(new Sale\ResultError(Main\Localization\Loc::getMessage('SALE_BASKET_COMPATIBLE_RAW_FIELD_UPDATE_ERROR', array('#BASKET_ID#' => $basketItem->getId(), '#PRODUCT_NAME#' => $basketItem->getField('NAME'))), 'SALE_BASKET_COMPATIBLE_RAW_FIELD_UPDATE_ERROR'));
                     return $result;
                 }
             }
         }
     }
     return $result;
 }
Exemplo n.º 21
0
 /**
  * @internal
  *
  * @param BasketItem $basketItem
  * @param $value
  * @param $oldValue
  *
  * @return Result
  */
 public function syncQuantityAfterModify(BasketItem $basketItem, $value = null, $oldValue = null)
 {
     $result = new Result();
     $shipmentItemCollection = $this->getShipmentItemCollection();
     $shipmentItem = $shipmentItemCollection->getItemByBasketCode($basketItem->getBasketCode());
     if ($shipmentItem === null) {
         if ($value == 0) {
             return new Result();
         }
         $shipmentItem = $shipmentItemCollection->createItem($basketItem);
     }
     $deltaQuantity = $value - $oldValue;
     if ($deltaQuantity > 0) {
         $shipmentItem->setFieldNoDemand("QUANTITY", $shipmentItem->getField("QUANTITY") + $deltaQuantity);
         if ($this->needReservation()) {
             Provider::tryReserveShipmentItem($shipmentItem);
         }
     } else {
         if (floatval($shipmentItem->getField("QUANTITY")) <= 0) {
             return new Result();
         }
         if ($value != 0 && $shipmentItem->getField("QUANTITY") < -$deltaQuantity) {
             $result = new Result();
             $result->addError(new ResultError(str_replace(array("#NAME#", "#QUANTITY#", "#DELTA_QUANTITY#"), array($basketItem->getField("NAME"), $shipmentItem->getField("QUANTITY"), abs($deltaQuantity)), Loc::getMessage('SALE_SHIPMENT_SYSTEM_QUANTITY_ERROR')), 'SALE_SHIPMENT_SYSTEM_QUANTITY_ERROR'));
             return $result;
         }
         if ($value > 0) {
             $shipmentItem->setFieldNoDemand("QUANTITY", $shipmentItem->getField("QUANTITY") + $deltaQuantity);
             if ($this->needReservation()) {
                 Provider::tryReserveShipmentItem($shipmentItem);
             }
         } else {
             $shipmentItem->setFieldNoDemand("QUANTITY", 0);
         }
     }
     return $result;
 }
Exemplo n.º 22
0
 /**
  * @param Shipment $shipment
  * @return Result
  * @throws NotSupportedException
  */
 public static function deliverShipment(Shipment $shipment)
 {
     global $APPLICATION;
     $result = new Result();
     $needDeliver = $shipment->needDeliver();
     if ($needDeliver === null || $needDeliver === false && $shipment->getId() <= 0) {
         return $result;
     }
     $resultList = array();
     $shipmentItemCollection = $shipment->getShipmentItemCollection();
     $basketList = static::getBasketFromShipmentItemCollection($shipmentItemCollection);
     $basketProviderMap = static::createProviderBasketMap($basketList, array('ORDER_ID', 'USER_ID', 'QUANTITY', 'PAID'));
     $basketProviderList = static::redistributeToProviders($basketProviderMap);
     if (!empty($basketProviderList)) {
         foreach ($basketProviderList as $provider => $providerBasketItemList) {
             if ($provider instanceof Provider) {
                 throw new NotSupportedException('provider not supported');
             } elseif ($provider && array_key_exists("IBXSaleProductProvider", class_implements($provider))) {
                 foreach ($providerBasketItemList as $providerBasketItem) {
                     if ($providerBasketItem['BASKET_ITEM']->isBundleParent()) {
                         continue;
                     }
                     if (!$providerBasketItem['BASKET_ITEM']->isEmptyItem()) {
                         $data = array("PRODUCT_ID" => $providerBasketItem["PRODUCT_ID"], "USER_ID" => $providerBasketItem["USER_ID"], "PAID" => $providerBasketItem["PAID"], "ORDER_ID" => $providerBasketItem["ORDER_ID"], "BASKET_ID" => $providerBasketItem['BASKET_ID']);
                         $APPLICATION->ResetException();
                         $resultProductData = $provider::DeliverProduct($data);
                         if ($ex = $APPLICATION->GetException()) {
                             $result->addError(new ResultError($ex->GetString(), $ex->GetID()));
                         }
                         if (!empty($resultProductData) && is_array($resultProductData)) {
                             $resultProductData['ORDER_ID'] = $providerBasketItem['ORDER_ID'];
                         }
                     } else {
                         $resultProductData = true;
                     }
                     $resultList[$providerBasketItem['BASKET_CODE']] = $resultProductData;
                 }
             } else {
                 foreach ($providerBasketItemList as $providerBasketItem) {
                     $resultProductData = \CSaleBasket::ExecuteCallbackFunction($providerBasketItem['CALLBACK_FUNC'], $providerBasketItem['MODULE'], $providerBasketItem['PRODUCT_ID'], $providerBasketItem['USER_ID'], $providerBasketItem["PAID"], $providerBasketItem['ORDER_ID'], $providerBasketItem["QUANTITY"]);
                     $basketCode = $providerBasketItem['BASKET_ITEM']->getBasketCode();
                     if (!empty($resultProductData) && is_array($resultProductData)) {
                         $resultProductData['ORDER_ID'] = $providerBasketItem['ORDER_ID'];
                     }
                     $resultList[$basketCode] = $resultProductData;
                 }
             }
         }
         if (!empty($resultList) && is_array($resultList)) {
             foreach ($resultList as $basketCode => $resultData) {
                 if ($resultData && !empty($resultData) && is_array($resultData)) {
                     $resultData["REMAINING_ATTEMPTS"] = defined("SALE_PROC_REC_ATTEMPTS") ? SALE_PROC_REC_ATTEMPTS : 3;
                     $resultData["SUCCESS_PAYMENT"] = "Y";
                     // TODO: recurringID
                     /*
                     if ($recurringID > 0)
                     	\CSaleRecurring::Update($recurringID, $resultData);
                     else
                     	\CSaleRecurring::Add($resultData);
                     */
                 }
                 /*
                 elseif ($recurringID > 0)
                 {
                 	\CSaleRecurring::Delete($recurringID);
                 }
                 */
             }
         }
     }
     if (!empty($resultList)) {
         $result->setData($resultList);
     }
     return $result;
 }
Exemplo n.º 23
0
 /**
  * @internal
  * @param $id
  *
  * @return Sale\Result
  * @throws Exception
  * @throws \Bitrix\Main\ArgumentNullException
  */
 protected static function setIdAsAccountNumber($id)
 {
     $result = new Sale\Result();
     $isOrderConverted = \Bitrix\Main\Config\Option::get("main", "~sale_converted_15", 'N');
     if ($isOrderConverted == "Y") {
         $accountNumber = $id;
         for ($i = 1; $i <= 10; $i++) {
             try {
                 /** @var \Bitrix\Sale\Result $r */
                 $r = \Bitrix\Sale\Internals\OrderTable::update($id, array("ACCOUNT_NUMBER" => $accountNumber));
                 $res = $r->isSuccess(true);
             } catch (\Bitrix\Main\DB\SqlQueryException $exception) {
                 $res = false;
                 $accountNumber = $id . "-" . $i;
             }
             if ($res) {
                 break;
             }
         }
     } else {
         $res = CSaleOrder::Update($id, array("ACCOUNT_NUMBER" => $id), false);
     }
     if (!$res) {
         $result->addError(new Sale\ResultError(Loc::getMessage('SALE_ORDER_GENERATE_ACCOUNT_NUMBER_ORDER_NUMBER_IS_NOT_SET_AS_ID'), 'SALE_ORDER_GENERATE_ACCOUNT_NUMBER_ORDER_NUMBER_IS_NOT_SET_AS_ID'));
         return $result;
     }
     $result->setData(array('ACCOUNT_NUMBER' => $id));
     return $result;
 }
Exemplo n.º 24
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;
 }
Exemplo n.º 25
0
 /**
  * @param bool $hasMeaningfulField
  * @return Result
  * @throws Main\ArgumentNullException
  * @throws Main\ObjectNotFoundException
  */
 public function doFinalAction($hasMeaningfulField = false)
 {
     $result = new Result();
     if (!$hasMeaningfulField) {
         $this->clearStartField();
         return $result;
     }
     if ($basket = $this->getBasket()) {
         $this->setMathActionOnly(true);
         if ($eventName = static::getEntityEventName()) {
             $event = new Main\Event('sale', 'OnBefore' . $eventName . 'FinalAction', array('ENTITY' => $this, 'HAS_MEANINGFUL_FIELD' => $hasMeaningfulField, 'BASKET' => $basket));
             $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_' . strtoupper($eventName) . '_FINAL_ACTION_ERROR'), 'SALE_EVENT_ON_BEFORE_' . strtoupper($eventName) . '_FINAL_ACTION_ERROR');
                         if ($eventResultData = $eventResult->getParameters()) {
                             if (isset($eventResultData['ERROR']) && $eventResultData['ERROR'] instanceof ResultError) {
                                 $errorMsg = $eventResultData['ERROR'];
                             }
                         }
                         $result->addError($errorMsg);
                     }
                 }
             }
             if (!$result->isSuccess()) {
                 return $result;
             }
         }
         // discount
         $discount = $this->getDiscount();
         $r = $discount->calculate();
         if (!$r->isSuccess()) {
             //				$this->clearStartField();
             //				$result->addErrors($r->getErrors());
             //				return $result;
         }
         if ($r->isSuccess() && ($discountData = $r->getData()) && !empty($discountData) && is_array($discountData)) {
             /** @var Result $r */
             $r = $this->applyDiscount($discountData);
             if (!$r->isSuccess()) {
                 $result->addErrors($r->getErrors());
                 return $result;
             }
         }
         if (!$this->isExternal()) {
             /** @var Tax $tax */
             $tax = $this->getTax();
             /** @var Result $r */
             $r = $tax->calculate();
             if (!$result->isSuccess()) {
                 return $r;
             }
             $r = $tax->calculateDelivery();
             if (!$result->isSuccess()) {
                 return $r;
             }
             $taxChanged = false;
             $taxResult = $r->getData();
             if (isset($taxResult['TAX_PRICE']) && floatval($taxResult['TAX_PRICE']) >= 0) {
                 if (!$this->isUsedVat()) {
                     $taxChanged = true;
                     $this->setField('TAX_PRICE', $taxResult['TAX_PRICE']);
                     $this->setFieldNoDemand("PRICE", $this->getBasket()->getPrice() + $this->getShipmentCollection()->getPriceDelivery() + $taxResult['TAX_PRICE']);
                 }
             }
             if ($taxChanged || $this->isUsedVat()) {
                 $taxValue = $this->isUsedVat() ? $this->getVatSum() : $this->getField('TAX_PRICE');
                 if (floatval($taxValue) != floatval($this->getField('TAX_VALUE'))) {
                     $this->setField('TAX_VALUE', floatval($taxValue));
                 }
             }
         }
     }
     //
     $this->setMathActionOnly(false);
     //
     /** @var Result $r */
     $r = $this->syncOrderAndPayments();
     if (!$r->isSuccess()) {
         $result->addErrors($r->getErrors());
     }
     $this->clearStartField();
     if ($eventName = static::getEntityEventName()) {
         $event = new Main\Event('sale', 'OnAfter' . $eventName . 'FinalAction', array('ENTITY' => $this));
         $event->send();
     }
     return $result;
 }
Exemplo n.º 26
0
 /**
  * @param $message
  */
 public function addResultError($message)
 {
     $this->result->addError(new EntityError($message));
 }
Exemplo n.º 27
0
 /**
  * @param Order $order
  * @param $payments
  * @param bool $canSetPaid
  * @return Result
  * @throws Main\ArgumentOutOfRangeException
  * @throws Main\ObjectNotFoundException
  * @throws UserMessageException
  */
 public static function updateData(Order &$order, $payments, $canSetPaid = false)
 {
     global $USER;
     $result = new Result();
     $data['PAYMENT'] = array();
     if (!$order) {
         throw new UserMessageException('Order does not exist');
     }
     foreach ($payments as $payment) {
         $paymentId = intval($payment['PAYMENT_ID']);
         $isNew = $paymentId <= 0;
         $paymentCollection = $order->getPaymentCollection();
         /** @var \Bitrix\Sale\Payment $paymentItem */
         if ($isNew) {
             $paymentItem = $paymentCollection->createItem();
         } else {
             $paymentItem = $paymentCollection->getItemById($paymentId);
             if (!$paymentItem) {
                 throw new UserMessageException('Payment does not exist');
             }
         }
         self::$defaultFields = $paymentItem->getFieldValues();
         $isReturn = isset($payment['IS_RETURN']) && $payment['IS_RETURN'] == 'Y';
         /** @var \Bitrix\Sale\PaySystemService $paymentService */
         $paymentService = PaySystemService::load($payment['PAY_SYSTEM_ID']);
         if (!$paymentService) {
             $result->addError(new EntityError(Loc::getMessage('SALE_ORDER_PAYMENT_ERROR_PAYSYSTEM')));
         }
         $paymentFields = array('PAY_SYSTEM_ID' => $payment['PAY_SYSTEM_ID'], 'COMPANY_ID' => isset($payment['COMPANY_ID']) ? $payment['COMPANY_ID'] : 0, 'SUM' => $payment['SUM'], 'PAY_VOUCHER_NUM' => $payment['PAY_VOUCHER_NUM'], 'PAY_RETURN_NUM' => $payment['PAY_RETURN_NUM'], 'PAY_RETURN_COMMENT' => $payment['PAY_RETURN_COMMENT'], 'COMMENTS' => $payment['COMMENTS'], 'PAY_SYSTEM_NAME' => $paymentService ? $paymentService->getName() : '');
         if ($isNew) {
             $paymentFields['DATE_BILL'] = new DateTime();
         }
         if (!empty($payment['PAY_RETURN_DATE'])) {
             try {
                 $paymentFields['PAY_RETURN_DATE'] = new Date($payment['PAY_RETURN_DATE']);
             } catch (Main\ObjectException $exception) {
                 $result->addError(new EntityError(Loc::getMessage('SALE_ORDER_PAYMENT_ERROR_RETURN_DATE_FORMAT')));
             }
         }
         if (!empty($payment['PAY_VOUCHER_DATE'])) {
             try {
                 $paymentFields['PAY_VOUCHER_DATE'] = new Date($payment['PAY_VOUCHER_DATE']);
             } catch (Main\ObjectException $exception) {
                 $result->addError(new EntityError(Loc::getMessage('SALE_ORDER_PAYMENT_ERROR_VOUCHER_DATE_FORMAT')));
             }
         }
         if (isset($payment['RESPONSIBLE_ID'])) {
             $paymentFields['RESPONSIBLE_ID'] = !empty($payment['RESPONSIBLE_ID']) ? $payment['RESPONSIBLE_ID'] : $USER->GetID();
             if ($payment['RESPONSIBLE_ID'] != $paymentItem->getField('RESPONSIBLE_ID')) {
                 $paymentFields['DATE_RESPONSIBLE_ID'] = new DateTime();
                 if (!$isNew) {
                     $paymentFields['EMP_RESPONSIBLE_ID'] = $USER->GetID();
                 }
             }
         }
         if ($result->isSuccess()) {
             if ($paymentItem->getField('PAID') != $payment['PAID'] && $paymentItem->getField('IS_RETURN') == 'Y') {
                 $setResult = $paymentItem->setReturn('N');
                 if (!$setResult->isSuccess()) {
                     $result->addErrors($setResult->getErrors());
                 }
             }
             if ($isReturn && $payment['OPERATION_ID'] == 'RETURN') {
                 $setResult = $paymentItem->setReturn('Y');
                 if (!$setResult->isSuccess()) {
                     $result->addErrors($setResult->getErrors());
                 }
             }
             $setResult = $paymentItem->setFields($paymentFields);
             if (!$setResult->isSuccess()) {
                 $result->addErrors($setResult->getErrors());
             }
             if (!$canSetPaid) {
                 $setResult = $paymentItem->setPaid($payment['PAID']);
                 if (!$setResult->isSuccess()) {
                     $result->addErrors($setResult->getErrors());
                 }
             }
             if ($payment['ORDER_STATUS_ID']) {
                 $order->setField('STATUS_ID', $payment['ORDER_STATUS_ID']);
             }
         }
         $data['PAYMENT'][] = $paymentItem;
     }
     $result->setData($data);
     return $result;
 }
Exemplo n.º 28
0
 /**
  * @param $name
  * @param $value
  * @return Result
  * @throws Main\ArgumentOutOfRangeException
  * @throws Main\NotImplementedException
  * @throws \Exception
  */
 public function setField($name, $value)
 {
     if ($name == "PAY_SYSTEM_ID") {
         if (intval($value) > 0 && !PaySystemService::isExist($value)) {
             $result = new Result();
             $result->addError(new ResultError(Loc::getMessage('SALE_PAYMENT_WRONG_PAYMENT_SERVICE'), 'SALE_PAYMENT_WRONG_PAYMENT_SERVICE'));
             return $result;
         }
         /** @var PaymentCollection $paymentCollection */
         if (!($paymentCollection = $this->getCollection())) {
             throw new Main\ObjectNotFoundException('Entity "PaymentCollection" not found');
         }
         if (count($paymentCollection) == 1) {
             /** @var Order $order */
             if ($order = $paymentCollection->getOrder()) {
                 if (strval($order->getField('PAY_SYSTEM_ID')) == '') {
                     $order->setFieldNoDemand('PAY_SYSTEM_ID', intval($value));
                 }
             }
         }
     }
     return parent::setField($name, $value);
 }
Exemplo n.º 29
0
 /**
  *
  * @param array $values
  * @return Result
  * @throws Main\ArgumentOutOfRangeException
  * @throws Main\NotSupportedException
  * @throws \Exception
  */
 public function setFields(array $values)
 {
     $resultData = array();
     $result = new Result();
     $oldValues = null;
     foreach ($values as $key => $value) {
         $oldValues[$key] = $this->fields->get($key);
     }
     if ($eventName = static::getEntityEventName()) {
         $event = new Main\Event('sale', 'OnBefore' . $eventName . 'SetFields', array('ENTITY' => $this, 'VALUES' => $values, 'OLD_VALUES' => $oldValues));
         $event->send();
         if ($event->getResults()) {
             /** @var Main\EventResult $eventResult */
             foreach ($event->getResults() as $eventResult) {
                 if ($eventResult->getType() == Main\EventResult::SUCCESS) {
                     if ($eventResultData = $eventResult->getParameters()) {
                         if (isset($eventResultData['VALUES'])) {
                             $values = $eventResultData['VALUES'];
                         }
                     }
                 } elseif ($eventResult->getType() == Main\EventResult::ERROR) {
                     $errorMsg = new ResultError(Main\Localization\Loc::getMessage('SALE_EVENT_ON_BEFORE_' . strtoupper($eventName) . '_SET_FIELDS_ERROR'), 'SALE_EVENT_ON_BEFORE_' . strtoupper($eventName) . '_SET_FIELDS_ERROR');
                     if ($eventResultData = $eventResult->getParameters()) {
                         if (isset($eventResultData['ERROR']) && $eventResultData['ERROR'] instanceof ResultError) {
                             $errorMsg = $eventResultData['ERROR'];
                         }
                     }
                     $result->addError($errorMsg);
                 }
             }
         }
     }
     if (!$result->isSuccess()) {
         return $result;
     }
     $isStartField = $this->isStartField();
     foreach ($values as $key => $value) {
         $r = $this->setField($key, $value);
         if (!$r->isSuccess()) {
             $data = $r->getData();
             if (!empty($data) && is_array($data)) {
                 $resultData = array_merge($resultData, $data);
             }
             $result->addErrors($r->getErrors());
         }
     }
     if (!empty($resultData)) {
         $result->setData($resultData);
     }
     if ($isStartField) {
         $hasMeaningfulFields = $this->hasMeaningfulField();
         /** @var Result $r */
         $r = $this->doFinalAction($hasMeaningfulFields);
         if (!$r->isSuccess()) {
             $result->addErrors($r->getErrors());
         } else {
             if (($data = $r->getData()) && !empty($data) && is_array($data)) {
                 $result->setData($result->getData() + $data);
             }
         }
     }
     return $result;
 }
Exemplo n.º 30
0
 /**
  * Load shipment.
  *
  * @return Result
  */
 protected function loadShipment()
 {
     $result = new Result();
     if ($this->shipment === null) {
         $loadDelivery = false;
         $order = $this->getOrder();
         /** @var ShipmentCollection $orderShipmentList */
         $orderShipmentList = $order->getShipmentCollection();
         /** @var Shipment $shipment */
         if ($this->newOrder) {
             foreach ($orderShipmentList as $shipment) {
                 if ($shipment->isSystem()) {
                     continue;
                 }
                 if (!$loadDelivery) {
                     $this->shipment = $shipment;
                     $loadDelivery = true;
                 } else {
                     $result->addError(new Main\Entity\EntityError(Loc::getMessage('BX_SALE_DISCOUNT_ERR_TOO_MANY_SHIPMENT'), self::ERROR_ID));
                     return $result;
                 }
             }
         } else {
             $shipmentId = false;
             foreach ($orderShipmentList as $shipment) {
                 if ($shipment->isSystem()) {
                     continue;
                 }
                 $currentShipmentId = (int) $shipment->getId();
                 if ($shipmentId === false || $shipmentId > $currentShipmentId) {
                     $shipmentId = $currentShipmentId;
                 }
             }
             unset($currentShipmentId, $shipment);
             if (!empty($shipmentId)) {
                 $this->shipment = $orderShipmentList->getItemById($shipmentId);
                 $loadDelivery = true;
             }
             unset($shipmentId);
         }
     }
     return $result;
 }