/** * * @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; }
/** * @param $id * @return Sale\Result * @throws \Bitrix\Main\ArgumentException * @throws \Bitrix\Main\ArgumentNullException * @throws \Bitrix\Main\ObjectNotFoundException */ public static function delete($id) { $result = new Sale\Result(); $item = null; $basket = null; $order = null; $res = BasketTable::getList(array('filter' => array('ID' => $id), 'select' => array('ID', 'ORDER_ID', 'SET_PARENT_ID', 'TYPE', 'FUSER_ID', 'LID'))); if (!($itemDat = $res->fetch())) { $result->addError(new Sale\ResultError(Main\Localization\Loc::getMessage('SALE_BASKET_COMPATIBLE_BASKET_ITEM_NOT_FOUND'), 'BASKET_ITEM_NOT_FOUND')); return $result; } if (intval($itemDat['ORDER_ID']) > 0) { /** @var Sale\Order $order */ if ($order = Sale\Order::load(intval($itemDat['ORDER_ID']))) { if ($basket = $order->getBasket()) { /** @var Sale\BasketItem $item */ $item = $basket->getItemById($id); } } } else { if (!array_key_exists('FUSER_ID', $itemDat) || intval($itemDat['FUSER_ID']) <= 0) { $itemDat['FUSER_ID'] = Sale\Fuser::getId(); } /** @var Sale\Basket $basket */ if ($basket = Sale\Basket::loadItemsForFUser($itemDat["FUSER_ID"], $itemDat['LID'])) { /** @var Sale\BasketItem $item */ $item = $basket->getItemById($id); } } if ($basket === null) { $result->addError(new Sale\ResultError(Main\Localization\Loc::getMessage('SALE_BASKET_COMPATIBLE_BASKET_COLLECTION_NOT_FOUND'), 'BASKET_COLLECTION_NOT_FOUND')); return $result; } if ($item === null) { $result->addError(new Sale\ResultError(Main\Localization\Loc::getMessage('SALE_BASKET_COMPATIBLE_BASKET_ITEM_PROPS_NOT_FOUND'), 'BASKET_ITEM_PROPS_NOT_FOUND')); return $result; } /** @var Sale\Result $r */ $r = $item->delete(); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } if ($order !== null) { if (!$result->isSuccess()) { return $result; } /** @var Sale\Result $r */ $r = $order->save(); } else { if (!$result->isSuccess()) { return $result; } /** @var Sale\Result $r */ $r = $basket->save(); } 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; }
/** * @return Entity\AddResult|Entity\UpdateResult * @throws ArgumentException * @throws ArgumentNullException * @throws \Exception */ public function save() { $id = $this->getId(); $changedFields = $this->fields->getChangedValues(); $isNew = $id <= 0; if (!empty($changedFields)) { /** @var array $oldEntityValues */ $oldEntityValues = $this->fields->getOriginalValues(); /** @var Event $event */ $event = new Event('sale', EventActions::EVENT_ON_BASKET_ITEM_BEFORE_SAVED, array('ENTITY' => $this, 'IS_NEW' => $isNew, 'VALUES' => $oldEntityValues)); $event->send(); if ($event->getResults()) { $result = new Result(); /** @var EventResult $eventResult */ foreach ($event->getResults() as $eventResult) { if ($eventResult->getType() == EventResult::ERROR) { $errorMsg = new ResultError(Loc::getMessage('SALE_EVENT_ON_BEFORE_BASKET_ITEM_SAVED'), 'SALE_EVENT_ON_BEFORE_BASKET_ITEM_SAVED'); if (isset($eventResultData['ERROR']) && $eventResultData['ERROR'] instanceof ResultError) { $errorMsg = $eventResultData['ERROR']; } $result->addError($errorMsg); } } if (!$result->isSuccess()) { return $result; } } } $fields = $this->fields->getValues(); if ($this->isBundleParent()) { $bundleBasketCollection = $this->getBundleCollection(); } if ($id > 0) { $fields = $changedFields; if (!isset($fields["ORDER_ID"]) || intval($fields["ORDER_ID"]) == 0) { $orderId = null; if ($this->getParentOrderId() > 0) { $orderId = $this->getParentOrderId(); } if ($this->isBundleChild() && $orderId === null) { /** @var BasketItem $parentBasket */ if (!($parentBasket = $this->getParentBasketItem())) { throw new ObjectNotFoundException('Entity parent "BasketItem" not found'); } $orderId = $parentBasket->getParentOrderId(); } if (intval($orderId) > 0 && $this->getField('ORDER_ID') != $orderId) { $fields['ORDER_ID'] = $orderId; } } if (!empty($fields) && is_array($fields)) { if (isset($fields["QUANTITY"]) && floatval($fields["QUANTITY"]) == 0) { return new Entity\UpdateResult(); } $fields['DATE_UPDATE'] = new DateTime(); $this->setFieldNoDemand('DATE_UPDATE', $fields['DATE_UPDATE']); $r = Internals\BasketTable::update($id, $fields); if (!$r->isSuccess()) { return $r; } } $result = new Entity\UpdateResult(); } else { $fields['ORDER_ID'] = $this->getParentOrderId(); $fields['DATE_INSERT'] = new DateTime(); $fields['DATE_UPDATE'] = new DateTime(); $this->setFieldNoDemand('DATE_INSERT', $fields['DATE_INSERT']); $this->setFieldNoDemand('DATE_UPDATE', $fields['DATE_UPDATE']); if (!$this->isBundleChild() && (!isset($fields["FUSER_ID"]) || intval($fields["FUSER_ID"]) <= 0)) { /** @var Basket $basket */ if (!($basket = $this->getCollection())) { throw new ObjectNotFoundException('Entity "Basket" not found'); } $fields["FUSER_ID"] = intval($basket->getFUserId()); } /** @var Basket $basket */ if (!($basket = $this->getCollection())) { throw new ObjectNotFoundException('Entity "Basket" not found'); } /** @var Order $order */ if ($order = $basket->getOrder()) { if (!isset($fields["LID"]) || strval($fields["LID"]) == '') { $fields['LID'] = $order->getField('LID'); } } else { if ($siteId = $basket->getSiteId()) { $fields['LID'] = $siteId; } } if ($this->isBundleChild()) { if (!($parentBasketItem = $this->getParentBasketItem())) { throw new ObjectNotFoundException('Entity parent "BasketItem" not found'); } $fields['LID'] = $parentBasketItem->getField('LID'); if (!isset($fields["FUSER_ID"]) || intval($fields["FUSER_ID"]) <= 0) { $fields['FUSER_ID'] = intval($parentBasketItem->getField('FUSER_ID')); } } if (!isset($fields["LID"]) || strval(trim($fields["LID"])) == '') { throw new ArgumentNullException('lid'); } if ($this->isBundleChild() && (!isset($fields["SET_PARENT_ID"]) || intval($fields["QUANTITY"]) <= 0)) { $fields["SET_PARENT_ID"] = $this->getParentBasketItemId(); $this->setFieldNoDemand('SET_PARENT_ID', $fields['SET_PARENT_ID']); } if (!isset($fields["QUANTITY"]) || floatval($fields["QUANTITY"]) == 0) { return new Entity\AddResult(); } if (!isset($fields["CURRENCY"]) || strval(trim($fields["CURRENCY"])) == '') { throw new ArgumentNullException('currency'); } $r = Internals\BasketTable::add($fields); if (!$r->isSuccess()) { return $r; } $id = $r->getId(); $this->setFieldNoDemand('ID', $id); $this->setFieldNoDemand('LID', $fields['LID']); $this->setFieldNoDemand('FUSER_ID', $fields['FUSER_ID']); if ($basket->getOrder() && $basket->getOrderId() > 0) { OrderHistory::addAction('BASKET', $order->getId(), 'BASKET_ADDED', $id, $this); } $result = new Entity\AddResult(); } if ($isNew || !empty($changedFields)) { /** @var array $oldEntityValues */ $oldEntityValues = $this->fields->getOriginalValues(); /** @var Event $event */ $event = new Event('sale', EventActions::EVENT_ON_BASKET_ITEM_SAVED, array('ENTITY' => $this, 'IS_NEW' => $isNew, 'VALUES' => $oldEntityValues)); $event->send(); if ($event->getResults()) { $result = new Result(); /** @var EventResult $eventResult */ foreach ($event->getResults() as $eventResult) { if ($eventResult->getType() == EventResult::ERROR) { $errorMsg = new ResultError(Loc::getMessage('SALE_EVENT_ON_BEFORE_BASKET_ITEM_SAVED'), 'SALE_EVENT_ON_BEFORE_BASKET_ITEM_SAVED'); if (isset($eventResultData['ERROR']) && $eventResultData['ERROR'] instanceof ResultError) { $errorMsg = $eventResultData['ERROR']; } $result->addError($errorMsg); } } if (!$result->isSuccess()) { return $result; } } } if ($eventName = static::getEntityEventName()) { /** @var array $oldEntityValues */ $oldEntityValues = $this->fields->getOriginalValues(); if (!empty($oldEntityValues)) { /** @var Event $event */ $event = new Event('sale', 'On' . $eventName . 'EntitySaved', array('ENTITY' => $this, 'VALUES' => $oldEntityValues)); $event->send(); } } $this->fields->clearChanged(); // bundle if ($this->isBundleParent()) { if (!empty($bundleBasketCollection)) { if (!($order = $bundleBasketCollection->getOrder())) { /** @var Basket $basketCollection */ $basketCollection = $this->getCollection(); if ($order = $basketCollection->getOrder()) { $bundleBasketCollection->setOrder($order); } } $itemsFromDb = array(); if (!$isNew) { $itemsFromDbList = Internals\BasketTable::getList(array("filter" => array("SET_PARENT_ID" => $id), "select" => array("ID"))); while ($itemsFromDbItem = $itemsFromDbList->fetch()) { if ($itemsFromDbItem["ID"] == $id) { continue; } $itemsFromDb[$itemsFromDbItem["ID"]] = true; } } /** @var BasketItem $bundleBasketItem */ foreach ($bundleBasketCollection as $bundleBasketItem) { $r = $bundleBasketItem->save(); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } if (isset($itemsFromDb[$bundleBasketItem->getId()])) { unset($itemsFromDb[$bundleBasketItem->getId()]); } } foreach ($itemsFromDb as $k => $v) { Internals\BasketTable::delete($k); } } } /** @var BasketPropertiesCollection $basketPropertyCollection */ $basketPropertyCollection = $this->getPropertyCollection(); $r = $basketPropertyCollection->save(); 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; }
/** * @param $orderId * @param array $values * @param bool $withdraw * @param bool $pay * @return Sale\Result * @throws Main\ObjectNotFoundException * @throws \Bitrix\Main\ArgumentNullException */ public static function pay($orderId, array $values, $withdraw = false, $pay = false) { $result = new Sale\Result(); $paid = null; if (isset($values['PAYED']) && strval($values['PAYED']) != '') { $values['PAID'] = $values['PAYED']; } if (intval($orderId) <= 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($orderId))) { $result->addError(new Sale\ResultError(Main\Localization\Loc::getMessage('SALE_COMPATIBLE_ORDER_NOT_FOUND'), 'SALE_COMPATIBLE_ORDER_NOT_FOUND')); return $result; } if ($order->isCanceled()) { /** @var Sale\Result $r */ $r = $order->setField('CANCELED', 'N'); if (!$r->isSuccess()) { return $r; } } /** @var Sale\PaymentCollection $paymentCollection */ if (!($paymentCollection = $order->getPaymentCollection())) { throw new Main\ObjectNotFoundException('Entity "PaymentCollection" not found'); } $paidFormUserBudget = false; if ($withdraw) { /** @var Sale\Result $r */ $r = static::payFromBudget($order, $pay); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } else { $payBudgetData = $r->getData(); if (array_key_exists('PAID_FROM_BUDGET', $payBudgetData)) { $paidFormUserBudget = $payBudgetData['PAID_FROM_BUDGET']; } } } if (!$paidFormUserBudget) { /** @var Sale\Payment $payment */ foreach ($paymentCollection as $payment) { if (empty($fields)) { if (isset($values['=DATE_PAYED'])) { $values['DATE_PAID'] = $values['=DATE_PAYED']; unset($values['=DATE_PAYED']); } $values = static::convertDateFields($values, static::getPaymentDateFields()); $fields = static::clearFields($values, $payment->getAvailableFields()); } if ($values['PAID'] == "N" && !$payment->isPaid()) { continue; } if ($withdraw && $values['PAID'] == "N" && $payment->isInner()) { /** @var Sale\Result $r */ $r = $payment->setReturn('Y'); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } } else { $oldPaid = $payment->isPaid(); /** @var Sale\Result $r */ $r = $payment->setPaid($values['PAID']); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } if ($payment->isInner() && !$oldPaid && $payment->isPaid()) { Sale\Internals\UserBudgetPool::addPoolItem($order, $payment->getSum() * -1, Sale\Internals\UserBudgetPool::BUDGET_TYPE_ORDER_UNPAY, $payment); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } } } if (isset($fields['PAID'])) { unset($fields['PAID']); } $r = $payment->setFields($fields); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } } } if (!$result->isSuccess()) { return $result; } /** @var Sale\Result $r */ $r = $order->save(); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } return $result; }
/** * @param Shipment $shipment * @return array * @throws NotSupportedException */ public static function tryShipment(Shipment $shipment) { $result = new Result(); $needShip = $shipment->needShip(); if ($needShip === null) { return $result; } $resultList = array(); $storeData = array(); $shipmentItemCollection = $shipment->getShipmentItemCollection(); $basketList = static::getBasketFromShipmentItemCollection($shipmentItemCollection); $bundleIndexList = static::getBundleIndexFromShipmentItemCollection($shipmentItemCollection); $basketCountList = static::getBasketCountFromShipmentItemCollection($shipmentItemCollection); $basketProviderMap = static::createProviderBasketMap($basketList, array('RESERVED', 'SITE_ID')); $basketProviderList = static::redistributeToProviders($basketProviderMap); if (Configuration::useStoreControl()) { /** @var Result $r */ $r = static::getStoreDataFromShipmentItemCollection($shipmentItemCollection); if ($r->isSuccess()) { $storeData = $r->getData(); } else { $result->addErrors($r->getErrors()); } } 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; } $resultProduct = new Result(); $quantity = 0; $basketStoreData = array(); if (Configuration::useStoreControl()) { $quantity = $basketCountList[$providerBasketItem['BASKET_CODE']]; if (!empty($storeData) && is_array($storeData) && isset($storeData[$providerBasketItem['BASKET_CODE']])) { $basketStoreData = $storeData[$providerBasketItem['BASKET_CODE']]; } if (!empty($basketStoreData)) { $allBarcodeQuantity = 0; foreach ($basketStoreData as $basketShipmentItemStore) { $allBarcodeQuantity += $basketShipmentItemStore['QUANTITY']; } if ($quantity > $allBarcodeQuantity) { $resultProduct->addError(new ResultError(Loc::getMessage('SALE_PROVIDER_SHIPMENT_SHIPPED_LESS_QUANTITY', array('#PRODUCT_NAME#' => $providerBasketItem['BASKET_ITEM']->getField('NAME'))), 'SALE_PROVIDER_SHIPMENT_SHIPPED_LESS_QUANTITY')); } elseif ($quantity < $allBarcodeQuantity) { $resultProduct->addError(new ResultError(Loc::getMessage('SALE_PROVIDER_SHIPMENT_SHIPPED_MORE_QUANTITY', array('#PRODUCT_NAME#' => $providerBasketItem['BASKET_ITEM']->getField('NAME'))), 'SALE_PROVIDER_SHIPMENT_SHIPPED_MORE_QUANTITY')); } } } if ($resultProduct->isSuccess()) { if ($needShip === true) { if (method_exists($provider, 'tryShipmentProduct')) { /** @var Result $resultProductData */ $resultProduct = $provider::tryShipmentProduct($providerBasketItem['BASKET_ITEM'], $providerBasketItem['RESERVED'], $basketStoreData, $quantity); } } else { if (method_exists($provider, 'tryUnshipmentProduct')) { /** @var Result $resultProductData */ $resultProduct = $provider::tryUnshipmentProduct($providerBasketItem['PRODUCT_ID']); } } } $resultList[$providerBasketItem['BASKET_CODE']] = $resultProduct; } } } } if (!empty($resultList) && !empty($bundleIndexList) && is_array($bundleIndexList)) { foreach ($bundleIndexList as $bundleParentBasketCode => $bundleChildList) { // $tryShipmentBundle = false; foreach ($bundleChildList as $bundleChildBasketCode) { if (!isset($resultList[$bundleChildBasketCode])) { if (!isset($resultList[$bundleParentBasketCode])) { $resultList[$bundleParentBasketCode] = new Result(); } $resultList[$bundleParentBasketCode]->addError(new ResultError('Bundle child item not found')); } } } } if (!empty($resultList)) { $result->setData($resultList); } 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; }
/** * @param $action * @param BasketItem $basketItem * @param null $name * @param null $oldValue * @param null $value * @return Result * @throws Main\NotImplementedException * @throws Main\NotSupportedException * @throws Main\ObjectNotFoundException */ public function onBasketModify($action, BasketItem $basketItem, $name = null, $oldValue = null, $value = null) { if ($action != EventActions::UPDATE) { throw new Main\NotImplementedException(); } /** @var Shipment $systemShipment */ if (!($systemShipment = $this->getSystemShipment())) { throw new Main\ObjectNotFoundException('Entity "Shipment" not found'); } $result = new Result(); if ($name == 'QUANTITY') { $deltaQuantity = $value - $oldValue; if ($value == 0) { /** @var Shipment $shipment */ foreach ($this->collection as $shipment) { /** @var ShipmentItemCollection $shipmentItemCollection */ if (!($shipmentItemCollection = $shipment->getShipmentItemCollection())) { throw new Main\ObjectNotFoundException('Entity "ShipmentItemCollection" not found'); } $r = $shipmentItemCollection->deleteByBasketItem($basketItem); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } } } elseif ($deltaQuantity < 0) { $basketItemQuantity = $this->getBasketItemQuantity($basketItem); if ($basketItemQuantity > $value) { if (!$basketItem->isBundleChild() && !isset($this->errors[$basketItem->getBasketCode()]['SALE_ORDER_SYSTEM_SHIPMENT_LESS_QUANTITY'])) { $result->addError(new ResultError(Loc::getMessage('SALE_ORDER_SYSTEM_SHIPMENT_LESS_QUANTITY', array('#PRODUCT_NAME#' => $basketItem->getField("NAME"), '#QUANTITY#' => $basketItemQuantity - $value)), 'SALE_ORDER_SYSTEM_SHIPMENT_LESS_QUANTITY')); $this->errors[$basketItem->getBasketCode()]['SALE_ORDER_SYSTEM_SHIPMENT_LESS_QUANTITY'] = $basketItemQuantity - $value; } return $result; } } } if (!$result->isSuccess()) { return $result; } return $systemShipment->onBasketModify($action, $basketItem, $name, $oldValue, $value); }
/** * Apply discount rules. * * @return Result */ protected function applySaleDiscount() { $result = new Result(); $discount = isset($this->currentStep['discountIndex']) ? $this->discountsCache[$this->currentStep['discountId']] : $this->currentStep['discount']; if (isset($this->currentStep['discountIndex'])) { if (!empty($discount['APPLICATION']) && !$this->loadDiscountModules($this->currentStep['discountId'])) { $discount['APPLICATION'] = null; $result->addError(new Main\Entity\EntityError(Loc::getMessage('BX_SALE_DISCOUNT_ERR_SALE_DISCOUNT_MODULES_ABSENT'), self::ERROR_ID)); } } if (!empty($discount['APPLICATION'])) { $applyOrder = null; eval('$applyOrder=' . $discount['APPLICATION'] . ';'); if (is_callable($applyOrder)) { $this->currentStep['oldData'] = $this->orderData; $applyOrder($this->orderData); switch ($this->getUseMode()) { case self::USE_MODE_FULL: $actionsResult = $this->calculateFullSaleDiscountResult(); break; case self::USE_MODE_APPLY: $actionsResult = $this->calculateApplySaleDiscountResult(); break; default: $actionsResult = new Result(); } if (!$actionsResult->isSuccess()) { $result->addErrors($actionsResult->getErrors()); } unset($actionsResult); } unset($applyOrder); } unset($discount); 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()) { /** @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 ($eventResultData = $eventResult->getParameters()) { if (isset($eventResultData) && $eventResultData instanceof ResultError) { /** @var ResultError $errorMsg */ $errorMsg = $eventResultData; } } $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', 'FUSER_ID', 'ORDER_ID'))); while ($itemsFromDbItem = $itemsFromDbList->fetch()) { if (intval($itemsFromDbItem['SET_PARENT_ID']) > 0 && intval($itemsFromDbItem['SET_PARENT_ID']) != $itemsFromDbItem['ID']) { continue; } $itemsFromDb[$itemsFromDbItem["ID"]] = $itemsFromDbItem; } } if ($order && ($order->getId() > 0 && $this->getOrderId() == 0)) { $this->orderId = $order->getId(); } $changeMeaningfulFields = array("PRODUCT_ID", "QUANTITY", "PRICE", "DISCOUNT_VALUE", "VAT_RATE", "NAME"); /** @var BasketItem $basketItem */ foreach ($this->collection as $index => $basketItem) { $isNew = (bool) ($basketItem->getId() <= 0); $isChanged = $basketItem->isChanged(); if ($order && $order->getId() > 0 && $isChanged) { $logFields = array(); $fields = $basketItem->getFields(); $originalValues = $fields->getOriginalValues(); foreach ($originalValues as $originalFieldName => $originalFieldValue) { if (in_array($originalFieldName, $changeMeaningfulFields) && $basketItem->getField($originalFieldName) != $originalFieldValue) { $logFields[$originalFieldName] = $basketItem->getField($originalFieldName); $logFields['OLD_' . $originalFieldName] = $originalFieldValue; } } } $r = $basketItem->save(); if ($r->isSuccess()) { if ($order && $order->getId() > 0) { if ($isChanged) { OrderHistory::addLog('BASKET', $order->getId(), $isNew ? "BASKET_ITEM_ADD" : "BASKET_ITEM_UPDATE", $basketItem->getId(), $basketItem, $logFields, OrderHistory::SALE_ORDER_HISTORY_LOG_LEVEL_1); OrderHistory::addAction('BASKET', $order->getId(), "BASKET_SAVED", $basketItem->getId(), $basketItem); } } } else { $result->addErrors($r->getErrors()); } if (isset($itemsFromDb[$basketItem->getId()]) && $basketItem->getQuantity() > 0) { unset($itemsFromDb[$basketItem->getId()]); } } if (!empty($filter)) { $itemEventName = BasketItem::getEntityEventName(); foreach ($itemsFromDb as $k => $v) { /** @var Main\Event $event */ $event = new Main\Event('sale', "OnBefore" . $itemEventName . "Deleted", array('VALUES' => $v)); $event->send(); if ($v['TYPE'] == static::TYPE_SET) { if ($order && $order->getId() > 0) { OrderHistory::addLog('BASKET', $order->getId(), 'BASKET_ITEM_DELETE_BUNDLE', $k, null, array("PRODUCT_ID" => $v["PRODUCT_ID"], "NAME" => $v["NAME"], "QUANTITY" => $v["QUANTITY"]), OrderHistory::SALE_ORDER_HISTORY_LOG_LEVEL_1); } Internals\BasketTable::deleteBundle($k); } else { if ($order && $order->getId() > 0) { OrderHistory::addLog('BASKET', $order->getId(), 'BASKET_ITEM_DELETED', $k, null, array("PRODUCT_ID" => $v["PRODUCT_ID"], "NAME" => $v["NAME"], "QUANTITY" => $v["QUANTITY"]), OrderHistory::SALE_ORDER_HISTORY_LOG_LEVEL_1); } Internals\BasketTable::deleteWithItems($k); } /** @var Main\Event $event */ $event = new Main\Event('sale', "On" . $itemEventName . "Deleted", array('VALUES' => $v)); $event->send(); /** @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()) { /** @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 ($eventResultData = $eventResult->getParameters()) { if (isset($eventResultData) && $eventResultData instanceof ResultError) { /** @var ResultError $errorMsg */ $errorMsg = $eventResultData; } } $result->addError($errorMsg); } } if (!$result->isSuccess()) { return $result; } } } return $result; }