%PDF- %PDF-
| Direktori : /home/bitrix/www/bitrix/modules/sale/lib/internals/ |
| Current File : /home/bitrix/www/bitrix/modules/sale/lib/internals/transferprovidercompatibility.php |
<?php
namespace Bitrix\Sale\Internals;
use Bitrix\Catalog;
use Bitrix\Sale;
use Bitrix\Main;
/**
* Class TransferProviderCompatibility
*/
class TransferProviderCompatibility extends TransferProviderBase
{
/**
* @param array $products
*
* @return Sale\Result
* @throws Main\ObjectNotFoundException
*/
public function tryShip(array $products)
{
Main\Loader::includeModule('catalog');
$result = new Sale\Result();
$tryShipmentItemList = array();
$reservedQuantityList = array();
$shipmentItemParents = array();
$shipmentItemList = static::getShipmentItemListFromProducts($products);
if (!empty($shipmentItemList))
{
/** @var Sale\ShipmentItem $shipmentItem */
foreach ($shipmentItemList as $shipmentItem)
{
/** @var Sale\ShipmentItemCollection $shipmentItemCollection */
$shipmentItemCollection = $shipmentItem->getCollection();
if (!$shipmentItemCollection)
{
throw new Main\ObjectNotFoundException('Entity "ShipmentItemCollection" not found');
}
$shipment = $shipmentItemCollection->getShipment();
if (!$shipment)
{
throw new Main\ObjectNotFoundException('Entity "Shipment" not found');
}
$shipmentItemParents[$shipmentItem->getInternalIndex()] = $shipment;
$basketItem = $shipmentItem->getBasketItem();
$provider = $basketItem->getProviderEntity();
if ($provider instanceof Catalog\Product\CatalogProvider)
{
continue;
}
if ($shipment->needShip() === Sale\Internals\Catalog\Provider::SALE_TRANSFER_PROVIDER_SHIPMENT_NEED_SHIP
&& !array_key_exists($shipment->getInternalIndex(), $reservedQuantityList))
{
$reservedQuantityList[$shipment->getInternalIndex()] = static::getReservedQuantity($shipment);
}
$tryShipmentItemList[$shipmentItem->getInternalIndex()] = $shipmentItem;
}
}
if (!empty($tryShipmentItemList))
{
$reservedQuantityList = array();
$r = Sale\Provider::tryShipmentItemList($tryShipmentItemList);
if (!$r->isSuccess())
{
$result->addErrors($r->getErrors());
}
$data = $r->getData();
if (!empty($data) && is_array($data))
{
/**
* @var string $basketCode
* @var Sale\Result $resultTryShipment
*/
foreach ($data as $basketCode => $resultTryShipment)
{
if (!$resultTryShipment->isSuccess())
{
$result->addErrors($resultTryShipment->getErrors());
}
}
}
if ($result->isSuccess())
{
if (!empty($reservedQuantityList))
{
static::setReservedQuantityToShipmentItem($tryShipmentItemList, $reservedQuantityList);
}
$resultList = static::createListFromTryShipmentResult($tryShipmentItemList, $r);
}
}
if (!empty($resultList))
{
$result->addData(
array(
'TRY_SHIP_PRODUCTS_LIST' => $resultList
)
);
}
return $result;
}
/**
* @param array $products
*
* @return Sale\Result
* @throws Main\ObjectNotFoundException
*/
public function isNeedShip(array $products)
{
Main\Loader::includeModule('catalog');
$result = new Sale\Result();
$resultNeedShipList = array();
$needShipmentItemList = array();
$shipmentItemList = static::getShipmentItemListFromProducts($products);
if (!empty($shipmentItemList))
{
/** @var Sale\ShipmentItem $shipmentItem */
foreach ($shipmentItemList as $shipmentItem)
{
/** @var Sale\ShipmentItemCollection $shipmentItemCollection */
$shipmentItemCollection = $shipmentItem->getCollection();
if (!$shipmentItemCollection)
{
throw new Main\ObjectNotFoundException('Entity "ShipmentItemCollection" not found');
}
$shipment = $shipmentItemCollection->getShipment();
if (!$shipment)
{
throw new Main\ObjectNotFoundException('Entity "Shipment" not found');
}
$basketItem = $shipmentItem->getBasketItem();
$provider = $basketItem->getProviderEntity();
if ($provider instanceof Catalog\Product\CatalogProvider)
{
continue;
}
$needShipmentItemList[$shipmentItem->getInternalIndex()] = $shipmentItem;
}
}
if (!empty($needShipmentItemList))
{
$r = Sale\Provider::isNeedShip($needShipmentItemList);
if (!$r->isSuccess())
{
$result->addErrors($r->getErrors());
}
$data = $r->getData();
if (!empty($data) && is_array($data))
{
$needShipmentItemList = $data;
}
}
if (!empty($needShipmentItemList))
{
$result->setData(
array(
'IS_NEED_SHIP' => $needShipmentItemList
)
);
}
return $result;
}
/**
* @param Sale\Shipment $shipment
*
* @return array
* @throws Main\ObjectNotFoundException
*/
private static function getReservedQuantity(Sale\Shipment $shipment)
{
$reservedQuantityList = array();
$shipmentItemCollection = $shipment->getShipmentItemCollection();
if (!$shipmentItemCollection)
{
throw new Main\ObjectNotFoundException('Entity "ShipmentItemCollection" not found');
}
/** @var Sale\ShipmentItem $shipmentItem */
foreach ($shipmentItemCollection as $shipmentItem)
{
$reservedQuantityList[$shipmentItem->getInternalIndex()] = $shipmentItem->getReservedQuantity();
}
return $reservedQuantityList;
}
/**
* @param Sale\ShipmentItem[] $shipmentItemList
* @param array $reservedQuantityList
*
* @throws Main\ObjectNotFoundException
*/
private static function setReservedQuantityToShipmentItem($shipmentItemList, array $reservedQuantityList)
{
/** @var Sale\ShipmentItem $shipmentItem */
foreach ($shipmentItemList as $shipmentItem)
{
$shipmentItemIndex = $shipmentItem->getInternalIndex();
if (!empty($reservedQuantityList[$shipmentItemIndex]))
{
$shipmentItem->setFieldNoDemand('RESERVED_QUANTITY', $reservedQuantityList[$shipmentItemIndex]);
}
}
}
/**
* @param array $products
*
* @return Sale\Result
* @throws Main\ObjectNotFoundException
*/
public function ship(array $products)
{
$basketItemList = array();
$shipmentItemList = array();
$basketItemShipmentItemList = array();
$shipmentItemQuantityList = array();
$oneReserveStatus = true;
$needReserved = null;
$reservedList = array();
$resultList = array();
foreach ($products as $productId => $itemData)
{
$fields = $itemData;
if (!empty($fields['SHIPMENT_ITEM_LIST']))
{
/** @var Sale\ShipmentItem $shipmentItem */
foreach ($fields['SHIPMENT_ITEM_LIST'] as $shipmentIndexItem => $shipmentItem)
{
$shipmentItemList[$shipmentIndexItem] = $shipmentItem;
$basketItem = $shipmentItem->getBasketItem();
if (!$basketItem)
{
throw new Main\ObjectNotFoundException('Entity "BasketItemBase" not found');
}
//
$basketCode = $basketItem->getBasketCode();
$basketItemList[$basketCode] = $basketItem;
//
// /** @var Sale\ShipmentItemCollection $shipmentItemCollection */
// $shipmentItemCollection = $shipmentItem->getCollection();
// if (!$shipmentItemCollection)
// {
// throw new Main\ObjectNotFoundException('Entity "ShipmentItemCollection" not found');
// }
//
// $shipment = $shipmentItemCollection->getShipment();
// if (!$shipment)
// {
// throw new Main\ObjectNotFoundException('Entity "Shipment" not found');
// }
//
$basketItemShipmentItemList[$basketCode][$shipmentIndexItem] = $shipmentItem;
}
}
if (!empty($fields['NEED_RESERVE_LIST']))
{
foreach ($fields['NEED_RESERVE_LIST'] as $shipmentItemIndex => $reserved)
{
$reserveValue = $reserved ? 'Y': 'N';
$reservedList[$reserveValue][] = $shipmentItemIndex;
if (!empty($reservedList) && !isset($reservedList[$reserveValue]))
{
$oneReserveStatus = false;
}
elseif ($needReserved === null)
{
$needReserved = $reserved;
}
}
}
if (!empty($fields['SHIPMENT_ITEM_QUANTITY_LIST']))
{
foreach ($fields['SHIPMENT_ITEM_QUANTITY_LIST'] as $shipmentItemIndex => $quantity)
{
$shipmentItemQuantityList[$fields['BASKET_CODE']][$shipmentItemIndex] = $quantity;
}
}
$resultList[$productId] = false;
}
$result = new Sale\Result();
$r = static::tryShip($products);
if (!$r->isSuccess())
{
$result->addErrors($r->getErrors());
}
elseif ($r->hasWarnings())
{
$result->addWarnings($r->getWarnings());
}
if (!empty($basketItemList))
{
/** @var Sale\BasketItemBase $basketItem */
foreach ($basketItemList as $basketItem)
{
$productId = $basketItem->getProductId();
$productData = $products[$productId];
$basketCode = $basketItem->getBasketCode();
$quantity = $productData['QUANTITY_LIST'][$basketCode];
$shipmentFieldsList = array();
if (!$oneReserveStatus)
{
/**
* @var string $reserveValue
* @var Sale\ShipmentItem $shipmentItem
*/
foreach ($reservedList as $reserveValue => $shipmentItemIndexList)
{
$quantity = 0;
foreach ($shipmentItemIndexList as $shipmentItemIndex)
{
if (isset($shipmentItemQuantityList[$basketCode][$shipmentItemIndex]))
{
$quantity += $shipmentItemQuantityList[$basketCode][$shipmentItemIndex];
}
}
$shipmentFieldsList[] = array(
'BASKET_ITEM' => $basketItem,
'BASKET_CODE' => $basketItem->getBasketCode(),
'PRODUCT_ID' => $productId,
'QUANTITY' => abs($quantity),
'DEDUCTED' => $quantity < 0,
'RESERVED' => $reserveValue,
);
}
}
else
{
$shipmentFieldsList[] = array(
'BASKET_ITEM' => $basketItem,
'BASKET_CODE' => $basketItem->getBasketCode(),
'PRODUCT_ID' => $productId,
'QUANTITY' => abs($quantity),
'DEDUCTED' => $quantity < 0,
'RESERVED' => $needReserved,
);
}
$provider = $basketItem->getProvider();
$storeDataList = array();
if (!empty($productData['STORE_DATA_LIST']))
{
$storeDataList = $productData['STORE_DATA_LIST'];
}
foreach ($shipmentFieldsList as $shipFields)
{
$r = Sale\Provider::shipProductData($provider, $shipFields, $storeDataList);
if ($r->isSuccess())
{
$productId = $basketItem->getProductId();
$resultList[$productId] = true;
}
elseif ($r->hasWarnings())
{
$result->addWarnings($r->getWarnings());
}
else
{
$result->addErrors($r->getErrors());
}
}
}
}
if (!empty($resultList))
{
$result->setData(
array(
'SHIPPED_PRODUCTS_LIST' => $resultList
)
);
}
return $result;
}
/**
* @param array $products
*
* @return Sale\Result
* @throws Main\ObjectNotFoundException
*/
public function reserve(array $products)
{
$result = new Sale\Result();
$resultList = array();
foreach ($products as $productId => $productData)
{
$productQuantity = 0;
if (array_key_exists('QUANTITY', $productData))
{
$productQuantity = $productData['QUANTITY'];
}
elseif (!empty($productData['QUANTITY_LIST']))
{
foreach ($productData['QUANTITY_LIST'] as $basketCode => $quantity)
{
$productQuantity += $quantity;
}
}
/**
* @var Sale\ProviderBase $product
* @var Sale\Result $r
*/
$r = Sale\Provider::reserveProduct($this->getProviderClass(), $productId, $productQuantity);
if ($r->isSuccess())
{
$fields = $r->getData();
if (!empty($fields))
{
$resultList[$productId] = array(
'QUANTITY_RESERVED' => $fields['QUANTITY']
);
}
}
else
{
$result->addErrors($r->getErrors());
}
if ($r->hasWarnings())
{
$result->addWarnings($r->getWarnings());
}
}
if (!empty($resultList))
{
$result->setData(
array(
'RESERVED_PRODUCTS_LIST' => $resultList
)
);
}
return $result;
}
/**
* @param array $products
*
* @return array
*/
private static function getShipmentItemListFromProducts(array $products)
{
$resultList = array();
foreach ($products as $productData)
{
/** @var Sale\ShipmentItem $shipmentItem */
foreach ($productData['SHIPMENT_ITEM_LIST'] as $shipmentItem)
{
if (!array_key_exists($shipmentItem->getInternalIndex(), $resultList))
{
$resultList[$shipmentItem->getInternalIndex()] = $shipmentItem;
}
}
}
return $resultList;
}
/**
* @param Sale\ShipmentItem[] $shipmentItemList
* @param Sale\Result $result
*
* @return array
* @throws Main\ObjectNotFoundException
*/
private static function createListFromTryShipmentResult($shipmentItemList, Sale\Result $result)
{
if (!$result->isSuccess())
{
return array();
}
$basketCodeList = array();
$basketItemList = array();
foreach ($shipmentItemList as $shipmentItem)
{
$basketItem = $shipmentItem->getBasketItem();
$basketCodeList[$shipmentItem->getInternalIndex()] = $basketItem->getBasketCode();
$basketItemList[$basketItem->getBasketCode()] = $basketItem;
}
$resultList = array();
$data = $result->getData();
if (!empty($data))
{
/**
* @var string $basketCode
* @var Sale\Result $resultTryShipment
*/
foreach ($data as $basketCode => $resultTryShipment)
{
if (!isset($basketItemList[$basketCode]))
{
throw new Main\ObjectNotFoundException('Entity "Basket" not found');
}
$basketItem = $basketItemList[$basketCode];
$resultList[$basketItem->getProductId()] = $resultTryShipment->isSuccess();
}
}
return $resultList;
}
/**
* @param PoolQuantity $pool
* @param array $products
* @param array $productTryShipList
*
* @return Sale\Result
* @throws Main\ArgumentException
*/
public function setItemsResultAfterTryShip(PoolQuantity $pool, array $products, array $productTryShipList)
{
return new Sale\Result();
}
/**
* @param PoolQuantity $pool
* @param array $products
* @param array $productTryShipList
*
* @return Sale\Result
* @throws Main\ArgumentException
*/
public function setItemsResultAfterTryUnship(PoolQuantity $pool, array $products, array $productTryShipList)
{
return new Sale\Result();
}
/**
* @param array $products
*
* @return Sale\Result
* @throws Main\ObjectNotFoundException
*/
public function getAvailableQuantity(array $products)
{
/** @var Sale\SaleProviderBase $providerClass */
return Sale\Provider::getAvailableQuantity($this->getProviderClass(), $products, $this->getContext());
}
/**
* @param array $products
*
* @return Sale\Result
* @throws Main\ObjectNotFoundException
*/
public function getAvailableQuantityAndPrice(array $products)
{
/** @var Sale\SaleProviderBase $providerClass */
return Sale\Provider::getAvailableQuantityAndPrice($this->getProviderClass(), $products, $this->getContext());
}
/**
* @param array $products
*
* @return Sale\Result
* @throws Main\ObjectNotFoundException
*/
public function getProductData(array $products)
{
$providerName = null;
$providerClass = $this->getProviderClass();
if ($providerClass)
{
$reflect = new \ReflectionClass($providerClass);
$providerName = $reflect->getName();
}
return Sale\Provider::getProductDataByList($products, $providerName, array('PRICE','QUANTITY','CHECK_DISCOUNT', 'AVAILABLE_QUANTITY', 'COUPONS'), $this->getContext());
}
/**
* @param array $products
*
* @return Sale\Result
*/
public function getBundleItems(array $products)
{
return Sale\Provider::getBundleChildItems($this->getProviderClass(), $products);
}
/**
* @return Sale\Result
*/
public function getStoresCount()
{
$context = $this->getContext();
$parameters = (isset($context['SITE_ID'])? array("SITE_ID" => $context['SITE_ID']) : array());
return Sale\Provider::getStoresCount($parameters);
}
/**
* @param array $products
*
* @return mixed
* @throws Main\SystemException
*/
public function deliver(array $products)
{
Main\Loader::includeModule('catalog');
$result = new Sale\Result();
$resultList = array();
$productOrderList = Catalog\Product\CatalogProvider::createOrderListFromProducts($products);
foreach ($products as $productId => $productData)
{
if (empty($productOrderList[$productId]))
{
continue;
}
/** @var Sale\Order $order */
foreach ($productOrderList[$productId] as $order)
{
$resultList[$productId] = false;
if (!empty($productData['SHIPMENT_ITEM_LIST']))
{
$quantityList = array();
if (isset($productData['QUANTITY_LIST']))
{
$quantityList = $productData['QUANTITY_LIST'];
}
/**
* @var $shipmentIndex
* @var Sale\ShipmentItem $shipmentItem
*/
foreach ($productData['SHIPMENT_ITEM_LIST'] as $shipmentIndex => $shipmentItem)
{
/** @var Sale\ShipmentItemCollection $shipmentItemCollection */
$shipmentItemCollection = $shipmentItem->getCollection();
if (!$shipmentItemCollection)
{
throw new Main\ObjectNotFoundException('Entity "ShipmentItemCollection" not found');
}
$shipment = $shipmentItemCollection->getShipment();
$basketItem = $shipmentItem->getBasketItem();
$basketCode = $basketItem->getBasketCode();
$quantity = null;
if (isset($quantityList[$basketCode]))
{
$quantity = $quantityList[$basketCode];
}
$fields = array(
"PRODUCT_ID" => $productId,
"USER_ID" => $order->getUserId(),
"PAID" => $order->isPaid() ? 'Y' : 'N',
"ORDER_ID" => $order->getId(),
"BASKET_CODE" => $basketCode,
"CALLBACK_FUNC" => $basketItem->getField('CALLBACK_FUNC'),
"MODULE" => $basketItem->getField('MODULE'),
"ALLOW_DELIVERY" => $shipment->getField('ALLOW_DELIVERY'),
"QUANTITY" => $quantity,
);
$r = Sale\Provider::deliverProductData($this->getProviderClass(), $fields);
if ($r->isSuccess())
{
$resultData = $r->getData();
if (array_key_exists($productId, $resultData))
{
$resultList[$productId] = $resultData[$productId];
}
}
}
}
}
}
if (!empty($resultList))
{
$result->setData(
array(
'DELIVER_PRODUCTS_LIST' => $resultList
)
);
}
return $result;
}
/**
* @param array $products
*
* @return mixed
* @throws Main\SystemException
*/
public function viewProduct(array $products)
{
global $USER;
Main\Loader::includeModule('catalog');
$result = new Sale\Result();
$resultList = array();
$productOrderList = Catalog\Product\CatalogProvider::createOrderListFromProducts($products);
foreach ($products as $productId => $productData)
{
$productParamsList = array();
if (!empty($productOrderList[$productId]))
{
/** @var Sale\Order $order */
foreach ($productOrderList[$productId] as $order)
{
$hash = $order->getUserId()."|".$order->getSiteId();
if (!isset($productParamsList[$hash]))
{
$productParamsList[$hash] = array(
'PRODUCT_ID' => $productId,
'USER_ID' => $order->getUserId(),
'SITE_ID' => $order->getSiteId(),
);
}
}
}
else
{
$hash = $USER->getId() . "|" .SITE_ID;
if (!isset($productParamsList[$hash]))
{
$productParamsList[$hash] = array(
'PRODUCT_ID' => $productId,
'USER_ID' => $USER->getId(),
'SITE_ID' => SITE_ID,
);
}
}
foreach ($productParamsList as $productParams)
{
$r = Sale\Provider::getViewProduct($this->getProviderClass(), $productParams);
if ($r->isSuccess())
{
$resultData = $r->getData();
if (array_key_exists($productId, $resultData))
{
$resultList[$productId] = $resultData[$productId];
}
}
}
}
if (!empty($resultList))
{
$result->setData(
array(
'VIEW_PRODUCTS_LIST' => $resultList
)
);
}
return $result;
}
/**
* @param array $products
*
* @return mixed
* @throws Main\SystemException
*/
public function getProductListStores(array $products)
{
Main\Loader::includeModule('catalog');
$result = new Sale\Result();
$resultList = array();
$productOrderList = Catalog\Product\CatalogProvider::createOrderListFromProducts($products);
foreach ($products as $productId => $productData)
{
$productParamsList = array();
if (!empty($productOrderList[$productId]))
{
/** @var Sale\Order $order */
foreach ($productOrderList[$productId] as $order)
{
$hash = $order->getSiteId();
if (!isset($productParamsList[$hash]))
{
$productParamsList[$hash] = array(
'PRODUCT_ID' => $productId,
'SITE_ID' => $order->getSiteId(),
);
}
}
}
else
{
$hash = SITE_ID;
if (!isset($productParamsList[$hash]))
{
$productParamsList[$hash] = array(
'PRODUCT_ID' => $productId,
'SITE_ID' => SITE_ID,
);
}
}
foreach ($productParamsList as $productParams)
{
$r = Sale\Provider::getStores($this->getProviderClass(), $productParams);
if ($r->isSuccess())
{
$resultData = $r->getData();
if (array_key_exists($productId, $resultData))
{
$resultList[$productId] = $resultData[$productId];
}
}
}
}
if (!empty($resultList))
{
$result->setData(
array(
'PRODUCT_STORES_LIST' => $resultList
)
);
}
return $result;
}
/**
* @param array $items
*
* @return Sale\Result
* @throws Main\ObjectNotFoundException
*/
public function checkBarcode(array $items)
{
$result = new Sale\Result();
$resultList = array();
foreach ($items as $productId => $barcodeParams)
{
/**
* @var Sale\ProviderBase $product
* @var Sale\Result $r
*/
$r = Sale\Provider::checkBarcode($this->getProviderClass(), $barcodeParams);
if ($r->isSuccess())
{
$resultData = $r->getData();
if (!empty($resultData) && array_key_exists($productId, $resultData))
{
$resultList[$barcodeParams['BARCODE']] = $resultData[$productId];
}
}
else
{
$result->addErrors($r->getErrors());
}
if ($r->hasWarnings())
{
$result->addWarnings($r->getWarnings());
}
}
if (!empty($resultList))
{
$result->setData(
array(
'RESERVED_PRODUCTS_LIST' => $resultList
)
);
}
return $result;
}
/**
* @param array $products
*
* @return mixed
* @throws Main\SystemException
*/
public function recurring(array $products)
{
global $USER;
Main\Loader::includeModule('catalog');
$result = new Sale\Result();
$resultList = array();
$productOrderList = Catalog\Product\CatalogProvider::createOrderListFromProducts($products);
foreach ($products as $productId => $productData)
{
$productParamsList = array();
if (!empty($productOrderList[$productId]))
{
/** @var Sale\Order $order */
foreach ($productOrderList[$productId] as $order)
{
$hash = $order->getUserId();
if (!isset($productParamsList[$hash]))
{
$productParamsList[$hash] = array(
'PRODUCT_ID' => $productId,
'USER_ID' => $order->getUserId(),
);
}
}
}
else
{
$hash = $USER->getId();
if (!isset($productParamsList[$hash]))
{
$productParamsList[$hash] = array(
'PRODUCT_ID' => $productId,
'USER_ID' => $USER->getId(),
);
}
}
foreach ($productParamsList as $productParams)
{
$r = Sale\Provider::recurringProduct($this->getProviderClass(), $productParams);
if ($r->isSuccess())
{
$resultData = $r->getData();
if (array_key_exists($productId, $resultData))
{
$resultList[$productId] = $resultData[$productId];
}
}
}
}
if (!empty($resultList))
{
$result->setData(
array(
'RECURRING_PRODUCTS_LIST' => $resultList
)
);
}
return $result;
}
}