예제 #1
0
 /**
  *
  * @param array $values
  * @return Result
  * @throws Main\ArgumentOutOfRangeException
  * @throws Main\NotSupportedException
  * @throws \Exception
  */
 public function setFields(array $values)
 {
     $resultData = array();
     $result = new Result();
     $oldValues = null;
     foreach ($values as $key => $value) {
         $oldValues[$key] = $this->fields->get($key);
     }
     if ($eventName = static::getEntityEventName()) {
         $event = new Main\Event('sale', 'OnBefore' . $eventName . 'SetFields', array('ENTITY' => $this, 'VALUES' => $values, 'OLD_VALUES' => $oldValues));
         $event->send();
         if ($event->getResults()) {
             /** @var Main\EventResult $eventResult */
             foreach ($event->getResults() as $eventResult) {
                 if ($eventResult->getType() == Main\EventResult::SUCCESS) {
                     if ($eventResultData = $eventResult->getParameters()) {
                         if (isset($eventResultData['VALUES'])) {
                             $values = $eventResultData['VALUES'];
                         }
                     }
                 } elseif ($eventResult->getType() == Main\EventResult::ERROR) {
                     $errorMsg = new ResultError(Main\Localization\Loc::getMessage('SALE_EVENT_ON_BEFORE_' . strtoupper($eventName) . '_SET_FIELDS_ERROR'), 'SALE_EVENT_ON_BEFORE_' . strtoupper($eventName) . '_SET_FIELDS_ERROR');
                     if ($eventResultData = $eventResult->getParameters()) {
                         if (isset($eventResultData['ERROR']) && $eventResultData['ERROR'] instanceof ResultError) {
                             $errorMsg = $eventResultData['ERROR'];
                         }
                     }
                     $result->addError($errorMsg);
                 }
             }
         }
     }
     if (!$result->isSuccess()) {
         return $result;
     }
     $isStartField = $this->isStartField();
     foreach ($values as $key => $value) {
         $r = $this->setField($key, $value);
         if (!$r->isSuccess()) {
             $data = $r->getData();
             if (!empty($data) && is_array($data)) {
                 $resultData = array_merge($resultData, $data);
             }
             $result->addErrors($r->getErrors());
         }
     }
     if (!empty($resultData)) {
         $result->setData($resultData);
     }
     if ($isStartField) {
         $hasMeaningfulFields = $this->hasMeaningfulField();
         /** @var Result $r */
         $r = $this->doFinalAction($hasMeaningfulFields);
         if (!$r->isSuccess()) {
             $result->addErrors($r->getErrors());
         } else {
             if (($data = $r->getData()) && !empty($data) && is_array($data)) {
                 $result->setData($result->getData() + $data);
             }
         }
     }
     return $result;
 }
