3namespace Bitrix\Catalog\v2\Integration\UI\EntityEditor;
5use Bitrix\Catalog\Access\AccessController;
6use Bitrix\Catalog\Access\ActionDictionary;
7use Bitrix\Catalog\Document\DocumentFieldsManager;
8use Bitrix\Catalog\Document\StoreDocumentTableManager;
9use Bitrix\Catalog\Document\Type\StoreDocumentSpecificTable;
10use Bitrix\Catalog\StoreDocumentFileTable;
11use Bitrix\Catalog\StoreDocumentTable;
12use Bitrix\Catalog\v2\Contractor;
13use Bitrix\Catalog\v2\Integration\UI\EntityEditor\Product\StoreDocumentProductPositionRepository;
14use Bitrix\Currency\CurrencyManager;
15use Bitrix\Currency\CurrencyTable;
17use Bitrix\Main\Engine\CurrentUser;
18use Bitrix\Main\Localization\Loc;
19use Bitrix\Main\UserTable;
20use Bitrix\UI\EntityEditor\BaseProvider;
21use Bitrix\UI\EntityEditor\ProviderWithUserFieldsTrait;
26 use ProviderWithUserFieldsTrait {
48 $this->document = $documentFields;
53 $this->requiredFieldNames = DocumentFieldsManager::getRequiredFields($this->
getDocumentType());
61 return 'store_document_details';
71 return new static($documentFields,
$config);
99 return $this->document[
'ID'] ??
null;
104 return $this->document[
'DOC_TYPE'] ?? static::DEFAULT_TYPE;
119 $this->document = [];
123 $documentType = $documentType[
'DOC_TYPE'];
125 $tableClass = StoreDocumentTableManager::getTableClassByType($documentType) ?: StoreDocumentTable::class;
130 'CONTRACTOR_REF_' =>
'CONTRACTOR',
153 return static::ENTITY_TYPE_NAME;
161 if (!isset(
$fields[$documentType]))
180 'title' => static::getFieldTitle(
'ID'),
187 'title' => static::getFieldTitle(
'TITLE'),
190 'required' => in_array(
'TITLE', $this->requiredFieldNames,
true),
192 'visibilityPolicy' =>
'edit',
197 'requiredIsEditable' =>
true,
201 'name' =>
'DATE_CREATE',
202 'title' => static::getFieldTitle(
'DATE_CREATE'),
203 'type' =>
'datetime',
205 'visibilityPolicy' =>
'view',
208 'name' =>
'CREATED_BY',
209 'title' => static::getFieldTitle(
'CREATED_BY'),
214 'name' =>
'RESPONSIBLE_ID',
215 'title' => static::getFieldTitle(
'RESPONSIBLE_ID'),
222 'name' =>
'TOTAL_WITH_CURRENCY',
223 'editable' => in_array(
237 'name' =>
'DATE_MODIFY',
238 'title' => static::getFieldTitle(
'DATE_MODIFY'),
239 'type' =>
'datetime',
241 'visibilityPolicy' =>
'view',
244 'name' =>
'MODIFIED_BY',
245 'title' => static::getFieldTitle(
'MODIFIED_BY'),
248 'visibilityPolicy' =>
'view',
251 'name' =>
'DATE_STATUS',
252 'title' => static::getFieldTitle(
'DATE_STATUS'),
253 'type' =>
'datetime',
255 'visibilityPolicy' =>
'view',
258 'name' =>
'STATUS_BY',
259 'title' => static::getFieldTitle(
'STATUS_BY'),
262 'visibilityPolicy' =>
'view',
265 'name' =>
'DOCUMENT_PRODUCTS',
266 'title' => Loc::getMessage(
'CATALOG_STORE_DOCUMENT_DETAIL_FIELD_DOCUMENT_PRODUCTS_2'),
267 'type' =>
'product_row_summary',
276 'title' => static::getFieldTitle(
'CURRENCY'),
287 'title' => static::getFieldTitle(
'TOTAL_WITH_CURRENCY'),
290 'largeFormat' =>
true,
291 'affectedFields' => [
'CURRENCY',
'TOTAL'],
293 'amountReadOnly' =>
true,
295 'name' =>
'CURRENCY',
298 'formatted' =>
'FORMATTED_TOTAL',
299 'formattedWithCurrency' =>
'FORMATTED_TOTAL_WITH_CURRENCY',
313 'name' =>
'DOC_NUMBER',
314 'title' => static::getFieldTitle(
'DOC_NUMBER'),
317 'showAlways' =>
true,
318 'required' => in_array(
'DOC_NUMBER', $this->requiredFieldNames,
true),
320 'requiredIsEditable' =>
true,
324 'name' =>
'DATE_DOCUMENT',
325 'title' => static::getFieldTitle(
'DATE_DOCUMENT'),
326 'type' =>
'datetime',
329 'enableTime' =>
false,
330 'requiredIsEditable' =>
true,
332 'required' => in_array(
'DATE_DOCUMENT', $this->requiredFieldNames,
true),
336 'name' =>
'ITEMS_ORDER_DATE',
337 'title' => static::getFieldTitle(
'ITEMS_ORDER_DATE'),
338 'type' =>
'datetime',
341 'enableTime' =>
false,
342 'requiredIsEditable' =>
true,
344 'required' => in_array(
'ITEMS_ORDER_DATE', $this->requiredFieldNames,
true),
347 'name' =>
'ITEMS_RECEIVED_DATE',
348 'title' => static::getFieldTitle(
'ITEMS_RECEIVED_DATE'),
349 'type' =>
'datetime',
352 'enableTime' =>
false,
353 'requiredIsEditable' =>
true,
355 'required' => in_array(
'ITEMS_RECEIVED_DATE', $this->requiredFieldNames,
true),
358 'name' =>
'DOCUMENT_FILES',
359 'title' => static::getFieldTitle(
'DOCUMENT_FILES'),
362 'showAlways' =>
true,
365 'maxFileSize' => \CUtil::Unformat(ini_get(
'upload_max_filesize')),
366 'requiredIsEditable' =>
true,
368 'required' => in_array(
'DOCUMENT_FILES', $this->requiredFieldNames,
true),
376 'name' =>
'DOC_NUMBER',
377 'title' => static::getFieldTitle(
'DOC_NUMBER'),
380 'showAlways' =>
false,
381 'required' => in_array(
'DOC_NUMBER', $this->requiredFieldNames,
true),
383 'requiredIsEditable' =>
true,
387 'name' =>
'DATE_DOCUMENT',
388 'title' => static::getFieldTitle(
'DATE_DOCUMENT'),
389 'type' =>
'datetime',
391 'showAlways' =>
false,
393 'enableTime' =>
false,
394 'requiredIsEditable' =>
true,
396 'required' => in_array(
'DATE_DOCUMENT', $this->requiredFieldNames,
true),
409 $result = $this->getUfComponentFieldsParent();
417 $this->createUfUrl =
$url;
426 $tableClass = StoreDocumentTableManager::getTableClassByType($this->
getDocumentType());
430 return $tableClass::getUfId();
446 return Loc::getMessage(
'CATALOG_STORE_DOCUMENT_DETAIL_TITLE_DEFAULT_NAME_'
456 $fieldName = $field[
'name'];
457 $fieldType = $field[
'type'];
459 if ($fieldType ===
'user')
462 'enableEditInView' => $field[
'editable'],
463 'formated' => $fieldName .
'_FORMATTED_NAME',
464 'photoUrl' => $fieldName .
'_PHOTO_URL',
465 'showUrl' =>
'PATH_TO_' . $fieldName,
466 'pathToProfile' => static::PATH_TO_USER_PROFILE,
470 $resultFields[] = $field;
473 return $resultFields;
481 'title' => Loc::getMessage(
'CATALOG_STORE_DOCUMENT_DETAIL_MAIN_SECTION'),
485 'isRemovable' =>
'false',
491 $sectionElements[] = [
492 'name' =>
'products',
493 'title' => Loc::getMessage(
'CATALOG_STORE_DOCUMENT_DETAIL_PRODUCTS_SECTION'),
496 [
'name' =>
'DOCUMENT_PRODUCTS'],
499 'isRemovable' =>
'false',
504 $sectionElements[] = [
506 'title' => Loc::getMessage(
'CATALOG_STORE_DOCUMENT_DETAIL_EXTRA_SECTION'),
509 [
'name' =>
'RESPONSIBLE_ID'],
512 'isRemovable' =>
'false',
526 'elements' => $sectionElements,
533 $ufSectionElements = [];
534 $ufInfos = $this->getUfEntityFields();
535 foreach ($ufInfos as $userField)
537 $ufSectionElements[] = [
'name' => $userField[
'name']];
545 [
'name' =>
'TOTAL_WITH_CURRENCY'],
546 [
'name' =>
'CONTRACTOR_ID'],
547 [
'name' =>
'DOC_NUMBER'],
548 [
'name' =>
'DATE_DOCUMENT'],
549 [
'name' =>
'ITEMS_RECEIVED_DATE'],
550 [
'name' =>
'DOCUMENT_FILES'],
551 ...$ufSectionElements,
556 [
'name' =>
'TOTAL_WITH_CURRENCY'],
557 ...$ufSectionElements,
562 [
'name' =>
'TOTAL_WITH_CURRENCY'],
563 ...$ufSectionElements,
568 [
'name' =>
'TOTAL_WITH_CURRENCY'],
569 ...$ufSectionElements,
572 return $ufSectionElements;
582 'DOC_TYPE' => $this->document[
'DOC_TYPE'],
583 'RESPONSIBLE_ID' => CurrentUser::get()->getId(),
591 $currency = $this->document[
'CURRENCY'] ??
null;
594 $currency = CurrencyManager::getBaseCurrency();
604 $document[
'FORMATTED_TOTAL_WITH_CURRENCY'] = CCurrencyLang::CurrencyFormat(
$document[
'TOTAL'],
607 if (empty($this->config[
'skipProducts']))
611 if (empty($this->config[
'skipFiles']))
618 $dateFields = [
'DATE_DOCUMENT',
'ITEMS_ORDER_DATE',
'ITEMS_RECEIVED_DATE'];
619 foreach ($dateFields as $dateField)
642 return array_column(
$files,
'FILE_ID');
647 $documentProductSummaryInfo = $this->getProductSummaryInfo(
$document);
648 $documentProductSummaryInfo[
'isReadOnly'] = $this->
isReadOnly();
650 return $documentProductSummaryInfo;
655 $isNewDocument =
$document[
'ID'] ===
null;
660 'total' => \CCurrencyLang::CurrencyFormat(0,
$document[
'CURRENCY']),
670 $productPositionList = $storeDocumentProductPositionRepository->getList(
$document[
'ID']);
671 foreach ($productPositionList as &$productPosition)
673 $productPosition[
'SUM'] = \CCurrencyLang::CurrencyFormat($productPosition[
'SUM'],
$document[
'CURRENCY']);
677 'count' => $storeDocumentProductPositionRepository->getCount(
$document[
'ID']),
683 'items' => $productPositionList,
693 $fieldName = $field[
'name'];
694 $fieldType = $field[
'type'];
696 if ($fieldType ===
'user')
699 if (!
$userId && $fieldName ===
'CREATED_BY')
701 $userId = CurrentUser::get()->getId();
704 $userFields[$fieldName] =
$userId;
708 $document[
'PATH_TO_USER_PROFILE'] = static::PATH_TO_USER_PROFILE;
715 $uniqueUserIds = array_filter(array_unique(array_values($userFields)));
716 if (!empty($uniqueUserIds) && empty($this->config[
'skipUsers']))
734 'name' =>
'CONTRACTOR_ID',
735 'title' => static::getFieldTitle(
'CONTRACTOR_ID'),
736 'type' => $this->contractorsProvider
737 ? $this->contractorsProvider::getEditorFieldType()
741 'data' => $this->contractorsProvider
742 ? $this->contractorsProvider::getEditorFieldData()
744 'contractorName' =>
'CONTRACTOR_NAME',
755 return $this->contractorsProvider
756 ? $this->contractorsProvider::getEditorEntityData((
int)
$document[
'ID'])
765 if (!empty($this->document[
'CONTRACTOR_REF_COMPANY']))
767 return $this->document[
'CONTRACTOR_REF_COMPANY'];
770 if (!empty($this->document[
'CONTRACTOR_REF_PERSON_NAME']))
772 return $this->document[
'CONTRACTOR_REF_PERSON_NAME'];
789 foreach ($userIds as $id)
791 if (isset(static::$users[$id]))
793 $usersInfo[$id] = static::$users[$id];
801 if (empty($newUsers))
824 $id = (int)
$user[
'ID'];
825 $usersInfo[$id] =
$user;
826 static::$users[$id] =
$user;
836 foreach ($userFields as $fieldName =>
$userId)
844 $document[
'PATH_TO_' . $fieldName] = \CComponentEngine::MakePathFromTemplate(
845 static::PATH_TO_USER_PROFILE,
846 [
'user_id' =>
$user[
'ID']]
849 $document[$fieldName .
'_FORMATTED_NAME'] = \CUser::FormatName(
850 \CSite::GetNameFormat(),
852 'ID' =>
$user[
'ID'] ??
'',
853 'LOGIN' =>
$user[
'LOGIN'],
854 'NAME' =>
$user[
'NAME'],
855 'LAST_NAME' =>
$user[
'LAST_NAME'],
856 'SECOND_NAME' =>
$user[
'SECOND_NAME'],
862 $personalPhoto = (int)(
$user[
'PERSONAL_PHOTO'] ?? 0);
863 if ($personalPhoto > 0)
865 $fileInfo = \CFile::ResizeImageGet(
873 if (isset($fileInfo[
'src']))
875 $document[$fieldName .
'_PHOTO_URL'] = $fileInfo[
'src'];
887 'name' =>
'PRODUCT_LIST_CONTROLLER',
888 'type' =>
'catalog_store_document_product_list',
892 'name' =>
'DOCUMENT_CARD_CONTROLLER',
893 'type' =>
'document_card',
906 ActionDictionary::ACTION_STORE_DOCUMENT_MODIFY,
910 isset($this->document[
'STATUS']) && $this->document[
'STATUS'] ===
'Y'
920 return AccessController::getCurrent()->check(ActionDictionary::ACTION_STORE_DOCUMENT_CARD_EDIT);
930 $existingCurrencies = CurrencyTable::getList([
933 'FULL_NAME' =>
'CURRENT_LANG_FORMAT.FULL_NAME',
944 'cache_joins' =>
true,
947 foreach ($existingCurrencies as
$currency)
973 return Loc::getMessage(
'CATALOG_STORE_DOCUMENT_DETAIL_FIELD_ID');
975 return Loc::getMessage(
'CATALOG_STORE_DOCUMENT_DETAIL_TITLE_ID');
976 case 'TOTAL_WITH_CURRENCY':
977 return Loc::getMessage(
'CATALOG_STORE_DOCUMENT_DETAIL_FIELD_TOTAL');
979 return Loc::getMessage(
'CATALOG_STORE_DOCUMENT_DETAIL_FIELD_CURRENCY');
980 case 'ITEMS_ORDER_DATE':
981 return Loc::getMessage(
'CATALOG_STORE_DOCUMENT_DETAIL_ITEMS_ORDER_DATE_DOCUMENT');
982 case 'ITEMS_RECEIVED_DATE':
983 return Loc::getMessage(
'CATALOG_STORE_DOCUMENT_DETAIL_ITEMS_RECEIVED_DATE_DOCUMENT');
984 case 'DOCUMENT_FILES':
985 return Loc::getMessage(
'CATALOG_STORE_DOCUMENT_DETAIL_FIELD_DOCUMENT_FILES_2');
987 return Loc::getMessage(
'CATALOG_STORE_DOCUMENT_DETAIL_FIELD_' . $fieldName);
if(!Loader::includeModule('messageservice')) $provider
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
const TYPE_STORE_ADJUSTMENT
static getActiveProvider(string $providerName)
getDocumentCommonFields()
getDocumentFiles(array $document)
getContractorData(array $document)
getUsersInfo(array $userIds)
getAdditionalFieldKeys($fields)
prepareCurrencyListItem(array $currency)
const PATH_TO_USER_PROFILE
getAdditionalDocumentData(array $document)
getTotalInfoControlForExistingDocument()
static getFieldTitle($fieldName)
setCreateUfUrl(string $url)
getDefaultDocumentTitle(string $documentNumber='')
static createById(int $id, array $config=[])
shouldPrepareDateFields()
getAdditionalUserData(array $document, array $userFields, array $usersInfo)
getDocumentSpecificFields()
getTotalInfoControlForNewDocument()
__construct(array $documentFields, array $config=[])
static createByArray(array $documentFields, array $config=[])
static createByType(string $type, array $config=[])
Contractor Provider IProvider $contractorsProvider
getDocumentProductsPreview(array $document)
static getRow(array $parameters)
static getList(array $parameters=array())
static normalizeArrayValuesByInt(&$map, $sorted=true)
static sortByColumn(array &$array, $columns, $callbacks='', $defaultValueIfNotSetValue=null, $preserveKeys=false)
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
const BX_RESIZE_IMAGE_EXACT
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)