/** * @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; }
/** * 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; }
/** * @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; }
/** * @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; }
/** * */ 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; }
/** * 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; }
/** * @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; }
/** * @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; }
/** * @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; }
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; }
/** * @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; }
/** * @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; }
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; }
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; }
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); }
/** * @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; }
/** * @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; }
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; }
/** * @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; }
/** * @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; }
/** * @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; }
/** * @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; }
/** * 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; }
/** * @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; }
/** * @param $message */ public function addResultError($message) { $this->result->addError(new EntityError($message)); }
/** * @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; }
/** * @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); }
/** * * @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; }
/** * 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; }