3namespace Bitrix\Catalog\Component;
5use Bitrix\Catalog\Access\AccessController;
6use Bitrix\Catalog\Access\ActionDictionary;
7use Bitrix\Catalog\Access\Permission\PermissionDictionary;
8use Bitrix\Catalog\Config;
9use Bitrix\Catalog\StoreTable;
10use Bitrix\Catalog\ProductTable;
11use Bitrix\Catalog\StoreProductTable;
12use Bitrix\Main\Component\ParameterSigner;
14use Bitrix\Main\Engine\Contract\Controllerable;
15use Bitrix\Main\Errorable;
16use Bitrix\Main\ErrorableImplementation;
17use Bitrix\Main\Loader;
18use Bitrix\Main\Localization\Loc;
19use Bitrix\Main\UI\PageNavigation;
20use Bitrix\Main\Grid\Options;
21use Bitrix\Main\Entity;
23Loc::loadLanguageFile(
$_SERVER[
'DOCUMENT_ROOT'] .
BX_ROOT .
'/modules/catalog/install/components/bitrix/catalog.productcard.store.amount/class.php');
36 protected const GRID_NAME =
'productcard_store_amount';
50 if (!isset($this->variationIds))
53 $variations = \CCatalogSku::getOffersList($productId);
54 if (isset($variations[$productId]))
56 $this->variationIds = array_column($variations[$productId],
'ID');
60 $this->variationIds = [$productId];
69 return self::GRID_NAME .
'_' . $this->
getEntityId();
74 if (!isset($this->storesCount))
81 '!=QUANTITY_RESERVED' => 0,
83 '=STORE.ACTIVE' =>
'Y',
88 AccessController::getCurrent()->getEntityFilter(
89 ActionDictionary::ACTION_STORE_VIEW,
90 StoreProductTable::class
110 $offset =
$params[
'offset'] ?? 0;
111 $limit =
$params[
'limit'] ??
null;
116 '=STORE.ACTIVE' =>
'Y',
121 AccessController::getCurrent()->getEntityFilter(
122 ActionDictionary::ACTION_STORE_VIEW,
123 StoreProductTable::class
128 'select' => [
'SID_DISTINCT'],
135 $storeIds = array_column($storeProductData,
'SID_DISTINCT');
136 $storeIds = array_slice($storeIds, $offset, $limit);
146 '=STORE_ID' => $storeIds,
148 '=STORE.ACTIVE' =>
'Y',
152 $fetchedVariationIds = array_column($storeProductData,
'PRODUCT_ID');
156 foreach ($variationsData as $variationData)
158 $variations[$variationData[
'ID']] = $variationData;
162 foreach ($storeProductData as $storeProduct)
164 $productData = $variations[$storeProduct[
'PRODUCT_ID']];
166 if ((
float)$storeProduct[
'QUANTITY_RESERVED'] === 0.0 && (
float)$storeProduct[
'AMOUNT'] === 0.0)
171 $storeId = (int)$storeProduct[
'STORE_ID'];
172 $amount = (float)$productData[
'PURCHASING_PRICE'] * (
float)$storeProduct[
'AMOUNT'];
175 $currency = $productData[
'PURCHASING_CURRENCY'];
177 if (!isset($stores[$storeId]))
179 $storeIds[] = $storeId;
181 $stores[$storeId] = [
189 if (!isset($stores[$storeId][
'QUANTITY'][$measureId]))
191 $stores[$storeId][
'QUANTITY'][$measureId] = [
192 'QUANTITY_COMMON' => (float)$storeProduct[
'AMOUNT'],
193 'QUANTITY_RESERVED' => (
float)$storeProduct[
'QUANTITY_RESERVED'],
194 'MEASURE_ID' => $measureId,
199 $stores[$storeId][
'QUANTITY'][$measureId][
'QUANTITY_COMMON'] += (float)$storeProduct[
'AMOUNT'];
200 $stores[$storeId][
'QUANTITY'][$measureId][
'QUANTITY_RESERVED'] += (float)$storeProduct[
'QUANTITY_RESERVED'];
204 if (!isset($stores[$storeId][
'AMOUNT'][
$currency]))
206 $stores[$storeId][
'AMOUNT'][
$currency] = [
219 foreach ($storesInfo as $storeInfo)
221 if (isset($stores[(
int)$storeInfo[
'ID']]))
223 $stores[(int)$storeInfo[
'ID']][
'TITLE'] = $storeInfo[
'TITLE'];
237 if (
count($storeIds) > 0)
239 return StoreTable::getList([
240 'select' => [
'ID',
'TITLE'],
259 'PURCHASING_CURRENCY',
276 $quantityCommon =
'';
277 $quantityReserved =
'';
279 foreach (
$storeTotal[
'QUANTITY'] as $storeQuantity)
284 "<span class='total-info'>
285 <span class='total-info-value'>{$storeQuantity['QUANTITY']}</span>
290 "<span class='total-info'>
291 <span class='total-info-value'>{$storeQuantity['QUANTITY_COMMON']}</span>
295 $measureReservedInfo =
296 "<span class='total-info'>
297 <span class='total-info-value'>{$storeQuantity['QUANTITY_RESERVED']}</span>
301 $quantity .= $measureInfo .
'<br>';
302 $quantityCommon .= $measureCommonInfo .
'<br>';
303 $quantityReserved .= $measureReservedInfo .
'<br>';
310 if (isset($storeAmount[
'CURRENCY']))
313 "<span class='total-info-value'>"
314 . \CCurrencyLang::CurrencyFormat($storeAmount[
'AMOUNT'], $storeAmount[
'CURRENCY'],
false)
318 "<span class='total-info'>"
319 . \CCurrencyLang::getPriceControl(
321 $storeAmount[
'CURRENCY']
325 $amount .= $amountBlock.
'<br>';
331 "QUANTITY" => $quantity,
332 "QUANTITY_COMMON" => $quantityCommon,
333 "QUANTITY_RESERVED" => $quantityReserved,
344 if (!isset($this->storeTotal))
365 foreach ($variationsTotalData as $variationData)
367 $variationData[
'MEASURE_ID'] = $variationData[
'MEASURE_ID'] ?? (int)$this->
getDefaultMeasure()[
'ID'];
369 if (!isset($storeTotalData[
'QUANTITY'][$variationData[
'MEASURE_ID']]))
371 $storeTotalData[
'QUANTITY'][$variationData[
'MEASURE_ID']] = [
373 'QUANTITY_COMMON' => 0.0,
374 'QUANTITY_RESERVED' => 0.0,
375 'MEASURE_ID' => $variationData[
'MEASURE_ID'],
379 $quantityValue = (float)$variationData[
'QUANTITY_COMMON'] - (
float)$variationData[
'QUANTITY_RESERVED'];
381 $storeTotalData[
'QUANTITY'][$variationData[
'MEASURE_ID']][
'QUANTITY'] += $quantityValue;
382 $storeTotalData[
'QUANTITY'][$variationData[
'MEASURE_ID']][
'QUANTITY_COMMON'] += (float)$variationData[
'QUANTITY_COMMON'];
383 $storeTotalData[
'QUANTITY'][$variationData[
'MEASURE_ID']][
'QUANTITY_RESERVED'] += (float)$variationData[
'QUANTITY_RESERVED'];
385 if (!isset($storeTotalData[
'AMOUNT'][$variationData[
'CURRENCY']]))
387 $storeTotalData[
'AMOUNT'][$variationData[
'CURRENCY']] = [
389 'CURRENCY' => $variationData[
'CURRENCY'],
392 $commonPrice = (float)$variationData[
'QUANTITY_COMMON'] * (
float)$variationData[
'PRICE'];
393 $storeTotalData[
'AMOUNT'][$variationData[
'CURRENCY']][
'AMOUNT'] += $commonPrice;
397 $this->storeTotal = $storeTotalData;
413 '=STORE.ACTIVE' =>
'Y',
418 AccessController::getCurrent()->getEntityFilter(
419 ActionDictionary::ACTION_STORE_VIEW,
420 StoreProductTable::class
427 'MEASURE_ID' =>
'PRODUCT.MEASURE',
428 'PRICE' =>
'PRODUCT.PURCHASING_PRICE',
429 'CURRENCY' =>
'PRODUCT.PURCHASING_CURRENCY',
433 'group' => [
'PRODUCT_ID'],
439 foreach ($commonProductData as $productData)
441 $products[$productData[
'PRODUCT_ID']] = $productData;
451 '=STORE.ACTIVE' =>
'Y',
453 'group' => [
'PRODUCT_ID'],
459 foreach ($productQuantityReservedData as $productData)
461 $products[$productData[
'PRODUCT_ID']][
'QUANTITY_RESERVED'] = $productData[
'RESERVED_AMOUNT'];
475 if ($measureId ===
null)
480 if (!isset($this->measures[$measureId]))
482 $measure = \CCatalogMeasure::getList([], [
'=ID' => $measureId])->Fetch();
486 $this->measures[$measureId] = $measure[
'SYMBOL'];
490 $this->measures[$measureId] =
'';
494 return $this->measures[$measureId];
503 if (!isset($this->defaultMeasure))
505 $fetchedMeasure = \CCatalogMeasure::getList([], [
'=IS_DEFAULT' =>
'Y'])->Fetch();
508 $this->defaultMeasure = $fetchedMeasure;
513 $this->defaultMeasure = [
525 return ParameterSigner::signParameters(
533 return 'bitrix:catalog.productcard.store.amount';
getStoreAmountSignedParameters()
getStoreAmountComponentName()
getProductStores(array $params=[])
getStoresInfo(array $storeIds)
getMeasure(?int $measureId)
getVariationsData(array $variationIds)
__construct(int $entityId)
getVariationsTotalData(array $variationIds)
getStoreAmountParameters()
static getList(array $parameters=array())
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
$_SERVER["DOCUMENT_ROOT"]
htmlspecialcharsbx($string, $flags=ENT_COMPAT, $doubleEncode=true)
if(!function_exists("bx_hmac")) $amount
</p ></td >< td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 2.0pt 0cm 2.0pt;height:9.0pt'>< p class=Normal align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center;line-height:normal'>< a name=ТекстовоеПоле54 ></a ><?=($taxRate > count( $arTaxList) > 0) ? $taxRate."%"
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']