26 private const ERROR_CASHBOX_ADD =
'ERROR_CASHBOX_ADD';
27 private const ERROR_CASHBOX_NOT_FOUND =
'ERROR_CASHBOX_NOT_FOUND';
28 private const ERROR_CASHBOX_UPDATE =
'ERROR_CASHBOX_UPDATE';
29 private const ERROR_CASHBOX_DELETE =
'ERROR_CASHBOX_DELETE';
31 private const ALLOWED_CASHBOX_FIELDS = [
32 'ID',
'NAME',
'OFD',
'EMAIL',
33 'DATE_CREATE',
'DATE_LAST_CHECK',
'NUMBER_KKM',
'KKM_ID',
34 'ACTIVE',
'SORT',
'USE_OFFLINE',
'ENABLED',
42 private static function checkParamsBeforeAddCashbox(
$params)
46 throw new RestException(
'Parameter NAME is not defined', self::ERROR_CHECK_FAILURE);
49 if (empty(
$params[
'REST_CODE']))
51 throw new RestException(
'Parameter REST_CODE is not defined', self::ERROR_CHECK_FAILURE);
57 throw new RestException(
"Rest handler with code {$params['REST_CODE']} not found", self::ERROR_CHECK_FAILURE);
60 if (
$params[
'APP_ID'] && !empty($restHandler[
'APP_ID']) && $restHandler[
'APP_ID'] !==
$params[
'APP_ID'])
67 throw new RestException(
'Parameter EMAIL is not defined', self::ERROR_CHECK_FAILURE);
72 $ofdHandlerClass = self::getOfdHandlerClassByCode(
$params[
'OFD']);
73 if (is_null($ofdHandlerClass))
75 throw new RestException(
'Ofd handler not found', self::ERROR_CHECK_FAILURE);
85 private static function checkParamsBeforeUpdateCashbox(
$params)
89 throw new RestException(
'Parameter ID is not defined', self::ERROR_CHECK_FAILURE);
95 throw new RestException(
'Cashbox not found', self::ERROR_CASHBOX_NOT_FOUND);
100 throw new RestException(
'Parameter FIELDS is not defined', self::ERROR_CHECK_FAILURE);
103 if (isset(
$params[
'FIELDS'][
'EMAIL']) && empty(
$params[
'FIELDS'][
'EMAIL']))
105 throw new RestException(
'Parameter EMAIL cannot be empty', self::ERROR_CHECK_FAILURE);
108 if (!empty(
$params[
'FIELDS'][
'OFD']))
110 $ofdHandlerClass = self::getOfdHandlerClassByCode(
$params[
'FIELDS'][
'OFD']);
111 if (is_null($ofdHandlerClass))
113 throw new RestException(
'Ofd handler not found', self::ERROR_CHECK_FAILURE);
117 if (!self::hasAccessToCashbox($cashbox,
$params[
'APP_ID']))
127 private static function getOfdHandlerClassByCode($ofdCode): ?
string
129 $ofdHandlers = Ofd::getHandlerList();
130 foreach ($ofdHandlers as $handler =>
$name)
132 $currentHandlerCode = $handler::getCode();
133 if ($currentHandlerCode === $ofdCode)
147 private static function checkParamsBeforeDeleteCashbox(
$params)
151 throw new RestException(
'Parameter ID is not defined', self::ERROR_CHECK_FAILURE);
157 throw new RestException(
'Cashbox not found', self::ERROR_CASHBOX_NOT_FOUND);
160 if (!self::hasAccessToCashbox($cashbox,
$params[
'APP_ID']))
175 self::checkParamsBeforeAddCashbox(
$params);
182 'HANDLER' =>
'\\' . CashboxRest::class,
183 'OFD' => empty(
$params[
'OFD']) ?
'' : self::getOfdHandlerClassByCode(
$params[
'OFD']),
184 'OFD_SETTINGS' =>
$params[
'OFD_SETTINGS'] ?: [],
186 'NUMBER_KKM' => empty(
$params[
'NUMBER_KKM']) ?
'' :
$params[
'NUMBER_KKM'],
188 'ACTIVE' => (
$params[
'ACTIVE'] ===
'Y') ?
'Y' :
'N',
189 'SORT' => is_numeric(
$params[
'SORT']) ? (int)
$params[
'SORT'] : 100,
190 'USE_OFFLINE' => (
$params[
'USE_OFFLINE'] ===
'Y') ?
'Y' :
'N',
214 self::checkParamsBeforeUpdateCashbox(
$params);
217 'NAME',
'OFD',
'OFD_SETTINGS',
'EMAIL',
218 'NUMBER_KKM',
'KKM_ID',
'ACTIVE',
'SORT',
219 'USE_OFFLINE',
'ENABLED',
'SETTINGS',
225 if (isset($cashboxFields[
'OFD']))
227 $cashboxFields[
'OFD'] = self::getOfdHandlerClassByCode($cashboxFields[
'OFD']);
230 if ($cashboxFields[
'SETTINGS'])
232 $cashboxFields[
'SETTINGS'] = self::mergeCashboxSettings(
$params[
'ID'], $cashboxFields[
'SETTINGS']);
250 private static function mergeCashboxSettings($cashboxId, $newSettings)
253 'select' => [
'SETTINGS'],
254 'filter' => [
'=ID' => $cashboxId],
256 ])->fetch()[
'SETTINGS'];
258 if (!$existingSettings)
263 $mergedSettings = array_replace_recursive($existingSettings, $newSettings);
264 return $mergedSettings;
276 self::checkParamsBeforeDeleteCashbox(
$params);
298 self::checkParamsBeforeCashboxListGet(
$params);
302 ? array_flip(self::prepareIncomingParams(array_flip(
$params[
'SELECT'])))
303 : self::ALLOWED_CASHBOX_FIELDS
315 while ($cashbox = $cashboxListResult->fetch())
319 $cashbox[
'OFD'] = $cashbox[
'OFD']::getCode();
328 private static function checkParamsBeforeCashboxListGet(
array $params)
333 $select = array_flip(self::prepareIncomingParams(array_flip(
$select)));
334 $diffSelect = array_diff(
$select, self::ALLOWED_CASHBOX_FIELDS);
338 throw new RestException(implode(
', ', $diffSelect) .
' not allowed for select');
346 foreach (
$filter as $rawName => $value)
349 if (isset($filterField[
'FIELD']))
356 $diffFilter = array_diff(
$filterFields, self::ALLOWED_CASHBOX_FIELDS);
359 throw new RestException(implode(
', ', $diffFilter) .
' not allowed for filter');
370 $diffOrder = array_diff(array_keys(
$order), self::ALLOWED_CASHBOX_FIELDS);
373 throw new RestException(implode(
', ', $diffOrder) .
' not allowed for order');
388 self::checkParamsBeforeCashboxSettingsGet(
$params);
393 $settings = $cashbox->getField(
'SETTINGS');
412 self::checkParamsBeforeCashboxSettingsGet(
$params);
417 return $cashbox->getField(
'OFD_SETTINGS');
428 private static function checkParamsBeforeCashboxSettingsGet(
array $params)
432 throw new RestException(
'Parameter ID is not defined', self::ERROR_CHECK_FAILURE);
438 throw new RestException(
'Cashbox not found', self::ERROR_CASHBOX_NOT_FOUND);
441 if (!self::hasAccessToCashbox($cashbox,
$params[
'APP_ID']))
458 self::checkParamsBeforeCashboxSettingsUpdate(
$params);
461 $restHandlerCode = $cashbox->getValueFromSettings(
'REST',
'REST_CODE');
463 $params[
'FIELDS'][
'REST'][
'REST_CODE'] = $restHandlerCode;
479 self::checkParamsBeforeCashboxSettingsUpdate(
$params);
496 private static function checkParamsBeforeCashboxSettingsUpdate(
array $params)
500 throw new RestException(
'Parameter ID is not defined', self::ERROR_CHECK_FAILURE);
505 throw new RestException(
'Parameter FIELDS is not defined', self::ERROR_CHECK_FAILURE);
511 throw new RestException(
'Cashbox not found', self::ERROR_CASHBOX_NOT_FOUND);
514 if (!self::hasAccessToCashbox($cashbox,
$params[
'APP_ID']))
516 throw new AccessException();
520 private static function hasAccessToCashbox(Cashbox $cashbox,
string $appId =
null): bool
522 $handler = $cashbox->getField(
'HANDLER');
523 if (self::isRestHandler($handler))
525 $restHandlerCode = $cashbox->getValueFromSettings(
'REST',
'REST_CODE');
527 $handlerData = self::getHandlerData($restHandlerCode);
528 if ($appId && !empty($handlerData[
'APP_ID']) && $handlerData[
'APP_ID'] !== $appId)
541 private static function isRestHandler(
string $handler): bool
543 return $handler ===
'\\' . CashboxRest::class;
546 private static function getHandlerData(
string $code): ?
array
556 'filter' => [
'CODE' =>
$code],
static includeModule($moduleName)
static getList(array $parameters=array())