예제 #2
0
 /**
  * @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;
 }
예제 #3
0
 /**
  * @param Order $order
  * @param $payments
  * @param bool $canSetPaid
  * @return Result
  * @throws Main\ArgumentOutOfRangeException
  * @throws Main\ObjectNotFoundException
  * @throws UserMessageException
  */
 public static function updateData(Order &$order, $payments, $canSetPaid = false)
 {
     global $USER;
     $result = new Result();
     $data['PAYMENT'] = array();
     if (!$order) {
         throw new UserMessageException('Order does not exist');
     }
     foreach ($payments as $payment) {
         $paymentId = intval($payment['PAYMENT_ID']);
         $isNew = $paymentId <= 0;
         $paymentCollection = $order->getPaymentCollection();
         /** @var \Bitrix\Sale\Payment $paymentItem */
         if ($isNew) {
             $paymentItem = $paymentCollection->createItem();
         } else {
             $paymentItem = $paymentCollection->getItemById($paymentId);
             if (!$paymentItem) {
                 throw new UserMessageException('Payment does not exist');
             }
         }
         self::$defaultFields = $paymentItem->getFieldValues();
         $isReturn = isset($payment['IS_RETURN']) && $payment['IS_RETURN'] == 'Y';
         /** @var \Bitrix\Sale\PaySystemService $paymentService */
         $paymentService = PaySystemService::load($payment['PAY_SYSTEM_ID']);
         if (!$paymentService) {
             $result->addError(new EntityError(Loc::getMessage('SALE_ORDER_PAYMENT_ERROR_PAYSYSTEM')));
         }
         $paymentFields = array('PAY_SYSTEM_ID' => $payment['PAY_SYSTEM_ID'], 'COMPANY_ID' => isset($payment['COMPANY_ID']) ? $payment['COMPANY_ID'] : 0, 'SUM' => $payment['SUM'], 'PAY_VOUCHER_NUM' => $payment['PAY_VOUCHER_NUM'], 'PAY_RETURN_NUM' => $payment['PAY_RETURN_NUM'], 'PAY_RETURN_COMMENT' => $payment['PAY_RETURN_COMMENT'], 'COMMENTS' => $payment['COMMENTS'], 'PAY_SYSTEM_NAME' => $paymentService ? $paymentService->getName() : '');
         if ($isNew) {
             $paymentFields['DATE_BILL'] = new DateTime();
         }
         if (!empty($payment['PAY_RETURN_DATE'])) {
             try {
                 $paymentFields['PAY_RETURN_DATE'] = new Date($payment['PAY_RETURN_DATE']);
             } catch (Main\ObjectException $exception) {
                 $result->addError(new EntityError(Loc::getMessage('SALE_ORDER_PAYMENT_ERROR_RETURN_DATE_FORMAT')));
             }
         }
         if (!empty($payment['PAY_VOUCHER_DATE'])) {
             try {
                 $paymentFields['PAY_VOUCHER_DATE'] = new Date($payment['PAY_VOUCHER_DATE']);
             } catch (Main\ObjectException $exception) {
                 $result->addError(new EntityError(Loc::getMessage('SALE_ORDER_PAYMENT_ERROR_VOUCHER_DATE_FORMAT')));
             }
         }
         if (isset($payment['RESPONSIBLE_ID'])) {
             $paymentFields['RESPONSIBLE_ID'] = !empty($payment['RESPONSIBLE_ID']) ? $payment['RESPONSIBLE_ID'] : $USER->GetID();
             if ($payment['RESPONSIBLE_ID'] != $paymentItem->getField('RESPONSIBLE_ID')) {
                 $paymentFields['DATE_RESPONSIBLE_ID'] = new DateTime();
                 if (!$isNew) {
                     $paymentFields['EMP_RESPONSIBLE_ID'] = $USER->GetID();
                 }
             }
         }
         if ($result->isSuccess()) {
             if ($paymentItem->getField('PAID') != $payment['PAID'] && $paymentItem->getField('IS_RETURN') == 'Y') {
                 $setResult = $paymentItem->setReturn('N');
                 if (!$setResult->isSuccess()) {
                     $result->addErrors($setResult->getErrors());
                 }
             }
             if ($isReturn && $payment['OPERATION_ID'] == 'RETURN') {
                 $setResult = $paymentItem->setReturn('Y');
                 if (!$setResult->isSuccess()) {
                     $result->addErrors($setResult->getErrors());
                 }
             }
             $setResult = $paymentItem->setFields($paymentFields);
             if (!$setResult->isSuccess()) {
                 $result->addErrors($setResult->getErrors());
             }
             if (!$canSetPaid) {
                 $setResult = $paymentItem->setPaid($payment['PAID']);
                 if (!$setResult->isSuccess()) {
                     $result->addErrors($setResult->getErrors());
                 }
             }
             if ($payment['ORDER_STATUS_ID']) {
                 $order->setField('STATUS_ID', $payment['ORDER_STATUS_ID']);
             }
         }
         $data['PAYMENT'][] = $paymentItem;
     }
     $result->setData($data);
     return $result;
 }
