Exemplo n.º 1
0
 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;
 }
Exemplo n.º 2
0
 /**
  * @param Order $order
  * @param $payments
  * @param bool $canSetPaid
  * @return Result
  * @throws Main\ArgumentOutOfRangeException
  * @throws Main\ObjectNotFoundException
  * @throws UserMessageException
  */
 public static function updateData(Order &$order, $payments, $canSetPaid = false)
 {
     global $USER;
     $result = new Result();
     $data['PAYMENT'] = array();
     if (!$order) {
         throw new UserMessageException('Order does not exist');
     }
     foreach ($payments as $payment) {
         $paymentId = intval($payment['PAYMENT_ID']);
         $isNew = $paymentId <= 0;
         $paymentCollection = $order->getPaymentCollection();
         /** @var \Bitrix\Sale\Payment $paymentItem */
         if ($isNew) {
             $paymentItem = $paymentCollection->createItem();
         } else {
             $paymentItem = $paymentCollection->getItemById($paymentId);
             if (!$paymentItem) {
                 throw new UserMessageException('Payment does not exist');
             }
         }
         self::$defaultFields = $paymentItem->getFieldValues();
         $isReturn = isset($payment['IS_RETURN']) && $payment['IS_RETURN'] == 'Y';
         /** @var \Bitrix\Sale\PaySystemService $paymentService */
         $paymentService = PaySystemService::load($payment['PAY_SYSTEM_ID']);
         if (!$paymentService) {
             $result->addError(new EntityError(Loc::getMessage('SALE_ORDER_PAYMENT_ERROR_PAYSYSTEM')));
         }
         $paymentFields = array('PAY_SYSTEM_ID' => $payment['PAY_SYSTEM_ID'], 'COMPANY_ID' => isset($payment['COMPANY_ID']) ? $payment['COMPANY_ID'] : 0, 'SUM' => $payment['SUM'], 'PAY_VOUCHER_NUM' => $payment['PAY_VOUCHER_NUM'], 'PAY_RETURN_NUM' => $payment['PAY_RETURN_NUM'], 'PAY_RETURN_COMMENT' => $payment['PAY_RETURN_COMMENT'], 'COMMENTS' => $payment['COMMENTS'], 'PAY_SYSTEM_NAME' => $paymentService ? $paymentService->getName() : '');
         if ($isNew) {
             $paymentFields['DATE_BILL'] = new DateTime();
         }
         if (!empty($payment['PAY_RETURN_DATE'])) {
             try {
                 $paymentFields['PAY_RETURN_DATE'] = new Date($payment['PAY_RETURN_DATE']);
             } catch (Main\ObjectException $exception) {
                 $result->addError(new EntityError(Loc::getMessage('SALE_ORDER_PAYMENT_ERROR_RETURN_DATE_FORMAT')));
             }
         }
         if (!empty($payment['PAY_VOUCHER_DATE'])) {
             try {
                 $paymentFields['PAY_VOUCHER_DATE'] = new Date($payment['PAY_VOUCHER_DATE']);
             } catch (Main\ObjectException $exception) {
                 $result->addError(new EntityError(Loc::getMessage('SALE_ORDER_PAYMENT_ERROR_VOUCHER_DATE_FORMAT')));
             }
         }
         if (isset($payment['RESPONSIBLE_ID'])) {
             $paymentFields['RESPONSIBLE_ID'] = !empty($payment['RESPONSIBLE_ID']) ? $payment['RESPONSIBLE_ID'] : $USER->GetID();
             if ($payment['RESPONSIBLE_ID'] != $paymentItem->getField('RESPONSIBLE_ID')) {
                 $paymentFields['DATE_RESPONSIBLE_ID'] = new DateTime();
                 if (!$isNew) {
                     $paymentFields['EMP_RESPONSIBLE_ID'] = $USER->GetID();
                 }
             }
         }
         if ($result->isSuccess()) {
             if ($paymentItem->getField('PAID') != $payment['PAID'] && $paymentItem->getField('IS_RETURN') == 'Y') {
                 $setResult = $paymentItem->setReturn('N');
                 if (!$setResult->isSuccess()) {
                     $result->addErrors($setResult->getErrors());
                 }
             }
             if ($isReturn && $payment['OPERATION_ID'] == 'RETURN') {
                 $setResult = $paymentItem->setReturn('Y');
                 if (!$setResult->isSuccess()) {
                     $result->addErrors($setResult->getErrors());
                 }
             }
             $setResult = $paymentItem->setFields($paymentFields);
             if (!$setResult->isSuccess()) {
                 $result->addErrors($setResult->getErrors());
             }
             if (!$canSetPaid) {
                 $setResult = $paymentItem->setPaid($payment['PAID']);
                 if (!$setResult->isSuccess()) {
                     $result->addErrors($setResult->getErrors());
                 }
             }
             if ($payment['ORDER_STATUS_ID']) {
                 $order->setField('STATUS_ID', $payment['ORDER_STATUS_ID']);
             }
         }
         $data['PAYMENT'][] = $paymentItem;
     }
     $result->setData($data);
     return $result;
 }
