1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
document.php
См. документацию.
1<?php
2
3namespace Bitrix\Catalog\Controller;
4
5use Bitrix\Catalog\Access\ActionDictionary;
6use Bitrix\Catalog\Access\Model\StoreDocument;
7use Bitrix\Catalog\Config\Feature;
8use Bitrix\Catalog\Config\State;
9use Bitrix\Catalog\StoreDocumentElementTable;
10use Bitrix\Main\Engine\CurrentUser;
11use Bitrix\Catalog\StoreDocumentTable;
12use Bitrix\Main\Engine\Response\DataType\Page;
13use Bitrix\Main\Error;
14use Bitrix\Main\Localization\Loc;
15use Bitrix\Main\Result;
16use Bitrix\Main\UI\PageNavigation;
17use CApplicationException;
18use CCatalogDocs;
19use CMain;
20
21class Document extends Controller
22{
23 use ListAction; // default listAction realization
24
25 //region Actions
29 public function getFieldsAction(): array
30 {
31 return [$this->getServiceItemName() => $this->getViewFields()];
32 }
33
39 public function conductListAction(array $documentIds): ?bool
40 {
41 if (!Feature::isInventoryManagementEnabled())
42 {
43 $this->addError(new Error(Loc::getMessage('DOCUMENT_CONTROLLER_NO_INVENTORY_MANAGEMENT_ENABLED_ERROR')));
44
45 return null;
46 }
47
48 if (!State::isUsedInventoryManagement())
49 {
50 $this->addError(new Error(Loc::getMessage('DOCUMENT_CONTROLLER_MANAGEMENT_NOT_ENABLED')));
51
52 return null;
53 }
54
55 global $APPLICATION;
56
57 $documentData = $this->getDocumentData($documentIds);
58
59 $userId = CurrentUser::get()->getId();
60 foreach ($documentIds as $documentId)
61 {
62 $document = $documentData[$documentId] ?? null;
63 if (!$document)
64 {
65 $this->addError(
66 new Error(Loc::getMessage(
67 'CATALOG_CONTROLLER_DOCUMENT_CONDUCT_GENERAL_ERROR',
68 [
69 '#ERROR#' => Loc::getMessage('CATALOG_CONTROLLER_DOCUMENT_NOT_FOUND'),
70 ]
71 ))
72 );
73 continue;
74 }
75
76 $documentTitle = $document['TITLE'] ?: StoreDocumentTable::getTypeList(true)[$document['DOC_TYPE']];
77
78 $can = $this->accessController->check(
79 ActionDictionary::ACTION_STORE_DOCUMENT_CONDUCT,
80 StoreDocument::createFromArray($document)
81 );
82 if (!$can)
83 {
84 $this->addError(
85 new Error(Loc::getMessage('CATALOG_CONTROLLER_DOCUMENT_CONDUCT_ERROR',
86 [
87 '#DOC_TITLE#' => htmlspecialcharsbx($documentTitle),
88 '#ERROR#' => Loc::getMessage('DOCUMENT_CONTROLLER_NO_RIGHTS_ERROR'),
89 ]
90 ))
91 );
92 continue;
93 }
94
95 $isConducted = \CCatalogDocs::conductDocument($documentId, $userId);
96 if (!$isConducted)
97 {
98 if ($APPLICATION->GetException())
99 {
100 $this->addError(
101 new Error(Loc::getMessage(
102 'DOCUMENT_CONTROLLER_CONDUCT_ERROR',
103 [
104 '#DOC_TITLE#' => htmlspecialcharsbx($documentTitle),
105 '#ERROR#' => htmlspecialcharsbx($APPLICATION->GetException()->GetString()),
106 ]
107 ))
108 );
109 $APPLICATION->ResetException();
110 }
111 else
112 {
113 $this->addError(
114 new Error(Loc::getMessage('CATALOG_CONTROLLER_DOCUMENT_CONDUCT_GENERAL_ERROR',
115 [
116 '#DOC_TITLE#' => htmlspecialcharsbx($documentTitle),
117 ]
118 ))
119 );
120 }
121 }
122 }
123
124 if (!$this->errorCollection->isEmpty())
125 {
126 return null;
127 }
128
129 return true;
130 }
131
137 public function cancelListAction(array $documentIds): ?bool
138 {
139 if (!Feature::isInventoryManagementEnabled())
140 {
141 $this->addError(new Error(Loc::getMessage('DOCUMENT_CONTROLLER_NO_INVENTORY_MANAGEMENT_ENABLED_ERROR')));
142
143 return null;
144 }
145
146 if (!State::isUsedInventoryManagement())
147 {
148 $this->addError(new Error(Loc::getMessage('DOCUMENT_CONTROLLER_MANAGEMENT_NOT_ENABLED')));
149
150 return null;
151 }
152
153 global $APPLICATION;
154
155 $documentData = $this->getDocumentData($documentIds);
156 $userId = CurrentUser::get()->getId();
157 foreach ($documentIds as $documentId)
158 {
159 $document = $documentData[$documentId] ?? null;
160 if (!$document)
161 {
162 $this->addError(
163 new Error(Loc::getMessage(
164 'CATALOG_CONTROLLER_DOCUMENT_CANCEL_ERROR',
165 [
166 '#ERROR#' => Loc::getMessage('CATALOG_CONTROLLER_DOCUMENT_NOT_FOUND'),
167 ]
168 ))
169 );
170 continue;
171 }
172
173 $documentTitle = $document['TITLE'] ?: StoreDocumentTable::getTypeList(true)[$document['DOC_TYPE']];
174
175 $can = $this->accessController->check(
176 ActionDictionary::ACTION_STORE_DOCUMENT_CONDUCT,
177 StoreDocument::createFromArray($document)
178 );
179 if (!$can)
180 {
181 $this->addError(
182 new Error(Loc::getMessage('DOCUMENT_CONTROLLER_CANCEL_ERROR',
183 [
184 '#DOC_TITLE#' => htmlspecialcharsbx($documentTitle),
185 '#ERROR#' => Loc::getMessage('DOCUMENT_CONTROLLER_NO_RIGHTS_ERROR'),
186 ]
187 ))
188 );
189 continue;
190 }
191
192 $isCancelled = \CCatalogDocs::cancellationDocument($documentId, $userId);
193 if (!$isCancelled)
194 {
195 if ($APPLICATION->GetException())
196 {
197 $this->addError(
198 new Error(Loc::getMessage(
199 'DOCUMENT_CONTROLLER_CANCEL_ERROR',
200 [
201 '#DOC_TITLE#' => htmlspecialcharsbx($documentTitle),
202 '#ERROR#' => htmlspecialcharsbx($APPLICATION->GetException()->GetString()),
203 ]
204 ))
205 );
206 $APPLICATION->ResetException();
207 }
208 else
209 {
210 $documentTitle = $documentData[$documentId]['TITLE'] ?: StoreDocumentTable::getTypeList(true)[$documentData[$documentId]['DOC_TYPE']];
211 $this->addError(
212 new Error(Loc::getMessage(
213 'CATALOG_CONTROLLER_DOCUMENT_CANCEL_ERROR',
214 [
215 '#ERROR#' => htmlspecialcharsbx($documentTitle),
216 ]
217 ))
218 );
219 }
220 }
221 }
222
223 if (!$this->errorCollection->isEmpty())
224 {
225 return null;
226 }
227
228 return true;
229 }
230
231 private function prepareFieldsAdd($fields)
232 {
233 if (!array_key_exists('SITE_ID', $fields))
234 {
235 if (defined('SITE_ID'))
236 {
237 $fields['SITE_ID'] = SITE_ID;
238 }
239 else
240 {
241 $fields['SITE_ID'] = 's1';
242 }
243 }
244
245 if (!CurrentUser::get()->isAdmin() || !array_key_exists('CREATED_BY', $fields))
246 {
247 $fields['CREATED_BY'] = CurrentUser::get()->getId();
248 }
249
250 if (!CurrentUser::get()->isAdmin() || !array_key_exists('MODIFIED_BY', $fields))
251 {
252 $fields['MODIFIED_BY'] = CurrentUser::get()->getId();
253 }
254
255 return $fields;
256 }
257
264 public function addAction(array $fields): ?array
265 {
266 if (!Feature::isInventoryManagementEnabled())
267 {
268 $this->addError(new Error(Loc::getMessage('DOCUMENT_CONTROLLER_NO_INVENTORY_MANAGEMENT_ENABLED_ERROR')));
269
270 return null;
271 }
272
273 $docType = $fields['DOC_TYPE'] ?? null;
274
275 $availableTypes = self::getAvailableRestDocumentTypes();
276 if (!isset($availableTypes[$docType]))
277 {
278 $this->addError(new Error('DOC_TYPE isn\'t available'));
279
280 return null;
281 }
282
283 if (!$this->accessController->check(ActionDictionary::ACTION_STORE_DOCUMENT_MODIFY, StoreDocument::createFromArray($fields)))
284 {
285 $this->addError(
286 new Error(Loc::getMessage('DOCUMENT_CONTROLLER_NO_RIGHTS_ERROR'))
287 );
288
289 return null;
290 }
291
292 $fields = $this->prepareFieldsAdd($fields);
293 $addResult = CCatalogDocs::add($fields);
294 if (!$addResult)
295 {
296 global $APPLICATION;
297 if ($APPLICATION->GetException())
298 {
299 $exception = $APPLICATION->GetException();
300 $this->addError(new Error($exception->GetString()));
301 $APPLICATION->ResetException();
302
303 return null;
304 }
305 }
306
307 return [$this->getServiceItemName() => $this->get($addResult)];
308 }
309
317 public function fieldsAction(): array
318 {
319 return [$this->getViewFields()];
320 }
321
329 public function updateAction(int $id, array $fields): ?array
330 {
331 if (!Feature::isInventoryManagementEnabled())
332 {
333 $this->addError(new Error(Loc::getMessage('DOCUMENT_CONTROLLER_NO_INVENTORY_MANAGEMENT_ENABLED_ERROR')));
334
335 return null;
336 }
337
338 if (!$this->checkDocumentAccess(ActionDictionary::ACTION_STORE_DOCUMENT_MODIFY, $id))
339 {
340 return null;
341 }
342
343 $user = CurrentUser::get();
344 if (!array_key_exists('MODIFIED_BY', $fields) || !$user->isAdmin())
345 {
346 $fields['MODIFIED_BY'] = $user->getId();
347 }
348
349 $result = CCatalogDocs::update($id, $fields);
350 if (!$result)
351 {
352 global $APPLICATION;
353 if ($APPLICATION->GetException())
354 {
355 $exception = $APPLICATION->GetException();
356 $this->addError(new Error($exception->GetString()));
357 $APPLICATION->ResetException();
358
359 return null;
360 }
361 }
362
363 return [$this->getServiceItemName() => $this->get($id)];
364 }
365
371 public function deleteListAction(array $documentIds): ?bool
372 {
373 global $APPLICATION;
374
375 if (!Feature::isInventoryManagementEnabled())
376 {
377 $this->addError(new Error(Loc::getMessage('DOCUMENT_CONTROLLER_NO_INVENTORY_MANAGEMENT_ENABLED_ERROR')));
378
379 return null;
380 }
381
385
386 $documentData = $this->getDocumentData($documentIds);
387
388 $storeList = $this->getDocumentStoreList($documentIds);
389
390 foreach ($documentIds as $documentId)
391 {
392 $exception = null;
393 $document = $documentData[(int)$documentId] ?? null;
394
395 if (!$document)
396 {
397 $this->addError(
398 new Error(Loc::getMessage(
399 'DOCUMENT_CONTROLLER_DELETE_ERROR',
400 [
401 '#DOC_TITLE#' => "#{$documentId}",
402 '#ERROR#' => Loc::getMessage('CATALOG_CONTROLLER_DOCUMENT_NOT_FOUND'),
403 ]
404 ))
405 );
406 continue;
407 }
408
409 $can = $this->accessController->check(
410 ActionDictionary::ACTION_STORE_DOCUMENT_DELETE,
411 StoreDocument::createFromArray($document)
412 );
413
414 if ($storeList[$documentId])
415 {
416 $can = $can && $this->checkAllStoreAccess($storeList[$documentId]);
417 }
418
419 if ($can)
420 {
421 \CCatalogDocs::delete($documentId);
422
423 $exception = $APPLICATION->GetException();
424 }
425 else
426 {
427 $documentTitle = $document['TITLE'] ?: StoreDocumentTable::getTypeList(true)[$document['DOC_TYPE']];
428
429 $this->addError(
430 new Error(Loc::getMessage(
431 'DOCUMENT_CONTROLLER_NO_RIGHTS_TO_DELETE_ERROR',
432 [
433 '#DOC_TITLE#' => htmlspecialcharsbx($documentTitle),
434 ],
435 ))
436 );
437
438 return null;
439 }
440
441 if ($exception)
442 {
443 $documentTitle = $document['TITLE'] ?: StoreDocumentTable::getTypeList(true)[$document['DOC_TYPE']];
444 if ($exception->GetID() === CCatalogDocs::DELETE_CONDUCTED_ERROR)
445 {
446 $this->addError(
447 new Error(Loc::getMessage(
448 'DOCUMENT_CONTROLLER_DELETE_CONDUCTED_ERROR',
449 [
450 '#DOC_TITLE#' => htmlspecialcharsbx($documentTitle),
451 ]
452 ))
453 );
454 }
455 else
456 {
457 $this->addError(
458 new Error(Loc::getMessage(
459 'DOCUMENT_CONTROLLER_DELETE_ERROR',
460 [
461 '#DOC_TITLE#' => htmlspecialcharsbx($documentTitle),
462 '#ERROR#' => htmlspecialcharsbx($exception->GetString()),
463 ]
464 ))
465 );
466 }
467
468 $APPLICATION->ResetException();
469 }
470 }
471
472 return $this->errorCollection->isEmpty() ? true : null;
473 }
474
481 public function deleteAction(int $id): ?bool
482 {
483 if (!Feature::isInventoryManagementEnabled())
484 {
485 $this->addError(new Error(Loc::getMessage('DOCUMENT_CONTROLLER_NO_INVENTORY_MANAGEMENT_ENABLED_ERROR')));
486
487 return null;
488 }
489
490 if (!$this->checkDocumentAccess(ActionDictionary::ACTION_STORE_DOCUMENT_DELETE, $id))
491 {
492 return null;
493 }
494
495 $storeList = $this->getDocumentStoreList([$id]);
496
497 if (isset($storeList[$id]) && !$this->checkAllStoreAccess($storeList[$id]))
498 {
499 return null;
500 }
501
502 $deleteResult = CCatalogDocs::delete($id);
503 if (!$deleteResult)
504 {
505 $message = Loc::getMessage('CATALOG_CONTROLLER_DOCUMENT_NOT_FOUND');
506
507 $this->addError(
508 new Error($message)
509 );
510
511 return null;
512 }
513
514 global $APPLICATION;
515 if ($exception = $APPLICATION->getException())
516 {
517 if ($exception->getID() === CCatalogDocs::DELETE_CONDUCTED_ERROR)
518 {
519 $message = Loc::getMessage(
520 'DOCUMENT_CONTROLLER_DELETE_CONDUCTED_ERROR',
521 [
522 '#DOC_TITLE#' => $id,
523 ]
524 );
525 }
526 else
527 {
528 $message = Loc::getMessage(
529 'DOCUMENT_CONTROLLER_DELETE_ERROR',
530 [
531 '#DOC_TITLE#' => $id,
532 '#ERROR#' => htmlspecialcharsbx($exception->getString()),
533 ]
534 );
535 }
536
537 $this->addError(
538 new Error($message)
539 );
540
541 $APPLICATION->ResetException();
542
543 return null;
544 }
545
546 return $deleteResult;
547 }
548
553
561 public function conductAction(int $id): ?bool
562 {
563 return $this->confirmAction($id);
564 }
565
575 public function confirmAction(int $id): ?bool
576 {
577 if (!Feature::isInventoryManagementEnabled())
578 {
579 $this->addError(new Error(Loc::getMessage('DOCUMENT_CONTROLLER_NO_INVENTORY_MANAGEMENT_ENABLED_ERROR')));
580
581 return null;
582 }
583
584 if (!$this->checkDocumentAccess(ActionDictionary::ACTION_STORE_DOCUMENT_CONDUCT, $id))
585 {
586 return null;
587 }
588
589 $document = StoreDocumentTable::getById($id)->fetch();
590 if (!$document)
591 {
592 $message = Loc::getMessage('CATALOG_CONTROLLER_DOCUMENT_NOT_FOUND');
593 $this->addError(
594 new Error($message)
595 );
596
597 return null;
598 }
599
600 $userId = CurrentUser::get()->getId();
601
602 if (!CCatalogDocs::conductDocument($id, $userId))
603 {
604 $error = '';
605
606 global $APPLICATION;
607
608 if ($APPLICATION->GetException())
609 {
610 $error = $APPLICATION->GetException()->GetString();
611 $APPLICATION->ResetException();
612 }
613
614 $message = Loc::getMessage(
615 'CATALOG_CONTROLLER_DOCUMENT_CONDUCT_ERROR',
616 [
617 '#ERROR#' => $error,
618 ]
619 );
620
621 $this->addError(new Error($message));
622
623 return null;
624 }
625
626 return true;
627 }
628
636 public function cancelAction(int $id): ?bool
637 {
638 return $this->unconfirmAction($id);
639 }
640
648 public function unconfirmAction(int $id): ?bool
649 {
650 if (!Feature::isInventoryManagementEnabled())
651 {
652 $this->addError(new Error(Loc::getMessage('DOCUMENT_CONTROLLER_NO_INVENTORY_MANAGEMENT_ENABLED_ERROR')));
653
654 return null;
655 }
656
657 if (!$this->checkDocumentAccess(ActionDictionary::ACTION_STORE_DOCUMENT_CONDUCT, $id))
658 {
659 return null;
660 }
661
662 $userId = CurrentUser::get()->getId();
663 if (!CCatalogDocs::cancellationDocument($id, $userId))
664 {
665 $error = '';
666
667 global $APPLICATION;
668 if ($APPLICATION->GetException())
669 {
670 $error = $APPLICATION->GetException()->GetString();
671 $APPLICATION->ResetException();
672 }
673
674 $message = Loc::getMessage(
675 'CATALOG_CONTROLLER_DOCUMENT_CANCEL_ERROR',
676 [
677 '#ERROR#' => $error,
678 ]
679 );
680 $this->addError(new Error($message));
681
682 return null;
683 }
684
685 return true;
686 }
687
691 public static function getAvailableRestDocumentTypes(): array
692 {
693 $types = StoreDocumentTable::getTypeList(true);
695
696 return $types;
697 }
698
705 protected function checkPermissionEntity($name, $arguments=[])
706 {
707 $name = mb_strtolower($name);
708 if ($name === 'fields')
709 {
710 return $this->checkGetFieldsPermissionEntity();
711 }
712
713 if (in_array($name, ['conductlist', 'cancellist', 'unconfirm', 'confirm', 'conduct', 'cancel'], true))
714 {
715 return $this->checkUpdatePermissionEntity();
716 }
717
718 if ($name === 'deletelist')
719 {
720 return $this->checkDeletePermissionEntity();
721 }
722
723 return parent::checkPermissionEntity($name, $arguments);
724 }
725
729 protected function getEntityTable()
730 {
731 return new \Bitrix\Catalog\StoreDocumentTable();
732 }
733
734 protected function checkModifyPermissionEntity()
735 {
736 $r = $this->checkReadPermissionEntity();
737 if ($r->isSuccess())
738 {
739 if (!$this->accessController->check(Controller::CATALOG_STORE))
740 {
741 $message = Loc::getMessage('DOCUMENT_CONTROLLER_NO_STORE_RIGHTS_ERROR');
742 $r->addError(new Error($message));
743 }
744 }
745
746 return $r;
747 }
748
749 protected function checkReadPermissionEntity()
750 {
751 $r = new Result();
752
753 if (
754 !$this->accessController->check(Controller::CATALOG_STORE)
755 && !$this->accessController->check(Controller::CATALOG_READ)
756 )
757 {
758 $message = Loc::getMessage('DOCUMENT_CONTROLLER_NO_RIGHTS_ERROR');
759 $r->addError(new Error($message));
760 }
761
762 return $r;
763 }
764
765 private function getDocumentData(array $documentIds): array
766 {
767 $documentTitlesRes = StoreDocumentTable::getList(['select' => ['ID', 'DOC_TYPE', 'TITLE'], 'filter' => ['ID' => $documentIds]]);
768 $documentTitles = [];
769 while ($document = $documentTitlesRes->fetch())
770 {
771 $documentTitles[$document['ID']] = [
772 'ID' => $document['ID'],
773 'TITLE' => $document['TITLE'],
774 'DOC_TYPE' => $document['DOC_TYPE'],
775 ];
776 }
777
778 return $documentTitles;
779 }
780
781 private function getDocumentStoreList(array $documentIds): array
782 {
783 $documentRawList = StoreDocumentElementTable::getList([
784 'select' => [
785 'DOC_ID',
786 'STORE_FROM',
787 'STORE_TO',
788 ],
789 'filter' => [
790 '@DOC_ID' => $documentIds,
791 ],
792 ]);
793
794 $storeList = [];
795
796 while ($document = $documentRawList->fetch())
797 {
798 $documentId = (int)$document['DOC_ID'];
799 $storeList[$documentId] ??= [];
800
801 $storeFrom = (int)$document['STORE_FROM'];
802 $storeTo = (int)$document['STORE_TO'];
803
804 if ($document['STORE_FROM'] > 0)
805 {
806 $storeList[$documentId][$storeFrom] = $storeFrom;
807 }
808 if ($document['STORE_TO'] > 0)
809 {
810 $storeList[$documentId][$storeTo] = $storeTo;
811 }
812 }
813
814 return $storeList;
815 }
816
817 private function checkAllStoreAccess(array $documentIds): bool
818 {
819 $can = true;
820
821 foreach ($documentIds as $storeId)
822 {
823 if (!$this->accessController->checkByValue(ActionDictionary::ACTION_STORE_VIEW, $storeId))
824 {
825 $can = false;
826
827 break;
828 }
829 }
830
831 return $can;
832 }
833
844 private function checkDocumentAccess(string $action, int $documentId): bool
845 {
846 $can = $this->accessController->check($action, StoreDocument::createFromId($documentId));
847 if (!$can)
848 {
849 $this->addError(
850 new Error(Loc::getMessage('DOCUMENT_CONTROLLER_NO_RIGHTS_ERROR'))
851 );
852
853 return false;
854 }
855
856 return true;
857 }
858
865 {
866 $filter = $params['filter'];
867
868 // set available types for REST
869 $filter = [
870 '=DOC_TYPE' => array_keys(self::getAvailableRestDocumentTypes()),
871 $filter,
872 ];
873
874 $accessFilter = $this->accessController->getEntityFilter(
875 ActionDictionary::ACTION_STORE_DOCUMENT_VIEW,
876 get_class($this->getEntityTable())
877 );
878 if ($accessFilter)
879 {
880 // combines through a new array so that the `OR` condition does not bypass the access filter.
881 $filter = [
882 $accessFilter,
883 $filter,
884 ];
885 }
886
887 $params['filter'] = $filter;
888
889 return $params;
890 }
891}
global $APPLICATION
Определения include.php:80
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
Определения check_mail.php:18
checkModifyPermissionEntity()
Определения document.php:734
static getAvailableRestDocumentTypes()
Определения document.php:691
addAction(array $fields)
Определения document.php:264
conductListAction(array $documentIds)
Определения document.php:39
conductAction(int $id)
Определения document.php:561
cancelAction(int $id)
Определения document.php:636
confirmAction(int $id)
Определения document.php:575
cancelListAction(array $documentIds)
Определения document.php:137
deleteAction(int $id)
Определения document.php:481
modifyListActionParameters(array $params)
Определения document.php:864
updateAction(int $id, array $fields)
Определения document.php:329
unconfirmAction(int $id)
Определения document.php:648
checkPermissionEntity($name, $arguments=[])
Определения document.php:705
static getTypeList(bool $description=false)
Определения storedocumenttable.php:341
addError(Error $error)
Определения action.php:200
Определения error.php:15
static getById($id)
Определения datamanager.php:364
static getList(array $parameters=array())
Определения datamanager.php:431
if(errorBox) return true
Определения file_new.php:1035
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$result
Определения get_property_values.php:14
$filter
Определения iblock_catalog_list.php:54
htmlspecialcharsbx($string, $flags=ENT_COMPAT, $doubleEncode=true)
Определения tools.php:2701
$name
Определения menu_edit.php:35
trait ListAction
Определения listaction.php:9
$user
Определения mysql_to_pgsql.php:33
$message
Определения payment.php:8
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']
Определения template.php:799
$availableTypes
Определения options_user_settings.php:35
const SITE_ID
Определения sonet_set_content_view.php:12
$error
Определения subscription_card_product.php:20
$action
Определения file_dialog.php:21
$fields
Определения yandex_run.php:501