예제 #4
0
 /**
  * @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;
 }
예제 #5
0
 /**
  * @param bool $hasMeaningfulField
  * @return Result
  * @throws Main\ArgumentNullException
  * @throws Main\ObjectNotFoundException
  */
 public function doFinalAction($hasMeaningfulField = false)
 {
     $result = new Result();
     if (!$hasMeaningfulField) {
         $this->clearStartField();
         return $result;
     }
     if ($basket = $this->getBasket()) {
         $this->setMathActionOnly(true);
         if ($eventName = static::getEntityEventName()) {
             $event = new Main\Event('sale', 'OnBefore' . $eventName . 'FinalAction', array('ENTITY' => $this, 'HAS_MEANINGFUL_FIELD' => $hasMeaningfulField, 'BASKET' => $basket));
             $event->send();
             if ($event->getResults()) {
                 /** @var Main\EventResult $eventResult */
                 foreach ($event->getResults() as $eventResult) {
                     if ($eventResult->getType() == Main\EventResult::ERROR) {
                         $errorMsg = new ResultError(Main\Localization\Loc::getMessage('SALE_EVENT_ON_BEFORE_' . strtoupper($eventName) . '_FINAL_ACTION_ERROR'), 'SALE_EVENT_ON_BEFORE_' . strtoupper($eventName) . '_FINAL_ACTION_ERROR');
                         if ($eventResultData = $eventResult->getParameters()) {
                             if (isset($eventResultData['ERROR']) && $eventResultData['ERROR'] instanceof ResultError) {
                                 $errorMsg = $eventResultData['ERROR'];
                             }
                         }
                         $result->addError($errorMsg);
                     }
                 }
             }
             if (!$result->isSuccess()) {
                 return $result;
             }
         }
         // discount
         $discount = $this->getDiscount();
         $r = $discount->calculate();
         if (!$r->isSuccess()) {
             //				$this->clearStartField();
             //				$result->addErrors($r->getErrors());
             //				return $result;
         }
         if ($r->isSuccess() && ($discountData = $r->getData()) && !empty($discountData) && is_array($discountData)) {
             /** @var Result $r */
             $r = $this->applyDiscount($discountData);
             if (!$r->isSuccess()) {
                 $result->addErrors($r->getErrors());
                 return $result;
             }
         }
         if (!$this->isExternal()) {
             /** @var Tax $tax */
             $tax = $this->getTax();
             /** @var Result $r */
             $r = $tax->calculate();
             if (!$result->isSuccess()) {
                 return $r;
             }
             $r = $tax->calculateDelivery();
             if (!$result->isSuccess()) {
                 return $r;
             }
             $taxChanged = false;
             $taxResult = $r->getData();
             if (isset($taxResult['TAX_PRICE']) && floatval($taxResult['TAX_PRICE']) >= 0) {
                 if (!$this->isUsedVat()) {
                     $taxChanged = true;
                     $this->setField('TAX_PRICE', $taxResult['TAX_PRICE']);
                     $this->setFieldNoDemand("PRICE", $this->getBasket()->getPrice() + $this->getShipmentCollection()->getPriceDelivery() + $taxResult['TAX_PRICE']);
                 }
             }
             if ($taxChanged || $this->isUsedVat()) {
                 $taxValue = $this->isUsedVat() ? $this->getVatSum() : $this->getField('TAX_PRICE');
                 if (floatval($taxValue) != floatval($this->getField('TAX_VALUE'))) {
                     $this->setField('TAX_VALUE', floatval($taxValue));
                 }
             }
         }
     }
     //
     $this->setMathActionOnly(false);
     //
     /** @var Result $r */
     $r = $this->syncOrderAndPayments();
     if (!$r->isSuccess()) {
         $result->addErrors($r->getErrors());
     }
     $this->clearStartField();
     if ($eventName = static::getEntityEventName()) {
         $event = new Main\Event('sale', 'OnAfter' . $eventName . 'FinalAction', array('ENTITY' => $this));
         $event->send();
     }
     return $result;
 }