Exemplo n.º 3
0
 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;
 }
Exemplo n.º 4
0
 /**
  * Delete the order
  * @param int $id		Order ID.
  * @return Sale\Result
  * @throws \Bitrix\Main\ArgumentNullException
  */
 public static function delete($id)
 {
     $result = new Sale\Result();
     if (intval($id) <= 0) {
         $result->addError(new Sale\ResultError(Main\Localization\Loc::getMessage('SALE_COMPATIBLE_ORDER_ID_NOT_FOUND'), 'SALE_COMPATIBLE_ORDER_ID_NOT_FOUND'));
         return $result;
     }
     /** @var Sale\Order $order */
     if (!($order = Sale\Order::load($id))) {
         $result->addError(new Sale\ResultError(Loc::getMessage('SALE_ORDER_ENTITY_NOT_FOUND'), 'SALE_ORDER_ENTITY_NOT_FOUND'));
         return $result;
     }
     /** @var Sale\PaymentCollection $paymentCollection */
     if ($paymentCollection = $order->getPaymentCollection()) {
         /** @var Sale\Payment $payment */
         foreach ($paymentCollection as $payment) {
             if ($payment->isPaid()) {
                 $payment->setPaid('N');
             }
         }
         /** @var Sale\Result $r */
         $r = $order->save();
         if (!$r->isSuccess()) {
             return $r;
         }
     }
     /** @var Sale\Result $r */
     $r = Sale\Order::delete($id);
     if (!$r->isSuccess()) {
         $result->addErrors($r->getErrors());
     }
     return $result;
 }
Exemplo n.º 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;
 }
Exemplo n.º 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;
 }
Exemplo n.º 7
0
 /**
  * @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;
 }
Exemplo n.º 9
0
 /**
  * @return Result
  */
 public function calculateDelivery()
 {
     /** @var Result $result */
     $result = new Result();
     $shipmentListResult = array();
     /** @var Shipment $shipment */
     foreach ($this->collection as $shipment) {
         if ($shipment->isSystem() || $shipment->getDeliveryId() == 0) {
             continue;
         }
         if ($shipment->isCustomPrice()) {
             //				$shipmentListResult[] = array(
             //					'SHIPMENT_ITEM' => $shipment,
             //					'PRICE' => $shipment->getPrice(),
             //					'AVAILABLE' => true,
             //				);
             //				continue;
             $priceDelivery = $shipment->getPrice();
             $shipment->setField('BASE_PRICE_DELIVERY', $priceDelivery);
         } else {
             $deliveryCalculate = $shipment->calculateDelivery();
             if (!$deliveryCalculate->isSuccess()) {
                 $result->addErrors($deliveryCalculate->getErrors());
                 continue;
             }
             $deliveryCalculateData = $deliveryCalculate->getData();
             if (!isset($deliveryCalculateData['AVAILABLE'])) {
                 $result->addError(new ResultError(Loc::getMessage('SALE_ORDER_DELIVERY_SERVICE_NOT_AVAILABLE'), 'DELIVERY_SERVICE_NOT_AVAILABLE'));
                 continue;
             }
             if ($deliveryCalculate->getPrice() < 0) {
                 $result->addError(new ResultError(Loc::getMessage('SALE_ORDER_SHIPMENT_WRONG_DELIVERY_PRICE'), 'WRONG_DELIVERY_PRICE'));
                 continue;
             }
             $shipment->setField('BASE_PRICE_DELIVERY', $deliveryCalculate->getPrice());
             //			$shipmentListResult[] = array(
             //				'SHIPMENT_ITEM' => $shipment,
             //				'PRICE' => $deliveryCalculate->getPrice(),
             //				'AVAILABLE' => $deliveryCalculateData['AVAILABLE'],
             //			);
         }
     }
     // event OnSaleCalculateOrderDelivery
     return $result;
 }
