25 private const STORE_CONTROL_DISABLED_CONDUCT_ERROR =
'store_control_disabled_conduct';
49 if (empty($oldFields))
53 $allOldFields = $oldFields;
55 $isConducted = $oldFields[
'STATUS'] ===
'Y';
56 $isStatusChangingToUnconducted = isset(
$arFields[
'STATUS']) &&
$arFields[
'STATUS'] ===
'N';
57 if ($isConducted && !$isStatusChangingToUnconducted)
63 foreach (
GetModuleEvents(
"catalog",
"OnBeforeDocumentUpdate",
true) as $arEvent)
71 if (array_key_exists(
'DATE_CREATE',
$arFields))
75 if (array_key_exists(
'DATE_MODIFY',
$arFields))
79 if (array_key_exists(
'DATE_STATUS',
$arFields))
83 if (array_key_exists(
'CREATED_BY',
$arFields))
87 if (array_key_exists(
'DOC_TYPE',
$arFields))
98 if (!static::checkFields(
'UPDATE',
$arFields))
103 if (!static::checkRequiredFields(
$arFields, $oldFields[
'DOC_TYPE']))
108 $oldFields = array_intersect_key($oldFields,
$arFields);
110 $strUpdate =
$DB->PrepareUpdate(
"b_catalog_store_docs",
$arFields);
112 if(!empty($strUpdate))
114 $strSql =
"update b_catalog_store_docs set ".$strUpdate.
" where ID = ".$id;
115 if(!
$DB->Query($strSql,
true))
120 foreach(
$arFields[
"ELEMENT"] as $arElement)
122 if(is_array($arElement))
123 CCatalogStoreDocsElement::update($arElement[
"ID"], $arElement);
127 foreach(
GetModuleEvents(
"catalog",
"OnDocumentUpdate",
true) as $arEvent)
133 static::saveFiles($id,
$arFields[
'DOCUMENT_FILES']);
146 'oldFields' => $allOldFields,
150 PullManager::getInstance()->sendDocumentsUpdatedEvent(
175 '=DOCUMENT_ID' => $documentId,
180 $id = (int)$row[
'ID'];
181 $fileId = (int)$row[
'FILE_ID'];
182 $existingFiles[$id] = [
184 'FILE_ID' => $fileId,
186 $fileMap[$fileId] = $id;
198 foreach (array_keys($existingFiles) as $rowId)
200 if (!isset(
$files[$rowId]))
202 $files[$rowId] = $existingFiles[$rowId];
208 foreach (
$files as $rowId => $row)
214 && isset($existingFiles[$rowId])
220 && $row[
'DEL'] ===
'Y'
224 if ($resultInternal->isSuccess())
226 CFile::Delete($existingFiles[$rowId][
'FILE_ID']);
231 isset($row[
'FILE_ID'])
234 if ($row[
'FILE_ID'] !== $existingFiles[$rowId][
'FILE_ID'])
239 'FILE_ID' => $row[
'FILE_ID'],
242 if ($resultInternal->isSuccess())
244 CFile::Delete($existingFiles[$rowId][
'FILE_ID']);
251 preg_match(
'/^n[0-9]+$/', $rowId, $parsed)
256 if (isset($row[
'FILE_ID']))
259 'DOCUMENT_ID' => $documentId,
260 'FILE_ID' => $row[
'FILE_ID'],
262 if ($resultInternal->isSuccess())
264 $id = (int)$resultInternal->getId();
265 $fileMap[$row[
'FILE_ID']] = $id;
266 $existingFiles[$id] = [
268 'FILE_ID' => $row[
'FILE_ID'],
274 isset($row[
'FILE_UPLOAD'])
275 && is_array($row[
'FILE_UPLOAD'])
278 $row[
'FILE_UPLOAD'][
'MODULE_ID'] =
'catalog';
279 $fileId = (int)CFile::SaveFile(
288 'DOCUMENT_ID' => $documentId,
289 'FILE_ID' => $fileId,
291 if ($resultInternal->isSuccess())
293 $id = (int)$resultInternal->getId();
294 $fileMap[$fileId] = $id;
295 $existingFiles[$id] = [
297 'FILE_ID' => $fileId,
308 $formatArray =
false;
309 $formatOther =
false;
310 foreach (
$files as $value)
312 if (is_array($value))
323 if ($formatArray && $formatOther)
334 $list = array_values(array_unique(
$files));
337 foreach ($list as $value)
339 if (!is_string($value))
343 if (preg_match(
'/^delete([0-9]+)$/', $value, $parsed))
345 $value = (int)$parsed[1];
346 if (isset($fileMap[$value]))
348 $id = $fileMap[$value];
354 elseif (preg_match(
'/^[0-9]+$/', $value, $parsed))
356 $value = (int)$value;
357 if (isset($fileMap[$value]))
359 $id = $fileMap[$value];
376 unset($value, $list);
386 public static function delete($id)
408 if (empty($document))
414 if ($document[
'STATUS'] ===
'Y')
416 $GLOBALS[
'APPLICATION']->ThrowException(
418 self::DELETE_CONDUCTED_ERROR
424 foreach($events as
$event)
429 $DB->Query(
"DELETE FROM b_catalog_store_docs WHERE ID = ".$id,
true);
437 static::deleteDocumentFiles($id);
442 if ($contractorsProvider)
444 $contractorsProvider::onAfterDocumentDelete($id);
448 \Bitrix\Crm\Timeline\TimelineEntry::deleteByOwner(\CCrmOwnerType::StoreDocument, $id);
453 'OnDocumentBarcodeDelete',
454 'OnDocumentElementDelete',
458 foreach ($eventList as $eventName)
469 PullManager::getInstance()->sendDocumentDeletedEvent(
481 'select' => [
'FILE_ID'],
482 'filter' => [
'=DOCUMENT_ID' => $documentId],
485 $fileIds = array_column($documentFiles,
'FILE_ID');
486 foreach ($fileIds as $fileId)
488 CFile::Delete($fileId);
495 .
' where ' . $helper->quote(
'DOCUMENT_ID') .
' = ' . $documentId
508 $requiredFields = DocumentFieldsManager::getRequiredFields($docType);
509 foreach ($requiredFields as $requiredField)
512 array_key_exists($requiredField,
$arFields)
518 'CAT_DOC_ERROR_REQUIRED_FIELD',
520 '#FIELD_NAME#' => $requiredField,
578 public static function conductDocument($documentId,
$userId = 0)
585 Loc::getMessage(
'CAT_DOC_CONDUCT_UNCONDUCT_NOT_AVAILABLE'),
586 self::STORE_CONTROL_DISABLED_CONDUCT_ERROR,
592 if (Catalog\Store\EnableWizard\Manager::isOnecMode())
594 $APPLICATION->ThrowException(Loc::getMessage(
'CAT_DOC_CONDUCT_UNCONDUCT_NOT_AVAILABLE_EXTERNAL_CATALOG'));
599 $documentId = (int)$documentId;
620 if($docType = $docTypes->Fetch())
622 if ($docType[
'STATUS'] !== self::CONDUCTED)
625 $documentClass = self::$types[$docType[
'DOC_TYPE']];
627 if($docType[
'CURRENCY'] <>
'')
632 if($docType[
'CONTRACTOR_ID'] <>
'')
634 $contractorId = $docType[
'CONTRACTOR_ID'];
641 'STATUS' => self::CONDUCTED,
646 $docFields[
'STATUS_BY'] =
$userId;
647 $docFields[
'MODIFIED_BY'] =
$userId;
650 if(!self::update($documentId, $docFields))
664 $APPLICATION->ThrowException(Loc::getMessage(
'CAT_DOC_STATUS_ALREADY_YES'));
675 public static function cancellationDocument($documentId,
$userId = 0)
679 if (!Catalog\Config\State::isUsedInventoryManagement())
682 GetMessage(
'CAT_DOC_CONDUCT_UNCONDUCT_NOT_AVAILABLE'),
683 self::STORE_CONTROL_DISABLED_CONDUCT_ERROR
689 if (Catalog\Store\EnableWizard\Manager::isOnecMode())
691 $APPLICATION->ThrowException(Loc::getMessage(
'CAT_DOC_CONDUCT_UNCONDUCT_NOT_AVAILABLE_EXTERNAL_CATALOG'));
697 $documentId = (int)$documentId;
702 array(
"ID" => $documentId),
705 array(
'ID',
'DOC_TYPE',
'STATUS')
707 if($arDocType = $dbDocType->Fetch())
709 $docType = $arDocType[
"DOC_TYPE"];
710 if($arDocType[
"STATUS"] !==
"Y")
716 $documentClass = self::$types[$arDocType[
"DOC_TYPE"]];
718 $result = $documentClass::cancellationDocument($documentId,
$userId);
723 'WAS_CANCELLED' =>
'Y',
728 $arDocFields[
"STATUS_BY"] =
$userId;
730 if (!self::update($documentId, $arDocFields))
748 $productID = (int)$productID;
751 $dbDeleteElements = CCatalogStoreDocsElement::getList(
array(),
array(
"ELEMENT_ID" => $productID),
false,
false,
array(
'ID'));
752 while($arDeleteElements = $dbDeleteElements->fetch())
754 CCatalogStoreDocsElement::delete($arDeleteElements[
"ID"]);
756 return $DB->Query(
"delete from b_catalog_store_barcode where PRODUCT_ID = ".$productID,
true);
764 $storeID = (int)$storeID;
768 return $DB->Query(
"delete from b_catalog_store_barcode where STORE_ID = ".$storeID,
true);
775 $productID = (int)$productID;
781 'ELEMENT_NAME' =>
'ELEMENT.NAME',
784 '=ELEMENT_ID' => $productID,
793 'CAT_DOC_ERROR_ELEMENT_IN_DOCUMENT_EXISTS',
795 '#ID#' => $row[
'ELEMENT_ID'],
796 '#NAME#' => $row[
'ELEMENT_NAME'],
809 $storeId = (int)$storeId;
819 $internalSql =
'select CP.QUANTITY + ' . $helper->getIsNullFunction(
'CP.QUANTITY_RESERVED', 0) .
', CP.ID, '.$storeId.
' ';
822 $internalSql .=
'from b_catalog_product CP where 1 = 1';
826 $internalSql .=
'from b_catalog_product CP inner join b_iblock_element IE on (CP.ID = IE.ID) where IE.IBLOCK_ID = '.$iblockId;
830 "insert into b_catalog_store_product (AMOUNT, PRODUCT_ID, STORE_ID) (".$internalSql.
")"
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
static getTableClassByType(string $docType)
static deleteByDocument(int $id)
static deleteByDocument(int $id)
const TYPE_STORE_ADJUSTMENT
static getActiveProvider(string $providerName)
static getConnection($name="")
static includeModule($moduleName)
static getMessage($code, $replace=null, $language=null)
static getList(array $parameters=array())
static update($primary, array $data)
static synchronizeStockQuantity($storeId, $iblockId=0)
static OnCatalogStoreDelete($storeID)
static convertFileList(array $fileMap, array $files)
static update($id, $arFields)
static saveFiles(int $documentId, array $files)
static checkFields($action, &$arFields)
static deleteDocumentFiles(int $documentId)
static checkRequiredFields(array $arFields, string $docType)
static OnBeforeIBlockElementDelete($productID)
const DELETE_CONDUCTED_ERROR
static OnIBlockElementDelete($productID)
static getList($arOrder=array(), $arFilter=array(), $arGroupBy=false, $arNavStartParams=false, $arSelectFields=array())
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
global $USER_FIELD_MANAGER
ExecuteModuleEventEx($arEvent, $arParams=[])
AddEventToStatFile($module, $action, $tag, $label, $action_type='', $user_id=null)
GetModuleEvents($MODULE_ID, $MESSAGE_ID, $bReturnArray=false)
IncludeModuleLangFile($filepath, $lang=false, $bReturnArray=false)
GetMessage($name, $aReplace=null)
$GLOBALS['____1690880296']
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)