public static function updateData(Order &$order, &$shipment, $shipmentBasket) { /**@var \Bitrix\Sale\Shipment $shipment */ $result = new Result(); $shippingItems = array(); $idsFromForm = array(); $basket = $order->getBasket(); $shipmentItemCollection = $shipment->getShipmentItemCollection(); if (is_null(self::$useStoreControl)) { self::$useStoreControl = Option::get('catalog', 'default_use_store_control', 'N') == 'Y'; } if (is_array($shipmentBasket)) { // PREPARE DATA FOR SET_FIELDS foreach ($shipmentBasket as $items) { if (isset($items['BASKET_ID']) && $items['BASKET_ID'] > 0) { $basketItem = $basket->getItemById($items['BASKET_ID']); /** @var \Bitrix\Sale\BasketItem $basketItem */ $basketCode = $basketItem->getBasketCode(); } else { $basketCode = $items['BASKET_CODE']; $basketItem = $basket->getItemByBasketCode($basketCode); } $tmp = array('BASKET_CODE' => $basketCode, 'AMOUNT' => $items['AMOUNT'], 'ORDER_DELIVERY_BASKET_ID' => $items['ORDER_DELIVERY_BASKET_ID']); $idsFromForm[$basketCode] = array(); if ($items['BARCODE_INFO'] && self::$useStoreControl) { foreach ($items['BARCODE_INFO'] as $item) { $tmp['BARCODE'] = array('ORDER_DELIVERY_BASKET_ID' => $items['ORDER_DELIVERY_BASKET_ID'], 'STORE_ID' => $item['STORE_ID'], 'QUANTITY' => $basketItem->isBarcodeMulti() ? 1 : $item['QUANTITY']); $barcodeCount = 0; if ($item['BARCODE']) { foreach ($item['BARCODE'] as $barcode) { $idsFromForm[$basketCode]['BARCODE_IDS'][$barcode['ID']] = true; if ($barcode['ID'] > 0) { $tmp['BARCODE']['ID'] = $barcode['ID']; } else { unset($tmp['BARCODE']['ID']); } $tmp['BARCODE']['BARCODE'] = $barcode['VALUE']; $shippingItems[] = $tmp; $barcodeCount++; } } if ($basketItem->isBarcodeMulti()) { while ($barcodeCount < $item['QUANTITY']) { unset($tmp['BARCODE']['ID']); $tmp['BARCODE']['BARCODE'] = ''; $shippingItems[] = $tmp; $barcodeCount++; } } // crutch $el = $basket->getItemByBasketCode($basketCode); if ($el->isBundleParent()) { unset($tmp['BARCODE']); $shippingItems[] = $tmp; } } } else { $shippingItems[] = $tmp; } } } // DELETE FROM COLLECTION /** @var \Bitrix\Sale\ShipmentItem $shipmentItem */ foreach ($shipmentItemCollection as $shipmentItem) { if (!array_key_exists($shipmentItem->getBasketCode(), $idsFromForm)) { /** @var Result $r */ $r = $shipmentItem->delete(); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } } $shipmentItemStoreCollection = $shipmentItem->getShipmentItemStoreCollection(); /** @var \Bitrix\Sale\ShipmentItemStore $shipmentItemStore */ foreach ($shipmentItemStoreCollection as $shipmentItemStore) { $shipmentItemId = $shipmentItemStore->getId(); if (!isset($idsFromForm[$shipmentItem->getBasketCode()]['BARCODE_IDS'][$shipmentItemId])) { $delResult = $shipmentItemStore->delete(); if (!$delResult->isSuccess()) { $result->addErrors($delResult->getErrors()); } } } } $isStartField = $shipmentItemCollection->isStartField(); // SET DATA foreach ($shippingItems as $shippingItem) { if ((int) $shippingItem['ORDER_DELIVERY_BASKET_ID'] <= 0) { $basketCode = $shippingItem['BASKET_CODE']; /** @var \Bitrix\Sale\Order $order */ $basketItem = $order->getBasket()->getItemByBasketCode($basketCode); /** @var \Bitrix\Sale\BasketItem $basketItem */ $shipmentItem = $shipmentItemCollection->createItem($basketItem); if ($shipmentItem === null) { $result->addError(new EntityError(Loc::getMessage('SALE_ORDER_SHIPMENT_BASKET_ERROR_ALREADY_SHIPPED'))); return $result; } unset($shippingItem['BARCODE']['ORDER_DELIVERY_BASKET_ID']); } else { $shipmentItem = $shipmentItemCollection->getItemById($shippingItem['ORDER_DELIVERY_BASKET_ID']); $basketItem = $shipmentItem->getBasketItem(); } if ($shipmentItem->getQuantity() < $shippingItem['AMOUNT']) { $order->setMathActionOnly(true); $setFieldResult = $shipmentItem->setField('QUANTITY', $shippingItem['AMOUNT']); $order->setMathActionOnly(false); if (!$setFieldResult->isSuccess()) { $result->addErrors($setFieldResult->getErrors()); } } if (!empty($shippingItem['BARCODE']) && self::$useStoreControl) { $barcode = $shippingItem['BARCODE']; /** @var \Bitrix\Sale\ShipmentItemStoreCollection $shipmentItemStoreCollection */ $shipmentItemStoreCollection = $shipmentItem->getShipmentItemStoreCollection(); if (!$basketItem->isBarcodeMulti()) { /** @var Result $r */ $r = $shipmentItemStoreCollection->setBarcodeQuantityFromArray($shipmentBasket[$basketItem->getId()]); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } } if (isset($barcode['ID']) && intval($barcode['ID']) > 0) { /** @var \Bitrix\Sale\ShipmentItemStore $shipmentItemStore */ if ($shipmentItemStore = $shipmentItemStoreCollection->getItemById($barcode['ID'])) { unset($barcode['ID']); $setFieldResult = $shipmentItemStore->setFields($barcode); if (!$setFieldResult->isSuccess()) { $result->addErrors($setFieldResult->getErrors()); } } } else { $shipmentItemStore = $shipmentItemStoreCollection->createItem($basketItem); $setFieldResult = $shipmentItemStore->setFields($barcode); if (!$setFieldResult->isSuccess()) { $result->addErrors($setFieldResult->getErrors()); } } } $setFieldResult = $shipmentItem->setField('QUANTITY', $shippingItem['AMOUNT']); if (!$setFieldResult->isSuccess()) { $result->addErrors($setFieldResult->getErrors()); } } if ($isStartField) { $hasMeaningfulFields = $shipmentItemCollection->hasMeaningfulField(); /** @var Result $r */ $r = $shipmentItemCollection->doFinalAction($hasMeaningfulFields); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } } return $result; }
/** * @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; }
function setValuesFromPost($post, $files) { $post = Input\File::getPostWithFiles($post, $files); $result = new Result(); /** @var PropertyValue $property */ foreach ($this->collection as $property) { $r = $property->setValueFromPost($post); 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; }
/** * @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; }
/** * @return Entity\Result|bool * @throws \Bitrix\Main\ArgumentException * @throws \Bitrix\Main\ArgumentNullException */ public function save() { $result = new Result(); /** @var Order $order */ $order = $this->getOrder(); $itemsFromDb = array(); $filter = array(); if (!$order) { /** @var Main\Entity\Event $event */ $event = new Main\Event('sale', EventActions::EVENT_ON_BASKET_BEFORE_SAVED, array('ENTITY' => $this)); $event->send(); if ($event->getResults()) { $result = new Result(); /** @var Main\EventResult $eventResult */ foreach ($event->getResults() as $eventResult) { if ($eventResult->getType() == Main\EventResult::ERROR) { $errorMsg = new ResultError(Main\Localization\Loc::getMessage('SALE_EVENT_ON_BEFORE_BASKET_SAVED'), 'SALE_EVENT_ON_BEFORE_BASKET_SAVED'); if (isset($eventResultData['ERROR']) && $eventResultData['ERROR'] instanceof ResultError) { $errorMsg = $eventResultData['ERROR']; } $result->addError($errorMsg); } } if (!$result->isSuccess()) { return $result; } } } $isNew = $order && $order->isNew() ? true : false; if ($order && !$isNew) { $filter['ORDER_ID'] = $order->getId(); } else { if ($this->isLoadForFuserId()) { $filter = array('FUSER_ID' => $this->getFUserId(), 'ORDER_ID' => null, 'LID' => $this->getSiteId()); } if ($isNew) { $fUserId = $this->getFUserId(true); if ($fUserId <= 0) { $userId = $order->getUserId(); if (intval($userId) > 0) { $fUserId = Fuser::getIdByUserId($userId); if ($fUserId > 0) { $this->setFUserId($fUserId); } } } } } if (!empty($filter)) { $itemsFromDbList = Internals\BasketTable::getList(array("filter" => $filter, "select" => array("ID", 'TYPE', 'SET_PARENT_ID', 'PRODUCT_ID', 'NAME', 'QUANTITY'))); while ($itemsFromDbItem = $itemsFromDbList->fetch()) { if (intval($itemsFromDbItem['SET_PARENT_ID']) > 0 && intval($itemsFromDbItem['SET_PARENT_ID']) != $itemsFromDbItem['ID']) { continue; } $itemsFromDb[$itemsFromDbItem["ID"]] = $itemsFromDbItem; } } /** @var BasketItem $basketItem */ foreach ($this->collection as $index => $basketItem) { $r = $basketItem->save(); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } if (isset($itemsFromDb[$basketItem->getId()]) && $basketItem->getQuantity() > 0) { unset($itemsFromDb[$basketItem->getId()]); } } if (!empty($filter)) { foreach ($itemsFromDb as $k => $v) { if ($v['TYPE'] == static::TYPE_SET) { Internals\BasketTable::deleteBundle($k); } else { Internals\BasketTable::deleteWithItems($k); } /** @var Order $order */ if ($order && $order->getId() > 0) { OrderHistory::addAction('BASKET', $order->getId(), 'BASKET_REMOVED', $k, null, array('NAME' => $v['NAME'], 'QUANTITY' => $v['QUANTITY'], 'PRODUCT_ID' => $v['PRODUCT_ID'])); } } } if ($order && $order->getId() > 0) { OrderHistory::collectEntityFields('BASKET', $order->getId()); } if (!$order) { /** @var Main\Entity\Event $event */ $event = new Main\Event('sale', EventActions::EVENT_ON_BASKET_SAVED, array('ENTITY' => $this)); $event->send(); if ($event->getResults()) { $result = new Result(); /** @var Main\EventResult $eventResult */ foreach ($event->getResults() as $eventResult) { if ($eventResult->getType() == Main\EventResult::ERROR) { $errorMsg = new ResultError(Main\Localization\Loc::getMessage('SALE_EVENT_ON_BASKET_SAVED'), 'SALE_EVENT_ON_BASKET_SAVED'); if (isset($eventResultData['ERROR']) && $eventResultData['ERROR'] instanceof ResultError) { $errorMsg = $eventResultData['ERROR']; } $result->addError($errorMsg); } } if (!$result->isSuccess()) { return $result; } } } return $result; }
/** * @return Result */ public function verify() { $result = new Result(); /** @var Basket $basket */ if ($basket = $this->getBasket()) { $r = $basket->verify(); if (!$r->isSuccess()) { if ($result instanceof ResultWarning) { $result->addWarnings($r->getErrors()); } else { $result->addErrors($r->getErrors()); } } } /** @var PaymentCollection $paymentCollection */ if ($paymentCollection = $this->getPaymentCollection()) { $r = $paymentCollection->verify(); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } } /** @var ShipmentCollection $shipmentCollection */ if ($shipmentCollection = $this->getShipmentCollection()) { $r = $shipmentCollection->verify(); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } } return $result; }
/** * @param BasketItem $basketItem * * @return Result * @throws Main\ArgumentOutOfRangeException * @throws Main\ObjectNotFoundException * @throws \ErrorException */ public function deleteByBasketItem(BasketItem $basketItem) { $result = new Result(); $systemShipmentItem = null; /** @var Shipment $shipment */ if (!($shipment = $this->getShipment())) { throw new Main\ObjectNotFoundException('Entity "Shipment" not found'); } /** @var ShipmentItem $shipmentItem */ foreach ($this->collection as $shipmentItem) { if ($shipmentItem->getBasketCode() == $basketItem->getBasketCode()) { if ($shipment->isSystem()) { $systemShipmentItem = $shipmentItem; continue; } $r = $shipmentItem->delete(); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } } } if ($systemShipmentItem !== null) { if ($systemShipmentItem->getReservedQuantity() > 0) { /** @var Result $r */ $r = $systemShipmentItem->tryUnreserve(); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } } if ($result->isSuccess()) { $shipmentItem->setFieldNoDemand('QUANTITY', 0); } } 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 array $formData * @param Order $order * @param int $userId * @param bool $createUserIfNeed * @param array $files * @param \Bitrix\Sale\Result $result * @return \Bitrix\Sale\Order * @throws SystemException * @throws \Bitrix\Main\ObjectNotFoundException */ public static function editOrderByFormData(array $formData, Order $order, $userId, $createUserIfNeed = true, array $files = array(), \Bitrix\Sale\Result &$result) { /** @var \Bitrix\Sale\Result $res */ $res = self::fillSimpleFields($order, $formData, $userId); if (!$res->isSuccess()) { $result->addErrors($res->getErrors()); } $propCollection = $order->getPropertyCollection(); $res = $propCollection->setValuesFromPost($formData, $files); if (!$res->isSuccess()) { $result->addErrors($res->getErrors()); } $order->setFieldNoDemand("USER_ID", self::getUserId($order, $formData, $createUserIfNeed, $result)); if (isset($formData["DISCOUNTS"]) && is_array($formData["DISCOUNTS"])) { $order->getDiscount()->setApplyResult($formData["DISCOUNTS"]); } //init basket $basket = $order->getBasket(); $itemsBasketCodes = array(); $productAdded = false; if (isset($formData["PRODUCT"]) && is_array($formData["PRODUCT"])) { /* for correct discounts work */ sortByColumn($formData["PRODUCT"], array("BASE_PRICE" => SORT_DESC, "PRICE" => SORT_DESC), '', null, true); foreach ($formData["PRODUCT"] as $basketCode => $productData) { if (!isset($productData["PROPS"])) { $productData["PROPS"] = array(); } $item = $basket->getExistsItem($productData["MODULE"], $productData["OFFER_ID"], $productData["PROPS"]); if ($item == null && $basketCode != "new") { $item = $basket->getItemByBasketCode($basketCode); } if ($item && $item->isBundleChild()) { continue; } if (!$item) { continue; } $itemsBasketCodes[] = $item->getBasketCode(); } } /** @var \Bitrix\Sale\BasketItem $item */ $basketItems = $basket->getBasketItems(); $res = new \Bitrix\Sale\Result(); foreach ($basketItems as $item) { if (!in_array($item->getBasketCode(), $itemsBasketCodes)) { $res = $item->delete(); if (!$res->isSuccess()) { $errMess = ""; foreach ($res->getErrors() as $error) { $errMess .= $error->getMessage() . "\n"; } if (strlen($errMess) <= 0) { $errMess = Loc::getMessage("SALE_ORDEREDIT_BASKET_ITEM_DEL_ERROR"); } $result->addError(new Error($errMess)); } } } if (isset($formData["PRODUCT"]) && is_array($formData["PRODUCT"])) { $isStartField = $order->isStartField(); foreach ($formData["PRODUCT"] as $basketCode => $productData) { if ($productData["IS_SET_ITEM"] == "Y") { continue; } if (!isset($productData["PROPS"]) || !is_array($productData["PROPS"])) { $productData["PROPS"] = array(); } $item = $basket->getExistsItem($productData["MODULE"], $productData["OFFER_ID"], $productData["PROPS"]); if ($item == null && $basketCode != "new") { $item = $basket->getItemByBasketCode($basketCode); } if ($item && $item->isBundleChild()) { $item = null; } if (!$item) { $setBasketCode = $basketCode != "new" ? $basketCode : null; $item = $basket->createItem($productData["MODULE"], $productData["OFFER_ID"], $setBasketCode); if ($basketCode != $productData["BASKET_CODE"]) { $productData["BASKET_CODE"] = $item->getBasketCode(); } $needDataUpdate = false; if ($basketCode == "new") { $result->setData(array("NEW_ITEM_BASKET_CODE" => $productData["BASKET_CODE"])); $needDataUpdate = true; } $res = self::fillBasketItem($item, $productData, $order, $basket, $needDataUpdate); if (!$res->isSuccess()) { $result->addErrors($res->getErrors()); } if (!$productAdded) { $productAdded = true; } } else { if ($basketCode != $productData["BASKET_CODE"]) { $productData["BASKET_CODE"] = $item->getBasketCode(); } if (isset($productData["OFFER_ID"]) || intval($productData["OFFER_ID"]) >= 0) { $productData["PRODUCT_ID"] = $productData["OFFER_ID"]; } $itemFields = array_intersect_key($productData, array_flip($item::getAvailableFields())); if (isset($itemFields["MEASURE_CODE"]) && strlen($itemFields["MEASURE_CODE"]) > 0) { $measures = OrderBasket::getCatalogMeasures(); if (isset($measures[$itemFields["MEASURE_CODE"]]) && strlen($measures[$itemFields["MEASURE_CODE"]]) > 0) { $itemFields["MEASURE_NAME"] = $measures[$itemFields["MEASURE_CODE"]]; } } //Let's extract cached provider product data from field if (!empty($productData["PROVIDER_DATA"])) { $providerData = unserialize($productData["PROVIDER_DATA"]); if (is_array($providerData) && !empty($providerData)) { self::setProviderTrustData($item, $order, $providerData); } } if (!empty($productData["SET_ITEMS_DATA"])) { $productData["SET_ITEMS"] = unserialize($productData["SET_ITEMS_DATA"]); } /** @var \Bitrix\Sale\Result $res */ $res = self::setBasketItemFields($item, $itemFields); if (!$res->isSuccess()) { $result->addErrors($res->getErrors()); } } if (!empty($productData["PROPS"]) && is_array($productData["PROPS"])) { /** @var \Bitrix\Sale\BasketPropertiesCollection $property */ $property = $item->getPropertyCollection(); $property->setProperty($productData["PROPS"]); } } if ($isStartField) { $hasMeaningfulFields = $order->hasMeaningfulField(); /** @var Result $r */ $r = $order->doFinalAction($hasMeaningfulFields); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } } if (isset($formData["DISCOUNTS"]) && is_array($formData["DISCOUNTS"])) { $order->getDiscount()->setApplyResult($formData["DISCOUNTS"]); } } else { $result->addError(new EntityError(Loc::getMessage("SALE_ORDEREDIT_ERROR_NO_PRODUCTS"))); } if (!$res->isSuccess()) { $result->addErrors($res->getErrors()); } if ($productAdded) { $res = $basket->refreshData(array('PRICE', 'BASE_PRICE', 'QUANTITY', 'COUPONS')); if (!$res->isSuccess()) { $result->addErrors($res->getErrors()); } } return $order; }
/** * @param Order $order * @param array $formData * @param int $userId * * @return \Bitrix\Sale\Result */ protected static function fillSimpleFields(Order $order, array $formData, $userId = 0) { $result = new \Bitrix\Sale\Result(); if (isset($formData["ORDER"]["RESPONSIBLE_ID"])) { /** @var \Bitrix\Sale\Result $r */ $r = $order->setField("RESPONSIBLE_ID", $formData["ORDER"]["RESPONSIBLE_ID"]); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } } if (isset($formData["PERSON_TYPE_ID"]) && intval($formData["PERSON_TYPE_ID"]) > 0) { /** @var \Bitrix\Sale\Result $r */ $r = $order->setPersonTypeId(intval($formData['PERSON_TYPE_ID'])); } else { /** @var \Bitrix\Sale\Result $r */ $r = $order->setPersonTypeId(Blocks\OrderBuyer::getDefaultPersonType($order->getSiteId())); } if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } if (isset($formData["ORDER"]["COMMENTS"])) { /** @var \Bitrix\Sale\Result $r */ $r = $order->setField("COMMENTS", $formData["ORDER"]["COMMENTS"]); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } } if (isset($formData["USER_DESCRIPTION"])) { /** @var \Bitrix\Sale\Result $r */ $r = $order->setField("USER_DESCRIPTION", $formData["USER_DESCRIPTION"]); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } } if (isset($formData["RESPONSIBLE_ID"])) { /** @var \Bitrix\Sale\Result $r */ $r = $order->setField("RESPONSIBLE_ID", $formData["RESPONSIBLE_ID"]); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } } if (isset($formData["STATUS_ID"]) && strlen($formData["STATUS_ID"]) > 0) { $statusesList = \Bitrix\Sale\OrderStatus::getAllowedUserStatuses($userId, \Bitrix\Sale\OrderStatus::getInitialStatus()); if (array_key_exists($formData["STATUS_ID"], $statusesList)) { /** @var \Bitrix\Sale\Result $r */ $r = $order->setField("STATUS_ID", $formData["STATUS_ID"]); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } } } return $result; }
/** * @param StatusChangeEventParam[] $params * @return Result * @throws ArgumentNullException * @throws \Bitrix\Main\NotSupportedException */ protected function processStatusChange($params) { $result = new Result(); foreach ($params as $param) { if (intval($param->status) <= 0) { continue; } $mappedStatuses = $this->getMappedStatuses(); if (!empty($mappedStatuses[$param->status])) { /** @var Order $order */ $order = Order::load($param->orderId); /** @var \Bitrix\Sale\ShipmentCollection $shipmentCollection */ $shipmentCollection = $order->getShipmentCollection(); /** @var Shipment $oShipment */ $oShipment = $shipmentCollection->getItemById($param->shipmentId); $res = $oShipment->setField('STATUS_ID', $mappedStatuses[$param->status]); if ($res->isSuccess()) { $res = $order->save(); if (!$res->isSuccess()) { $result->addErrors($res->getErrors()); } } else { $result->addErrors($res->getErrors()); } } } $this->sendOnStatusesChangedEvent($params); 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; }
/** * Execute sale discount list. * * @return Result */ protected function executeDiscountList() { $result = new Result(); $this->discountIds = array(); if (empty($this->saleDiscountCacheKey)) { return $result; } if (empty($this->saleDiscountCache[$this->saleDiscountCacheKey])) { return $result; } $currentList = $this->saleDiscountCache[$this->saleDiscountCacheKey]; $this->discountIds = array_keys($currentList); $this->extendOrderData(); foreach ($currentList as &$discount) { $this->fillCurrentStep(array('discount' => $discount)); if (!self::checkDiscountConditions()) { continue; } $actionsResult = $this->applySaleDiscount(); if (!$actionsResult->isSuccess()) { $result->addErrors($actionsResult->getErrors()); unset($actionsResult); return $result; } if ($this->currentStep['stop']) { break; } } unset($discount, $currentList); $this->fillEmptyCurrentStep(); return $result; }
/** * @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; }
/** * */ public function save() { $result = new Sale\Result(); $itemsFromDb = array(); $itemsFromDbList = Internals\BasketPropertyTable::getList(array("filter" => array("BASKET_ID" => $this->getBasketItem()->getId()), "select" => array("ID"))); while ($itemsFromDbItem = $itemsFromDbList->fetch()) { $itemsFromDb[$itemsFromDbItem["ID"]] = true; } /** @var BasketPropertyItem $basketProperty */ foreach ($this->collection as $basketProperty) { $r = $basketProperty->save(); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } if (isset($itemsFromDb[$basketProperty->getId()])) { unset($itemsFromDb[$basketProperty->getId()]); } } foreach ($itemsFromDb as $k => $v) { Internals\BasketPropertyTable::delete($k); } return $result; }
/** * @return Main\Entity\AddResult|Main\Entity\UpdateResult * @throws Main\ArgumentNullException * @throws Main\ArgumentOutOfRangeException * @throws \Exception */ public function save() { global $USER; $result = new Result(); $id = $this->getId(); $fields = $this->fields->getValues(); /** @var ShipmentItemStoreCollection $collection */ $collection = $this->getCollection(); /** @var Result $r */ $r = $collection->checkAvailableQuantity($this); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); return $result; } /** @var BasketItem $basketItem */ $basketItem = $this->getBasketItem(); if ($id > 0) { $fields = $this->fields->getChangedValues(); if (!empty($fields) && is_array($fields)) { if (isset($fields["QUANTITY"]) && floatval($fields["QUANTITY"]) <= 0) { throw new Main\ArgumentNullException('quantity'); } $fields['DATE_MODIFY'] = new Main\Type\DateTime(); $fields['MODIFIED_BY'] = $USER->GetID(); $r = Internals\ShipmentItemStoreTable::update($id, $fields); if (!$r->isSuccess()) { return $r; } } $result = new Main\Entity\UpdateResult(); } else { if (!isset($fields["ORDER_DELIVERY_BASKET_ID"])) { $fields['ORDER_DELIVERY_BASKET_ID'] = $this->getParentShipmentItemId(); } if (!isset($fields["BASKET_ID"])) { $fields['BASKET_ID'] = $basketItem->getId(); } $fields['DATE_CREATE'] = new Main\Type\DateTime(); if (!isset($fields["QUANTITY"]) || floatval($fields["QUANTITY"]) == 0) { return new Main\Entity\AddResult(); } if ($basketItem->isBarcodeMulti() && isset($fields['BARCODE']) && strval(trim($fields['BARCODE'])) == "") { $result->addError(new ResultError(Loc::getMessage('SHIPMENT_ITEM_STORE_BARCODE_MULTI_EMPTY', array('#PRODUCT_NAME#' => $basketItem->getField('NAME'), '#STORE_ID#' => $fields['STORE_ID'])), 'SHIPMENT_ITEM_STORE_BARCODE_MULTI_EMPTY')); return $result; } $r = Internals\ShipmentItemStoreTable::add($fields); if (!$r->isSuccess()) { return $r; } $id = $r->getId(); $this->setFieldNoDemand('ID', $id); $result = new Main\Entity\AddResult(); } return $result; }
/** * @param array $values * @return Result * @throws Main\ArgumentOutOfRangeException * @throws \Exception */ public function setBarcodeQuantityFromArray(array $values) { $result = new Result(); $requestBarcodeList = static::getBarcodeListFromArray($values); $plusList = array(); $oldQuantityList = $this->getAllBarcodeList(); foreach ($requestBarcodeList as $storeId => $barcodeDat) { foreach ($barcodeDat as $barcodeValue => $barcode) { if (isset($oldQuantityList[$storeId][$barcodeValue]) && $oldQuantityList[$storeId][$barcodeValue]['ID'] == $barcode['ID']) { $oldBarcode = $oldQuantityList[$storeId][$barcodeValue]; if ($barcode['QUANTITY'] == $oldBarcode['QUANTITY']) { continue; } elseif ($barcode['QUANTITY'] < $oldBarcode['QUANTITY']) { /** @var ShipmentItemStore $item */ $item = $this->getItemById($oldBarcode['ID']); if ($item) { $item->setField('QUANTITY', $barcode['QUANTITY']); } } else { $plusList[$barcodeValue] = array('ID' => $barcode['ID'], 'QUANTITY' => $barcode['QUANTITY']); } } } } foreach ($plusList as $barcode) { $item = $this->getItemById($barcode['ID']); if ($item) { /** @var Result $r */ $r = $item->setField('QUANTITY', $barcode['QUANTITY']); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } } } return $result; }
/** * @internal */ public function refreshVat() { $result = new Result(); if (($basket = $this->getBasket()) && count($basket) > 0) { $this->resetVat(); $basketVatRate = $basket->getVatRate(); if ($basketVatRate > 0) { /** @var Result $r */ $r = $this->setField('USE_VAT', 'Y'); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } /** @var Result $r */ $r = $this->setField('VAT_RATE', $basketVatRate); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } /** @var Result $r */ $r = $this->setField('VAT_SUM', $basket->getVatSum()); 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; } $r = Sale\Order::delete($id); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } return $result; }
/** * @return bool * @throws Main\NotSupportedException * @throws Main\SystemException */ public static function tryUnship() { // throw new Main\NotImplementedException(); // if ($result = Provider::tryShipment($this)) // { // //$shipped = false; // foreach ($result as $resultDat) // { // if ($resultDat['RESULT'] === false) // { // throw new Main\SystemException('wrong shipment'); // } // } // } // return true; $result = new Result(); /** @var Result $r */ $r = Provider::tryShipment($this); if ($r->isSuccess()) { $resultList = $r->getData(); if (!empty($resultList) && is_array($resultList)) { /** @var Result $resultDat */ foreach ($resultList as $resultDat) { if (!$resultDat->isSuccess()) { $result->addErrors($resultDat->getErrors()); } } } } return $result; }
/** * @param BasketItem $basketItem * @param $quantity * @return float|int|null * @throws NotSupportedException */ protected static function tryReserveBasketItem(BasketItem $basketItem, $quantity) { $result = new Result(); $provider = $basketItem->getProvider(); if (!$basketItem->isBundleChild()) { /** @var Basket $basket */ $basket = $basketItem->getCollection(); } else { /** @var BasketItem $parentBasketItem */ $parentBasketItem = $basketItem->getParentBasketItem(); /** @var Basket $basket */ $basket = $parentBasketItem->getCollection(); } $order = $basket->getOrder(); $hasProvider = false; $quantityTrace = null; $poolQuantity = static::getReservationPoolItem($order->getInternalId(), $basketItem); $tryQuantity = $quantity + $poolQuantity; if ($provider instanceof Provider) { throw new NotSupportedException('provider not supported'); } elseif ($provider && array_key_exists("IBXSaleProductProvider", class_implements($provider))) { $hasProvider = true; $r = static::checkAvailableProductQuantity($basketItem, $tryQuantity); if ($r->isSuccess()) { $availableQuantityData = $r->getData(); if (array_key_exists('AVAILABLE_QUANTITY', $availableQuantityData)) { $availableQuantity = $availableQuantityData['AVAILABLE_QUANTITY']; } else { $result->addError(new ResultError(Loc::getMessage('PROVIDER_RESERVE_BASKET_ITEM_WRONG_AVAILABLE_QUANTITY'), 'PROVIDER_RESERVE_BASKET_ITEM_WRONG_AVAILABLE_QUANTITY')); return $result; } if (array_key_exists('QUANTITY_TRACE', $availableQuantityData)) { $quantityTrace = $availableQuantityData['QUANTITY_TRACE']; } // } else { $result->addErrors($r->getErrors()); return $result; } $availableQuantity -= $poolQuantity; } else { $availableQuantity = $quantity; } $fields = array('AVAILABLE_QUANTITY' => $availableQuantity, 'HAS_PROVIDER' => $hasProvider); if ($quantityTrace !== null) { $fields['QUANTITY_TRACE'] = $quantityTrace; } $result->setData($fields); 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; }
/** * Convert discount for saving in order. * * @param array $discount Raw discount data. * @return Sale\Result */ protected static function convertDiscount($discount) { $result = new Sale\Result(); $discountResult = Sale\OrderDiscountManager::saveDiscount($discount, false); if (!$discountResult->isSuccess()) { $result->addErrors($discountResult->getErrors()); unset($discountResult); return $result; } $orderDiscountId = $discountResult->getId(); $discountData = $discountResult->getData(); $resultData = array('ORDER_DISCOUNT_ID' => $orderDiscountId, 'USE_COUPONS' => $discountData['USE_COUPONS'], 'MODULE_ID' => $discountData['MODULE_ID']); if (!isset(self::$discountsCache[$orderDiscountId])) { $discountData['ACTIONS_DESCR_DATA'] = false; if (!empty($discountData['ACTIONS_DESCR']) && is_array($discountData['ACTIONS_DESCR'])) { $discountData['ACTIONS_DESCR_DATA'] = $discountData['ACTIONS_DESCR']; $discountData['ACTIONS_DESCR'] = self::formatDescription($discountData['ACTIONS_DESCR']); } else { $discountData['ACTIONS_DESCR'] = false; } if (empty($discountData['ACTIONS_DESCR'])) { $discountData['ACTIONS_DESCR'] = false; $discountData['ACTIONS_DESCR_DATA'] = false; } self::$discountsCache[$orderDiscountId] = $discountData; } $result->setId($orderDiscountId); $result->setData($resultData); unset($discountData, $resultData, $orderDiscountId); return $result; }
/** * Data synchronization basket and shipment * * @internal * * @param Sale\ShipmentCollection $shipmentCollection Entity shipment collection. * @param Sale\Basket $basket Entity basket. * * @return Sale\Result * @throws \Bitrix\Main\ArgumentTypeException * @throws \Bitrix\Main\ObjectNotFoundException */ public static function syncShipmentCollectionAndBasket(Sale\ShipmentCollection $shipmentCollection, Sale\Basket $basket) { $result = new Sale\Result(); if (count($shipmentCollection) > 2) { return $result; } /** @var Sale\Order $order */ if (!($order = $shipmentCollection->getOrder())) { throw new Main\ObjectNotFoundException('Entity "Order" not found'); } $baseShipment = null; $shipmentCollection->setMathActionOnly(true); if (count($shipmentCollection) == 1 && $shipmentCollection->isExistsSystemShipment()) { /** @var Sale\Shipment $systemShipment */ if (!($systemShipment = $shipmentCollection->getSystemShipment())) { throw new Main\ObjectNotFoundException('Entity system "Shipment" not found'); } $shipment = $shipmentCollection->createItem(); $r = $shipmentCollection->cloneShipment($systemShipment, $shipment); if (!$r->isSuccess()) { return $r; } } /** @var Sale\Shipment $shipment */ foreach ($shipmentCollection as $shipment) { if ($shipment->isSystem() || $shipment->isShipped()) { continue; } /** @var Sale\BasketItem $basketItem */ foreach ($basket as $basketItem) { $shipmentItemCollection = $shipment->getShipmentItemCollection(); if (!($shipmentItem = $shipmentItemCollection->getItemByBasketCode($basketItem->getBasketCode()))) { $shipmentItem = $shipmentItemCollection->createItem($basketItem); } if (!$shipmentItem) { continue; } /** @var Sale\Result $r */ $r = $shipmentItem->setQuantity($basketItem->getQuantity()); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } } break; } $shipmentCollection->setMathActionOnly(false); return $result; }
/** * @param $value * @return Result * @throws Main\ArgumentOutOfRangeException * @throws Main\ObjectNotFoundException * @throws \Exception */ public function setReturn($value) { $result = new Result(); if ($value == "Y") { if ($this->isReturn()) { return new Result(); } } elseif ($value == "N") { if (!$this->isReturn()) { return new Result(); } } else { throw new Main\ArgumentOutOfRangeException('value'); } /** @var Result $r */ $r = $this->setField('IS_RETURN', $value); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } return $result; }
/** * @return Result * @throws Main\ObjectNotFoundException */ public function delete() { $result = new Result(); /** @var Result $r */ $r = $this->setField("QUANTITY", 0); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); return $result; } return parent::delete(); }
/** * @return Result * @throws Main\NotSupportedException */ protected function calculateDelivery() { $result = new Result(); /** @var ShipmentItemCollection $collection */ $collection = $this->getCollection(); /** @var Shipment $shipment */ $shipment = $collection->getShipment(); /** @var ShipmentCollection $shipmentCollection */ $shipmentCollection = $shipment->getCollection(); /** @var Order $order */ $order = $shipmentCollection->getOrder(); if ($order->getId() > 0) { return $result; } $deliveryCalculate = $shipment->calculateDelivery(); if (!$deliveryCalculate->isSuccess()) { $result->addErrors($deliveryCalculate->getErrors()); } if ($deliveryCalculate->getPrice() > 0) { $shipment->setField('BASE_PRICE_DELIVERY', $deliveryCalculate->getPrice()); } return $result; }
/** * * @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; }
/** * @return Result */ public function verify() { $result = new Result(); /** @var BasketItem $basketItem */ foreach ($this->collection as $basketItem) { $r = $basketItem->verify(); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } } return $result; }