Exemplo n.º 10
0
 /**
  * @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;
 }
Exemplo n.º 11
0
 /**
  * @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;
 }
Exemplo n.º 12
0
 /**
  * @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;
 }
Exemplo n.º 13
0
 /**
  * Save converted discount.
  *
  * @param array $discountData				Discount data.
  * @return Result
  * @throws Main\ArgumentException
  * @throws \Exception
  */
 private static function saveMigrateDiscount($discountData)
 {
     $result = new Result();
     $process = true;
     $hash = false;
     $resultData = array();
     $fields = Internals\OrderDiscountTable::prepareDiscountData($discountData);
     if (empty($fields) || !is_array($fields)) {
         $process = false;
         $result->addError(new Main\Entity\EntityError(Loc::getMessage('SALE_ORDER_DISCOUNT_ERR_BAD_PREPARE_DISCOUNT'), self::ERROR_ID));
     }
     if ($process) {
         $hash = Internals\OrderDiscountTable::calculateHash($fields);
         if ($hash === false) {
             $process = false;
             $result->addError(new Main\Entity\EntityError(Loc::getMessage('SALE_ORDER_DISCOUNT_ERR_BAD_DISCOUNT_HASH'), self::ERROR_ID));
         }
     }
     if ($process) {
         if (!isset(self::$migrateDiscountsCache[$hash])) {
             $orderDiscountIterator = Internals\OrderDiscountTable::getList(array('select' => array('*'), 'filter' => array('=DISCOUNT_HASH' => $hash)));
             if ($orderDiscount = $orderDiscountIterator->fetch()) {
                 self::$migrateDiscountsCache[$hash] = $orderDiscount;
             }
             unset($orderDiscount, $orderDiscountIterator);
         }
         if (!empty(self::$migrateDiscountsCache[$hash])) {
             $resultData = self::$migrateDiscountsCache[$hash];
             $resultData['ID'] = (int) $resultData['ID'];
             $resultData['NAME'] = (string) $resultData['NAME'];
             $resultData['ORDER_DISCOUNT_ID'] = $resultData['ID'];
             $result->setId($resultData['ID']);
         } else {
             $fields['DISCOUNT_HASH'] = $hash;
             $fields['ACTIONS_DESCR'] = array();
             if (isset($discountData['ACTIONS_DESCR'])) {
                 $fields['ACTIONS_DESCR'] = $discountData['ACTIONS_DESCR'];
             }
             $tableResult = Internals\OrderDiscountTable::add($fields);
             if ($tableResult->isSuccess()) {
                 $resultData = $fields;
                 $resultData['ID'] = (int) $tableResult->getId();
                 $resultData['NAME'] = (string) $resultData['NAME'];
                 $resultData['ORDER_DISCOUNT_ID'] = $resultData['ID'];
                 $result->setId($resultData['ID']);
             } else {
                 $process = false;
                 $result->addErrors($tableResult->getErrors());
             }
             unset($tableResult, $fields);
             if ($process) {
                 $moduleList = Internals\OrderDiscountTable::getDiscountModules($discountData);
                 if (!empty($moduleList)) {
                     $resultModule = Internals\OrderModulesTable::saveOrderDiscountModules($resultData['ORDER_DISCOUNT_ID'], $moduleList);
                     if (!$resultModule) {
                         Internals\OrderDiscountTable::clearList($resultData['ORDER_DISCOUNT_ID']);
                         $resultData = array();
                         $process = false;
                         $result->addError(new Main\Entity\EntityError(Loc::getMessage('SALE_ORDER_DISCOUNT_ERR_SAVE_DISCOUNT_MODULES'), self::ERROR_ID));
                     }
                     unset($resultModule);
                 }
                 unset($needDiscountModules, $moduleList);
             }
         }
     }
     if ($process) {
         $result->setData($resultData);
     }
     unset($resultData, $process);
     return $result;
 }
