This commit is contained in:
parent
be1447c6ec
commit
0ca2527c5f
@ -1,3 +1,6 @@
|
|||||||
|
## 2023-04-10 v.6.3.2
|
||||||
|
- Добавлена возможность экспорта неактивных товаров и торговых предложений
|
||||||
|
|
||||||
## 2023-04-10 v.6.3.1
|
## 2023-04-10 v.6.3.1
|
||||||
- Добавлена валидация свойств товаров и торговых предложений в настройках экспорта
|
- Добавлена валидация свойств товаров и торговых предложений в настройках экспорта
|
||||||
|
|
||||||
|
@ -1 +1 @@
|
|||||||
- Добавлена валидация свойств товаров и торговых предложений в настройках экспорта
|
- Добавлена возможность экспорта неактивных товаров и торговых предложений
|
||||||
|
@ -159,6 +159,7 @@ if (file_exists($_SERVER['DOCUMENT_ROOT'] . '/bitrix/php_interface/retailcrm/exp
|
|||||||
$fileSetup->maxOffersValue = $maxOffersValue ?? null;
|
$fileSetup->maxOffersValue = $maxOffersValue ?? null;
|
||||||
$fileSetup->filePath = $SETUP_FILE_NAME;
|
$fileSetup->filePath = $SETUP_FILE_NAME;
|
||||||
$fileSetup->loadPurchasePrice = $loadPurchasePrice === 'Y';
|
$fileSetup->loadPurchasePrice = $loadPurchasePrice === 'Y';
|
||||||
|
$fileSetup->loadNonActivity = $loadNonActivity === 'Y';
|
||||||
$fileSetup->basePriceId = CatalogRepository::getBasePriceId($fileSetup->profileId);
|
$fileSetup->basePriceId = CatalogRepository::getBasePriceId($fileSetup->profileId);
|
||||||
|
|
||||||
if (!is_array($fileSetup->iblocksForExport) || count($fileSetup->iblocksForExport) === 0) {
|
if (!is_array($fileSetup->iblocksForExport) || count($fileSetup->iblocksForExport) === 0) {
|
||||||
|
@ -66,6 +66,7 @@ if (($ACTION === 'EXPORT' || $ACTION === 'EXPORT_EDIT' || $ACTION === 'EXPORT_CO
|
|||||||
$iblockProperties = $settingsService->getIblockPropsPreset();
|
$iblockProperties = $settingsService->getIblockPropsPreset();
|
||||||
$loadPurchasePrice = $settingsService->loadPurchasePrice;
|
$loadPurchasePrice = $settingsService->loadPurchasePrice;
|
||||||
$iblockExport = $settingsService->iblockExport;
|
$iblockExport = $settingsService->iblockExport;
|
||||||
|
$loadNonActivity = $settingsService->loadNonActivity;
|
||||||
|
|
||||||
if ($iblockExport) {
|
if ($iblockExport) {
|
||||||
$maxOffersValue = $settingsService->getSingleSetting('maxOffersValue');
|
$maxOffersValue = $settingsService->getSingleSetting('maxOffersValue');
|
||||||
@ -491,6 +492,9 @@ if ($STEP === 1) {
|
|||||||
$SETUP_FILE_NAME : $settingsService->setupFileName); ?>" size="50"><br><br>
|
$SETUP_FILE_NAME : $settingsService->setupFileName); ?>" size="50"><br><br>
|
||||||
<span class="text"><?=GetMessage('LOAD_PURCHASE_PRICE')?> </span>
|
<span class="text"><?=GetMessage('LOAD_PURCHASE_PRICE')?> </span>
|
||||||
<input type="checkbox" name="loadPurchasePrice" value="Y" <?=$loadPurchasePrice === 'Y' ? 'checked' : ''?>>
|
<input type="checkbox" name="loadPurchasePrice" value="Y" <?=$loadPurchasePrice === 'Y' ? 'checked' : ''?>>
|
||||||
|
<br>
|
||||||
|
<span class="text"><?=GetMessage('LOAD_NON_ACTIVITY')?> </span>
|
||||||
|
<input type="checkbox" name="loadNonActivity" value="Y" <?=$loadNonActivity === 'Y' ? 'checked' : ''?>>
|
||||||
<br><br><br>
|
<br><br><br>
|
||||||
<?php
|
<?php
|
||||||
if ($isSetupModulePage) { ?>
|
if ($isSetupModulePage) { ?>
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
$arModuleVersion = [
|
$arModuleVersion = [
|
||||||
'VERSION' => '6.3.1',
|
'VERSION' => '6.3.2',
|
||||||
'VERSION_DATE' => '2023-04-10 10:00:00'
|
'VERSION_DATE' => '2023-04-10 18:00:00'
|
||||||
];
|
];
|
||||||
|
@ -7,6 +7,7 @@ $MESS["CATALOG"] = "Каталог";
|
|||||||
$MESS["EXPORT2INTAROCML"] = "Выгрузить в ICML";
|
$MESS["EXPORT2INTAROCML"] = "Выгрузить в ICML";
|
||||||
$MESS["FILENAME"] = "Укажите имя файла данных:";
|
$MESS["FILENAME"] = "Укажите имя файла данных:";
|
||||||
$MESS["LOAD_PURCHASE_PRICE"] = "Выгружать закупочную цену";
|
$MESS["LOAD_PURCHASE_PRICE"] = "Выгружать закупочную цену";
|
||||||
|
$MESS["LOAD_NON_ACTIVITY"] = "Выгружать неактивные товары и торговые предложения";
|
||||||
$MESS["PROPERTY"] = "Свойство, содержащее артикул товара";
|
$MESS["PROPERTY"] = "Свойство, содержащее артикул товара";
|
||||||
$MESS["ALL_CATALOG"] = "Все каталоги";
|
$MESS["ALL_CATALOG"] = "Все каталоги";
|
||||||
$MESS["EXPORT"] = "Экспортировать";
|
$MESS["EXPORT"] = "Экспортировать";
|
||||||
|
@ -164,8 +164,7 @@ class IcmlDirector
|
|||||||
$selectParams->allParams = array_merge($selectParams->configurable, $selectParams->main);
|
$selectParams->allParams = array_merge($selectParams->configurable, $selectParams->main);
|
||||||
|
|
||||||
while ($xmlOffers = $this->xmlOfferDirector->getXmlOffersPart($selectParams, $catalogIblockInfo)) {
|
while ($xmlOffers = $this->xmlOfferDirector->getXmlOffersPart($selectParams, $catalogIblockInfo)) {
|
||||||
$this->icmlWriter->writeOffers($xmlOffers);
|
$this->icmlWriter->writeOffers($xmlOffers, $xmlOffers->activity === 'N');
|
||||||
|
|
||||||
$selectParams->pageNumber++;
|
$selectParams->pageNumber++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -250,9 +249,15 @@ class IcmlDirector
|
|||||||
$paramsForOffer->allParams = array_merge($paramsForOffer->configurable, $paramsForOffer->main);
|
$paramsForOffer->allParams = array_merge($paramsForOffer->configurable, $paramsForOffer->main);
|
||||||
|
|
||||||
do {
|
do {
|
||||||
|
$isNotActiveProduct = false;
|
||||||
|
|
||||||
|
if ($product->activity === 'N') {
|
||||||
|
$isNotActiveProduct = true;
|
||||||
|
}
|
||||||
|
|
||||||
//Если каталог проиндексирован, у товара есть Тип и это простой товар, то просто записываем его
|
//Если каталог проиндексирован, у товара есть Тип и это простой товар, то просто записываем его
|
||||||
if ($product->productType === ProductTable::TYPE_PRODUCT) {
|
if ($product->productType === ProductTable::TYPE_PRODUCT) {
|
||||||
$this->icmlWriter->writeOffers([$product]);
|
$this->icmlWriter->writeOffers([$product], $isNotActiveProduct);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -261,7 +266,7 @@ class IcmlDirector
|
|||||||
|
|
||||||
// если это "простой товар", у которого нет ТП, то просто записываем его
|
// если это "простой товар", у которого нет ТП, то просто записываем его
|
||||||
if ($paramsForOffer->pageNumber === 1 && count($xmlOffersPart) === 0) {
|
if ($paramsForOffer->pageNumber === 1 && count($xmlOffersPart) === 0) {
|
||||||
$this->icmlWriter->writeOffers([$product]);
|
$this->icmlWriter->writeOffers([$product], $isNotActiveProduct);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -269,7 +274,7 @@ class IcmlDirector
|
|||||||
$xmlOffersPart
|
$xmlOffersPart
|
||||||
= $this->trimOffersList($writingOffersCount, $xmlOffersPart);
|
= $this->trimOffersList($writingOffersCount, $xmlOffersPart);
|
||||||
|
|
||||||
$this->icmlWriter->writeOffers($xmlOffersPart);
|
$this->icmlWriter->writeOffers($xmlOffersPart, $isNotActiveProduct);
|
||||||
|
|
||||||
$writingOffersCount += count($xmlOffersPart);
|
$writingOffersCount += count($xmlOffersPart);
|
||||||
$paramsForOffer->pageNumber++;
|
$paramsForOffer->pageNumber++;
|
||||||
|
@ -97,11 +97,12 @@ class IcmlWriter
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @param XmlOffer[] $offers
|
* @param XmlOffer[] $offers
|
||||||
|
* @param bool $isNotActiveProduct
|
||||||
*/
|
*/
|
||||||
public function writeOffers(array $offers): void
|
public function writeOffers(array $offers, $isNotActiveProduct = false): void
|
||||||
{
|
{
|
||||||
foreach ($offers as $offer) {
|
foreach ($offers as $offer) {
|
||||||
$this->writeOffer($offer);
|
$this->writeOffer($offer, $isNotActiveProduct);
|
||||||
}
|
}
|
||||||
|
|
||||||
file_put_contents($this->filePath, $this->writer->flush(true), FILE_APPEND);
|
file_put_contents($this->filePath, $this->writer->flush(true), FILE_APPEND);
|
||||||
@ -109,14 +110,21 @@ class IcmlWriter
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @param \Intaro\RetailCrm\Model\Bitrix\Xml\XmlOffer $offer
|
* @param \Intaro\RetailCrm\Model\Bitrix\Xml\XmlOffer $offer
|
||||||
|
* @param bool $isNotActiveProduct
|
||||||
*/
|
*/
|
||||||
private function writeOffer(XmlOffer $offer): void
|
private function writeOffer(XmlOffer $offer, $isNotActiveProduct): void
|
||||||
{
|
{
|
||||||
$this->writer->startElement('offer');
|
$this->writer->startElement('offer');
|
||||||
$this->writeSimpleAttribute('id', $offer->id);
|
$this->writeSimpleAttribute('id', $offer->id);
|
||||||
$this->writeSimpleAttribute('productId', $offer->productId);
|
$this->writeSimpleAttribute('productId', $offer->productId);
|
||||||
$this->writeSimpleAttribute('quantity', $offer->quantity);
|
$this->writeSimpleAttribute('quantity', $offer->quantity);
|
||||||
|
|
||||||
|
if ($isNotActiveProduct) {
|
||||||
|
$this->writeSimpleElement('productActivity', 'N');
|
||||||
|
} else {
|
||||||
|
$this->writeSimpleElement('activity', $offer->activity);
|
||||||
|
}
|
||||||
|
|
||||||
foreach ($offer->categoryIds as $categoryId) {
|
foreach ($offer->categoryIds as $categoryId) {
|
||||||
$this->writeSimpleElement('categoryId', $categoryId);
|
$this->writeSimpleElement('categoryId', $categoryId);
|
||||||
}
|
}
|
||||||
|
@ -58,6 +58,7 @@ class QueryParamsMolder
|
|||||||
'ID',
|
'ID',
|
||||||
'LID',
|
'LID',
|
||||||
'VAT_ID',
|
'VAT_ID',
|
||||||
|
'ACTIVE'
|
||||||
];
|
];
|
||||||
|
|
||||||
return $params;
|
return $params;
|
||||||
@ -66,20 +67,27 @@ class QueryParamsMolder
|
|||||||
/**
|
/**
|
||||||
* @param int|null $parentId
|
* @param int|null $parentId
|
||||||
* @param \Intaro\RetailCrm\Model\Bitrix\Orm\CatalogIblockInfo $info
|
* @param \Intaro\RetailCrm\Model\Bitrix\Orm\CatalogIblockInfo $info
|
||||||
|
* @param boolean $loadNonActivity
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
public function getWhereForOfferPart(?int $parentId, CatalogIblockInfo $info): array
|
public function getWhereForOfferPart(?int $parentId, CatalogIblockInfo $info, bool $loadNonActivity): array
|
||||||
{
|
{
|
||||||
|
$active = "";
|
||||||
|
|
||||||
|
if (!$loadNonActivity) {
|
||||||
|
$active = "Y";
|
||||||
|
}
|
||||||
|
|
||||||
if ($parentId === null) {
|
if ($parentId === null) {
|
||||||
return [
|
return [
|
||||||
'IBLOCK_ID' => $info->productIblockId,
|
'IBLOCK_ID' => $info->productIblockId,
|
||||||
'ACTIVE' => 'Y',
|
'ACTIVE' => $active,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
return [
|
return [
|
||||||
'IBLOCK_ID' => $info->skuIblockId,
|
'IBLOCK_ID' => $info->skuIblockId,
|
||||||
'ACTIVE' => 'Y',
|
'ACTIVE' => $active,
|
||||||
'PROPERTY_' . $info->skuPropertyId => $parentId,
|
'PROPERTY_' . $info->skuPropertyId => $parentId,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
@ -92,6 +92,11 @@ class SettingsService
|
|||||||
*/
|
*/
|
||||||
public $vatRates = [];
|
public $vatRates = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var mixed|string|null
|
||||||
|
*/
|
||||||
|
public $loadNonActivity;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var \Intaro\RetailCrm\Icml\SettingsService|null
|
* @var \Intaro\RetailCrm\Icml\SettingsService|null
|
||||||
*/
|
*/
|
||||||
@ -109,6 +114,7 @@ class SettingsService
|
|||||||
$this->action = $action;
|
$this->action = $action;
|
||||||
$this->iblockExport = $this->getSingleSetting('iblockExport');
|
$this->iblockExport = $this->getSingleSetting('iblockExport');
|
||||||
$this->loadPurchasePrice = $this->getSingleSetting('loadPurchasePrice');
|
$this->loadPurchasePrice = $this->getSingleSetting('loadPurchasePrice');
|
||||||
|
$this->loadNonActivity = $this->getSingleSetting('loadNonActivity');
|
||||||
$oldSetup = $this->getSingleSetting('SETUP_FILE_NAME');
|
$oldSetup = $this->getSingleSetting('SETUP_FILE_NAME');
|
||||||
$defaultFilePath = RetailcrmConfigProvider::getDefaultIcmlPath();
|
$defaultFilePath = RetailcrmConfigProvider::getDefaultIcmlPath();
|
||||||
$this->setupFileName = htmlspecialcharsbx($oldSetup ?? $defaultFilePath);
|
$this->setupFileName = htmlspecialcharsbx($oldSetup ?? $defaultFilePath);
|
||||||
@ -419,7 +425,7 @@ class SettingsService
|
|||||||
*/
|
*/
|
||||||
public function getSetupFieldsString(array $iblockProperties, bool $hlblockModule, array $hlBlockList): string
|
public function getSetupFieldsString(array $iblockProperties, bool $hlblockModule, array $hlBlockList): string
|
||||||
{
|
{
|
||||||
$values = 'loadPurchasePrice,SETUP_FILE_NAME,iblockExport,maxOffersValue';
|
$values = 'loadPurchasePrice,SETUP_FILE_NAME,iblockExport,maxOffersValue,loadNonActivity';
|
||||||
|
|
||||||
foreach ($iblockProperties as $val) {
|
foreach ($iblockProperties as $val) {
|
||||||
$values .= ',iblockPropertySku_' . $val
|
$values .= ',iblockPropertySku_' . $val
|
||||||
|
@ -252,6 +252,7 @@ class XmlOfferBuilder
|
|||||||
$this->xmlOffer->productName = $item['NAME'];
|
$this->xmlOffer->productName = $item['NAME'];
|
||||||
$this->xmlOffer->vatRate = $this->getVatRate($item);
|
$this->xmlOffer->vatRate = $this->getVatRate($item);
|
||||||
$this->xmlOffer->unitCode = $this->getUnitCode($item['CATALOG_MEASURE'], $item['ID']);
|
$this->xmlOffer->unitCode = $this->getUnitCode($item['CATALOG_MEASURE'], $item['ID']);
|
||||||
|
$this->xmlOffer->activity = $item['ACTIVE'];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -71,7 +71,7 @@ class XmlOfferDirector
|
|||||||
*/
|
*/
|
||||||
public function getXmlOffersPart(SelectParams $param, CatalogIblockInfo $catalogIblockInfo): array
|
public function getXmlOffersPart(SelectParams $param, CatalogIblockInfo $catalogIblockInfo): array
|
||||||
{
|
{
|
||||||
$ciBlockResult = $this->catalogRepository->getProductPage($param, $catalogIblockInfo);
|
$ciBlockResult = $this->catalogRepository->getProductPage($param, $catalogIblockInfo, $this->setup->loadNonActivity);
|
||||||
$offers = [];
|
$offers = [];
|
||||||
|
|
||||||
while ($offer = $ciBlockResult->Fetch()) {
|
while ($offer = $ciBlockResult->Fetch()) {
|
||||||
|
@ -129,6 +129,13 @@ class XmlOffer
|
|||||||
*/
|
*/
|
||||||
public $productType;
|
public $productType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Активность товара/торгового предложения (N|Y)
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
public $activity;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param $productValue
|
* @param $productValue
|
||||||
* @param $offerValue
|
* @param $offerValue
|
||||||
|
@ -71,4 +71,10 @@ class XmlSetup
|
|||||||
* @var int|null
|
* @var int|null
|
||||||
*/
|
*/
|
||||||
public $basePriceId;
|
public $basePriceId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @var bool
|
||||||
|
*/
|
||||||
|
public $loadNonActivity;
|
||||||
}
|
}
|
||||||
|
@ -88,13 +88,14 @@ class CatalogRepository
|
|||||||
/**
|
/**
|
||||||
* @param \Intaro\RetailCrm\Model\Bitrix\Xml\SelectParams $param
|
* @param \Intaro\RetailCrm\Model\Bitrix\Xml\SelectParams $param
|
||||||
* @param \Intaro\RetailCrm\Model\Bitrix\Orm\CatalogIblockInfo $catalogIblockInfo
|
* @param \Intaro\RetailCrm\Model\Bitrix\Orm\CatalogIblockInfo $catalogIblockInfo
|
||||||
|
* @param boolean $loadNonActivity
|
||||||
* @return \CIBlockResult|int
|
* @return \CIBlockResult|int
|
||||||
*/
|
*/
|
||||||
public function getProductPage(SelectParams $param, CatalogIblockInfo $catalogIblockInfo)
|
public function getProductPage(SelectParams $param, CatalogIblockInfo $catalogIblockInfo, bool $loadNonActivity)
|
||||||
{
|
{
|
||||||
return CIBlockElement::GetList(
|
return CIBlockElement::GetList(
|
||||||
['ID' => 'ASC'],
|
['ID' => 'ASC'],
|
||||||
$this->builder->getWhereForOfferPart($param->parentId, $catalogIblockInfo),
|
$this->builder->getWhereForOfferPart($param->parentId, $catalogIblockInfo, $loadNonActivity),
|
||||||
false,
|
false,
|
||||||
['nPageSize' => $param->nPageSize, 'iNumPage' => $param->pageNumber, 'checkOutOfRange' => true],
|
['nPageSize' => $param->nPageSize, 'iNumPage' => $param->pageNumber, 'checkOutOfRange' => true],
|
||||||
$param->allParams
|
$param->allParams
|
||||||
|
Loading…
Reference in New Issue
Block a user