예제 #6
0
 /**
  * @return Entity\Result|bool
  * @throws \Bitrix\Main\ArgumentException
  * @throws \Bitrix\Main\ArgumentNullException
  */
 public function save()
 {
     $result = new Result();
     /** @var Order $order */
     $order = $this->getOrder();
     $itemsFromDb = array();
     $filter = array();
     if (!$order) {
         /** @var Main\Entity\Event $event */
         $event = new Main\Event('sale', EventActions::EVENT_ON_BASKET_BEFORE_SAVED, array('ENTITY' => $this));
         $event->send();
         if ($event->getResults()) {
             $result = new Result();
             /** @var Main\EventResult $eventResult */
             foreach ($event->getResults() as $eventResult) {
                 if ($eventResult->getType() == Main\EventResult::ERROR) {
                     $errorMsg = new ResultError(Main\Localization\Loc::getMessage('SALE_EVENT_ON_BEFORE_BASKET_SAVED'), 'SALE_EVENT_ON_BEFORE_BASKET_SAVED');
                     if (isset($eventResultData['ERROR']) && $eventResultData['ERROR'] instanceof ResultError) {
                         $errorMsg = $eventResultData['ERROR'];
                     }
                     $result->addError($errorMsg);
                 }
             }
             if (!$result->isSuccess()) {
                 return $result;
             }
         }
     }
     $isNew = $order && $order->isNew() ? true : false;
     if ($order && !$isNew) {
         $filter['ORDER_ID'] = $order->getId();
     } else {
         if ($this->isLoadForFuserId()) {
             $filter = array('FUSER_ID' => $this->getFUserId(), 'ORDER_ID' => null, 'LID' => $this->getSiteId());
         }
         if ($isNew) {
             $fUserId = $this->getFUserId(true);
             if ($fUserId <= 0) {
                 $userId = $order->getUserId();
                 if (intval($userId) > 0) {
                     $fUserId = Fuser::getIdByUserId($userId);
                     if ($fUserId > 0) {
                         $this->setFUserId($fUserId);
                     }
                 }
             }
         }
     }
     if (!empty($filter)) {
         $itemsFromDbList = Internals\BasketTable::getList(array("filter" => $filter, "select" => array("ID", 'TYPE', 'SET_PARENT_ID', 'PRODUCT_ID', 'NAME', 'QUANTITY')));
         while ($itemsFromDbItem = $itemsFromDbList->fetch()) {
             if (intval($itemsFromDbItem['SET_PARENT_ID']) > 0 && intval($itemsFromDbItem['SET_PARENT_ID']) != $itemsFromDbItem['ID']) {
                 continue;
             }
             $itemsFromDb[$itemsFromDbItem["ID"]] = $itemsFromDbItem;
         }
     }
     /** @var BasketItem $basketItem */
     foreach ($this->collection as $index => $basketItem) {
         $r = $basketItem->save();
         if (!$r->isSuccess()) {
             $result->addErrors($r->getErrors());
         }
         if (isset($itemsFromDb[$basketItem->getId()]) && $basketItem->getQuantity() > 0) {
             unset($itemsFromDb[$basketItem->getId()]);
         }
     }
     if (!empty($filter)) {
         foreach ($itemsFromDb as $k => $v) {
             if ($v['TYPE'] == static::TYPE_SET) {
                 Internals\BasketTable::deleteBundle($k);
             } else {
                 Internals\BasketTable::deleteWithItems($k);
             }
             /** @var Order $order */
             if ($order && $order->getId() > 0) {
                 OrderHistory::addAction('BASKET', $order->getId(), 'BASKET_REMOVED', $k, null, array('NAME' => $v['NAME'], 'QUANTITY' => $v['QUANTITY'], 'PRODUCT_ID' => $v['PRODUCT_ID']));
             }
         }
     }
     if ($order && $order->getId() > 0) {
         OrderHistory::collectEntityFields('BASKET', $order->getId());
     }
     if (!$order) {
         /** @var Main\Entity\Event $event */
         $event = new Main\Event('sale', EventActions::EVENT_ON_BASKET_SAVED, array('ENTITY' => $this));
         $event->send();
         if ($event->getResults()) {
             $result = new Result();
             /** @var Main\EventResult $eventResult */
             foreach ($event->getResults() as $eventResult) {
                 if ($eventResult->getType() == Main\EventResult::ERROR) {
                     $errorMsg = new ResultError(Main\Localization\Loc::getMessage('SALE_EVENT_ON_BASKET_SAVED'), 'SALE_EVENT_ON_BASKET_SAVED');
                     if (isset($eventResultData['ERROR']) && $eventResultData['ERROR'] instanceof ResultError) {
                         $errorMsg = $eventResultData['ERROR'];
                     }
                     $result->addError($errorMsg);
                 }
             }
             if (!$result->isSuccess()) {
                 return $result;
             }
         }
     }
     return $result;
 }
예제 #7
0
 /**
  * @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;
 }
예제 #8
0
 /**
  * @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;
 }
예제 #10
0
 /**
  * @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);
 }
예제 #11
0
 /**
  * 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;
 }
예제 #12
0
 /**
  * @return Entity\Result|bool
  * @throws \Bitrix\Main\ArgumentException
  * @throws \Bitrix\Main\ArgumentNullException
  */
 public function save()
 {
     $result = new Result();
     /** @var Order $order */
     $order = $this->getOrder();
     $itemsFromDb = array();
     $filter = array();
     if (!$order) {
         /** @var Main\Entity\Event $event */
         $event = new Main\Event('sale', EventActions::EVENT_ON_BASKET_BEFORE_SAVED, array('ENTITY' => $this));
         $event->send();
         if ($event->getResults()) {
             /** @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;
 }