Exemplo n.º 14
0
 /**
  * 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;
 }
Exemplo n.º 15
0
 /**
  * @param Order $order
  * @param array $shipments
  * @return Result
  * @throws SystemException
  */
 public static function updateData(Order &$order, array $shipments)
 {
     global $USER;
     $result = new Result();
     $data = array();
     $basketResult = null;
     if (!$order) {
         $result->addError(new EntityError(Loc::getMessage('SALE_ORDER_SHIPMENT_ERROR_ORDER_NOT_FOUND')));
         return $result;
     }
     $shipmentCollection = $order->getShipmentCollection();
     $isStartField = $shipmentCollection->isStartField();
     foreach ($shipments as $item) {
         $shipmentId = intval($item['SHIPMENT_ID']);
         $isNew = $shipmentId <= 0;
         if ($isNew) {
             self::$shipment = $shipmentCollection->createItem();
         } else {
             self::$shipment = $shipmentCollection->getItemById($shipmentId);
             if (!self::$shipment) {
                 $result->addError(new EntityError(Loc::getMessage('SALE_ORDER_SHIPMENT_ERROR_SHIPMENT_NOT_FOUND')));
                 continue;
             }
         }
         self::$defaultFields = self::$shipment->getFieldValues();
         /** @var \Bitrix\Sale\BasketItem $product */
         $countItems = count(self::$shipment->getShipmentItemCollection());
         $systemShipment = $shipmentCollection->getSystemShipment();
         $systemShipmentItemCollection = $systemShipment->getShipmentItemCollection();
         $products = array();
         if (!isset($item['PRODUCT']) && self::$shipment->getId() <= 0) {
             $basket = $order->getBasket();
             if ($basket) {
                 $basketItems = $basket->getBasketItems();
                 foreach ($basketItems as $product) {
                     $systemShipmentItem = $systemShipmentItemCollection->getItemByBasketCode($product->getBasketCode());
                     if ($product->isBundleChild() || !$systemShipmentItem || $systemShipmentItem->getQuantity() <= 0) {
                         continue;
                     }
                     $products[] = array('AMOUNT' => $product->getQuantity(), 'BASKET_CODE' => $product->getBasketCode());
                 }
             }
         } else {
             $products = $item['PRODUCT'];
         }
         if ($item['DEDUCTED'] == 'Y') {
             $basketResult = OrderBasketShipment::updateData($order, self::$shipment, $products);
             if (!$basketResult->isSuccess()) {
                 $result->addErrors($basketResult->getErrors());
             }
         }
         $extraServices = $item['EXTRA_SERVICES'] ? $item['EXTRA_SERVICES'] : array();
         $shipmentFields = array('COMPANY_ID' => isset($item['COMPANY_ID']) && $item['COMPANY_ID'] > 0 ? $item['COMPANY_ID'] : 0, 'DEDUCTED' => $item['DEDUCTED'], 'DELIVERY_DOC_NUM' => $item['DELIVERY_DOC_NUM'], 'TRACKING_NUMBER' => $item['TRACKING_NUMBER'], 'CURRENCY' => $order->getCurrency(), 'COMMENTS' => $item['COMMENTS'], 'STATUS_ID' => $isNew ? DeliveryStatus::getInitialStatus() : $item['STATUS_ID']);
         if ($item['DELIVERY_DOC_DATE']) {
             try {
                 $shipmentFields['DELIVERY_DOC_DATE'] = new Date($item['DELIVERY_DOC_DATE']);
             } catch (Main\ObjectException $exception) {
                 $result->addError(new EntityError(Loc::getMessage('SALE_ORDER_SHIPMENT_ERROR_UNCORRECT_FORM_DATE')));
             }
         }
         $shipmentFields['DELIVERY_ID'] = $item['PROFILE'] > 0 ? $item['PROFILE'] : $item['DELIVERY_ID'];
         try {
             $service = Services\Manager::getService($shipmentFields['DELIVERY_ID']);
             if ($service->getParentService()) {
                 $shipmentFields['DELIVERY_NAME'] = $service->getParentService()->getName() . ':' . $service->getName();
             } else {
                 $shipmentFields['DELIVERY_NAME'] = $service->getName();
             }
         } catch (Main\ArgumentNullException $e) {
             $result->addError(new EntityError(Loc::getMessage('SALE_ORDER_SHIPMENT_ERROR_NO_DELIVERY_SERVICE')));
         }
         $responsibleId = self::$shipment->getField('RESPONSIBLE_ID');
         if ($item['RESPONSIBLE_ID'] != $responsibleId || empty($responsibleId)) {
             if (isset($item['RESPONSIBLE_ID'])) {
                 $shipmentFields['RESPONSIBLE_ID'] = $item['RESPONSIBLE_ID'];
             } else {
                 $shipmentFields['RESPONSIBLE_ID'] = $order->getField('RESPONSIBLE_ID');
             }
             if (!empty($shipmentFields['RESPONSIBLE_ID'])) {
                 $shipmentFields['EMP_RESPONSIBLE_ID'] = $USER->getID();
                 $shipmentFields['DATE_RESPONSIBLE_ID'] = new DateTime();
             }
         }
         if ($extraServices) {
             self::$shipment->setExtraServices($extraServices);
         }
         $setFieldsResult = self::$shipment->setFields($shipmentFields);
         if (!$setFieldsResult->isSuccess()) {
             $result->addErrors($setFieldsResult->getErrors());
         }
         self::$shipment->setStoreId($item['DELIVERY_STORE_ID']);
         if ($item['DEDUCTED'] == 'N') {
             $basketResult = OrderBasketShipment::updateData($order, self::$shipment, $products);
             if (!$basketResult->isSuccess()) {
                 $result->addErrors($basketResult->getErrors());
             }
         }
         try {
             $priceDeliveryInfo = array();
             if ($item['CUSTOM_PRICE_DELIVERY'] != 'Y') {
                 $totalPrice = self::getDeliveryPrice(self::$shipment);
             } else {
                 $totalPrice = (double) str_replace(',', '.', $item['BASE_PRICE_DELIVERY']);
             }
         } catch (\Exception $e) {
             $totalPrice = 0;
         }
         $priceDeliveryInfo['CUSTOM_PRICE_DELIVERY'] = $item['CUSTOM_PRICE_DELIVERY'];
         $priceDeliveryInfo['BASE_PRICE_DELIVERY'] = $totalPrice;
         self::$shipment->setFields($priceDeliveryInfo);
         self::$shipment->setField('ALLOW_DELIVERY', $item['ALLOW_DELIVERY']);
         $data['SHIPMENT'][] = self::$shipment;
     }
     if ($isStartField) {
         $hasMeaningfulFields = $shipmentCollection->hasMeaningfulField();
         /** @var Result $r */
         $r = $shipmentCollection->doFinalAction($hasMeaningfulFields);
         if (!$r->isSuccess()) {
             $result->addErrors($r->getErrors());
         }
     }
     $result->setData($data);
     return $result;
 }
Exemplo n.º 16
0
 /**
  *
  */
 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;
 }
Exemplo n.º 17
0
 /**
  * @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;
 }
Exemplo n.º 19
0
 /**
  * @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;
 }
Exemplo n.º 20
0
 /**
  * Delete the order
  * @param int $id		Order ID.
  * @return Sale\Result
  * @throws \Bitrix\Main\ArgumentNullException
  */
 public static function delete($id)
 {
     $result = new Sale\Result();
     if (intval($id) <= 0) {
         $result->addError(new Sale\ResultError(Main\Localization\Loc::getMessage('SALE_COMPATIBLE_ORDER_ID_NOT_FOUND'), 'SALE_COMPATIBLE_ORDER_ID_NOT_FOUND'));
         return $result;
     }
     $r = Sale\Order::delete($id);
     if (!$r->isSuccess()) {
         $result->addErrors($r->getErrors());
     }
     return $result;
 }
Exemplo n.º 21
0
 /**
  * @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;
 }
Exemplo n.º 22
0
 /**
  * @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;
 }
Exemplo n.º 23
0
 /**
  *
  */
 public function delete()
 {
     $result = new Result();
     /** @var Basket $basket */
     if (!($basket = $this->getCollection())) {
         throw new ObjectNotFoundException('Entity "Basket" not found');
     }
     /** @var Order $order */
     if ($order = $basket->getOrder()) {
         /** @var ShipmentCollection $shipmentCollection */
         if ($shipmentCollection = $order->getShipmentCollection()) {
             /** @var Shipment $shipment */
             foreach ($shipmentCollection as $shipment) {
                 if ($shipment->isSystem()) {
                     continue;
                 }
                 /** @var ShipmentItemCollection $shipmentItemCollection */
                 if ($shipmentItemCollection = $shipment->getShipmentItemCollection()) {
                     if ($shipmentItemCollection->getItemByBasketCode($this->getBasketCode()) && $shipment->isShipped()) {
                         $result->addError(new ResultError(Loc::getMessage('SALE_BASKET_ITEM_REMOVE_IMPOSSIBLE_BECAUSE_SHIPPED', array('#PRODUCT_NAME#' => $this->getField('NAME'))), 'SALE_BASKET_ITEM_REMOVE_IMPOSSIBLE_BECAUSE_SHIPPED'));
                         return $result;
                     }
                 }
             }
         }
     }
     $r = $this->setField("QUANTITY", 0);
     if (!$r->isSuccess()) {
         $result->addErrors($r->getErrors());
         return $result;
     }
     $bundleCollection = null;
     if ($this->isBundleParent()) {
         /** @var Basket $bundleCollection */
         $bundleCollection = $this->getBundleCollection();
     }
     if (!$this->isBundleChild()) {
         /** @var Result $r */
         $r = parent::delete();
         if (!$r->isSuccess()) {
             $result->addErrors($r->getErrors());
             return $result;
         }
     }
     if ($bundleCollection !== null) {
         /** @var BasketItem $bundleBasketItem */
         foreach ($bundleCollection as $bundleBasketItem) {
             /** @var Result $r */
             $r = $bundleBasketItem->delete();
             if (!$r->isSuccess()) {
                 $result->addErrors($r->getErrors());
             }
         }
     }
     return $result;
 }
Exemplo n.º 24
0
 /**
  * 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;
 }
Exemplo n.º 25
0
 /**
  * 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;
 }
Exemplo n.º 26
0
 /**
  * @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;
 }
Exemplo n.º 27
0
 /**
  * @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();
 }
Exemplo n.º 28
0
 /**
  * @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;
 }
Exemplo n.º 29
0
 /**
  *
  * @param array $values
  * @return Result
  * @throws Main\ArgumentOutOfRangeException
  * @throws Main\NotSupportedException
  * @throws \Exception
  */
 public function setFields(array $values)
 {
     $resultData = array();
     $result = new Result();
     $oldValues = null;
     foreach ($values as $key => $value) {
         $oldValues[$key] = $this->fields->get($key);
     }
     if ($eventName = static::getEntityEventName()) {
         $event = new Main\Event('sale', 'OnBefore' . $eventName . 'SetFields', array('ENTITY' => $this, 'VALUES' => $values, 'OLD_VALUES' => $oldValues));
         $event->send();
         if ($event->getResults()) {
             /** @var Main\EventResult $eventResult */
             foreach ($event->getResults() as $eventResult) {
                 if ($eventResult->getType() == Main\EventResult::SUCCESS) {
                     if ($eventResultData = $eventResult->getParameters()) {
                         if (isset($eventResultData['VALUES'])) {
                             $values = $eventResultData['VALUES'];
                         }
                     }
                 } elseif ($eventResult->getType() == Main\EventResult::ERROR) {
                     $errorMsg = new ResultError(Main\Localization\Loc::getMessage('SALE_EVENT_ON_BEFORE_' . strtoupper($eventName) . '_SET_FIELDS_ERROR'), 'SALE_EVENT_ON_BEFORE_' . strtoupper($eventName) . '_SET_FIELDS_ERROR');
                     if ($eventResultData = $eventResult->getParameters()) {
                         if (isset($eventResultData['ERROR']) && $eventResultData['ERROR'] instanceof ResultError) {
                             $errorMsg = $eventResultData['ERROR'];
                         }
                     }
                     $result->addError($errorMsg);
                 }
             }
         }
     }
     if (!$result->isSuccess()) {
         return $result;
     }
     $isStartField = $this->isStartField();
     foreach ($values as $key => $value) {
         $r = $this->setField($key, $value);
         if (!$r->isSuccess()) {
             $data = $r->getData();
             if (!empty($data) && is_array($data)) {
                 $resultData = array_merge($resultData, $data);
             }
             $result->addErrors($r->getErrors());
         }
     }
     if (!empty($resultData)) {
         $result->setData($resultData);
     }
     if ($isStartField) {
         $hasMeaningfulFields = $this->hasMeaningfulField();
         /** @var Result $r */
         $r = $this->doFinalAction($hasMeaningfulFields);
         if (!$r->isSuccess()) {
             $result->addErrors($r->getErrors());
         } else {
             if (($data = $r->getData()) && !empty($data) && is_array($data)) {
                 $result->setData($result->getData() + $data);
             }
         }
     }
     return $result;
 }
Exemplo n.º 30
0
 /**
  * @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;
 }