@snabcentr/common-lib 2.0.7 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/manifest.json +1 -1
  2. package/dist/release_notes.tmp +1 -6
  3. package/dist/sc-common-lib.js +545 -455
  4. package/dist/sc-common-lib.js.map +1 -1
  5. package/dist/sc-common-lib.umd.cjs +1 -1
  6. package/dist/sc-common-lib.umd.cjs.map +1 -1
  7. package/dist/src/clients/classes/client-short-info.d.ts +5 -0
  8. package/dist/src/clients/classes/client-short-info.d.ts.map +1 -1
  9. package/dist/src/clients/classes/client.d.ts +9 -2
  10. package/dist/src/clients/classes/client.d.ts.map +1 -1
  11. package/dist/src/clients/classes/clients-list-filters.d.ts +12 -1
  12. package/dist/src/clients/classes/clients-list-filters.d.ts.map +1 -1
  13. package/dist/src/clients/interfaces/i-client-short-info.d.ts +5 -0
  14. package/dist/src/clients/interfaces/i-client-short-info.d.ts.map +1 -1
  15. package/dist/src/clients/interfaces/i-client.d.ts +9 -2
  16. package/dist/src/clients/interfaces/i-client.d.ts.map +1 -1
  17. package/dist/src/clients/interfaces/i-clients-list-filters.d.ts +5 -0
  18. package/dist/src/clients/interfaces/i-clients-list-filters.d.ts.map +1 -1
  19. package/dist/src/clients/providers/client-data-provider.d.ts +34 -0
  20. package/dist/src/clients/providers/client-data-provider.d.ts.map +1 -1
  21. package/dist/src/config/interfaces/i-catalog-config.d.ts +7 -2
  22. package/dist/src/config/interfaces/i-catalog-config.d.ts.map +1 -1
  23. package/dist/src/managers/classes/curator.d.ts +28 -0
  24. package/dist/src/managers/classes/curator.d.ts.map +1 -0
  25. package/dist/src/managers/classes/index.d.ts +1 -0
  26. package/dist/src/managers/classes/index.d.ts.map +1 -1
  27. package/dist/src/managers/classes/manager.d.ts +5 -0
  28. package/dist/src/managers/classes/manager.d.ts.map +1 -1
  29. package/dist/src/managers/interfaces/i-curator.d.ts +21 -0
  30. package/dist/src/managers/interfaces/i-curator.d.ts.map +1 -0
  31. package/dist/src/managers/interfaces/i-manager.d.ts +5 -0
  32. package/dist/src/managers/interfaces/i-manager.d.ts.map +1 -1
  33. package/dist/src/managers/interfaces/index.d.ts +1 -0
  34. package/dist/src/managers/interfaces/index.d.ts.map +1 -1
  35. package/dist/src/references/classes/curated-direction.d.ts +8 -0
  36. package/dist/src/references/classes/curated-direction.d.ts.map +1 -0
  37. package/dist/src/references/classes/index.d.ts +1 -0
  38. package/dist/src/references/classes/index.d.ts.map +1 -1
  39. package/dist/src/references/interfaces/i-curated-direction.d.ts +7 -0
  40. package/dist/src/references/interfaces/i-curated-direction.d.ts.map +1 -0
  41. package/dist/src/references/interfaces/index.d.ts +1 -0
  42. package/dist/src/references/interfaces/index.d.ts.map +1 -1
  43. package/dist/src/references/providers/reference-data-provider.d.ts +5 -0
  44. package/dist/src/references/providers/reference-data-provider.d.ts.map +1 -1
  45. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"sc-common-lib.js","sources":["../src/auth/classes/jwt-payload.ts","../src/auth/classes/detailed-jwt-payload.ts","../src/config/providers/app-config-provider.ts","../src/system/providers/preferences-storage-provider.ts","../src/auth/states/auth-state-store.ts","../src/system/classes/identity.ts","../src/system/classes/named-identity.ts","../src/system/classes/coded-identity.ts","../src/system/classes/catalogable-item.ts","../src/system/classes/primary-catalogable-item.ts","../src/catalog/classes/internal/base/base-category.ts","../src/catalog/enums/price-coefficient-enum.ts","../src/system/classes/reference.ts","../src/references/classes/price-coefficient.ts","../src/catalog/classes/product-price-coefficient.ts","../src/geo/classes/geo-coordinates.ts","../src/references/classes/delivery-type.ts","../src/references/classes/warehouse.ts","../src/catalog/classes/stock-count.ts","../src/system/classes/hidden-catalogable-item.ts","../src/system/classes/image.ts","../src/catalog/classes/product.ts","../src/cart/classes/cart-item-base.ts","../src/cart/classes/cart-item.ts","../src/cart/classes/cart.ts","../src/system/providers/typed-instance-factory.ts","../src/http/classes/http-requester.ts","../src/cart/providers/cart-provider.ts","../src/catalog/enums/calculation-type-enum.ts","../src/catalog/enums/cost-source-enum.ts","../src/catalog/enums/property-type-enum.ts","../src/catalog/classes/category.ts","../src/system/classes/updatable-named-identity.ts","../src/system/classes/deletable-named-identity.ts","../src/user/classes/user-short-info.ts","../src/catalog/classes/discount-short-info.ts","../src/catalog/classes/price-template.ts","../src/catalog/classes/client-product.ts","../src/contacts/classes/contact-links.ts","../src/references/classes/sales-direction.ts","../src/managers/classes/manager-common.ts","../src/user/classes/user-pricing-role.ts","../src/managers/classes/manager.ts","../src/catalog/classes/internal/base/base-client-category.ts","../src/catalog/classes/client-category.ts","../src/catalog/classes/price-template-catalogable-item.ts","../src/catalog/classes/price-template-category.ts","../src/references/classes/country.ts","../src/references/classes/region.ts","../src/references/classes/city-with-region-and-country.ts","../src/user/classes/user-common-info.ts","../src/clients/classes/client-short-info.ts","../src/catalog/classes/price-template-client.ts","../src/catalog/classes/price-template-product.ts","../src/catalog/classes/property-type.ts","../src/catalog/classes/property.ts","../src/catalog/classes/property-value.ts","../src/system/classes/date-period.ts","../src/catalog/classes/templates-list-filters.ts","../src/catalog/classes/pricing-role.ts","../src/catalog/classes/category-pricing-rule.ts","../src/config/classes/device-type-resolution-config.ts","../src/config/classes/http-params-config.ts","../src/config/classes/sentry-config.ts","../src/config/classes/version-config.ts","../src/config/classes/websocket-config.ts","../src/config/classes/app-base-config.ts","../src/catalog/providers/catalog-provider.ts","../src/catalog/providers/client-price-provider.ts","../src/catalog/providers/client-price-template-provider.ts","../src/catalog/providers/product-category-data-provider.ts","../src/catalog/providers/product-data-provider.ts","../src/catalog/providers/client-product-category-data-provider.ts","../src/catalog/providers/client-product-data-provider.ts","../src/data-table/enums/filter-op-enum.ts","../src/data-table/classes/filter-item.ts","../src/data-table/classes/filter-group.ts","../src/pagination/providers/base-pagination-provider.ts","../src/catalog/providers/price-template-provider.ts","../src/catalog/providers/pricing-role-provider.ts","../src/catalog/providers/properties-provider.ts","../src/catalog/methods/find-catalog-item.ts","../src/catalog/methods/flatten-catalog-items.ts","../src/clients/enums/clients-additional-data-request-type-enum.ts","../src/clients/enums/opf-enum.ts","../src/references/classes/any-reference.ts","../src/references/classes/channel-primary-interest.ts","../src/references/classes/city.ts","../src/references/classes/contact-position.ts","../src/references/classes/currency.ts","../src/references/classes/opf.ts","../src/references/classes/order-payment-status.ts","../src/references/classes/order-status.ts","../src/references/classes/partner-group.ts","../src/references/classes/payment-type.ts","../src/references/classes/product-file-type.ts","../src/references/classes/resource-type.ts","../src/references/classes/source-primary-interest.ts","../src/clients/classes/bank-account.ts","../src/contacts/classes/contact.ts","../src/contacts/classes/contact-person.ts","../src/clients/classes/contragent/contragent-base.ts","../src/clients/classes/contragent/contragent-person.ts","../src/clients/classes/contragent/contragent-ic.ts","../src/clients/classes/contragent/contragent-ul-r.ts","../src/clients/classes/contragent/contragent-ul-nr.ts","../src/clients/classes/contragent/contragent-factory.ts","../src/contacts/classes/contact-relation.ts","../src/contacts/classes/contact-person-related.ts","../src/clients/classes/delivery-address.ts","../src/clients/classes/client.ts","../src/clients/classes/clients-list-filters.ts","../src/orders/classes/order-short-info.ts","../src/clients/classes/client-additional-data.ts","../src/data-table/classes/data-table-pagination-request-params.ts","../src/data-table/classes/data-table-pagination.ts","../src/data-table/classes/data-table-sort-request-params.ts","../src/clients/providers/client-data-provider.ts","../src/http/classes/http-cached-requester.ts","../src/clients/providers/unknown-client-data-provider.ts","../src/configurator/providers/configurator-provider.ts","../src/date-time/providers/date-time-provider.ts","../src/helpers/units-helper.ts","../src/managers/classes/manager-data-factory.ts","../src/managers/providers/manager-data-provider.ts","../src/orders/classes/order-info.ts","../src/orders/classes/order-product.ts","../src/orders/classes/order.ts","../src/orders/providers/orders-data-provider.ts","../src/price-analyze/classes/price-analyze.ts","../src/price-analyze/converters/price-analyze-filters.ts","../src/price-analyze/converters/price-analyze-params.ts","../src/price-analyze/providers/price-analyze-provider.ts","../src/price-history/classes/price-history-item.ts","../src/price-history/classes/product-price-history.ts","../src/price-history/providers/price-history-data-provider.ts","../src/recommendations/classes/recommendations-list.ts","../src/recommendations/providers/recommendations-data-provider.ts","../src/references/providers/reference-data-provider.ts","../src/references/states/references-state-store.ts","../src/seo/classes/meta-tag-item.ts","../src/seo/classes/seo.ts","../src/seo/providers/seo-data-provider.ts","../src/suggestion/providers/data-suggestion-provider.ts","../src/user/enums/user-type-enum.ts","../src/user/classes/user.ts","../src/user/providers/user-auth-data-provider.ts","../src/user/providers/user-data-provider.ts","../src/user/states/user-state-store.ts","../src/validation/classes/field-validation-result-data.ts"],"sourcesContent":["import { IBaseResourceAccess } from '@sc/auth/interfaces/i-base-resource-access';\nimport { IJwtPayload } from '@sc/auth/interfaces/i-jwt-payload';\nimport { IRealmAccess } from '@sc/auth/interfaces/i-realm-access';\nimport { jwtDecode } from 'jwt-decode';\nimport { merge } from 'lodash-es';\nimport { objectToCamel } from 'ts-case-convert';\n\n/**\n * Данные полезной нагрузки JWT токена.\n */\nexport class JwtPayload<T extends IBaseResourceAccess = IBaseResourceAccess> implements IJwtPayload<T> {\n /**\n * Возвращает данные полезной нагрузки для указанного JWT-токена.\n *\n * @param jwtToken JWT-ключ доступа.\n */\n public static getJwtPayload<O extends IBaseResourceAccess = IBaseResourceAccess>(jwtToken: string): IJwtPayload<O> {\n const decodedJwtPayload = jwtDecode<IJwtPayload<O>>(jwtToken);\n const payload = new JwtPayload(objectToCamel(decodedJwtPayload) as unknown as IJwtPayload<O>);\n\n // Необходимо сохранить в исходном виде названия ключей ресурсов, иначе может быть путаница.\n payload.resourceAccess = decodedJwtPayload.resource_access as IJwtPayload<O>['resourceAccess'];\n\n return payload;\n }\n\n /**\n * @inheritDoc\n */\n public exp: number = 0;\n\n /**\n * @inheritDoc\n */\n public iat: number = 0;\n\n /**\n * @inheritDoc\n */\n public authTime: number = 0;\n\n /**\n * @inheritDoc\n */\n public jti: string = '';\n\n /**\n * @inheritDoc\n */\n public iss: string = '';\n\n /**\n * @inheritDoc\n */\n public aud: string[] = [];\n\n /**\n * @inheritDoc\n */\n public sub: string = '';\n\n /**\n * @inheritDoc\n */\n public typ: string = 'Bearer';\n\n /**\n * @inheritDoc\n */\n public azp: string = '';\n\n /**\n * @inheritDoc\n */\n public sid: string = '';\n\n /**\n * @inheritDoc\n */\n public acr: string = '';\n\n /**\n * @inheritDoc\n */\n public allowedOrigins: string[] = [];\n\n /**\n * @inheritDoc\n */\n public realmAccess: IRealmAccess = { roles: [] };\n\n /**\n * @inheritDoc\n */\n public resourceAccess: T = {} as T;\n\n /**\n * @inheritDoc\n */\n public scope: string = '';\n\n /**\n * @inheritDoc\n */\n public emailVerified: boolean = false;\n\n /**\n * @inheritDoc\n */\n public name: string = '';\n\n /**\n * @inheritDoc\n */\n public guid: string = '';\n\n /**\n * @inheritDoc\n */\n public preferredUsername: string = '';\n\n /**\n * @inheritDoc\n */\n public givenName: string = '';\n\n /**\n * @inheritDoc\n */\n public email: string = '';\n\n /**\n * @inheritDoc\n */\n [key: string]: unknown;\n\n /**\n * Инициализирует экземпляр класса {@link JwtPayload}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data: IJwtPayload<T>) {\n merge(this, data);\n }\n}\n","import { JwtPayload } from '@sc/auth/classes/jwt-payload';\nimport { IBaseResourceAccess } from '@sc/auth/interfaces/i-base-resource-access';\nimport { IDetailedJwtPayload } from '@sc/auth/interfaces/i-detailed-jwt-payload';\nimport { IUserAddress } from '@sc/auth/interfaces/i-user-address';\nimport { jwtDecode } from 'jwt-decode';\nimport { merge } from 'lodash-es';\nimport { objectToCamel } from 'ts-case-convert';\n\n/**\n * Расширенные данные полезной нагрузки JWT токена.\n */\nexport class DetailedJwtPayload<T extends IBaseResourceAccess = IBaseResourceAccess> extends JwtPayload<T> implements IDetailedJwtPayload<T> {\n /**\n * Возвращает данные полезной нагрузки для указанного JWT-токена.\n *\n * @param jwtToken JWT-ключ доступа.\n */\n public static getJwtPayload<O extends IBaseResourceAccess = IBaseResourceAccess>(jwtToken: string): IDetailedJwtPayload<O> {\n return new JwtPayload(objectToCamel(jwtDecode<O>(jwtToken)) as unknown as IDetailedJwtPayload<O>);\n }\n\n /**\n * @inheritDoc\n */\n public familyName?: string;\n\n /**\n * @inheritDoc\n */\n public middleName?: string;\n\n /**\n * @inheritDoc\n */\n public locale?: string;\n\n /**\n * @inheritDoc\n */\n public phoneNumber?: string;\n\n /**\n * @inheritDoc\n */\n public phoneNumberVerified?: boolean;\n\n /**\n * @inheritDoc\n */\n public address?: IUserAddress;\n\n /**\n * Инициализирует экземпляр класса {@link DetailedJwtPayload}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data: IDetailedJwtPayload<T>) {\n super(data);\n\n merge(this, data);\n }\n}\n","import { IAppBaseConfig } from '@sc/config/interfaces/i-app-base-config';\nimport { isUndefined } from 'lodash-es';\n\n/**\n * Провайдер, предоставляющий доступ к конфигурации приложения.\n */\nexport class AppConfigProvider {\n /**\n * Конфигурация приложения.\n */\n protected static config?: unknown;\n\n /**\n * Инициализирует и возвращает конфигурацию приложения.\n *\n * @param config Данные для первоначальной инициализации.\n */\n public static init(config: unknown) {\n AppConfigProvider.config = config;\n }\n\n /**\n * Возвращает текущую конфигурацию приложения.\n */\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters\n public static getConfig<T = IAppBaseConfig>(): T {\n if (isUndefined(AppConfigProvider.config)) {\n throw new Error('Config is undefined. Please set config by AppConfigProvider.init().');\n }\n\n return AppConfigProvider.config as T;\n }\n\n /**\n * Выполняет загрузку конфигурации по указанному пути.\n *\n * @param path Путь к конфигурации.\n */\n public static loadRemoteConfig<T = IAppBaseConfig>(path: string = '/config.json'): Promise<Partial<T>> {\n const configPromise = fetch(path).then((response) => {\n if (!response.ok) {\n // eslint-disable-next-line no-console\n console.error(new Error(`Ошибка загрузки ${path}: ${response.statusText}`));\n\n // eslint-disable-next-line sonarjs/prefer-promise-shorthand\n return new Promise<Partial<T>>((resolve) => {\n resolve({});\n });\n }\n\n return response.json() as Promise<Partial<T>>;\n });\n\n // eslint-disable-next-line unicorn/prefer-top-level-await\n configPromise.catch((error) => {\n // eslint-disable-next-line no-console\n console.error(error);\n });\n\n return configPromise;\n }\n}\n","import { isAfter, parseISO, startOfToday } from 'date-fns';\nimport { isEmpty, isNil } from 'lodash-es';\n\n/**\n * Провайдер, обеспечивающий механизмы сохранения и получения настроек из хранилища браузера.\n */\nexport class PreferencesStorageProvider {\n /**\n * Возвращает актуальные и не просроченные данные из хранилища.\n *\n * @param keyName Название ключа из которого необходимо получить данные.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n public static getActualDataFromStorage(keyName: string): any {\n // Проверяем доступность localStorage.\n if (!this.isLocalStorageAvailable()) {\n return undefined;\n }\n\n let rawSavedData: string | null = null;\n\n try {\n rawSavedData = localStorage.getItem(keyName);\n } catch {\n return undefined;\n }\n\n if (rawSavedData) {\n try {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-explicit-any\n const savedData = JSON.parse(rawSavedData) as { availableFor?: string; data?: any };\n\n // Данные возвращаем только если они актуальны (если availableFor не задан, данные всегда актуальны).\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!savedData.availableFor || isAfter(parseISO(savedData.availableFor) || startOfToday(), new Date())) {\n if (isNil(savedData.data) || isEmpty(savedData.data)) {\n throw new Error('Data is empty');\n }\n\n return savedData.data;\n }\n } catch {\n try {\n localStorage.removeItem(keyName);\n } catch {\n /* Do nothing. */\n }\n }\n }\n\n return undefined;\n }\n\n /**\n * Сохраняет данные в хранилище.\n *\n * @param keyName Название ключа в который необходимо сохранить данные.\n * @param data Данные, которые необходимо сохранить.\n * @param availableFor Дата и время до которого будут храниться настройки. Если не задан, данные будут храниться бессрочно.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n public static saveActualDataToStorage(keyName: string, data: any, availableFor?: Date) {\n // Проверяем доступность localStorage.\n if (!this.isLocalStorageAvailable()) {\n return;\n }\n\n try {\n if (isNil(data) || isEmpty(data)) {\n throw new Error('Data is empty');\n }\n\n const dataToSave = JSON.stringify({\n availableFor: availableFor,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n data: data,\n });\n\n localStorage.setItem(keyName, dataToSave);\n } catch (error) {\n // Если ошибка связана с превышением квоты, пытаемся очистить старые данные.\n // eslint-disable-next-line sonarjs/deprecation\n if (error instanceof DOMException && error.code === DOMException.QUOTA_EXCEEDED_ERR) {\n this.clearOldData();\n\n // Повторная попытка сохранения.\n try {\n const dataToSave = JSON.stringify({\n availableFor: availableFor,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n data: data,\n });\n localStorage.setItem(keyName, dataToSave);\n } catch {\n /* Do nothing. */\n }\n } else {\n try {\n localStorage.removeItem(keyName);\n } catch {\n /* Do nothing. */\n }\n }\n }\n }\n\n /**\n * Проверяет доступность localStorage в браузере.\n */\n private static isLocalStorageAvailable(): boolean {\n try {\n const testKey = '__localStorage_test__';\n\n localStorage.setItem(testKey, 'test');\n localStorage.removeItem(testKey);\n\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Очищает устаревшие данные из localStorage для освобождения места.\n */\n private static clearOldData(): void {\n try {\n const keysToRemove: string[] = [];\n\n // Проходим по всем ключам в localStorage.\n // eslint-disable-next-line no-plusplus\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n\n if (key) {\n try {\n const rawData = localStorage.getItem(key);\n\n if (rawData) {\n const data = JSON.parse(rawData) as { availableFor?: string };\n\n // Если данные просрочены, добавляем ключ в список для удаления.\n // Данные без availableFor считаются бессрочными и не удаляются.\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (data.availableFor && !isAfter(parseISO(data.availableFor) || startOfToday(), new Date())) {\n keysToRemove.push(key);\n }\n }\n } catch {\n // Если не удается распознать данные, считаем их поврежденными и удаляем.\n keysToRemove.push(key);\n }\n }\n }\n\n // Удаляем устаревшие и поврежденные данные.\n keysToRemove.forEach((key) => {\n try {\n localStorage.removeItem(key);\n } catch {\n /* Do nothing. */\n }\n });\n } catch {\n /* Do nothing. */\n }\n }\n}\n","import { JwtPayload } from '@sc/auth/classes/jwt-payload';\nimport { AppConfigProvider } from '@sc/config/providers/app-config-provider';\nimport { PreferencesStorageProvider } from '@sc/system/providers/preferences-storage-provider';\nimport { every, isArray, isNil, mapValues, noop, split } from 'lodash-es';\nimport { defineStore } from 'pinia';\nimport { computed, ComputedRef, markRaw, ref } from 'vue';\n\n// TODO: SecurityRisk: При полном переходе аутентификации на KeyCloak (с использованием refresh_token) необходимо отказаться от использования локального хранилища браузера, а использовать BroadcastChannel или SharedWorker.\n\n/**\n * Перечисление с названиями параметров.\n */\nenum StorageParametersNames {\n /**\n * Название ключа хранящего JWT токен.\n */\n JwtToken = 'sc.token',\n}\n\n/**\n * Получает дату истечения JWT токена.\n *\n * @param token JWT токен.\n * @returns Дата истечения токена или undefined, если не удалось определить.\n */\nfunction getTokenExpirationDate(token: string): Date | undefined {\n try {\n const payload = JwtPayload.getJwtPayload(token);\n\n // Конвертируем из секунд в миллисекунды.\n return new Date(payload.exp * 1000);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Хранилище данных состояния аутентификации приложения.\n */\nconst useAuthStatePrivateStore = defineStore('__auth_state_private', () => {\n /**\n * {@link Promise<string>} для получения jwt-ключа доступа к системам.\n */\n const jwtToken = ref<Promise<string> | undefined>(\n (() => {\n // Сначала проверяем хранилище.\n const storedToken = PreferencesStorageProvider.getActualDataFromStorage(StorageParametersNames.JwtToken) as string | undefined;\n\n if (storedToken) {\n return Promise.resolve(storedToken);\n }\n\n // Если в хранилище нет токена, используем devMode токен.\n const developmentToken = AppConfigProvider.getConfig().devMode?.initAuthBearerToken as string | undefined;\n\n return developmentToken ? Promise.resolve(developmentToken) : undefined;\n })()\n );\n\n /**\n * Функция для обновления jwt-ключа доступа к системам.\n */\n const jwtTokenUpdater = ref<(() => Promise<string>) | undefined>(undefined);\n\n /**\n * Список прав текущего пользователя.\n */\n const userPermissions = ref<Record<string, string[]> | undefined>(undefined);\n\n /**\n * Список вычисляемых свойств для проверки наличия у пользователя прав доступа.\n * Делаем контейнер нереактивным, чтобы исключить авто-распаковку ref/computed.\n */\n // eslint-disable-next-line unicorn/prevent-abbreviations\n const userPermissionsComputedRefs = markRaw(new Map<string, ComputedRef<boolean>>());\n\n /**\n * Принудительно пересчитывает права доступа пользователя на основе текущего JWT токена.\n */\n function recalculateUserPermissions(): void {\n // Очищаем только текущие права, НЕ удаляем computed refs (это может привести к ошибкам в других частях приложения).\n userPermissions.value = undefined;\n\n // Если есть токен, пересчитываем права.\n if (!isNil(jwtToken.value)) {\n jwtToken.value\n .then((token) => {\n const jwtPayload = JwtPayload.getJwtPayload(token);\n\n userPermissions.value = jwtPayload.exp * 1000 > Date.now() ? mapValues(jwtPayload.resourceAccess, (value) => value?.roles ?? []) : undefined;\n })\n .catch(noop);\n }\n }\n\n return {\n /**\n * {@link Promise<string>} для получения jwt-ключа доступа к системам.\n */\n jwtToken,\n\n /**\n * Функция для обновления jwt-ключа доступа к системам.\n */\n jwtTokenUpdater,\n\n /**\n * Список прав текущего пользователя.\n */\n userPermissions,\n\n /**\n * Список вычисляемых свойств для проверки наличия у пользователя прав доступа.\n */\n userPermissionsComputedRefs,\n\n /**\n * Принудительно пересчитывает права доступа пользователя на основе текущего JWT токена.\n */\n recalculateUserPermissions,\n };\n});\n\n/**\n * Хранилище данных состояния аутентификации приложения.\n */\nexport const useAuthStateStore = defineStore('__auth_state', () => {\n /**\n * {@link Promise<string>} для получения jwt-ключа доступа к системам.\n */\n const jwtToken = computed<Promise<string> | undefined>(() => {\n const privateStore = useAuthStatePrivateStore();\n\n // Если токен не установлен и есть механизм для его обновления, то обновляем токен.\n if (isNil(privateStore.jwtToken) && !isNil(privateStore.jwtTokenUpdater)) {\n const updater = privateStore.jwtTokenUpdater();\n\n privateStore.jwtToken = updater;\n\n updater\n .then((key: string) => {\n privateStore.jwtToken = Promise.resolve(key);\n\n // Сохраняем в хранилище.\n PreferencesStorageProvider.saveActualDataToStorage(StorageParametersNames.JwtToken, key, getTokenExpirationDate(key));\n\n // Пересчитываем права доступа при обновлении токена.\n privateStore.recalculateUserPermissions();\n })\n .catch(noop);\n }\n\n return privateStore.jwtToken;\n });\n\n /**\n * Устанавливает механизм для обновления jwt-ключа доступа к системам.\n *\n * @param updater Механизм для обновления jwt-ключа доступа к системам.\n */\n function setJwtTokenUpdater(updater: () => Promise<string>): void {\n useAuthStatePrivateStore().jwtTokenUpdater = updater;\n }\n\n /**\n * Устанавливает новый JWT токен и автоматически пересчитывает права доступа.\n *\n * @param token Новый JWT токен.\n */\n function setJwtToken(token: string): void {\n const privateStore = useAuthStatePrivateStore();\n\n privateStore.jwtToken = Promise.resolve(token);\n\n // Сохраняем токен в хранилище.\n PreferencesStorageProvider.saveActualDataToStorage(StorageParametersNames.JwtToken, token, getTokenExpirationDate(token));\n\n // Пересчитываем права доступа при установке нового токена.\n privateStore.recalculateUserPermissions();\n }\n\n /**\n * Выполняет очистку jwt-ключа доступа к системам.\n */\n // eslint-disable-next-line unicorn/consistent-function-scoping\n function invalidateJwtToken(): void {\n const privateStore = useAuthStatePrivateStore();\n privateStore.jwtToken = undefined;\n privateStore.userPermissions = undefined;\n\n // Удаляем токен из хранилища.\n // eslint-disable-next-line unicorn/no-useless-undefined\n PreferencesStorageProvider.saveActualDataToStorage(StorageParametersNames.JwtToken, undefined);\n\n // НЕ удаляем computed refs - они должны продолжать работать, но возвращать false.\n }\n\n /**\n * Возвращает вычисляемое поле для проверки наличия указанных прав доступа.\n *\n * @param name Проверяемое право доступа или их список. Должны быть представлены в виде значения: <РЕСУРС>.<РОЛЬ>.\n */\n function hasUserPermission(name: string | string[]): ComputedRef<boolean> {\n const privateStore = useAuthStatePrivateStore();\n\n // Если токен есть, но права доступа еще не вычислены, то вычисляем права доступа.\n if (!isNil(privateStore.jwtToken) && isNil(privateStore.userPermissions)) {\n privateStore.jwtToken\n .then((token) => {\n const jwtPayload = JwtPayload.getJwtPayload(token);\n\n privateStore.userPermissions = jwtPayload.exp * 1000 > Date.now() ? mapValues(jwtPayload.resourceAccess, (value) => value?.roles ?? []) : undefined;\n })\n .catch(noop);\n }\n\n const key = isArray(name) ? name.join(' && ') : name;\n\n // Если вычисляемое поле для проверки наличия указанных прав доступа уже существует, то возвращаем его.\n if (privateStore.userPermissionsComputedRefs.has(key)) {\n // eslint-disable-next-line @typescript-eslint/non-nullable-type-assertion-style\n return privateStore.userPermissionsComputedRefs.get(key) as ComputedRef<boolean>;\n }\n\n // Если вычисляемое поле для проверки наличия указанных прав доступа не существует, то создаем его, сохранив в кэше и возвращаем.\n // eslint-disable-next-line unicorn/prevent-abbreviations\n const hasUserPermissionComputedRef = computed(() => {\n const isUserPermissionExist = (checkedName: string): boolean => {\n const path = split(checkedName, '.');\n\n // Проверяем, что путь содержит достаточно элементов.\n if (path.length < 2) {\n return false;\n }\n\n const [groupName, permissionName] = path;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,security/detect-object-injection\n const group = useAuthStatePrivateStore().userPermissions?.[groupName];\n\n return isArray(group) && group.includes(permissionName);\n };\n\n if (isArray(name)) {\n return every(name, (item) => isUserPermissionExist(item));\n }\n\n return isUserPermissionExist(name);\n });\n\n privateStore.userPermissionsComputedRefs.set(key, hasUserPermissionComputedRef);\n\n return hasUserPermissionComputedRef;\n }\n\n return {\n /**\n * {@link Promise<string>} для получения jwt-ключа доступа к системам.\n */\n jwtToken,\n\n /**\n * Устанавливает механизм для обновления jwt-ключа доступа к системам.\n *\n * @param updater Механизм для обновления jwt-ключа доступа к системам.\n */\n setJwtTokenUpdater,\n\n /**\n * Устанавливает новый JWT токен и автоматически пересчитывает права доступа.\n *\n * @param token Новый JWT токен.\n */\n setJwtToken,\n\n /**\n * Выполняет очистку jwt-ключа доступа к системам.\n */\n invalidateJwtToken,\n\n /**\n * Возвращает вычисляемое поле для проверки наличия указанных прав доступа.\n *\n * @param name Проверяемое право доступа или их список. Должны быть представлены в виде значения: <РЕСУРС>.<РОЛЬ>.\n */\n hasUserPermission,\n };\n});\n","import { IIdentity } from '@sc/system/interfaces/i-identity';\nimport { isNil } from 'lodash-es';\n\n/**\n * Базовая идентифицируемая сущность.\n */\nexport abstract class Identity<T = number> implements IIdentity<T> {\n /**\n * @inheritDoc\n */\n public id: T;\n\n /**\n * @inheritDoc\n */\n public guid: string;\n\n /**\n * Инициализирует экземпляр класса {@link Identity}.\n *\n * @param data Данные для первоначальной инициализации.\n * @param defaultIdValue Значение поля {@link id} по-умолчанию если оно не определено в {@link data}.\n */\n protected constructor(data?: Partial<IIdentity<T>>, defaultIdValue?: T) {\n this.id = data?.id as T;\n\n if (isNil(this.id)) {\n if (!isNil(defaultIdValue)) {\n this.id = defaultIdValue;\n }\n // eslint-disable-next-line lodash/prefer-lodash-typecheck\n else if (typeof data?.id === 'number') {\n this.id = -1 as T;\n // eslint-disable-next-line lodash/prefer-lodash-typecheck\n } else if (typeof data?.id === 'string') {\n this.id = '' as T;\n }\n }\n\n this.guid = data?.guid ?? '';\n }\n\n /**\n * Возвращает признак, что это новая запись.\n */\n public isNewRec(): boolean {\n // eslint-disable-next-line lodash/prefer-lodash-typecheck\n if (typeof this.id === 'number') {\n return this.id === -1;\n }\n\n // eslint-disable-next-line lodash/prefer-lodash-typecheck\n if (typeof this.id === 'string') {\n return this.id === '';\n }\n\n return isNil(this.id);\n }\n}\n","/* eslint-disable @typescript-eslint/no-unnecessary-condition */\n\nimport { Identity } from '@sc/system/classes/identity';\nimport { INamedIdentity } from '@sc/system/interfaces/i-named-identity';\n\n/**\n * Базовая идентифицируемая сущность содержащая название.\n */\nexport class NamedIdentity<T = number> extends Identity<T> implements INamedIdentity<T> {\n /**\n * Название.\n */\n public name: string = '';\n\n /**\n * Инициализирует экземпляр класса {@link NamedIdentity}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<INamedIdentity<T>>) {\n super(data);\n\n this.name = data?.name ?? '';\n }\n}\n","/* eslint-disable @typescript-eslint/no-unnecessary-condition */\n\nimport { NamedIdentity } from '@sc/system/classes/named-identity';\nimport { ICodedIdentity } from '@sc/system/interfaces/i-coded-identity';\n\n/**\n * Базовая идентифицируемая сущность содержащая название и артикул.\n */\nexport class CodedIdentity<T = number> extends NamedIdentity<T> implements ICodedIdentity<T> {\n /**\n * @inheritDoc\n */\n public code: string = '';\n\n /**\n * Инициализирует экземпляр класса {@link NamedIdentity}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<ICodedIdentity<T>>) {\n super(data);\n\n this.code = data?.code ?? '';\n }\n}\n","import { CodedIdentity } from '@sc/system/classes/coded-identity';\nimport { ICatalogableItem } from '@sc/system/interfaces/i-catalogable-item';\nimport { CatalogableItemType } from '@sc/system/types/catalogable-item-type';\n\n/**\n * Данные об элементе каталога.\n */\nexport class CatalogableItem extends CodedIdentity implements ICatalogableItem {\n /**\n * Символьное обозначение.\n */\n public slug: string;\n\n /**\n * Тип элемента.\n */\n public type!: CatalogableItemType;\n\n /**\n * Инициализирует экземпляр класса {@link CatalogableItem}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n protected constructor(data?: ICatalogableItem) {\n super(data);\n\n this.slug = data?.slug ?? '';\n }\n}\n","import { CatalogableItem } from '@sc/system/classes/catalogable-item';\nimport { IPrimaryCatalogableItem } from '@sc/system/interfaces/i-primary-catalogable-item';\n\n/**\n * Данные о каталогизируемом элементе, который может быть помечен как основной.\n */\nexport class PrimaryCatalogableItem extends CatalogableItem implements IPrimaryCatalogableItem {\n /**\n * Признак того, что категория является основной для продукта.\n */\n public isPrimary?: boolean;\n\n /**\n * Инициализирует экземпляр класса {@link PrimaryCatalogableItem}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IPrimaryCatalogableItem) {\n super(data);\n\n this.isPrimary = data?.isPrimary ?? false;\n }\n}\n","import { IBaseCategory } from '@sc/catalog/interfaces/internal/base/i-base-category';\nimport { PropertiesList } from '@sc/catalog/types/properties-list';\nimport { PrimaryCatalogableItem } from '@sc/system/classes/primary-catalogable-item';\nimport { toUpper } from 'lodash-es';\n\n/**\n * Данные о категории.\n */\nexport class BaseCategory extends PrimaryCatalogableItem implements IBaseCategory {\n /**\n * Признак того, что категория скрыта.\n */\n public isHidden: boolean;\n\n /**\n * Целочисленный идентификатор родителя (родительской записи).\n */\n public parentCategoryId?: number;\n\n /**\n * Список свойств. Число свойств в объекте не ограничено.\n */\n public properties?: PropertiesList;\n\n /**\n * Список коэффициентов пересчёта из валют в рубли в формате ключ значение.\n */\n public currencyRates?: Record<string, number>;\n\n /**\n * Инициализирует экземпляр класса {@link BaseCategory}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IBaseCategory) {\n super(data);\n\n this.isHidden = data?.isHidden ?? false;\n this.parentCategoryId = data?.parentCategoryId;\n this.properties = data?.properties;\n this.type = 'category';\n // Исправляем ключи после автоматического преобразования в camelCase в HttpBaseRequester.\n this.currencyRates = data?.currencyRates ? Object.fromEntries(Object.entries(data.currencyRates).map(([key, value]) => [toUpper(key), value])) : undefined;\n }\n}\n","/**\n * Перечисление коэффициентов цены.\n */\nexport enum PriceCoefficientEnum {\n /**\n * Стоп-цена\n */\n K0 = 'k0',\n\n /**\n * Минимальная цена\n */\n K1 = 'k1',\n\n /**\n * Коэффициент K2\n */\n K2 = 'k2',\n\n /**\n * Коэффициент K3\n */\n K3 = 'k3',\n\n /**\n * Коэффициент K4\n */\n K4 = 'k4',\n\n /**\n * Розничная цена.\n */\n Retail = 'retail',\n}\n","import { NamedIdentity } from '@sc/system/classes/named-identity';\nimport { INamedIdentity } from '@sc/system/interfaces/i-named-identity';\nimport { IReference } from '@sc/system/interfaces/i-reference';\n\n/**\n * DTO-объект записи данных из справочника.\n */\nexport class Reference<S = string, I = number> extends NamedIdentity<I> implements IReference<S, I> {\n /**\n * Краткое название.\n */\n public slug?: S;\n\n /**\n * Описание.\n */\n public description?: string;\n\n /**\n * Инициализирует экземпляр класса {@link Reference}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IReference<S, I>>) {\n super(data as INamedIdentity<I>);\n\n this.description = data?.description;\n this.slug = data?.slug as S;\n }\n}\n","import { PriceCoefficientEnum } from '@sc/catalog/enums/price-coefficient-enum';\nimport { IPriceCoefficient } from '@sc/references/interfaces/i-price-coefficient';\nimport { Reference } from '@sc/system/classes/reference';\nimport { constant } from 'lodash-es';\n\n/**\n * Данные о коэффициенте цены.\n */\nexport class PriceCoefficient extends Reference<PriceCoefficientEnum> implements IPriceCoefficient {\n /**\n * Возвращает значение справочника коэффициента розничной цены.\n */\n public static getRetailPriceCoefficient(): IPriceCoefficient {\n return { id: -2, slug: PriceCoefficientEnum.Retail, name: 'Розн. цена', guid: '', isNewRec: constant(true) };\n }\n}\n","import { IProductPriceCoefficient } from '@sc/catalog/interfaces/i-product-price-coefficient';\nimport { PriceCoefficient } from '@sc/references/classes/price-coefficient';\nimport { IPriceCoefficient } from '@sc/references/interfaces/i-price-coefficient';\n\n/**\n * Данные о коэффициенте цены на продукт.\n */\nexport class ProductPriceCoefficient {\n /**\n * Коэффициент цены на продукт.\n */\n public coefficient: IPriceCoefficient;\n\n /**\n * Значение коэффициента.\n */\n public value: number;\n\n /**\n * Цена на продукт по коэффициенту в валюте продукта.\n */\n public cost: number;\n\n /**\n * Процент скидки от розничной цены по текущему коэффициенту.\n */\n public percent: number;\n\n /**\n * Признак того, что указанный коэффициент доступен текущему пользователю только для просмотра.\n */\n public readOnly: boolean;\n\n /**\n * Инициализирует экземпляр класса {@link ProductPriceCoefficient}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IProductPriceCoefficient) {\n this.coefficient = new PriceCoefficient(data?.coefficient);\n this.value = data?.value ?? 0;\n this.cost = data?.cost ?? 0;\n this.percent = data?.percent ?? 0;\n this.readOnly = data?.readOnly ?? true;\n }\n}\n","import { IGeoCoordinates } from '@sc/geo/interfaces/i-geo-coordinates';\n\n/**\n * Данные о географических координатах.\n */\nexport class GeoCoordinates implements IGeoCoordinates {\n /**\n * Широта.\n */\n public lat: number;\n\n /**\n * Долгота.\n */\n public long: number;\n\n /**\n * Инициализирует экземпляр класса {@link GeoCoordinates}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IGeoCoordinates) {\n this.lat = data?.lat ?? 0;\n this.long = data?.long ?? 0;\n }\n}\n","import { IDeliveryType } from '@sc/references/interfaces/i-delivery-type';\nimport { Reference } from '@sc/system/classes/reference';\n\n/**\n * Тип доставки.\n */\nexport class DeliveryType extends Reference implements IDeliveryType {}\n","import { GeoCoordinates } from '@sc/geo/classes/geo-coordinates';\nimport { IGeoCoordinates } from '@sc/geo/interfaces/i-geo-coordinates';\nimport { DeliveryType } from '@sc/references/classes/delivery-type';\nimport { IDeliveryType } from '@sc/references/interfaces/i-delivery-type';\nimport { IWarehouse } from '@sc/references/interfaces/i-warehouse';\nimport { Reference } from '@sc/system/classes/reference';\n\n/**\n * Данные о складе.\n */\nexport class Warehouse extends Reference implements IWarehouse {\n /**\n * Адрес склада.\n */\n public address: string;\n\n /**\n * Признак того, что склад является основным.\n */\n public isMain: boolean;\n\n /**\n * Список типов доставки.\n */\n public deliveryTypes: IDeliveryType[];\n\n /**\n * Список идентификаторов регионов, в которые осуществляется доставка со склада.\n */\n public regions?: number[];\n\n /**\n * Координаты склада.\n */\n public coordinates?: IGeoCoordinates;\n\n /**\n * Инициализирует экземпляр класса {@link Warehouse}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IWarehouse>) {\n super(data);\n\n this.address = data?.address ?? '';\n this.isMain = data?.isMain ?? false;\n this.deliveryTypes = data?.deliveryTypes?.map((dt) => new DeliveryType(dt)) ?? [];\n this.regions = data?.regions ?? [];\n this.coordinates = new GeoCoordinates(data?.coordinates);\n }\n}\n","import { IStockCount } from '@sc/catalog/interfaces/i-stock-count';\nimport { Warehouse } from '@sc/references/classes/warehouse';\nimport { IWarehouse } from '@sc/references/interfaces/i-warehouse';\n\n/**\n * Данные о количестве товара, доступном на складе.\n */\nexport class StockCount implements IStockCount {\n /**\n * Данные склада.\n */\n public warehouse: IWarehouse;\n\n /**\n * Количество остатков товара на складе.\n */\n public count: number;\n\n /**\n * Инициализирует экземпляр класса {@link StockCount}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IStockCount) {\n this.warehouse = new Warehouse(data?.warehouse);\n this.count = data?.count ?? 0;\n }\n}\n","import { CatalogableItem } from '@sc/system/classes/catalogable-item';\nimport { IHiddenCatalogableItem } from '@sc/system/interfaces/i-hidden-catalogable-item';\n\n/**\n * Данные о каталогизируемом элементе, который может быть скрыт.\n */\nexport class HiddenCatalogableItem extends CatalogableItem implements IHiddenCatalogableItem {\n /**\n * Признак того, что категория скрыта.\n */\n public isHidden: boolean;\n\n /**\n * Инициализирует экземпляр класса {@link HiddenCatalogableItem}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IHiddenCatalogableItem) {\n super(data);\n\n this.isHidden = data?.isHidden ?? false;\n }\n}\n","import { IImage } from '@sc/system/interfaces/i-image';\n\n/**\n * Данные об изображении.\n */\nexport class Image implements IImage {\n /**\n * Путь к основному изображению.\n */\n public image: string;\n\n /**\n * Путь к предпросмотру изображения.\n */\n public preview?: string;\n\n /**\n * Признак того, что изображение является основным.\n */\n public isDefault: boolean;\n\n /**\n * Инициализирует экземпляр класса {@link Image}.\n *\n * @param data Данные для первоначальной инициализации.\n * @param mediaServer URL адрес медиа сервера.\n */\n public constructor(data: IImage, mediaServer?: string) {\n this.image = `${mediaServer ?? ''}${data.image}`;\n this.preview = `${mediaServer ?? ''}${data.preview}`;\n this.isDefault = data.isDefault;\n }\n}\n","import { ProductPriceCoefficient } from '@sc/catalog/classes/product-price-coefficient';\nimport { StockCount } from '@sc/catalog/classes/stock-count';\nimport { IProduct } from '@sc/catalog/interfaces/i-product';\nimport { IProductPriceCoefficient } from '@sc/catalog/interfaces/i-product-price-coefficient';\nimport { IStockCount } from '@sc/catalog/interfaces/i-stock-count';\nimport { PropertiesList } from '@sc/catalog/types/properties-list';\nimport { ICatalogConfig } from '@sc/config/interfaces/i-catalog-config';\nimport { AppConfigProvider } from '@sc/config/providers/app-config-provider';\nimport { HiddenCatalogableItem } from '@sc/system/classes/hidden-catalogable-item';\nimport { Image } from '@sc/system/classes/image';\nimport { PrimaryCatalogableItem } from '@sc/system/classes/primary-catalogable-item';\nimport { IImage } from '@sc/system/interfaces/i-image';\nimport { IPrimaryCatalogableItem } from '@sc/system/interfaces/i-primary-catalogable-item';\nimport { parseISO } from 'date-fns';\nimport { isString } from 'lodash-es';\n\n/**\n * Данные о продукте.\n */\nexport class Product extends HiddenCatalogableItem implements IProduct {\n /**\n * Артикул производителя/поставщика.\n */\n public supplierSku?: string;\n\n /**\n * Единица измерения.\n */\n public unit: string;\n\n /**\n * Норма упаковки.\n */\n public pack?: string;\n\n /**\n * Минимальное количество товара для заказа.\n */\n public minCount?: number;\n\n /**\n * Единица измерения количества товара.\n */\n public quantityUnit?: string;\n\n /**\n * Валюта товара или услуги.\n */\n public currency: string;\n\n /**\n * Сигнатура валюты.\n */\n public currencySignature: string;\n\n /**\n * Стоимость товара или услуги.\n */\n public cost: number;\n\n /**\n * Стоимость продукта в рублях.\n */\n public costRub: number;\n\n /**\n * Дата установки цены.\n */\n public costDate?: Date;\n\n /**\n * Признак товара \"Под заказ\".\n */\n public onOrder?: boolean;\n\n /**\n * Данные о количестве товара, доступном на складах.\n */\n public stockCount?: IStockCount[];\n\n /**\n * Основная категория продукта.\n */\n public category?: IPrimaryCatalogableItem;\n\n /**\n * Список категорий продукта.\n */\n public categories?: IPrimaryCatalogableItem[];\n\n /**\n * Список изображений.\n */\n public images?: IImage[];\n\n /**\n * Список свойств продукта.\n */\n public properties?: PropertiesList;\n\n /**\n * Розничная цена.\n */\n public retailCost?: number;\n\n /**\n * Розничная стоимость продукта в рублях.\n */\n public retailCostRub?: number;\n\n /**\n * Список коэффициентов цен на продукт.\n */\n public priceCoefficients?: IProductPriceCoefficient[];\n\n /**\n * Инициализирует экземпляр класса {@link Product}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IProduct) {\n super(data);\n\n this.supplierSku = data?.supplierSku;\n this.unit = data?.unit ?? '';\n this.pack = data?.pack;\n this.minCount = data?.minCount;\n this.quantityUnit = data?.quantityUnit;\n this.currency = data?.currency ?? '';\n this.cost = data?.cost ?? 0;\n this.costRub = data?.costRub ?? 0;\n this.costDate = isString(data?.costDate) ? parseISO(data.costDate) : data?.costDate;\n this.onOrder = data?.onOrder ?? false;\n this.stockCount = data?.stockCount?.map((sc: IStockCount) => new StockCount(sc)) ?? [];\n this.currencySignature = data?.currencySignature ?? '';\n this.type = 'product';\n const primaryCategory = data?.category ?? data?.categories?.find((category) => category.isPrimary);\n\n if (primaryCategory) {\n this.category = new PrimaryCatalogableItem({ ...primaryCategory, isPrimary: true });\n this.categories = [this.category];\n }\n\n if (data?.categories) {\n this.categories = data.categories.map((category) => new PrimaryCatalogableItem(category));\n }\n\n this.images = data?.images?.map((im: IImage) => new Image(im, AppConfigProvider.getConfig().http.mediaUrl as string)) ?? [];\n this.properties = data?.properties ?? {};\n this.retailCost = data?.retailCost;\n this.retailCostRub = data?.retailCostRub;\n this.priceCoefficients = data?.priceCoefficients?.map((pc: IProductPriceCoefficient) => new ProductPriceCoefficient(pc)) ?? [];\n\n // TODO: Объявление полей, обеспечивающих обратную совместимость со старым представлением данных.\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (data && 'codeNumber' in data && !data.code) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any,@typescript-eslint/no-unsafe-member-access\n this.code = (data as any)?.codeNumber as string;\n }\n }\n\n /**\n * Возвращает признак, что это измеряемый товар.\n */\n public getIsMeasurable(): boolean {\n const unitsConfig = AppConfigProvider.getConfig<ICatalogConfig>().catalog?.products.units;\n\n return [...(unitsConfig?.linear ?? ['пог.м.', 'м.']), ...(unitsConfig?.square ?? ['м2'])].includes(this.unit);\n }\n\n /**\n * Возвращает розничную цену.\n */\n public getRetailCost(): number {\n return this.retailCost ?? this.cost;\n }\n\n /**\n * Возвращает розничную стоимость в рублях.\n */\n public getRetailCostRub(): number {\n return this.retailCostRub ?? this.costRub;\n }\n}\n","import { ICartItemBase } from '@sc/cart/interfaces/i-cart-item-base';\nimport { ICartItemConfiguratorParamsBase } from '@sc/cart/interfaces/i-cart-item-configurator-params-base';\nimport { BaseCategory } from '@sc/catalog/classes/internal/base/base-category';\nimport { Product } from '@sc/catalog/classes/product';\nimport { IProduct } from '@sc/catalog/interfaces/i-product';\nimport { Identity } from '@sc/system/classes/identity';\nimport { cloneDeep } from 'lodash-es';\n\n/**\n * Данные о единичной позиции товара/услуги в корзине.\n */\nexport class CartItemBase<T extends ICartItemConfiguratorParamsBase | undefined = undefined> extends Identity implements ICartItemBase<T> {\n /**\n * Данные о категории.\n */\n public category: BaseCategory;\n\n /**\n * Данные о товаре/услуге.\n */\n public product: IProduct;\n\n /**\n * Количество товара/услуги.\n */\n public quantity: number;\n\n /**\n * Высота товара.\n */\n public height?: number;\n\n /**\n * Длина товара.\n */\n public length?: number;\n\n /**\n * Ширина товара.\n */\n public width?: number;\n\n /**\n * Штрих-код продукта.\n */\n public barcode?: string;\n\n /**\n * Пользовательское описание позиции.\n */\n public marker?: string;\n\n /**\n * Название конфигуратора.\n */\n public configurator: T extends ICartItemConfiguratorParamsBase ? string : undefined;\n\n /**\n * Параметры конфигуратора.\n */\n public configuratorParams: T;\n\n /**\n * Признак того, что позиция является дополнительной продажей.\n */\n public isAdditionalSale?: boolean;\n\n /**\n * Инициализирует экземпляр класса {@link CartItemBase}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data: Partial<ICartItemBase<T>>) {\n super(data);\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n this.product = new Product(data?.product);\n this.quantity = data.quantity ?? 0;\n this.marker = data.marker;\n this.category = data.category ?? new BaseCategory();\n this.height = data.height;\n this.length = data.length;\n this.width = data.width;\n this.configurator = data.configurator as T extends ICartItemConfiguratorParamsBase ? string : undefined;\n this.configuratorParams = (data.configuratorParams as T) && cloneDeep<T>(data.configuratorParams as T);\n this.isAdditionalSale = data.isAdditionalSale;\n }\n}\n","import { CartItemBase } from '@sc/cart/classes/cart-item-base';\nimport { ICartItem } from '@sc/cart/interfaces/i-cart-item';\n\n/**\n * Данные о единичной позиции товара/услуги в корзине.\n */\nexport class CartItem extends CartItemBase implements ICartItem {\n /**\n * Валюта товара или услуги.\n */\n public currency: string;\n\n /**\n * Итоговая стоимость товара или услуги в валюте.\n */\n public cost: number;\n\n /**\n * Стоимость единицы товара или услуги в валюте.\n */\n public costOne: number;\n\n /**\n * Стоимость единицы товара или услуги в рублях.\n */\n public costOneRub: number;\n\n /**\n * Итоговая стоимость позиции корзины.\n */\n public costRub: number;\n\n /**\n * Идентификатор логической группы товаров/услуг.\n */\n public logicGroupId?: string;\n\n /**\n * Направление продаж.\n */\n public salesDirection?: number;\n\n /**\n * URL изображения со спецификацией.\n */\n public specificationImgUrl?: string;\n\n /**\n * Список допустимых вариантов продольного распила.\n *\n * В качестве значения указывается ширина продукта, а в качестве ключа указывается код продукта,\n * который соответствует указанной ширине. Количество не ограничено.\n */\n public sawing?: Array<Record<string, number>>;\n\n /**\n * Инициализирует экземпляр класса {@link CartItem}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data: ICartItem) {\n super(data);\n\n this.currency = data.currency;\n this.cost = data.cost;\n this.costOne = data.costOne;\n this.costOneRub = data.costOneRub;\n this.costRub = data.costRub;\n this.logicGroupId = data.logicGroupId;\n this.salesDirection = data.salesDirection;\n this.specificationImgUrl = data.specificationImgUrl;\n this.sawing = data.sawing;\n }\n}\n","import { CartItem } from '@sc/cart/classes/cart-item';\nimport { ICart } from '@sc/cart/interfaces/i-cart';\nimport { ICartItem } from '@sc/cart/interfaces/i-cart-item';\nimport { ICartSum } from '@sc/cart/interfaces/i-cart-sum';\n\n/**\n * Данные о содержимом корзины.\n */\nexport class Cart implements ICart {\n /**\n * Список позиций товаров/услуг в корзине.\n */\n public items: ICartItem[];\n\n /**\n * Итоговая стоимость корзины в рублях.\n */\n public resultSum: ICartSum;\n\n /**\n * Список итоговых сумм по направлениям продаж.\n */\n public directionsSum: Record<number, ICartSum>;\n\n /**\n * Инициализирует экземпляр класса {@link Cart}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data: ICart) {\n this.items = data.items.map((item) => new CartItem(item));\n this.resultSum = data.resultSum;\n this.directionsSum = data.directionsSum;\n }\n}\n","/**\n * Содержит механизмы инициализации экземпляров классов на основе их типов.\n */\nexport class TypedInstanceFactory {\n /**\n * Инициализирует экземпляр указанного класса.\n *\n * @param type Тип класса, на основе которого необходимо создать экземпляр (тип возвращаемых данных).\n */\n public static simpleInstanceInitializer<OutDataInterface>(\n // eslint-disable-next-line no-unused-vars\n type: new () => OutDataInterface\n ): OutDataInterface {\n // eslint-disable-next-line new-cap\n return new type();\n }\n\n /**\n * Инициализирует экземпляр указанного класса.\n *\n * @param type Тип класса, на основе которого необходимо создать экземпляр (тип возвращаемых данных).\n * @param data Начальные данные для инициализации (параметры конструктора).\n */\n public static instanceInitializer<OutDataInterface, SourceDataInterface>(\n // eslint-disable-next-line no-unused-vars\n type: new (data: SourceDataInterface) => OutDataInterface,\n data: SourceDataInterface\n ): OutDataInterface {\n // eslint-disable-next-line new-cap\n return new type(data);\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unnecessary-condition,@typescript-eslint/no-unsafe-assignment,@typescript-eslint/prefer-function-type,@typescript-eslint/no-unsafe-argument,@typescript-eslint/prefer-promise-reject-errors,@typescript-eslint/use-unknown-in-catch-callback-variable */\n\nimport { useAuthStateStore } from '@sc/auth';\nimport { AppConfigProvider } from '@sc/config/providers/app-config-provider';\nimport { IHttpResponseError } from '@sc/http/interfaces/i-http-response-error';\nimport { ErrorResponseNotificationHandler } from '@sc/http/types/error-response-notification-handler';\nimport { TypedInstanceFactory } from '@sc/system/providers/typed-instance-factory';\nimport { IFieldValidationResultData } from '@sc/validation/interfaces/i-field-validation-result-data';\nimport axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse, InternalAxiosRequestConfig } from 'axios';\nimport { format } from 'date-fns';\nimport { isNil, noop, toLower } from 'lodash-es';\nimport { objectToCamel, objectToSnake } from 'ts-case-convert';\n\n/**\n * Предоставляет базовые механизмы для выполнения запросов.\n */\nexport abstract class HttpRequester {\n /**\n * Экземпляр объекта текущего класса.\n */\n // eslint-disable-next-line no-use-before-define\n protected static instances: Record<string, HttpRequester> = {};\n\n /**\n * Базовый обработчик ошибок выполнения запросов.\n *\n * @param error Данные об ошибке.\n * @param validationFieldResultData Список полей, для которых необходимо установить данные об ошибках валидации в случае ошибок в запросах.\n * @param disableNotifications Признак необходимости отключить уведомления об ошибках.\n */\n protected static defaultErrorsResponseHandler: ErrorResponseNotificationHandler = noop;\n\n /**\n * Устанавливает базовый обработчик ошибок выполнения запросов.\n *\n * @param handler Ссылка на функцию-обработчик ошибок.\n */\n public static setDefaultErrorsResponseHandler(handler: ErrorResponseNotificationHandler): void {\n HttpRequester.defaultErrorsResponseHandler = handler;\n }\n\n /**\n * Возвращает экземпляр объекта текущего класса.\n *\n * @param type Тип данных, которыми оперирует метод.\n */\n public static getInstance<OutDataInterface extends HttpRequester>(type: new () => OutDataInterface): OutDataInterface {\n if (!Object.prototype.hasOwnProperty.call(HttpRequester.instances, type.name)) {\n HttpRequester.instances[type.name] = TypedInstanceFactory.simpleInstanceInitializer(type);\n }\n\n return HttpRequester.instances[type.name] as OutDataInterface;\n }\n\n /**\n * Конвертирует данные ошибки HTTP запроса в более упрощённую и часто используемую форму.\n *\n * @param error Данные об ошибке.\n */\n protected static convertHttpErrorResponse(error: any): Promise<IHttpResponseError> {\n if (!isNil(error.request) || !isNil(error.response)) {\n const rawResponse = error?.response;\n\n // eslint-disable-next-line prefer-promise-reject-errors\n return Promise.reject({\n status: rawResponse?.status ?? 0,\n statusText: rawResponse?.statusText ?? 'Unknown',\n message: rawResponse?.data?.message ?? 'Unknown Error. Probably network error.',\n errors: rawResponse?.data?.errors,\n headers: rawResponse?.headers ?? {},\n data: rawResponse?.data,\n rawError: error,\n } as IHttpResponseError);\n }\n\n return Promise.reject(error);\n }\n\n /**\n * Клиент для выполнения запросов данных.\n */\n protected readonly httpClient: AxiosInstance;\n\n /**\n * Базовый URL путь для выполнения запросов.\n */\n protected baseUrl: string = `${AppConfigProvider.getConfig().http.portalApiUrl as string}/api`;\n\n /**\n * Обработчик ошибок выполнения запросов текущего экземпляра класса.\n *\n * @param error Данные об ошибке.\n * @param validationFieldResultData Список полей, для которых необходимо установить данные об ошибках валидации в случае ошибок в запросах.\n * @param disableNotifications Признак необходимости отключить уведомления об ошибках.\n */\n protected errorResponseHandler: ErrorResponseNotificationHandler = noop;\n\n /**\n * Список идентификаторов обработчиков запросов для возможности отключить те или иные обработчики.\n */\n protected readonly interceptorIds: Record<'request' | 'response', Record<string, number>> = { request: {}, response: {} };\n\n /**\n * Перехватчик запроса для установки URL для выполнения запросов.\n *\n * @param request Данные запроса.\n */\n private setBaseUrlRequestInterceptor = (request: InternalAxiosRequestConfig): InternalAxiosRequestConfig => {\n request.baseURL = this.baseUrl;\n\n return request;\n };\n\n /**\n * Перехватчик запроса для установки заголовков аутентификации.\n *\n * @param request Данные запроса.\n */\n // eslint-disable-next-line class-methods-use-this\n private authRequestInterceptor = async (request: InternalAxiosRequestConfig): Promise<InternalAxiosRequestConfig> => {\n let authToken;\n\n if (!isNil(useAuthStateStore().jwtToken)) {\n authToken = await useAuthStateStore().jwtToken;\n }\n\n if (authToken) {\n request.headers.set('Authorization', `Bearer ${authToken}`);\n }\n\n return request;\n };\n\n /**\n * Перехватчик запроса для преобразования данных запроса.\n *\n * @param request Данные запроса.\n */\n // eslint-disable-next-line class-methods-use-this\n private dataConverterRequestInterceptor = (request: InternalAxiosRequestConfig): InternalAxiosRequestConfig => {\n // Для удобства и соглашения именования имён в TS используется camelCase.\n // Однако в соответствии с соглашением API все именования имён должны\n // соответствовать snake_case.\n if (request.method) {\n // Конвертируем названия полей параметров в snake_case 'get' запросов.\n if (request.method === 'get' && request.params) {\n request.params = objectToSnake(request.params);\n }\n\n // Конвертируем названия полей данных в snake_case 'put', 'patch', 'post' запросов.\n if (['put', 'patch', 'post'].includes(toLower(request.method)) && request.data) {\n request.data = objectToSnake(request.data);\n }\n }\n\n return request;\n };\n\n /**\n * Перехватчик ошибок ответов на запрос.\n *\n * @param error Данные ошибки ответа на запрос.\n */\n private authErrorsResponseInterceptors = (error: IHttpResponseError): Promise<never> => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const originalRequest = error.rawError ? (error.rawError as any)?.config : undefined;\n\n // Если получен 401 ответ, то обновляем токен и повторяем запрос.\n // eslint-disable-next-line sonarjs/different-types-comparison\n if (error.status === 401) {\n // Если отсутствует исходный запрос или это уже повторный запрос, то ничего не делаем.\n // eslint-disable-next-line no-underscore-dangle\n if (!originalRequest || originalRequest.__isRetryRequest) {\n // eslint-disable-next-line unicorn/no-useless-promise-resolve-reject\n return Promise.reject(error);\n }\n\n useAuthStateStore().invalidateJwtToken();\n\n // eslint-disable-next-line no-underscore-dangle\n originalRequest.__isRetryRequest = true;\n\n // Повторяем запрос с обновленным ключом.\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n return this.httpClient(originalRequest);\n }\n\n // Возвращаем Promise с ошибкой, если запрос не прошел\n // eslint-disable-next-line unicorn/no-useless-promise-resolve-reject\n return Promise.reject(error);\n };\n\n /**\n * Перехватчик ответа для преобразования данных ответа на запрос.\n *\n * @param response Данные ответа на запрос.\n */\n // eslint-disable-next-line class-methods-use-this\n private dataConverterResponseInterceptor = (response: AxiosResponse): AxiosResponse => {\n // Для удобства и соглашения именования имён в TS используем camelCase.\n // Конвертируем названия полей данных в camelCase.\n if (response.data) {\n response.data = objectToCamel(response.data);\n }\n\n return response;\n };\n\n /**\n * Инициализирует экземпляр класса {@link HttpRequester}.\n */\n public constructor() {\n const appVersion = AppConfigProvider.getConfig().version;\n\n // Устанавливаем обработчик ошибок по умолчанию для уведомления пользователей.\n this.errorResponseHandler = HttpRequester.defaultErrorsResponseHandler;\n\n // Инициализация клиента для выполнения HTTP запросов.\n this.httpClient = axios.create({\n headers: {\n 'APP-VERSION': `${appVersion.name} (${appVersion.version}, ${format(appVersion.date, AppConfigProvider.getConfig().dateFormats.uiDate)})`,\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n },\n });\n\n // Перехватчик запросов для установки базового URL.\n this.interceptorIds.request.setBaseUrlRequestInterceptor = this.httpClient.interceptors.request.use(this.setBaseUrlRequestInterceptor, (error) => Promise.reject(error));\n\n // Перехватчик запросов для добавления токена аутентификации/авторизации.\n this.interceptorIds.request.authRequestInterceptor = this.httpClient.interceptors.request.use(this.authRequestInterceptor, (error) => Promise.reject(error));\n\n // Перехватчик запросов для приведения названий всех ключей в теле запроса в snake_case.\n this.interceptorIds.request.dataConverterRequestInterceptor = this.httpClient.interceptors.request.use(this.dataConverterRequestInterceptor, (error) =>\n Promise.reject(error)\n );\n\n // Перехватчик ответов для конвертации данных ошибок.\n this.interceptorIds.response.convertHttpErrorResponseInterceptor = this.httpClient.interceptors.response.use(\n (response) => response,\n (error) => HttpRequester.convertHttpErrorResponse(error)\n );\n\n // Перехватчик ответов для обработки ошибок аутентификации (401).\n this.interceptorIds.response.authErrorsResponseInterceptor = this.httpClient.interceptors.response.use((response) => response, this.authErrorsResponseInterceptors);\n\n // Перехватчик ответов для приведения названий всех ключей в теле ответа в camelCase.\n this.interceptorIds.response.dataConverterResponseInterceptor = this.httpClient.interceptors.response.use(this.dataConverterResponseInterceptor, (error) =>\n Promise.reject(error)\n );\n }\n\n /**\n * Выполняет запрос с указанными параметрами.\n *\n * @param config Параметры запроса.\n * @param successHandler Функция обратного вызова для обработки данных при успешном выполнении запроса.\n * @param validationFieldResultData Список полей, для которых необходимо установить данные об ошибках валидации в случае ошибок в запросах.\n * @param disableNotifications Признак необходимости отключить уведомления об ошибках.\n */\n protected request<T>(\n config: AxiosRequestConfig,\n successHandler: undefined | ((response: AxiosResponse<T>) => T) = undefined,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {},\n disableNotifications: boolean = false\n ): Promise<T> {\n const requestPromise = this.httpClient.request<T>(config).then((response) => (successHandler ? successHandler(response) : response.data));\n\n requestPromise.catch((error: IHttpResponseError) => {\n this.errorResponseHandler(error, validationFieldResultData, disableNotifications);\n });\n\n return requestPromise;\n }\n\n /**\n * Выполняет get-запрос с параметрами по умолчанию.\n *\n * @param url URL запроса.\n * @param params Параметры запроса.\n * @param successHandler Функция обратного вызова для обработки данных при успешном выполнении запроса.\n * @param disableNotifications Признак необходимости отключить уведомления об ошибках.\n */\n protected get<T>(\n url: string,\n params: Record<string, string | number | boolean | Array<string | number | boolean> | object> = {},\n successHandler: undefined | ((response: AxiosResponse<T>) => T) = undefined,\n disableNotifications: boolean = false\n ): Promise<T> {\n return this.request<T>({ method: 'GET', url: url, params: params }, successHandler, {}, disableNotifications);\n }\n\n /**\n * Выполняет get-запрос с параметрами по умолчанию и возвращает Blob.\n *\n * @param url URL запроса.\n * @param params Параметры запроса.\n * @param successHandler Функция обратного вызова для обработки данных при успешном выполнении запроса.\n * @param disableNotifications Признак необходимости отключить уведомления об ошибках.\n */\n protected getBlob<T>(\n url: string,\n params: Record<string, string | number | boolean | Array<string | number | boolean> | object> = {},\n successHandler: undefined | ((response: AxiosResponse<T>) => T) = undefined,\n disableNotifications: boolean = false\n ): Promise<T> {\n return this.request<T>({ method: 'GET', url: url, params: params, responseType: 'blob' }, successHandler, {}, disableNotifications);\n }\n\n /**\n * Выполняет patch-запрос с параметрами по умолчанию.\n *\n * @param url URL запроса.\n * @param data Данные запроса.\n * @param successHandler Функция обратного вызова для обработки данных при успешном выполнении запроса.\n * @param validationFieldResultData Список полей, для которых необходимо установить данные об ошибках валидации в случае ошибок в запросах.\n * @param disableNotifications Признак необходимости отключить уведомления об ошибках.\n */\n protected patch<T>(\n url: string,\n data: Record<string, any> = {},\n successHandler: undefined | ((response: AxiosResponse<T>) => T) = undefined,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {},\n disableNotifications: boolean = false\n ): Promise<T> {\n return this.request({ method: 'PATCH', url: url, data: data }, successHandler, validationFieldResultData, disableNotifications);\n }\n\n /**\n * Выполняет post-запрос с параметрами по умолчанию.\n *\n * @param url URL запроса.\n * @param data Данные запроса.\n * @param successHandler Функция обратного вызова для обработки данных при успешном выполнении запроса.\n * @param validationFieldResultData Список полей, для которых необходимо установить данные об ошибках валидации в случае ошибок в запросах.\n * @param disableNotifications Признак необходимости отключить уведомления об ошибках.\n */\n protected post<T>(\n url: string,\n data: Record<string, any> = {},\n successHandler: undefined | ((response: AxiosResponse<T>) => T) = undefined,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {},\n disableNotifications: boolean = false\n ): Promise<T> {\n return this.request({ method: 'POST', url: url, data: data }, successHandler, validationFieldResultData, disableNotifications);\n }\n\n /**\n * Выполняет delete-запрос с параметрами по умолчанию.\n *\n * @param url URL запроса.\n * @param successHandler Функция обратного вызова для обработки данных при успешном выполнении запроса.\n * @param disableNotifications Признак необходимости отключить уведомления об ошибках.\n */\n protected delete<T>(url: string, successHandler: undefined | ((response: AxiosResponse<T>) => T) = undefined, disableNotifications: boolean = false): Promise<T> {\n return this.request({ method: 'DELETE', url: url }, successHandler, {}, disableNotifications);\n }\n}\n","import { Cart } from '@sc/cart/classes/cart';\nimport { ICart } from '@sc/cart/interfaces/i-cart';\nimport { ICartItemBase } from '@sc/cart/interfaces/i-cart-item-base';\nimport { ICartItemConfiguratorParamsBase } from '@sc/cart/interfaces/i-cart-item-configurator-params-base';\nimport { IFileUploadData } from '@sc/catalog/interfaces';\nimport { IClient } from '@sc/clients/interfaces/i-client';\nimport { HttpRequester } from '@sc/http/classes/http-requester';\nimport { IFieldValidationResultData } from '@sc/validation/interfaces/i-field-validation-result-data';\n\n/**\n * Предоставляет механизмы получения/управления данными корзины.\n * TODO:TASK[10672]: Добавить кэширование.\n */\nexport class CartProvider extends HttpRequester {\n /**\n * Возвращает содержимое корзины указанного клиента.\n *\n * @param client Данные о клиенте, для которого необходимо вернуть содержимое корзины.\n *\n * @see /doc/api/internal#/Корзина/api_internal_client_cart_get\n */\n public getCart(client: IClient): Promise<ICart> {\n return this.get<ICart>(`internal/clients/${client.id}/cart`, {}, (response) => new Cart(response.data));\n }\n\n /**\n * Удаляет всё содержимое корзины.\n *\n * @param client Данные о клиенте, для которого необходимо удалить всё содержимое корзины.\n *\n * @see /doc/api/internal#/Корзина/api_internal_client_cart_delete_all\n */\n public deleteCart(client: IClient): Promise<void> {\n return this.delete(`internal/clients/${client.id}/cart`);\n }\n\n /**\n * Добавляет в корзину новую позицию заказываемого товара/услуги и возвращает обновлённое содержимое корзины.\n *\n * @param client Данные о клиенте, для которого необходимо добавить в корзину новую позицию заказываемого товара/услуги.\n * @param cartItem Данные о товаре, который необходимо добавить в корзину.\n * @param validationFieldResultData Список полей, для которых необходимо\n * установить данные об ошибках валидации\n * в случае ошибок в запросах.\n *\n * @see /doc/api/internal#/Корзина/api_internal_client_cart_add_item\n */\n public addCartItem<T extends ICartItemConfiguratorParamsBase | undefined = undefined>(\n client: IClient,\n cartItem: ICartItemBase<T>,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<ICart> {\n return this.patch<ICart>(\n `internal/clients/${client.id}/cart`,\n {\n id: cartItem.configurator && cartItem.category.id,\n productId: cartItem.product.id,\n quantity: cartItem.quantity,\n height: cartItem.height,\n length: cartItem.length,\n width: cartItem.width,\n configurator: cartItem.configurator,\n marker: cartItem.marker,\n isAdditionalSale: cartItem.isAdditionalSale,\n ...cartItem.configuratorParams,\n },\n (response) => new Cart(response.data),\n validationFieldResultData\n );\n }\n\n /**\n * Изменяет параметры указанной записи корзины и возвращает обновлённое содержимое корзины.\n *\n * @param client Данные о клиенте, для которого необходимо изменить параметры указанной записи корзины.\n * @param cartItem Данные о позиции корзины, параметры которой необходимо изменить.\n * @param validationFieldResultData Список полей, для которых необходимо\n * установить данные об ошибках валидации\n * в случае ошибок в запросах.\n *\n * @see /doc/api/internal#/Корзина/api_internal_client_cart_modify_item\n */\n public patchCartItem<T extends ICartItemConfiguratorParamsBase | undefined = undefined>(\n client: IClient,\n cartItem: ICartItemBase<T>,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<ICart> {\n return this.patch<ICart>(\n `internal/clients/${client.id}/cart/${cartItem.id}`,\n {\n id: cartItem.configurator && cartItem.category.id,\n productId: cartItem.product.id,\n quantity: cartItem.quantity,\n height: cartItem.height,\n length: cartItem.length,\n width: cartItem.width,\n configurator: cartItem.configurator,\n marker: cartItem.marker,\n isAdditionalSale: cartItem.isAdditionalSale,\n ...cartItem.configuratorParams,\n },\n (response) => new Cart(response.data),\n validationFieldResultData\n );\n }\n\n /**\n * Удаляет указанную запись корзины и возвращает обновлённое содержимое корзины.\n *\n * @param client Данные о клиенте, для которого необходимо удалить указанную запись корзины.\n * @param cartItem Данные о позиции корзины, которую необходимо удалить.\n *\n * @see /doc/api/internal#/Корзина/api_internal_client_cart_delete_item\n */\n public deleteCartItem(client: IClient, cartItem: ICartItemBase): Promise<void> {\n return this.get(`internal/clients/${client.id}/cart/${cartItem.id}`, {});\n }\n\n /**\n * Добавляет продукты в корзину из файла CSV.\n *\n * @param client Данные о клиенте, для которого необходимо добавить в корзину новые позиции заказываемого товара/услуги из файла CSV.\n * @param file Данные о файле CSV.\n *\n * @see /doc/api/internal#/Корзина/api_internal_client_cart_add_products_from_csv\n */\n public addCartItemFromCSV(client: IClient, file: IFileUploadData): Promise<ICart> {\n return this.post<ICart>(`internal/clients/${client.id}/cart/add-products-from-csv`, file, (response) => new Cart(response.data));\n }\n\n /**\n * Возвращает пример CSV файла для добавления продуктов в корзину.\n *\n * @param client Данные о клиенте, для которого необходимо получить пример CSV файла.\n *\n * @see /doc/api/internal#/Корзина/api_internal_client_cart_add_products_from_csv_example\n */\n public getCartItemFromCSVExample(client: IClient): Promise<Blob> {\n return this.get<Blob>(`internal/clients/${client.id}/cart/add-products-from-csv/example`, {}, (blob) => new Blob([blob.data], { type: 'text/csv' }));\n }\n}\n","/**\n * Перечисление возможных типов вычисления цены.\n */\nexport enum CalculationTypeEnum {\n /**\n * Вычисление исходя из стоимости М2.\n */\n m2Cost = 'm2Cost',\n\n /**\n * Вычисление на основе процента.\n */\n percent = 'percent',\n\n /**\n * Вычисление на основе значения.\n */\n value = 'value',\n}\n","/* eslint-disable no-shadow */\n\n/**\n * Перечисление источников клиентских цен.\n */\nexport enum CostSourceEnum {\n /**\n * Цена по скидке.\n */\n Discount = 'discount',\n\n /**\n * Цена из шаблона прайс-листа.\n */\n PriceTemplate = 'price_template',\n\n /**\n * Клиентская цена.\n */\n ClientPrice = 'client_price',\n\n /**\n * Розничная цена продукта.\n */\n Product = 'product',\n}\n","/* eslint-disable no-shadow */\n\n/**\n * Перечисление типов свойств.\n */\nexport enum PropertyTypeEnum {\n /**\n * Тип не задан.\n */\n Unknown = 'unknown',\n\n /**\n * Логическое значение (0 или 1).\n */\n Bool = 'bool',\n\n /**\n * Целочисленное значение.\n */\n Integer = 'integer',\n\n /**\n * Вещественное значение.\n */\n Float = 'float',\n\n /**\n * Строковое значение.\n */\n String = 'string',\n\n /**\n * Диапазон числовых значений (два числа, разделённые запятой).\n */\n Range = 'range',\n\n /**\n * Данные, представленные в формате JSON.\n */\n Json = 'json',\n\n /**\n * Данные представлены объектом.\n */\n Object = 'object',\n}\n","import { BaseCategory } from '@sc/catalog/classes/internal/base/base-category';\nimport { Product } from '@sc/catalog/classes/product';\nimport { ICategory } from '@sc/catalog/interfaces/i-category';\nimport { IProduct } from '@sc/catalog/interfaces/i-product';\n\n/**\n * Данные о категории.\n */\nexport class Category extends BaseCategory implements ICategory {\n /**\n * Данные о вложенных категориях.\n */\n public categories?: ICategory[];\n\n /**\n * Список продуктов категории.\n */\n public products?: IProduct[];\n\n /**\n * Инициализирует экземпляр класса {@link Category}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: ICategory) {\n super(data);\n\n this.categories = data?.categories?.map((c) => new Category(c));\n this.products = data?.products?.map((c) => new Product(c));\n }\n}\n","import { NamedIdentity } from '@sc/system/classes/named-identity';\nimport { IUpdatableNamedIdentity } from '@sc/system/interfaces/i-updatable-named-identity';\nimport { parseISO } from 'date-fns';\nimport { isString } from 'lodash-es';\n\n/**\n * Базовая идентифицируемая сущность содержащая название и дату изменения.\n */\nexport abstract class UpdatableNamedIdentity extends NamedIdentity implements IUpdatableNamedIdentity {\n /**\n * Дата и время последнего изменения.\n */\n public updatedAt?: Date;\n\n /**\n * Инициализирует экземпляр класса {@link UpdatableNamedIdentity}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n protected constructor(data?: IUpdatableNamedIdentity) {\n super(data);\n\n this.updatedAt = isString(data?.updatedAt) ? parseISO(data.updatedAt) : data?.updatedAt;\n }\n}\n","import { UpdatableNamedIdentity } from '@sc/system/classes/updatable-named-identity';\nimport { IDeletableNamedIdentity } from '@sc/system/interfaces/i-deletable-named-identity';\nimport { parseISO } from 'date-fns';\nimport { isString } from 'lodash-es';\n\n/**\n * Базовая идентифицируемая сущность содержащая название, дату изменения и удаления.\n */\nexport abstract class DeletableNamedIdentity extends UpdatableNamedIdentity implements IDeletableNamedIdentity {\n /**\n * Дата и время последнего удаления.\n */\n public deletedAt?: Date;\n\n /**\n * Инициализирует экземпляр класса {@link UpdatableNamedIdentity}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n protected constructor(data?: IDeletableNamedIdentity) {\n super(data);\n\n this.deletedAt = isString(data?.deletedAt) ? parseISO(data.deletedAt) : data?.deletedAt;\n }\n}\n","import { NamedIdentity } from '@sc/system';\nimport { IUserShortInfo } from '@sc/user/interfaces/i-user-short-info';\n\nimport { UserTypeEnum } from '../enums';\n\n/**\n * Краткие данные о пользователе.\n */\nexport class UserShortInfo extends NamedIdentity implements IUserShortInfo {\n /**\n * Тип пользователя.\n */\n public type?: UserTypeEnum;\n\n /**\n * Инициализирует экземпляр класса {@link UserShortInfo}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IUserShortInfo>) {\n super(data);\n\n this.type = data?.type;\n }\n}\n","import { IDiscountShortInfo } from '@sc/catalog/interfaces/i-discount-short-info';\nimport { NamedIdentity } from '@sc/system/classes/named-identity';\nimport { UserShortInfo } from '@sc/user/classes/user-short-info';\nimport { IUserShortInfo } from '@sc/user/interfaces/i-user-short-info';\nimport { parseISO } from 'date-fns';\nimport { isString } from 'lodash-es';\n\n/**\n * Краткие данные скидки.\n */\nexport class DiscountShortInfo extends NamedIdentity implements IDiscountShortInfo {\n /**\n * Коэффициент стоимости продукта от розничной цены.\n */\n public costCoefficient: number;\n\n /**\n * Признак того, что скидка допускает снижение цены ниже стоп-цены.\n */\n public isLowPriceAllowed: boolean;\n\n /**\n * Дата и время начала действия скидки.\n */\n public publishedAt?: Date;\n\n /**\n * Описание скидки.\n */\n public description?: string;\n\n /**\n * Процент скидки от розничной цены.\n */\n public percent: number;\n\n /**\n * Краткие данные о пользователе.\n */\n public owner: IUserShortInfo;\n\n /**\n * Дата и время удаления.\n */\n public deletedAt?: Date;\n\n /**\n * Инициализирует экземпляр класса {@link DiscountShortInfo}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IDiscountShortInfo) {\n super(data);\n\n this.costCoefficient = data?.costCoefficient ?? 0;\n this.isLowPriceAllowed = data?.isLowPriceAllowed ?? false;\n this.publishedAt = isString(data?.publishedAt) ? parseISO(data.publishedAt) : data?.publishedAt;\n this.description = data?.description ?? undefined;\n this.percent = data?.percent ?? 0;\n this.owner = new UserShortInfo(data?.owner);\n this.deletedAt = isString(data?.deletedAt) ? parseISO(data.deletedAt) : data?.deletedAt;\n }\n}\n","import { IPriceTemplate } from '@sc/catalog/interfaces';\nimport { UpdatableNamedIdentity } from '@sc/system/classes/updatable-named-identity';\nimport { parseISO } from 'date-fns';\nimport { isString } from 'lodash-es';\n\n/**\n * Данные шаблона прайс-листа.\n */\nexport class PriceTemplate extends UpdatableNamedIdentity implements IPriceTemplate {\n /**\n * Описание шаблона прайс-листа.\n */\n public description?: string;\n\n /**\n * Дата и время создания шаблона.\n */\n public createdAt: Date;\n\n /**\n * Инициализирует экземпляр класса {@link PriceTemplate}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IPriceTemplate) {\n super(data);\n\n this.description = data?.description ?? '';\n this.createdAt = isString(data?.createdAt) ? parseISO(data.createdAt) : (data?.createdAt ?? new Date());\n }\n}\n","import { DiscountShortInfo } from '@sc/catalog/classes/discount-short-info';\nimport { PriceTemplate } from '@sc/catalog/classes/price-template';\nimport { Product } from '@sc/catalog/classes/product';\nimport { CostSourceEnum } from '@sc/catalog/enums/cost-source-enum';\nimport { IClientProduct } from '@sc/catalog/interfaces/i-client-product';\nimport { IDiscountShortInfo } from '@sc/catalog/interfaces/i-discount-short-info';\nimport { IPriceTemplate } from '@sc/catalog/interfaces/i-price-template';\n\n/**\n * Данные о продукте для клиента.\n */\nexport class ClientProduct extends Product implements IClientProduct {\n /**\n * Коэффициент стоимости продукта от розничной цены.\n */\n public costCoefficient: number;\n\n /**\n * Источник клиентской цены.\n */\n public costSource: CostSourceEnum;\n\n /**\n * Краткие данные скидки.\n */\n public discount?: IDiscountShortInfo;\n\n /**\n * Данные о шаблоне прайс-листа.\n */\n public priceTemplate?: IPriceTemplate;\n\n /**\n * Признак того, что указанный продукт входит в список ранее заказанных клиентом продуктов.\n */\n public isPreviouslyOrdered?: boolean;\n\n /**\n * Признак того, что указанный продукт входит в список продуктов для доп. продаж клиенту.\n */\n public isRequired?: boolean;\n\n /**\n * Признак того, что указанный продукт входит в список избранных продуктов клиента.\n */\n public isFavorite?: boolean;\n\n /**\n * Инициализирует экземпляр класса {@link ClientProduct}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IClientProduct) {\n super(data);\n\n this.costCoefficient = data?.costCoefficient ?? 0;\n this.costSource = data?.costSource ?? CostSourceEnum.Product;\n this.discount = data?.discount ? new DiscountShortInfo(data.discount) : undefined;\n this.priceTemplate = data?.priceTemplate ? new PriceTemplate(data.priceTemplate) : undefined;\n this.isPreviouslyOrdered = data?.isPreviouslyOrdered;\n this.isRequired = data?.isRequired;\n this.isFavorite = data?.isFavorite;\n }\n}\n","import { IContactLinks } from '@sc/contacts/interfaces/i-contact-links';\n\n/**\n * Данные контакта содержащие исключительно номер телефона, адрес эл. почты и др.\n */\nexport class ContactLinks implements IContactLinks {\n /**\n * Номер телефона. В формате \"79203436527\" или \"+79203436527\".\n */\n public phone?: string;\n\n /**\n * Адрес электронной почты.\n */\n public email?: string;\n\n /**\n * Инициализирует экземпляр класса {@link ContactLinks}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data: IContactLinks) {\n this.phone = /^\\d+$/.test(data.phone ?? '') ? `+${data.phone}` : data.phone;\n this.email = data.email;\n }\n}\n","import { ISalesDirection } from '@sc/references/interfaces/i-sales-direction';\nimport { Reference } from '@sc/system/classes/reference';\n\n/**\n * Данные о направлении продаж.\n */\nexport class SalesDirection extends Reference implements ISalesDirection {}\n","import { ContactLinks } from '@sc/contacts/classes/contact-links';\nimport { IContactLinks } from '@sc/contacts/interfaces/i-contact-links';\nimport { IManagerCommon } from '@sc/managers/interfaces/i-manager-common';\nimport { SalesDirection } from '@sc/references/classes/sales-direction';\nimport { ISalesDirection } from '@sc/references/interfaces/i-sales-direction';\nimport { NamedIdentity } from '@sc/system/classes/named-identity';\n\n/**\n * Общие данные о менеджере клиента.\n */\nexport class ManagerCommon extends NamedIdentity implements IManagerCommon {\n /**\n * @inheritDoc\n */\n public salesDirection: ISalesDirection;\n\n /**\n * @inheritDoc\n */\n public photo?: string;\n\n /**\n * @inheritDoc\n */\n public contacts?: IContactLinks;\n\n /**\n * @inheritDoc\n */\n public isDefault?: boolean;\n\n /**\n * @inheritDoc\n */\n public isRegionalDirector?: boolean;\n\n /**\n * Инициализирует экземпляр класса {@link ManagerCommon}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IManagerCommon) {\n super(data);\n\n this.salesDirection = data?.salesDirection ? new SalesDirection(data.salesDirection) : new SalesDirection();\n this.photo = data?.photo;\n this.contacts = data?.contacts ? new ContactLinks(data.contacts) : undefined;\n this.isDefault = data?.isDefault ?? false;\n this.isRegionalDirector = data?.isRegionalDirector ?? false;\n }\n}\n","import { NamedIdentity } from '@sc/system/classes/named-identity';\nimport { IUserPricingRole } from '@sc/user/interfaces/i-user-pricing-role';\n\n/**\n * Данные о роли ценообразования.\n */\nexport class UserPricingRole extends NamedIdentity implements IUserPricingRole {\n /**\n * @inheritDoc\n */\n public description?: string;\n\n /**\n * @inheritDoc\n */\n public canChangeLowCost: boolean;\n\n /**\n * @inheritDoc\n */\n public parentRoleId?: number;\n\n /**\n * Инициализирует экземпляр класса {@link IUserPricingRole}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data: IUserPricingRole) {\n super(data);\n\n this.description = data.description;\n this.canChangeLowCost = data.canChangeLowCost;\n this.parentRoleId = data.parentRoleId;\n }\n}\n","/* eslint-disable @typescript-eslint/no-unnecessary-condition */\n\nimport { ManagerCommon } from '@sc/managers/classes/manager-common';\nimport { IManager } from '@sc/managers/interfaces/i-manager';\nimport { UserPricingRole } from '@sc/user/classes/user-pricing-role';\nimport { IUserPricingRole } from '@sc/user/interfaces/i-user-pricing-role';\n\n/**\n * Данные о менеджере клиента.\n */\nexport class Manager extends ManagerCommon implements IManager {\n /**\n * Признак активности учетной записи менеджера.\n */\n public isActive: boolean;\n\n /**\n * Признак того, что менеджер является супервайзером.\n */\n public isSupervisor: boolean;\n\n /**\n * Признак того, что менеджер может работать с рекламациями.\n */\n public canDoReclamations: boolean;\n\n /**\n * Дата регистрации.\n */\n public createdAt?: Date;\n\n /**\n * Идентификатор супервайзера.\n */\n public supervisorId?: number;\n\n /**\n * Данные роли ценообразования менеджера.\n */\n public pricingRole?: IUserPricingRole;\n\n /**\n * Инициализирует экземпляр класса {@link Manager}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IManager) {\n super(data);\n\n this.isActive = data?.isActive ?? false;\n this.isSupervisor = data?.isSupervisor ?? false;\n this.canDoReclamations = data?.canDoReclamations ?? false;\n this.createdAt = data?.createdAt;\n this.supervisorId = data?.supervisorId;\n this.pricingRole = data?.pricingRole ? new UserPricingRole(data.pricingRole) : undefined;\n }\n}\n","import { BaseCategory } from '@sc/catalog/classes/internal/base/base-category';\nimport { IBaseClientCategory } from '@sc/catalog/interfaces/internal/base/i-base-client-category';\nimport { Manager } from '@sc/managers/classes/manager';\nimport { IManager } from '@sc/managers/interfaces/i-manager';\n\n/**\n * Данные о категории клиента.\n */\nexport class BaseClientCategory extends BaseCategory implements IBaseClientCategory {\n /**\n * Признак того, что указанная категория входит в список отключенных для клиента категорий.\n */\n public isDisabled: boolean;\n\n /**\n * Признак того, что указанная категория входит в список категорий для доп. продаж клиенту.\n */\n public isRequired: boolean;\n\n /**\n * Признак того, что указанная категория входит в список избранных категорий клиента.\n */\n public isFavorite: boolean;\n\n /**\n * Причина скрытия категории для клиента.\n */\n public hidingComment?: string;\n\n /**\n * Данные о менеджере за которым закреплена категория.\n */\n public manager?: IManager;\n\n /**\n * Инициализирует экземпляр класса {@link BaseClientCategory}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IBaseClientCategory) {\n super(data);\n\n this.isDisabled = data?.isDisabled ?? false;\n this.isRequired = data?.isRequired ?? false;\n this.isFavorite = data?.isFavorite ?? false;\n this.hidingComment = data?.hidingComment;\n this.manager = data?.manager ? new Manager(data.manager) : undefined;\n }\n}\n","import { ClientProduct } from '@sc/catalog/classes/client-product';\nimport { BaseClientCategory } from '@sc/catalog/classes/internal/base/base-client-category';\nimport { IClientCategory } from '@sc/catalog/interfaces/i-client-category';\nimport { IClientProduct } from '@sc/catalog/interfaces/i-client-product';\n\n/**\n * Данные о категории клиента.\n */\nexport class ClientCategory extends BaseClientCategory implements IClientCategory {\n /**\n * Данные о вложенных категориях.\n */\n public categories?: IClientCategory[];\n\n /**\n * Список продуктов категории.\n */\n public products?: IClientProduct[];\n\n /**\n * Инициализирует экземпляр класса {@link ClientCategory}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IClientCategory) {\n super(data);\n\n this.categories = data?.categories?.map((c) => new ClientCategory(c));\n this.products = data?.products?.map((c) => new ClientProduct(c));\n }\n}\n","import { IPriceTemplateICatalogableItem } from '@sc/catalog/interfaces/i-price-template-catalogable-item';\nimport { PriceCoefficient } from '@sc/references/classes/price-coefficient';\nimport { IPriceCoefficient } from '@sc/references/interfaces/i-price-coefficient';\n\n/**\n * Данные о цене элемента каталога в шаблоне прайс-листа.\n */\nexport class PriceTemplateICatalogableItem implements IPriceTemplateICatalogableItem {\n /**\n * Коэффициент цены.\n */\n public priceCoefficient?: IPriceCoefficient;\n\n /**\n * Процент, который прибавляется к значению выбранного коэффициента.\n */\n public increasePercent?: number;\n\n /**\n * Инициализирует экземпляр класса {@link PriceTemplateICatalogableItem}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n protected constructor(data?: IPriceTemplateICatalogableItem) {\n this.priceCoefficient = data?.priceCoefficient && new PriceCoefficient(data.priceCoefficient);\n this.increasePercent = data?.increasePercent;\n }\n}\n","import { BaseCategory } from '@sc/catalog/classes/internal/base/base-category';\nimport { PriceTemplateICatalogableItem } from '@sc/catalog/classes/price-template-catalogable-item';\nimport { IPriceTemplateCategory } from '@sc/catalog/interfaces/i-price-template-category';\nimport { IBaseCategory } from '@sc/catalog/interfaces/internal/base/i-base-category';\n\n/**\n * Данные о цене продукта в шаблоне прайс-листа.\n */\nexport class PriceTemplateCategory extends PriceTemplateICatalogableItem implements IPriceTemplateCategory {\n /**\n * Базовые данные о продукте.\n */\n public productCategory: IBaseCategory;\n\n /**\n * Инициализирует экземпляр класса {@link PriceTemplateProduct}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IPriceTemplateCategory) {\n super(data);\n\n this.productCategory = new BaseCategory(data?.productCategory);\n }\n}\n","import { ICountry } from '@sc/references/interfaces/i-country';\nimport { Reference } from '@sc/system/classes/reference';\n\n/**\n * Данные о стране.\n */\nexport class Country extends Reference implements ICountry {}\n","import { Country } from '@sc/references/classes/country';\nimport { ICountry } from '@sc/references/interfaces/i-country';\nimport { IRegion } from '@sc/references/interfaces/i-region';\nimport { Reference } from '@sc/system/classes/reference';\n\n/**\n * Данные о регионе, включая информацию о стране, в которой он расположен.\n */\nexport class Region extends Reference implements IRegion {\n /**\n * Данные о стране, в которой расположен регион.\n */\n public country: ICountry = new Country();\n\n /**\n * Инициализирует экземпляр класса {@link Region}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IRegion) {\n super(data);\n\n if (data) {\n this.country = new Country(data.country);\n }\n }\n}\n","import { Region } from '@sc/references/classes/region';\nimport { ICityWithRegionAndCountry } from '@sc/references/interfaces/i-city-with-region-and-country';\nimport { IRegion } from '@sc/references/interfaces/i-region';\nimport { Reference } from '@sc/system/classes/reference';\n\n/**\n * Данные о городе, включая информацию о регионе и стране в которых он расположен.\n */\nexport class CityWithRegionAndCountry extends Reference implements ICityWithRegionAndCountry {\n /**\n * Данные о регионе, в котором расположен город.\n */\n public region: IRegion = new Region();\n\n /**\n * Инициализирует экземпляр класса {@link CityWithRegionAndCountry}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: ICityWithRegionAndCountry) {\n super(data);\n\n if (data) {\n this.region = new Region(data.region);\n }\n }\n}\n","import { SalesDirection } from '@sc/references/classes/sales-direction';\nimport { ISalesDirection } from '@sc/references/interfaces/i-sales-direction';\nimport { NamedIdentity } from '@sc/system/classes/named-identity';\nimport { IUserCommonInfo } from '@sc/user/interfaces/i-user-common-info';\nimport { parseISO } from 'date-fns';\nimport { isString } from 'lodash-es';\n\n/**\n * Общие данные о пользователе.\n */\nexport class UserCommonInfo extends NamedIdentity implements IUserCommonInfo {\n /**\n * Номер телефона. В формате \"79203436527\" или \"+79203436527\".\n */\n public phone: string;\n\n /**\n * Адрес электронной почты.\n */\n public email: string;\n\n /**\n * Признак подписки на новости и информационные сообщения.\n */\n public getNews: boolean;\n\n /**\n * Направление продаж.\n */\n public salesDirection?: ISalesDirection;\n\n /**\n * Дата и время регистрации пользователя.\n */\n public createdAt?: Date;\n\n /**\n * Дата и время последней аутентификации пользователя.\n */\n public lastLoginAt?: Date;\n\n /**\n * Признак активности учетной записи пользователя.\n */\n public isActive: boolean;\n\n /**\n * Инициализирует экземпляр класса {@link UserCommonInfo}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IUserCommonInfo>) {\n super(data);\n\n this.phone = /^\\d+$/.test(data?.phone ?? '') ? `+${data?.phone}` : (data?.phone ?? '');\n this.email = data?.email ?? '';\n this.getNews = data?.getNews ?? false;\n this.salesDirection = data?.salesDirection ? new SalesDirection(data.salesDirection) : undefined;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n this.createdAt = isString(data?.createdAt) ? parseISO(data.createdAt) : data?.createdAt;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n this.lastLoginAt = isString(data?.lastLoginAt) ? parseISO(data.lastLoginAt) : data?.lastLoginAt;\n this.isActive = data?.isActive ?? false;\n }\n}\n","/* eslint-disable @typescript-eslint/no-unnecessary-condition */\n\nimport { IClientShortInfo } from '@sc/clients/interfaces/i-client-short-info';\nimport { ManagerCommon } from '@sc/managers/classes/manager-common';\nimport { IManagerCommon } from '@sc/managers/interfaces/i-manager-common';\nimport { CityWithRegionAndCountry } from '@sc/references/classes/city-with-region-and-country';\nimport { SalesDirection } from '@sc/references/classes/sales-direction';\nimport { ICityWithRegionAndCountry } from '@sc/references/interfaces/i-city-with-region-and-country';\nimport { ISalesDirection } from '@sc/references/interfaces/i-sales-direction';\nimport { UserCommonInfo } from '@sc/user/classes/user-common-info';\n\n/**\n * Краткие данные о клиенте.\n */\nexport class ClientShortInfo extends UserCommonInfo implements IClientShortInfo {\n /**\n * Направление продаж.\n */\n public salesDirection: ISalesDirection;\n\n /**\n * Сумма задолженности/переплаты.\n */\n public debt: number;\n\n /**\n * Альтернативное название клиента.\n */\n public alternativeName?: string;\n\n /**\n * Данные о городе.\n */\n public city: ICityWithRegionAndCountry;\n\n /**\n * Комментарий к клиенту.\n */\n public comment?: string;\n\n /**\n * Признак того, что телефон клиента подтверждён.\n */\n public isPhoneApproved: boolean;\n\n /**\n * Признак того, что адрес электронной почты клиента подтверждён.\n */\n public isEmailApproved: boolean;\n\n /**\n * Список менеджеров клиента.\n */\n public managers: IManagerCommon[];\n\n /**\n * Инициализирует экземпляр класса {@link Client}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n // eslint-disable-next-line sonarjs/cognitive-complexity\n public constructor(data?: IClientShortInfo) {\n super(data);\n\n this.salesDirection = new SalesDirection(data?.salesDirection);\n this.debt = data?.debt ?? 0;\n this.alternativeName = data?.alternativeName ?? '';\n this.city = new CityWithRegionAndCountry(data?.city);\n this.comment = data?.comment;\n this.isPhoneApproved = data?.isPhoneApproved ?? false;\n this.isEmailApproved = data?.isEmailApproved ?? false;\n this.managers = data?.managers?.map((m) => new ManagerCommon(m)) ?? [];\n }\n}\n","import { PriceTemplate } from '@sc/catalog/classes/price-template';\nimport { IPriceTemplate } from '@sc/catalog/interfaces/i-price-template';\nimport { IPriceTemplateClient } from '@sc/catalog/interfaces/i-price-template-client';\nimport { ClientShortInfo } from '@sc/clients/classes/client-short-info';\nimport { IClientShortInfo } from '@sc/clients/interfaces/i-client-short-info';\nimport { Identity } from '@sc/system/classes/identity';\nimport { parseISO } from 'date-fns';\nimport { isString } from 'lodash-es';\n\n/**\n * Данные шаблона прайс-листа клиента.\n */\nexport class PriceTemplateClient extends Identity implements IPriceTemplateClient {\n /**\n * Дата и время начала действия шаблона.\n */\n public createdAt: Date;\n\n /**\n * Дата и время окончания действия шаблона.\n */\n public deletedAt?: Date;\n\n /**\n * Данные о клиенте.\n */\n public client: IClientShortInfo;\n\n /**\n * Данные шаблона прайс-листа.\n */\n public priceTemplate: IPriceTemplate;\n\n /**\n * Инициализирует новый экземпляр класса.\n *\n * @param data Начальные данные для инициализации.\n */\n public constructor(data?: IPriceTemplateClient) {\n super(data);\n\n this.createdAt = isString(data?.createdAt) ? parseISO(data.createdAt) : (data?.createdAt ?? new Date());\n this.deletedAt = isString(data?.deletedAt) ? parseISO(data.deletedAt) : data?.deletedAt;\n this.client = new ClientShortInfo(data?.client);\n this.priceTemplate = new PriceTemplate(data?.priceTemplate);\n }\n}\n","import { PriceTemplateICatalogableItem } from '@sc/catalog/classes/price-template-catalogable-item';\nimport { Product } from '@sc/catalog/classes/product';\nimport { IPriceTemplateProduct } from '@sc/catalog/interfaces/i-price-template-product';\nimport { IProduct } from '@sc/catalog/interfaces/i-product';\n\n/**\n * Данные о цене продукта в шаблоне прайс-листа.\n */\nexport class PriceTemplateProduct extends PriceTemplateICatalogableItem implements IPriceTemplateProduct {\n /**\n * Базовые данные о продукте.\n */\n public product: IProduct;\n\n /**\n * Инициализирует экземпляр класса {@link PriceTemplateProduct}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IPriceTemplateProduct) {\n super(data);\n\n this.product = new Product(data?.product);\n }\n}\n","import { PropertyTypeEnum } from '@sc/catalog/enums/property-type-enum';\nimport { IPropertyType } from '@sc/catalog/interfaces/i-property-type';\nimport { Reference } from '@sc/system/classes/reference';\n\n/**\n * Данные о типе свойства.\n */\nexport class PropertyType extends Reference<PropertyTypeEnum> implements IPropertyType {}\n","import { PropertyType } from '@sc/catalog/classes/property-type';\nimport { IProperty } from '@sc/catalog/interfaces/i-property';\nimport { IPropertyType } from '@sc/catalog/interfaces/i-property-type';\nimport { NamedIdentity } from '@sc/system/classes/named-identity';\n\n/**\n * Данные о свойстве.\n */\nexport class Property extends NamedIdentity implements IProperty {\n /**\n * Тип свойства.\n */\n public type: IPropertyType;\n\n /**\n * Описание свойства.\n */\n public description: string;\n\n /**\n * Дополнительные метаданные свойства.\n */\n public metadata?: Record<string, unknown>;\n\n /**\n * Инициализирует экземпляр класса {@link Property}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IProperty) {\n super(data);\n\n this.type = new PropertyType(data?.type);\n this.description = data?.description ?? '';\n this.metadata = data?.metadata;\n }\n}\n","import { Property } from '@sc/catalog/classes/property';\nimport { IPropertyValue } from '@sc/catalog/interfaces/i-property-value';\n\n/**\n * Значение свойства.\n */\nexport class PropertyValue implements IPropertyValue {\n /**\n * Данные о свойстве.\n */\n public property: Property;\n\n /**\n * Значение свойства.\n * Может быть строкой, числом, boolean, диапазоном или JSON объектом.\n */\n public value: string | number | boolean | Record<string, unknown>;\n\n /**\n * Инициализирует экземпляр класса {@link PropertyValue}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IPropertyValue) {\n this.property = new Property(data?.property);\n this.value = data?.value ?? '';\n }\n}\n","import { IDatePeriod } from '@sc/system/interfaces/i-date-period';\nimport { parseISO } from 'date-fns';\nimport { isString } from 'lodash-es';\n\n/**\n * Данные о периоде времени, начало и окончание которого представлены {@link Date}.\n */\nexport class DatePeriod implements IDatePeriod {\n /**\n * Начало периода.\n */\n public from: Date | null;\n\n /**\n * Окончание периода.\n */\n public to: Date | null;\n\n /**\n * Инициализирует экземпляр класса {@link DatePeriod}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IDatePeriod) {\n this.from = isString(data?.from) ? parseISO(data.from) : (data?.from ?? null);\n this.to = isString(data?.to) ? parseISO(data.to) : (data?.to ?? null);\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any,@typescript-eslint/no-unnecessary-condition */\n\nimport { ITemplatesListFilters } from '@sc/catalog/interfaces/i-templates-list-filters';\nimport { DatePeriod } from '@sc/system/classes/date-period';\nimport { IDatePeriod } from '@sc/system/interfaces/i-date-period';\nimport { IReference } from '@sc/system/interfaces/i-reference';\nimport { isFunction, isNil, isString } from 'lodash-es';\n\n/**\n * Данные о параметрах фильтрации списка шаблонов прайс-листов.\n */\nexport class TemplatesListFilters implements ITemplatesListFilters {\n /**\n * Идентификатор шаблона прайс-листа.\n */\n public id?: string;\n\n /**\n * Название шаблона прайс-листа.\n */\n public name?: string;\n\n /**\n * Описание шаблона прайс-листа.\n */\n public description?: string;\n\n /**\n * Период создания.\n */\n public createdAt: IDatePeriod = new DatePeriod();\n\n /**\n * Период изменения.\n */\n public updatedAt: IDatePeriod = new DatePeriod();\n\n /**\n * Инициализирует экземпляр класса {@link TemplatesListFilters}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: ITemplatesListFilters) {\n this.id = data?.id;\n this.name = data?.name;\n this.description = data?.description;\n this.createdAt = new DatePeriod(data?.createdAt);\n this.updatedAt = new DatePeriod(data?.updatedAt);\n }\n\n /**\n * Выполняет сброс указанного фильтра в значение по умолчанию.\n *\n * @param key Название фильтра, значение которого необходимо сбросить.\n */\n public resetFilterValue(key: string): this {\n switch (key) {\n case 'id':\n case 'name':\n case 'description':\n // eslint-disable-next-line security/detect-object-injection\n this[key] = undefined;\n break;\n case 'createdAt':\n this.createdAt.from = null;\n this.createdAt.to = null;\n break;\n case 'updatedAt':\n this.updatedAt.from = null;\n this.updatedAt.to = null;\n break;\n default:\n break;\n }\n\n return this;\n }\n\n /**\n * Возвращает очищенное значение фильтров, содержащие\n * только актуальные данные.\n */\n public asClearRaw(): Record<string, any> {\n const result: Record<string, any> = {};\n\n // eslint-disable-next-line lodash/prefer-lodash-method\n Object.keys(this).forEach((k) => {\n const value = this[k as keyof ITemplatesListFilters];\n\n if (\n !(\n // eslint-disable-next-line prettier/prettier\n isNil(value)\n // eslint-disable-next-line prettier/prettier,lodash/prefer-lodash-method\n || (isString(value) && value.trim().length === 0)\n // eslint-disable-next-line @typescript-eslint/unbound-method,prettier/prettier\n || (isFunction((value as IReference).isNewRec) && (value as IReference).isNewRec())\n )\n ) {\n // eslint-disable-next-line security/detect-object-injection\n result[k] = value;\n }\n });\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (!result?.createdAt?.from && !result?.createdAt?.to) {\n delete result.createdAt;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (!result?.updatedAt?.from && !result?.updatedAt?.to) {\n delete result.updatedAt;\n }\n\n return result;\n }\n}\n","import { IPricingRole } from '@sc/catalog/interfaces/i-pricing-role';\nimport { NamedIdentity } from '@sc/system/classes/named-identity';\n\n/**\n * Данные роли ценообразования.\n */\nexport class PricingRole extends NamedIdentity implements IPricingRole {\n /**\n * Описание роли ценообразования.\n */\n public description?: string;\n\n /**\n * Признак того, что пользователь с данной ролью может устанавливать цены ниже минимальной.\n */\n public canChangeLowCost: boolean;\n\n /**\n * Идентификатор родительской роли ценообразования.\n */\n public parentRoleId?: number;\n\n /**\n * Дочерние категории.\n */\n public subRoles: IPricingRole[] = [];\n\n /**\n * Родительская категория.\n */\n public parentRole?: IPricingRole;\n\n /**\n * Уровень роли ценообразования.\n */\n public level: number = 0;\n\n /**\n * Инициализирует экземпляр класса {@link PricingRole}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IPricingRole) {\n super(data);\n\n this.description = data?.description;\n this.canChangeLowCost = data?.canChangeLowCost ?? false;\n this.parentRoleId = data?.parentRoleId;\n }\n}\n","import { BaseCategory } from '@sc/catalog/classes/internal/base/base-category';\nimport { PricingRole } from '@sc/catalog/classes/pricing-role';\nimport { ICategoryPricingRule } from '@sc/catalog/interfaces/i-category-pricing-rule';\nimport { IPricingRole } from '@sc/catalog/interfaces/i-pricing-role';\nimport { IBaseCategory } from '@sc/catalog/interfaces/internal/base/i-base-category';\nimport { PriceCoefficient } from '@sc/references/classes/price-coefficient';\nimport { IPriceCoefficient } from '@sc/references/interfaces/i-price-coefficient';\n\n/**\n * Правило для роли ценообразования указанной категории.\n */\nexport class CategoryPricingRule implements ICategoryPricingRule {\n /**\n * Роль ценообразования.\n */\n public role: IPricingRole;\n\n /**\n * Категория товара.\n */\n public category: IBaseCategory;\n\n /**\n * Минимальный коэффициент цены.\n */\n public minCoefficient: IPriceCoefficient;\n\n /**\n * Инициализирует экземпляр класса {@link PricingRoleCategoryRule}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: ICategoryPricingRule) {\n this.role = new PricingRole(data?.role);\n this.category = new BaseCategory(data?.category);\n this.minCoefficient = new PriceCoefficient(data?.minCoefficient);\n }\n}\n","import { IDeviceTypeResolutionConfig } from '@sc/config/interfaces/i-device-type-resolution-config';\n\n/**\n * Список условного отношения разрешения экрана и типа устройств.\n */\nexport class DeviceTypeResolutionConfig implements IDeviceTypeResolutionConfig {\n /**\n * Максимальное разрешение для распознания мобильного телефона.\n */\n public readonly phone: number;\n\n /**\n * Минимальное разрешение для распознания планшета.\n */\n public readonly tablet: number;\n\n /**\n * Минимальное разрешение для распознания компьютера.\n */\n public readonly laptop: number;\n\n /**\n * Инициализирует экземпляр класса {@link DeviceTypeResolutionConfig}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IDeviceTypeResolutionConfig>) {\n this.phone = data?.phone ?? 360;\n this.tablet = data?.tablet ?? 600;\n this.laptop = data?.laptop ?? 1024;\n }\n}\n","import { IHttpParamsConfig } from '@sc/config/interfaces/i-http-params-config';\n\n/**\n * Настройки HTTP взаимодействия.\n */\nexport class HttpParamsConfig implements IHttpParamsConfig {\n /**\n * @inheritDoc\n */\n public readonly portalApiUrl: string;\n\n /**\n * @inheritDoc\n */\n public readonly priceHistoryApiUrl?: string;\n\n /**\n * @inheritDoc\n */\n public readonly recommendationsApiUrl?: string;\n\n /**\n * @inheritDoc\n */\n public readonly mediaUrl?: string;\n\n /**\n * @inheritDoc\n */\n public readonly responseDataCacheTimeout: number;\n\n /**\n * Инициализирует экземпляр класса {@link HttpParamsConfig}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IHttpParamsConfig>) {\n this.portalApiUrl = data?.portalApiUrl ?? '';\n this.priceHistoryApiUrl = data?.priceHistoryApiUrl ?? '';\n this.recommendationsApiUrl = data?.recommendationsApiUrl ?? '';\n this.mediaUrl = data?.mediaUrl ?? '';\n this.responseDataCacheTimeout = data?.responseDataCacheTimeout ?? 3 * 60 * 60;\n }\n}\n","import { ISentryConfig } from '@sc/config/interfaces/i-sentry-config';\n\n/**\n * Данные конфигурации для взаимодействия с системой журналирования Sentry.\n */\nexport class SentryConfig implements ISentryConfig {\n /**\n * DSN подключения к Sentry.\n */\n public readonly dsn: string;\n\n /**\n * Тип окружения.\n */\n public readonly environment: string;\n\n /**\n * Список игнорируемых ошибок.\n */\n public readonly ignoreErrors?: Array<string | RegExp>;\n\n /**\n * Настройки трассировкии событий.\n */\n public readonly trace: {\n /**\n * Список доменов с которых разрешена трассировка событий.\n */\n readonly allowedTargets?: Array<string | RegExp>;\n\n /**\n * Частота выборки необходимости отправки событий трассировки/мониторинга.\n *\n * @description\n * Set tracesSampleRate to 1.0 to capture 100% of transactions for performance monitoring.\n * We recommend adjusting this value in production.\n */\n readonly sampleRate?: number;\n };\n\n /**\n * Настройки записей сеансов.\n */\n public readonly replay: {\n /**\n * Частота выборки для повторов продолжительности сеанса.\n * 1.0 будет записывать все сеансы, а 0 — ни одного.\n *\n * @description\n * The sample rate for session-long replays.\n * 1.0 will record all sessions and 0 will record none.\n */\n replaysSessionSampleRate?: number;\n\n /**\n * Частота выборки для сеансов, в которых произошла ошибка.\n * Это не зависит от sessionSampleRate.\n * 1.0 будет записывать все сеансы, а 0 — ни одного.\n *\n * @description\n * The sample rate for sessions that has had an error occur.\n * This is independent of `sessionSampleRate`.\n * 1.0 will record all sessions and 0 will record none.\n */\n replaysOnErrorSampleRate?: number;\n };\n\n /**\n * Дополнительные параметры.\n */\n public readonly additionalParams?: Record<string, unknown>;\n\n /**\n * Инициализирует экземпляр класса {@link SentryConfig}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<ISentryConfig>) {\n this.dsn = data?.dsn ?? '';\n this.environment = data?.environment ?? 'production';\n // eslint-disable-next-line prettier/prettier\n this.ignoreErrors = data?.ignoreErrors ?? [\n /Network\\s{1,3}Error/,\n /Request\\s{1,3}aborted/,\n /Request\\s{1,3}failed\\s{1,3}with\\s{1,3}status\\s{1,3}code\\s{1,3}(401|403|422)/\n ];\n this.trace = {\n allowedTargets: data?.trace?.allowedTargets ?? [/^\\//],\n sampleRate: data?.trace?.sampleRate ?? 0,\n };\n this.replay = {\n replaysOnErrorSampleRate: data?.replay?.replaysOnErrorSampleRate ?? 0,\n replaysSessionSampleRate: data?.replay?.replaysSessionSampleRate ?? 0,\n };\n this.additionalParams = data?.additionalParams ?? {};\n }\n}\n","import { IVersionConfig } from '@sc/config/interfaces/i-version-config';\nimport { parseISO } from 'date-fns';\nimport { isString } from 'lodash-es';\n\n/**\n * Данные о текущем выпуске приложения.\n */\nexport class VersionConfig implements IVersionConfig {\n /**\n * Дата релиза текущей версии приложения.\n */\n public readonly date: Date;\n\n /**\n * Название релиза.\n */\n public readonly name: string;\n\n /**\n * Текущая версия приложения.\n */\n public readonly version: string;\n\n /**\n * Инициализирует экземпляр класса {@link VersionConfig}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IVersionConfig>) {\n this.date = isString(data?.date) ? parseISO(data.date) : (data?.date ?? new Date());\n this.name = data?.name ?? '';\n this.version = data?.version ?? '0.0.0';\n }\n}\n","import { IWebsocketConfig } from '@sc/config/interfaces/i-websocket-config';\n\nexport class WebSocketConfig {\n /**\n * @inheritDoc\n */\n // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\n public readonly broadcaster: 'reverb' | 'pusher' | 'socket.io' | string;\n\n /**\n * @inheritDoc\n */\n public readonly key: string;\n\n /**\n * @inheritDoc\n */\n public readonly wsHost: string;\n\n /**\n * @inheritDoc\n */\n public readonly wsPort: number;\n\n /**\n * @inheritDoc\n */\n public readonly wssPort: number;\n\n /**\n * @inheritDoc\n */\n public readonly forceTLS: boolean;\n\n /**\n * @inheritDoc\n */\n public readonly enabledTransports: string[];\n\n /**\n * Инициализирует экземпляр класса {@link WebSocketConfig}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data: Partial<IWebsocketConfig>) {\n this.broadcaster = data.broadcaster ?? 'reverb';\n this.key = data.key ?? '';\n this.wsHost = data.wsHost ?? '';\n this.wsPort = data.wsPort ?? 8080;\n this.wssPort = data.wssPort ?? 8080;\n this.forceTLS = data.forceTLS ?? false;\n this.enabledTransports = data.enabledTransports ?? ['wss'];\n }\n}\n","import { DeviceTypeResolutionConfig } from '@sc/config/classes/device-type-resolution-config';\nimport { HttpParamsConfig } from '@sc/config/classes/http-params-config';\nimport { SentryConfig } from '@sc/config/classes/sentry-config';\nimport { VersionConfig } from '@sc/config/classes/version-config';\nimport { WebSocketConfig } from '@sc/config/classes/websocket-config';\nimport { IAppBaseConfig } from '@sc/config/interfaces/i-app-base-config';\nimport { IDeviceTypeResolutionConfig } from '@sc/config/interfaces/i-device-type-resolution-config';\nimport { IHttpParamsConfig } from '@sc/config/interfaces/i-http-params-config';\nimport { ISentryConfig } from '@sc/config/interfaces/i-sentry-config';\nimport { IVersionConfig } from '@sc/config/interfaces/i-version-config';\nimport { IWebsocketConfig } from '@sc/config/interfaces/i-websocket-config';\n\n/**\n * Базовые конфигурационные данные приложения.\n */\nexport class AppBaseConfig implements IAppBaseConfig {\n /**\n * @inheritDoc\n */\n public readonly environment: string;\n\n /**\n * @inheritDoc\n */\n public readonly devMode?: Record<string, unknown>;\n\n /**\n * @inheritDoc\n */\n public readonly http: IHttpParamsConfig | Record<string, unknown>;\n\n /**\n * @inheritDoc\n */\n public readonly deviceTypeByResolution: IDeviceTypeResolutionConfig;\n\n /**\n * @inheritDoc\n */\n public readonly sentry?: ISentryConfig;\n\n /**\n * @inheritDoc\n */\n public readonly tableDefaultHeightCoefficient?: number;\n\n /**\n * @inheritDoc\n */\n readonly urls?: Record<string, string | undefined>;\n\n /**\n * @inheritDoc\n */\n public readonly version: IVersionConfig;\n\n /**\n * Конфигурация web-сокета.\n */\n public readonly websocket?: IWebsocketConfig;\n\n /**\n * @inheritDoc\n */\n public readonly dateFormats: IAppBaseConfig['dateFormats'];\n\n /**\n * Инициализирует экземпляр класса {@link AppBaseConfig}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IAppBaseConfig>) {\n this.environment = data?.environment ?? 'production';\n this.devMode = data?.devMode ?? {};\n this.http = new HttpParamsConfig(data?.http);\n this.deviceTypeByResolution = new DeviceTypeResolutionConfig(data?.deviceTypeByResolution);\n this.sentry = new SentryConfig({\n environment: this.environment,\n ...data?.sentry,\n });\n this.tableDefaultHeightCoefficient = data?.tableDefaultHeightCoefficient ?? 0.7;\n this.urls = data?.urls;\n this.version = new VersionConfig(data?.version);\n this.websocket = data?.websocket ? new WebSocketConfig(data.websocket) : undefined;\n this.dateFormats = {\n api: data?.dateFormats?.api ?? 'yyyy-MM-dd HH:mm:ss',\n uiDate: data?.dateFormats?.uiDate ?? 'dd.MM.yyyy',\n uiDateWithTime: data?.dateFormats?.uiDateWithTime ?? 'dd.MM.yyyy HH:mm',\n };\n }\n}\n","import { SearchResult } from '@sc/catalog/types/search-result';\nimport { AppConfigProvider } from '@sc/config';\nimport { HttpRequester } from '@sc/http/classes/http-requester';\n\n/**\n * Предоставляет механизмы получения/управления данными о каталоге.\n */\nexport class CatalogProvider extends HttpRequester {\n /**\n * Возвращает данные о результатах поиска категорий и товаров.\n *\n * @param term Терм поиска.\n * @param showHidden Признак необходимости также возвращать данные о скрытых категориях.\n *\n * @see /doc/api/internal#/Каталог/api_internal_catalog_search\n */\n public search(term: string, showHidden: boolean = false): Promise<SearchResult> {\n return this.get<SearchResult>(`/internal/catalog/search`, {\n term: term,\n show_hidden: showHidden,\n });\n }\n\n /**\n * Возвращает ссылку для скачивания файла с ценами.\n *\n * @param format Формат скачиваемого файла прайс-листа.\n * @param showHidden Признак того, что необходимо включить в ответ скрытые продукты.\n * @param categoryId Идентификатор записи категории товаров.\n * @param clientId Идентификатор клиента для которого необходимо получить файл.\n *\n * @see /doc/api/internal#/operations/api_internal_price_export\n */\n // eslint-disable-next-line class-methods-use-this\n public getPriceExportLink(\n format: 'csv' | 'pdf' = 'csv',\n showHidden: boolean = false,\n categoryId: number | undefined = undefined,\n clientId: number | undefined = undefined\n ): string {\n const appConfig = AppConfigProvider.getConfig();\n\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n let link = `${appConfig.http.portalApiUrl}/api/internal/price/export?format=${format}&show_hidden=${showHidden}`;\n\n if (categoryId) {\n link += `&category_id=${categoryId}`;\n }\n\n if (clientId) {\n link += `&client_id=${clientId}`;\n }\n\n return link;\n }\n}\n","import { ClientProduct } from '@sc/catalog/classes';\nimport { IClientProduct, ICommercialOffer, ICommercialOfferParams, IFileUploadData, IPriceUpdateData } from '@sc/catalog/interfaces';\nimport { HttpRequester } from '@sc/http/classes/http-requester';\n\n/**\n * Предоставляет механизмы получения/управления данными прайс-листа клиента.\n */\nexport class ClientPriceProvider extends HttpRequester {\n /**\n * Импортирует цены клиента из CSV файла.\n *\n * @param clientId Идентификатор клиента.\n * @param file CSV файл с ценами клиента.\n *\n * @see /doc/api/internal#/operations/api_internal_client_price_import\n */\n public importPrices(clientId: number, file: IFileUploadData): Promise<void> {\n return this.post(`/internal/clients/${clientId}/price/import`, file);\n }\n\n /**\n * Изменяет стоимость продуктов категории для клиента.\n *\n * @param clientId Идентификатор клиента.\n * @param categoryId Идентификатор категории товаров.\n * @param data Данные для изменения цены.\n *\n * @see /doc/api/internal#/operations/api_internal_client_price_category_update\n */\n public updateCategoryPrices(clientId: number, categoryId: number, data: IPriceUpdateData): Promise<void> {\n return this.patch(`/internal/clients/${clientId}/price/categories/${categoryId}`, {\n price_coefficient_id: data.coefficient?.id,\n increase_percent: data.value,\n });\n }\n\n /**\n * Удаляет клиентские цены на продукты категории.\n *\n * @param clientId Идентификатор клиента.\n * @param categoryId Идентификатор категории товаров.\n *\n * @see /doc/api/internal#/operations/api_internal_client_price_categories_remove\n */\n public removeCategoryPrices(clientId: number, categoryId: number): Promise<void> {\n return this.delete(`/internal/clients/${clientId}/price/categories/${categoryId}`);\n }\n\n /**\n * Добавляет указанную категорию товаров в список категорий для дополнительных продаж.\n *\n * @param clientId Идентификатор клиента.\n * @param categoryId Идентификатор категории товаров.\n *\n * @see /doc/api/internal#/operations/api_internal_client_price_categories_required_mark\n */\n public markCategoryRequired(clientId: number, categoryId: number): Promise<void> {\n return this.post(`/internal/clients/${clientId}/price/categories/${categoryId}/required`);\n }\n\n /**\n * Удаляет указанную категорию товаров из списка категорий для дополнительных продаж.\n *\n * @param clientId Идентификатор клиента.\n * @param categoryId Идентификатор категории товаров.\n *\n * @see /doc/api/internal#/operations/api_internal_client_price_categories_required_unmark\n */\n public unmarkCategoryRequired(clientId: number, categoryId: number): Promise<void> {\n return this.delete(`/internal/clients/${clientId}/price/categories/${categoryId}/required`);\n }\n\n /**\n * Добавляет отметку скрытия категории в прайсе указанного клиента.\n *\n * @param clientId Идентификатор клиента.\n * @param categoryId Идентификатор категории товаров.\n * @param comment Комментарий о причинах скрытия категории.\n *\n * @see /doc/api/internal#/operations/api_internal_client_price_categories_disabled_mark\n */\n public markCategoryDisabled(clientId: number, categoryId: number, comment?: string): Promise<void> {\n return this.post(`/internal/clients/${clientId}/price/categories/${categoryId}/disabled`, { comment });\n }\n\n /**\n * Снимает отметку скрытия категорий в прайсе указанного клиента.\n *\n * @param clientId Идентификатор клиента.\n * @param categoryId Идентификатор категории товаров.\n *\n * @see /doc/api/internal#/operations/api_internal_client_price_categories_disabled_unmark\n */\n public unmarkCategoryDisabled(clientId: number, categoryId: number): Promise<void> {\n return this.delete(`/internal/clients/${clientId}/price/categories/${categoryId}/disabled`);\n }\n\n /**\n * Применяет менеджера для указанной категории продуктов клиента.\n *\n * @param clientId Идентификатор клиента.\n * @param categoryId Идентификатор категории товаров.\n * @param managerId Идентификатор менеджера.\n *\n * @see /doc/api/internal#/operations/api_internal_client_price_categories_manager_add\n */\n public addCategoryManager(clientId: number, categoryId: number, managerId: number): Promise<void> {\n return this.post(`/internal/clients/${clientId}/price/categories/${categoryId}/manager`, { manager_id: managerId });\n }\n\n /**\n * Удаляет менеджера для указанной категории продуктов клиента.\n *\n * @param clientId Идентификатор клиента.\n * @param categoryId Идентификатор категории товаров.\n *\n * @see /doc/api/internal#/operations/api_internal_client_price_categories_manager_remove\n */\n public removeCategoryManager(clientId: number, categoryId: number): Promise<void> {\n return this.delete(`/internal/clients/${clientId}/price/categories/${categoryId}/manager`);\n }\n\n /**\n * Изменяет стоимость продукта для клиента.\n *\n * @param clientId Идентификатор клиента.\n * @param productId Идентификатор продукта.\n * @param data Данные для изменения цены.\n *\n * @see /doc/api/internal#/operations/api_internal_client_price_products_update\n */\n public updateProductPrice(clientId: number, productId: number, data: IPriceUpdateData): Promise<IClientProduct> {\n return this.patch<IClientProduct>(\n `/internal/clients/${clientId}/price/products/${productId}`,\n {\n price_coefficient_id: data.coefficient?.id,\n increase_percent: data.value,\n },\n (response) => new ClientProduct(response.data)\n );\n }\n\n /**\n * Удаляет удаляет клиентскую цену на продукт.\n *\n * @param clientId Идентификатор клиента.\n * @param productId Идентификатор продукта.\n *\n * @see /doc/api/internal#/operations/api_internal_client_price_products_remove\n */\n public removeProductPrice(clientId: number, productId: number): Promise<IClientProduct> {\n return this.delete<IClientProduct>(`/internal/clients/${clientId}/price/products/${productId}`, (response) => new ClientProduct(response.data));\n }\n\n /**\n * Добавляет указанный продукт в список товаров для дополнительных продаж.\n *\n * @param clientId Идентификатор клиента.\n * @param productId Идентификатор продукта.\n *\n * @see /doc/api/internal#/operations/api_internal_client_price_products_required_mark\n */\n public markProductRequired(clientId: number, productId: number): Promise<void> {\n return this.post(`/internal/clients/${clientId}/price/products/${productId}/required`);\n }\n\n /**\n * Удаляет указанный продукт из списка товаров для дополнительных продаж.\n *\n * @param clientId Идентификатор клиента.\n * @param productId Идентификатор продукта.\n *\n * @see /doc/api/internal#/operations/api_internal_client_price_products_required_unmark\n */\n public unmarkProductRequired(clientId: number, productId: number): Promise<void> {\n return this.delete(`/internal/clients/${clientId}/price/products/${productId}/required`);\n }\n\n /**\n * Возвращает содержимое коммерческого предложения в формате HTML.\n *\n * @param clientId Идентификатор клиента.\n * @param params Параметры коммерческого предложения.\n *\n * @see /doc/api/internal#/operations/api_internal_client_price_commercial_offer_view\n */\n public getCommercialOfferHtml(clientId: number, params?: ICommercialOfferParams): Promise<Blob> {\n return this.get<Blob>(`/internal/clients/${clientId}/price/commercial-offer/view`, params, (response) => new Blob([response.data], { type: 'text/html' }));\n }\n\n /**\n * Возвращает файл коммерческого предложения в формате PDF.\n *\n * @param clientId Идентификатор клиента.\n * @param params Параметры коммерческого предложения.\n *\n * @see /doc/api/internal#/operations/api_internal_client_price_commercial_offer_download\n */\n public getCommercialOfferPdf(clientId: number, params?: ICommercialOfferParams): Promise<Blob> {\n return this.getBlob<Blob>(\n `/internal/clients/${clientId}/price/commercial-offer/download`,\n params,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (response) => new Blob([response.request.response], { type: 'application/pdf' })\n );\n }\n\n /**\n * Отправляет PDF файл коммерческого предложения на электронную почту.\n *\n * @param clientId Идентификатор клиента.\n * @param data Данные для отправки коммерческого предложения.\n *\n * @see /doc/api/internal#/operations/api_internal_client_price_commercial_offer_send\n */\n public sendCommercialOffer(clientId: number, data: ICommercialOffer): Promise<void> {\n return this.post(`/internal/clients/${clientId}/price/commercial-offer/send`, data);\n }\n}\n","import { PriceTemplateClient } from '@sc/catalog/classes';\nimport { IPriceTemplateClient, IPriceTemplateClientUpdateData } from '@sc/catalog/interfaces';\nimport { AppConfigProvider } from '@sc/config/providers/app-config-provider';\nimport { HttpRequester } from '@sc/http/classes/http-requester';\nimport { format } from 'date-fns';\n\n/**\n * Предоставляет механизмы получения/управления шаблонами прайс-листа клиента.\n */\nexport class ClientPriceTemplateProvider extends HttpRequester {\n /**\n * Возвращает список шаблонов прайс-листа привязанных к клиенту.\n *\n * @param clientId Идентификатор клиента.\n *\n * @see /doc/api/internal#/operations/api_internal_client_price_template_get_list\n */\n public getTemplateList(clientId: number): Promise<IPriceTemplateClient[]> {\n return this.get<IPriceTemplateClient[]>(`/internal/clients/${clientId}/price/templates`, {}, (response) =>\n response.data.map((template) => new PriceTemplateClient(template))\n );\n }\n\n /**\n * Возвращает действующий шаблон прайс листа привязанный к клиенту.\n *\n * @param clientId Идентификатор клиента.\n *\n * @see /doc/api/internal#/operations/api_internal_client_price_template_get_active\n */\n public getActiveTemplate(clientId: number): Promise<IPriceTemplateClient> {\n return this.get<IPriceTemplateClient>(`/internal/clients/${clientId}/price/templates/active`, {}, (response) => new PriceTemplateClient(response.data), true);\n }\n\n /**\n * Добавляет связь между клиентом и шаблоном прайс-листа.\n *\n * @param clientId Идентификатор клиента.\n * @param priceTemplateId Идентификатор шаблона прайс-листа.\n * @param data Данные для создания связи.\n *\n * @see /doc/api/internal#/operations/api_internal_client_price_template_attach\n */\n public attachTemplate(clientId: number, priceTemplateId: number, data?: IPriceTemplateClientUpdateData): Promise<IPriceTemplateClient> {\n const apiDateFormat = AppConfigProvider.getConfig().dateFormats.api;\n\n return this.post<IPriceTemplateClient>(\n `/internal/clients/${clientId}/price/templates/${priceTemplateId}`,\n data && {\n startAt: data.startAt && format(data.startAt, apiDateFormat),\n endAt: data.endAt && format(data.endAt, apiDateFormat),\n },\n (response) => new PriceTemplateClient(response.data),\n {},\n true\n );\n }\n\n /**\n * Применяет шаблон прайс листа к клиенту.\n *\n * @param clientId Идентификатор клиента.\n * @param priceTemplateId Идентификатор шаблона прайс-листа.\n *\n * @see /doc/api/internal#/operations/api_internal_client_price_template_apply\n */\n public applyTemplate(clientId: number, priceTemplateId: number): Promise<void> {\n return this.post(`/internal/clients/${clientId}/price/templates/${priceTemplateId}/apply`, {}, undefined, {}, true);\n }\n\n /**\n * Изменяет связь между клиентом и шаблоном прайс-листа.\n *\n * @param clientId Идентификатор клиента.\n * @param priceTemplateId Идентификатор шаблона прайс-листа.\n * @param priceTemplateClientId Идентификатор связи клиента с шаблоном прайс-листа.\n * @param data Данные для изменения связи.\n *\n * @see /doc/api/internal#/operations/api_internal_client_price_template_change\n */\n public changeTemplate(clientId: number, priceTemplateId: number, priceTemplateClientId: number, data?: IPriceTemplateClientUpdateData): Promise<IPriceTemplateClient> {\n const apiDateFormat = AppConfigProvider.getConfig().dateFormats.api;\n\n return this.patch<IPriceTemplateClient>(\n `/internal/clients/${clientId}/price/templates/${priceTemplateId}/${priceTemplateClientId}`,\n data && {\n startAt: data.startAt && format(data.startAt, apiDateFormat),\n endAt: data.endAt && format(data.endAt, apiDateFormat),\n },\n (response) => new PriceTemplateClient(response.data)\n );\n }\n\n /**\n * Удаляет связь между клиентом и шаблоном прайс-листа.\n *\n * @param clientId Идентификатор клиента.\n * @param priceTemplateId Идентификатор шаблона прайс-листа.\n * @param priceTemplateClientId Идентификатор связи клиента с шаблоном прайс-листа.\n *\n * @see /doc/api/internal#/operations/api_internal_client_price_template_detach\n */\n public detachTemplate(clientId: number, priceTemplateId: number, priceTemplateClientId: number): Promise<void> {\n return this.delete(`/internal/clients/${clientId}/price/templates/${priceTemplateId}/${priceTemplateClientId}`);\n }\n}\n","import { Category } from '@sc/catalog/classes/category';\nimport { Product } from '@sc/catalog/classes/product';\nimport { ProductPriceCoefficient } from '@sc/catalog/classes/product-price-coefficient';\nimport { ICategory } from '@sc/catalog/interfaces/i-category';\nimport { IProduct } from '@sc/catalog/interfaces/i-product';\nimport { IProductPriceCoefficient } from '@sc/catalog/interfaces/i-product-price-coefficient';\nimport { HttpRequester } from '@sc/http/classes/http-requester';\nimport { forEach, map } from 'lodash-es';\n\n/**\n * Предоставляет механизмы получения/управления данными о категориях продуктов.\n */\nexport class ProductCategoryDataProvider extends HttpRequester {\n /**\n * Возвращает список данных о корневых категориях.\n *\n * @param showHidden Признак необходимости также возвращать данные о скрытых категориях.\n *\n * @see /doc/api/internal#/Каталог/api_internal_catalog_categories_get_list\n */\n public getRootCategoriesList(showHidden: boolean = false): Promise<ICategory[]> {\n return this.get<ICategory[]>(\n `/internal/catalog/categories`,\n {\n showHidden: showHidden,\n },\n (response) => response.data.map((c) => new Category(c))\n );\n }\n\n /**\n * Возвращает данные об указанной категории.\n *\n * @param categoryID Идентификатор категории для которой нужно получить данные.\n * @param showHidden Признак необходимости также возвращать данные о скрытых категориях.\n * @param withNestedCategories Признак необходимости также вернуть список с данными о вложенных категориях.\n *\n * @see /doc/api/internal#/Каталог/api_internal_catalog_categories_get\n */\n public getCategoryData(categoryID: number, showHidden: boolean = false, withNestedCategories: boolean = false): Promise<ICategory> {\n return this.get<ICategory>(\n `/internal/catalog/categories/${categoryID}`,\n {\n showHidden: showHidden,\n withNestedCategories: withNestedCategories,\n },\n (response) => new Category(response.data)\n );\n }\n\n /**\n * Возвращает публичные данные об указанной категории продуктов.\n *\n * @param categoryID Идентификатор категории продуктов.\n */\n public getPublicCategoryData(categoryID: number): Promise<ICategory> {\n return this.get<ICategory>(`/public/catalog/categories/${categoryID}`, {}, (response) => new Category(response.data));\n }\n\n /**\n * Возвращает список продуктов категории.\n *\n * @param categoryID Идентификатор категории для которой нужно получить список продуктов.\n * @param withPriceCoefficients Признак того, что необходимо включить в ответ данные о коэффициентах цен на продукты.\n * @param showHidden Признак необходимости также возвращать данные о скрытых продуктах.\n *\n * @see /doc/api/internal#/Каталог/api_internal_catalog_categories_products_get\n */\n public getCategoryProductsList(categoryID: number, withPriceCoefficients: boolean = true, showHidden: boolean = false): Promise<IProduct[]> {\n return this.get<IProduct[]>(\n `/internal/catalog/categories/${categoryID}/products`,\n {\n showHidden: showHidden,\n withPriceCoefficients: withPriceCoefficients,\n },\n (response) => map(response.data, (p) => new Product(p))\n );\n }\n\n /**\n * Возвращает данные о коэффициентах цен на продукты категории.\n *\n * @param categoryID Идентификатор категории для которой нужно получить список коэффициентов.\n *\n * @see /doc/api/internal#/Каталог/api_internal_catalog_categories_products_coefficients_get\n */\n public getCategoryProductsCoefficients(categoryID: number): Promise<Record<number, IProductPriceCoefficient[]>> {\n return this.get<Record<number, IProductPriceCoefficient[]>>(`/internal/catalog/categories/${categoryID}/products/coefficients`, {}, (response) => {\n const { data } = response;\n forEach(data, (pcs) => pcs.map((pc) => new ProductPriceCoefficient(pc)));\n return data;\n });\n }\n\n /**\n * Выполняет публичный поиск данных о категориях продуктов по терму.\n *\n * @param term Терм поиска.\n * @param limit Количество возвращаемых записей.\n */\n public publicSimpleSearch(term: string, limit: number = 10): Promise<ICategory[]> {\n return new Promise((resolve, reject) => {\n this.get<{ categories: ICategory[] }>(`/public/catalog/search/simple?limit=${limit}&term=${term}`)\n .then((response) => {\n resolve(response.categories.map((value) => new Category(value)));\n })\n .catch((error) => {\n reject(error);\n });\n });\n }\n}\n","import { Product } from '@sc/catalog/classes/product';\nimport { ProductPriceCoefficient } from '@sc/catalog/classes/product-price-coefficient';\nimport { IProduct } from '@sc/catalog/interfaces/i-product';\nimport { IProductPriceCoefficient } from '@sc/catalog/interfaces/i-product-price-coefficient';\nimport { HttpRequester } from '@sc/http/classes/http-requester';\nimport { map } from 'lodash-es';\n\n/**\n * Предоставляет механизмы получения/управления данными о продуктах.\n */\nexport class ProductDataProvider extends HttpRequester {\n /**\n * Возвращает данные об указанном продукте.\n *\n * @param productId Идентификатор продукта о котором нужно получить данные.\n * @param withPriceCoefficients Признак того, что необходимо включить в ответ данные о коэффициентах цен на продукты.\n *\n * @see /doc/api/internal#/Каталог/api_internal_catalog_products_get\n */\n public getProductData(productId: number, withPriceCoefficients: boolean = false): Promise<IProduct> {\n return this.get<IProduct>(`/internal/catalog/products/${productId}`, { withPriceCoefficients: withPriceCoefficients }, (response) => new Product(response.data));\n }\n\n /**\n * Возвращает публичные данные об указанном продукте.\n *\n * @param productId Идентификатор продукта.\n */\n public getPublicProductData(productId: number): Promise<IProduct> {\n return this.get<IProduct>(`/public/catalog/products/${productId}`, {}, (response) => new Product(response.data));\n }\n\n /**\n * Возвращает данные о коэффициентах цен для указанного продукта.\n *\n * @param productId Идентификатор продукта для которого нужно получить данные о коэффициентах цен.\n *\n * @see /doc/api/internal#/Каталог/api_internal_catalog_products_coefficients_get\n */\n public getProductPriceCoefficients(productId: number): Promise<IProductPriceCoefficient[]> {\n return this.get<IProductPriceCoefficient[]>(`/internal/catalog/products/${productId}/coefficients`, {}, (response) =>\n map(response.data, (rec) => new ProductPriceCoefficient(rec))\n );\n }\n\n /**\n * Выполняет публичный поиск данных о продуктах по терму.\n *\n * @param term Терм поиска.\n * @param limit Количество возвращаемых записей.\n */\n public publicSimpleSearch(term: string, limit: number = 10): Promise<IProduct[]> {\n return new Promise((resolve, reject) => {\n this.get<{ products: IProduct[] }>(`/public/catalog/search/simple?limit=${limit}&term=${term}`)\n .then((response) => {\n resolve(response.products.map((value) => new Product(value)));\n })\n .catch((error) => {\n reject(error);\n });\n });\n }\n}\n","import { ClientCategory } from '@sc/catalog/classes/client-category';\nimport { ClientProduct } from '@sc/catalog/classes/client-product';\nimport { IClientCategory } from '@sc/catalog/interfaces/i-client-category';\nimport { IClientProduct } from '@sc/catalog/interfaces/i-client-product';\nimport { HttpRequester } from '@sc/http/classes/http-requester';\nimport { map } from 'lodash-es';\n\n/**\n * Предоставляет механизмы получения/управления данными о категориях продуктов для клиентов.\n */\nexport class ClientProductCategoryDataProvider extends HttpRequester {\n /**\n * Возвращает список данных о корневых категориях указанного клиента.\n *\n * @param clientId Идентификатор клиента для которого необходимо вернуть список корневых категорий.\n * @param showHidden Признак необходимости также возвращать данные о скрытых категориях.\n *\n * @see /doc/api/internal#/Каталог/api_internal_catalog_categories_get_list\n */\n public getRootCategoriesList(clientId: number, showHidden: boolean = false): Promise<IClientCategory[]> {\n return this.get<IClientCategory[]>(\n `/internal/catalog/categories`,\n {\n clientId: clientId,\n showHidden: showHidden,\n },\n (response) => response.data.map((c) => new ClientCategory(c))\n );\n }\n\n /**\n * Возвращает данные об указанной категории клиента.\n *\n * @param clientId Идентификатор клиента для которого необходимо получить данные категории.\n * @param categoryID Идентификатор категории для которой нужно получить данные.\n * @param showHidden Признак необходимости также возвращать данные о скрытых категориях.\n * @param withNestedCategories Признак необходимости также вернуть список с данными о вложенных категориях.\n *\n * @see /doc/api/internal#/Каталог/api_internal_catalog_categories_get\n */\n public getCategoryData(clientId: number, categoryID: number, showHidden: boolean = false, withNestedCategories: boolean = false): Promise<IClientCategory> {\n return this.get<IClientCategory>(\n `/internal/catalog/categories/${categoryID}`,\n {\n clientId: clientId,\n showHidden: showHidden,\n withNestedCategories: withNestedCategories,\n },\n (response) => new ClientCategory(response.data)\n );\n }\n\n /**\n * Возвращает список продуктов категории указанного клиента.\n *\n * @param clientId Идентификатор клиента для которого необходимо получить список продуктов.\n * @param categoryID Идентификатор категории для которой нужно получить список продуктов.\n * @param withPriceCoefficients Признак того, что необходимо включить в ответ данные о коэффициентах цен на продукты.\n * @param showHidden Признак необходимости также возвращать данные о скрытых продуктах.\n *\n * @see /doc/api/internal#/Каталог/api_internal_catalog_categories_products_get\n */\n public getCategoryProductsList(clientId: number, categoryID: number, withPriceCoefficients: boolean = true, showHidden: boolean = false): Promise<IClientProduct[]> {\n return this.get<IClientProduct[]>(\n `/internal/catalog/categories/${categoryID}/products`,\n {\n client_id: clientId,\n showHidden: showHidden,\n withPriceCoefficients: withPriceCoefficients,\n },\n (response) => map(response.data, (p) => new ClientProduct(p))\n );\n }\n}\n","import { ClientProduct } from '@sc/catalog/classes/client-product';\nimport { IClientProduct } from '@sc/catalog/interfaces/i-client-product';\nimport { HttpRequester } from '@sc/http/classes/http-requester';\n\n/**\n * Предоставляет механизмы получения/управления данными о продуктах для клиентов.\n */\nexport class ClientProductDataProvider extends HttpRequester {\n /**\n * Возвращает данные об указанном продукте для указанного клиента.\n *\n * @param productId Идентификатор продукта о котором нужно получить данные.\n * @param clientId Идентификатор клиента.\n * @param withPriceCoefficients Признак того, что необходимо включить в ответ данные о коэффициентах цен на продукты.\n *\n * @see /doc/api/internal#/Каталог/api_internal_catalog_products_get\n */\n public getProductData(productId: number, clientId: number, withPriceCoefficients: boolean = false): Promise<IClientProduct> {\n return this.get<IClientProduct>(\n `/internal/catalog/products/${productId}`,\n {\n clientId: clientId,\n withPriceCoefficients: withPriceCoefficients,\n },\n (response) => new ClientProduct(response.data)\n );\n }\n}\n","/* eslint-disable no-unused-vars, no-shadow */\n\n/**\n * Перечисление допустимых значений действий сравнения для фильтров.\n */\nexport enum FilterOpEnum {\n /**\n * Начинается с, эквивалентно `field LIKE \"value%\"`.\n */\n BeginWith = 'bw',\n\n /**\n * Содержит, эквивалентно `field LIKE \"%value%\"`.\n */\n Contains = 'cn',\n\n /**\n * Индивидуальный фильтр.\n */\n Custom = 'custom',\n\n /**\n * Заканчивается на, эквивалентно `field LIKE \"%value\"`.\n */\n EndsWith = 'ew',\n\n /**\n * Равно, эквивалентно `field = value`.\n */\n Equals = 'eq',\n\n /**\n * Больше или равно, эквивалентно `field >= value`.\n */\n GreaterOrEqual = 'ge',\n\n /**\n * Больше, эквивалентно `field > value`.\n */\n GreaterThan = 'gt',\n\n /**\n * Находится в списке, эквивалентно `field IN (value1, value2)`.\n */\n InList = 'in',\n\n /**\n * Меньше или равно, эквивалентно `field <= value`.\n */\n LessOrEqual = 'le',\n\n /**\n * Меньше, эквивалентно `field < value`.\n */\n LessThan = 'lt',\n\n /**\n * Не начинается с, эквивалентно `field NOT LIKE \"value%\"`.\n */\n NotBeginWith = 'bn',\n\n /**\n * Не содержит, эквивалентно `field NOT LIKE \"%value%\"`.\n */\n NotContains = 'nc',\n\n /**\n * Не заканчивается на, эквивалентно `field NOT LIKE \"%value\"`.\n */\n NotEndsWith = 'en',\n\n /**\n * Не равно, эквивалентно `field <> value`.\n */\n NotEqual = 'ne',\n\n /**\n * Не находится в списке, эквивалентно `field NOT IN (value1, value2)`.\n */\n NotInList = 'ni',\n\n /**\n * Не равно NULL, эквивалентно `field IS NOT NULL`.\n */\n NotNull = 'nn',\n\n /**\n * Равно NULL, эквивалентно `field IS NULL`.\n */\n Null = 'nu',\n}\n","import { AppConfigProvider } from '@sc/config';\nimport { FilterOpEnum } from '@sc/data-table/enums/filter-op-enum';\nimport { IFilterItem } from '@sc/data-table/interfaces/i-filter-item';\nimport { format } from 'date-fns';\nimport { isDate } from 'lodash-es';\n\n/**\n * Данные о фильтре по некоторому полю.\n */\nexport class FilterItem implements IFilterItem {\n /**\n * Поле, по которому производится поиск.\n */\n public field: string;\n\n /**\n * Операция сравнения.\n */\n public op: FilterOpEnum;\n\n /**\n * Значение с которым сравнивается поле.\n */\n public value: string | boolean | number | Date;\n\n /**\n * Инициализирует экземпляр класса {@link FilterItem}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IFilterItem>) {\n this.field = data?.field ?? '';\n this.op = data?.op ?? FilterOpEnum.Equals;\n this.value = data?.value ?? '';\n }\n\n /**\n * Преобразует фильтр в примитивное представление для API.\n *\n * @returns Примитивное представление фильтра.\n */\n public toPrimitive(): Record<string, string | boolean | number> {\n const result: Record<string, string | boolean | number> = {\n field: this.field,\n op: this.op,\n };\n\n result.value = isDate(this.value) ? format(this.value, AppConfigProvider.getConfig().dateFormats.api) : this.value;\n\n return result;\n }\n}\n","import { FilterItem } from '@sc/data-table/classes/filter-item';\nimport { IFilterGroup } from '@sc/data-table/interfaces/i-filter-group';\nimport { IFilterItem } from '@sc/data-table/interfaces/i-filter-item';\nimport { isFunction } from 'lodash-es';\n\n/**\n * Данные о группе фильтров.\n */\nexport class FilterGroup implements IFilterGroup {\n /**\n * Условие объединения фильтров.\n */\n public groupOp: 'and' | 'or';\n\n /**\n * Список фильтров.\n */\n public filters: IFilterItem[];\n\n /**\n * Список вложенных групп фильтров.\n */\n public groups: IFilterGroup[];\n\n /**\n * Инициализирует экземпляр класса {@link FilterGroup}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IFilterGroup>) {\n this.groupOp = data?.groupOp ?? 'and';\n this.filters = data?.filters?.map((filter) => new FilterItem(filter)) ?? [];\n this.groups = data?.groups?.map((group) => new FilterGroup(group)) ?? [];\n }\n\n /**\n * Преобразует группу фильтров в примитивное представление для API.\n *\n * @returns Примитивное представление группы фильтров.\n */\n public toPrimitive(): Record<string, unknown> {\n return {\n groupOp: this.groupOp,\n filters: this.filters.map((filter) => {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n if (filter instanceof FilterItem && isFunction(filter.toPrimitive)) {\n return filter.toPrimitive();\n }\n\n return filter;\n }),\n groups: this.groups.map((group) => {\n if (group instanceof FilterGroup) {\n return group.toPrimitive();\n }\n\n return group;\n }),\n };\n }\n}\n","import { FilterGroup } from '@sc/data-table/classes/filter-group';\nimport { IFilterGroup } from '@sc/data-table/interfaces/i-filter-group';\nimport { IPaginationRequestParams } from '@sc/data-table/interfaces/i-pagination-request-params';\nimport { ISortRequestParams } from '@sc/data-table/interfaces/i-sort-request-params';\nimport { HttpRequester } from '@sc/http/classes/http-requester';\nimport { IPaginatedResponse } from '@sc/pagination/interfaces';\nimport { AxiosResponse } from 'axios';\nimport { isArray, isEmpty } from 'lodash-es';\n\n/**\n * Базовый класс для предоставления механизмов пагинации.\n */\nexport abstract class BasePaginationProvider extends HttpRequester {\n /**\n * Получает пагинированный список данных.\n *\n * @param url URL запроса.\n * @param filters Параметры фильтрации.\n * @param sortParams Параметры сортировки.\n * @param paginationParams Параметры пагинации.\n * @param extraParams Дополнительные параметры запроса.\n * @param successHandler Обработчик успешного выполнения запроса.\n * @param disableDefaultNotificationErrorResponseHandler Признак отключения стандартного обработчика ошибок.\n */\n protected getPaginated<D, T extends D = D>(\n url: string,\n filters?: IFilterGroup,\n sortParams?: ISortRequestParams[] | ISortRequestParams,\n paginationParams?: IPaginationRequestParams,\n extraParams?: object,\n successHandler?: (response: AxiosResponse<IPaginatedResponse<D>>) => IPaginatedResponse<T>,\n disableDefaultNotificationErrorResponseHandler?: boolean\n ): Promise<IPaginatedResponse<T>> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let requestParams: Record<string, any> = {\n page: paginationParams?.page ?? 1,\n perPage: paginationParams?.pageSize ?? 10,\n };\n\n if (filters) {\n requestParams.filters = JSON.stringify((filters instanceof FilterGroup ? filters : new FilterGroup(filters)).toPrimitive());\n }\n\n if (!isEmpty(sortParams)) {\n requestParams.sort = isArray(sortParams) ? sortParams : [sortParams];\n }\n\n if (extraParams) {\n requestParams = { ...requestParams, ...extraParams };\n }\n\n return this.get<IPaginatedResponse<T>>(url, requestParams, successHandler, disableDefaultNotificationErrorResponseHandler);\n }\n}\n","import { PriceTemplate, PriceTemplateCategory, PriceTemplateClient, PriceTemplateProduct } from '@sc/catalog/classes';\nimport { IPriceTemplate, IPriceTemplateCategory, IPriceTemplateClient, IPriceTemplateCreateData, IPriceTemplateProduct, IPriceUpdateData } from '@sc/catalog/interfaces';\nimport { IFilterGroup, IPaginationRequestParams, ISortRequestParams } from '@sc/data-table';\nimport { IPaginatedResponse } from '@sc/pagination/interfaces/i-paginated-response';\nimport { BasePaginationProvider } from '@sc/pagination/providers/base-pagination-provider';\nimport { IFieldValidationResultData } from '@sc/validation/interfaces';\n\n/**\n * Предоставляет механизмы получения/управления шаблонами прайс-листа.\n */\nexport class PriceTemplateProvider extends BasePaginationProvider {\n /**\n * Возвращает список шаблонов прайс-листа.\n *\n * @param filters Параметры фильтрации данных.\n * @param sortParams Параметры сортировки.\n * @param paginationParams Параметры пагинации.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_template_get_list\n */\n public getTemplateList(\n filters?: IFilterGroup,\n sortParams?: ISortRequestParams[] | ISortRequestParams,\n paginationParams?: IPaginationRequestParams\n ): Promise<IPaginatedResponse<IPriceTemplate>> {\n return this.getPaginated<IPriceTemplate>('/internal/price/templates', filters, sortParams, paginationParams, {}, (response) => {\n const result = { ...response.data };\n\n result.data = result.data.map((propertyData: IPriceTemplate) => new PriceTemplate(propertyData));\n\n return result;\n });\n }\n\n /**\n * Создание нового шаблона прайс-листа.\n *\n * @param data Данные для создания шаблона прайс-листа.\n * @param validationFieldResultData Список полей, для которых необходимо\n * установить данные об ошибках валидации\n * в случае ошибок в запросах.\n * @see /doc/api/internal#/operations/api_internal_catalog_price_template_create\n */\n public createTemplate(data: IPriceTemplateCreateData, validationFieldResultData: Record<string, IFieldValidationResultData> = {}): Promise<IPriceTemplate> {\n return this.post<IPriceTemplate>('/internal/price/templates', data, (response) => new PriceTemplate(response.data), validationFieldResultData);\n }\n\n /**\n * Возвращает данные о шаблоне прайс-листа.\n *\n * @param priceTemplateId Идентификатор шаблона прайс-листа.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_template_get\n */\n public getTemplate(priceTemplateId: number): Promise<IPriceTemplate> {\n return this.get<IPriceTemplate>(`/internal/price/templates/${priceTemplateId}`, {}, (response) => new PriceTemplate(response.data));\n }\n\n /**\n * Изменяет данные о шаблоне прайс-листа.\n *\n * @param priceTemplateId Идентификатор шаблона прайс-листа.\n * @param data Данные для изменения шаблона прайс-листа.\n * @param validationFieldResultData Список полей, для которых необходимо\n * установить данные об ошибках валидации\n * в случае ошибок в запросах.\n * @see /doc/api/internal#/operations/api_internal_catalog_price_template_update\n */\n public updateTemplate(\n priceTemplateId: number,\n data: IPriceTemplateCreateData,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<IPriceTemplate> {\n return this.patch<IPriceTemplate>(`/internal/price/templates/${priceTemplateId}`, data, (response) => new PriceTemplate(response.data), validationFieldResultData);\n }\n\n /**\n * Удаляет данные о шаблоне прайс-листа.\n *\n * @param priceTemplateId Идентификатор шаблона прайс-листа.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_template_delete\n */\n public removeTemplate(priceTemplateId: number): Promise<void> {\n return this.delete(`/internal/price/templates/${priceTemplateId}`);\n }\n\n /**\n * Возвращает список цен шаблона прайс-листа, установленных на продукты.\n *\n * @param priceTemplateId Идентификатор шаблона прайс-листа.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_template_product_get_list\n */\n public getProductTemplatePrices(priceTemplateId: number): Promise<IPriceTemplateProduct[]> {\n return this.get<IPriceTemplateProduct[]>(`/internal/price/templates/${priceTemplateId}/products`, {}, (response) =>\n response.data.map((product) => new PriceTemplateProduct(product))\n );\n }\n\n /**\n * Возвращает данные о цене на продукт в шаблоне прайс-листа.\n *\n * @param priceTemplateId Идентификатор шаблона прайс-листа.\n * @param productId Идентификатор продукта.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_template_product_get\n */\n public getProductTemplatePrice(priceTemplateId: number, productId: number): Promise<IPriceTemplateProduct> {\n return this.get<IPriceTemplateProduct>(`/internal/price/templates/${priceTemplateId}/products/${productId}`, {}, (response) => new PriceTemplateProduct(response.data));\n }\n\n /**\n * Сохраняет цену на продукт в шаблоне прайс-листа.\n *\n * @param priceTemplateId Идентификатор шаблона прайс-листа.\n * @param productId Идентификатор продукта.\n * @param data Данные для сохранения цены.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_template_product_save\n */\n public saveProductTemplatePrice(priceTemplateId: number, productId: number, data: IPriceUpdateData): Promise<IPriceTemplateProduct> {\n return this.post<IPriceTemplateProduct>(\n `/internal/price/templates/${priceTemplateId}/products/${productId}`,\n {\n price_coefficient_id: data.coefficient?.id,\n increase_percent: data.value,\n },\n (response) => new PriceTemplateProduct(response.data)\n );\n }\n\n /**\n * Удаляет данные о цене на продукт в шаблоне прайс-листа.\n *\n * @param priceTemplateId Идентификатор шаблона прайс-листа.\n * @param productId Идентификатор продукта.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_template_product_delete\n */\n public deleteProductTemplatePrice(priceTemplateId: number, productId: number): Promise<void> {\n return this.delete(`/internal/price/templates/${priceTemplateId}/products/${productId}`);\n }\n\n /**\n * Возвращает список цен шаблона прайс-листа, установленных на категории.\n *\n * @param priceTemplateId Идентификатор шаблона прайс-листа.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_template_category_get_list\n */\n public getCategoryTemplatePrices(priceTemplateId: number): Promise<IPriceTemplateCategory[]> {\n return this.get<IPriceTemplateCategory[]>(`/internal/price/templates/${priceTemplateId}/categories`, {}, (response) =>\n response.data.map((category) => new PriceTemplateCategory(category))\n );\n }\n\n /**\n * Возвращает данные о цене на категорию продуктов в шаблоне прайс-листа.\n *\n * @param priceTemplateId Идентификатор шаблона прайс-листа.\n * @param productCategoryId Идентификатор категории продуктов.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_template_category_get\n */\n public getCategoryTemplatePrice(priceTemplateId: number, productCategoryId: number): Promise<IPriceTemplateCategory> {\n return this.get<IPriceTemplateCategory>(\n `/internal/price/templates/${priceTemplateId}/categories/${productCategoryId}`,\n {},\n (response) => new PriceTemplateCategory(response.data)\n );\n }\n\n /**\n * Сохраняет цену на категорию продуктов в шаблоне прайс-листа.\n *\n * @param priceTemplateId Идентификатор шаблона прайс-листа.\n * @param productCategoryId Идентификатор категории продуктов.\n * @param data Данные для сохранения цены.\n * @param recursively Признак того, что действие необходимо осуществить\n * рекурсивно для всех дочерних категорий.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_template_category_save\n */\n public saveCategoryTemplatePrice(priceTemplateId: number, productCategoryId: number, data: IPriceUpdateData, recursively: boolean = false): Promise<IPriceTemplateCategory> {\n return this.request<IPriceTemplateCategory>(\n {\n method: 'POST',\n url: `/internal/price/templates/${priceTemplateId}/categories/${productCategoryId}`,\n data: {\n price_coefficient_id: data.coefficient?.id,\n increase_percent: data.value,\n },\n params: recursively ? { recursively: true } : {},\n },\n (response) => new PriceTemplateCategory(response.data)\n );\n }\n\n /**\n * Удаляет данные о цене на категорию продуктов в шаблоне прайс-листа.\n *\n * @param priceTemplateId Идентификатор шаблона прайс-листа.\n * @param productCategoryId Идентификатор категории продуктов.\n * @param recursively Признак того, что действие необходимо осуществить\n * рекурсивно для всех дочерних категорий.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_template_category_delete\n */\n public deleteCategoryTemplatePrice(priceTemplateId: number, productCategoryId: number, recursively: boolean = false): Promise<void> {\n return this.request<never>({\n method: 'DELETE',\n url: `/internal/price/templates/${priceTemplateId}/categories/${productCategoryId}`,\n params: recursively ? { recursively: true } : {},\n });\n }\n\n /**\n * Возвращает список клиентов, привязанных к шаблону прайс-листа.\n *\n * @param priceTemplateId Идентификатор шаблона прайс-листа.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_template_clients_get_list\n */\n public getTemplateClients(priceTemplateId: number): Promise<IPriceTemplateClient[]> {\n return this.get<IPriceTemplateClient[]>(`/internal/price/templates/${priceTemplateId}/clients`, {}, (response) =>\n response.data.map((client) => new PriceTemplateClient(client))\n );\n }\n}\n","import { CategoryPricingRule } from '@sc/catalog/classes/category-pricing-rule';\nimport { PricingRole } from '@sc/catalog/classes/pricing-role';\nimport { ICategoryPricingRule } from '@sc/catalog/interfaces/i-category-pricing-rule';\nimport { ICategoryPricingRuleUpdateData } from '@sc/catalog/interfaces/i-category-pricing-rule-update-data';\nimport { IPricingRole } from '@sc/catalog/interfaces/i-pricing-role';\nimport { IPricingRoleCreateData } from '@sc/catalog/interfaces/i-pricing-role-create-data';\nimport { HttpRequester } from '@sc/http/classes/http-requester';\n\n/**\n * Предоставляет механизмы получения/управления данными о ролях ценообразования.\n */\nexport class PricingRoleProvider extends HttpRequester {\n /**\n * Возвращает список ролей ценообразования.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_roles_get_list\n */\n public getRoles(): Promise<IPricingRole[]> {\n return this.get<IPricingRole[]>('/internal/price/roles', {}, (response) => response.data.map((role) => new PricingRole(role)));\n }\n\n /**\n * Добавляет новую роль ценообразования.\n *\n * @param data Данные для создания роли ценообразования.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_roles_create\n */\n public createRole(data: IPricingRoleCreateData): Promise<IPricingRole> {\n return this.post<IPricingRole>('/internal/price/roles', data, (response) => new PricingRole(response.data));\n }\n\n /**\n * Возвращает данные роли ценообразования.\n *\n * @param id Идентификатор роли ценообразования.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_roles_get\n */\n public getRole(id: number): Promise<IPricingRole> {\n return this.get<IPricingRole>(`/internal/price/roles/${id}`, {}, (response) => new PricingRole(response.data));\n }\n\n /**\n * Обновляет данные роли ценообразования.\n *\n * @param id Идентификатор роли ценообразования.\n * @param data Данные для обновления роли ценообразования.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_roles_update\n */\n public updateRole(id: number, data: IPricingRoleCreateData): Promise<IPricingRole> {\n return this.patch<IPricingRole>(`/internal/price/roles/${id}`, data, (response) => new PricingRole(response.data));\n }\n\n /**\n * Удаляет роль ценообразования.\n *\n * @param id Идентификатор роли ценообразования.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_roles_delete\n */\n public deleteRole(id: number): Promise<void> {\n return this.delete(`/internal/price/roles/${id}`);\n }\n\n /**\n * Возвращает список правил для роли ценообразования по указанной категории.\n *\n * @param categoryId Идентификатор категории.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_roles_category_rules_get\n */\n public getCategoryRules(categoryId: number): Promise<ICategoryPricingRule[]> {\n return this.get<ICategoryPricingRule[]>(`/internal/price/roles/rules/categories/${categoryId}`, {}, (response) =>\n response.data.map((rule) => new CategoryPricingRule(rule))\n );\n }\n\n /**\n * Обновляет правила для роли ценообразования по указанной категории.\n *\n * @param categoryId Идентификатор категории.\n * @param data Данные для обновления правил.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_roles_category_rules_update\n */\n public updateCategoryRules(categoryId: number, data: ICategoryPricingRuleUpdateData): Promise<ICategoryPricingRule[]> {\n return this.patch<ICategoryPricingRule[]>(`/internal/price/roles/rules/categories/${categoryId}`, data, (response) =>\n response.data.map((rec) => new CategoryPricingRule(rec))\n );\n }\n}\n","import { Property } from '@sc/catalog/classes/property';\nimport { PropertyValue } from '@sc/catalog/classes/property-value';\nimport { IDescription, IFileUpdateData, IFileUploadData, IProperty, IPropertyCreateData, IPropertyValue, ISpecification } from '@sc/catalog/interfaces';\nimport { ICatalogItemPropertyFile } from '@sc/catalog/interfaces/i-catalog-item-property-file';\nimport { IFilterGroup } from '@sc/data-table/interfaces/i-filter-group';\nimport { IPaginationRequestParams } from '@sc/data-table/interfaces/i-pagination-request-params';\nimport { ISortRequestParams } from '@sc/data-table/interfaces/i-sort-request-params';\nimport { IPaginatedResponse } from '@sc/pagination/interfaces';\nimport { BasePaginationProvider } from '@sc/pagination/providers/base-pagination-provider';\nimport { IFile } from '@sc/system/interfaces/i-file';\n\n/**\n * Провайдер для работы со свойствами продуктов и категорий.\n */\nexport class PropertiesProvider extends BasePaginationProvider {\n /**\n * Возвращает пагинированный список свойств.\n *\n * @param filters Параметры фильтрации данных.\n * @param sortParams Параметры сортировки.\n * @param paginationParams Параметры пагинации.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_properties_get_list\n */\n public getProperties(\n filters?: IFilterGroup,\n sortParams?: ISortRequestParams[] | ISortRequestParams,\n paginationParams?: IPaginationRequestParams\n ): Promise<IPaginatedResponse<IProperty>> {\n return this.getPaginated<IProperty>('/internal/catalog/properties', filters, sortParams, paginationParams, {}, (response) => {\n const result = { ...response.data };\n\n result.data = result.data.map((propertyData: IProperty) => new Property(propertyData));\n\n return result;\n });\n }\n\n /**\n * Создает новое свойство.\n *\n * @param propertyData Данные свойства.\n * @see /doc/api/internal#/operations/api_internal_catalog_properties_create\n */\n public createProperty(propertyData: IPropertyCreateData): Promise<IProperty> {\n const { typeId, ...rest } = propertyData;\n\n return this.post<IProperty>(\n '/internal/catalog/properties',\n {\n ...rest,\n type: typeId,\n },\n (response) => new Property(response.data)\n );\n }\n\n /**\n * Возвращает свойство по идентификатору.\n *\n * @param propertyId Идентификатор свойства.\n * @see /doc/api/internal#/operations/api_internal_catalog_properties_get\n */\n public getProperty(propertyId: number): Promise<IProperty> {\n return this.get<IProperty>(`/internal/catalog/properties/${propertyId}`, {}, (response) => new Property(response.data));\n }\n\n /**\n * Обновляет существующее свойство.\n *\n * @param propertyId Идентификатор свойства.\n * @param propertyData Данные свойства.\n * @see /doc/api/internal#/operations/api_internal_catalog_properties_update\n */\n public updateProperty(propertyId: number, propertyData: IPropertyCreateData): Promise<IProperty> {\n const { typeId, ...rest } = propertyData;\n return this.patch<IProperty>(\n `/internal/catalog/properties/${propertyId}`,\n {\n ...rest,\n type: typeId,\n },\n (response) => new Property(response.data)\n );\n }\n\n /**\n * Удаляет свойство.\n *\n * @param propertyId Идентификатор свойства.\n * @see /doc/api/internal#/operations/api_internal_catalog_properties_delete\n */\n public deleteProperty(propertyId: number): Promise<void> {\n return this.delete(`/internal/catalog/properties/${propertyId}`);\n }\n\n /**\n * Возвращает список свойств продукта.\n *\n * @param productId Идентификатор продукта.\n * @see /doc/api/internal#/operations/api_internal_catalog_product_properties_get_list\n */\n public getProductProperties(productId: number): Promise<IPropertyValue[]> {\n return this.get<IPropertyValue[]>(`/internal/catalog/products/${productId}/properties`, {}, (response) => response.data.map((value) => new PropertyValue(value)));\n }\n\n /**\n * Возвращает значение свойства продукта.\n *\n * @param productId Идентификатор продукта.\n * @param propertyId Идентификатор свойства.\n * @see /doc/api/internal#/operations/api_internal_catalog_product_properties_get\n */\n public getProductProperty(productId: number, propertyId: number): Promise<IPropertyValue> {\n return this.get<IPropertyValue>(`/internal/catalog/products/${productId}/properties/${propertyId}`, {}, (response) => new PropertyValue(response.data));\n }\n\n /**\n * Обновляет значение свойства продукта.\n *\n * @param productId Идентификатор продукта.\n * @param propertyId Идентификатор свойства.\n * @param value Новое значение свойства.\n * @see /doc/api/internal#/operations/api_internal_catalog_product_properties_update\n */\n public updateProductProperty(productId: number, propertyId: number, value: IPropertyValue['value']): Promise<IPropertyValue> {\n return this.patch<IPropertyValue>(`/internal/catalog/products/${productId}/properties/${propertyId}`, { value }, (response) => new PropertyValue(response.data));\n }\n\n /**\n * Удаляет значение свойства продукта.\n *\n * @param productId Идентификатор продукта.\n * @param propertyId Идентификатор свойства.\n * @see /doc/api/internal#/operations/api_internal_catalog_product_properties_delete\n */\n public deleteProductProperty(productId: number, propertyId: number): Promise<void> {\n return this.delete(`/internal/catalog/products/${productId}/properties/${propertyId}`);\n }\n\n /**\n * Возвращает описание продукта.\n *\n * @param productId Идентификатор продукта.\n * @see /doc/api/internal#/operations/api_internal_catalog_product_description_get\n */\n public getProductDescription(productId: number): Promise<IDescription> {\n return this.get<IDescription>(`/internal/catalog/products/${productId}/properties/description`);\n }\n\n /**\n * Обновляет описание продукта.\n *\n * @param productId Идентификатор продукта.\n * @param text Текст описания в формате HTML.\n * @see /doc/api/internal#/operations/api_internal_catalog_product_description_update\n */\n public updateProductDescription(productId: number, text: string): Promise<undefined> {\n return this.patch(`/internal/catalog/products/${productId}/properties/description`, { text });\n }\n\n /**\n * Удаляет описание продукта.\n *\n * @param productId Идентификатор продукта.\n * @see /doc/api/internal#/operations/api_internal_catalog_product_description_delete\n */\n public deleteProductDescription(productId: number): Promise<void> {\n return this.delete(`/internal/catalog/products/${productId}/properties/description`);\n }\n\n /**\n * Возвращает спецификацию продукта.\n *\n * @param productId Идентификатор продукта.\n * @see /doc/api/internal#/operations/api_internal_catalog_product_specification_get\n */\n public getProductSpecification(productId: number): Promise<ISpecification> {\n return this.get<ISpecification>(`/internal/catalog/products/${productId}/properties/specification`);\n }\n\n /**\n * Обновляет спецификацию продукта.\n *\n * @param productId Идентификатор продукта.\n * @param text Текст спецификации в формате HTML.\n * @see /doc/api/internal#/operations/api_internal_catalog_product_specification_update\n */\n public updateProductSpecification(productId: number, text: string): Promise<void> {\n return this.patch(`/internal/catalog/products/${productId}/properties/specification`, { text });\n }\n\n /**\n * Удаляет спецификацию продукта.\n *\n * @param productId Идентификатор продукта.\n * @see /doc/api/internal#/operations/api_internal_catalog_product_specification_delete\n */\n public deleteProductSpecification(productId: number): Promise<void> {\n return this.delete(`/internal/catalog/products/${productId}/properties/specification`);\n }\n\n /**\n * Возвращает список файлов продукта.\n *\n * @param productId Идентификатор продукта.\n * @see /doc/api/internal#/operations/api_internal_catalog_product_files_get_list\n */\n public getProductFiles(productId: number): Promise<ICatalogItemPropertyFile[]> {\n return this.get<ICatalogItemPropertyFile[]>(`/internal/catalog/products/${productId}/properties/files`);\n }\n\n /**\n * Добавляет файл к продукту.\n *\n * @param productId Идентификатор продукта.\n * @param fileData Данные загружаемого файла.\n * @see /doc/api/internal#/operations/api_internal_catalog_product_files_create\n */\n public addProductFile(productId: number, fileData: IFileUploadData): Promise<ICatalogItemPropertyFile> {\n return this.post<ICatalogItemPropertyFile>(`/internal/catalog/products/${productId}/properties/files`, fileData);\n }\n\n /**\n * Обновляет файл продукта.\n *\n * @param productId Идентификатор продукта.\n * @param fileId Идентификатор файла.\n * @param fileData Данные файла.\n * @see /doc/api/internal#/operations/api_internal_catalog_product_files_update\n */\n public updateProductFile(productId: number, fileId: number, fileData: IFileUpdateData): Promise<ICatalogItemPropertyFile> {\n return this.patch<ICatalogItemPropertyFile>(`/internal/catalog/products/${productId}/properties/files/${fileId}`, fileData);\n }\n\n /**\n * Удаляет файл продукта.\n *\n * @param productId Идентификатор продукта.\n * @param fileId Идентификатор файла.\n * @see /doc/api/internal#/operations/api_internal_catalog_products_slug_save\n */\n public deleteProductFile(productId: number, fileId: number): Promise<void> {\n return this.delete(`/internal/catalog/products/${productId}/properties/files/${fileId}`);\n }\n\n /**\n * Обновляет URL-slug продукта.\n *\n * @param productId Идентификатор продукта.\n * @param slug Новый URL-slug.\n * @see /doc/api/internal#/operations/api_internal_catalog_product_slug_update\n */\n public updateProductSlug(productId: number, slug: string): Promise<void> {\n return this.patch(`/internal/catalog/products/${productId}/properties/slug`, { slug });\n }\n\n /**\n * Возвращает список свойств категории.\n *\n * @param categoryId Идентификатор категории.\n * @see /doc/api/internal#/operations/api_internal_catalog_category_properties_get_list\n */\n public getCategoryProperties(categoryId: number): Promise<IPropertyValue[]> {\n return this.get<IPropertyValue[]>(`/internal/catalog/categories/${categoryId}/properties`, {}, (response) => response.data.map((value) => new PropertyValue(value)));\n }\n\n /**\n * Возвращает значение свойства категории.\n *\n * @param categoryId Идентификатор категории.\n * @param propertyId Идентификатор свойства.\n * @see /doc/api/internal#/operations/api_internal_catalog_category_properties_get\n */\n public getCategoryProperty(categoryId: number, propertyId: number): Promise<IPropertyValue> {\n return this.get<IPropertyValue>(`/internal/catalog/categories/${categoryId}/properties/${propertyId}`, {}, (response) => new PropertyValue(response.data));\n }\n\n /**\n * Обновляет значение свойства категории.\n *\n * @param categoryId Идентификатор категории.\n * @param propertyId Идентификатор свойства.\n * @param value Новое значение свойства.\n * @see /doc/api/internal#/operations/api_internal_catalog_category_properties_update\n */\n public updateCategoryProperty(categoryId: number, propertyId: number, value: IPropertyValue['value']): Promise<IPropertyValue> {\n return this.patch<IPropertyValue>(`/internal/catalog/categories/${categoryId}/properties/${propertyId}`, { value }, (response) => new PropertyValue(response.data));\n }\n\n /**\n * Удаляет значение свойства категории.\n *\n * @param categoryId Идентификатор категории.\n * @param propertyId Идентификатор свойства.\n * @see /doc/api/internal#/operations/api_internal_catalog_category_properties_delete\n */\n public deleteCategoryProperty(categoryId: number, propertyId: number): Promise<void> {\n return this.delete(`/internal/catalog/categories/${categoryId}/properties/${propertyId}`);\n }\n\n /**\n * Возвращает описание категории.\n *\n * @param categoryId Идентификатор категории.\n * @see /doc/api/internal#/operations/api_internal_catalog_category_description_get\n */\n public getCategoryDescription(categoryId: number): Promise<IDescription> {\n return this.get<IDescription>(`/internal/catalog/categories/${categoryId}/properties/description`);\n }\n\n /**\n * Обновляет описание категории.\n *\n * @param categoryId Идентификатор категории.\n * @param text Текст описания в формате HTML.\n * @see /doc/api/internal#/operations/api_internal_catalog_category_description_update\n */\n public updateCategoryDescription(categoryId: number, text: string): Promise<void> {\n return this.patch(`/internal/catalog/categories/${categoryId}/properties/description`, { text });\n }\n\n /**\n * Удаляет описание категории.\n *\n * @param categoryId Идентификатор категории.\n * @see /doc/api/internal#/operations/api_internal_catalog_category_description_delete\n */\n public deleteCategoryDescription(categoryId: number): Promise<void> {\n return this.delete(`/internal/catalog/categories/${categoryId}/properties/description`);\n }\n\n /**\n * Возвращает спецификацию категории.\n *\n * @param categoryId Идентификатор категории.\n * @see /doc/api/internal#/operations/api_internal_catalog_category_specification_get\n */\n public getCategorySpecification(categoryId: number): Promise<ISpecification> {\n return this.get<ISpecification>(`/internal/catalog/categories/${categoryId}/properties/specification`);\n }\n\n /**\n * Обновляет спецификацию категории.\n *\n * @param categoryId Идентификатор категории.\n * @param text Текст спецификации в формате HTML.\n * @see /doc/api/internal#/operations/api_internal_catalog_category_specification_update\n */\n public updateCategorySpecification(categoryId: number, text: string): Promise<void> {\n return this.patch(`/internal/catalog/categories/${categoryId}/properties/specification`, { text });\n }\n\n /**\n * Удаляет спецификацию категории.\n *\n * @param categoryId Идентификатор категории.\n * @see /doc/api/internal#/operations/api_internal_catalog_category_specification_delete\n */\n public deleteCategorySpecification(categoryId: number): Promise<void> {\n return this.delete(`/internal/catalog/categories/${categoryId}/properties/specification`);\n }\n\n /**\n * Возвращает список файлов категории.\n *\n * @param categoryId Идентификатор категории.\n * @see /doc/api/internal#/operations/api_internal_catalog_category_files_get_list\n */\n public getCategoryFiles(categoryId: number): Promise<ICatalogItemPropertyFile[]> {\n return this.get<ICatalogItemPropertyFile[]>(`/internal/catalog/categories/${categoryId}/properties/files`);\n }\n\n /**\n * Добавляет файл к категории.\n *\n * @param categoryId Идентификатор категории.\n * @param fileData Данные загружаемого файла.\n * @see /doc/api/internal#/operations/api_internal_catalog_category_files_create\n */\n public addCategoryFile(categoryId: number, fileData: IFileUploadData): Promise<ICatalogItemPropertyFile> {\n return this.post<ICatalogItemPropertyFile>(`/internal/catalog/categories/${categoryId}/properties/files`, fileData);\n }\n\n /**\n * Обновляет файл категории.\n *\n * @param categoryId Идентификатор категории.\n * @param fileId Идентификатор файла.\n * @param fileData Данные для обновления файла.\n * @see /doc/api/internal#/operations/api_internal_catalog_category_files_update\n */\n public updateCategoryFile(categoryId: number, fileId: number, fileData: IFileUpdateData): Promise<ICatalogItemPropertyFile> {\n return this.patch<ICatalogItemPropertyFile>(`/internal/catalog/categories/${categoryId}/properties/files/${fileId}`, fileData);\n }\n\n /**\n * Удаляет файл категории.\n *\n * @param categoryId Идентификатор категории.\n * @param fileId Идентификатор файла.\n * @see /doc/api/internal#/operations/api_internal_catalog_category_files_delete\n */\n public deleteCategoryFile(categoryId: number, fileId: number): Promise<void> {\n return this.delete(`/internal/catalog/categories/${categoryId}/properties/files/${fileId}`);\n }\n\n /**\n * Обновляет URL-slug категории.\n *\n * @param categoryId Идентификатор категории.\n * @param slug Новый URL-slug.\n * @see /doc/api/internal#/operations/api_internal_catalog_categories_slug_save\n */\n public updateCategorySlug(categoryId: number, slug: string): Promise<void> {\n return this.patch(`/internal/catalog/categories/${categoryId}/properties/slug`, { slug });\n }\n\n /**\n * Обновляет изображение категории.\n *\n * @param categoryId Идентификатор категории.\n * @param fileData Данные загружаемого файла.\n * @see /doc/api/internal#/operations/api_internal_catalog_categories_image_save\n */\n public updateCategoryImage(categoryId: number, fileData: IFile): Promise<void> {\n return this.post(`/internal/catalog/categories/${categoryId}/image`, { image: fileData });\n }\n}\n","/* eslint-disable lodash/prefer-lodash-method */\n\nimport { ICategory } from '@sc/catalog/interfaces/i-category';\nimport { IProduct } from '@sc/catalog/interfaces/i-product';\nimport { ICatalogableItem } from '@sc/system/interfaces/i-catalogable-item';\nimport { CatalogableItemType } from '@sc/system/types/catalogable-item-type';\n\n/**\n * Рекурсивный поиск товара в каталоге по id.\n *\n * @param items Массив элементов каталога для поиска.\n * @param id Идентификатор товара.\n * @param type Тип элемента каталога (product).\n */\n// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters\nfunction findCatalogItemByIdRecursive<T extends IProduct = IProduct>(items: ICatalogableItem[], id: number, type: 'product'): T | undefined;\n\n/**\n * Рекурсивный поиск категории в каталоге по id.\n *\n * @param items Массив элементов каталога для поиска.\n * @param id Идентификатор категории.\n * @param type Тип элемента каталога (category).\n */\n// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters, @typescript-eslint/unified-signatures\nfunction findCatalogItemByIdRecursive<T extends ICategory = ICategory>(items: ICatalogableItem[], id: number, type: 'category'): T | undefined;\n\n/**\n * Рекурсивный поиск элемента каталога по id и типу.\n *\n * @param items Массив элементов каталога для поиска.\n * @param id Идентификатор элемента.\n * @param type Тип элемента каталога (product или category).\n */\n// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters, @typescript-eslint/unified-signatures\nfunction findCatalogItemByIdRecursive<T extends ICatalogableItem = ICatalogableItem>(items: ICatalogableItem[], id: number, type: CatalogableItemType): T | undefined;\n\n/**\n * Рекурсивный поиск элемента каталога по id и типу.\n *\n * @param items Массив элементов каталога для поиска.\n * @param id Идентификатор элемента.\n * @param type Тип элемента каталога.\n */\nfunction findCatalogItemByIdRecursive<T extends ICatalogableItem = ICatalogableItem>(items: ICatalogableItem[], id: number, type: CatalogableItemType): T | undefined {\n let result: T | undefined;\n\n items.some((item) => {\n // Проверяем тип и id элемента.\n if (item.type === type && item.id === id) {\n result = item as T;\n\n return true;\n }\n\n if (item.type === 'product') {\n return false;\n }\n\n const category = item as ICategory;\n\n // Рекурсивный поиск в продуктах категории.\n if (category.products && category.products.length > 0) {\n const foundInProducts = findCatalogItemByIdRecursive<T>(category.products, id, type);\n\n if (foundInProducts) {\n result = foundInProducts;\n\n return true;\n }\n }\n\n // Рекурсивный поиск в дочерних категориях.\n if (category.categories && category.categories.length > 0) {\n const foundInChildren = findCatalogItemByIdRecursive<T>(category.categories, id, type);\n\n if (foundInChildren) {\n result = foundInChildren;\n\n return true;\n }\n }\n\n return false;\n });\n\n return result;\n}\n\nexport { findCatalogItemByIdRecursive };\n","import { ICatalogableItem } from '../../system/interfaces/i-catalogable-item';\nimport { ICategory } from '../interfaces/i-category';\n\n/**\n * Преобразует иерархическую структуру каталога в плоский список всех элементов.\n *\n * @param items Массив элементов каталога для преобразования.\n */\nexport function flattenCatalogItems(items: ICatalogableItem[]): ICatalogableItem[] {\n const result: ICatalogableItem[] = [];\n\n items.forEach((item) => {\n // Добавляем текущий элемент в результат.\n result.push(item);\n\n // Если это категория, рекурсивно обрабатываем её дочерние элементы.\n if (item.type === 'category') {\n const category = item as ICategory;\n\n // Добавляем все продукты категории.\n if (category.products && category.products.length > 0) {\n result.push(...flattenCatalogItems(category.products));\n }\n\n // Рекурсивно обрабатываем дочерние категории.\n if (category.categories && category.categories.length > 0) {\n result.push(...flattenCatalogItems(category.categories));\n }\n }\n });\n\n return result;\n}\n","/* eslint-disable no-shadow */\n\n/**\n * Список типов дополнительно запрашиваемых данных клиента.\n */\nexport enum ClientsAdditionalDataRequestTypeEnum {\n /**\n * Данные последнего заказа клиента.\n */\n LastOrder = 'last_order',\n\n /**\n * Список контактных лиц клиента.\n */\n Contacts = 'contacts',\n\n /**\n * Список групп партнеров клиента.\n */\n PartnerGroups = 'partner_groups',\n\n /**\n * Предпочитаемый тип доставки клиента.\n */\n PreferredDeliveryType = 'preferred_delivery_type',\n\n /**\n * Направление продаж.\n */\n SalesDirection = 'sales_direction',\n\n /**\n * Список менеджеров.\n */\n Managers = 'managers',\n}\n","/* eslint-disable no-unused-vars, no-shadow */\n\n/**\n * Перечисление типов организационно-правовых форм контрагентов.\n */\nexport enum OpfEnum {\n /**\n * Физическое лицо.\n */\n Person = 'individual',\n\n /**\n * Индивидуальный предприниматель.\n */\n Ic = 'entrepreneur',\n\n /**\n * Юридическое лицо - резидент.\n */\n UlR = 'legal',\n\n /**\n * Юридическое лицо - нерезидент.\n */\n UlNr = 'non_resident_legal',\n}\n","import { Reference } from '@sc/system/classes/reference';\nimport { IReference } from '@sc/system/interfaces/i-reference';\n\n/**\n * Данные записи из справочника.\n */\nexport class AnyReference extends Reference implements IReference {}\n","import { IChannelPrimaryInterest } from '@sc/references/interfaces/i-channel-primary-interest';\nimport { Reference } from '@sc/system/classes/reference';\n\n/**\n * Данные о канале первичного интереса.\n */\nexport class ChannelPrimaryInterest extends Reference implements IChannelPrimaryInterest {}\n","import { ICity } from '@sc/references/interfaces/i-city';\nimport { Reference } from '@sc/system/classes/reference';\n\n/**\n * Данные о городе.\n */\nexport class City extends Reference implements ICity {}\n","import { IContactPosition } from '@sc/references/interfaces/i-contact-position';\nimport { Reference } from '@sc/system/classes/reference';\n\n/**\n * Должность контактного лица.\n */\nexport class ContactPosition extends Reference implements IContactPosition {}\n","/* eslint-disable @typescript-eslint/no-unnecessary-condition */\n\nimport { ICurrency } from '@sc/references/interfaces/i-currency';\nimport { NamedIdentity } from '@sc/system/classes';\n\n/**\n * Данные о валюте.\n */\nexport class Currency extends NamedIdentity implements ICurrency {\n /**\n * Сигнатура валюты.\n */\n public signature: string = '';\n\n /**\n * Символ валюты.\n */\n public symbol: string = '';\n\n /**\n * Инициализирует экземпляр класса {@link Currency}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: ICurrency) {\n super(data);\n\n if (data) {\n this.signature = data.signature ?? '';\n this.symbol = data.symbol ?? '';\n }\n }\n}\n","import { OpfEnum } from '@sc/clients/enums/opf-enum';\nimport { IOpf } from '@sc/references/interfaces/i-opf';\nimport { Reference } from '@sc/system/classes/reference';\n\n/**\n * Данные об организационно-правовой форме.\n */\nexport class Opf extends Reference<OpfEnum> implements IOpf {\n /**\n * Возвращает сгенерированную запись-описание физического лица.\n */\n public static generatePersonItem(): IOpf {\n return new Opf({\n id: 1,\n guid: '',\n slug: OpfEnum.Person,\n name: '',\n } as IOpf);\n }\n}\n","import { IOrderPaymentStatus } from '@sc/references/interfaces/i-order-payment-status';\nimport { Reference } from '@sc/system/classes/reference';\n\n/**\n * Данные о статусе оплаты заказа.\n */\nexport class OrderPaymentStatus extends Reference implements IOrderPaymentStatus {}\n","import { IOrderStatus } from '@sc/references/interfaces/i-order-status';\nimport { Reference } from '@sc/system/classes/reference';\n\n/**\n * Данные о статусе заказа.\n */\nexport class OrderStatus extends Reference implements IOrderStatus {}\n","import { IPartnerGroup } from '@sc/references/interfaces/i-partner-group';\nimport { Reference } from '@sc/system/classes/reference';\n\n/**\n * Группа партнеров (направление деятельности).\n */\nexport class PartnerGroup extends Reference implements IPartnerGroup {}\n","import { IPaymentType } from '@sc/references/interfaces/i-payment-type';\nimport { Reference } from '@sc/system/classes/reference';\n\n/**\n * Данные о типе оплаты заказа.\n */\nexport class PaymentType extends Reference implements IPaymentType {}\n","import { IProductFileType } from '@sc/references/interfaces/i-product-file-type';\nimport { Reference } from '@sc/system/classes/reference';\n\n/**\n * Данные о типах файлов продуктов/категорий.\n */\nexport class ProductFileType extends Reference implements IProductFileType {}\n","import { IResourceType } from '@sc/references/interfaces/i-resource-type';\nimport { Reference } from '@sc/system/classes/reference';\n\n/**\n * Данные о типе ресурса.\n */\nexport class ResourceType extends Reference implements IResourceType {}\n","import { ISourcePrimaryInterest } from '@sc/references/interfaces/i-source-primary-interest';\nimport { Reference } from '@sc/system/classes/reference';\n\n/**\n * Данные об источнике первичного интереса.\n */\nexport class SourcePrimaryInterest extends Reference implements ISourcePrimaryInterest {}\n","/* eslint-disable @typescript-eslint/no-unnecessary-condition */\n\nimport { IBankAccount } from '@sc/clients/interfaces';\nimport { Currency } from '@sc/references/classes';\nimport { ICurrency } from '@sc/references/interfaces';\nimport { Identity } from '@sc/system/classes';\n\n/**\n * Данные о банковском счёте контрагента.\n */\nexport class BankAccount extends Identity implements IBankAccount {\n /**\n * Наименование банка.\n */\n public bankName: string = '';\n\n /**\n * Банковский идентификационный код ЦБ РФ (БИК).\n */\n public bic: string = '';\n\n /**\n * Номер счёта.\n */\n public accountNumber: string = '';\n\n /**\n * Корреспондентский счет в ЦБ РФ.\n */\n public correspondentAccount: string = '';\n\n /**\n * Данные о валюте.\n */\n public currency: ICurrency = new Currency();\n\n /**\n * Инициализирует экземпляр класса {@link BankAccount}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IBankAccount) {\n super(data);\n\n if (data) {\n this.bankName = data.bankName ?? '';\n this.bic = data.bic ?? '';\n this.accountNumber = data.accountNumber ?? '';\n this.correspondentAccount = data.correspondentAccount ?? '';\n this.currency = new Currency(data.currency);\n }\n }\n}\n","import { IContact } from '@sc/contacts/interfaces/i-contact';\nimport { NamedIdentity } from '@sc/system/classes/named-identity';\n\n/**\n * Полные данные контакта.\n */\nexport class Contact extends NamedIdentity implements IContact {\n /**\n * Номер телефона. В формате \"79203436527\" или \"+79203436527\".\n */\n public phone?: string;\n\n /**\n * Адрес электронной почты.\n */\n public email?: string;\n\n /**\n * Инициализирует экземпляр класса {@link Contact}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IContact) {\n super(data);\n\n this.email = data?.email;\n this.phone = /^\\d+$/.test(data?.phone ?? '') ? `+${data?.phone}` : data?.phone;\n }\n}\n","import { Contact } from '@sc/contacts/classes/contact';\nimport { IContactPerson } from '@sc/contacts/interfaces/i-contact-person';\nimport { parseISO } from 'date-fns';\nimport { isString } from 'lodash-es';\n\n/**\n * Данные о контактном лице.\n */\nexport class ContactPerson extends Contact implements IContactPerson {\n /**\n * Признак того, что контакт является основным.\n */\n public isPrimary?: boolean;\n\n /**\n * Должность контактного лица.\n */\n public position?: string;\n\n /**\n * Признак, что контактное лицо не нужно беспокоить.\n */\n public notDisturb?: boolean;\n\n /**\n * Комментарий к контактному лицу.\n */\n public comment?: string;\n\n /**\n * Дата и время последнего изменения.\n */\n public updatedAt?: Date;\n\n /**\n * Дата и время последнего удаления.\n */\n public deletedAt?: Date;\n\n /**\n * Инициализирует экземпляр класса {@link ContactPerson}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IContactPerson) {\n super(data);\n\n this.isPrimary = data?.isPrimary ?? false;\n this.position = data?.position;\n this.notDisturb = data?.notDisturb ?? false;\n this.comment = data?.comment;\n this.updatedAt = data?.updatedAt;\n this.deletedAt = isString(data?.deletedAt) ? parseISO(data.deletedAt) : data?.deletedAt;\n }\n}\n","/* eslint-disable @typescript-eslint/no-unnecessary-condition */\n\nimport { BankAccount } from '@sc/clients/classes/bank-account';\nimport { IContragentBase } from '@sc/clients/interfaces/contragent/i-contragent-base';\nimport { IBankAccount } from '@sc/clients/interfaces/i-bank-account';\nimport { ContactPerson } from '@sc/contacts/classes/contact-person';\nimport { IContactPerson } from '@sc/contacts/interfaces/i-contact-person';\nimport { ManagerCommon } from '@sc/managers/classes/manager-common';\nimport { IManagerCommon } from '@sc/managers/interfaces/i-manager-common';\nimport { Opf, PartnerGroup, SalesDirection } from '@sc/references/classes';\nimport { IOpf, IPartnerGroup, ISalesDirection } from '@sc/references/interfaces';\nimport { NamedIdentity } from '@sc/system/classes/named-identity';\nimport { UserShortInfo } from '@sc/user/classes/user-short-info';\nimport { IUserShortInfo } from '@sc/user/interfaces/i-user-short-info';\nimport { parseISO } from 'date-fns';\nimport { isString } from 'lodash-es';\n\n/**\n * Базовые данные о контрагенте.\n */\nexport abstract class ContragentBase extends NamedIdentity implements IContragentBase {\n /**\n * Данные о менеджере.\n */\n public manager: IManagerCommon = new ManagerCommon();\n\n /**\n * Данные об организационно-правовой форме.\n */\n public opf: IOpf = Opf.generatePersonItem();\n\n /**\n * Направление продаж.\n */\n public salesDirection: ISalesDirection = new SalesDirection();\n\n /**\n * Группа партнеров (направление деятельности).\n */\n public partnerGroup: IPartnerGroup = new PartnerGroup();\n\n /**\n * Список контактных лиц контрагента.\n */\n public contacts: IContactPerson[] = [] as IContactPerson[];\n\n /**\n * Список банковских счетов контрагента.\n */\n public bankAccounts: IBankAccount[] = [] as IBankAccount[];\n\n /**\n * Комментарий к контрагенту.\n */\n public comment?: string;\n\n /**\n * Альтернативное название контрагента.\n */\n public alternativeName?: string;\n\n /**\n * Дата и время создания записи.\n */\n public createdAt?: Date;\n\n /**\n * Данные пользователя, создавшего запись.\n */\n public creator?: IUserShortInfo;\n\n /**\n * Дата и время последнего изменения данных.\n */\n public updatedAt?: Date;\n\n /**\n * Данные пользователя, который внес последние изменения в запись.\n */\n public updater?: IUserShortInfo;\n\n /**\n * Инициализирует экземпляр класса {@link ContragentBase}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n // eslint-disable-next-line sonarjs/cognitive-complexity\n protected constructor(data?: IContragentBase) {\n super(data);\n\n if (data) {\n this.opf = new Opf(data.opf);\n this.salesDirection = new SalesDirection(data.salesDirection);\n this.comment = data.comment;\n this.alternativeName = data.alternativeName;\n this.createdAt = isString(data?.createdAt) ? parseISO(data.createdAt) : data.createdAt;\n this.creator = data.creator ? new UserShortInfo(data.creator) : undefined;\n this.updatedAt = isString(data?.updatedAt) ? parseISO(data.updatedAt) : data.updatedAt;\n this.updater = data.updater ? new UserShortInfo(data.updater) : undefined;\n\n if (data.partnerGroup) {\n this.partnerGroup = new PartnerGroup(data.partnerGroup);\n }\n\n if (data.manager) {\n this.manager = new ManagerCommon(data.manager);\n }\n\n if (data.contacts) {\n const contactsList = [] as IContactPerson[];\n data.contacts.forEach((value) => {\n contactsList.push(new ContactPerson(value));\n });\n this.contacts = contactsList;\n }\n\n if (data.bankAccounts) {\n const contactsList = [] as IBankAccount[];\n data.bankAccounts.forEach((value) => {\n contactsList.push(new BankAccount(value));\n });\n this.bankAccounts = contactsList;\n }\n }\n }\n}\n","import { IContragentPerson } from '@sc/clients/interfaces/contragent';\n\nimport { ContragentBase } from './contragent-base';\n\n/**\n * Данные о контрагенте - физическом лице.\n */\nexport class ContragentPerson extends ContragentBase implements IContragentPerson {\n /**\n * Инициализирует экземпляр класса {@link ContragentPerson}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IContragentPerson) {\n super(data);\n }\n}\n","/* eslint-disable @typescript-eslint/no-unnecessary-condition */\n\nimport { IContragentIc } from '../../interfaces';\nimport { ContragentBase } from './contragent-base';\n\n/**\n * Данные о контрагенте - индивидуальном предпринимателе.\n */\nexport class ContragentIc extends ContragentBase implements IContragentIc {\n /**\n * ИНН.\n */\n public inn: string = '';\n\n /**\n * Код ОКПО.\n */\n public okpo: string = '';\n\n /**\n * ФИО руководителя.\n */\n public directorName: string = '';\n\n /**\n * Должность руководителя.\n */\n public directorPosition: string = '';\n\n /**\n * Основания полномочий руководителя.\n */\n public directorActsOn: string = '';\n\n /**\n * Юридический адрес.\n */\n public legalAddress: string = '';\n\n /**\n * Почтовый адрес.\n */\n public postalAddress: string = '';\n\n /**\n * Фактический адрес.\n */\n public actualAddress: string = '';\n\n /**\n * Инициализирует экземпляр класса {@link ContragentIc}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IContragentIc) {\n super(data);\n\n if (data) {\n this.inn = data.inn ?? '';\n this.okpo = data.okpo ?? '';\n this.directorName = data.directorName ?? '';\n this.directorPosition = data.directorPosition ?? '';\n this.directorActsOn = data.directorActsOn ?? '';\n this.legalAddress = data.legalAddress ?? '';\n this.postalAddress = data.postalAddress ?? '';\n this.actualAddress = data.actualAddress ?? '';\n }\n }\n}\n","/* eslint-disable @typescript-eslint/no-unnecessary-condition */\n\nimport { IContragentUlR } from '@sc/clients/interfaces/contragent';\n\nimport { ContragentIc } from './contragent-ic';\n\n/**\n * Данные о контрагенте - юридическом лице, резиденте.\n */\nexport class ContragentUlR extends ContragentIc implements IContragentUlR {\n /**\n * КПП организации.\n */\n public kpp: string = '';\n\n /**\n * Инициализирует экземпляр класса {@link ContragentUlR}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IContragentUlR) {\n super(data);\n\n if (data) {\n this.kpp = data.kpp ?? '';\n }\n }\n}\n","/* eslint-disable @typescript-eslint/no-unnecessary-condition */\n\nimport { IContragentUlNr } from '@sc/clients/interfaces/contragent';\nimport { Country } from '@sc/references/classes';\nimport { ICountry } from '@sc/references/interfaces';\n\nimport { ContragentUlR } from './contragent-ul-r';\n\n/**\n * Данные о контрагенте - юридическом лице, нерезиденте.\n */\nexport class ContragentUlNr extends ContragentUlR implements IContragentUlNr {\n /**\n * Страна регистрации юридического лица нерезидента.\n */\n public registrationCountry: ICountry = new Country();\n\n /**\n * Регистрационный номер юридического лица нерезидента.\n */\n public registrationNumber: string = '';\n\n /**\n * Налоговый номер юридического лица нерезидента.\n */\n public taxNumber: string = '';\n\n /**\n * Инициализирует экземпляр класса {@link ContragentUlNr}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IContragentUlNr) {\n super(data);\n\n if (data) {\n this.registrationCountry = new Country(data.registrationCountry);\n this.registrationNumber = data.registrationNumber ?? '';\n this.taxNumber = data.taxNumber ?? '';\n }\n }\n}\n","import { OpfEnum } from '@sc/clients/enums';\nimport { IContragentBase, IContragentIc, IContragentPerson, IContragentUlNr, IContragentUlR } from '@sc/clients/interfaces/contragent';\n\nimport { ContragentIc } from './contragent-ic';\nimport { ContragentPerson } from './contragent-person';\nimport { ContragentUlNr } from './contragent-ul-nr';\nimport { ContragentUlR } from './contragent-ul-r';\n\n/**\n * Фабрика создания экземпляров классов с данными о контрагентах.\n */\nexport class ContragentFactory {\n /**\n * Инициализирует и возвращает экземпляр класса с данными о контрагенте.\n *\n * @param data Данные для инициализации.\n */\n public static createInstance(data: IContragentBase): ContragentPerson | ContragentIc | ContragentUlR | ContragentUlNr {\n switch (data.opf.slug) {\n case OpfEnum.Ic:\n return new ContragentIc(data as IContragentIc);\n case OpfEnum.UlR:\n return new ContragentUlR(data as IContragentUlR);\n case OpfEnum.UlNr:\n return new ContragentUlNr(data as IContragentUlNr);\n default:\n return new ContragentPerson(data as IContragentPerson);\n }\n }\n}\n","import { IContactRelation } from '@sc/contacts/interfaces/i-contact-relation';\nimport { Identity } from '@sc/system/classes/identity';\n\n/**\n * Данные об отношении контактного лица с данными о клиенте.\n */\nexport class ContactRelation extends Identity implements IContactRelation {\n /**\n * Признак того, что контакт является основным.\n */\n public isPrimary?: boolean;\n\n /**\n * Инициализирует экземпляр класса {@link ContactRelation}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data: IContactRelation) {\n super(data);\n\n this.isPrimary = data.isPrimary;\n }\n}\n","/* eslint-disable @typescript-eslint/no-unnecessary-condition */\n\nimport { ContactPerson } from '@sc/contacts/classes/contact-person';\nimport { ContactRelation } from '@sc/contacts/classes/contact-relation';\nimport { IContactPersonRelated } from '@sc/contacts/interfaces/i-contact-person-related';\nimport { IContactRelation } from '@sc/contacts/interfaces/i-contact-relation';\n\n/**\n * Данные о контактном лице и его связях с данными о клиенте.\n */\nexport class ContactPersonRelated extends ContactPerson implements IContactPersonRelated {\n /**\n * Список связей контактного лица с сущностями.\n */\n public relations = {\n /**\n * Список клиентов, с которыми связано контактное лицо.\n */\n clients: [] as IContactRelation[],\n\n /**\n * Список контрагентов, с которыми связано контактное лицо.\n */\n contragents: [] as IContactRelation[],\n\n /**\n * Список адресов доставки, с которыми связано контактное лицо.\n */\n addresses: [] as IContactRelation[],\n };\n\n /**\n * Инициализирует экземпляр класса {@link ContactPersonRelated}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data: IContactPersonRelated) {\n super(data);\n\n if (data.relations) {\n if (data.relations.addresses) {\n this.relations.addresses = data.relations.addresses.map((item: IContactRelation) => new ContactRelation(item));\n }\n\n if (data.relations.clients) {\n this.relations.clients = data.relations.clients.map((item: IContactRelation) => new ContactRelation(item));\n }\n\n if (data.relations.contragents) {\n this.relations.contragents = data.relations.contragents.map((item: IContactRelation) => new ContactRelation(item));\n }\n }\n }\n}\n","/* eslint-disable @typescript-eslint/no-unnecessary-condition */\n\nimport { IDeliveryAddress } from '@sc/clients/interfaces';\nimport { ContactPerson } from '@sc/contacts/classes';\nimport { IContactPerson } from '@sc/contacts/interfaces';\nimport { GeoCoordinates } from '@sc/geo/classes';\nimport { IGeoCoordinates } from '@sc/geo/interfaces';\nimport { DeletableNamedIdentity } from '@sc/system/classes/deletable-named-identity';\n\n/**\n * Данные об адресе доставки клиента.\n */\nexport class DeliveryAddress extends DeletableNamedIdentity implements IDeliveryAddress {\n /**\n * Адрес.\n */\n address: string = '';\n\n /**\n * Координаты.\n */\n coordinates?: IGeoCoordinates;\n\n /**\n * Данные о контактных лицах.\n */\n contacts: IContactPerson[];\n\n /**\n * Комментарий к адресу доставки клиента.\n */\n public comment?: string;\n\n /**\n * Данные о времени работы.\n */\n public operatingHours?: {\n /**\n * Время работы, с (в формате ЧЧ:ММ).\n */\n from: string;\n\n /**\n * Время работы, до (в формате ЧЧ:ММ).\n */\n to: string;\n };\n\n /**\n * Признак одноразового адреса (адрес, который удаляется после завершения заказа).\n */\n public isOneTime?: boolean;\n\n /**\n * Признак того, что указанный адрес является адресом транспортной компании.\n */\n public isTransportCompanyAddress?: boolean;\n\n /**\n * Инициализирует экземпляр класса {@link DeliveryAddress}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IDeliveryAddress) {\n super(data);\n\n this.address = data?.address ?? '';\n this.coordinates = new GeoCoordinates(data?.coordinates);\n this.contacts = data?.contacts?.map((c) => new ContactPerson(c)) ?? [];\n this.comment = data?.comment;\n this.operatingHours = data?.operatingHours;\n this.isOneTime = data?.isOneTime;\n this.isTransportCompanyAddress = data?.isTransportCompanyAddress;\n }\n}\n","/* eslint-disable @typescript-eslint/no-unnecessary-condition */\n\nimport { ClientShortInfo } from '@sc/clients/classes/client-short-info';\nimport { ContragentFactory } from '@sc/clients/classes/contragent/contragent-factory';\nimport { DeliveryAddress } from '@sc/clients/classes/delivery-address';\nimport { IContragentIc, IContragentPerson, IContragentUlNr, IContragentUlR } from '@sc/clients/interfaces/contragent';\nimport { IClient } from '@sc/clients/interfaces/i-client';\nimport { IDeliveryAddress } from '@sc/clients/interfaces/i-delivery-address';\nimport { ContactPerson } from '@sc/contacts/classes/contact-person';\nimport { IContactPerson } from '@sc/contacts/interfaces/i-contact-person';\nimport { ChannelPrimaryInterest, DeliveryType, PartnerGroup, SourcePrimaryInterest, Warehouse } from '@sc/references/classes';\nimport { IChannelPrimaryInterest, IDeliveryType, IPartnerGroup, ISourcePrimaryInterest, IWarehouse } from '@sc/references/interfaces';\n\n/**\n * Данные о клиенте.\n */\nexport class Client extends ClientShortInfo implements IClient {\n /**\n * @inheritDoc\n */\n public contragents: Array<IContragentPerson | IContragentIc | IContragentUlR | IContragentUlNr>;\n\n /**\n * @inheritDoc\n */\n public partnerGroups: IPartnerGroup[];\n\n /**\n * @inheritDoc\n */\n public contacts: IContactPerson[];\n\n /**\n * @inheritDoc\n */\n public deliveryAddresses: IDeliveryAddress[];\n\n /**\n * @inheritDoc\n */\n public channelPrimaryInterest: IChannelPrimaryInterest;\n\n /**\n * @inheritDoc\n */\n public sourcePrimaryInterest: ISourcePrimaryInterest;\n\n /**\n * @inheritDoc\n */\n public preferredDeliveryType: IDeliveryType;\n\n /**\n * @inheritDoc\n */\n public primaryDemand?: string;\n\n /**\n * @inheritDoc\n */\n public isExcludedFromMsCallsToClients?: boolean;\n\n /**\n * @inheritDoc\n */\n public reasonExcludedFromMsCallsToClients?: string;\n\n /**\n * @inheritDoc\n */\n public preferredWarehouse?: IWarehouse;\n\n /**\n * @inheritDoc\n */\n public extraData?: Record<string, unknown>;\n\n /**\n * Инициализирует экземпляр класса {@link Client}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n // eslint-disable-next-line sonarjs/cognitive-complexity\n public constructor(data?: IClient) {\n super(data);\n\n this.contragents = data?.contragents?.map((c) => ContragentFactory.createInstance(c)) ?? [];\n this.partnerGroups = data?.partnerGroups?.map((pg) => new PartnerGroup(pg)) ?? [];\n this.contacts = data?.contacts?.map((c) => new ContactPerson(c)) ?? [];\n this.deliveryAddresses = data?.deliveryAddresses?.map((da) => new DeliveryAddress(da)) ?? [];\n this.channelPrimaryInterest = new ChannelPrimaryInterest(data?.channelPrimaryInterest);\n this.sourcePrimaryInterest = new SourcePrimaryInterest(data?.sourcePrimaryInterest);\n this.preferredDeliveryType = new DeliveryType(data?.preferredDeliveryType);\n this.primaryDemand = data?.primaryDemand;\n this.isExcludedFromMsCallsToClients = data?.isExcludedFromMsCallsToClients ?? false;\n this.reasonExcludedFromMsCallsToClients = data?.reasonExcludedFromMsCallsToClients;\n this.preferredWarehouse = data?.preferredWarehouse ? new Warehouse(data.preferredWarehouse) : undefined;\n this.extraData = data?.extraData ?? {};\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any,@typescript-eslint/no-unnecessary-condition */\n\nimport { IClientsListFilters } from '@sc/clients/interfaces/i-clients-list-filters';\nimport { Contact } from '@sc/contacts/classes/contact';\nimport { IContact } from '@sc/contacts/interfaces/i-contact';\nimport { Manager } from '@sc/managers/classes/manager';\nimport { IManager } from '@sc/managers/interfaces/i-manager';\nimport { IOrdersListFilters } from '@sc/orders/interfaces/i-orders-list-filters';\nimport { CityWithRegionAndCountry, Country, DeliveryType, Opf, PartnerGroup, Region, SalesDirection } from '@sc/references/classes';\nimport { ICityWithRegionAndCountry, ICountry, IDeliveryType, IOpf, IPartnerGroup, IRegion, ISalesDirection } from '@sc/references/interfaces';\nimport { DatePeriod } from '@sc/system/classes/date-period';\nimport { IDatePeriod } from '@sc/system/interfaces/i-date-period';\nimport { IReference } from '@sc/system/interfaces/i-reference';\nimport { isFunction, isNil, isString } from 'lodash-es';\n\n/**\n * Данные о параметрах фильтрации списка клиентов.\n */\nexport class ClientsListFilters implements IClientsListFilters {\n /**\n * @inheritDoc\n */\n public id?: string;\n\n /**\n * @inheritDoc\n */\n public name?: string;\n\n /**\n * @inheritDoc\n */\n public alternativeName?: string;\n\n /**\n * @inheritDoc\n */\n public searchTerm?: string;\n\n /**\n * @inheritDoc\n */\n public cities?: ICityWithRegionAndCountry[];\n\n /**\n * @inheritDoc\n */\n public region?: IRegion;\n\n /**\n * @inheritDoc\n */\n public country?: ICountry;\n\n /**\n * @inheritDoc\n */\n public phone?: string;\n\n /**\n * @inheritDoc\n */\n public email?: string;\n\n /**\n * @inheritDoc\n */\n public isActive?: boolean;\n\n /**\n * @inheritDoc\n */\n public createdAt: IDatePeriod = new DatePeriod();\n\n /**\n * @inheritDoc\n */\n public lastLoginDate: IDatePeriod = new DatePeriod();\n\n /**\n * @inheritDoc\n */\n public lastLoginDateHasOrder?: boolean;\n\n /**\n * @inheritDoc\n */\n public managers?: IManager[];\n\n /**\n * @inheritDoc\n */\n public isManagerRequired?: boolean;\n\n /**\n * @inheritDoc\n */\n public salesDirections?: ISalesDirection[];\n\n /**\n * @inheritDoc\n */\n public contragentInn?: string;\n\n /**\n * @inheritDoc\n */\n public contragentType?: IOpf;\n\n /**\n * @inheritDoc\n */\n public preferredDeliveryType?: IDeliveryType;\n\n /**\n * @inheritDoc\n */\n public partnerGroups?: IPartnerGroup[];\n\n /**\n * @inheritDoc\n */\n public contact?: IContact;\n\n /**\n * @inheritDoc\n */\n public lastOrder?: Partial<Pick<IOrdersListFilters, 'createdAt' | 'creator' | 'isApproved'>>;\n\n /**\n * @inheritDoc\n */\n public isExcludedFromMsCallsToClients?: boolean;\n\n /**\n * Инициализирует экземпляр класса {@link ClientsListFilters}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IClientsListFilters) {\n this.id = data?.id;\n this.name = data?.name;\n this.alternativeName = data?.alternativeName;\n this.searchTerm = data?.searchTerm;\n this.cities = data?.cities?.map((c) => new CityWithRegionAndCountry(c));\n this.region = new Region(data?.region);\n this.country = new Country(data?.country);\n this.phone = data?.phone;\n this.email = data?.email;\n // eslint-disable-next-line no-nested-ternary\n this.isActive = data && Object.prototype.hasOwnProperty.call(data, 'isActive') ? data?.isActive : true;\n this.createdAt = new DatePeriod(data?.createdAt);\n this.lastLoginDate = new DatePeriod(data?.lastLoginDate);\n // eslint-disable-next-line no-nested-ternary\n this.lastLoginDateHasOrder = data?.lastLoginDateHasOrder ?? undefined;\n // eslint-disable-next-line prettier/prettier\n this.managers = data?.managers && data.managers.length > 0\n ? data.managers.map((m) => new Manager(m))\n : [] as IManager[];\n this.salesDirections = data?.salesDirections?.map((s) => new SalesDirection(s));\n this.contragentInn = data?.contragentInn;\n this.contragentType = new Opf(data?.contragentType);\n this.preferredDeliveryType = new DeliveryType(data?.preferredDeliveryType);\n this.partnerGroups = data?.partnerGroups?.map((p) => new PartnerGroup(p));\n this.contact = new Contact(data?.contact);\n this.lastOrder = {\n createdAt: new DatePeriod(data?.lastOrder?.createdAt),\n creator: data?.lastOrder?.creator,\n isApproved: data?.lastOrder?.isApproved,\n };\n this.isExcludedFromMsCallsToClients = data?.isExcludedFromMsCallsToClients;\n }\n\n /**\n * Выполняет сброс указанного фильтра в значение по умолчанию.\n *\n * @param key Название фильтра, значение которого необходимо сбросить.\n */\n public resetFilterValue(key: string): this {\n switch (key) {\n case 'cities':\n this.cities = [] as ICityWithRegionAndCountry[];\n break;\n case 'region':\n this.region = new Region();\n break;\n case 'isActive':\n this.isActive = true;\n break;\n case 'createdAt':\n this.createdAt.from = null;\n this.createdAt.to = null;\n break;\n case 'lastLoginDate':\n this.lastLoginDate.from = null;\n this.lastLoginDate.to = null;\n break;\n case 'lastOrder':\n this.lastOrder = {};\n break;\n case 'managers':\n this.managers = [] as IManager[];\n break;\n case 'salesDirections':\n this.salesDirections = [] as ISalesDirection[];\n break;\n case 'contragentType':\n this.contragentType = new Opf();\n break;\n case 'preferredDeliveryType':\n this.preferredDeliveryType = new DeliveryType();\n break;\n case 'partnerGroups':\n this.partnerGroups = [] as IPartnerGroup[];\n break;\n case 'contact':\n this.contact = new Contact();\n break;\n default:\n // eslint-disable-next-line security/detect-object-injection,@typescript-eslint/no-explicit-any,@typescript-eslint/no-unsafe-member-access\n (this as any)[key] = undefined;\n break;\n }\n\n return this;\n }\n\n /**\n * Возвращает очищенное значение фильтров, содержащие\n * только актуальные данные.\n */\n public asClearRaw(): Record<string, any> {\n const result: Record<string, any> = {};\n\n // eslint-disable-next-line lodash/prefer-lodash-method\n Object.keys(this).forEach((k) => {\n const value = this[k as keyof IClientsListFilters];\n\n if (\n !(\n // eslint-disable-next-line prettier/prettier\n isNil(value)\n // eslint-disable-next-line prettier/prettier,lodash/prefer-lodash-method\n || (isString(value) && value.trim().length === 0)\n // eslint-disable-next-line @typescript-eslint/unbound-method,prettier/prettier\n || (isFunction((value as IReference).isNewRec) && (value as IReference).isNewRec())\n )\n ) {\n // eslint-disable-next-line security/detect-object-injection\n result[k] = value;\n }\n });\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (!result?.createdAt?.from && !result?.createdAt?.to) {\n delete result.createdAt;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (!result?.lastLoginDate?.from && !result?.lastLoginDate?.to) {\n delete result.lastLoginDate;\n }\n\n return result;\n }\n}\n","import { IOrderShortInfo } from '@sc/orders/interfaces/i-order-short-info';\nimport { Identity } from '@sc/system/classes/identity';\nimport { UserShortInfo } from '@sc/user/classes/user-short-info';\nimport { IUserShortInfo } from '@sc/user/interfaces/i-user-short-info';\nimport { parseISO } from 'date-fns';\nimport { isString } from 'lodash-es';\n\n/**\n * Краткие данные о заказе.\n */\nexport class OrderShortInfo extends Identity implements IOrderShortInfo {\n /**\n * Дата и время создания заказа.\n */\n public createdAt: Date;\n\n /**\n * Краткие данные о пользователе, который создал заказ.\n */\n public creator: IUserShortInfo;\n\n /**\n * Признак того, что заказ подтвержден в 1С.\n */\n public isApproved1c: boolean;\n\n /**\n * Инициализирует экземпляр класса {@link OrderShortInfo}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IOrderShortInfo>) {\n super(data);\n\n this.createdAt = isString(data?.createdAt) ? parseISO(data.createdAt) : (data?.createdAt ?? new Date());\n this.creator = new UserShortInfo(data?.creator);\n this.isApproved1c = data?.isApproved1c ?? false;\n }\n}\n","import { IClientAdditionalData } from '@sc/clients/interfaces/i-client-additional-data';\nimport { ContactPerson } from '@sc/contacts/classes/contact-person';\nimport { IContactPerson } from '@sc/contacts/interfaces/i-contact-person';\nimport { ManagerCommon } from '@sc/managers/classes/manager-common';\nimport { IManagerCommon } from '@sc/managers/interfaces/i-manager-common';\nimport { OrderShortInfo } from '@sc/orders/classes/order-short-info';\nimport { IOrderShortInfo } from '@sc/orders/interfaces/i-order-short-info';\nimport { DeliveryType } from '@sc/references/classes/delivery-type';\nimport { PartnerGroup } from '@sc/references/classes/partner-group';\nimport { SalesDirection } from '@sc/references/classes/sales-direction';\nimport { IDeliveryType } from '@sc/references/interfaces/i-delivery-type';\nimport { IPartnerGroup } from '@sc/references/interfaces/i-partner-group';\nimport { ISalesDirection } from '@sc/references/interfaces/i-sales-direction';\nimport { NamedIdentity } from '@sc/system/classes/named-identity';\n\n/**\n * Дополнительные данные о клиенте.\n */\nexport class ClientAdditionalData extends NamedIdentity implements IClientAdditionalData {\n /**\n * Список контактов клиента.\n */\n public contacts?: IContactPerson[] = [];\n\n /**\n * Предпочтительный тип доставки.\n */\n public preferredDeliveryType?: IDeliveryType;\n\n /**\n * Список групп партнеров (направлений деятельности), к которым относится клиент.\n */\n public partnerGroups?: IPartnerGroup[] = [];\n\n /**\n * Данные о последнем заказе клиента.\n */\n public lastOrder?: IOrderShortInfo;\n\n /**\n * Направление продаж.\n */\n public salesDirection?: ISalesDirection;\n\n /**\n * Список менеджеров.\n */\n public managers?: IManagerCommon[];\n\n /**\n * Инициализирует экземпляр класса {@link ClientAdditionalData}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data: IClientAdditionalData) {\n super(data);\n\n if (data.contacts?.length) {\n this.contacts = data.contacts.map((c) => new ContactPerson(c));\n }\n\n if (data.lastOrder) {\n this.lastOrder = new OrderShortInfo(data.lastOrder);\n }\n\n if (data.partnerGroups?.length) {\n this.partnerGroups = data.partnerGroups.map((g) => new PartnerGroup(g));\n }\n\n if (data.preferredDeliveryType) {\n this.preferredDeliveryType = new DeliveryType(data.preferredDeliveryType);\n }\n\n if (data.salesDirection) {\n this.salesDirection = new SalesDirection(data.salesDirection);\n }\n\n if (data.managers) {\n this.managers = data.managers.map((g) => new ManagerCommon(g));\n }\n }\n}\n","import { IPaginationRequestParams } from '@sc/data-table/interfaces/i-pagination-request-params';\n\n/**\n * Данные о пагинации записей таблицы.\n */\nexport class DataTablePaginationRequestParams implements IPaginationRequestParams {\n /**\n * Номер текущей страницы.\n */\n public page = 1;\n\n /**\n * Количество записей на странице.\n */\n public pageSize = 50;\n\n /**\n * Инициализирует экземпляр класса {@link DataTablePaginationRequestParams}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IPaginationRequestParams) {\n this.page = data?.page ?? 1;\n this.pageSize = data?.pageSize ?? 50;\n }\n}\n","import { DataTablePaginationRequestParams } from '@sc/data-table/classes/data-table-pagination-request-params';\nimport { IPagination } from '@sc/data-table/interfaces/i-pagination';\n\n/**\n * Данные о пагинации записей таблицы.\n */\nexport class DataTablePagination extends DataTablePaginationRequestParams implements IPagination {\n /**\n * Количество записей в таблице.\n */\n public itemCount = 0;\n\n /**\n * Число страниц с данными.\n */\n public pageCount = 1;\n\n /**\n * Число отображаемых номеров страниц.\n */\n public pageSlot = 5;\n\n /**\n * Значения для выпадающего списка \"Количество записей на странице\".\n */\n public pageSizes = [25, 50, 100];\n\n /**\n * Признак необходимости отображать список выбора числа отображаемых записей.\n */\n public showSizePicker = true;\n\n /**\n * Инициализирует экземпляр класса {@link DataTablePagination}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IPagination) {\n super(data);\n\n this.itemCount = data?.itemCount ?? 0;\n this.pageCount = data?.pageCount ?? 1;\n this.pageSlot = data?.pageSlot ?? 5;\n this.pageSizes = data?.pageSizes ?? [25, 50, 100];\n this.showSizePicker = data?.showSizePicker ?? true;\n }\n}\n","import { ISortRequestParams } from '@sc/data-table/interfaces/i-sort-request-params';\n\n/**\n * Данные о сортировке записей таблицы.\n */\nexport class DataTableSortRequestParams implements ISortRequestParams {\n /**\n * Поле по которому необходимо выполнить сортировку\n */\n public field: string;\n\n /**\n * Направление сортировки.\n */\n public direction: 'asc' | 'desc';\n\n /**\n * Инициализирует экземпляр класса {@link ISortRequestParams}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: ISortRequestParams) {\n this.field = data?.field ?? '';\n this.direction = data?.direction ?? 'asc';\n }\n}\n","/* eslint-disable @typescript-eslint/no-unnecessary-condition,@typescript-eslint/no-unsafe-argument,@typescript-eslint/prefer-promise-reject-errors,@typescript-eslint/use-unknown-in-catch-callback-variable,vue/max-len */\n\nimport { BankAccount } from '@sc/clients/classes/bank-account';\nimport { Client } from '@sc/clients/classes/client';\nimport { ClientAdditionalData } from '@sc/clients/classes/client-additional-data';\nimport { ClientShortInfo } from '@sc/clients/classes/client-short-info';\nimport { ContragentFactory } from '@sc/clients/classes/contragent/contragent-factory';\nimport { DeliveryAddress } from '@sc/clients/classes/delivery-address';\nimport { ClientsAdditionalDataRequestTypeEnum, OpfEnum } from '@sc/clients/enums';\nimport { IContragentBase } from '@sc/clients/interfaces/contragent/i-contragent-base';\nimport { IContragentIc } from '@sc/clients/interfaces/contragent/i-contragent-ic';\nimport { IContragentUlNr } from '@sc/clients/interfaces/contragent/i-contragent-ul-nr';\nimport { IContragentUlR } from '@sc/clients/interfaces/contragent/i-contragent-ul-r';\nimport { IBankAccount } from '@sc/clients/interfaces/i-bank-account';\nimport { IClient } from '@sc/clients/interfaces/i-client';\nimport { IClientAdditionalData } from '@sc/clients/interfaces/i-client-additional-data';\nimport { IClientShortInfo } from '@sc/clients/interfaces/i-client-short-info';\nimport { IDeliveryAddress } from '@sc/clients/interfaces/i-delivery-address';\nimport { ContactPerson } from '@sc/contacts/classes/contact-person';\nimport { ContactPersonRelated } from '@sc/contacts/classes/contact-person-related';\nimport { IContactPerson } from '@sc/contacts/interfaces/i-contact-person';\nimport { IContactPersonRelated } from '@sc/contacts/interfaces/i-contact-person-related';\nimport { FilterOpEnum } from '@sc/data-table';\nimport { IFilterGroup } from '@sc/data-table/interfaces/i-filter-group';\nimport { IPaginationRequestParams } from '@sc/data-table/interfaces/i-pagination-request-params';\nimport { ISortRequestParams } from '@sc/data-table/interfaces/i-sort-request-params';\nimport { IManagerCommon } from '@sc/managers/interfaces';\nimport { IPaginatedResponse } from '@sc/pagination/interfaces';\nimport { BasePaginationProvider } from '@sc/pagination/providers/base-pagination-provider';\nimport { IFieldValidationResultData } from '@sc/validation/interfaces';\n\n/**\n * Предоставляет механизмы получения/управления данными о клиенте.\n */\nexport class ClientDataProvider extends BasePaginationProvider {\n /**\n * Преобразует данные о клиенте в данные требуемые для запроса.\n *\n * @param client Данные о клиенте.\n */\n protected static transformClientDataToRequest(client: IClient): Record<string, unknown> {\n const data: Record<string, unknown> = {\n name: client.name,\n alternative_name: client.alternativeName,\n partner_groups: client.partnerGroups.map((pg) => pg.id),\n phone: client.phone,\n email: client.email,\n city_id: client.city.id,\n get_news: client.getNews,\n channel_primary_interest_id: client.channelPrimaryInterest.id,\n source_primary_interest_id: client.sourcePrimaryInterest.id,\n primary_demand: client.primaryDemand,\n is_excluded_from_ms_calls_to_clients: client.isExcludedFromMsCallsToClients,\n preferred_warehouse_id: client.preferredWarehouse?.id,\n };\n\n if (client.isExcludedFromMsCallsToClients) {\n data.reason_excluded_from_ms_calls_to_clients = client.reasonExcludedFromMsCallsToClients;\n }\n\n return data;\n }\n\n /**\n * Преобразует данные о контрагенте клиента в данные требуемые для запроса.\n *\n * @param contragent Данные о контрагенте клиента.\n */\n protected static transformContragentClientDataToRequest(contragent: IContragentBase): Record<string, unknown> {\n let data: Record<string, unknown>;\n const contragentIc = contragent as IContragentIc;\n const contragentUlR = contragent as IContragentUlR;\n const contragentUlNr = contragent as IContragentUlNr;\n\n switch (contragent.opf.slug) {\n case OpfEnum.Ic:\n data = {\n opf: contragentIc.opf.slug,\n name: contragentIc.name,\n alternative_name: contragentIc.alternativeName,\n partner_group_id: contragentIc.partnerGroup?.id,\n manager_id: contragentIc.manager?.id,\n comment: contragentIc.comment,\n inn: contragentIc.inn,\n okpo: contragentIc.okpo,\n director_name: contragentIc.directorName,\n director_position: contragentIc.directorPosition,\n director_acts_on: contragentIc.directorActsOn,\n legal_address: contragentIc.legalAddress,\n postal_address: contragentIc.postalAddress,\n actual_address: contragentIc.actualAddress,\n };\n break;\n case OpfEnum.UlR:\n data = {\n opf: contragentUlR.opf.slug,\n name: contragentUlR.name,\n alternative_name: contragentUlR.alternativeName,\n partner_group_id: contragentUlR.partnerGroup?.id,\n manager_id: contragentUlR.manager?.id,\n comment: contragentUlR.comment,\n inn: contragentUlR.inn,\n kpp: contragentUlR.kpp,\n okpo: contragentUlR.okpo,\n director_name: contragentUlR.directorName,\n director_position: contragentUlR.directorPosition,\n director_acts_on: contragentUlR.directorActsOn,\n legal_address: contragentUlR.legalAddress,\n postal_address: contragentUlR.postalAddress,\n actual_address: contragentUlR.actualAddress,\n };\n break;\n case OpfEnum.UlNr:\n data = {\n opf: contragentUlNr.opf.slug,\n name: contragentUlNr.name,\n alternative_name: contragentUlNr.alternativeName,\n partner_group_id: contragentUlNr.partnerGroup?.id,\n manager_id: contragentUlNr.manager?.id,\n comment: contragentUlNr.comment,\n director_name: contragentUlNr.directorName,\n director_position: contragentUlNr.directorPosition,\n director_acts_on: contragentUlNr.directorActsOn,\n legal_address: contragentUlNr.legalAddress,\n postal_address: contragentUlNr.postalAddress,\n actual_address: contragentUlNr.actualAddress,\n registration_country_id: contragentUlNr.registrationCountry.id,\n registration_number: contragentUlNr.registrationNumber,\n tax_number: contragentUlNr.taxNumber || undefined,\n };\n break;\n default:\n data = {\n opf: contragent.opf.slug,\n name: contragent.name,\n alternative_name: contragent.alternativeName,\n partner_group_id: contragent.partnerGroup?.id,\n manager_id: contragent.manager?.id,\n comment: contragent.comment,\n };\n break;\n }\n\n return data;\n }\n\n /**\n * Преобразует данные об адресе доставки клиенту в данные требуемые для запроса.\n *\n * @param deliveryAddress Данные об адресе доставки клиенту.\n */\n protected static transformClientDeliveryAddressToRequest(deliveryAddress: IDeliveryAddress): Record<string, unknown> {\n const data: Record<string, unknown> = {\n address: deliveryAddress.address,\n is_one_time: deliveryAddress.isOneTime ?? false,\n is_transport_company_address: deliveryAddress.isTransportCompanyAddress ?? false,\n comment: deliveryAddress.comment ?? '',\n };\n\n if (deliveryAddress.coordinates) {\n data.coordinates = {\n lat: deliveryAddress.coordinates?.lat,\n long: deliveryAddress.coordinates?.long,\n };\n }\n\n if (deliveryAddress.operatingHours) {\n data.operating_hours = {\n from: deliveryAddress.operatingHours.from,\n to: deliveryAddress.operatingHours.to,\n };\n }\n\n return data;\n }\n\n /**\n * Преобразует данные о банковских реквизитах контрагента в данные требуемые для запроса.\n *\n * @param bankAccount Данные о банковских реквизитах контрагента.\n */\n protected static transformClientContragentBankAccountToRequest(bankAccount: IBankAccount): Record<string, unknown> {\n return {\n bank_name: bankAccount.bankName,\n bic: bankAccount.bic,\n account_number: bankAccount.accountNumber,\n correspondent_account: bankAccount.correspondentAccount,\n currency_id: bankAccount.currency.id,\n };\n }\n\n /**\n * Возвращает данные об указанном клиенте.\n *\n * @param id Идентификатор клиента для которого необходимо получить данные.\n * @see /doc/api/internal#/Клиенты/api_internal_client_get_full_info\n */\n public getClient(id: number): Promise<IClient> {\n return this.get<IClient>(`/internal/clients/${id}`, {}, (response) => new Client(response.data));\n }\n\n /**\n * Возвращает данные о клиентах, удовлетворяющих указанным параметрам поиска.\n *\n * @param filters Параметры фильтрации данных.\n * @param sortParams Параметры сортировки.\n * @param paginationParams Параметры пагинации.\n * @param extraParams Дополнительные параметры запроса.\n *\n * @see /doc/api/internal#/Клиенты/api_internal_client_get_list\n */\n public getClientsList(\n filters?: IFilterGroup,\n sortParams?: ISortRequestParams[],\n paginationParams?: IPaginationRequestParams,\n extraParams?: object\n ): Promise<IPaginatedResponse<IClientShortInfo>> {\n return this.getPaginated<IClientShortInfo>('/internal/clients', filters, sortParams, paginationParams, extraParams, (response) => {\n const result = { ...response.data };\n\n result.data = result.data.map((clientData: IClientShortInfo) => new ClientShortInfo(clientData));\n\n return result;\n });\n }\n\n /**\n * Возвращает список клиентов с указанным телефонным номером.\n *\n * @param phone Телефонный номер по которому следует искать клиентов.\n */\n // eslint-disable-next-line class-methods-use-this\n public getClientByPhone(phone: string): Promise<IPaginatedResponse<IClientShortInfo>> {\n return this.getClientsList({\n groupOp: 'and',\n groups: [],\n filters: [{ field: 'phone', op: FilterOpEnum.Contains, value: phone }],\n });\n }\n\n /**\n * Возвращает дополнительные данные об указанных клиентах.\n *\n * @param clients Список данных о клиентах, для которых необходимо получить дополнительные данные.\n * @param dataTypes Список данных которые необходимо вернуть.\n * @see /doc/api/internal#/Клиенты/api_internal_client_get_additional_data_for_clients_list\n */\n public getAdditionalClientsData(\n clients: IClientShortInfo[],\n dataTypes: Array<ClientsAdditionalDataRequestTypeEnum | string>\n ): Promise<Array<IClientAdditionalData | Record<string, unknown>>> {\n const clientIDs = clients.map((client) => client.id);\n\n return this.post<IClientAdditionalData[]>('/internal/clients/additional-data', { clients: clientIDs, requested_data_types: dataTypes }, (response) => {\n let dataList = [] as IClientAdditionalData[];\n\n if (response?.data.length > 0) {\n dataList = response.data.map((item: IClientAdditionalData) => new ClientAdditionalData(item));\n }\n\n return dataList;\n });\n }\n\n /**\n * Возвращает список всех контактных лиц указанного клиента.\n *\n * @param id Идентификатор клиента для которого необходимо получить данные.\n * @see /doc/api/internal#/Контакты/api_internal_client_contact_get_all_contact_list\n */\n public getAllClientContacts(id: number): Promise<IContactPersonRelated[]> {\n return this.get<IContactPersonRelated[]>(`/internal/clients/${id}/contacts/all`, {}, (response) => {\n let contactsList = [] as IContactPersonRelated[];\n\n if (response?.data.length > 0) {\n contactsList = response.data.map((item: IContactPersonRelated) => new ContactPersonRelated(item));\n }\n\n return contactsList;\n });\n }\n\n /**\n * Создаёт нового клиента на основе указанных данных.\n *\n * @param client Данные о клиенте.\n * @param validationFieldResultData Список полей, для которых необходимо установить данные об ошибках валидации в случае ошибок в запросах.\n * @see /doc/api/internal#/Клиенты/api_internal_client_create\n */\n public createClientCommonData(client: IClient, validationFieldResultData: Record<string, IFieldValidationResultData> = {}): Promise<IClient> {\n return this.post<IClient>('/internal/clients', ClientDataProvider.transformClientDataToRequest(client), (response) => new Client(response.data), validationFieldResultData);\n }\n\n /**\n * Обновляет данные указанного клиента.\n *\n * @param client Данные о клиенте.\n * @param validationFieldResultData Список полей, для которых необходимо установить данные об ошибках валидации в случае ошибок в запросах.\n * @see /doc/api/internal#/Клиенты/api_internal_client_change\n */\n public updateClientCommonData(client: IClient, validationFieldResultData: Record<string, IFieldValidationResultData> = {}): Promise<void> {\n return this.patch(`/internal/clients/${client.id}`, ClientDataProvider.transformClientDataToRequest(client), undefined, validationFieldResultData);\n }\n\n /**\n * Обновляет данные \"Не беспокоить\" указанного клиента.\n *\n * @param client Данные о клиенте.\n * @param validationFieldResultData Список полей, для которых необходимо установить данные об ошибках валидации в случае ошибок в запросах.\n * @see /doc/api/internal#/Клиенты/api_internal_client_change\n */\n public updateClientNotDistribCommonData(client: IClient, validationFieldResultData: Record<string, IFieldValidationResultData> = {}): Promise<void> {\n const data: Record<string, unknown> = {\n get_news: client.getNews,\n is_excluded_from_ms_calls_to_clients: client.isExcludedFromMsCallsToClients,\n };\n\n if (client.isExcludedFromMsCallsToClients) {\n data.reason_excluded_from_ms_calls_to_clients = client.reasonExcludedFromMsCallsToClients;\n }\n\n return this.patch(`/internal/clients/${client.id}`, data, undefined, validationFieldResultData);\n }\n\n /**\n * Изменяет пароль клиента.\n *\n * @param clientId Идентификатор клиента которому необходимо поменять пароль.\n * @param password Новый пароль.\n * @param passwordConfirm Пароль-подтверждение.\n * @param validationFieldResultData Список полей, для которых необходимо установить данные об ошибках валидации в случае ошибок в запросах.\n * @see /doc/api/internal#/Клиенты/api_internal_client_change\n */\n public changeClientPassword(\n clientId: number,\n password: string,\n passwordConfirm: string,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<void> {\n return this.patch(\n `/internal/clients/${clientId}`,\n {\n password: password,\n password_confirmation: passwordConfirm,\n },\n undefined,\n validationFieldResultData\n );\n }\n\n /**\n * Обновляет комментарий к клиенту.\n *\n * @param client Данные о клиенте.\n * @see /doc/api/internal#/Клиенты/api_internal_client_change\n */\n public updateClientComment(client: IClient): Promise<void> {\n return this.patch(`/internal/clients/${client.id}`, { comment: client.comment });\n }\n\n /**\n * Изменяет статус активности у клиента.\n *\n * @param client Данные о клиенте.\n * @see /doc/api/internal#/Клиенты/api_internal_client_change\n */\n public changeClientActivation(client: IClient): Promise<void> {\n return this.patch(`/internal/clients/${client.id}`, { is_active: client.isActive });\n }\n\n /**\n * Выполняет закрепление указанного клиента за указанными менеджерами.\n *\n * @param clientId Идентификатор клиента, к которому необходимо привязать менеджера.\n * @param managers Список менеджеров клиента.\n *\n * @see /doc/api/internal#/Клиенты/api_internal_client_manager_attach\n */\n public async attachClientToManagers(clientId: number, managers: IManagerCommon[]) {\n const promises = managers.map((m: IManagerCommon) => this.patch(`/internal/clients/${clientId}/managers/${m.id}/attach`, { is_primary: m.isDefault }));\n\n await Promise.all(promises);\n }\n\n /**\n * Выполняет открепление указанного клиента от указанных менеджеров.\n *\n * @param clientId Идентификатор клиента, которого необходимо открепить от менеджера.\n * @param managers Список менеджеров клиента.\n *\n * @see /doc/api/internal#/Клиенты/api_internal_client_manager_detach\n */\n public async detachClientFromManagers(clientId: number, managers: IManagerCommon[]): Promise<void> {\n const promises = managers.map((m: IManagerCommon) => this.patch(`/internal/clients/${clientId}/managers/${m.id}/detach`));\n\n await Promise.all(promises);\n }\n\n /**\n * Создаёт нового контрагента клиента.\n *\n * @param clientId Идентификатор клиента, к которому необходимо привязать контрагента.\n * @param contragent Данные о контрагенте клиента.\n * @param validationFieldResultData Список полей, для которых необходимо установить данные об ошибках валидации в случае ошибок в запросах.\n * @see /doc/api/internal#/Контрагенты/api_internal_client_contragent_create\n */\n public createContragentClientData(\n clientId: number,\n contragent: IContragentBase,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<IContragentBase> {\n return this.post<IContragentBase>(\n `/internal/clients/${clientId}/contragents`,\n ClientDataProvider.transformContragentClientDataToRequest(contragent),\n (response) => ContragentFactory.createInstance(response.data),\n validationFieldResultData\n );\n }\n\n /**\n * Обновляет данные указанного контрагента клиента.\n *\n * @param clientId Идентификатор клиента, к которому привязан контрагент.\n * @param contragent Данные о контрагенте клиента.\n * @param validationFieldResultData Список полей, для которых необходимо установить данные об ошибках валидации в случае ошибок в запросах.\n * @see /doc/api/internal#/Контрагенты/api_internal_client_contragent_update\n */\n public updateContragentClientData(\n clientId: number,\n contragent: IContragentBase,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<IContragentBase> {\n return this.patch<IContragentBase>(\n `/internal/clients/${clientId}/contragents/${contragent.id}`,\n ClientDataProvider.transformContragentClientDataToRequest(contragent),\n (response) => ContragentFactory.createInstance(response.data),\n validationFieldResultData\n );\n }\n\n /**\n * Удаляет указанного контрагента клиента.\n *\n * @param clientId Идентификатор клиента, к которому привязан контрагент.\n * @param contragent Данные о контрагенте клиента.\n * @see /doc/api/internal#/Контрагенты/api_internal_client_contragent_delete\n */\n public deleteClientContragent(clientId: number, contragent: IContragentBase): Promise<void> {\n return this.delete(`/internal/clients/${clientId}/contragents/${contragent.id}`);\n }\n\n /**\n * Создаёт новую запись об адресе доставки клиента.\n *\n * @param clientId Идентификатор клиента, к которому необходимо привязать адрес доставки.\n * @param deliveryAddress Данные об адресе доставки.\n * @param validationFieldResultData Список полей, для которых необходимо установить данные об ошибках валидации в случае ошибок в запросах.\n * @see /doc/api/internal#/Адреса доставки/api_internal_client_delivery_address_create\n */\n public createClientDeliveryAddress(\n clientId: number,\n deliveryAddress: IDeliveryAddress,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<IDeliveryAddress> {\n return this.post<IDeliveryAddress>(\n `/internal/clients/${clientId}/delivery-addresses`,\n ClientDataProvider.transformClientDeliveryAddressToRequest(deliveryAddress),\n (response) => new DeliveryAddress(response.data),\n validationFieldResultData\n );\n }\n\n /**\n * Обновляет данные об адресе доставки клиента.\n *\n * @param clientId Идентификатор клиента, к которому привязан адрес доставки.\n * @param deliveryAddress Данные об адресе доставки.\n * @param validationFieldResultData Список полей, для которых необходимо установить данные об ошибках валидации в случае ошибок в запросах.\n * @see /doc/api/internal#/Адреса доставки/api_internal_client_delivery_address_update\n */\n public updateClientDeliveryAddress(\n clientId: number,\n deliveryAddress: IDeliveryAddress,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<IDeliveryAddress> {\n return this.patch<IDeliveryAddress>(\n `/internal/clients/${clientId}/delivery-addresses/${deliveryAddress.id}`,\n ClientDataProvider.transformClientDeliveryAddressToRequest(deliveryAddress),\n (response) => new DeliveryAddress(response.data),\n validationFieldResultData\n );\n }\n\n /**\n * Удаляет указанный адрес доставки клиента.\n *\n * @param clientId Идентификатор клиента, к которому привязан адрес доставки .\n * @param deliveryAddress Данные об адресе доставки клиента.\n * @see /doc/api/internal#/Адреса доставки/api_internal_client_delivery_address_delete\n */\n public deleteClientDeliveryAddress(clientId: number, deliveryAddress: IDeliveryAddress): Promise<void> {\n return this.delete(`/internal/clients/${clientId}/delivery-addresses/${deliveryAddress.id}`);\n }\n\n /**\n * Создаёт новую запись банковских реквизитов контрагента.\n *\n * @param clientId Идентификатор клиента, к которому необходимо привязать банковские реквизиты.\n * @param contragentId Идентификатор контрагента, к которому необходимо привязать банковские реквизиты.\n * @param bankAccount Данные банковских реквизитов.\n * @param validationFieldResultData Список полей, для которых необходимо установить данные об ошибках валидации в случае ошибок в запросах.\n * @see /doc/api/internal#/Банковские реквизиты/api_internal_client_contragent_bank_accounts_create\n */\n public createContragentBankAccount(\n clientId: number,\n contragentId: number,\n bankAccount: IBankAccount,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<IBankAccount> {\n return this.post<IBankAccount>(\n `/internal/clients/${clientId}/contragents/${contragentId}/bank-accounts`,\n ClientDataProvider.transformClientContragentBankAccountToRequest(bankAccount),\n (response) => new BankAccount(response.data),\n validationFieldResultData\n );\n }\n\n /**\n * Обновляет данные о банковских реквизитах контрагента.\n *\n * @param clientId Идентификатор клиента, к которому необходимо привязать банковские реквизиты.\n * @param contragentId Идентификатор контрагента, к которому необходимо привязать банковские реквизиты.\n * @param bankAccount Данные банковских реквизитов.\n * @param validationFieldResultData Список полей, для которых необходимо установить данные об ошибках валидации в случае ошибок в запросах.\n * @see /doc/api/internal#/Адреса доставки/api_internal_client_delivery_address_update\n */\n public updateContragentBankAccount(\n clientId: number,\n contragentId: number,\n bankAccount: IBankAccount,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<IBankAccount> {\n return this.patch<IBankAccount>(\n `/internal/clients/${clientId}/contragents/${contragentId}/bank-accounts/${bankAccount.id}`,\n ClientDataProvider.transformClientContragentBankAccountToRequest(bankAccount),\n (response) => new BankAccount(response.data),\n validationFieldResultData\n );\n }\n\n /**\n * Удаляет указанные банковские реквизиты контрагента.\n *\n * @param clientId Идентификатор клиента, к которому необходимо привязать банковские реквизиты.\n * @param contragentId Идентификатор контрагента, к которому необходимо привязать банковские реквизиты.\n * @param bankAccount Данные банковских реквизитов.\n * @see /doc/api/internal#/Банковские реквизиты/api_internal_client_contragent_bank_accounts_delete\n */\n public deleteContragentBankAccount(clientId: number, contragentId: number, bankAccount: IBankAccount): Promise<void> {\n return this.delete(`/internal/clients/${clientId}/contragents/${contragentId}/bank-accounts/${bankAccount.id}`);\n }\n\n /**\n * Создаёт новую запись о контактном лице клиента.\n *\n * @param clientId Идентификатор клиента, к которому привязано контактное лицо.\n * @param contactPerson Данные о контактном лице.\n * @param validationFieldResultData Список полей, для которых необходимо установить данные об ошибках валидации в случае ошибок в запросах.\n * @see /doc/api/internal#/Контакты/api_internal_client_contact_create\n */\n public createClientContact(\n clientId: number,\n contactPerson: IContactPerson,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<IContactPerson> {\n return this.createContact(\n clientId,\n contactPerson,\n {\n client: {\n id: clientId,\n is_primary: contactPerson.isPrimary ?? false,\n not_disturb: contactPerson.notDisturb ?? false,\n },\n },\n validationFieldResultData\n );\n }\n\n /**\n * Обновляет данные указанного контактного лица.\n *\n * @param clientId Идентификатор клиента, к которому привязано контактное лицо.\n * @param contactPerson Данные о контактном лице.\n * @param validationFieldResultData Список полей, для которых необходимо установить данные об ошибках валидации в случае ошибок в запросах.\n * @see /doc/api/internal#/Контакты/api_internal_client_contact_change\n */\n public updateClientContact(\n clientId: number,\n contactPerson: IContactPerson,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<IContactPerson> {\n return this.patch<IContactPerson>(\n `/internal/clients/${clientId}/contacts/${contactPerson.id}`,\n {\n name: contactPerson.name,\n position: contactPerson.position,\n phone: contactPerson.phone,\n email: contactPerson.email,\n comment: contactPerson.comment,\n not_disturb: contactPerson.notDisturb,\n },\n (response) => new ContactPerson(response.data),\n validationFieldResultData\n );\n }\n\n /**\n * Устанавливает признак основного контактного лица для клиента.\n *\n * @param clientId Идентификатор клиента, к которому привязано контактное лицо.\n * @param contactPerson Данные о контактном лице.\n * @see /doc/api/internal#/Контакты/api_internal_client_contact_change_is_primary\n */\n public setPrimaryClientContact(clientId: number, contactPerson: IContactPerson): Promise<void> {\n return this.setPrimaryContact(`/internal/clients/${clientId}/contacts/${contactPerson.id}/primary`, contactPerson.isPrimary ?? false);\n }\n\n /**\n * Удаляет связь между указанным контактным лицом и клиентом.\n *\n * @param clientId Идентификатор клиента, к которому привязано контактное лицо.\n * @param contactPerson Данные о контактном лице.\n * @see /doc/api/internal#/Контакты/api_internal_client_contact_client_detach\n */\n public detachClientContact(clientId: number, contactPerson: IContactPerson): Promise<void> {\n return this.detachContact(`/internal/clients/${clientId}/contacts/${contactPerson.id}/detach`);\n }\n\n /**\n * Создаёт новую запись о контактном лице контрагента.\n *\n * @param clientId Идентификатор клиента, к которому привязано контактное лицо.\n * @param contragentId Идентификатор контрагента, к которому привязано контактное лицо.\n * @param contactPerson Данные о контактном лице.\n * @param validationFieldResultData Список полей, для которых необходимо установить данные об ошибках валидации в случае ошибок в запросах.\n * @see /doc/api/internal#/Контакты/api_internal_client_contact_create\n */\n public createContragentContact(\n clientId: number,\n contragentId: number,\n contactPerson: IContactPerson,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<IContactPerson> {\n return this.createContact(\n clientId,\n contactPerson,\n {\n contragents: [\n {\n id: contragentId,\n is_primary: contactPerson.isPrimary ?? false,\n not_disturb: contactPerson.notDisturb ?? false,\n },\n ],\n },\n validationFieldResultData\n );\n }\n\n /**\n * Устанавливает признак основного контактного лица контрагента.\n *\n * @param clientId Идентификатор клиента, к которому привязано контактное лицо.\n * @param contragentId Идентификатор контрагента, к которому привязано контактное лицо.\n * @param contactPerson Данные о контактном лице.\n * @see /doc/api/internal#/Контакты/api_internal_client_contragent_contact_change_is_primary\n */\n public setPrimaryContragentContact(clientId: number, contragentId: number, contactPerson: IContactPerson): Promise<void> {\n return this.setPrimaryContact(`/internal/clients/${clientId}/contragents/${contragentId}/contacts/${contactPerson.id}/primary`, contactPerson.isPrimary ?? false);\n }\n\n /**\n * Удаляет связь между указанным контактным лицом и контрагентом.\n *\n * @param clientId Идентификатор клиента, к которому привязано контактное лицо.\n * @param contragentId Идентификатор контрагента, к которому привязано контактное лицо.\n * @param contactPerson Данные о контактном лице.\n * @see /doc/api/internal#/Контакты/api_internal_client_contragent_contact_detach\n */\n public detachContragentContact(clientId: number, contragentId: number, contactPerson: IContactPerson): Promise<void> {\n return this.detachContact(`/internal/clients/${clientId}/contragents/${contragentId}/contacts/${contactPerson.id}/detach`);\n }\n\n /**\n * Создаёт новую запись о контактном лице адреса доставки.\n *\n * @param clientId Идентификатор клиента, к которому привязано контактное лицо.\n * @param deliveryAddressId Идентификатор контрагента, к которому привязано контактное лицо.\n * @param contactPerson Данные о контактном лице.\n * @param validationFieldResultData Список полей, для которых необходимо установить данные об ошибках валидации в случае ошибок в запросах.\n * @see /doc/api/internal#/Контакты/api_internal_client_contact_create\n */\n public createDeliveryAddressContact(\n clientId: number,\n deliveryAddressId: number,\n contactPerson: IContactPerson,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<IContactPerson> {\n return this.createContact(\n clientId,\n contactPerson,\n {\n addresses: [\n {\n id: deliveryAddressId,\n is_primary: contactPerson.isPrimary ?? false,\n not_disturb: contactPerson.notDisturb ?? false,\n },\n ],\n },\n validationFieldResultData\n );\n }\n\n /**\n * Устанавливает признак основного контактного лица адреса доставки.\n *\n * @param clientId Идентификатор клиента, к которому привязано контактное лицо.\n * @param deliveryAddressId Идентификатор адреса доставки, к которому привязано контактное лицо.\n * @param contactPerson Данные о контактном лице.\n * @see /doc/api/internal#/Контакты/api_internal_client_delivery_address_contact_change_is_primary\n */\n public setPrimaryDeliveryAddressContact(clientId: number, deliveryAddressId: number, contactPerson: IContactPerson): Promise<void> {\n return this.setPrimaryContact(\n `/internal/clients/${clientId}/delivery-addresses/${deliveryAddressId}/contacts/${contactPerson.id}/primary`,\n contactPerson.isPrimary ?? false\n );\n }\n\n /**\n * Удаляет связь между указанным контактным лицом и адресом доставки.\n *\n * @param clientId Идентификатор клиента, к которому привязано контактное лицо.\n * @param deliveryAddressId Идентификатор адреса доставки, к которому привязано контактное лицо.\n * @param contactPerson Данные о контактном лице.\n * @see /doc/api/internal#/Контакты/api_internal_client_delivery_address_contact_detach\n */\n public detachDeliveryAddressContact(clientId: number, deliveryAddressId: number, contactPerson: IContactPerson): Promise<void> {\n return this.detachContact(`/internal/clients/${clientId}/delivery-addresses/${deliveryAddressId}/contacts/${contactPerson.id}/detach`);\n }\n\n /**\n * Создаёт новую запись о контактном лице клиента.\n *\n * @param clientId Идентификатор клиента, к которому привязано контактное лицо.\n * @param contactPerson Данные о контактном лице.\n * @param extraData Дополнительные данные\n * @param validationFieldResultData Список полей, для которых необходимо установить данные об ошибках валидации в случае ошибок в запросах.\n */\n protected createContact(\n clientId: number,\n contactPerson: IContactPerson,\n extraData: object,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<IContactPerson> {\n const data: Record<string, unknown> = {\n name: contactPerson.name,\n position: contactPerson.position,\n comment: contactPerson.comment,\n ...extraData,\n };\n\n if (contactPerson.phone?.length) {\n data.phone = contactPerson.phone;\n }\n\n if (contactPerson.email?.length) {\n data.email = contactPerson.email;\n }\n\n return this.post<IContactPerson>(`/internal/clients/${clientId}/contacts`, data, (response) => new ContactPerson(response.data), validationFieldResultData);\n }\n\n /**\n * Устанавливает признак основного контактного лица.\n *\n * @param url URL изменения флага основного контакта.\n * @param isPrimary Признак, что это основной контакт.\n */\n protected setPrimaryContact(url: string, isPrimary: boolean): Promise<void> {\n return this.patch(url, { is_primary: isPrimary });\n }\n\n /**\n * Удаляет связь с контактным лицом.\n *\n * @param url URL для удаления связи.\n */\n protected detachContact(url: string): Promise<void> {\n return this.patch(url);\n }\n\n /**\n * Отправляет сообщение электронной почты для подтверждения адреса электронной почты.\n *\n * @param client Данные о клиенте.\n * @see /doc/api/public#/Пользователь/api_public_user_verification_email\n */\n public sendClientEmailConfirmation(client: IClient): Promise<void> {\n return this.get(`/internal/clients/${client.id}/verification/email?email=${client.email}`);\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unnecessary-condition,@typescript-eslint/no-unsafe-assignment,@typescript-eslint/prefer-function-type,@typescript-eslint/no-unsafe-argument,@typescript-eslint/prefer-promise-reject-errors,@typescript-eslint/use-unknown-in-catch-callback-variable */\n\nimport { AppConfigProvider } from '@sc/config/providers/app-config-provider';\nimport { HttpRequester } from '@sc/http/classes/http-requester';\nimport { TypedInstanceFactory } from '@sc/system/providers/typed-instance-factory';\nimport { addSeconds } from 'date-fns';\nimport { isEmpty } from 'lodash-es';\n\n/**\n * Предоставляет базовые механизмы для выполнения запросов с возможностью кэширования.\n */\nexport abstract class HttpCachedRequester extends HttpRequester {\n /**\n * Кэш результатов запросов.\n */\n private static responseDataCache: Map<string, { validTo: Date; val: any }> = new Map<string, { validTo: Date; val: any }>();\n\n /**\n * Возвращает кэшированные данные.\n * Если кэшированные данные отсутствуют, то вернет undefined.\n *\n * @param key Ключ запроса.\n */\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters\n protected static getCachedResponse<T = any>(key: string): T | undefined {\n const cachedResponseData = HttpCachedRequester.responseDataCache.get(key);\n\n if (cachedResponseData && cachedResponseData.validTo > new Date()) {\n return cachedResponseData.val as T;\n }\n\n return undefined;\n }\n\n /**\n * Время кэширования данных ответов на запросы (секунд).\n */\n protected readonly responseDataCacheTimeout: number;\n\n /**\n * Инициализирует экземпляр класса {@link HttpCachedRequester}.\n */\n public constructor() {\n super();\n\n this.responseDataCacheTimeout = AppConfigProvider.getConfig().http.responseDataCacheTimeout as number;\n }\n\n /**\n * Сохраняет указанные данные из запроса в кэш результатов.\n *\n * @param url URL запроса.\n * @param data Данные для кэширования.\n */\n protected cacheResponse(url: string, data: any): void {\n HttpCachedRequester.responseDataCache.set(url, {\n validTo: addSeconds(new Date(), this.responseDataCacheTimeout),\n val: data,\n });\n }\n\n /**\n * Возвращает {@link Promise} типизированного результата выполнения запроса.\n *\n * @param type Тип возвращаемых данных.\n * @param url URL запроса для получения данных.\n * @param useResponseDataCache Признак необходимости кэшировать данные ответов на запросы\n * и использовать в случае аналогичных запросов.\n * @param params Дополнительные параметры запроса.\n */\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters\n protected getTypedDataArrayRequester<OutDataInterface, SourceDataInterface>(\n // eslint-disable-next-line no-unused-vars\n type: new (data: SourceDataInterface) => OutDataInterface,\n url: string,\n useResponseDataCache = false,\n params: Record<string, string | number | boolean | Array<string | number | boolean> | object> = {}\n ): Promise<OutDataInterface[]> {\n const cacheKey = url + (isEmpty(params) ? '' : ` >>> ${JSON.stringify(params)}`);\n const cachedResponse = useResponseDataCache ? HttpCachedRequester.getCachedResponse(cacheKey) : undefined;\n\n if (cachedResponse) {\n return Promise.resolve(cachedResponse);\n }\n\n return this.get<SourceDataInterface[]>(url, params).then((data) => {\n const responseData = data.map((value) => TypedInstanceFactory.instanceInitializer(type, value as unknown as SourceDataInterface));\n\n if (useResponseDataCache && responseData) {\n this.cacheResponse(url, responseData);\n }\n\n return responseData;\n });\n }\n}\n","import { HttpRequester } from '@sc/http';\n\n/**\n * Предоставляет механизмы получения данных о неизвестных пользователях.\n */\nexport class UnknownClientDataProvider extends HttpRequester {\n /**\n * Выполняет проверку занят ли указанный номер телефона.\n *\n * @param phone Номер телефона который необходимо проверить.\n */\n public checkPhoneIsBusy(phone: string): Promise<boolean> {\n return new Promise<boolean>((resolve, reject) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.request<Record<string, any>>({ method: 'GET', url: '/public/user/verification/phone/check', params: { phone: phone } })\n .then((result) => {\n resolve(!!result.isBusy);\n })\n .catch(reject);\n });\n }\n}\n","import { ICartItemConfiguratorParamsBase } from '@sc/cart/interfaces/i-cart-item-configurator-params-base';\nimport { Product } from '@sc/catalog/classes/product';\nimport { ICategory } from '@sc/catalog/interfaces/i-category';\nimport { IProduct } from '@sc/catalog/interfaces/i-product';\nimport { IConfiguratorSettingsBase } from '@sc/configurator/interfaces/i-configurator-settings-base';\nimport { IHttpResponseError } from '@sc/http';\nimport { HttpRequester } from '@sc/http/classes/http-requester';\nimport { IFieldValidationResultData } from '@sc/validation/interfaces/i-field-validation-result-data';\n\n/**\n * Предоставляет механизмы получения/управления данными конфигураторов.\n */\nexport class ConfiguratorProvider extends HttpRequester {\n /**\n * Возвращает настройки указанного конфигуратора для указанной категории.\n *\n * @param category Данные о категории.\n *\n * @see /doc/api/internal#/Каталог/api_internal_catalog_categories_configurator_settings\n */\n public getConfiguratorSettings<T extends IConfiguratorSettingsBase>(category: ICategory): Promise<T> {\n return this.get<T>(`internal/catalog/categories/${category.id}/configurators/${category.properties?.configurator}/settings`);\n }\n\n /**\n * Возвращает данные о продукте, который соответствует указанной в запросе конфигурации для указанного конфигуратора.\n *\n * @param category Данные о категории.\n * @param params Параметры конфигуратора для поиска товара.\n * @param validationFieldResultData Список полей, для которых необходимо\n * установить данные об ошибках валидации\n * в случае ошибок в запросах.\n *\n * @see /doc/api/internal#/Каталог/api_internal_catalog_categories_configurator_products_get\n */\n public searchProduct(\n category: ICategory,\n params: ICartItemConfiguratorParamsBase,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<IProduct> {\n const requestPromise = this.get<IProduct>(\n `internal/catalog/categories/${category.id}/configurators/${category.properties?.configurator}/product`,\n { params: params },\n (response) => new Product(response.data)\n );\n\n requestPromise.catch((error: IHttpResponseError) => {\n this.errorResponseHandler(error, validationFieldResultData);\n });\n\n return requestPromise;\n }\n\n /**\n * Создает пользовательский шаблон конфигуратора.\n *\n * @param category Данные о категории.\n * @param newTemplate Параметры конфигуратора для поиска товара.\n * @param validationFieldResultData Список полей, для которых необходимо\n * установить данные об ошибках валидации\n * в случае ошибок в запросах.\n *\n * @see /doc/api/internal#/Каталог/api_internal_catalog_categories_configurator_template_create\n */\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters\n public createTemplate<T extends object>(category: ICategory, newTemplate: T, validationFieldResultData: Record<string, IFieldValidationResultData> = {}): Promise<undefined> {\n return this.post<undefined>(\n `internal/catalog/categories/${category.id}/configurators/${category.properties?.configurator}/template`,\n { ...newTemplate },\n // eslint-disable-next-line lodash/prefer-noop, @typescript-eslint/no-empty-function\n () => {},\n validationFieldResultData\n );\n }\n\n /**\n * Удаляет пользовательский шаблон конфигуратора.\n *\n * @param category Данные о категории.\n * @param templateId Идентификатор записи шаблона.\n *\n * @see /doc/api/internal#/Каталог/api_internal_catalog_categories_configurator_template_delete\n */\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters\n public removeTemplate(category: ICategory, templateId: number): Promise<void> {\n return this.delete(`internal/catalog/categories/${category.id}/configurators/${category.properties?.configurator}/template/${templateId}`);\n }\n}\n","import { IDatePeriod } from '@sc/system/interfaces/i-date-period';\nimport { addBusinessDays, endOfDay, endOfToday, endOfTomorrow, endOfYesterday, startOfDay, startOfToday, startOfTomorrow, startOfYesterday } from 'date-fns';\n\n/**\n * Провайдер даты и времени.\n */\nexport class DateTimeProvider {\n /**\n * Возвращает диапазон дат по умолчанию.\n */\n public static defaultDateRanges(): Record<\n string,\n IDatePeriod & {\n /**\n * Текстовое описание.\n */\n label: string;\n }\n > {\n // Прибавляем 1 рабочий день к текущей дате, чтобы получить следующий рабочий день.\n const nextWorkingDay = addBusinessDays(new Date(), 1);\n\n return {\n // 'Следующий рабочий день' - это значение по-умолчанию\n nextWorkingDay: { label: 'Следующий рабочий день', from: startOfDay(nextWorkingDay), to: endOfDay(nextWorkingDay) },\n today: { label: 'Сегодня', from: startOfToday(), to: endOfToday() },\n yesterday: { label: 'Вчера', from: startOfYesterday(), to: endOfYesterday() },\n tomorrow: { label: 'Завтра', from: startOfTomorrow(), to: endOfTomorrow() },\n };\n }\n}\n","import { IProduct } from '@sc/catalog/interfaces/i-product';\n\n/**\n * Класс-помощник для работы со значениями единиц измерения товара.\n */\n\nexport class UnitsHelper {\n /**\n * Список единиц измерения линейной величины.\n */\n private static linearValues: string[] = ['пог.м.', 'м.', 'м2'];\n\n /**\n * Устанавливает список единиц измерения линейной величины.\n *\n * @param linearValues Список единиц измерения линейной величины.\n */\n public static setLinearValues(linearValues: string[]) {\n UnitsHelper.linearValues = linearValues;\n }\n\n /**\n * Возвращает признак, что указанный товар имеет линейную единицу измерения.\n *\n * @param product Данные о товаре для которого нужно проверить линейность его единицы измерения.\n */\n public static productIsMeasurable(product: IProduct): boolean {\n return UnitsHelper.linearValues.includes(product.unit);\n }\n\n /**\n * Возвращает кратность количества для указанного товара.\n *\n * @param product Данные о товаре для которого необходимо вернуть кратность количества.\n */\n public static getProductMultiplicity(product: IProduct): number {\n return !product.properties?.ignoreMinCountCheck && product.properties?.minCount && !UnitsHelper.productIsMeasurable(product) ? product.properties.minCount : 1;\n }\n\n /**\n * Возвращает кратность длины для указанного товара.\n *\n * @param product Данные о товаре для которого необходимо вернуть кратность длины.\n */\n public static getProductLengthMultiplicity(product: IProduct): number {\n if (product.properties?.lengthStep) {\n return product.properties.lengthStep;\n }\n\n return !product.properties?.ignoreMinCountCheck && product.properties?.minCount ? product.properties.minCount : 0.01;\n }\n}\n","import { Manager } from '@sc/managers/classes/manager';\nimport { IManager } from '@sc/managers/interfaces/i-manager';\n\n/**\n * Содержит механизмы генерации данных о менеджере.\n */\nexport class ManagerDataFactory {\n /**\n * Генерирует и возвращает данные-заглушку неопределённого менеджера.\n */\n public static generateUndefinedManagerInstance(): IManager {\n return new Manager({ id: 0, name: '- Не назначен -', isActive: true, guid: '-undefined-' } as IManager);\n }\n\n /**\n * Выполняет проверку, является ли указанная запись записью-заглушкой с данными о неопределённом менеджере.\n *\n * @param manager Запись для проверки.\n */\n public static isUndefinedManagerInstance(manager: IManager): boolean {\n return manager.id === 0 && manager.guid === '-undefined-';\n }\n}\n","import { HttpCachedRequester } from '@sc/http/classes/http-cached-requester';\nimport { Manager } from '@sc/managers/classes/manager';\nimport { IManager } from '@sc/managers/interfaces/i-manager';\nimport { IPaginatedResponse } from '@sc/pagination/interfaces/i-paginated-response';\nimport { TypedInstanceFactory } from '@sc/system/providers/typed-instance-factory';\n\n/**\n * Предоставляет механизмы получения/управления данными о пользователях.\n */\nexport class ManagerDataProvider extends HttpCachedRequester {\n /**\n * Возвращает {@link Promise} для получения справочника списка менеджеров.\n */\n public async getManagers(): Promise<IManager[]> {\n const url = '/internal/managers';\n const cachedResponse = HttpCachedRequester.getCachedResponse<IManager[]>(url);\n\n if (cachedResponse) {\n return cachedResponse;\n }\n\n const data = await this.get<IPaginatedResponse<IManager>>(url);\n const responseData = data.data.map((value) => TypedInstanceFactory.instanceInitializer(Manager, value));\n\n this.cacheResponse(url, responseData);\n\n return responseData;\n }\n}\n","/* eslint-disable @typescript-eslint/no-unnecessary-condition */\n\nimport { ClientShortInfo } from '@sc/clients/classes/client-short-info';\nimport { DeliveryAddress } from '@sc/clients/classes/delivery-address';\nimport { IClientShortInfo } from '@sc/clients/interfaces/i-client-short-info';\nimport { OrderShortInfo } from '@sc/orders/classes/order-short-info';\nimport { IOrderInfo } from '@sc/orders/interfaces/i-order-info';\nimport { SalesDirection } from '@sc/references/classes/sales-direction';\nimport { Warehouse } from '@sc/references/classes/warehouse';\nimport { ISalesDirection } from '@sc/references/interfaces/i-sales-direction';\nimport { UserShortInfo } from '@sc/user/classes/user-short-info';\nimport { IUserShortInfo } from '@sc/user/interfaces/i-user-short-info';\nimport { parseISO } from 'date-fns';\nimport { isString } from 'lodash-es';\n\n/**\n * Краткие данные о заказе.\n */\nexport class OrderInfo extends OrderShortInfo implements IOrderInfo {\n /**\n * Краткие данные о клиенте.\n */\n public client: IClientShortInfo;\n\n /**\n * Данные об оплате заказа.\n */\n public payment: IOrderInfo['payment'];\n\n /**\n * Данные о доставке заказа.\n */\n public delivery: IOrderInfo['delivery'];\n\n /**\n * Краткие данные о пользователе, за которым закреплен заказ.\n */\n public attachedUser?: IUserShortInfo;\n\n /**\n * Идентификатор статуса заказа.\n */\n public status: number;\n\n /**\n * Направление продаж заказа.\n */\n public salesDirection: ISalesDirection;\n\n /**\n * Дата и время начала обработки заказа.\n */\n public pendingAt?: Date;\n\n /**\n * Дата и время завершения обработки заказа.\n */\n public processedAt?: Date;\n\n /**\n * Признак того, что заказ создан из товаров, которые имеют признак \"Под заказ\".\n */\n public isOnOrder: boolean;\n\n /**\n * Признак того, что заказ создан из товаров, которые имеют признак \"Нет в наличии\".\n */\n public isNotInStock: boolean;\n\n /**\n * Инициализирует экземпляр класса {@link OrderInfo}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IOrderInfo>) {\n super(data);\n\n this.client = new ClientShortInfo(data?.client);\n this.payment = {\n type: data?.payment?.type ?? -1,\n status: data?.payment?.status ?? -1,\n onlinePaymentLink: data?.payment?.onlinePaymentLink,\n };\n this.delivery = {\n type: data?.delivery?.type ?? -1,\n date: isString(data?.delivery?.date) ? parseISO(data.delivery.date) : (data?.delivery?.date ?? new Date()),\n address: data?.delivery?.address ? new DeliveryAddress(data.delivery.address) : undefined,\n warehouse: data?.delivery?.warehouse ? new Warehouse(data.delivery.warehouse) : undefined,\n };\n this.attachedUser = new UserShortInfo(data?.attachedUser);\n this.status = data?.status ?? 0;\n this.salesDirection = new SalesDirection(data?.salesDirection);\n this.pendingAt = isString(data?.pendingAt) ? parseISO(data.pendingAt) : data?.pendingAt;\n this.processedAt = isString(data?.processedAt) ? parseISO(data.processedAt) : data?.processedAt;\n\n this.isOnOrder = data?.isOnOrder ?? false;\n this.isNotInStock = data?.isNotInStock ?? false;\n }\n}\n","import { ICartItemConfiguratorParamsBase } from '@sc/cart/interfaces/i-cart-item-configurator-params-base';\nimport { ClientProduct } from '@sc/catalog/classes/client-product';\nimport { IClientProduct } from '@sc/catalog/interfaces/i-client-product';\nimport { IOrderProduct } from '@sc/orders/interfaces/i-order-product';\nimport { Identity } from '@sc/system/classes/identity';\n\n/**\n * Данные о продукте заказа.\n */\nexport class OrderProduct extends Identity implements IOrderProduct {\n /**\n * Данные о продукте.\n */\n public product: IClientProduct;\n\n /**\n * Количество товара/услуги.\n */\n public quantity: number;\n\n /**\n * Валюта товара или услуги.\n */\n public currency: string;\n\n /**\n * Стоимость единицы товара или услуги в валюте.\n */\n public costOne: number;\n\n /**\n * Стоимость единицы товара или услуги в рублях.\n */\n public costOneRub: number;\n\n /**\n * Итоговая стоимость товара или услуги в валюте.\n */\n public cost: number;\n\n /**\n * Итоговая стоимость товара или услуги в рублях.\n */\n public costRub: number;\n\n /**\n * Описание позиции.\n */\n public marker?: string;\n\n /**\n * Высота товара.\n */\n public height?: number;\n\n /**\n * Длина товара.\n */\n public length?: number;\n\n /**\n * Ширина товара.\n */\n public width?: number;\n\n /**\n * Идентификатор логической группы товаров/услуг.\n */\n public logicGroupId?: string;\n\n /**\n * Направление продаж.\n */\n public salesDirection?: number;\n\n /**\n * URL изображения со спецификацией.\n */\n public specificationImgUrl?: string;\n\n /**\n * Название (slug) конфигуратора.\n */\n public configurator?: string;\n\n /**\n * Параметры введенные в конфигуратор, при добавлении позиции в корзину.\n */\n public configuratorParams?: ICartItemConfiguratorParamsBase;\n\n /**\n * Вариант продольного распила.\n *\n * В качестве значения указывается ширина продукта,\n * а в качестве ключа указывается код продукта,\n * который соответствует указанной ширине. Количество не ограничено.\n */\n public sawing?: Record<string, number>;\n\n /**\n * Инициализирует экземпляр класса {@link OrderProduct}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data: IOrderProduct) {\n super(data);\n\n this.product = new ClientProduct(data.product);\n this.quantity = data.quantity;\n this.currency = data.currency;\n this.costOne = data.costOne;\n this.costOneRub = data.costOneRub;\n this.cost = data.cost;\n this.costRub = data.costRub;\n this.marker = data.marker;\n this.height = data.height;\n this.length = data.length;\n this.width = data.width;\n this.logicGroupId = data.logicGroupId;\n this.salesDirection = data.salesDirection;\n this.specificationImgUrl = data.specificationImgUrl;\n this.configurator = data.configurator;\n this.configuratorParams = data.configuratorParams;\n this.sawing = data.sawing;\n }\n}\n","import { ContragentFactory } from '@sc/clients/classes/contragent/contragent-factory';\nimport { IContragentIc } from '@sc/clients/interfaces/contragent/i-contragent-ic';\nimport { IContragentPerson } from '@sc/clients/interfaces/contragent/i-contragent-person';\nimport { IContragentUlNr } from '@sc/clients/interfaces/contragent/i-contragent-ul-nr';\nimport { IContragentUlR } from '@sc/clients/interfaces/contragent/i-contragent-ul-r';\nimport { OrderInfo } from '@sc/orders/classes/order-info';\nimport { OrderProduct } from '@sc/orders/classes/order-product';\nimport { IOrder } from '@sc/orders/interfaces/i-order';\nimport { IOrderProduct } from '@sc/orders/interfaces/i-order-product';\nimport { Reference } from '@sc/system/classes/reference';\nimport { IReference } from '@sc/system/interfaces/i-reference';\n\n/**\n * Данные о заказе.\n */\nexport class Order extends OrderInfo implements IOrder {\n /**\n * Список продуктов заказа.\n */\n public products: IOrderProduct[];\n\n /**\n * Список счетов заказа.\n */\n public invoices?: string[];\n\n /**\n * Комментарий клиента к заказу.\n */\n public comment?: string;\n\n /**\n * Изображение, прикрепленное к заказу клиентом во время создания.\n */\n public image?: string;\n\n /**\n * Данные о контрагенте.\n */\n public contragent?: IContragentPerson | IContragentIc | IContragentUlR | IContragentUlNr;\n\n /**\n * Штрих-код заказа.\n */\n public barcode?: string;\n\n /**\n * Данные об источнике заказа.\n */\n public orderSource?: IReference;\n\n /**\n * Признак, что разрешена передача заказа в работу без оплаты.\n */\n public isAllowProcessingWithoutPayment?: boolean;\n\n /**\n * Инициализирует экземпляр класса {@link Order}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data: Partial<IOrder>) {\n super(data);\n\n this.products = (data.products ?? []).map((product) => new OrderProduct(product));\n this.invoices = data.invoices ?? [];\n this.comment = data.comment;\n this.image = data.image;\n this.contragent = data.contragent ? ContragentFactory.createInstance(data.contragent) : undefined;\n this.barcode = data.barcode;\n this.orderSource = data.orderSource ? new Reference(data.orderSource) : undefined;\n this.isAllowProcessingWithoutPayment = data.isAllowProcessingWithoutPayment;\n }\n}\n","/* eslint-disable @typescript-eslint/no-unnecessary-condition,@typescript-eslint/no-unsafe-argument,@typescript-eslint/prefer-promise-reject-errors,@typescript-eslint/use-unknown-in-catch-callback-variable,vue/max-len */\n\nimport { IFilterGroup } from '@sc/data-table/interfaces/i-filter-group';\nimport { IPaginationRequestParams } from '@sc/data-table/interfaces/i-pagination-request-params';\nimport { ISortRequestParams } from '@sc/data-table/interfaces/i-sort-request-params';\nimport { Order } from '@sc/orders/classes/order';\nimport { OrderInfo } from '@sc/orders/classes/order-info';\nimport { IClientOrderStatistics } from '@sc/orders/interfaces/i-client-order-statistics';\nimport { IOrder } from '@sc/orders/interfaces/i-order';\nimport { IOrderInfo } from '@sc/orders/interfaces/i-order-info';\nimport { IPaginatedResponse } from '@sc/pagination/interfaces';\nimport { BasePaginationProvider } from '@sc/pagination/providers/base-pagination-provider';\nimport { IDatePeriod } from '@sc/system/interfaces/i-date-period';\n\n/**\n * Предоставляет механизмы получения/управления данными о заказах.\n */\nexport class OrdersDataProvider extends BasePaginationProvider {\n /**\n * Возвращает данные о заказах, удовлетворяющих указанным параметрам поиска.\n *\n * @param filters Параметры фильтрации данных.\n * @param sortParams Параметры сортировки.\n * @param paginationParams Параметры пагинации.\n *\n * @see /doc/api/internal#/Заказы/api_internal_orders_get_list\n */\n public getOrders(filters?: IFilterGroup, sortParams?: ISortRequestParams, paginationParams?: IPaginationRequestParams): Promise<IPaginatedResponse<IOrderInfo>> {\n return this.getPaginated<IOrderInfo>('/internal/orders', filters, sortParams ? [sortParams] : undefined, paginationParams, {}, (response) => {\n const result = { ...response.data };\n\n result.data = result.data.map((item: IOrderInfo) => new OrderInfo(item));\n\n return result;\n });\n }\n\n /**\n * Возвращает данные о количестве и сумме заказов клиента помесячно, с возможностью ограничения периода.\n *\n * @param clientId Идентификатор клиента для которого необходимо вернуть данные.\n * @param period Период, за который запрашивается статистика.\n */\n public getClientOrderStatistics(clientId: number, period?: IDatePeriod): Promise<IClientOrderStatistics> {\n return this.get<IClientOrderStatistics>(`/internal/clients/${clientId}/orders/statistics`, period ? { period: period } : {});\n }\n\n /**\n * Возвращает данные заказа с указанным идентификатором.\n *\n * @param orderId Идентификатор заказа для которого необходимо вернуть данные.\n */\n public getOrder(orderId: number): Promise<IOrder> {\n return this.get<IOrder>(`/internal/orders/${orderId}`, {}, (response) => new Order(response.data));\n }\n}\n","import { Product } from '@sc/catalog/classes/product';\nimport { CostSourceEnum } from '@sc/catalog/enums/cost-source-enum';\nimport { IProduct } from '@sc/catalog/interfaces/i-product';\nimport { ClientShortInfo } from '@sc/clients/classes/client-short-info';\nimport { IClientShortInfo } from '@sc/clients/interfaces/i-client-short-info';\nimport { IPriceAnalyze } from '@sc/price-analyze/interfaces/i-price-analyze';\n\n/**\n * Результат анализа цен.\n */\nexport class PriceAnalyze implements IPriceAnalyze {\n /**\n * Краткие данные о клиенте.\n */\n public client: IClientShortInfo;\n\n /**\n * Базовые данные о продукте.\n */\n public product: IProduct;\n\n /**\n * Стоимость товара или услуги.\n */\n public cost: number;\n\n /**\n * Коэффициент стоимости продукта от розничной цены.\n */\n public costCoefficient: number;\n\n /**\n * Источник клиентской цены.\n */\n public source: CostSourceEnum;\n\n /**\n * Инициализирует экземпляр класса {@link PriceAnalyze}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IPriceAnalyze) {\n this.client = new ClientShortInfo(data?.client);\n this.product = new Product(data?.product);\n this.cost = data?.cost ?? 0;\n this.costCoefficient = data?.costCoefficient ?? 0;\n this.source = data?.source ?? CostSourceEnum.Product;\n }\n}\n","import { IPriceAnalyzeFilters } from '@sc/price-analyze/interfaces/i-price-analyze-filters';\nimport { isArray, isEmpty, isNil, isObject, omitBy } from 'lodash-es';\n\n/**\n * Конвертирует параметры фильтрации в валидные параметры запроса.\n *\n * @param filters Параметры фильтрации.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const convertPriceAnalyzeFilters = (filters?: IPriceAnalyzeFilters): Record<string, any> => {\n if (!filters) {\n return {};\n }\n\n return omitBy(\n {\n cities: filters.cities?.map((city) => city.id),\n clients: filters.clients?.map((client) => client.id),\n managers: filters.managers?.map((manager) => manager.id),\n partnerGroups: filters.partnerGroups?.map((partnerGroup) => partnerGroup.id),\n salesDirections: filters.salesDirections?.map((salesDirection) => salesDirection.id),\n hideNotActive: filters.hideNotActive,\n },\n (value) => isNil(value) || ((isArray(value) || isObject(value)) && isEmpty(value))\n );\n};\n","import { IPriceAnalyzeParameter } from '@sc/price-analyze/interfaces/i-price-analyze-parameter';\nimport { IPriceAnalyzeParams } from '@sc/price-analyze/interfaces/i-price-analyze-params';\nimport { ITypedNullableRange } from '@sc/system/interfaces/i-typed-nullable-range';\n\n/**\n * Конвертирует параметры анализа цен в валидные параметры запроса.\n *\n * @param params Параметры для конвертации.\n */\nexport const convertPriceAnalyzeParams = (params: IPriceAnalyzeParams): ITypedNullableRange<IPriceAnalyzeParameter> => {\n const result: ITypedNullableRange<IPriceAnalyzeParameter> = {};\n\n if (params.from && (params.from.coefficient || params.from.value)) {\n result.from = {};\n\n if (params.from.coefficient) {\n result.from.priceCoefficientId = params.from.coefficient.id;\n }\n\n if (params.from.value) {\n result.from.increasePercent = params.from.value;\n }\n }\n\n if (params.to && (params.to.coefficient || params.to.value)) {\n result.to = {};\n\n if (params.to.coefficient) {\n result.to.priceCoefficientId = params.to.coefficient.id;\n }\n\n if (params.to.value) {\n result.to.increasePercent = params.to.value;\n }\n }\n\n return result;\n};\n","import { HttpRequester } from '@sc/http/classes/http-requester';\nimport { PriceAnalyze } from '@sc/price-analyze/classes/price-analyze';\nimport { convertPriceAnalyzeFilters } from '@sc/price-analyze/converters/price-analyze-filters';\nimport { convertPriceAnalyzeParams } from '@sc/price-analyze/converters/price-analyze-params';\nimport { IPriceAnalyze } from '@sc/price-analyze/interfaces/i-price-analyze';\nimport { IPriceAnalyzeFilters } from '@sc/price-analyze/interfaces/i-price-analyze-filters';\nimport { IPriceAnalyzeParams } from '@sc/price-analyze/interfaces/i-price-analyze-params';\nimport { ITypedNullableRange } from '@sc/system/interfaces/i-typed-nullable-range';\n\n/**\n * Предоставляет механизмы анализа цен.\n */\nexport class PriceAnalyzeProvider extends HttpRequester {\n /**\n * Возвращает список клиентских цен на продукты в указанном диапазоне цены.\n *\n * @param productId Идентификатор продукта.\n * @param params Параметры анализа цен.\n * @param filters Параметры фильтрации данных.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_products_analyze\n */\n public analyzeProductPrices(productId: number, params: IPriceAnalyzeParams, filters?: IPriceAnalyzeFilters): Promise<IPriceAnalyze[]> {\n return this.get<IPriceAnalyze[]>(\n `/internal/price/products/${productId}/analyze`,\n {\n ...convertPriceAnalyzeParams(params),\n filters: convertPriceAnalyzeFilters(filters),\n },\n (response) => response.data.map((result) => new PriceAnalyze(result))\n );\n }\n\n /**\n * Возвращает список клиентских цен на продукты категории в указанном диапазоне цены.\n *\n * @param productCategoryId Идентификатор категории продукта.\n * @param params Параметры анализа цен.\n * @param filters Параметры фильтрации данных.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_categories_analyze\n */\n public analyzeCategoryPrices(productCategoryId: number, params: IPriceAnalyzeParams, filters?: IPriceAnalyzeFilters): Promise<IPriceAnalyze[]> {\n return this.get<IPriceAnalyze[]>(\n `/internal/price/categories/${productCategoryId}/analyze`,\n {\n ...convertPriceAnalyzeParams(params),\n filters: convertPriceAnalyzeFilters(filters),\n },\n (response) => response.data.map((result) => new PriceAnalyze(result))\n );\n }\n\n /**\n * Возвращает список клиентских цен на продукты категории в указанном диапазоне цены за квадратный метр.\n *\n * @param productCategoryId Идентификатор категории продукта.\n * @param params Параметры анализа цен.\n * @param params.from Цена больше или равна значению.\n * @param params.to Цена меньше или равна значению.\n * @param filters Параметры фильтрации данных.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_categories_analyze_by_square\n */\n public analyzeCategoryPricesBySquare(productCategoryId: number, params: ITypedNullableRange<number>, filters?: IPriceAnalyzeFilters): Promise<IPriceAnalyze[]> {\n return this.get<IPriceAnalyze[]>(\n `/internal/price/categories/${productCategoryId}/analyze/square`,\n {\n ...params,\n filters: convertPriceAnalyzeFilters(filters),\n },\n (response) => response.data.map((result) => new PriceAnalyze(result))\n );\n }\n}\n","import { IPriceHistoryItem } from '@sc/price-history/interfaces/i-price-history-item';\nimport { Currency } from '@sc/references/classes/currency';\nimport { ICurrency } from '@sc/references/interfaces/i-currency';\nimport { CodedIdentity } from '@sc/system/classes/coded-identity';\nimport { ICodedIdentity } from '@sc/system/interfaces/i-coded-identity';\nimport { UserShortInfo } from '@sc/user/classes/user-short-info';\nimport { IUserShortInfo } from '@sc/user/interfaces/i-user-short-info';\nimport { parseISO } from 'date-fns';\nimport { isString } from 'lodash-es';\n\n/**\n * Данные о единичной записи истории цены на продукт/услугу.\n */\nexport class PriceHistoryItem implements IPriceHistoryItem {\n /**\n * @inheritDoc\n */\n public cost: number;\n\n /**\n * @inheritDoc\n */\n public isLowCost: boolean;\n\n /**\n * @inheritDoc\n */\n public isRetail: boolean;\n\n /**\n * @inheritDoc\n */\n public costDate: Date;\n\n /**\n * @inheritDoc\n */\n public discountName?: string;\n\n /**\n * @inheritDoc\n */\n public priceTemplateName?: string;\n\n /**\n * @inheritDoc\n */\n public product?: ICodedIdentity;\n\n /**\n * @inheritDoc\n */\n public client?: IUserShortInfo;\n\n /**\n * @inheritDoc\n */\n public executor?: IUserShortInfo;\n\n /**\n * @inheritDoc\n */\n public currency?: ICurrency;\n\n /**\n * Инициализирует экземпляр класса {@link PriceHistoryItem}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data: Partial<IPriceHistoryItem>) {\n this.cost = data.cost ?? 0;\n this.isLowCost = data.isLowCost ?? false;\n this.isRetail = data.isRetail ?? false;\n this.costDate = isString(data.costDate) ? parseISO(data.costDate) : (data.costDate ?? new Date());\n this.discountName = data.discountName;\n this.priceTemplateName = data.priceTemplateName;\n this.product = data.product ? new CodedIdentity(data.product) : undefined;\n this.client = data.client ? new UserShortInfo(data.client) : undefined;\n this.executor = data.executor ? new UserShortInfo(data.executor) : undefined;\n this.currency = data.currency ? new Currency(data.currency) : undefined;\n }\n}\n","import { PriceHistoryItem } from '@sc/price-history/classes/price-history-item';\nimport { IPriceHistoryItem } from '@sc/price-history/interfaces/i-price-history-item';\nimport { IProductPriceHistory } from '@sc/price-history/interfaces/i-product-price-history';\nimport { CodedIdentity } from '@sc/system/classes/coded-identity';\nimport { map } from 'lodash-es';\n\n/**\n * Данные записи истории изменения цены на товар или услугу.\n */\nexport class ProductPriceHistory extends CodedIdentity implements IProductPriceHistory {\n /**\n * @inheritDoc\n */\n public history: IPriceHistoryItem[];\n\n /**\n * Инициализирует экземпляр класса {@link ProductPriceHistory}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data: IProductPriceHistory) {\n super(data);\n\n this.history = map(data.history, (item) => new PriceHistoryItem(item));\n }\n}\n","import { AppConfigProvider } from '@sc/config/providers/app-config-provider';\nimport { HttpRequester } from '@sc/http/classes/http-requester';\nimport { ProductPriceHistory } from '@sc/price-history/classes/product-price-history';\nimport { IPriceHistoryRequestParams } from '@sc/price-history/interfaces/i-price-history-request-params';\nimport { IProductPriceHistory } from '@sc/price-history/interfaces/i-product-price-history';\nimport { format } from 'date-fns';\nimport { isArray, isDate, isEmpty, isNil, isObject, map, merge, omitBy } from 'lodash-es';\n\n/**\n * Предоставляет механизмы для получения истории изменения цен.\n */\nexport class PriceHistoryDataProvider extends HttpRequester {\n /**\n * Инициализирует экземпляр класса {@link UserAuthDataProvider}.\n */\n public constructor() {\n super();\n\n this.baseUrl = `${(AppConfigProvider.getConfig().http.priceHistoryApiUrl ?? '') as string}/api`;\n }\n\n /**\n * Возвращает данные об истории изменения цен.\n *\n * @param filters Фильтры для поиска истории изменения цен.\n *\n * @see /docs/api#/operations/api_internal_price_history_get\n */\n public getProductPriceHistory(filters: IPriceHistoryRequestParams): Promise<IProductPriceHistory[]> {\n const apiDateFormat = AppConfigProvider.getConfig().dateFormats.api;\n const updatedFilters = omitBy(\n merge(filters, {\n costDate: {\n from: isDate(filters.costDate?.from) ? format(filters.costDate.from, apiDateFormat) : filters.costDate?.from,\n to: isDate(filters.costDate?.to) ? format(filters.costDate.to, apiDateFormat) : filters.costDate?.to,\n },\n } as IPriceHistoryRequestParams),\n (value) => isNil(value) || ((isArray(value) || isObject(value)) && isEmpty(value))\n );\n\n return this.get<IProductPriceHistory[]>('/internal/history', updatedFilters, (response) => map(response.data, (rec) => new ProductPriceHistory(rec)));\n }\n}\n","import { IRecommendationsList } from '@sc/recommendations/interfaces/i-recommendations-list';\nimport { CodedIdentity } from '@sc/system/';\nimport { ICodedIdentity } from '@sc/system/interfaces/i-coded-identity';\n\n/**\n * Список рекомендованных продуктов и категорий.\n */\nexport class RecommendationsList implements IRecommendationsList {\n /**\n * Список рекомендованных продуктов.\n */\n public products: ICodedIdentity[] = [];\n\n /**\n * Список рекомендованных категорий продуктов.\n */\n public productCategories: ICodedIdentity[] = [];\n\n /**\n * Инициализирует экземпляр класса {@link RecommendationsList}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IRecommendationsList) {\n if (data?.products) {\n this.products = data.products.map((value) => new CodedIdentity(value));\n }\n\n if (data?.productCategories) {\n this.productCategories = data.productCategories.map((value) => new CodedIdentity(value));\n }\n }\n}\n","import { AppConfigProvider } from '@sc/config';\nimport { HttpRequester } from '@sc/http/classes/http-requester';\nimport { RecommendationsList } from '@sc/recommendations/classes/recommendations-list';\nimport { IRecommendationsList } from '@sc/recommendations/interfaces/i-recommendations-list';\nimport { ICatalogableItem } from '@sc/system/interfaces/i-catalogable-item';\n\n/**\n * Предоставляет механизмы получения/управления данными о рекомендациях к продуктам и категориям.\n */\nexport class RecommendationsDataProvider extends HttpRequester {\n /**\n * Инициализирует экземпляр класса {@link UserAuthDataProvider}.\n */\n public constructor() {\n super();\n\n this.baseUrl = `${(AppConfigProvider.getConfig().http.recommendationsApiUrl ?? '') as string}/api`;\n }\n\n /**\n * Возвращает данные о рекомендациях указанной категории продуктов.\n *\n * @param productCategory Данные о категории продуктов, для которой необходимо получить рекомендации.\n * @see /docs/api#/operations/api_internal_recommendations_product_category_get\n */\n public getProductCategoryRecommendations(productCategory: ICatalogableItem): Promise<IRecommendationsList> {\n return this.get<IRecommendationsList>(`/internal/recommendations/categories/${productCategory.id}`, {}, (response) => new RecommendationsList(response.data));\n }\n\n /**\n * Возвращает данные о рекомендациях указанного продукта.\n *\n * @param product Данные о продукте, для которого необходимо получить рекомендации.\n * @see /docs/api#/operations/api_internal_recommendations_product_get\n */\n public getProductRecommendations(product: ICatalogableItem): Promise<IRecommendationsList> {\n return this.get<IRecommendationsList>(`/internal/recommendations/products/${product.id}`, {}, (response) => new RecommendationsList(response.data));\n }\n\n /**\n * Выполняет сохранение данных о рекомендуемых категориях продуктов.\n *\n * @param productCategory Данные о категории для которой необходимо сохранить список рекомендуемых товаров.\n * @param recommendations Список рекомендованных продуктов и категорий.\n * @see /docs/api#/operations/api_internal_recommendations_product_category_save\n */\n public saveProductCategoryRecommendations(productCategory: ICatalogableItem, recommendations: IRecommendationsList): Promise<void> {\n return this.post(`/internal/recommendations/categories/${productCategory.id}`, {\n product_categories: recommendations.productCategories.map((item) => item.id),\n products: recommendations.products.map((item) => item.id),\n });\n }\n\n /**\n * Выполняет сохранение данных о рекомендуемых продуктах.\n *\n * @param product Данные о продукте для которого необходимо сохранить список рекомендуемых товаров.\n * @param recommendations Список рекомендованных продуктов и категорий.\n * @see /docs/api#/operations/api_internal_recommendations_product_save\n */\n public saveProductRecommendations(product: ICatalogableItem, recommendations: IRecommendationsList): Promise<void> {\n return this.post(`/internal/recommendations/products/${product.id}`, {\n product_categories: recommendations.productCategories.map((item) => item.id),\n products: recommendations.products.map((item) => item.id),\n });\n }\n}\n","/* eslint-disable @typescript-eslint/no-unnecessary-condition */\n\nimport { PropertyType } from '@sc/catalog/classes/property-type';\nimport { IPropertyType } from '@sc/catalog/interfaces/i-property-type';\nimport { HttpCachedRequester } from '@sc/http/classes/http-cached-requester';\nimport { AnyReference } from '@sc/references/classes/any-reference';\nimport { ChannelPrimaryInterest } from '@sc/references/classes/channel-primary-interest';\nimport { CityWithRegionAndCountry } from '@sc/references/classes/city-with-region-and-country';\nimport { ContactPosition } from '@sc/references/classes/contact-position';\nimport { Country } from '@sc/references/classes/country';\nimport { Currency } from '@sc/references/classes/currency';\nimport { DeliveryType } from '@sc/references/classes/delivery-type';\nimport { Opf } from '@sc/references/classes/opf';\nimport { OrderPaymentStatus } from '@sc/references/classes/order-payment-status';\nimport { OrderStatus } from '@sc/references/classes/order-status';\nimport { PartnerGroup } from '@sc/references/classes/partner-group';\nimport { PaymentType } from '@sc/references/classes/payment-type';\nimport { PriceCoefficient } from '@sc/references/classes/price-coefficient';\nimport { ProductFileType } from '@sc/references/classes/product-file-type';\nimport { Region } from '@sc/references/classes/region';\nimport { ResourceType } from '@sc/references/classes/resource-type';\nimport { SalesDirection } from '@sc/references/classes/sales-direction';\nimport { SourcePrimaryInterest } from '@sc/references/classes/source-primary-interest';\nimport { Warehouse } from '@sc/references/classes/warehouse';\nimport { IChannelPrimaryInterest } from '@sc/references/interfaces/i-channel-primary-interest';\nimport { ICityWithRegionAndCountry } from '@sc/references/interfaces/i-city-with-region-and-country';\nimport { IContactPosition } from '@sc/references/interfaces/i-contact-position';\nimport { ICountry } from '@sc/references/interfaces/i-country';\nimport { ICurrency } from '@sc/references/interfaces/i-currency';\nimport { IDeliveryType } from '@sc/references/interfaces/i-delivery-type';\nimport { IOpf } from '@sc/references/interfaces/i-opf';\nimport { IOrderPaymentStatus } from '@sc/references/interfaces/i-order-payment-status';\nimport { IOrderStatus } from '@sc/references/interfaces/i-order-status';\nimport { IPartnerGroup } from '@sc/references/interfaces/i-partner-group';\nimport { IPaymentType } from '@sc/references/interfaces/i-payment-type';\nimport { IPriceCoefficient } from '@sc/references/interfaces/i-price-coefficient';\nimport { IProductFileType } from '@sc/references/interfaces/i-product-file-type';\nimport { IRegion } from '@sc/references/interfaces/i-region';\nimport { IResourceType } from '@sc/references/interfaces/i-resource-type';\nimport { ISalesDirection } from '@sc/references/interfaces/i-sales-direction';\nimport { ISourcePrimaryInterest } from '@sc/references/interfaces/i-source-primary-interest';\nimport { IWarehouse } from '@sc/references/interfaces/i-warehouse';\nimport { IReference } from '@sc/system/interfaces/i-reference';\n\n/**\n * Предоставляет механизмы получения данных из справочников.\n */\nexport class ReferenceDataProvider extends HttpCachedRequester {\n /**\n * Возвращает {@link Promise} для получения данных указанного справочника.\n *\n * @param referenceName Название справочника.\n * @param useResponseDataCache Признак необходимости кэшировать данные ответов на запросы\n * и использовать в случае аналогичных запросов.\n */\n public getReference(referenceName: string, useResponseDataCache = false): Promise<IReference[]> {\n return this.getTypedDataArrayRequester(AnyReference, `/internal/references/${referenceName}`, useResponseDataCache);\n }\n\n /**\n * Возвращает {@link Promise} для получения справочника данных о канале\n * первичного интереса.\n */\n public getChannelPrimaryInterest(): Promise<IChannelPrimaryInterest[]> {\n return this.getTypedDataArrayRequester(ChannelPrimaryInterest, '/internal/references/channel-primary-interest', true);\n }\n\n /**\n * Возвращает {@link Promise} для получения справочника должностей контактных лиц.\n */\n public getContactPositions(): Promise<IContactPosition[]> {\n return this.getTypedDataArrayRequester(ContactPosition, '/internal/references/contact-position', true);\n }\n\n /**\n * Возвращает {@link Promise} для получения справочника списка валют.\n */\n public getCurrency(): Promise<ICurrency[]> {\n return this.getTypedDataArrayRequester(Currency, '/public/references/currency', true);\n }\n\n /**\n * Возвращает {@link Promise} для получения справочника данных\n * групп партнеров (направлений деятельности).\n */\n public getPartnerGroup(): Promise<IPartnerGroup[]> {\n return this.getTypedDataArrayRequester(PartnerGroup, '/internal/references/partner-group', true);\n }\n\n /**\n * Возвращает {@link Promise} для получения справочника данных организационно-правовых форм.\n */\n public getOpf(): Promise<IOpf[]> {\n return this.getTypedDataArrayRequester(Opf, '/public/references/opf', true);\n }\n\n /**\n * Возвращает {@link Promise} для получения справочника данных статусов оплаты заказов.\n */\n public getOrderPaymentStatuses(): Promise<IOrderPaymentStatus[]> {\n return this.getTypedDataArrayRequester(OrderPaymentStatus, '/public/references/order-payment-status', true);\n }\n\n /**\n * Возвращает {@link Promise} для получения справочника данных статусов заказов.\n */\n public getOrderStatuses(): Promise<IOrderStatus[]> {\n return this.getTypedDataArrayRequester(OrderStatus, '/public/references/order-status', true);\n }\n\n /**\n * Возвращает {@link Promise} для получения справочника данных типов оплаты заказов.\n */\n public getPaymentTypes(): Promise<IPaymentType[]> {\n return this.getTypedDataArrayRequester(PaymentType, '/public/references/payment-type', true);\n }\n\n /**\n * Возвращает {@link Promise} для получения справочника типов ресурсов.\n */\n public getResourceTypes(): Promise<IResourceType[]> {\n return this.getTypedDataArrayRequester(ResourceType, '/internal/references/resource-type', true);\n }\n\n /**\n * Возвращает {@link Promise} для получения справочника данных направлений продаж.\n */\n public getSalesDirections(): Promise<ISalesDirection[]> {\n return this.getTypedDataArrayRequester(SalesDirection, '/public/references/sales-direction', true);\n }\n\n /**\n * Возвращает {@link Promise} для получения справочника данных об источнике первичного интереса.\n */\n public getSourcePrimaryInterest(): Promise<ISourcePrimaryInterest[]> {\n return this.getTypedDataArrayRequester(SourcePrimaryInterest, '/internal/references/source-primary-interest', true);\n }\n\n /**\n * Выполняет поиск данных о городах по терму в названии.\n *\n * @param term Терм поиска.\n */\n public searchCity(term: string): Promise<ICityWithRegionAndCountry[]> {\n return this.getTypedDataArrayRequester(CityWithRegionAndCountry, `/internal/references/city-with-region-and-country/search?term=${term}`);\n }\n\n /**\n * Выполняет поиск данных о регионах по терму в названии.\n *\n * @param term Терм поиска.\n */\n public searchRegion(term: string): Promise<IRegion[]> {\n return this.getTypedDataArrayRequester(Region, `/internal/references/region-with-country/search?term=${term}`);\n }\n\n /**\n * Выполняет поиск данных о странах по терму в названии.\n *\n * @param term Терм поиска.\n */\n public searchCountry(term: string): Promise<ICountry[]> {\n return this.getTypedDataArrayRequester(Country, `/internal/references/country/search?term=${term}`);\n }\n\n /**\n * Возвращает {@link Promise} для получения справочника типов доставки.\n */\n public getDeliveryTypes(): Promise<IDeliveryType[]> {\n return this.getTypedDataArrayRequester(DeliveryType, '/internal/references/delivery-type', true);\n }\n\n /**\n * Возвращает {@link Promise} для получения справочника складов.\n */\n public getWarehouses(): Promise<IWarehouse[]> {\n return this.getTypedDataArrayRequester(Warehouse, '/public/references/warehouse', true);\n }\n\n /**\n * Возвращает {@link Promise} для получения справочника типов свойств.\n */\n public getPropertyTypes(): Promise<IPropertyType[]> {\n return this.getTypedDataArrayRequester(PropertyType, '/internal/references/property-type', true);\n }\n\n /**\n * Возвращает {@link Promise} для получения справочника коэффициентов цен.\n */\n public getPriceCoefficients(): Promise<IPriceCoefficient[]> {\n return this.getTypedDataArrayRequester(PriceCoefficient, '/internal/references/price-coefficient', true);\n }\n\n /**\n * Возвращает {@link Promise} для получения справочника типов файлов продуктов/категорий.\n */\n public getProductFileType(): Promise<IProductFileType[]> {\n return this.getTypedDataArrayRequester(ProductFileType, '/public/references/product-file-type', true);\n }\n}\n","import { IPropertyType } from '@sc/catalog/interfaces/i-property-type';\nimport { HttpRequester } from '@sc/http/classes/http-requester';\nimport { IManager } from '@sc/managers/interfaces/i-manager';\nimport { ManagerDataProvider } from '@sc/managers/providers/manager-data-provider';\nimport { IChannelPrimaryInterest } from '@sc/references/interfaces/i-channel-primary-interest';\nimport { IContactPosition } from '@sc/references/interfaces/i-contact-position';\nimport { ICurrency } from '@sc/references/interfaces/i-currency';\nimport { IDeliveryType } from '@sc/references/interfaces/i-delivery-type';\nimport { IOpf } from '@sc/references/interfaces/i-opf';\nimport { IOrderPaymentStatus } from '@sc/references/interfaces/i-order-payment-status';\nimport { IOrderStatus } from '@sc/references/interfaces/i-order-status';\nimport { IPartnerGroup } from '@sc/references/interfaces/i-partner-group';\nimport { IPaymentType } from '@sc/references/interfaces/i-payment-type';\nimport { IPriceCoefficient } from '@sc/references/interfaces/i-price-coefficient';\nimport { IProductFileType } from '@sc/references/interfaces/i-product-file-type';\nimport { IResourceType } from '@sc/references/interfaces/i-resource-type';\nimport { ISalesDirection } from '@sc/references/interfaces/i-sales-direction';\nimport { ISourcePrimaryInterest } from '@sc/references/interfaces/i-source-primary-interest';\nimport { IWarehouse } from '@sc/references/interfaces/i-warehouse';\nimport { ReferenceDataProvider } from '@sc/references/providers/reference-data-provider';\nimport { noop } from 'lodash-es';\nimport { defineStore } from 'pinia';\nimport { computed, ref } from 'vue';\n\n/**\n * Приватное хранилище данных справочников.\n */\nconst useReferencesPrivateStore = defineStore('__references_private', () => {\n /**\n * Список загружаемых/загруженных на данный момент значений.\n */\n const dataLoaderList = ref<Record<string, boolean>>({});\n\n /**\n * Справочник каналов первичного интереса.\n */\n const channelPrimaryInterestReference = ref<IChannelPrimaryInterest[] | undefined>(undefined);\n\n /**\n * Справочник должностей контактных лиц.\n */\n const contactPositionsReference = ref<IContactPosition[] | undefined>(undefined);\n\n /**\n * Справочник валют.\n */\n const currencyReference = ref<ICurrency[] | undefined>(undefined);\n\n /**\n * Справочник типов доставки.\n */\n const deliveryTypeReference = ref<IDeliveryType[] | undefined>(undefined);\n\n /**\n * Список менеджеров.\n */\n const managersList = ref<IManager[] | undefined>(undefined);\n\n /**\n * Справочник организационно-правовых форм.\n */\n const opfReference = ref<IOpf[] | undefined>(undefined);\n\n /**\n * Справочник статусов оплаты заказа.\n */\n const orderPaymentStatusReference = ref<IOrderPaymentStatus[] | undefined>(undefined);\n\n /**\n * Справочник статусов заказов.\n */\n const orderStatusReference = ref<IOrderStatus[] | undefined>(undefined);\n\n /**\n * Справочник типов оплаты заказов.\n */\n const paymentTypeReference = ref<IPaymentType[] | undefined>(undefined);\n\n /**\n * Справочник групп партнеров.\n */\n const partnerGroupReference = ref<IPartnerGroup[] | undefined>(undefined);\n\n /**\n * Справочник типов файлов продукктов/категорий.\n */\n const productFileTypeReference = ref<IProductFileType[] | undefined>(undefined);\n\n /**\n * Справочник типов ресурсов.\n */\n const resourceTypesReference = ref<IResourceType[] | undefined>(undefined);\n\n /**\n * Справочник направлений продаж.\n */\n const salesDirectionsReference = ref<ISalesDirection[] | undefined>(undefined);\n\n /**\n * Справочник источников первичного интереса.\n */\n const sourcePrimaryInterestReference = ref<ISourcePrimaryInterest[] | undefined>(undefined);\n\n /**\n * Справочник складов.\n */\n const warehousesReference = ref<IWarehouse[] | undefined>(undefined);\n\n /**\n * Справочник типов свойств.\n */\n const propertyTypesReference = ref<IPropertyType[] | undefined>(undefined);\n\n /**\n * Справочник коэффициентов цен.\n */\n const priceCoefficientsReference = ref<IPriceCoefficient[] | undefined>(undefined);\n\n return {\n /**\n * Список загружаемых/загруженных на данный момент значений.\n */\n dataLoaderList,\n\n /**\n * Справочник каналов первичного интереса.\n */\n channelPrimaryInterestReference,\n\n /**\n * Справочник должностей контактных лиц.\n */\n contactPositionsReference,\n\n /**\n * Справочник валют.\n */\n currencyReference,\n\n /**\n * Справочник типов доставки.\n */\n deliveryTypeReference,\n\n /**\n * Список менеджеров.\n */\n managersList,\n\n /**\n * Справочник организационно-правовых форм.\n */\n opfReference,\n\n /**\n * Справочник статусов оплаты заказа.\n */\n orderPaymentStatusReference,\n\n /**\n * Справочник статусов заказов.\n */\n orderStatusReference,\n\n /**\n * Справочник типов оплаты заказов.\n */\n paymentTypeReference,\n\n /**\n * Справочник групп партнеров.\n */\n partnerGroupReference,\n\n /**\n * Справочник типов файлов продукктов/категорий.\n */\n productFileTypeReference,\n\n /**\n * Справочник типов ресурсов.\n */\n resourceTypesReference,\n\n /**\n * Справочник направлений продаж.\n */\n salesDirectionsReference,\n\n /**\n * Справочник источников первичного интереса.\n */\n sourcePrimaryInterestReference,\n\n /**\n * Справочник складов.\n */\n warehousesReference,\n\n /**\n * Справочник типов свойств.\n */\n propertyTypesReference,\n\n /**\n * Справочник коэффициентов цен.\n */\n priceCoefficientsReference,\n };\n});\n\n/**\n * Хранилище данных справочников.\n */\nexport const useReferencesStore = defineStore('references', () => {\n /**\n * Справочник каналов первичного интереса.\n */\n const channelPrimaryInterestsReference = computed((): IChannelPrimaryInterest[] | undefined => {\n const referencesStore = useReferencesPrivateStore();\n\n if (!referencesStore.channelPrimaryInterestReference && !referencesStore.dataLoaderList.channelPrimaryInterestReference) {\n referencesStore.dataLoaderList.channelPrimaryInterestReference = true;\n\n HttpRequester.getInstance(ReferenceDataProvider)\n .getChannelPrimaryInterest()\n .then((data) => {\n referencesStore.channelPrimaryInterestReference = data;\n })\n .catch(noop);\n }\n\n return referencesStore.channelPrimaryInterestReference;\n });\n\n /**\n * Справочник должностей контактных лиц.\n */\n const contactPositionsReference = computed((): IContactPosition[] | undefined => {\n const referencesStore = useReferencesPrivateStore();\n\n if (!referencesStore.contactPositionsReference && !referencesStore.dataLoaderList.contactPositionsReference) {\n referencesStore.dataLoaderList.contactPositionsReference = true;\n\n HttpRequester.getInstance(ReferenceDataProvider)\n .getContactPositions()\n .then((data) => {\n referencesStore.contactPositionsReference = data;\n })\n .catch(noop);\n }\n\n return referencesStore.contactPositionsReference;\n });\n\n /**\n * Справочник валют.\n */\n const currencyReference = computed((): ICurrency[] | undefined => {\n const referencesStore = useReferencesPrivateStore();\n\n if (!referencesStore.currencyReference && !referencesStore.dataLoaderList.currencyReference) {\n referencesStore.dataLoaderList.currencyReference = true;\n\n HttpRequester.getInstance(ReferenceDataProvider)\n .getCurrency()\n .then((data) => {\n referencesStore.currencyReference = data;\n })\n .catch(noop);\n }\n\n return referencesStore.currencyReference;\n });\n\n /**\n * Справочник организационно-правовых форм.\n */\n const opfReference = computed((): IOpf[] | undefined => {\n const referencesStore = useReferencesPrivateStore();\n\n if (!referencesStore.opfReference && !referencesStore.dataLoaderList.opfReference) {\n referencesStore.dataLoaderList.opfReference = true;\n\n HttpRequester.getInstance(ReferenceDataProvider)\n .getOpf()\n .then((data) => {\n referencesStore.opfReference = data;\n })\n .catch(noop);\n }\n\n return referencesStore.opfReference;\n });\n\n /**\n * Справочник статусов оплаты заказа.\n */\n const orderPaymentStatusReference = computed((): IOrderPaymentStatus[] | undefined => {\n const referencesStore = useReferencesPrivateStore();\n\n if (!referencesStore.orderPaymentStatusReference && !referencesStore.dataLoaderList.orderPaymentStatusReference) {\n referencesStore.dataLoaderList.orderPaymentStatusReference = true;\n\n HttpRequester.getInstance(ReferenceDataProvider)\n .getOrderPaymentStatuses()\n .then((data) => {\n referencesStore.orderPaymentStatusReference = data;\n })\n .catch(noop);\n }\n\n return referencesStore.orderPaymentStatusReference;\n });\n\n /**\n * Справочник статусов заказов.\n */\n const orderStatusReference = computed((): IOrderStatus[] | undefined => {\n const referencesStore = useReferencesPrivateStore();\n\n if (!referencesStore.orderStatusReference && !referencesStore.dataLoaderList.orderStatusReference) {\n referencesStore.dataLoaderList.orderStatusReference = true;\n\n HttpRequester.getInstance(ReferenceDataProvider)\n .getOrderStatuses()\n .then((data) => {\n referencesStore.orderStatusReference = data;\n })\n .catch(noop);\n }\n\n return referencesStore.orderStatusReference;\n });\n\n /**\n * Справочник типов оплаты заказов.\n */\n const paymentTypeReference = computed((): IPaymentType[] | undefined => {\n const referencesStore = useReferencesPrivateStore();\n\n if (!referencesStore.paymentTypeReference && !referencesStore.dataLoaderList.paymentTypeReference) {\n referencesStore.dataLoaderList.paymentTypeReference = true;\n\n HttpRequester.getInstance(ReferenceDataProvider)\n .getPaymentTypes()\n .then((data) => {\n referencesStore.paymentTypeReference = data;\n })\n .catch(noop);\n }\n\n return referencesStore.paymentTypeReference;\n });\n\n /**\n * Справочник групп партнеров.\n */\n const partnerGroupsReference = computed((): IPartnerGroup[] | undefined => {\n const referencesStore = useReferencesPrivateStore();\n\n if (!referencesStore.partnerGroupReference && !referencesStore.dataLoaderList.partnerGroupReference) {\n referencesStore.dataLoaderList.partnerGroupReference = true;\n\n HttpRequester.getInstance(ReferenceDataProvider)\n .getPartnerGroup()\n .then((data) => {\n referencesStore.partnerGroupReference = data;\n })\n .catch(noop);\n }\n\n return referencesStore.partnerGroupReference;\n });\n\n /**\n * Справочник типов файлов продуктов/категорий.\n */\n const productFilesTypesReference = computed((): IProductFileType[] | undefined => {\n const referencesStore = useReferencesPrivateStore();\n\n if (!referencesStore.productFileTypeReference && !referencesStore.dataLoaderList.productFileTypeReference) {\n referencesStore.dataLoaderList.productFileTypeReference = true;\n\n HttpRequester.getInstance(ReferenceDataProvider)\n .getProductFileType()\n .then((data) => {\n referencesStore.productFileTypeReference = data;\n })\n .catch(noop);\n }\n\n return referencesStore.productFileTypeReference;\n });\n\n /**\n * Справочник типов ресурсов.\n */\n const resourceTypesReference = computed((): IResourceType[] | undefined => {\n const referencesStore = useReferencesPrivateStore();\n\n if (!referencesStore.resourceTypesReference && !referencesStore.dataLoaderList.resourceTypesReference) {\n referencesStore.dataLoaderList.resourceTypesReference = true;\n\n HttpRequester.getInstance(ReferenceDataProvider)\n .getResourceTypes()\n .then((data) => {\n referencesStore.resourceTypesReference = data;\n })\n .catch(noop);\n }\n\n return referencesStore.resourceTypesReference;\n });\n\n /**\n * Справочник направлений продаж.\n */\n const salesDirectionsReference = computed((): ISalesDirection[] | undefined => {\n const referencesStore = useReferencesPrivateStore();\n\n if (!referencesStore.salesDirectionsReference && !referencesStore.dataLoaderList.salesDirectionsReference) {\n referencesStore.dataLoaderList.salesDirectionsReference = true;\n\n HttpRequester.getInstance(ReferenceDataProvider)\n .getSalesDirections()\n .then((data) => {\n referencesStore.salesDirectionsReference = data;\n })\n .catch(noop);\n }\n\n return referencesStore.salesDirectionsReference;\n });\n\n /**\n * Справочник каналов первичного интереса.\n */\n const sourcePrimaryInterestsReference = computed((): ISourcePrimaryInterest[] | undefined => {\n const referencesStore = useReferencesPrivateStore();\n\n if (!referencesStore.sourcePrimaryInterestReference && !referencesStore.dataLoaderList.sourcePrimaryInterestReference) {\n referencesStore.dataLoaderList.sourcePrimaryInterestReference = true;\n\n HttpRequester.getInstance(ReferenceDataProvider)\n .getSourcePrimaryInterest()\n .then((data) => {\n referencesStore.sourcePrimaryInterestReference = data;\n })\n .catch(noop);\n }\n\n return referencesStore.sourcePrimaryInterestReference;\n });\n\n /**\n * Справочник типов доставки.\n */\n const deliveryTypeReference = computed((): IDeliveryType[] | undefined => {\n const referencesStore = useReferencesPrivateStore();\n\n if (!referencesStore.deliveryTypeReference && !referencesStore.dataLoaderList.deliveryTypeReference) {\n referencesStore.dataLoaderList.deliveryTypeReference = true;\n\n HttpRequester.getInstance(ReferenceDataProvider)\n .getDeliveryTypes()\n .then((data) => {\n referencesStore.deliveryTypeReference = data;\n })\n .catch(noop);\n }\n\n return referencesStore.deliveryTypeReference;\n });\n\n /**\n * Список менеджеров.\n */\n const managersList = computed((): IManager[] | undefined => {\n const referencesStore = useReferencesPrivateStore();\n\n if (!referencesStore.managersList && !referencesStore.dataLoaderList.managersList) {\n referencesStore.dataLoaderList.managersList = true;\n\n HttpRequester.getInstance(ManagerDataProvider)\n .getManagers()\n .then((data) => {\n referencesStore.managersList = data;\n })\n .catch(noop);\n }\n\n return referencesStore.managersList;\n });\n\n /**\n * Справочник складов.\n */\n const warehousesReference = computed((): IWarehouse[] | undefined => {\n const referencesStore = useReferencesPrivateStore();\n\n if (!referencesStore.warehousesReference && !referencesStore.dataLoaderList.warehousesReference) {\n referencesStore.dataLoaderList.warehousesReference = true;\n\n HttpRequester.getInstance(ReferenceDataProvider)\n .getWarehouses()\n .then((data) => {\n referencesStore.warehousesReference = data;\n })\n .catch(noop);\n }\n\n return referencesStore.warehousesReference;\n });\n\n /**\n * Справочник типов свойств.\n */\n const propertyTypesReference = computed((): IPropertyType[] | undefined => {\n const referencesStore = useReferencesPrivateStore();\n\n if (!referencesStore.propertyTypesReference && !referencesStore.dataLoaderList.propertyTypesReference) {\n referencesStore.dataLoaderList.propertyTypesReference = true;\n\n HttpRequester.getInstance(ReferenceDataProvider)\n .getPropertyTypes()\n .then((data) => {\n referencesStore.propertyTypesReference = data;\n })\n .catch(noop);\n }\n\n return referencesStore.propertyTypesReference;\n });\n\n /**\n * Справочник коэффициентов цен.\n */\n const priceCoefficientsReference = computed((): IPriceCoefficient[] | undefined => {\n const referencesStore = useReferencesPrivateStore();\n\n if (!referencesStore.priceCoefficientsReference && !referencesStore.dataLoaderList.priceCoefficientsReference) {\n referencesStore.dataLoaderList.priceCoefficientsReference = true;\n\n HttpRequester.getInstance(ReferenceDataProvider)\n .getPriceCoefficients()\n .then((data) => {\n referencesStore.priceCoefficientsReference = data;\n })\n .catch(noop);\n }\n\n return referencesStore.priceCoefficientsReference;\n });\n\n return {\n /**\n * Справочник каналов первичного интереса.\n */\n channelPrimaryInterestsReference,\n\n /**\n * Справочник должностей контактных лиц.\n */\n contactPositionsReference,\n\n /**\n * Справочник валют.\n */\n currencyReference,\n\n /**\n * Справочник организационно-правовых форм.\n */\n opfReference,\n\n /**\n * Справочник статусов оплаты заказа.\n */\n orderPaymentStatusReference,\n\n /**\n * Справочник статусов заказов.\n */\n orderStatusReference,\n\n /**\n * Справочник типов оплаты заказов.\n */\n paymentTypeReference,\n\n /**\n * Справочник групп партнеров.\n */\n partnerGroupsReference,\n\n /**\n * Справочник типов файлов продуктов/категорий.\n */\n productFilesTypesReference,\n\n /**\n * Справочник типов ресурсов.\n */\n resourceTypesReference,\n\n /**\n * Справочник направлений продаж.\n */\n salesDirectionsReference,\n\n /**\n * Справочник каналов первичного интереса.\n */\n sourcePrimaryInterestsReference,\n\n /**\n * Справочник типов доставки.\n */\n deliveryTypeReference,\n\n /**\n * Список менеджеров.\n */\n managersList,\n\n /**\n * Справочник складов.\n */\n warehousesReference,\n\n /**\n * Справочник типов свойств.\n */\n propertyTypesReference,\n\n /**\n * Справочник коэффициентов цен.\n */\n priceCoefficientsReference,\n };\n});\n","import { IMetaTagItem } from '@sc/seo/interfaces/i-meta-tag-item';\n\n/**\n * Значение метатега.\n */\nexport class MetaTagItem implements IMetaTagItem {\n /**\n * Наименование метатега.\n */\n public name: string;\n\n /**\n * Значение метатега.\n */\n public content: string;\n\n /**\n * Инициализирует экземпляр класса {@link MetaTagItem}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data: IMetaTagItem) {\n this.name = data.name;\n this.content = data.content;\n }\n}\n","import { ResourceType } from '@sc/references/classes/resource-type';\nimport { IResourceType } from '@sc/references/interfaces/i-resource-type';\nimport { MetaTagItem } from '@sc/seo/classes/meta-tag-item';\nimport { IMetaTagItem } from '@sc/seo/interfaces/i-meta-tag-item';\nimport { ISeo } from '@sc/seo/interfaces/i-seo';\n\n/**\n * Данные о SEO-параметрах ресурса.\n */\nexport class Seo implements ISeo {\n /**\n * Тип ресурса.\n */\n public resourceType: IResourceType;\n\n /**\n * Идентификатор ресурса.\n */\n public resourceId: string;\n\n /**\n * Значение заголовка H1 на странице.\n */\n public h1?: string;\n\n /**\n * Значение метатега Title.\n */\n public title?: string;\n\n /**\n * Значение метатега Description.\n */\n public description?: string;\n\n /**\n * Значение метатега Keywords.\n */\n public keywords?: string;\n\n /**\n * Массив дополнительных значений метатегов.\n */\n public meta: IMetaTagItem[];\n\n /**\n * Инициализирует экземпляр класса {@link Seo}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: ISeo) {\n this.resourceType = new ResourceType(data?.resourceType);\n this.resourceId = data?.resourceId ?? '';\n\n this.h1 = data?.h1;\n this.title = data?.title;\n this.description = data?.description;\n this.keywords = data?.keywords;\n this.meta = data?.meta?.map((e) => new MetaTagItem(e)) ?? [];\n }\n}\n","import { HttpRequester } from '@sc/http/classes/http-requester';\nimport { IResourceType } from '@sc/references/interfaces/i-resource-type';\nimport { Seo } from '@sc/seo/classes/seo';\nimport { ISeo } from '@sc/seo/interfaces/i-seo';\nimport { IFieldValidationResultData } from '@sc/validation';\n\n/**\n * Предоставляет механизмы получения SEO-данных ресурсов.\n */\nexport class SeoDataProvider extends HttpRequester {\n /**\n * Возвращает {@link Promise} для получения данных о SEO-параметрах указанного ресурса.\n *\n * @param resourceType Данные о типе ресурса для которого необходимо получить SEO-данные.\n * @param resourceId Идентификатор ресурса для которого необходимо получить SEO-данные.\n */\n public getResourceSeoData(resourceType: IResourceType, resourceId: string): Promise<ISeo> {\n return this.get<ISeo>(`/internal/seo/${resourceType.slug}/${resourceId}`, {}, (response) => new Seo(response.data));\n }\n\n /**\n * Выполняет сохранение данных о SEO-параметрах для указанного ресурса.\n *\n * @param seo SEO-данные о ресурсе.\n * @param validationFieldResultData Список полей, для которых необходимо\n * установить данные об ошибках валидации\n * в случае ошибок в запросах.\n */\n public saveResourceSeoData(seo: ISeo, validationFieldResultData: Record<string, IFieldValidationResultData> = {}): Promise<ISeo> {\n return this.post<ISeo>(`/internal/seo/${seo.resourceType.slug}/${seo.resourceId}`, seo, (response) => new Seo(response.data), validationFieldResultData);\n }\n\n /**\n * Возвращает {@link Promise} для удаления данных о SEO-параметрах указанного ресурса.\n *\n * @param resourceType Данные о типе ресурса для которого необходимо удалить SEO-данные.\n * @param resourceId Идентификатор ресурса для которого необходимо удалить SEO-данные.\n */\n public deleteResourceSeoData(resourceType: IResourceType, resourceId: string): Promise<void> {\n return this.delete(`/internal/seo/${resourceType.slug}/${resourceId}`);\n }\n}\n","/* eslint-disable @typescript-eslint/no-unnecessary-condition,@typescript-eslint/no-unsafe-argument,@typescript-eslint/prefer-promise-reject-errors,@typescript-eslint/use-unknown-in-catch-callback-variable */\n\nimport { HttpRequester } from '@sc/http';\nimport { IAddressSuggestion, IBankSuggestion, IOrganizationSuggestion } from '@sc/suggestion/interfaces';\nimport { IIdentity } from '@sc/system/interfaces';\n\n/**\n * Предоставляет механизмы получения подсказок.\n */\nexport class DataSuggestionProvider extends HttpRequester {\n /**\n * Возвращает подсказки по адресам.\n *\n * @param term Терм поиска.\n *\n * @see /doc/api/public_client_ui#/Подсказки/api_public_get_address_suggestions\n */\n public searchAddresses(term: string): Promise<IAddressSuggestion[]> {\n return this.execSuggestionQuery<IAddressSuggestion>('/public/suggestions/address', term);\n }\n\n /**\n * Возвращает подсказки по банкам.\n *\n * @param term Терм поиска.\n *\n * @see /doc/api/public_client_ui#/Подсказки/api_public_get_bank_suggestions\n */\n public searchBank(term: string): Promise<IBankSuggestion[]> {\n return this.execSuggestionQuery<IBankSuggestion>('/public/suggestions/bank', term);\n }\n\n /**\n * Возвращает подсказки по организациям.\n *\n * @param term Терм поиска (ИНН, ОГРН, Название).\n *\n * @see /doc/api/public_client_ui#/Подсказки/api_public_get_organization_suggestions\n */\n public searchOrganization(term: string): Promise<IOrganizationSuggestion[]> {\n return this.execSuggestionQuery<IOrganizationSuggestion>('/public/suggestions/organization', term);\n }\n\n /**\n * Выполняет запрос и возвращает подсказки.\n *\n * @param url URL запроса.\n * @param term Терм поиска.\n */\n protected execSuggestionQuery<T extends IIdentity>(url: string, term: string): Promise<T[]> {\n return this.get<T[]>(url, { query: term }).then((responseData) => {\n // Так как идентификаторы записей отсутствуют, то генерируем их самостоятельно.\n const data = [...responseData];\n let id = 1;\n\n data.forEach((item) => {\n // eslint-disable-next-line no-param-reassign,no-plusplus\n item.id = id++;\n });\n\n return data;\n });\n }\n}\n","/* eslint-disable no-shadow */\n\n/**\n * Перечисление допустимых типов пользователей.\n */\nexport enum UserTypeEnum {\n /**\n * Администратор.\n */\n Admin = 'admin',\n\n /**\n * Менеджер.\n */\n Manager = 'manager',\n\n /**\n * Оператор.\n */\n Operator = 'operator',\n\n /**\n * Клиент.\n */\n Client = 'client',\n\n /**\n * Гость.\n */\n Guest = 'guest',\n}\n","import { UserCommonInfo } from '@sc/user/classes/user-common-info';\nimport { UserTypeEnum } from '@sc/user/enums/user-type-enum';\nimport { IUser } from '@sc/user/interfaces/i-user';\n\n/**\n * Данные о пользователе.\n */\nexport class User extends UserCommonInfo implements IUser {\n /**\n * Тип пользователя.\n */\n public type?: UserTypeEnum;\n\n /**\n * Признак того, что менеджер может работать с рекламациями.\n */\n public canDoReclamations: boolean;\n\n /**\n * URI путь к фотографии пользователя.\n */\n public photo?: string;\n\n /**\n * Инициализирует экземпляр класса {@link User}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IUser>) {\n super(data);\n\n this.type = data?.type;\n this.canDoReclamations = data?.canDoReclamations ?? false;\n this.photo = data?.photo;\n }\n}\n","import { AppConfigProvider } from '@sc/config/providers/app-config-provider';\nimport { HttpRequester } from '@sc/http/classes/http-requester';\n\n/**\n * Предоставляет механизмы аутентификации пользователей.\n */\nexport class UserAuthDataProvider extends HttpRequester {\n /**\n * Инициализирует экземпляр класса {@link UserAuthDataProvider}.\n */\n public constructor() {\n super();\n\n this.baseUrl = `${AppConfigProvider.getConfig().http.portalApiUrl as string}/api`;\n\n // Для запросов ключ доступа не нужен.\n if (this.interceptorIds.request.authRequestInterceptor) {\n this.httpClient.interceptors.request.eject(this.interceptorIds.request.authRequestInterceptor);\n }\n\n // TODO: Исправить зацикливание запросов.\n // В случае ошибки ответа на запрос не требуется повторное выполнение запроса.\n // if (this.interceptorIds.response.dataConverterRequestInterceptor) {\n // this.httpClient.interceptors.response.eject(this.interceptorIds.response.dataConverterRequestInterceptor);\n // }\n }\n\n /**\n * Функция для получения обновленных токенов доступа.\n *\n * @deprecated Данный механизм будет полностью удален при полном переходе на Vue приложение.\n */\n public getAccessToken(): Promise<string> {\n return this.get<{ accessToken: string }>('internal/users/current-tokens').then((data) => {\n return data.accessToken;\n });\n }\n}\n","import { HttpRequester } from '@sc/http/classes/http-requester';\nimport { User } from '@sc/user/classes/user';\nimport { IUser } from '@sc/user/interfaces/i-user';\n\n/**\n * Предоставляет механизмы получения/управления данными о клиенте.\n */\nexport class UserDataProvider extends HttpRequester {\n /**\n * Возвращает данные о текущем пользователе.\n */\n // eslint-disable-next-line class-methods-use-this\n public getCurrentUser(): Promise<IUser> {\n return this.get<IUser>(`/internal/users/info`, {}, (response) => new User(response.data));\n }\n}\n","import { HttpRequester } from '@sc/http/classes/http-requester';\nimport { IUser } from '@sc/user/interfaces/i-user';\nimport { UserDataProvider } from '@sc/user/providers/user-data-provider';\nimport { noop } from 'lodash-es';\nimport { defineStore } from 'pinia';\nimport { computed, ref } from 'vue';\n\n/**\n * Приватное хранилище данных состояния пользователя.\n */\nconst useUserStatePrivateStore = defineStore('__user_state_private', () => {\n /**\n * Список загружаемых/загруженных на данный момент значений.\n */\n const dataLoaderList = ref<Record<string, unknown>>({});\n\n /**\n * Данные о текущем пользователе.\n */\n const currentUser = ref<IUser | undefined>(undefined);\n\n return {\n /**\n * Список загружаемых/загруженных на данный момент значений.\n */\n dataLoaderList,\n\n /**\n * Данные о текущем пользователе.\n */\n currentUser,\n };\n});\n\n/**\n * Хранилище данных состояния пользователя.\n */\nexport const useUserStateStore = defineStore('user_state', () => {\n /**\n * Данные о текущем пользователе.\n */\n const currentUser = computed((): IUser | undefined => {\n const privateStore = useUserStatePrivateStore();\n\n if (!privateStore.currentUser && !privateStore.dataLoaderList.currentUser) {\n privateStore.dataLoaderList.currentUser = true;\n\n HttpRequester.getInstance(UserDataProvider)\n .getCurrentUser()\n .then((u) => {\n privateStore.currentUser = u;\n })\n .catch(noop)\n .finally(() => {\n privateStore.dataLoaderList.currentUser = false;\n });\n }\n\n return privateStore.currentUser;\n });\n\n return {\n /**\n * Данные о текущем пользователе.\n */\n currentUser,\n };\n});\n","import { IFieldValidationResultData } from '@sc/validation/interfaces/i-field-validation-result-data';\n\n/**\n * Результат валидации значения поля ввода в результате HTTP 422 ответа на запрос.\n */\nexport class FieldValidationResultData implements IFieldValidationResultData {\n /**\n * Признак необходимости отображать сообщение об ошибке валидации.\n */\n public showFeedback: boolean = false;\n\n /**\n * Сообщение об ошибке валидации.\n */\n public feedback: string = '';\n\n /**\n * Статус валидации.\n */\n public validationStatus: undefined | 'error' | 'success' | 'warning' = undefined;\n\n /**\n * Инициализирует экземпляр класса {@link FieldValidationResultData}.\n *\n * @param feedback Сообщение об ошибке валидации.\n * @param validationStatus Статус валидации.\n */\n public constructor(feedback: string, validationStatus?: 'error' | 'success' | 'warning') {\n this.showFeedback = !!feedback;\n this.feedback = feedback;\n this.validationStatus = validationStatus;\n }\n}\n"],"names":["JwtPayload","data","__publicField","merge","jwtToken","decodedJwtPayload","jwtDecode","payload","objectToCamel","DetailedJwtPayload","_AppConfigProvider","config","isUndefined","path","configPromise","response","resolve","error","AppConfigProvider","PreferencesStorageProvider","keyName","rawSavedData","savedData","isAfter","parseISO","startOfToday","isNil","isEmpty","availableFor","dataToSave","testKey","keysToRemove","i","key","rawData","getTokenExpirationDate","token","useAuthStatePrivateStore","defineStore","ref","storedToken","developmentToken","_a","jwtTokenUpdater","userPermissions","userPermissionsComputedRefs","markRaw","recalculateUserPermissions","jwtPayload","mapValues","value","noop","useAuthStateStore","computed","privateStore","updater","setJwtTokenUpdater","setJwtToken","invalidateJwtToken","hasUserPermission","name","isArray","hasUserPermissionComputedRef","isUserPermissionExist","checkedName","split","groupName","permissionName","group","every","item","Identity","defaultIdValue","NamedIdentity","CodedIdentity","CatalogableItem","PrimaryCatalogableItem","BaseCategory","toUpper","PriceCoefficientEnum","Reference","PriceCoefficient","constant","ProductPriceCoefficient","GeoCoordinates","DeliveryType","Warehouse","dt","StockCount","HiddenCatalogableItem","Image","mediaServer","Product","isString","sc","primaryCategory","_b","category","_c","im","_d","pc","unitsConfig","CartItemBase","cloneDeep","CartItem","Cart","TypedInstanceFactory","type","_HttpRequester","request","authToken","objectToSnake","toLower","originalRequest","appVersion","axios","format","handler","rawResponse","successHandler","validationFieldResultData","disableNotifications","requestPromise","url","params","HttpRequester","CartProvider","client","cartItem","file","blob","CalculationTypeEnum","CostSourceEnum","PropertyTypeEnum","Category","c","UpdatableNamedIdentity","DeletableNamedIdentity","UserShortInfo","DiscountShortInfo","PriceTemplate","ClientProduct","ContactLinks","SalesDirection","ManagerCommon","UserPricingRole","Manager","BaseClientCategory","ClientCategory","PriceTemplateICatalogableItem","PriceTemplateCategory","Country","Region","CityWithRegionAndCountry","UserCommonInfo","ClientShortInfo","m","PriceTemplateClient","PriceTemplateProduct","PropertyType","Property","PropertyValue","DatePeriod","TemplatesListFilters","result","k","isFunction","PricingRole","CategoryPricingRule","DeviceTypeResolutionConfig","HttpParamsConfig","SentryConfig","VersionConfig","WebSocketConfig","AppBaseConfig","CatalogProvider","term","showHidden","categoryId","clientId","link","ClientPriceProvider","comment","managerId","productId","ClientPriceTemplateProvider","template","priceTemplateId","apiDateFormat","priceTemplateClientId","ProductCategoryDataProvider","categoryID","withNestedCategories","withPriceCoefficients","map","p","forEach","pcs","limit","reject","ProductDataProvider","rec","ClientProductCategoryDataProvider","ClientProductDataProvider","FilterOpEnum","FilterItem","isDate","FilterGroup","filter","BasePaginationProvider","filters","sortParams","paginationParams","extraParams","disableDefaultNotificationErrorResponseHandler","requestParams","PriceTemplateProvider","propertyData","product","productCategoryId","recursively","PricingRoleProvider","role","id","rule","PropertiesProvider","typeId","rest","propertyId","text","fileData","fileId","slug","findCatalogItemByIdRecursive","items","foundInProducts","foundInChildren","flattenCatalogItems","ClientsAdditionalDataRequestTypeEnum","OpfEnum","AnyReference","ChannelPrimaryInterest","City","ContactPosition","Currency","Opf","OrderPaymentStatus","OrderStatus","PartnerGroup","PaymentType","ProductFileType","ResourceType","SourcePrimaryInterest","BankAccount","Contact","ContactPerson","ContragentBase","contactsList","ContragentPerson","ContragentIc","ContragentUlR","ContragentUlNr","ContragentFactory","ContactRelation","ContactPersonRelated","DeliveryAddress","Client","pg","da","ClientsListFilters","s","_e","_f","OrderShortInfo","ClientAdditionalData","g","DataTablePaginationRequestParams","DataTablePagination","DataTableSortRequestParams","ClientDataProvider","contragent","contragentIc","contragentUlR","contragentUlNr","_g","_h","deliveryAddress","bankAccount","clientData","phone","clients","dataTypes","clientIDs","dataList","password","passwordConfirm","managers","promises","contragentId","contactPerson","deliveryAddressId","extraData","isPrimary","_HttpCachedRequester","cachedResponseData","addSeconds","useResponseDataCache","cacheKey","cachedResponse","responseData","HttpCachedRequester","UnknownClientDataProvider","ConfiguratorProvider","newTemplate","templateId","DateTimeProvider","nextWorkingDay","addBusinessDays","startOfDay","endOfDay","endOfToday","startOfYesterday","endOfYesterday","startOfTomorrow","endOfTomorrow","_UnitsHelper","linearValues","UnitsHelper","ManagerDataFactory","manager","ManagerDataProvider","OrderInfo","OrderProduct","Order","OrdersDataProvider","period","orderId","PriceAnalyze","convertPriceAnalyzeFilters","omitBy","city","partnerGroup","salesDirection","isObject","convertPriceAnalyzeParams","PriceAnalyzeProvider","PriceHistoryItem","ProductPriceHistory","PriceHistoryDataProvider","updatedFilters","RecommendationsList","RecommendationsDataProvider","productCategory","recommendations","ReferenceDataProvider","referenceName","useReferencesPrivateStore","dataLoaderList","channelPrimaryInterestReference","contactPositionsReference","currencyReference","deliveryTypeReference","managersList","opfReference","orderPaymentStatusReference","orderStatusReference","paymentTypeReference","partnerGroupReference","productFileTypeReference","resourceTypesReference","salesDirectionsReference","sourcePrimaryInterestReference","warehousesReference","propertyTypesReference","priceCoefficientsReference","useReferencesStore","channelPrimaryInterestsReference","referencesStore","partnerGroupsReference","productFilesTypesReference","sourcePrimaryInterestsReference","MetaTagItem","Seo","e","SeoDataProvider","resourceType","resourceId","seo","DataSuggestionProvider","UserTypeEnum","User","UserAuthDataProvider","UserDataProvider","useUserStatePrivateStore","currentUser","useUserStateStore","u","FieldValidationResultData","feedback","validationStatus"],"mappings":"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"}
1
+ {"version":3,"file":"sc-common-lib.js","sources":["../src/auth/classes/jwt-payload.ts","../src/auth/classes/detailed-jwt-payload.ts","../src/config/providers/app-config-provider.ts","../src/system/providers/preferences-storage-provider.ts","../src/auth/states/auth-state-store.ts","../src/system/classes/identity.ts","../src/system/classes/named-identity.ts","../src/system/classes/coded-identity.ts","../src/system/classes/catalogable-item.ts","../src/system/classes/primary-catalogable-item.ts","../src/catalog/classes/internal/base/base-category.ts","../src/catalog/enums/price-coefficient-enum.ts","../src/system/classes/reference.ts","../src/references/classes/price-coefficient.ts","../src/catalog/classes/product-price-coefficient.ts","../src/geo/classes/geo-coordinates.ts","../src/references/classes/delivery-type.ts","../src/references/classes/warehouse.ts","../src/catalog/classes/stock-count.ts","../src/system/classes/hidden-catalogable-item.ts","../src/system/classes/image.ts","../src/catalog/classes/product.ts","../src/cart/classes/cart-item-base.ts","../src/cart/classes/cart-item.ts","../src/cart/classes/cart.ts","../src/system/providers/typed-instance-factory.ts","../src/http/classes/http-requester.ts","../src/cart/providers/cart-provider.ts","../src/catalog/enums/calculation-type-enum.ts","../src/catalog/enums/cost-source-enum.ts","../src/catalog/enums/property-type-enum.ts","../src/catalog/classes/category.ts","../src/system/classes/updatable-named-identity.ts","../src/system/classes/deletable-named-identity.ts","../src/user/classes/user-short-info.ts","../src/catalog/classes/discount-short-info.ts","../src/catalog/classes/price-template.ts","../src/catalog/classes/client-product.ts","../src/contacts/classes/contact-links.ts","../src/references/classes/sales-direction.ts","../src/managers/classes/manager-common.ts","../src/references/classes/curated-direction.ts","../src/user/classes/user-pricing-role.ts","../src/managers/classes/manager.ts","../src/catalog/classes/internal/base/base-client-category.ts","../src/catalog/classes/client-category.ts","../src/catalog/classes/price-template-catalogable-item.ts","../src/catalog/classes/price-template-category.ts","../src/managers/classes/curator.ts","../src/references/classes/country.ts","../src/references/classes/region.ts","../src/references/classes/city-with-region-and-country.ts","../src/user/classes/user-common-info.ts","../src/clients/classes/client-short-info.ts","../src/catalog/classes/price-template-client.ts","../src/catalog/classes/price-template-product.ts","../src/catalog/classes/property-type.ts","../src/catalog/classes/property.ts","../src/catalog/classes/property-value.ts","../src/system/classes/date-period.ts","../src/catalog/classes/templates-list-filters.ts","../src/catalog/classes/pricing-role.ts","../src/catalog/classes/category-pricing-rule.ts","../src/config/classes/device-type-resolution-config.ts","../src/config/classes/http-params-config.ts","../src/config/classes/sentry-config.ts","../src/config/classes/version-config.ts","../src/config/classes/websocket-config.ts","../src/config/classes/app-base-config.ts","../src/catalog/providers/catalog-provider.ts","../src/catalog/providers/client-price-provider.ts","../src/catalog/providers/client-price-template-provider.ts","../src/catalog/providers/product-category-data-provider.ts","../src/catalog/providers/product-data-provider.ts","../src/catalog/providers/client-product-category-data-provider.ts","../src/catalog/providers/client-product-data-provider.ts","../src/data-table/enums/filter-op-enum.ts","../src/data-table/classes/filter-item.ts","../src/data-table/classes/filter-group.ts","../src/pagination/providers/base-pagination-provider.ts","../src/catalog/providers/price-template-provider.ts","../src/catalog/providers/pricing-role-provider.ts","../src/catalog/providers/properties-provider.ts","../src/catalog/methods/find-catalog-item.ts","../src/catalog/methods/flatten-catalog-items.ts","../src/clients/enums/clients-additional-data-request-type-enum.ts","../src/clients/enums/opf-enum.ts","../src/references/classes/any-reference.ts","../src/references/classes/channel-primary-interest.ts","../src/references/classes/city.ts","../src/references/classes/contact-position.ts","../src/references/classes/currency.ts","../src/references/classes/opf.ts","../src/references/classes/order-payment-status.ts","../src/references/classes/order-status.ts","../src/references/classes/partner-group.ts","../src/references/classes/payment-type.ts","../src/references/classes/product-file-type.ts","../src/references/classes/resource-type.ts","../src/references/classes/source-primary-interest.ts","../src/clients/classes/bank-account.ts","../src/contacts/classes/contact.ts","../src/contacts/classes/contact-person.ts","../src/clients/classes/contragent/contragent-base.ts","../src/clients/classes/contragent/contragent-person.ts","../src/clients/classes/contragent/contragent-ic.ts","../src/clients/classes/contragent/contragent-ul-r.ts","../src/clients/classes/contragent/contragent-ul-nr.ts","../src/clients/classes/contragent/contragent-factory.ts","../src/contacts/classes/contact-relation.ts","../src/contacts/classes/contact-person-related.ts","../src/clients/classes/delivery-address.ts","../src/clients/classes/client.ts","../src/clients/classes/clients-list-filters.ts","../src/orders/classes/order-short-info.ts","../src/clients/classes/client-additional-data.ts","../src/data-table/classes/data-table-pagination-request-params.ts","../src/data-table/classes/data-table-pagination.ts","../src/data-table/classes/data-table-sort-request-params.ts","../src/clients/providers/client-data-provider.ts","../src/http/classes/http-cached-requester.ts","../src/clients/providers/unknown-client-data-provider.ts","../src/configurator/providers/configurator-provider.ts","../src/date-time/providers/date-time-provider.ts","../src/helpers/units-helper.ts","../src/managers/classes/manager-data-factory.ts","../src/managers/providers/manager-data-provider.ts","../src/orders/classes/order-info.ts","../src/orders/classes/order-product.ts","../src/orders/classes/order.ts","../src/orders/providers/orders-data-provider.ts","../src/price-analyze/classes/price-analyze.ts","../src/price-analyze/converters/price-analyze-filters.ts","../src/price-analyze/converters/price-analyze-params.ts","../src/price-analyze/providers/price-analyze-provider.ts","../src/price-history/classes/price-history-item.ts","../src/price-history/classes/product-price-history.ts","../src/price-history/providers/price-history-data-provider.ts","../src/recommendations/classes/recommendations-list.ts","../src/recommendations/providers/recommendations-data-provider.ts","../src/references/providers/reference-data-provider.ts","../src/references/states/references-state-store.ts","../src/seo/classes/meta-tag-item.ts","../src/seo/classes/seo.ts","../src/seo/providers/seo-data-provider.ts","../src/suggestion/providers/data-suggestion-provider.ts","../src/user/enums/user-type-enum.ts","../src/user/classes/user.ts","../src/user/providers/user-auth-data-provider.ts","../src/user/providers/user-data-provider.ts","../src/user/states/user-state-store.ts","../src/validation/classes/field-validation-result-data.ts"],"sourcesContent":["import { IBaseResourceAccess } from '@sc/auth/interfaces/i-base-resource-access';\nimport { IJwtPayload } from '@sc/auth/interfaces/i-jwt-payload';\nimport { IRealmAccess } from '@sc/auth/interfaces/i-realm-access';\nimport { jwtDecode } from 'jwt-decode';\nimport { merge } from 'lodash-es';\nimport { objectToCamel } from 'ts-case-convert';\n\n/**\n * Данные полезной нагрузки JWT токена.\n */\nexport class JwtPayload<T extends IBaseResourceAccess = IBaseResourceAccess> implements IJwtPayload<T> {\n /**\n * Возвращает данные полезной нагрузки для указанного JWT-токена.\n *\n * @param jwtToken JWT-ключ доступа.\n */\n public static getJwtPayload<O extends IBaseResourceAccess = IBaseResourceAccess>(jwtToken: string): IJwtPayload<O> {\n const decodedJwtPayload = jwtDecode<IJwtPayload<O>>(jwtToken);\n const payload = new JwtPayload(objectToCamel(decodedJwtPayload) as unknown as IJwtPayload<O>);\n\n // Необходимо сохранить в исходном виде названия ключей ресурсов, иначе может быть путаница.\n payload.resourceAccess = decodedJwtPayload.resource_access as IJwtPayload<O>['resourceAccess'];\n\n return payload;\n }\n\n /**\n * @inheritDoc\n */\n public exp: number = 0;\n\n /**\n * @inheritDoc\n */\n public iat: number = 0;\n\n /**\n * @inheritDoc\n */\n public authTime: number = 0;\n\n /**\n * @inheritDoc\n */\n public jti: string = '';\n\n /**\n * @inheritDoc\n */\n public iss: string = '';\n\n /**\n * @inheritDoc\n */\n public aud: string[] = [];\n\n /**\n * @inheritDoc\n */\n public sub: string = '';\n\n /**\n * @inheritDoc\n */\n public typ: string = 'Bearer';\n\n /**\n * @inheritDoc\n */\n public azp: string = '';\n\n /**\n * @inheritDoc\n */\n public sid: string = '';\n\n /**\n * @inheritDoc\n */\n public acr: string = '';\n\n /**\n * @inheritDoc\n */\n public allowedOrigins: string[] = [];\n\n /**\n * @inheritDoc\n */\n public realmAccess: IRealmAccess = { roles: [] };\n\n /**\n * @inheritDoc\n */\n public resourceAccess: T = {} as T;\n\n /**\n * @inheritDoc\n */\n public scope: string = '';\n\n /**\n * @inheritDoc\n */\n public emailVerified: boolean = false;\n\n /**\n * @inheritDoc\n */\n public name: string = '';\n\n /**\n * @inheritDoc\n */\n public guid: string = '';\n\n /**\n * @inheritDoc\n */\n public preferredUsername: string = '';\n\n /**\n * @inheritDoc\n */\n public givenName: string = '';\n\n /**\n * @inheritDoc\n */\n public email: string = '';\n\n /**\n * @inheritDoc\n */\n [key: string]: unknown;\n\n /**\n * Инициализирует экземпляр класса {@link JwtPayload}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data: IJwtPayload<T>) {\n merge(this, data);\n }\n}\n","import { JwtPayload } from '@sc/auth/classes/jwt-payload';\nimport { IBaseResourceAccess } from '@sc/auth/interfaces/i-base-resource-access';\nimport { IDetailedJwtPayload } from '@sc/auth/interfaces/i-detailed-jwt-payload';\nimport { IUserAddress } from '@sc/auth/interfaces/i-user-address';\nimport { jwtDecode } from 'jwt-decode';\nimport { merge } from 'lodash-es';\nimport { objectToCamel } from 'ts-case-convert';\n\n/**\n * Расширенные данные полезной нагрузки JWT токена.\n */\nexport class DetailedJwtPayload<T extends IBaseResourceAccess = IBaseResourceAccess> extends JwtPayload<T> implements IDetailedJwtPayload<T> {\n /**\n * Возвращает данные полезной нагрузки для указанного JWT-токена.\n *\n * @param jwtToken JWT-ключ доступа.\n */\n public static getJwtPayload<O extends IBaseResourceAccess = IBaseResourceAccess>(jwtToken: string): IDetailedJwtPayload<O> {\n return new JwtPayload(objectToCamel(jwtDecode<O>(jwtToken)) as unknown as IDetailedJwtPayload<O>);\n }\n\n /**\n * @inheritDoc\n */\n public familyName?: string;\n\n /**\n * @inheritDoc\n */\n public middleName?: string;\n\n /**\n * @inheritDoc\n */\n public locale?: string;\n\n /**\n * @inheritDoc\n */\n public phoneNumber?: string;\n\n /**\n * @inheritDoc\n */\n public phoneNumberVerified?: boolean;\n\n /**\n * @inheritDoc\n */\n public address?: IUserAddress;\n\n /**\n * Инициализирует экземпляр класса {@link DetailedJwtPayload}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data: IDetailedJwtPayload<T>) {\n super(data);\n\n merge(this, data);\n }\n}\n","import { IAppBaseConfig } from '@sc/config/interfaces/i-app-base-config';\nimport { isUndefined } from 'lodash-es';\n\n/**\n * Провайдер, предоставляющий доступ к конфигурации приложения.\n */\nexport class AppConfigProvider {\n /**\n * Конфигурация приложения.\n */\n protected static config?: unknown;\n\n /**\n * Инициализирует и возвращает конфигурацию приложения.\n *\n * @param config Данные для первоначальной инициализации.\n */\n public static init(config: unknown) {\n AppConfigProvider.config = config;\n }\n\n /**\n * Возвращает текущую конфигурацию приложения.\n */\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters\n public static getConfig<T = IAppBaseConfig>(): T {\n if (isUndefined(AppConfigProvider.config)) {\n throw new Error('Config is undefined. Please set config by AppConfigProvider.init().');\n }\n\n return AppConfigProvider.config as T;\n }\n\n /**\n * Выполняет загрузку конфигурации по указанному пути.\n *\n * @param path Путь к конфигурации.\n */\n public static loadRemoteConfig<T = IAppBaseConfig>(path: string = '/config.json'): Promise<Partial<T>> {\n const configPromise = fetch(path).then((response) => {\n if (!response.ok) {\n // eslint-disable-next-line no-console\n console.error(new Error(`Ошибка загрузки ${path}: ${response.statusText}`));\n\n // eslint-disable-next-line sonarjs/prefer-promise-shorthand\n return new Promise<Partial<T>>((resolve) => {\n resolve({});\n });\n }\n\n return response.json() as Promise<Partial<T>>;\n });\n\n // eslint-disable-next-line unicorn/prefer-top-level-await\n configPromise.catch((error) => {\n // eslint-disable-next-line no-console\n console.error(error);\n });\n\n return configPromise;\n }\n}\n","import { isAfter, parseISO, startOfToday } from 'date-fns';\nimport { isEmpty, isNil } from 'lodash-es';\n\n/**\n * Провайдер, обеспечивающий механизмы сохранения и получения настроек из хранилища браузера.\n */\nexport class PreferencesStorageProvider {\n /**\n * Возвращает актуальные и не просроченные данные из хранилища.\n *\n * @param keyName Название ключа из которого необходимо получить данные.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n public static getActualDataFromStorage(keyName: string): any {\n // Проверяем доступность localStorage.\n if (!this.isLocalStorageAvailable()) {\n return undefined;\n }\n\n let rawSavedData: string | null = null;\n\n try {\n rawSavedData = localStorage.getItem(keyName);\n } catch {\n return undefined;\n }\n\n if (rawSavedData) {\n try {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-explicit-any\n const savedData = JSON.parse(rawSavedData) as { availableFor?: string; data?: any };\n\n // Данные возвращаем только если они актуальны (если availableFor не задан, данные всегда актуальны).\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!savedData.availableFor || isAfter(parseISO(savedData.availableFor) || startOfToday(), new Date())) {\n if (isNil(savedData.data) || isEmpty(savedData.data)) {\n throw new Error('Data is empty');\n }\n\n return savedData.data;\n }\n } catch {\n try {\n localStorage.removeItem(keyName);\n } catch {\n /* Do nothing. */\n }\n }\n }\n\n return undefined;\n }\n\n /**\n * Сохраняет данные в хранилище.\n *\n * @param keyName Название ключа в который необходимо сохранить данные.\n * @param data Данные, которые необходимо сохранить.\n * @param availableFor Дата и время до которого будут храниться настройки. Если не задан, данные будут храниться бессрочно.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n public static saveActualDataToStorage(keyName: string, data: any, availableFor?: Date) {\n // Проверяем доступность localStorage.\n if (!this.isLocalStorageAvailable()) {\n return;\n }\n\n try {\n if (isNil(data) || isEmpty(data)) {\n throw new Error('Data is empty');\n }\n\n const dataToSave = JSON.stringify({\n availableFor: availableFor,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n data: data,\n });\n\n localStorage.setItem(keyName, dataToSave);\n } catch (error) {\n // Если ошибка связана с превышением квоты, пытаемся очистить старые данные.\n // eslint-disable-next-line sonarjs/deprecation\n if (error instanceof DOMException && error.code === DOMException.QUOTA_EXCEEDED_ERR) {\n this.clearOldData();\n\n // Повторная попытка сохранения.\n try {\n const dataToSave = JSON.stringify({\n availableFor: availableFor,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n data: data,\n });\n localStorage.setItem(keyName, dataToSave);\n } catch {\n /* Do nothing. */\n }\n } else {\n try {\n localStorage.removeItem(keyName);\n } catch {\n /* Do nothing. */\n }\n }\n }\n }\n\n /**\n * Проверяет доступность localStorage в браузере.\n */\n private static isLocalStorageAvailable(): boolean {\n try {\n const testKey = '__localStorage_test__';\n\n localStorage.setItem(testKey, 'test');\n localStorage.removeItem(testKey);\n\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Очищает устаревшие данные из localStorage для освобождения места.\n */\n private static clearOldData(): void {\n try {\n const keysToRemove: string[] = [];\n\n // Проходим по всем ключам в localStorage.\n // eslint-disable-next-line no-plusplus\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n\n if (key) {\n try {\n const rawData = localStorage.getItem(key);\n\n if (rawData) {\n const data = JSON.parse(rawData) as { availableFor?: string };\n\n // Если данные просрочены, добавляем ключ в список для удаления.\n // Данные без availableFor считаются бессрочными и не удаляются.\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (data.availableFor && !isAfter(parseISO(data.availableFor) || startOfToday(), new Date())) {\n keysToRemove.push(key);\n }\n }\n } catch {\n // Если не удается распознать данные, считаем их поврежденными и удаляем.\n keysToRemove.push(key);\n }\n }\n }\n\n // Удаляем устаревшие и поврежденные данные.\n keysToRemove.forEach((key) => {\n try {\n localStorage.removeItem(key);\n } catch {\n /* Do nothing. */\n }\n });\n } catch {\n /* Do nothing. */\n }\n }\n}\n","import { JwtPayload } from '@sc/auth/classes/jwt-payload';\nimport { AppConfigProvider } from '@sc/config/providers/app-config-provider';\nimport { PreferencesStorageProvider } from '@sc/system/providers/preferences-storage-provider';\nimport { every, isArray, isNil, mapValues, noop, split } from 'lodash-es';\nimport { defineStore } from 'pinia';\nimport { computed, ComputedRef, markRaw, ref } from 'vue';\n\n// TODO: SecurityRisk: При полном переходе аутентификации на KeyCloak (с использованием refresh_token) необходимо отказаться от использования локального хранилища браузера, а использовать BroadcastChannel или SharedWorker.\n\n/**\n * Перечисление с названиями параметров.\n */\nenum StorageParametersNames {\n /**\n * Название ключа хранящего JWT токен.\n */\n JwtToken = 'sc.token',\n}\n\n/**\n * Получает дату истечения JWT токена.\n *\n * @param token JWT токен.\n * @returns Дата истечения токена или undefined, если не удалось определить.\n */\nfunction getTokenExpirationDate(token: string): Date | undefined {\n try {\n const payload = JwtPayload.getJwtPayload(token);\n\n // Конвертируем из секунд в миллисекунды.\n return new Date(payload.exp * 1000);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Хранилище данных состояния аутентификации приложения.\n */\nconst useAuthStatePrivateStore = defineStore('__auth_state_private', () => {\n /**\n * {@link Promise<string>} для получения jwt-ключа доступа к системам.\n */\n const jwtToken = ref<Promise<string> | undefined>(\n (() => {\n // Сначала проверяем хранилище.\n const storedToken = PreferencesStorageProvider.getActualDataFromStorage(StorageParametersNames.JwtToken) as string | undefined;\n\n if (storedToken) {\n return Promise.resolve(storedToken);\n }\n\n // Если в хранилище нет токена, используем devMode токен.\n const developmentToken = AppConfigProvider.getConfig().devMode?.initAuthBearerToken as string | undefined;\n\n return developmentToken ? Promise.resolve(developmentToken) : undefined;\n })()\n );\n\n /**\n * Функция для обновления jwt-ключа доступа к системам.\n */\n const jwtTokenUpdater = ref<(() => Promise<string>) | undefined>(undefined);\n\n /**\n * Список прав текущего пользователя.\n */\n const userPermissions = ref<Record<string, string[]> | undefined>(undefined);\n\n /**\n * Список вычисляемых свойств для проверки наличия у пользователя прав доступа.\n * Делаем контейнер нереактивным, чтобы исключить авто-распаковку ref/computed.\n */\n // eslint-disable-next-line unicorn/prevent-abbreviations\n const userPermissionsComputedRefs = markRaw(new Map<string, ComputedRef<boolean>>());\n\n /**\n * Принудительно пересчитывает права доступа пользователя на основе текущего JWT токена.\n */\n function recalculateUserPermissions(): void {\n // Очищаем только текущие права, НЕ удаляем computed refs (это может привести к ошибкам в других частях приложения).\n userPermissions.value = undefined;\n\n // Если есть токен, пересчитываем права.\n if (!isNil(jwtToken.value)) {\n jwtToken.value\n .then((token) => {\n const jwtPayload = JwtPayload.getJwtPayload(token);\n\n userPermissions.value = jwtPayload.exp * 1000 > Date.now() ? mapValues(jwtPayload.resourceAccess, (value) => value?.roles ?? []) : undefined;\n })\n .catch(noop);\n }\n }\n\n return {\n /**\n * {@link Promise<string>} для получения jwt-ключа доступа к системам.\n */\n jwtToken,\n\n /**\n * Функция для обновления jwt-ключа доступа к системам.\n */\n jwtTokenUpdater,\n\n /**\n * Список прав текущего пользователя.\n */\n userPermissions,\n\n /**\n * Список вычисляемых свойств для проверки наличия у пользователя прав доступа.\n */\n userPermissionsComputedRefs,\n\n /**\n * Принудительно пересчитывает права доступа пользователя на основе текущего JWT токена.\n */\n recalculateUserPermissions,\n };\n});\n\n/**\n * Хранилище данных состояния аутентификации приложения.\n */\nexport const useAuthStateStore = defineStore('__auth_state', () => {\n /**\n * {@link Promise<string>} для получения jwt-ключа доступа к системам.\n */\n const jwtToken = computed<Promise<string> | undefined>(() => {\n const privateStore = useAuthStatePrivateStore();\n\n // Если токен не установлен и есть механизм для его обновления, то обновляем токен.\n if (isNil(privateStore.jwtToken) && !isNil(privateStore.jwtTokenUpdater)) {\n const updater = privateStore.jwtTokenUpdater();\n\n privateStore.jwtToken = updater;\n\n updater\n .then((key: string) => {\n privateStore.jwtToken = Promise.resolve(key);\n\n // Сохраняем в хранилище.\n PreferencesStorageProvider.saveActualDataToStorage(StorageParametersNames.JwtToken, key, getTokenExpirationDate(key));\n\n // Пересчитываем права доступа при обновлении токена.\n privateStore.recalculateUserPermissions();\n })\n .catch(noop);\n }\n\n return privateStore.jwtToken;\n });\n\n /**\n * Устанавливает механизм для обновления jwt-ключа доступа к системам.\n *\n * @param updater Механизм для обновления jwt-ключа доступа к системам.\n */\n function setJwtTokenUpdater(updater: () => Promise<string>): void {\n useAuthStatePrivateStore().jwtTokenUpdater = updater;\n }\n\n /**\n * Устанавливает новый JWT токен и автоматически пересчитывает права доступа.\n *\n * @param token Новый JWT токен.\n */\n function setJwtToken(token: string): void {\n const privateStore = useAuthStatePrivateStore();\n\n privateStore.jwtToken = Promise.resolve(token);\n\n // Сохраняем токен в хранилище.\n PreferencesStorageProvider.saveActualDataToStorage(StorageParametersNames.JwtToken, token, getTokenExpirationDate(token));\n\n // Пересчитываем права доступа при установке нового токена.\n privateStore.recalculateUserPermissions();\n }\n\n /**\n * Выполняет очистку jwt-ключа доступа к системам.\n */\n // eslint-disable-next-line unicorn/consistent-function-scoping\n function invalidateJwtToken(): void {\n const privateStore = useAuthStatePrivateStore();\n privateStore.jwtToken = undefined;\n privateStore.userPermissions = undefined;\n\n // Удаляем токен из хранилища.\n // eslint-disable-next-line unicorn/no-useless-undefined\n PreferencesStorageProvider.saveActualDataToStorage(StorageParametersNames.JwtToken, undefined);\n\n // НЕ удаляем computed refs - они должны продолжать работать, но возвращать false.\n }\n\n /**\n * Возвращает вычисляемое поле для проверки наличия указанных прав доступа.\n *\n * @param name Проверяемое право доступа или их список. Должны быть представлены в виде значения: <РЕСУРС>.<РОЛЬ>.\n */\n function hasUserPermission(name: string | string[]): ComputedRef<boolean> {\n const privateStore = useAuthStatePrivateStore();\n\n // Если токен есть, но права доступа еще не вычислены, то вычисляем права доступа.\n if (!isNil(privateStore.jwtToken) && isNil(privateStore.userPermissions)) {\n privateStore.jwtToken\n .then((token) => {\n const jwtPayload = JwtPayload.getJwtPayload(token);\n\n privateStore.userPermissions = jwtPayload.exp * 1000 > Date.now() ? mapValues(jwtPayload.resourceAccess, (value) => value?.roles ?? []) : undefined;\n })\n .catch(noop);\n }\n\n const key = isArray(name) ? name.join(' && ') : name;\n\n // Если вычисляемое поле для проверки наличия указанных прав доступа уже существует, то возвращаем его.\n if (privateStore.userPermissionsComputedRefs.has(key)) {\n // eslint-disable-next-line @typescript-eslint/non-nullable-type-assertion-style\n return privateStore.userPermissionsComputedRefs.get(key) as ComputedRef<boolean>;\n }\n\n // Если вычисляемое поле для проверки наличия указанных прав доступа не существует, то создаем его, сохранив в кэше и возвращаем.\n // eslint-disable-next-line unicorn/prevent-abbreviations\n const hasUserPermissionComputedRef = computed(() => {\n const isUserPermissionExist = (checkedName: string): boolean => {\n const path = split(checkedName, '.');\n\n // Проверяем, что путь содержит достаточно элементов.\n if (path.length < 2) {\n return false;\n }\n\n const [groupName, permissionName] = path;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,security/detect-object-injection\n const group = useAuthStatePrivateStore().userPermissions?.[groupName];\n\n return isArray(group) && group.includes(permissionName);\n };\n\n if (isArray(name)) {\n return every(name, (item) => isUserPermissionExist(item));\n }\n\n return isUserPermissionExist(name);\n });\n\n privateStore.userPermissionsComputedRefs.set(key, hasUserPermissionComputedRef);\n\n return hasUserPermissionComputedRef;\n }\n\n return {\n /**\n * {@link Promise<string>} для получения jwt-ключа доступа к системам.\n */\n jwtToken,\n\n /**\n * Устанавливает механизм для обновления jwt-ключа доступа к системам.\n *\n * @param updater Механизм для обновления jwt-ключа доступа к системам.\n */\n setJwtTokenUpdater,\n\n /**\n * Устанавливает новый JWT токен и автоматически пересчитывает права доступа.\n *\n * @param token Новый JWT токен.\n */\n setJwtToken,\n\n /**\n * Выполняет очистку jwt-ключа доступа к системам.\n */\n invalidateJwtToken,\n\n /**\n * Возвращает вычисляемое поле для проверки наличия указанных прав доступа.\n *\n * @param name Проверяемое право доступа или их список. Должны быть представлены в виде значения: <РЕСУРС>.<РОЛЬ>.\n */\n hasUserPermission,\n };\n});\n","import { IIdentity } from '@sc/system/interfaces/i-identity';\nimport { isNil } from 'lodash-es';\n\n/**\n * Базовая идентифицируемая сущность.\n */\nexport abstract class Identity<T = number> implements IIdentity<T> {\n /**\n * @inheritDoc\n */\n public id: T;\n\n /**\n * @inheritDoc\n */\n public guid: string;\n\n /**\n * Инициализирует экземпляр класса {@link Identity}.\n *\n * @param data Данные для первоначальной инициализации.\n * @param defaultIdValue Значение поля {@link id} по-умолчанию если оно не определено в {@link data}.\n */\n protected constructor(data?: Partial<IIdentity<T>>, defaultIdValue?: T) {\n this.id = data?.id as T;\n\n if (isNil(this.id)) {\n if (!isNil(defaultIdValue)) {\n this.id = defaultIdValue;\n }\n // eslint-disable-next-line lodash/prefer-lodash-typecheck\n else if (typeof data?.id === 'number') {\n this.id = -1 as T;\n // eslint-disable-next-line lodash/prefer-lodash-typecheck\n } else if (typeof data?.id === 'string') {\n this.id = '' as T;\n }\n }\n\n this.guid = data?.guid ?? '';\n }\n\n /**\n * Возвращает признак, что это новая запись.\n */\n public isNewRec(): boolean {\n // eslint-disable-next-line lodash/prefer-lodash-typecheck\n if (typeof this.id === 'number') {\n return this.id === -1;\n }\n\n // eslint-disable-next-line lodash/prefer-lodash-typecheck\n if (typeof this.id === 'string') {\n return this.id === '';\n }\n\n return isNil(this.id);\n }\n}\n","/* eslint-disable @typescript-eslint/no-unnecessary-condition */\n\nimport { Identity } from '@sc/system/classes/identity';\nimport { INamedIdentity } from '@sc/system/interfaces/i-named-identity';\n\n/**\n * Базовая идентифицируемая сущность содержащая название.\n */\nexport class NamedIdentity<T = number> extends Identity<T> implements INamedIdentity<T> {\n /**\n * Название.\n */\n public name: string = '';\n\n /**\n * Инициализирует экземпляр класса {@link NamedIdentity}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<INamedIdentity<T>>) {\n super(data);\n\n this.name = data?.name ?? '';\n }\n}\n","/* eslint-disable @typescript-eslint/no-unnecessary-condition */\n\nimport { NamedIdentity } from '@sc/system/classes/named-identity';\nimport { ICodedIdentity } from '@sc/system/interfaces/i-coded-identity';\n\n/**\n * Базовая идентифицируемая сущность содержащая название и артикул.\n */\nexport class CodedIdentity<T = number> extends NamedIdentity<T> implements ICodedIdentity<T> {\n /**\n * @inheritDoc\n */\n public code: string = '';\n\n /**\n * Инициализирует экземпляр класса {@link NamedIdentity}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<ICodedIdentity<T>>) {\n super(data);\n\n this.code = data?.code ?? '';\n }\n}\n","import { CodedIdentity } from '@sc/system/classes/coded-identity';\nimport { ICatalogableItem } from '@sc/system/interfaces/i-catalogable-item';\nimport { CatalogableItemType } from '@sc/system/types/catalogable-item-type';\n\n/**\n * Данные об элементе каталога.\n */\nexport class CatalogableItem extends CodedIdentity implements ICatalogableItem {\n /**\n * Символьное обозначение.\n */\n public slug: string;\n\n /**\n * Тип элемента.\n */\n public type!: CatalogableItemType;\n\n /**\n * Инициализирует экземпляр класса {@link CatalogableItem}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n protected constructor(data?: ICatalogableItem) {\n super(data);\n\n this.slug = data?.slug ?? '';\n }\n}\n","import { CatalogableItem } from '@sc/system/classes/catalogable-item';\nimport { IPrimaryCatalogableItem } from '@sc/system/interfaces/i-primary-catalogable-item';\n\n/**\n * Данные о каталогизируемом элементе, который может быть помечен как основной.\n */\nexport class PrimaryCatalogableItem extends CatalogableItem implements IPrimaryCatalogableItem {\n /**\n * Признак того, что категория является основной для продукта.\n */\n public isPrimary?: boolean;\n\n /**\n * Инициализирует экземпляр класса {@link PrimaryCatalogableItem}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IPrimaryCatalogableItem) {\n super(data);\n\n this.isPrimary = data?.isPrimary ?? false;\n }\n}\n","import { IBaseCategory } from '@sc/catalog/interfaces/internal/base/i-base-category';\nimport { PropertiesList } from '@sc/catalog/types/properties-list';\nimport { PrimaryCatalogableItem } from '@sc/system/classes/primary-catalogable-item';\nimport { toUpper } from 'lodash-es';\n\n/**\n * Данные о категории.\n */\nexport class BaseCategory extends PrimaryCatalogableItem implements IBaseCategory {\n /**\n * Признак того, что категория скрыта.\n */\n public isHidden: boolean;\n\n /**\n * Целочисленный идентификатор родителя (родительской записи).\n */\n public parentCategoryId?: number;\n\n /**\n * Список свойств. Число свойств в объекте не ограничено.\n */\n public properties?: PropertiesList;\n\n /**\n * Список коэффициентов пересчёта из валют в рубли в формате ключ значение.\n */\n public currencyRates?: Record<string, number>;\n\n /**\n * Инициализирует экземпляр класса {@link BaseCategory}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IBaseCategory) {\n super(data);\n\n this.isHidden = data?.isHidden ?? false;\n this.parentCategoryId = data?.parentCategoryId;\n this.properties = data?.properties;\n this.type = 'category';\n // Исправляем ключи после автоматического преобразования в camelCase в HttpBaseRequester.\n this.currencyRates = data?.currencyRates ? Object.fromEntries(Object.entries(data.currencyRates).map(([key, value]) => [toUpper(key), value])) : undefined;\n }\n}\n","/**\n * Перечисление коэффициентов цены.\n */\nexport enum PriceCoefficientEnum {\n /**\n * Стоп-цена\n */\n K0 = 'k0',\n\n /**\n * Минимальная цена\n */\n K1 = 'k1',\n\n /**\n * Коэффициент K2\n */\n K2 = 'k2',\n\n /**\n * Коэффициент K3\n */\n K3 = 'k3',\n\n /**\n * Коэффициент K4\n */\n K4 = 'k4',\n\n /**\n * Розничная цена.\n */\n Retail = 'retail',\n}\n","import { NamedIdentity } from '@sc/system/classes/named-identity';\nimport { INamedIdentity } from '@sc/system/interfaces/i-named-identity';\nimport { IReference } from '@sc/system/interfaces/i-reference';\n\n/**\n * DTO-объект записи данных из справочника.\n */\nexport class Reference<S = string, I = number> extends NamedIdentity<I> implements IReference<S, I> {\n /**\n * Краткое название.\n */\n public slug?: S;\n\n /**\n * Описание.\n */\n public description?: string;\n\n /**\n * Инициализирует экземпляр класса {@link Reference}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IReference<S, I>>) {\n super(data as INamedIdentity<I>);\n\n this.description = data?.description;\n this.slug = data?.slug as S;\n }\n}\n","import { PriceCoefficientEnum } from '@sc/catalog/enums/price-coefficient-enum';\nimport { IPriceCoefficient } from '@sc/references/interfaces/i-price-coefficient';\nimport { Reference } from '@sc/system/classes/reference';\nimport { constant } from 'lodash-es';\n\n/**\n * Данные о коэффициенте цены.\n */\nexport class PriceCoefficient extends Reference<PriceCoefficientEnum> implements IPriceCoefficient {\n /**\n * Возвращает значение справочника коэффициента розничной цены.\n */\n public static getRetailPriceCoefficient(): IPriceCoefficient {\n return { id: -2, slug: PriceCoefficientEnum.Retail, name: 'Розн. цена', guid: '', isNewRec: constant(true) };\n }\n}\n","import { IProductPriceCoefficient } from '@sc/catalog/interfaces/i-product-price-coefficient';\nimport { PriceCoefficient } from '@sc/references/classes/price-coefficient';\nimport { IPriceCoefficient } from '@sc/references/interfaces/i-price-coefficient';\n\n/**\n * Данные о коэффициенте цены на продукт.\n */\nexport class ProductPriceCoefficient {\n /**\n * Коэффициент цены на продукт.\n */\n public coefficient: IPriceCoefficient;\n\n /**\n * Значение коэффициента.\n */\n public value: number;\n\n /**\n * Цена на продукт по коэффициенту в валюте продукта.\n */\n public cost: number;\n\n /**\n * Процент скидки от розничной цены по текущему коэффициенту.\n */\n public percent: number;\n\n /**\n * Признак того, что указанный коэффициент доступен текущему пользователю только для просмотра.\n */\n public readOnly: boolean;\n\n /**\n * Инициализирует экземпляр класса {@link ProductPriceCoefficient}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IProductPriceCoefficient) {\n this.coefficient = new PriceCoefficient(data?.coefficient);\n this.value = data?.value ?? 0;\n this.cost = data?.cost ?? 0;\n this.percent = data?.percent ?? 0;\n this.readOnly = data?.readOnly ?? true;\n }\n}\n","import { IGeoCoordinates } from '@sc/geo/interfaces/i-geo-coordinates';\n\n/**\n * Данные о географических координатах.\n */\nexport class GeoCoordinates implements IGeoCoordinates {\n /**\n * Широта.\n */\n public lat: number;\n\n /**\n * Долгота.\n */\n public long: number;\n\n /**\n * Инициализирует экземпляр класса {@link GeoCoordinates}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IGeoCoordinates) {\n this.lat = data?.lat ?? 0;\n this.long = data?.long ?? 0;\n }\n}\n","import { IDeliveryType } from '@sc/references/interfaces/i-delivery-type';\nimport { Reference } from '@sc/system/classes/reference';\n\n/**\n * Тип доставки.\n */\nexport class DeliveryType extends Reference implements IDeliveryType {}\n","import { GeoCoordinates } from '@sc/geo/classes/geo-coordinates';\nimport { IGeoCoordinates } from '@sc/geo/interfaces/i-geo-coordinates';\nimport { DeliveryType } from '@sc/references/classes/delivery-type';\nimport { IDeliveryType } from '@sc/references/interfaces/i-delivery-type';\nimport { IWarehouse } from '@sc/references/interfaces/i-warehouse';\nimport { Reference } from '@sc/system/classes/reference';\n\n/**\n * Данные о складе.\n */\nexport class Warehouse extends Reference implements IWarehouse {\n /**\n * Адрес склада.\n */\n public address: string;\n\n /**\n * Признак того, что склад является основным.\n */\n public isMain: boolean;\n\n /**\n * Список типов доставки.\n */\n public deliveryTypes: IDeliveryType[];\n\n /**\n * Список идентификаторов регионов, в которые осуществляется доставка со склада.\n */\n public regions?: number[];\n\n /**\n * Координаты склада.\n */\n public coordinates?: IGeoCoordinates;\n\n /**\n * Инициализирует экземпляр класса {@link Warehouse}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IWarehouse>) {\n super(data);\n\n this.address = data?.address ?? '';\n this.isMain = data?.isMain ?? false;\n this.deliveryTypes = data?.deliveryTypes?.map((dt) => new DeliveryType(dt)) ?? [];\n this.regions = data?.regions ?? [];\n this.coordinates = new GeoCoordinates(data?.coordinates);\n }\n}\n","import { IStockCount } from '@sc/catalog/interfaces/i-stock-count';\nimport { Warehouse } from '@sc/references/classes/warehouse';\nimport { IWarehouse } from '@sc/references/interfaces/i-warehouse';\n\n/**\n * Данные о количестве товара, доступном на складе.\n */\nexport class StockCount implements IStockCount {\n /**\n * Данные склада.\n */\n public warehouse: IWarehouse;\n\n /**\n * Количество остатков товара на складе.\n */\n public count: number;\n\n /**\n * Инициализирует экземпляр класса {@link StockCount}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IStockCount) {\n this.warehouse = new Warehouse(data?.warehouse);\n this.count = data?.count ?? 0;\n }\n}\n","import { CatalogableItem } from '@sc/system/classes/catalogable-item';\nimport { IHiddenCatalogableItem } from '@sc/system/interfaces/i-hidden-catalogable-item';\n\n/**\n * Данные о каталогизируемом элементе, который может быть скрыт.\n */\nexport class HiddenCatalogableItem extends CatalogableItem implements IHiddenCatalogableItem {\n /**\n * Признак того, что категория скрыта.\n */\n public isHidden: boolean;\n\n /**\n * Инициализирует экземпляр класса {@link HiddenCatalogableItem}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IHiddenCatalogableItem) {\n super(data);\n\n this.isHidden = data?.isHidden ?? false;\n }\n}\n","import { IImage } from '@sc/system/interfaces/i-image';\n\n/**\n * Данные об изображении.\n */\nexport class Image implements IImage {\n /**\n * Путь к основному изображению.\n */\n public image: string;\n\n /**\n * Путь к предпросмотру изображения.\n */\n public preview?: string;\n\n /**\n * Признак того, что изображение является основным.\n */\n public isDefault: boolean;\n\n /**\n * Инициализирует экземпляр класса {@link Image}.\n *\n * @param data Данные для первоначальной инициализации.\n * @param mediaServer URL адрес медиа сервера.\n */\n public constructor(data: IImage, mediaServer?: string) {\n this.image = `${mediaServer ?? ''}${data.image}`;\n this.preview = `${mediaServer ?? ''}${data.preview}`;\n this.isDefault = data.isDefault;\n }\n}\n","import { ProductPriceCoefficient } from '@sc/catalog/classes/product-price-coefficient';\nimport { StockCount } from '@sc/catalog/classes/stock-count';\nimport { IProduct } from '@sc/catalog/interfaces/i-product';\nimport { IProductPriceCoefficient } from '@sc/catalog/interfaces/i-product-price-coefficient';\nimport { IStockCount } from '@sc/catalog/interfaces/i-stock-count';\nimport { PropertiesList } from '@sc/catalog/types/properties-list';\nimport { ICatalogConfig } from '@sc/config/interfaces/i-catalog-config';\nimport { AppConfigProvider } from '@sc/config/providers/app-config-provider';\nimport { HiddenCatalogableItem } from '@sc/system/classes/hidden-catalogable-item';\nimport { Image } from '@sc/system/classes/image';\nimport { PrimaryCatalogableItem } from '@sc/system/classes/primary-catalogable-item';\nimport { IImage } from '@sc/system/interfaces/i-image';\nimport { IPrimaryCatalogableItem } from '@sc/system/interfaces/i-primary-catalogable-item';\nimport { parseISO } from 'date-fns';\nimport { isString } from 'lodash-es';\n\n/**\n * Данные о продукте.\n */\nexport class Product extends HiddenCatalogableItem implements IProduct {\n /**\n * Артикул производителя/поставщика.\n */\n public supplierSku?: string;\n\n /**\n * Единица измерения.\n */\n public unit: string;\n\n /**\n * Норма упаковки.\n */\n public pack?: string;\n\n /**\n * Минимальное количество товара для заказа.\n */\n public minCount?: number;\n\n /**\n * Единица измерения количества товара.\n */\n public quantityUnit?: string;\n\n /**\n * Валюта товара или услуги.\n */\n public currency: string;\n\n /**\n * Сигнатура валюты.\n */\n public currencySignature: string;\n\n /**\n * Стоимость товара или услуги.\n */\n public cost: number;\n\n /**\n * Стоимость продукта в рублях.\n */\n public costRub: number;\n\n /**\n * Дата установки цены.\n */\n public costDate?: Date;\n\n /**\n * Признак товара \"Под заказ\".\n */\n public onOrder?: boolean;\n\n /**\n * Данные о количестве товара, доступном на складах.\n */\n public stockCount?: IStockCount[];\n\n /**\n * Основная категория продукта.\n */\n public category?: IPrimaryCatalogableItem;\n\n /**\n * Список категорий продукта.\n */\n public categories?: IPrimaryCatalogableItem[];\n\n /**\n * Список изображений.\n */\n public images?: IImage[];\n\n /**\n * Список свойств продукта.\n */\n public properties?: PropertiesList;\n\n /**\n * Розничная цена.\n */\n public retailCost?: number;\n\n /**\n * Розничная стоимость продукта в рублях.\n */\n public retailCostRub?: number;\n\n /**\n * Список коэффициентов цен на продукт.\n */\n public priceCoefficients?: IProductPriceCoefficient[];\n\n /**\n * Инициализирует экземпляр класса {@link Product}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IProduct) {\n super(data);\n\n this.supplierSku = data?.supplierSku;\n this.unit = data?.unit ?? '';\n this.pack = data?.pack;\n this.minCount = data?.minCount;\n this.quantityUnit = data?.quantityUnit;\n this.currency = data?.currency ?? '';\n this.cost = data?.cost ?? 0;\n this.costRub = data?.costRub ?? 0;\n this.costDate = isString(data?.costDate) ? parseISO(data.costDate) : data?.costDate;\n this.onOrder = data?.onOrder ?? false;\n this.stockCount = data?.stockCount?.map((sc: IStockCount) => new StockCount(sc)) ?? [];\n this.currencySignature = data?.currencySignature ?? '';\n this.type = 'product';\n const primaryCategory = data?.category ?? data?.categories?.find((category) => category.isPrimary);\n\n if (primaryCategory) {\n this.category = new PrimaryCatalogableItem({ ...primaryCategory, isPrimary: true });\n this.categories = [this.category];\n }\n\n if (data?.categories) {\n this.categories = data.categories.map((category) => new PrimaryCatalogableItem(category));\n }\n\n this.images = data?.images?.map((im: IImage) => new Image(im, AppConfigProvider.getConfig().http.mediaUrl as string)) ?? [];\n this.properties = data?.properties ?? {};\n this.retailCost = data?.retailCost;\n this.retailCostRub = data?.retailCostRub;\n this.priceCoefficients = data?.priceCoefficients?.map((pc: IProductPriceCoefficient) => new ProductPriceCoefficient(pc)) ?? [];\n\n // TODO: Объявление полей, обеспечивающих обратную совместимость со старым представлением данных.\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (data && 'codeNumber' in data && !data.code) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any,@typescript-eslint/no-unsafe-member-access\n this.code = (data as any)?.codeNumber as string;\n }\n }\n\n /**\n * Возвращает признак, что это измеряемый товар.\n */\n public getIsMeasurable(): boolean {\n const unitsConfig = AppConfigProvider.getConfig<ICatalogConfig>().catalog?.products.units;\n\n return [...(unitsConfig?.linear ?? ['пог.м.', 'м.']), ...(unitsConfig?.square ?? ['м2'])].includes(this.unit);\n }\n\n /**\n * Возвращает розничную цену.\n */\n public getRetailCost(): number {\n return this.retailCost ?? this.cost;\n }\n\n /**\n * Возвращает розничную стоимость в рублях.\n */\n public getRetailCostRub(): number {\n return this.retailCostRub ?? this.costRub;\n }\n}\n","import { ICartItemBase } from '@sc/cart/interfaces/i-cart-item-base';\nimport { ICartItemConfiguratorParamsBase } from '@sc/cart/interfaces/i-cart-item-configurator-params-base';\nimport { BaseCategory } from '@sc/catalog/classes/internal/base/base-category';\nimport { Product } from '@sc/catalog/classes/product';\nimport { IProduct } from '@sc/catalog/interfaces/i-product';\nimport { Identity } from '@sc/system/classes/identity';\nimport { cloneDeep } from 'lodash-es';\n\n/**\n * Данные о единичной позиции товара/услуги в корзине.\n */\nexport class CartItemBase<T extends ICartItemConfiguratorParamsBase | undefined = undefined> extends Identity implements ICartItemBase<T> {\n /**\n * Данные о категории.\n */\n public category: BaseCategory;\n\n /**\n * Данные о товаре/услуге.\n */\n public product: IProduct;\n\n /**\n * Количество товара/услуги.\n */\n public quantity: number;\n\n /**\n * Высота товара.\n */\n public height?: number;\n\n /**\n * Длина товара.\n */\n public length?: number;\n\n /**\n * Ширина товара.\n */\n public width?: number;\n\n /**\n * Штрих-код продукта.\n */\n public barcode?: string;\n\n /**\n * Пользовательское описание позиции.\n */\n public marker?: string;\n\n /**\n * Название конфигуратора.\n */\n public configurator: T extends ICartItemConfiguratorParamsBase ? string : undefined;\n\n /**\n * Параметры конфигуратора.\n */\n public configuratorParams: T;\n\n /**\n * Признак того, что позиция является дополнительной продажей.\n */\n public isAdditionalSale?: boolean;\n\n /**\n * Инициализирует экземпляр класса {@link CartItemBase}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data: Partial<ICartItemBase<T>>) {\n super(data);\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n this.product = new Product(data?.product);\n this.quantity = data.quantity ?? 0;\n this.marker = data.marker;\n this.category = data.category ?? new BaseCategory();\n this.height = data.height;\n this.length = data.length;\n this.width = data.width;\n this.configurator = data.configurator as T extends ICartItemConfiguratorParamsBase ? string : undefined;\n this.configuratorParams = (data.configuratorParams as T) && cloneDeep<T>(data.configuratorParams as T);\n this.isAdditionalSale = data.isAdditionalSale;\n }\n}\n","import { CartItemBase } from '@sc/cart/classes/cart-item-base';\nimport { ICartItem } from '@sc/cart/interfaces/i-cart-item';\n\n/**\n * Данные о единичной позиции товара/услуги в корзине.\n */\nexport class CartItem extends CartItemBase implements ICartItem {\n /**\n * Валюта товара или услуги.\n */\n public currency: string;\n\n /**\n * Итоговая стоимость товара или услуги в валюте.\n */\n public cost: number;\n\n /**\n * Стоимость единицы товара или услуги в валюте.\n */\n public costOne: number;\n\n /**\n * Стоимость единицы товара или услуги в рублях.\n */\n public costOneRub: number;\n\n /**\n * Итоговая стоимость позиции корзины.\n */\n public costRub: number;\n\n /**\n * Идентификатор логической группы товаров/услуг.\n */\n public logicGroupId?: string;\n\n /**\n * Направление продаж.\n */\n public salesDirection?: number;\n\n /**\n * URL изображения со спецификацией.\n */\n public specificationImgUrl?: string;\n\n /**\n * Список допустимых вариантов продольного распила.\n *\n * В качестве значения указывается ширина продукта, а в качестве ключа указывается код продукта,\n * который соответствует указанной ширине. Количество не ограничено.\n */\n public sawing?: Array<Record<string, number>>;\n\n /**\n * Инициализирует экземпляр класса {@link CartItem}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data: ICartItem) {\n super(data);\n\n this.currency = data.currency;\n this.cost = data.cost;\n this.costOne = data.costOne;\n this.costOneRub = data.costOneRub;\n this.costRub = data.costRub;\n this.logicGroupId = data.logicGroupId;\n this.salesDirection = data.salesDirection;\n this.specificationImgUrl = data.specificationImgUrl;\n this.sawing = data.sawing;\n }\n}\n","import { CartItem } from '@sc/cart/classes/cart-item';\nimport { ICart } from '@sc/cart/interfaces/i-cart';\nimport { ICartItem } from '@sc/cart/interfaces/i-cart-item';\nimport { ICartSum } from '@sc/cart/interfaces/i-cart-sum';\n\n/**\n * Данные о содержимом корзины.\n */\nexport class Cart implements ICart {\n /**\n * Список позиций товаров/услуг в корзине.\n */\n public items: ICartItem[];\n\n /**\n * Итоговая стоимость корзины в рублях.\n */\n public resultSum: ICartSum;\n\n /**\n * Список итоговых сумм по направлениям продаж.\n */\n public directionsSum: Record<number, ICartSum>;\n\n /**\n * Инициализирует экземпляр класса {@link Cart}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data: ICart) {\n this.items = data.items.map((item) => new CartItem(item));\n this.resultSum = data.resultSum;\n this.directionsSum = data.directionsSum;\n }\n}\n","/**\n * Содержит механизмы инициализации экземпляров классов на основе их типов.\n */\nexport class TypedInstanceFactory {\n /**\n * Инициализирует экземпляр указанного класса.\n *\n * @param type Тип класса, на основе которого необходимо создать экземпляр (тип возвращаемых данных).\n */\n public static simpleInstanceInitializer<OutDataInterface>(\n // eslint-disable-next-line no-unused-vars\n type: new () => OutDataInterface\n ): OutDataInterface {\n // eslint-disable-next-line new-cap\n return new type();\n }\n\n /**\n * Инициализирует экземпляр указанного класса.\n *\n * @param type Тип класса, на основе которого необходимо создать экземпляр (тип возвращаемых данных).\n * @param data Начальные данные для инициализации (параметры конструктора).\n */\n public static instanceInitializer<OutDataInterface, SourceDataInterface>(\n // eslint-disable-next-line no-unused-vars\n type: new (data: SourceDataInterface) => OutDataInterface,\n data: SourceDataInterface\n ): OutDataInterface {\n // eslint-disable-next-line new-cap\n return new type(data);\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unnecessary-condition,@typescript-eslint/no-unsafe-assignment,@typescript-eslint/prefer-function-type,@typescript-eslint/no-unsafe-argument,@typescript-eslint/prefer-promise-reject-errors,@typescript-eslint/use-unknown-in-catch-callback-variable */\n\nimport { useAuthStateStore } from '@sc/auth';\nimport { AppConfigProvider } from '@sc/config/providers/app-config-provider';\nimport { IHttpResponseError } from '@sc/http/interfaces/i-http-response-error';\nimport { ErrorResponseNotificationHandler } from '@sc/http/types/error-response-notification-handler';\nimport { TypedInstanceFactory } from '@sc/system/providers/typed-instance-factory';\nimport { IFieldValidationResultData } from '@sc/validation/interfaces/i-field-validation-result-data';\nimport axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse, InternalAxiosRequestConfig } from 'axios';\nimport { format } from 'date-fns';\nimport { isNil, noop, toLower } from 'lodash-es';\nimport { objectToCamel, objectToSnake } from 'ts-case-convert';\n\n/**\n * Предоставляет базовые механизмы для выполнения запросов.\n */\nexport abstract class HttpRequester {\n /**\n * Экземпляр объекта текущего класса.\n */\n // eslint-disable-next-line no-use-before-define\n protected static instances: Record<string, HttpRequester> = {};\n\n /**\n * Базовый обработчик ошибок выполнения запросов.\n *\n * @param error Данные об ошибке.\n * @param validationFieldResultData Список полей, для которых необходимо установить данные об ошибках валидации в случае ошибок в запросах.\n * @param disableNotifications Признак необходимости отключить уведомления об ошибках.\n */\n protected static defaultErrorsResponseHandler: ErrorResponseNotificationHandler = noop;\n\n /**\n * Устанавливает базовый обработчик ошибок выполнения запросов.\n *\n * @param handler Ссылка на функцию-обработчик ошибок.\n */\n public static setDefaultErrorsResponseHandler(handler: ErrorResponseNotificationHandler): void {\n HttpRequester.defaultErrorsResponseHandler = handler;\n }\n\n /**\n * Возвращает экземпляр объекта текущего класса.\n *\n * @param type Тип данных, которыми оперирует метод.\n */\n public static getInstance<OutDataInterface extends HttpRequester>(type: new () => OutDataInterface): OutDataInterface {\n if (!Object.prototype.hasOwnProperty.call(HttpRequester.instances, type.name)) {\n HttpRequester.instances[type.name] = TypedInstanceFactory.simpleInstanceInitializer(type);\n }\n\n return HttpRequester.instances[type.name] as OutDataInterface;\n }\n\n /**\n * Конвертирует данные ошибки HTTP запроса в более упрощённую и часто используемую форму.\n *\n * @param error Данные об ошибке.\n */\n protected static convertHttpErrorResponse(error: any): Promise<IHttpResponseError> {\n if (!isNil(error.request) || !isNil(error.response)) {\n const rawResponse = error?.response;\n\n // eslint-disable-next-line prefer-promise-reject-errors\n return Promise.reject({\n status: rawResponse?.status ?? 0,\n statusText: rawResponse?.statusText ?? 'Unknown',\n message: rawResponse?.data?.message ?? 'Unknown Error. Probably network error.',\n errors: rawResponse?.data?.errors,\n headers: rawResponse?.headers ?? {},\n data: rawResponse?.data,\n rawError: error,\n } as IHttpResponseError);\n }\n\n return Promise.reject(error);\n }\n\n /**\n * Клиент для выполнения запросов данных.\n */\n protected readonly httpClient: AxiosInstance;\n\n /**\n * Базовый URL путь для выполнения запросов.\n */\n protected baseUrl: string = `${AppConfigProvider.getConfig().http.portalApiUrl as string}/api`;\n\n /**\n * Обработчик ошибок выполнения запросов текущего экземпляра класса.\n *\n * @param error Данные об ошибке.\n * @param validationFieldResultData Список полей, для которых необходимо установить данные об ошибках валидации в случае ошибок в запросах.\n * @param disableNotifications Признак необходимости отключить уведомления об ошибках.\n */\n protected errorResponseHandler: ErrorResponseNotificationHandler = noop;\n\n /**\n * Список идентификаторов обработчиков запросов для возможности отключить те или иные обработчики.\n */\n protected readonly interceptorIds: Record<'request' | 'response', Record<string, number>> = { request: {}, response: {} };\n\n /**\n * Перехватчик запроса для установки URL для выполнения запросов.\n *\n * @param request Данные запроса.\n */\n private setBaseUrlRequestInterceptor = (request: InternalAxiosRequestConfig): InternalAxiosRequestConfig => {\n request.baseURL = this.baseUrl;\n\n return request;\n };\n\n /**\n * Перехватчик запроса для установки заголовков аутентификации.\n *\n * @param request Данные запроса.\n */\n // eslint-disable-next-line class-methods-use-this\n private authRequestInterceptor = async (request: InternalAxiosRequestConfig): Promise<InternalAxiosRequestConfig> => {\n let authToken;\n\n if (!isNil(useAuthStateStore().jwtToken)) {\n authToken = await useAuthStateStore().jwtToken;\n }\n\n if (authToken) {\n request.headers.set('Authorization', `Bearer ${authToken}`);\n }\n\n return request;\n };\n\n /**\n * Перехватчик запроса для преобразования данных запроса.\n *\n * @param request Данные запроса.\n */\n // eslint-disable-next-line class-methods-use-this\n private dataConverterRequestInterceptor = (request: InternalAxiosRequestConfig): InternalAxiosRequestConfig => {\n // Для удобства и соглашения именования имён в TS используется camelCase.\n // Однако в соответствии с соглашением API все именования имён должны\n // соответствовать snake_case.\n if (request.method) {\n // Конвертируем названия полей параметров в snake_case 'get' запросов.\n if (request.method === 'get' && request.params) {\n request.params = objectToSnake(request.params);\n }\n\n // Конвертируем названия полей данных в snake_case 'put', 'patch', 'post' запросов.\n if (['put', 'patch', 'post'].includes(toLower(request.method)) && request.data) {\n request.data = objectToSnake(request.data);\n }\n }\n\n return request;\n };\n\n /**\n * Перехватчик ошибок ответов на запрос.\n *\n * @param error Данные ошибки ответа на запрос.\n */\n private authErrorsResponseInterceptors = (error: IHttpResponseError): Promise<never> => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const originalRequest = error.rawError ? (error.rawError as any)?.config : undefined;\n\n // Если получен 401 ответ, то обновляем токен и повторяем запрос.\n // eslint-disable-next-line sonarjs/different-types-comparison\n if (error.status === 401) {\n // Если отсутствует исходный запрос или это уже повторный запрос, то ничего не делаем.\n // eslint-disable-next-line no-underscore-dangle\n if (!originalRequest || originalRequest.__isRetryRequest) {\n // eslint-disable-next-line unicorn/no-useless-promise-resolve-reject\n return Promise.reject(error);\n }\n\n useAuthStateStore().invalidateJwtToken();\n\n // eslint-disable-next-line no-underscore-dangle\n originalRequest.__isRetryRequest = true;\n\n // Повторяем запрос с обновленным ключом.\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n return this.httpClient(originalRequest);\n }\n\n // Возвращаем Promise с ошибкой, если запрос не прошел\n // eslint-disable-next-line unicorn/no-useless-promise-resolve-reject\n return Promise.reject(error);\n };\n\n /**\n * Перехватчик ответа для преобразования данных ответа на запрос.\n *\n * @param response Данные ответа на запрос.\n */\n // eslint-disable-next-line class-methods-use-this\n private dataConverterResponseInterceptor = (response: AxiosResponse): AxiosResponse => {\n // Для удобства и соглашения именования имён в TS используем camelCase.\n // Конвертируем названия полей данных в camelCase.\n if (response.data) {\n response.data = objectToCamel(response.data);\n }\n\n return response;\n };\n\n /**\n * Инициализирует экземпляр класса {@link HttpRequester}.\n */\n public constructor() {\n const appVersion = AppConfigProvider.getConfig().version;\n\n // Устанавливаем обработчик ошибок по умолчанию для уведомления пользователей.\n this.errorResponseHandler = HttpRequester.defaultErrorsResponseHandler;\n\n // Инициализация клиента для выполнения HTTP запросов.\n this.httpClient = axios.create({\n headers: {\n 'APP-VERSION': `${appVersion.name} (${appVersion.version}, ${format(appVersion.date, AppConfigProvider.getConfig().dateFormats.uiDate)})`,\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n },\n });\n\n // Перехватчик запросов для установки базового URL.\n this.interceptorIds.request.setBaseUrlRequestInterceptor = this.httpClient.interceptors.request.use(this.setBaseUrlRequestInterceptor, (error) => Promise.reject(error));\n\n // Перехватчик запросов для добавления токена аутентификации/авторизации.\n this.interceptorIds.request.authRequestInterceptor = this.httpClient.interceptors.request.use(this.authRequestInterceptor, (error) => Promise.reject(error));\n\n // Перехватчик запросов для приведения названий всех ключей в теле запроса в snake_case.\n this.interceptorIds.request.dataConverterRequestInterceptor = this.httpClient.interceptors.request.use(this.dataConverterRequestInterceptor, (error) =>\n Promise.reject(error)\n );\n\n // Перехватчик ответов для конвертации данных ошибок.\n this.interceptorIds.response.convertHttpErrorResponseInterceptor = this.httpClient.interceptors.response.use(\n (response) => response,\n (error) => HttpRequester.convertHttpErrorResponse(error)\n );\n\n // Перехватчик ответов для обработки ошибок аутентификации (401).\n this.interceptorIds.response.authErrorsResponseInterceptor = this.httpClient.interceptors.response.use((response) => response, this.authErrorsResponseInterceptors);\n\n // Перехватчик ответов для приведения названий всех ключей в теле ответа в camelCase.\n this.interceptorIds.response.dataConverterResponseInterceptor = this.httpClient.interceptors.response.use(this.dataConverterResponseInterceptor, (error) =>\n Promise.reject(error)\n );\n }\n\n /**\n * Выполняет запрос с указанными параметрами.\n *\n * @param config Параметры запроса.\n * @param successHandler Функция обратного вызова для обработки данных при успешном выполнении запроса.\n * @param validationFieldResultData Список полей, для которых необходимо установить данные об ошибках валидации в случае ошибок в запросах.\n * @param disableNotifications Признак необходимости отключить уведомления об ошибках.\n */\n protected request<T>(\n config: AxiosRequestConfig,\n successHandler: undefined | ((response: AxiosResponse<T>) => T) = undefined,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {},\n disableNotifications: boolean = false\n ): Promise<T> {\n const requestPromise = this.httpClient.request<T>(config).then((response) => (successHandler ? successHandler(response) : response.data));\n\n requestPromise.catch((error: IHttpResponseError) => {\n this.errorResponseHandler(error, validationFieldResultData, disableNotifications);\n });\n\n return requestPromise;\n }\n\n /**\n * Выполняет get-запрос с параметрами по умолчанию.\n *\n * @param url URL запроса.\n * @param params Параметры запроса.\n * @param successHandler Функция обратного вызова для обработки данных при успешном выполнении запроса.\n * @param disableNotifications Признак необходимости отключить уведомления об ошибках.\n */\n protected get<T>(\n url: string,\n params: Record<string, string | number | boolean | Array<string | number | boolean> | object> = {},\n successHandler: undefined | ((response: AxiosResponse<T>) => T) = undefined,\n disableNotifications: boolean = false\n ): Promise<T> {\n return this.request<T>({ method: 'GET', url: url, params: params }, successHandler, {}, disableNotifications);\n }\n\n /**\n * Выполняет get-запрос с параметрами по умолчанию и возвращает Blob.\n *\n * @param url URL запроса.\n * @param params Параметры запроса.\n * @param successHandler Функция обратного вызова для обработки данных при успешном выполнении запроса.\n * @param disableNotifications Признак необходимости отключить уведомления об ошибках.\n */\n protected getBlob<T>(\n url: string,\n params: Record<string, string | number | boolean | Array<string | number | boolean> | object> = {},\n successHandler: undefined | ((response: AxiosResponse<T>) => T) = undefined,\n disableNotifications: boolean = false\n ): Promise<T> {\n return this.request<T>({ method: 'GET', url: url, params: params, responseType: 'blob' }, successHandler, {}, disableNotifications);\n }\n\n /**\n * Выполняет patch-запрос с параметрами по умолчанию.\n *\n * @param url URL запроса.\n * @param data Данные запроса.\n * @param successHandler Функция обратного вызова для обработки данных при успешном выполнении запроса.\n * @param validationFieldResultData Список полей, для которых необходимо установить данные об ошибках валидации в случае ошибок в запросах.\n * @param disableNotifications Признак необходимости отключить уведомления об ошибках.\n */\n protected patch<T>(\n url: string,\n data: Record<string, any> = {},\n successHandler: undefined | ((response: AxiosResponse<T>) => T) = undefined,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {},\n disableNotifications: boolean = false\n ): Promise<T> {\n return this.request({ method: 'PATCH', url: url, data: data }, successHandler, validationFieldResultData, disableNotifications);\n }\n\n /**\n * Выполняет post-запрос с параметрами по умолчанию.\n *\n * @param url URL запроса.\n * @param data Данные запроса.\n * @param successHandler Функция обратного вызова для обработки данных при успешном выполнении запроса.\n * @param validationFieldResultData Список полей, для которых необходимо установить данные об ошибках валидации в случае ошибок в запросах.\n * @param disableNotifications Признак необходимости отключить уведомления об ошибках.\n */\n protected post<T>(\n url: string,\n data: Record<string, any> = {},\n successHandler: undefined | ((response: AxiosResponse<T>) => T) = undefined,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {},\n disableNotifications: boolean = false\n ): Promise<T> {\n return this.request({ method: 'POST', url: url, data: data }, successHandler, validationFieldResultData, disableNotifications);\n }\n\n /**\n * Выполняет delete-запрос с параметрами по умолчанию.\n *\n * @param url URL запроса.\n * @param successHandler Функция обратного вызова для обработки данных при успешном выполнении запроса.\n * @param disableNotifications Признак необходимости отключить уведомления об ошибках.\n */\n protected delete<T>(url: string, successHandler: undefined | ((response: AxiosResponse<T>) => T) = undefined, disableNotifications: boolean = false): Promise<T> {\n return this.request({ method: 'DELETE', url: url }, successHandler, {}, disableNotifications);\n }\n}\n","import { Cart } from '@sc/cart/classes/cart';\nimport { ICart } from '@sc/cart/interfaces/i-cart';\nimport { ICartItemBase } from '@sc/cart/interfaces/i-cart-item-base';\nimport { ICartItemConfiguratorParamsBase } from '@sc/cart/interfaces/i-cart-item-configurator-params-base';\nimport { IFileUploadData } from '@sc/catalog/interfaces';\nimport { IClient } from '@sc/clients/interfaces/i-client';\nimport { HttpRequester } from '@sc/http/classes/http-requester';\nimport { IFieldValidationResultData } from '@sc/validation/interfaces/i-field-validation-result-data';\n\n/**\n * Предоставляет механизмы получения/управления данными корзины.\n * TODO:TASK[10672]: Добавить кэширование.\n */\nexport class CartProvider extends HttpRequester {\n /**\n * Возвращает содержимое корзины указанного клиента.\n *\n * @param client Данные о клиенте, для которого необходимо вернуть содержимое корзины.\n *\n * @see /doc/api/internal#/Корзина/api_internal_client_cart_get\n */\n public getCart(client: IClient): Promise<ICart> {\n return this.get<ICart>(`internal/clients/${client.id}/cart`, {}, (response) => new Cart(response.data));\n }\n\n /**\n * Удаляет всё содержимое корзины.\n *\n * @param client Данные о клиенте, для которого необходимо удалить всё содержимое корзины.\n *\n * @see /doc/api/internal#/Корзина/api_internal_client_cart_delete_all\n */\n public deleteCart(client: IClient): Promise<void> {\n return this.delete(`internal/clients/${client.id}/cart`);\n }\n\n /**\n * Добавляет в корзину новую позицию заказываемого товара/услуги и возвращает обновлённое содержимое корзины.\n *\n * @param client Данные о клиенте, для которого необходимо добавить в корзину новую позицию заказываемого товара/услуги.\n * @param cartItem Данные о товаре, который необходимо добавить в корзину.\n * @param validationFieldResultData Список полей, для которых необходимо\n * установить данные об ошибках валидации\n * в случае ошибок в запросах.\n *\n * @see /doc/api/internal#/Корзина/api_internal_client_cart_add_item\n */\n public addCartItem<T extends ICartItemConfiguratorParamsBase | undefined = undefined>(\n client: IClient,\n cartItem: ICartItemBase<T>,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<ICart> {\n return this.patch<ICart>(\n `internal/clients/${client.id}/cart`,\n {\n id: cartItem.configurator && cartItem.category.id,\n productId: cartItem.product.id,\n quantity: cartItem.quantity,\n height: cartItem.height,\n length: cartItem.length,\n width: cartItem.width,\n configurator: cartItem.configurator,\n marker: cartItem.marker,\n isAdditionalSale: cartItem.isAdditionalSale,\n ...cartItem.configuratorParams,\n },\n (response) => new Cart(response.data),\n validationFieldResultData\n );\n }\n\n /**\n * Изменяет параметры указанной записи корзины и возвращает обновлённое содержимое корзины.\n *\n * @param client Данные о клиенте, для которого необходимо изменить параметры указанной записи корзины.\n * @param cartItem Данные о позиции корзины, параметры которой необходимо изменить.\n * @param validationFieldResultData Список полей, для которых необходимо\n * установить данные об ошибках валидации\n * в случае ошибок в запросах.\n *\n * @see /doc/api/internal#/Корзина/api_internal_client_cart_modify_item\n */\n public patchCartItem<T extends ICartItemConfiguratorParamsBase | undefined = undefined>(\n client: IClient,\n cartItem: ICartItemBase<T>,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<ICart> {\n return this.patch<ICart>(\n `internal/clients/${client.id}/cart/${cartItem.id}`,\n {\n id: cartItem.configurator && cartItem.category.id,\n productId: cartItem.product.id,\n quantity: cartItem.quantity,\n height: cartItem.height,\n length: cartItem.length,\n width: cartItem.width,\n configurator: cartItem.configurator,\n marker: cartItem.marker,\n isAdditionalSale: cartItem.isAdditionalSale,\n ...cartItem.configuratorParams,\n },\n (response) => new Cart(response.data),\n validationFieldResultData\n );\n }\n\n /**\n * Удаляет указанную запись корзины и возвращает обновлённое содержимое корзины.\n *\n * @param client Данные о клиенте, для которого необходимо удалить указанную запись корзины.\n * @param cartItem Данные о позиции корзины, которую необходимо удалить.\n *\n * @see /doc/api/internal#/Корзина/api_internal_client_cart_delete_item\n */\n public deleteCartItem(client: IClient, cartItem: ICartItemBase): Promise<void> {\n return this.get(`internal/clients/${client.id}/cart/${cartItem.id}`, {});\n }\n\n /**\n * Добавляет продукты в корзину из файла CSV.\n *\n * @param client Данные о клиенте, для которого необходимо добавить в корзину новые позиции заказываемого товара/услуги из файла CSV.\n * @param file Данные о файле CSV.\n *\n * @see /doc/api/internal#/Корзина/api_internal_client_cart_add_products_from_csv\n */\n public addCartItemFromCSV(client: IClient, file: IFileUploadData): Promise<ICart> {\n return this.post<ICart>(`internal/clients/${client.id}/cart/add-products-from-csv`, file, (response) => new Cart(response.data));\n }\n\n /**\n * Возвращает пример CSV файла для добавления продуктов в корзину.\n *\n * @param client Данные о клиенте, для которого необходимо получить пример CSV файла.\n *\n * @see /doc/api/internal#/Корзина/api_internal_client_cart_add_products_from_csv_example\n */\n public getCartItemFromCSVExample(client: IClient): Promise<Blob> {\n return this.get<Blob>(`internal/clients/${client.id}/cart/add-products-from-csv/example`, {}, (blob) => new Blob([blob.data], { type: 'text/csv' }));\n }\n}\n","/**\n * Перечисление возможных типов вычисления цены.\n */\nexport enum CalculationTypeEnum {\n /**\n * Вычисление исходя из стоимости М2.\n */\n m2Cost = 'm2Cost',\n\n /**\n * Вычисление на основе процента.\n */\n percent = 'percent',\n\n /**\n * Вычисление на основе значения.\n */\n value = 'value',\n}\n","/* eslint-disable no-shadow */\n\n/**\n * Перечисление источников клиентских цен.\n */\nexport enum CostSourceEnum {\n /**\n * Цена по скидке.\n */\n Discount = 'discount',\n\n /**\n * Цена из шаблона прайс-листа.\n */\n PriceTemplate = 'price_template',\n\n /**\n * Клиентская цена.\n */\n ClientPrice = 'client_price',\n\n /**\n * Розничная цена продукта.\n */\n Product = 'product',\n}\n","/* eslint-disable no-shadow */\n\n/**\n * Перечисление типов свойств.\n */\nexport enum PropertyTypeEnum {\n /**\n * Тип не задан.\n */\n Unknown = 'unknown',\n\n /**\n * Логическое значение (0 или 1).\n */\n Bool = 'bool',\n\n /**\n * Целочисленное значение.\n */\n Integer = 'integer',\n\n /**\n * Вещественное значение.\n */\n Float = 'float',\n\n /**\n * Строковое значение.\n */\n String = 'string',\n\n /**\n * Диапазон числовых значений (два числа, разделённые запятой).\n */\n Range = 'range',\n\n /**\n * Данные, представленные в формате JSON.\n */\n Json = 'json',\n\n /**\n * Данные представлены объектом.\n */\n Object = 'object',\n}\n","import { BaseCategory } from '@sc/catalog/classes/internal/base/base-category';\nimport { Product } from '@sc/catalog/classes/product';\nimport { ICategory } from '@sc/catalog/interfaces/i-category';\nimport { IProduct } from '@sc/catalog/interfaces/i-product';\n\n/**\n * Данные о категории.\n */\nexport class Category extends BaseCategory implements ICategory {\n /**\n * Данные о вложенных категориях.\n */\n public categories?: ICategory[];\n\n /**\n * Список продуктов категории.\n */\n public products?: IProduct[];\n\n /**\n * Инициализирует экземпляр класса {@link Category}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: ICategory) {\n super(data);\n\n this.categories = data?.categories?.map((c) => new Category(c));\n this.products = data?.products?.map((c) => new Product(c));\n }\n}\n","import { NamedIdentity } from '@sc/system/classes/named-identity';\nimport { IUpdatableNamedIdentity } from '@sc/system/interfaces/i-updatable-named-identity';\nimport { parseISO } from 'date-fns';\nimport { isString } from 'lodash-es';\n\n/**\n * Базовая идентифицируемая сущность содержащая название и дату изменения.\n */\nexport abstract class UpdatableNamedIdentity extends NamedIdentity implements IUpdatableNamedIdentity {\n /**\n * Дата и время последнего изменения.\n */\n public updatedAt?: Date;\n\n /**\n * Инициализирует экземпляр класса {@link UpdatableNamedIdentity}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n protected constructor(data?: IUpdatableNamedIdentity) {\n super(data);\n\n this.updatedAt = isString(data?.updatedAt) ? parseISO(data.updatedAt) : data?.updatedAt;\n }\n}\n","import { UpdatableNamedIdentity } from '@sc/system/classes/updatable-named-identity';\nimport { IDeletableNamedIdentity } from '@sc/system/interfaces/i-deletable-named-identity';\nimport { parseISO } from 'date-fns';\nimport { isString } from 'lodash-es';\n\n/**\n * Базовая идентифицируемая сущность содержащая название, дату изменения и удаления.\n */\nexport abstract class DeletableNamedIdentity extends UpdatableNamedIdentity implements IDeletableNamedIdentity {\n /**\n * Дата и время последнего удаления.\n */\n public deletedAt?: Date;\n\n /**\n * Инициализирует экземпляр класса {@link UpdatableNamedIdentity}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n protected constructor(data?: IDeletableNamedIdentity) {\n super(data);\n\n this.deletedAt = isString(data?.deletedAt) ? parseISO(data.deletedAt) : data?.deletedAt;\n }\n}\n","import { NamedIdentity } from '@sc/system';\nimport { IUserShortInfo } from '@sc/user/interfaces/i-user-short-info';\n\nimport { UserTypeEnum } from '../enums';\n\n/**\n * Краткие данные о пользователе.\n */\nexport class UserShortInfo extends NamedIdentity implements IUserShortInfo {\n /**\n * Тип пользователя.\n */\n public type?: UserTypeEnum;\n\n /**\n * Инициализирует экземпляр класса {@link UserShortInfo}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IUserShortInfo>) {\n super(data);\n\n this.type = data?.type;\n }\n}\n","import { IDiscountShortInfo } from '@sc/catalog/interfaces/i-discount-short-info';\nimport { NamedIdentity } from '@sc/system/classes/named-identity';\nimport { UserShortInfo } from '@sc/user/classes/user-short-info';\nimport { IUserShortInfo } from '@sc/user/interfaces/i-user-short-info';\nimport { parseISO } from 'date-fns';\nimport { isString } from 'lodash-es';\n\n/**\n * Краткие данные скидки.\n */\nexport class DiscountShortInfo extends NamedIdentity implements IDiscountShortInfo {\n /**\n * Коэффициент стоимости продукта от розничной цены.\n */\n public costCoefficient: number;\n\n /**\n * Признак того, что скидка допускает снижение цены ниже стоп-цены.\n */\n public isLowPriceAllowed: boolean;\n\n /**\n * Дата и время начала действия скидки.\n */\n public publishedAt?: Date;\n\n /**\n * Описание скидки.\n */\n public description?: string;\n\n /**\n * Процент скидки от розничной цены.\n */\n public percent: number;\n\n /**\n * Краткие данные о пользователе.\n */\n public owner: IUserShortInfo;\n\n /**\n * Дата и время удаления.\n */\n public deletedAt?: Date;\n\n /**\n * Инициализирует экземпляр класса {@link DiscountShortInfo}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IDiscountShortInfo) {\n super(data);\n\n this.costCoefficient = data?.costCoefficient ?? 0;\n this.isLowPriceAllowed = data?.isLowPriceAllowed ?? false;\n this.publishedAt = isString(data?.publishedAt) ? parseISO(data.publishedAt) : data?.publishedAt;\n this.description = data?.description ?? undefined;\n this.percent = data?.percent ?? 0;\n this.owner = new UserShortInfo(data?.owner);\n this.deletedAt = isString(data?.deletedAt) ? parseISO(data.deletedAt) : data?.deletedAt;\n }\n}\n","import { IPriceTemplate } from '@sc/catalog/interfaces';\nimport { UpdatableNamedIdentity } from '@sc/system/classes/updatable-named-identity';\nimport { parseISO } from 'date-fns';\nimport { isString } from 'lodash-es';\n\n/**\n * Данные шаблона прайс-листа.\n */\nexport class PriceTemplate extends UpdatableNamedIdentity implements IPriceTemplate {\n /**\n * Описание шаблона прайс-листа.\n */\n public description?: string;\n\n /**\n * Дата и время создания шаблона.\n */\n public createdAt: Date;\n\n /**\n * Инициализирует экземпляр класса {@link PriceTemplate}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IPriceTemplate) {\n super(data);\n\n this.description = data?.description ?? '';\n this.createdAt = isString(data?.createdAt) ? parseISO(data.createdAt) : (data?.createdAt ?? new Date());\n }\n}\n","import { DiscountShortInfo } from '@sc/catalog/classes/discount-short-info';\nimport { PriceTemplate } from '@sc/catalog/classes/price-template';\nimport { Product } from '@sc/catalog/classes/product';\nimport { CostSourceEnum } from '@sc/catalog/enums/cost-source-enum';\nimport { IClientProduct } from '@sc/catalog/interfaces/i-client-product';\nimport { IDiscountShortInfo } from '@sc/catalog/interfaces/i-discount-short-info';\nimport { IPriceTemplate } from '@sc/catalog/interfaces/i-price-template';\n\n/**\n * Данные о продукте для клиента.\n */\nexport class ClientProduct extends Product implements IClientProduct {\n /**\n * Коэффициент стоимости продукта от розничной цены.\n */\n public costCoefficient: number;\n\n /**\n * Источник клиентской цены.\n */\n public costSource: CostSourceEnum;\n\n /**\n * Краткие данные скидки.\n */\n public discount?: IDiscountShortInfo;\n\n /**\n * Данные о шаблоне прайс-листа.\n */\n public priceTemplate?: IPriceTemplate;\n\n /**\n * Признак того, что указанный продукт входит в список ранее заказанных клиентом продуктов.\n */\n public isPreviouslyOrdered?: boolean;\n\n /**\n * Признак того, что указанный продукт входит в список продуктов для доп. продаж клиенту.\n */\n public isRequired?: boolean;\n\n /**\n * Признак того, что указанный продукт входит в список избранных продуктов клиента.\n */\n public isFavorite?: boolean;\n\n /**\n * Инициализирует экземпляр класса {@link ClientProduct}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IClientProduct) {\n super(data);\n\n this.costCoefficient = data?.costCoefficient ?? 0;\n this.costSource = data?.costSource ?? CostSourceEnum.Product;\n this.discount = data?.discount ? new DiscountShortInfo(data.discount) : undefined;\n this.priceTemplate = data?.priceTemplate ? new PriceTemplate(data.priceTemplate) : undefined;\n this.isPreviouslyOrdered = data?.isPreviouslyOrdered;\n this.isRequired = data?.isRequired;\n this.isFavorite = data?.isFavorite;\n }\n}\n","import { IContactLinks } from '@sc/contacts/interfaces/i-contact-links';\n\n/**\n * Данные контакта содержащие исключительно номер телефона, адрес эл. почты и др.\n */\nexport class ContactLinks implements IContactLinks {\n /**\n * Номер телефона. В формате \"79203436527\" или \"+79203436527\".\n */\n public phone?: string;\n\n /**\n * Адрес электронной почты.\n */\n public email?: string;\n\n /**\n * Инициализирует экземпляр класса {@link ContactLinks}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data: IContactLinks) {\n this.phone = /^\\d+$/.test(data.phone ?? '') ? `+${data.phone}` : data.phone;\n this.email = data.email;\n }\n}\n","import { ISalesDirection } from '@sc/references/interfaces/i-sales-direction';\nimport { Reference } from '@sc/system/classes/reference';\n\n/**\n * Данные о направлении продаж.\n */\nexport class SalesDirection extends Reference implements ISalesDirection {}\n","import { ContactLinks } from '@sc/contacts/classes/contact-links';\nimport { IContactLinks } from '@sc/contacts/interfaces/i-contact-links';\nimport { IManagerCommon } from '@sc/managers/interfaces/i-manager-common';\nimport { SalesDirection } from '@sc/references/classes/sales-direction';\nimport { ISalesDirection } from '@sc/references/interfaces/i-sales-direction';\nimport { NamedIdentity } from '@sc/system/classes/named-identity';\n\n/**\n * Общие данные о менеджере клиента.\n */\nexport class ManagerCommon extends NamedIdentity implements IManagerCommon {\n /**\n * @inheritDoc\n */\n public salesDirection: ISalesDirection;\n\n /**\n * @inheritDoc\n */\n public photo?: string;\n\n /**\n * @inheritDoc\n */\n public contacts?: IContactLinks;\n\n /**\n * @inheritDoc\n */\n public isDefault?: boolean;\n\n /**\n * @inheritDoc\n */\n public isRegionalDirector?: boolean;\n\n /**\n * Инициализирует экземпляр класса {@link ManagerCommon}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IManagerCommon) {\n super(data);\n\n this.salesDirection = data?.salesDirection ? new SalesDirection(data.salesDirection) : new SalesDirection();\n this.photo = data?.photo;\n this.contacts = data?.contacts ? new ContactLinks(data.contacts) : undefined;\n this.isDefault = data?.isDefault ?? false;\n this.isRegionalDirector = data?.isRegionalDirector ?? false;\n }\n}\n","import { ICuratedDirection } from '@sc/references/interfaces/i-curated-direction';\nimport { Reference } from '@sc/system/classes/reference';\n\n/**\n * Данные о направлении кураторства.\n */\nexport class CuratedDirection extends Reference implements ICuratedDirection {}\n","import { NamedIdentity } from '@sc/system/classes/named-identity';\nimport { IUserPricingRole } from '@sc/user/interfaces/i-user-pricing-role';\n\n/**\n * Данные о роли ценообразования.\n */\nexport class UserPricingRole extends NamedIdentity implements IUserPricingRole {\n /**\n * @inheritDoc\n */\n public description?: string;\n\n /**\n * @inheritDoc\n */\n public canChangeLowCost: boolean;\n\n /**\n * @inheritDoc\n */\n public parentRoleId?: number;\n\n /**\n * Инициализирует экземпляр класса {@link IUserPricingRole}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data: IUserPricingRole) {\n super(data);\n\n this.description = data.description;\n this.canChangeLowCost = data.canChangeLowCost;\n this.parentRoleId = data.parentRoleId;\n }\n}\n","/* eslint-disable @typescript-eslint/no-unnecessary-condition */\n\nimport { ManagerCommon } from '@sc/managers/classes/manager-common';\nimport { IManager } from '@sc/managers/interfaces/i-manager';\nimport { CuratedDirection } from '@sc/references/classes/curated-direction';\nimport { ICuratedDirection } from '@sc/references/interfaces/i-curated-direction';\nimport { UserPricingRole } from '@sc/user/classes/user-pricing-role';\nimport { IUserPricingRole } from '@sc/user/interfaces/i-user-pricing-role';\n\n/**\n * Данные о менеджере клиента.\n */\nexport class Manager extends ManagerCommon implements IManager {\n /**\n * Признак активности учетной записи менеджера.\n */\n public isActive: boolean;\n\n /**\n * Признак того, что менеджер является супервайзером.\n */\n public isSupervisor: boolean;\n\n /**\n * Признак того, что менеджер может работать с рекламациями.\n */\n public canDoReclamations: boolean;\n\n /**\n * Дата регистрации.\n */\n public createdAt?: Date;\n\n /**\n * Идентификатор супервайзера.\n */\n public supervisorId?: number;\n\n /**\n * Данные роли ценообразования менеджера.\n */\n public pricingRole?: IUserPricingRole;\n\n /**\n * Список направлений кураторства.\n */\n public curatedDirections?: ICuratedDirection[];\n\n /**\n * Инициализирует экземпляр класса {@link Manager}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IManager) {\n super(data);\n\n this.isActive = data?.isActive ?? false;\n this.isSupervisor = data?.isSupervisor ?? false;\n this.canDoReclamations = data?.canDoReclamations ?? false;\n this.createdAt = data?.createdAt;\n this.supervisorId = data?.supervisorId;\n this.pricingRole = data?.pricingRole ? new UserPricingRole(data.pricingRole) : undefined;\n this.curatedDirections = data?.curatedDirections?.map((curatedDirection) => new CuratedDirection(curatedDirection)) ?? [];\n }\n}\n","import { BaseCategory } from '@sc/catalog/classes/internal/base/base-category';\nimport { IBaseClientCategory } from '@sc/catalog/interfaces/internal/base/i-base-client-category';\nimport { Manager } from '@sc/managers/classes/manager';\nimport { IManager } from '@sc/managers/interfaces/i-manager';\n\n/**\n * Данные о категории клиента.\n */\nexport class BaseClientCategory extends BaseCategory implements IBaseClientCategory {\n /**\n * Признак того, что указанная категория входит в список отключенных для клиента категорий.\n */\n public isDisabled: boolean;\n\n /**\n * Признак того, что указанная категория входит в список категорий для доп. продаж клиенту.\n */\n public isRequired: boolean;\n\n /**\n * Признак того, что указанная категория входит в список избранных категорий клиента.\n */\n public isFavorite: boolean;\n\n /**\n * Причина скрытия категории для клиента.\n */\n public hidingComment?: string;\n\n /**\n * Данные о менеджере за которым закреплена категория.\n */\n public manager?: IManager;\n\n /**\n * Инициализирует экземпляр класса {@link BaseClientCategory}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IBaseClientCategory) {\n super(data);\n\n this.isDisabled = data?.isDisabled ?? false;\n this.isRequired = data?.isRequired ?? false;\n this.isFavorite = data?.isFavorite ?? false;\n this.hidingComment = data?.hidingComment;\n this.manager = data?.manager ? new Manager(data.manager) : undefined;\n }\n}\n","import { ClientProduct } from '@sc/catalog/classes/client-product';\nimport { BaseClientCategory } from '@sc/catalog/classes/internal/base/base-client-category';\nimport { IClientCategory } from '@sc/catalog/interfaces/i-client-category';\nimport { IClientProduct } from '@sc/catalog/interfaces/i-client-product';\n\n/**\n * Данные о категории клиента.\n */\nexport class ClientCategory extends BaseClientCategory implements IClientCategory {\n /**\n * Данные о вложенных категориях.\n */\n public categories?: IClientCategory[];\n\n /**\n * Список продуктов категории.\n */\n public products?: IClientProduct[];\n\n /**\n * Инициализирует экземпляр класса {@link ClientCategory}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IClientCategory) {\n super(data);\n\n this.categories = data?.categories?.map((c) => new ClientCategory(c));\n this.products = data?.products?.map((c) => new ClientProduct(c));\n }\n}\n","import { IPriceTemplateICatalogableItem } from '@sc/catalog/interfaces/i-price-template-catalogable-item';\nimport { PriceCoefficient } from '@sc/references/classes/price-coefficient';\nimport { IPriceCoefficient } from '@sc/references/interfaces/i-price-coefficient';\n\n/**\n * Данные о цене элемента каталога в шаблоне прайс-листа.\n */\nexport class PriceTemplateICatalogableItem implements IPriceTemplateICatalogableItem {\n /**\n * Коэффициент цены.\n */\n public priceCoefficient?: IPriceCoefficient;\n\n /**\n * Процент, который прибавляется к значению выбранного коэффициента.\n */\n public increasePercent?: number;\n\n /**\n * Инициализирует экземпляр класса {@link PriceTemplateICatalogableItem}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n protected constructor(data?: IPriceTemplateICatalogableItem) {\n this.priceCoefficient = data?.priceCoefficient && new PriceCoefficient(data.priceCoefficient);\n this.increasePercent = data?.increasePercent;\n }\n}\n","import { BaseCategory } from '@sc/catalog/classes/internal/base/base-category';\nimport { PriceTemplateICatalogableItem } from '@sc/catalog/classes/price-template-catalogable-item';\nimport { IPriceTemplateCategory } from '@sc/catalog/interfaces/i-price-template-category';\nimport { IBaseCategory } from '@sc/catalog/interfaces/internal/base/i-base-category';\n\n/**\n * Данные о цене продукта в шаблоне прайс-листа.\n */\nexport class PriceTemplateCategory extends PriceTemplateICatalogableItem implements IPriceTemplateCategory {\n /**\n * Базовые данные о продукте.\n */\n public productCategory: IBaseCategory;\n\n /**\n * Инициализирует экземпляр класса {@link PriceTemplateProduct}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IPriceTemplateCategory) {\n super(data);\n\n this.productCategory = new BaseCategory(data?.productCategory);\n }\n}\n","import { ContactLinks } from '@sc/contacts/classes/contact-links';\nimport { IContactLinks } from '@sc/contacts/interfaces/i-contact-links';\nimport { ICurator } from '@sc/managers/interfaces/i-curator';\nimport { CuratedDirection } from '@sc/references/classes/curated-direction';\nimport { ICuratedDirection } from '@sc/references/interfaces/i-curated-direction';\nimport { NamedIdentity } from '@sc/system/classes/named-identity';\n\n/**\n * Данные о кураторе клиента.\n */\nexport class Curator extends NamedIdentity implements ICurator {\n /**\n * @inheritDoc\n */\n public photo?: string;\n\n /**\n * @inheritDoc\n */\n public contacts: IContactLinks;\n\n /**\n * @inheritDoc\n */\n public curatedDirection: ICuratedDirection;\n\n /**\n * Инициализирует экземпляр класса {@link Curator}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data: ICurator) {\n super(data);\n\n this.photo = data.photo;\n this.contacts = new ContactLinks(data.contacts);\n this.curatedDirection = new CuratedDirection(data.curatedDirection);\n }\n}\n","import { ICountry } from '@sc/references/interfaces/i-country';\nimport { Reference } from '@sc/system/classes/reference';\n\n/**\n * Данные о стране.\n */\nexport class Country extends Reference implements ICountry {}\n","import { Country } from '@sc/references/classes/country';\nimport { ICountry } from '@sc/references/interfaces/i-country';\nimport { IRegion } from '@sc/references/interfaces/i-region';\nimport { Reference } from '@sc/system/classes/reference';\n\n/**\n * Данные о регионе, включая информацию о стране, в которой он расположен.\n */\nexport class Region extends Reference implements IRegion {\n /**\n * Данные о стране, в которой расположен регион.\n */\n public country: ICountry = new Country();\n\n /**\n * Инициализирует экземпляр класса {@link Region}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IRegion) {\n super(data);\n\n if (data) {\n this.country = new Country(data.country);\n }\n }\n}\n","import { Region } from '@sc/references/classes/region';\nimport { ICityWithRegionAndCountry } from '@sc/references/interfaces/i-city-with-region-and-country';\nimport { IRegion } from '@sc/references/interfaces/i-region';\nimport { Reference } from '@sc/system/classes/reference';\n\n/**\n * Данные о городе, включая информацию о регионе и стране в которых он расположен.\n */\nexport class CityWithRegionAndCountry extends Reference implements ICityWithRegionAndCountry {\n /**\n * Данные о регионе, в котором расположен город.\n */\n public region: IRegion = new Region();\n\n /**\n * Инициализирует экземпляр класса {@link CityWithRegionAndCountry}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: ICityWithRegionAndCountry) {\n super(data);\n\n if (data) {\n this.region = new Region(data.region);\n }\n }\n}\n","import { SalesDirection } from '@sc/references/classes/sales-direction';\nimport { ISalesDirection } from '@sc/references/interfaces/i-sales-direction';\nimport { NamedIdentity } from '@sc/system/classes/named-identity';\nimport { IUserCommonInfo } from '@sc/user/interfaces/i-user-common-info';\nimport { parseISO } from 'date-fns';\nimport { isString } from 'lodash-es';\n\n/**\n * Общие данные о пользователе.\n */\nexport class UserCommonInfo extends NamedIdentity implements IUserCommonInfo {\n /**\n * Номер телефона. В формате \"79203436527\" или \"+79203436527\".\n */\n public phone: string;\n\n /**\n * Адрес электронной почты.\n */\n public email: string;\n\n /**\n * Признак подписки на новости и информационные сообщения.\n */\n public getNews: boolean;\n\n /**\n * Направление продаж.\n */\n public salesDirection?: ISalesDirection;\n\n /**\n * Дата и время регистрации пользователя.\n */\n public createdAt?: Date;\n\n /**\n * Дата и время последней аутентификации пользователя.\n */\n public lastLoginAt?: Date;\n\n /**\n * Признак активности учетной записи пользователя.\n */\n public isActive: boolean;\n\n /**\n * Инициализирует экземпляр класса {@link UserCommonInfo}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IUserCommonInfo>) {\n super(data);\n\n this.phone = /^\\d+$/.test(data?.phone ?? '') ? `+${data?.phone}` : (data?.phone ?? '');\n this.email = data?.email ?? '';\n this.getNews = data?.getNews ?? false;\n this.salesDirection = data?.salesDirection ? new SalesDirection(data.salesDirection) : undefined;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n this.createdAt = isString(data?.createdAt) ? parseISO(data.createdAt) : data?.createdAt;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n this.lastLoginAt = isString(data?.lastLoginAt) ? parseISO(data.lastLoginAt) : data?.lastLoginAt;\n this.isActive = data?.isActive ?? false;\n }\n}\n","/* eslint-disable @typescript-eslint/no-unnecessary-condition */\n\nimport { IClientShortInfo } from '@sc/clients/interfaces/i-client-short-info';\nimport { Curator } from '@sc/managers/classes/curator';\nimport { ManagerCommon } from '@sc/managers/classes/manager-common';\nimport { ICurator } from '@sc/managers/interfaces/i-curator';\nimport { IManagerCommon } from '@sc/managers/interfaces/i-manager-common';\nimport { CityWithRegionAndCountry } from '@sc/references/classes/city-with-region-and-country';\nimport { SalesDirection } from '@sc/references/classes/sales-direction';\nimport { ICityWithRegionAndCountry } from '@sc/references/interfaces/i-city-with-region-and-country';\nimport { ISalesDirection } from '@sc/references/interfaces/i-sales-direction';\nimport { UserCommonInfo } from '@sc/user/classes/user-common-info';\n\n/**\n * Краткие данные о клиенте.\n */\nexport class ClientShortInfo extends UserCommonInfo implements IClientShortInfo {\n /**\n * Направление продаж.\n */\n public salesDirection: ISalesDirection;\n\n /**\n * Сумма задолженности/переплаты.\n */\n public debt: number;\n\n /**\n * Альтернативное название клиента.\n */\n public alternativeName?: string;\n\n /**\n * Данные о городе.\n */\n public city: ICityWithRegionAndCountry;\n\n /**\n * Комментарий к клиенту.\n */\n public comment?: string;\n\n /**\n * Признак того, что телефон клиента подтверждён.\n */\n public isPhoneApproved: boolean;\n\n /**\n * Признак того, что адрес электронной почты клиента подтверждён.\n */\n public isEmailApproved: boolean;\n\n /**\n * Список менеджеров клиента.\n */\n public managers: IManagerCommon[];\n\n /**\n * @inheritDoc\n */\n public curators: ICurator[];\n\n /**\n * Инициализирует экземпляр класса {@link Client}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n // eslint-disable-next-line sonarjs/cognitive-complexity\n public constructor(data?: IClientShortInfo) {\n super(data);\n\n this.salesDirection = new SalesDirection(data?.salesDirection);\n this.debt = data?.debt ?? 0;\n this.alternativeName = data?.alternativeName ?? '';\n this.city = new CityWithRegionAndCountry(data?.city);\n this.comment = data?.comment;\n this.isPhoneApproved = data?.isPhoneApproved ?? false;\n this.isEmailApproved = data?.isEmailApproved ?? false;\n this.managers = data?.managers?.map((m) => new ManagerCommon(m)) ?? [];\n this.curators = data?.curators?.map((c) => new Curator(c)) ?? [];\n }\n}\n","import { PriceTemplate } from '@sc/catalog/classes/price-template';\nimport { IPriceTemplate } from '@sc/catalog/interfaces/i-price-template';\nimport { IPriceTemplateClient } from '@sc/catalog/interfaces/i-price-template-client';\nimport { ClientShortInfo } from '@sc/clients/classes/client-short-info';\nimport { IClientShortInfo } from '@sc/clients/interfaces/i-client-short-info';\nimport { Identity } from '@sc/system/classes/identity';\nimport { parseISO } from 'date-fns';\nimport { isString } from 'lodash-es';\n\n/**\n * Данные шаблона прайс-листа клиента.\n */\nexport class PriceTemplateClient extends Identity implements IPriceTemplateClient {\n /**\n * Дата и время начала действия шаблона.\n */\n public createdAt: Date;\n\n /**\n * Дата и время окончания действия шаблона.\n */\n public deletedAt?: Date;\n\n /**\n * Данные о клиенте.\n */\n public client: IClientShortInfo;\n\n /**\n * Данные шаблона прайс-листа.\n */\n public priceTemplate: IPriceTemplate;\n\n /**\n * Инициализирует новый экземпляр класса.\n *\n * @param data Начальные данные для инициализации.\n */\n public constructor(data?: IPriceTemplateClient) {\n super(data);\n\n this.createdAt = isString(data?.createdAt) ? parseISO(data.createdAt) : (data?.createdAt ?? new Date());\n this.deletedAt = isString(data?.deletedAt) ? parseISO(data.deletedAt) : data?.deletedAt;\n this.client = new ClientShortInfo(data?.client);\n this.priceTemplate = new PriceTemplate(data?.priceTemplate);\n }\n}\n","import { PriceTemplateICatalogableItem } from '@sc/catalog/classes/price-template-catalogable-item';\nimport { Product } from '@sc/catalog/classes/product';\nimport { IPriceTemplateProduct } from '@sc/catalog/interfaces/i-price-template-product';\nimport { IProduct } from '@sc/catalog/interfaces/i-product';\n\n/**\n * Данные о цене продукта в шаблоне прайс-листа.\n */\nexport class PriceTemplateProduct extends PriceTemplateICatalogableItem implements IPriceTemplateProduct {\n /**\n * Базовые данные о продукте.\n */\n public product: IProduct;\n\n /**\n * Инициализирует экземпляр класса {@link PriceTemplateProduct}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IPriceTemplateProduct) {\n super(data);\n\n this.product = new Product(data?.product);\n }\n}\n","import { PropertyTypeEnum } from '@sc/catalog/enums/property-type-enum';\nimport { IPropertyType } from '@sc/catalog/interfaces/i-property-type';\nimport { Reference } from '@sc/system/classes/reference';\n\n/**\n * Данные о типе свойства.\n */\nexport class PropertyType extends Reference<PropertyTypeEnum> implements IPropertyType {}\n","import { PropertyType } from '@sc/catalog/classes/property-type';\nimport { IProperty } from '@sc/catalog/interfaces/i-property';\nimport { IPropertyType } from '@sc/catalog/interfaces/i-property-type';\nimport { NamedIdentity } from '@sc/system/classes/named-identity';\n\n/**\n * Данные о свойстве.\n */\nexport class Property extends NamedIdentity implements IProperty {\n /**\n * Тип свойства.\n */\n public type: IPropertyType;\n\n /**\n * Описание свойства.\n */\n public description: string;\n\n /**\n * Дополнительные метаданные свойства.\n */\n public metadata?: Record<string, unknown>;\n\n /**\n * Инициализирует экземпляр класса {@link Property}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IProperty) {\n super(data);\n\n this.type = new PropertyType(data?.type);\n this.description = data?.description ?? '';\n this.metadata = data?.metadata;\n }\n}\n","import { Property } from '@sc/catalog/classes/property';\nimport { IPropertyValue } from '@sc/catalog/interfaces/i-property-value';\n\n/**\n * Значение свойства.\n */\nexport class PropertyValue implements IPropertyValue {\n /**\n * Данные о свойстве.\n */\n public property: Property;\n\n /**\n * Значение свойства.\n * Может быть строкой, числом, boolean, диапазоном или JSON объектом.\n */\n public value: string | number | boolean | Record<string, unknown>;\n\n /**\n * Инициализирует экземпляр класса {@link PropertyValue}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IPropertyValue) {\n this.property = new Property(data?.property);\n this.value = data?.value ?? '';\n }\n}\n","import { IDatePeriod } from '@sc/system/interfaces/i-date-period';\nimport { parseISO } from 'date-fns';\nimport { isString } from 'lodash-es';\n\n/**\n * Данные о периоде времени, начало и окончание которого представлены {@link Date}.\n */\nexport class DatePeriod implements IDatePeriod {\n /**\n * Начало периода.\n */\n public from: Date | null;\n\n /**\n * Окончание периода.\n */\n public to: Date | null;\n\n /**\n * Инициализирует экземпляр класса {@link DatePeriod}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IDatePeriod) {\n this.from = isString(data?.from) ? parseISO(data.from) : (data?.from ?? null);\n this.to = isString(data?.to) ? parseISO(data.to) : (data?.to ?? null);\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any,@typescript-eslint/no-unnecessary-condition */\n\nimport { ITemplatesListFilters } from '@sc/catalog/interfaces/i-templates-list-filters';\nimport { DatePeriod } from '@sc/system/classes/date-period';\nimport { IDatePeriod } from '@sc/system/interfaces/i-date-period';\nimport { IReference } from '@sc/system/interfaces/i-reference';\nimport { isFunction, isNil, isString } from 'lodash-es';\n\n/**\n * Данные о параметрах фильтрации списка шаблонов прайс-листов.\n */\nexport class TemplatesListFilters implements ITemplatesListFilters {\n /**\n * Идентификатор шаблона прайс-листа.\n */\n public id?: string;\n\n /**\n * Название шаблона прайс-листа.\n */\n public name?: string;\n\n /**\n * Описание шаблона прайс-листа.\n */\n public description?: string;\n\n /**\n * Период создания.\n */\n public createdAt: IDatePeriod = new DatePeriod();\n\n /**\n * Период изменения.\n */\n public updatedAt: IDatePeriod = new DatePeriod();\n\n /**\n * Инициализирует экземпляр класса {@link TemplatesListFilters}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: ITemplatesListFilters) {\n this.id = data?.id;\n this.name = data?.name;\n this.description = data?.description;\n this.createdAt = new DatePeriod(data?.createdAt);\n this.updatedAt = new DatePeriod(data?.updatedAt);\n }\n\n /**\n * Выполняет сброс указанного фильтра в значение по умолчанию.\n *\n * @param key Название фильтра, значение которого необходимо сбросить.\n */\n public resetFilterValue(key: string): this {\n switch (key) {\n case 'id':\n case 'name':\n case 'description':\n // eslint-disable-next-line security/detect-object-injection\n this[key] = undefined;\n break;\n case 'createdAt':\n this.createdAt.from = null;\n this.createdAt.to = null;\n break;\n case 'updatedAt':\n this.updatedAt.from = null;\n this.updatedAt.to = null;\n break;\n default:\n break;\n }\n\n return this;\n }\n\n /**\n * Возвращает очищенное значение фильтров, содержащие\n * только актуальные данные.\n */\n public asClearRaw(): Record<string, any> {\n const result: Record<string, any> = {};\n\n // eslint-disable-next-line lodash/prefer-lodash-method\n Object.keys(this).forEach((k) => {\n const value = this[k as keyof ITemplatesListFilters];\n\n if (\n !(\n // eslint-disable-next-line prettier/prettier\n isNil(value)\n // eslint-disable-next-line prettier/prettier,lodash/prefer-lodash-method\n || (isString(value) && value.trim().length === 0)\n // eslint-disable-next-line @typescript-eslint/unbound-method,prettier/prettier\n || (isFunction((value as IReference).isNewRec) && (value as IReference).isNewRec())\n )\n ) {\n // eslint-disable-next-line security/detect-object-injection\n result[k] = value;\n }\n });\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (!result?.createdAt?.from && !result?.createdAt?.to) {\n delete result.createdAt;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (!result?.updatedAt?.from && !result?.updatedAt?.to) {\n delete result.updatedAt;\n }\n\n return result;\n }\n}\n","import { IPricingRole } from '@sc/catalog/interfaces/i-pricing-role';\nimport { NamedIdentity } from '@sc/system/classes/named-identity';\n\n/**\n * Данные роли ценообразования.\n */\nexport class PricingRole extends NamedIdentity implements IPricingRole {\n /**\n * Описание роли ценообразования.\n */\n public description?: string;\n\n /**\n * Признак того, что пользователь с данной ролью может устанавливать цены ниже минимальной.\n */\n public canChangeLowCost: boolean;\n\n /**\n * Идентификатор родительской роли ценообразования.\n */\n public parentRoleId?: number;\n\n /**\n * Дочерние категории.\n */\n public subRoles: IPricingRole[] = [];\n\n /**\n * Родительская категория.\n */\n public parentRole?: IPricingRole;\n\n /**\n * Уровень роли ценообразования.\n */\n public level: number = 0;\n\n /**\n * Инициализирует экземпляр класса {@link PricingRole}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IPricingRole) {\n super(data);\n\n this.description = data?.description;\n this.canChangeLowCost = data?.canChangeLowCost ?? false;\n this.parentRoleId = data?.parentRoleId;\n }\n}\n","import { BaseCategory } from '@sc/catalog/classes/internal/base/base-category';\nimport { PricingRole } from '@sc/catalog/classes/pricing-role';\nimport { ICategoryPricingRule } from '@sc/catalog/interfaces/i-category-pricing-rule';\nimport { IPricingRole } from '@sc/catalog/interfaces/i-pricing-role';\nimport { IBaseCategory } from '@sc/catalog/interfaces/internal/base/i-base-category';\nimport { PriceCoefficient } from '@sc/references/classes/price-coefficient';\nimport { IPriceCoefficient } from '@sc/references/interfaces/i-price-coefficient';\n\n/**\n * Правило для роли ценообразования указанной категории.\n */\nexport class CategoryPricingRule implements ICategoryPricingRule {\n /**\n * Роль ценообразования.\n */\n public role: IPricingRole;\n\n /**\n * Категория товара.\n */\n public category: IBaseCategory;\n\n /**\n * Минимальный коэффициент цены.\n */\n public minCoefficient: IPriceCoefficient;\n\n /**\n * Инициализирует экземпляр класса {@link PricingRoleCategoryRule}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: ICategoryPricingRule) {\n this.role = new PricingRole(data?.role);\n this.category = new BaseCategory(data?.category);\n this.minCoefficient = new PriceCoefficient(data?.minCoefficient);\n }\n}\n","import { IDeviceTypeResolutionConfig } from '@sc/config/interfaces/i-device-type-resolution-config';\n\n/**\n * Список условного отношения разрешения экрана и типа устройств.\n */\nexport class DeviceTypeResolutionConfig implements IDeviceTypeResolutionConfig {\n /**\n * Максимальное разрешение для распознания мобильного телефона.\n */\n public readonly phone: number;\n\n /**\n * Минимальное разрешение для распознания планшета.\n */\n public readonly tablet: number;\n\n /**\n * Минимальное разрешение для распознания компьютера.\n */\n public readonly laptop: number;\n\n /**\n * Инициализирует экземпляр класса {@link DeviceTypeResolutionConfig}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IDeviceTypeResolutionConfig>) {\n this.phone = data?.phone ?? 360;\n this.tablet = data?.tablet ?? 600;\n this.laptop = data?.laptop ?? 1024;\n }\n}\n","import { IHttpParamsConfig } from '@sc/config/interfaces/i-http-params-config';\n\n/**\n * Настройки HTTP взаимодействия.\n */\nexport class HttpParamsConfig implements IHttpParamsConfig {\n /**\n * @inheritDoc\n */\n public readonly portalApiUrl: string;\n\n /**\n * @inheritDoc\n */\n public readonly priceHistoryApiUrl?: string;\n\n /**\n * @inheritDoc\n */\n public readonly recommendationsApiUrl?: string;\n\n /**\n * @inheritDoc\n */\n public readonly mediaUrl?: string;\n\n /**\n * @inheritDoc\n */\n public readonly responseDataCacheTimeout: number;\n\n /**\n * Инициализирует экземпляр класса {@link HttpParamsConfig}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IHttpParamsConfig>) {\n this.portalApiUrl = data?.portalApiUrl ?? '';\n this.priceHistoryApiUrl = data?.priceHistoryApiUrl ?? '';\n this.recommendationsApiUrl = data?.recommendationsApiUrl ?? '';\n this.mediaUrl = data?.mediaUrl ?? '';\n this.responseDataCacheTimeout = data?.responseDataCacheTimeout ?? 3 * 60 * 60;\n }\n}\n","import { ISentryConfig } from '@sc/config/interfaces/i-sentry-config';\n\n/**\n * Данные конфигурации для взаимодействия с системой журналирования Sentry.\n */\nexport class SentryConfig implements ISentryConfig {\n /**\n * DSN подключения к Sentry.\n */\n public readonly dsn: string;\n\n /**\n * Тип окружения.\n */\n public readonly environment: string;\n\n /**\n * Список игнорируемых ошибок.\n */\n public readonly ignoreErrors?: Array<string | RegExp>;\n\n /**\n * Настройки трассировкии событий.\n */\n public readonly trace: {\n /**\n * Список доменов с которых разрешена трассировка событий.\n */\n readonly allowedTargets?: Array<string | RegExp>;\n\n /**\n * Частота выборки необходимости отправки событий трассировки/мониторинга.\n *\n * @description\n * Set tracesSampleRate to 1.0 to capture 100% of transactions for performance monitoring.\n * We recommend adjusting this value in production.\n */\n readonly sampleRate?: number;\n };\n\n /**\n * Настройки записей сеансов.\n */\n public readonly replay: {\n /**\n * Частота выборки для повторов продолжительности сеанса.\n * 1.0 будет записывать все сеансы, а 0 — ни одного.\n *\n * @description\n * The sample rate for session-long replays.\n * 1.0 will record all sessions and 0 will record none.\n */\n replaysSessionSampleRate?: number;\n\n /**\n * Частота выборки для сеансов, в которых произошла ошибка.\n * Это не зависит от sessionSampleRate.\n * 1.0 будет записывать все сеансы, а 0 — ни одного.\n *\n * @description\n * The sample rate for sessions that has had an error occur.\n * This is independent of `sessionSampleRate`.\n * 1.0 will record all sessions and 0 will record none.\n */\n replaysOnErrorSampleRate?: number;\n };\n\n /**\n * Дополнительные параметры.\n */\n public readonly additionalParams?: Record<string, unknown>;\n\n /**\n * Инициализирует экземпляр класса {@link SentryConfig}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<ISentryConfig>) {\n this.dsn = data?.dsn ?? '';\n this.environment = data?.environment ?? 'production';\n // eslint-disable-next-line prettier/prettier\n this.ignoreErrors = data?.ignoreErrors ?? [\n /Network\\s{1,3}Error/,\n /Request\\s{1,3}aborted/,\n /Request\\s{1,3}failed\\s{1,3}with\\s{1,3}status\\s{1,3}code\\s{1,3}(401|403|422)/\n ];\n this.trace = {\n allowedTargets: data?.trace?.allowedTargets ?? [/^\\//],\n sampleRate: data?.trace?.sampleRate ?? 0,\n };\n this.replay = {\n replaysOnErrorSampleRate: data?.replay?.replaysOnErrorSampleRate ?? 0,\n replaysSessionSampleRate: data?.replay?.replaysSessionSampleRate ?? 0,\n };\n this.additionalParams = data?.additionalParams ?? {};\n }\n}\n","import { IVersionConfig } from '@sc/config/interfaces/i-version-config';\nimport { parseISO } from 'date-fns';\nimport { isString } from 'lodash-es';\n\n/**\n * Данные о текущем выпуске приложения.\n */\nexport class VersionConfig implements IVersionConfig {\n /**\n * Дата релиза текущей версии приложения.\n */\n public readonly date: Date;\n\n /**\n * Название релиза.\n */\n public readonly name: string;\n\n /**\n * Текущая версия приложения.\n */\n public readonly version: string;\n\n /**\n * Инициализирует экземпляр класса {@link VersionConfig}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IVersionConfig>) {\n this.date = isString(data?.date) ? parseISO(data.date) : (data?.date ?? new Date());\n this.name = data?.name ?? '';\n this.version = data?.version ?? '0.0.0';\n }\n}\n","import { IWebsocketConfig } from '@sc/config/interfaces/i-websocket-config';\n\nexport class WebSocketConfig {\n /**\n * @inheritDoc\n */\n // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\n public readonly broadcaster: 'reverb' | 'pusher' | 'socket.io' | string;\n\n /**\n * @inheritDoc\n */\n public readonly key: string;\n\n /**\n * @inheritDoc\n */\n public readonly wsHost: string;\n\n /**\n * @inheritDoc\n */\n public readonly wsPort: number;\n\n /**\n * @inheritDoc\n */\n public readonly wssPort: number;\n\n /**\n * @inheritDoc\n */\n public readonly forceTLS: boolean;\n\n /**\n * @inheritDoc\n */\n public readonly enabledTransports: string[];\n\n /**\n * Инициализирует экземпляр класса {@link WebSocketConfig}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data: Partial<IWebsocketConfig>) {\n this.broadcaster = data.broadcaster ?? 'reverb';\n this.key = data.key ?? '';\n this.wsHost = data.wsHost ?? '';\n this.wsPort = data.wsPort ?? 8080;\n this.wssPort = data.wssPort ?? 8080;\n this.forceTLS = data.forceTLS ?? false;\n this.enabledTransports = data.enabledTransports ?? ['wss'];\n }\n}\n","import { DeviceTypeResolutionConfig } from '@sc/config/classes/device-type-resolution-config';\nimport { HttpParamsConfig } from '@sc/config/classes/http-params-config';\nimport { SentryConfig } from '@sc/config/classes/sentry-config';\nimport { VersionConfig } from '@sc/config/classes/version-config';\nimport { WebSocketConfig } from '@sc/config/classes/websocket-config';\nimport { IAppBaseConfig } from '@sc/config/interfaces/i-app-base-config';\nimport { IDeviceTypeResolutionConfig } from '@sc/config/interfaces/i-device-type-resolution-config';\nimport { IHttpParamsConfig } from '@sc/config/interfaces/i-http-params-config';\nimport { ISentryConfig } from '@sc/config/interfaces/i-sentry-config';\nimport { IVersionConfig } from '@sc/config/interfaces/i-version-config';\nimport { IWebsocketConfig } from '@sc/config/interfaces/i-websocket-config';\n\n/**\n * Базовые конфигурационные данные приложения.\n */\nexport class AppBaseConfig implements IAppBaseConfig {\n /**\n * @inheritDoc\n */\n public readonly environment: string;\n\n /**\n * @inheritDoc\n */\n public readonly devMode?: Record<string, unknown>;\n\n /**\n * @inheritDoc\n */\n public readonly http: IHttpParamsConfig | Record<string, unknown>;\n\n /**\n * @inheritDoc\n */\n public readonly deviceTypeByResolution: IDeviceTypeResolutionConfig;\n\n /**\n * @inheritDoc\n */\n public readonly sentry?: ISentryConfig;\n\n /**\n * @inheritDoc\n */\n public readonly tableDefaultHeightCoefficient?: number;\n\n /**\n * @inheritDoc\n */\n readonly urls?: Record<string, string | undefined>;\n\n /**\n * @inheritDoc\n */\n public readonly version: IVersionConfig;\n\n /**\n * Конфигурация web-сокета.\n */\n public readonly websocket?: IWebsocketConfig;\n\n /**\n * @inheritDoc\n */\n public readonly dateFormats: IAppBaseConfig['dateFormats'];\n\n /**\n * Инициализирует экземпляр класса {@link AppBaseConfig}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IAppBaseConfig>) {\n this.environment = data?.environment ?? 'production';\n this.devMode = data?.devMode ?? {};\n this.http = new HttpParamsConfig(data?.http);\n this.deviceTypeByResolution = new DeviceTypeResolutionConfig(data?.deviceTypeByResolution);\n this.sentry = new SentryConfig({\n environment: this.environment,\n ...data?.sentry,\n });\n this.tableDefaultHeightCoefficient = data?.tableDefaultHeightCoefficient ?? 0.7;\n this.urls = data?.urls;\n this.version = new VersionConfig(data?.version);\n this.websocket = data?.websocket ? new WebSocketConfig(data.websocket) : undefined;\n this.dateFormats = {\n api: data?.dateFormats?.api ?? 'yyyy-MM-dd HH:mm:ss',\n uiDate: data?.dateFormats?.uiDate ?? 'dd.MM.yyyy',\n uiDateWithTime: data?.dateFormats?.uiDateWithTime ?? 'dd.MM.yyyy HH:mm',\n };\n }\n}\n","import { SearchResult } from '@sc/catalog/types/search-result';\nimport { AppConfigProvider } from '@sc/config';\nimport { HttpRequester } from '@sc/http/classes/http-requester';\n\n/**\n * Предоставляет механизмы получения/управления данными о каталоге.\n */\nexport class CatalogProvider extends HttpRequester {\n /**\n * Возвращает данные о результатах поиска категорий и товаров.\n *\n * @param term Терм поиска.\n * @param showHidden Признак необходимости также возвращать данные о скрытых категориях.\n *\n * @see /doc/api/internal#/Каталог/api_internal_catalog_search\n */\n public search(term: string, showHidden: boolean = false): Promise<SearchResult> {\n return this.get<SearchResult>(`/internal/catalog/search`, {\n term: term,\n show_hidden: showHidden,\n });\n }\n\n /**\n * Возвращает ссылку для скачивания файла с ценами.\n *\n * @param format Формат скачиваемого файла прайс-листа.\n * @param showHidden Признак того, что необходимо включить в ответ скрытые продукты.\n * @param categoryId Идентификатор записи категории товаров.\n * @param clientId Идентификатор клиента для которого необходимо получить файл.\n *\n * @see /doc/api/internal#/operations/api_internal_price_export\n */\n // eslint-disable-next-line class-methods-use-this\n public getPriceExportLink(\n format: 'csv' | 'pdf' = 'csv',\n showHidden: boolean = false,\n categoryId: number | undefined = undefined,\n clientId: number | undefined = undefined\n ): string {\n const appConfig = AppConfigProvider.getConfig();\n\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n let link = `${appConfig.http.portalApiUrl}/api/internal/price/export?format=${format}&show_hidden=${showHidden}`;\n\n if (categoryId) {\n link += `&category_id=${categoryId}`;\n }\n\n if (clientId) {\n link += `&client_id=${clientId}`;\n }\n\n return link;\n }\n}\n","import { ClientProduct } from '@sc/catalog/classes';\nimport { IClientProduct, ICommercialOffer, ICommercialOfferParams, IFileUploadData, IPriceUpdateData } from '@sc/catalog/interfaces';\nimport { HttpRequester } from '@sc/http/classes/http-requester';\n\n/**\n * Предоставляет механизмы получения/управления данными прайс-листа клиента.\n */\nexport class ClientPriceProvider extends HttpRequester {\n /**\n * Импортирует цены клиента из CSV файла.\n *\n * @param clientId Идентификатор клиента.\n * @param file CSV файл с ценами клиента.\n *\n * @see /doc/api/internal#/operations/api_internal_client_price_import\n */\n public importPrices(clientId: number, file: IFileUploadData): Promise<void> {\n return this.post(`/internal/clients/${clientId}/price/import`, file);\n }\n\n /**\n * Изменяет стоимость продуктов категории для клиента.\n *\n * @param clientId Идентификатор клиента.\n * @param categoryId Идентификатор категории товаров.\n * @param data Данные для изменения цены.\n *\n * @see /doc/api/internal#/operations/api_internal_client_price_category_update\n */\n public updateCategoryPrices(clientId: number, categoryId: number, data: IPriceUpdateData): Promise<void> {\n return this.patch(`/internal/clients/${clientId}/price/categories/${categoryId}`, {\n price_coefficient_id: data.coefficient?.id,\n increase_percent: data.value,\n });\n }\n\n /**\n * Удаляет клиентские цены на продукты категории.\n *\n * @param clientId Идентификатор клиента.\n * @param categoryId Идентификатор категории товаров.\n *\n * @see /doc/api/internal#/operations/api_internal_client_price_categories_remove\n */\n public removeCategoryPrices(clientId: number, categoryId: number): Promise<void> {\n return this.delete(`/internal/clients/${clientId}/price/categories/${categoryId}`);\n }\n\n /**\n * Добавляет указанную категорию товаров в список категорий для дополнительных продаж.\n *\n * @param clientId Идентификатор клиента.\n * @param categoryId Идентификатор категории товаров.\n *\n * @see /doc/api/internal#/operations/api_internal_client_price_categories_required_mark\n */\n public markCategoryRequired(clientId: number, categoryId: number): Promise<void> {\n return this.post(`/internal/clients/${clientId}/price/categories/${categoryId}/required`);\n }\n\n /**\n * Удаляет указанную категорию товаров из списка категорий для дополнительных продаж.\n *\n * @param clientId Идентификатор клиента.\n * @param categoryId Идентификатор категории товаров.\n *\n * @see /doc/api/internal#/operations/api_internal_client_price_categories_required_unmark\n */\n public unmarkCategoryRequired(clientId: number, categoryId: number): Promise<void> {\n return this.delete(`/internal/clients/${clientId}/price/categories/${categoryId}/required`);\n }\n\n /**\n * Добавляет отметку скрытия категории в прайсе указанного клиента.\n *\n * @param clientId Идентификатор клиента.\n * @param categoryId Идентификатор категории товаров.\n * @param comment Комментарий о причинах скрытия категории.\n *\n * @see /doc/api/internal#/operations/api_internal_client_price_categories_disabled_mark\n */\n public markCategoryDisabled(clientId: number, categoryId: number, comment?: string): Promise<void> {\n return this.post(`/internal/clients/${clientId}/price/categories/${categoryId}/disabled`, { comment });\n }\n\n /**\n * Снимает отметку скрытия категорий в прайсе указанного клиента.\n *\n * @param clientId Идентификатор клиента.\n * @param categoryId Идентификатор категории товаров.\n *\n * @see /doc/api/internal#/operations/api_internal_client_price_categories_disabled_unmark\n */\n public unmarkCategoryDisabled(clientId: number, categoryId: number): Promise<void> {\n return this.delete(`/internal/clients/${clientId}/price/categories/${categoryId}/disabled`);\n }\n\n /**\n * Применяет менеджера для указанной категории продуктов клиента.\n *\n * @param clientId Идентификатор клиента.\n * @param categoryId Идентификатор категории товаров.\n * @param managerId Идентификатор менеджера.\n *\n * @see /doc/api/internal#/operations/api_internal_client_price_categories_manager_add\n */\n public addCategoryManager(clientId: number, categoryId: number, managerId: number): Promise<void> {\n return this.post(`/internal/clients/${clientId}/price/categories/${categoryId}/manager`, { manager_id: managerId });\n }\n\n /**\n * Удаляет менеджера для указанной категории продуктов клиента.\n *\n * @param clientId Идентификатор клиента.\n * @param categoryId Идентификатор категории товаров.\n *\n * @see /doc/api/internal#/operations/api_internal_client_price_categories_manager_remove\n */\n public removeCategoryManager(clientId: number, categoryId: number): Promise<void> {\n return this.delete(`/internal/clients/${clientId}/price/categories/${categoryId}/manager`);\n }\n\n /**\n * Изменяет стоимость продукта для клиента.\n *\n * @param clientId Идентификатор клиента.\n * @param productId Идентификатор продукта.\n * @param data Данные для изменения цены.\n *\n * @see /doc/api/internal#/operations/api_internal_client_price_products_update\n */\n public updateProductPrice(clientId: number, productId: number, data: IPriceUpdateData): Promise<IClientProduct> {\n return this.patch<IClientProduct>(\n `/internal/clients/${clientId}/price/products/${productId}`,\n {\n price_coefficient_id: data.coefficient?.id,\n increase_percent: data.value,\n },\n (response) => new ClientProduct(response.data)\n );\n }\n\n /**\n * Удаляет удаляет клиентскую цену на продукт.\n *\n * @param clientId Идентификатор клиента.\n * @param productId Идентификатор продукта.\n *\n * @see /doc/api/internal#/operations/api_internal_client_price_products_remove\n */\n public removeProductPrice(clientId: number, productId: number): Promise<IClientProduct> {\n return this.delete<IClientProduct>(`/internal/clients/${clientId}/price/products/${productId}`, (response) => new ClientProduct(response.data));\n }\n\n /**\n * Добавляет указанный продукт в список товаров для дополнительных продаж.\n *\n * @param clientId Идентификатор клиента.\n * @param productId Идентификатор продукта.\n *\n * @see /doc/api/internal#/operations/api_internal_client_price_products_required_mark\n */\n public markProductRequired(clientId: number, productId: number): Promise<void> {\n return this.post(`/internal/clients/${clientId}/price/products/${productId}/required`);\n }\n\n /**\n * Удаляет указанный продукт из списка товаров для дополнительных продаж.\n *\n * @param clientId Идентификатор клиента.\n * @param productId Идентификатор продукта.\n *\n * @see /doc/api/internal#/operations/api_internal_client_price_products_required_unmark\n */\n public unmarkProductRequired(clientId: number, productId: number): Promise<void> {\n return this.delete(`/internal/clients/${clientId}/price/products/${productId}/required`);\n }\n\n /**\n * Возвращает содержимое коммерческого предложения в формате HTML.\n *\n * @param clientId Идентификатор клиента.\n * @param params Параметры коммерческого предложения.\n *\n * @see /doc/api/internal#/operations/api_internal_client_price_commercial_offer_view\n */\n public getCommercialOfferHtml(clientId: number, params?: ICommercialOfferParams): Promise<Blob> {\n return this.get<Blob>(`/internal/clients/${clientId}/price/commercial-offer/view`, params, (response) => new Blob([response.data], { type: 'text/html' }));\n }\n\n /**\n * Возвращает файл коммерческого предложения в формате PDF.\n *\n * @param clientId Идентификатор клиента.\n * @param params Параметры коммерческого предложения.\n *\n * @see /doc/api/internal#/operations/api_internal_client_price_commercial_offer_download\n */\n public getCommercialOfferPdf(clientId: number, params?: ICommercialOfferParams): Promise<Blob> {\n return this.getBlob<Blob>(\n `/internal/clients/${clientId}/price/commercial-offer/download`,\n params,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (response) => new Blob([response.request.response], { type: 'application/pdf' })\n );\n }\n\n /**\n * Отправляет PDF файл коммерческого предложения на электронную почту.\n *\n * @param clientId Идентификатор клиента.\n * @param data Данные для отправки коммерческого предложения.\n *\n * @see /doc/api/internal#/operations/api_internal_client_price_commercial_offer_send\n */\n public sendCommercialOffer(clientId: number, data: ICommercialOffer): Promise<void> {\n return this.post(`/internal/clients/${clientId}/price/commercial-offer/send`, data);\n }\n}\n","import { PriceTemplateClient } from '@sc/catalog/classes';\nimport { IPriceTemplateClient, IPriceTemplateClientUpdateData } from '@sc/catalog/interfaces';\nimport { AppConfigProvider } from '@sc/config/providers/app-config-provider';\nimport { HttpRequester } from '@sc/http/classes/http-requester';\nimport { format } from 'date-fns';\n\n/**\n * Предоставляет механизмы получения/управления шаблонами прайс-листа клиента.\n */\nexport class ClientPriceTemplateProvider extends HttpRequester {\n /**\n * Возвращает список шаблонов прайс-листа привязанных к клиенту.\n *\n * @param clientId Идентификатор клиента.\n *\n * @see /doc/api/internal#/operations/api_internal_client_price_template_get_list\n */\n public getTemplateList(clientId: number): Promise<IPriceTemplateClient[]> {\n return this.get<IPriceTemplateClient[]>(`/internal/clients/${clientId}/price/templates`, {}, (response) =>\n response.data.map((template) => new PriceTemplateClient(template))\n );\n }\n\n /**\n * Возвращает действующий шаблон прайс листа привязанный к клиенту.\n *\n * @param clientId Идентификатор клиента.\n *\n * @see /doc/api/internal#/operations/api_internal_client_price_template_get_active\n */\n public getActiveTemplate(clientId: number): Promise<IPriceTemplateClient> {\n return this.get<IPriceTemplateClient>(`/internal/clients/${clientId}/price/templates/active`, {}, (response) => new PriceTemplateClient(response.data), true);\n }\n\n /**\n * Добавляет связь между клиентом и шаблоном прайс-листа.\n *\n * @param clientId Идентификатор клиента.\n * @param priceTemplateId Идентификатор шаблона прайс-листа.\n * @param data Данные для создания связи.\n *\n * @see /doc/api/internal#/operations/api_internal_client_price_template_attach\n */\n public attachTemplate(clientId: number, priceTemplateId: number, data?: IPriceTemplateClientUpdateData): Promise<IPriceTemplateClient> {\n const apiDateFormat = AppConfigProvider.getConfig().dateFormats.api;\n\n return this.post<IPriceTemplateClient>(\n `/internal/clients/${clientId}/price/templates/${priceTemplateId}`,\n data && {\n startAt: data.startAt && format(data.startAt, apiDateFormat),\n endAt: data.endAt && format(data.endAt, apiDateFormat),\n },\n (response) => new PriceTemplateClient(response.data),\n {},\n true\n );\n }\n\n /**\n * Применяет шаблон прайс листа к клиенту.\n *\n * @param clientId Идентификатор клиента.\n * @param priceTemplateId Идентификатор шаблона прайс-листа.\n *\n * @see /doc/api/internal#/operations/api_internal_client_price_template_apply\n */\n public applyTemplate(clientId: number, priceTemplateId: number): Promise<void> {\n return this.post(`/internal/clients/${clientId}/price/templates/${priceTemplateId}/apply`, {}, undefined, {}, true);\n }\n\n /**\n * Изменяет связь между клиентом и шаблоном прайс-листа.\n *\n * @param clientId Идентификатор клиента.\n * @param priceTemplateId Идентификатор шаблона прайс-листа.\n * @param priceTemplateClientId Идентификатор связи клиента с шаблоном прайс-листа.\n * @param data Данные для изменения связи.\n *\n * @see /doc/api/internal#/operations/api_internal_client_price_template_change\n */\n public changeTemplate(clientId: number, priceTemplateId: number, priceTemplateClientId: number, data?: IPriceTemplateClientUpdateData): Promise<IPriceTemplateClient> {\n const apiDateFormat = AppConfigProvider.getConfig().dateFormats.api;\n\n return this.patch<IPriceTemplateClient>(\n `/internal/clients/${clientId}/price/templates/${priceTemplateId}/${priceTemplateClientId}`,\n data && {\n startAt: data.startAt && format(data.startAt, apiDateFormat),\n endAt: data.endAt && format(data.endAt, apiDateFormat),\n },\n (response) => new PriceTemplateClient(response.data)\n );\n }\n\n /**\n * Удаляет связь между клиентом и шаблоном прайс-листа.\n *\n * @param clientId Идентификатор клиента.\n * @param priceTemplateId Идентификатор шаблона прайс-листа.\n * @param priceTemplateClientId Идентификатор связи клиента с шаблоном прайс-листа.\n *\n * @see /doc/api/internal#/operations/api_internal_client_price_template_detach\n */\n public detachTemplate(clientId: number, priceTemplateId: number, priceTemplateClientId: number): Promise<void> {\n return this.delete(`/internal/clients/${clientId}/price/templates/${priceTemplateId}/${priceTemplateClientId}`);\n }\n}\n","import { Category } from '@sc/catalog/classes/category';\nimport { Product } from '@sc/catalog/classes/product';\nimport { ProductPriceCoefficient } from '@sc/catalog/classes/product-price-coefficient';\nimport { ICategory } from '@sc/catalog/interfaces/i-category';\nimport { IProduct } from '@sc/catalog/interfaces/i-product';\nimport { IProductPriceCoefficient } from '@sc/catalog/interfaces/i-product-price-coefficient';\nimport { HttpRequester } from '@sc/http/classes/http-requester';\nimport { forEach, map } from 'lodash-es';\n\n/**\n * Предоставляет механизмы получения/управления данными о категориях продуктов.\n */\nexport class ProductCategoryDataProvider extends HttpRequester {\n /**\n * Возвращает список данных о корневых категориях.\n *\n * @param showHidden Признак необходимости также возвращать данные о скрытых категориях.\n *\n * @see /doc/api/internal#/Каталог/api_internal_catalog_categories_get_list\n */\n public getRootCategoriesList(showHidden: boolean = false): Promise<ICategory[]> {\n return this.get<ICategory[]>(\n `/internal/catalog/categories`,\n {\n showHidden: showHidden,\n },\n (response) => response.data.map((c) => new Category(c))\n );\n }\n\n /**\n * Возвращает данные об указанной категории.\n *\n * @param categoryID Идентификатор категории для которой нужно получить данные.\n * @param showHidden Признак необходимости также возвращать данные о скрытых категориях.\n * @param withNestedCategories Признак необходимости также вернуть список с данными о вложенных категориях.\n *\n * @see /doc/api/internal#/Каталог/api_internal_catalog_categories_get\n */\n public getCategoryData(categoryID: number, showHidden: boolean = false, withNestedCategories: boolean = false): Promise<ICategory> {\n return this.get<ICategory>(\n `/internal/catalog/categories/${categoryID}`,\n {\n showHidden: showHidden,\n withNestedCategories: withNestedCategories,\n },\n (response) => new Category(response.data)\n );\n }\n\n /**\n * Возвращает публичные данные об указанной категории продуктов.\n *\n * @param categoryID Идентификатор категории продуктов.\n */\n public getPublicCategoryData(categoryID: number): Promise<ICategory> {\n return this.get<ICategory>(`/public/catalog/categories/${categoryID}`, {}, (response) => new Category(response.data));\n }\n\n /**\n * Возвращает список продуктов категории.\n *\n * @param categoryID Идентификатор категории для которой нужно получить список продуктов.\n * @param withPriceCoefficients Признак того, что необходимо включить в ответ данные о коэффициентах цен на продукты.\n * @param showHidden Признак необходимости также возвращать данные о скрытых продуктах.\n *\n * @see /doc/api/internal#/Каталог/api_internal_catalog_categories_products_get\n */\n public getCategoryProductsList(categoryID: number, withPriceCoefficients: boolean = true, showHidden: boolean = false): Promise<IProduct[]> {\n return this.get<IProduct[]>(\n `/internal/catalog/categories/${categoryID}/products`,\n {\n showHidden: showHidden,\n withPriceCoefficients: withPriceCoefficients,\n },\n (response) => map(response.data, (p) => new Product(p))\n );\n }\n\n /**\n * Возвращает данные о коэффициентах цен на продукты категории.\n *\n * @param categoryID Идентификатор категории для которой нужно получить список коэффициентов.\n *\n * @see /doc/api/internal#/Каталог/api_internal_catalog_categories_products_coefficients_get\n */\n public getCategoryProductsCoefficients(categoryID: number): Promise<Record<number, IProductPriceCoefficient[]>> {\n return this.get<Record<number, IProductPriceCoefficient[]>>(`/internal/catalog/categories/${categoryID}/products/coefficients`, {}, (response) => {\n const { data } = response;\n forEach(data, (pcs) => pcs.map((pc) => new ProductPriceCoefficient(pc)));\n return data;\n });\n }\n\n /**\n * Выполняет публичный поиск данных о категориях продуктов по терму.\n *\n * @param term Терм поиска.\n * @param limit Количество возвращаемых записей.\n */\n public publicSimpleSearch(term: string, limit: number = 10): Promise<ICategory[]> {\n return new Promise((resolve, reject) => {\n this.get<{ categories: ICategory[] }>(`/public/catalog/search/simple?limit=${limit}&term=${term}`)\n .then((response) => {\n resolve(response.categories.map((value) => new Category(value)));\n })\n .catch((error) => {\n reject(error);\n });\n });\n }\n}\n","import { Product } from '@sc/catalog/classes/product';\nimport { ProductPriceCoefficient } from '@sc/catalog/classes/product-price-coefficient';\nimport { IProduct } from '@sc/catalog/interfaces/i-product';\nimport { IProductPriceCoefficient } from '@sc/catalog/interfaces/i-product-price-coefficient';\nimport { HttpRequester } from '@sc/http/classes/http-requester';\nimport { map } from 'lodash-es';\n\n/**\n * Предоставляет механизмы получения/управления данными о продуктах.\n */\nexport class ProductDataProvider extends HttpRequester {\n /**\n * Возвращает данные об указанном продукте.\n *\n * @param productId Идентификатор продукта о котором нужно получить данные.\n * @param withPriceCoefficients Признак того, что необходимо включить в ответ данные о коэффициентах цен на продукты.\n *\n * @see /doc/api/internal#/Каталог/api_internal_catalog_products_get\n */\n public getProductData(productId: number, withPriceCoefficients: boolean = false): Promise<IProduct> {\n return this.get<IProduct>(`/internal/catalog/products/${productId}`, { withPriceCoefficients: withPriceCoefficients }, (response) => new Product(response.data));\n }\n\n /**\n * Возвращает публичные данные об указанном продукте.\n *\n * @param productId Идентификатор продукта.\n */\n public getPublicProductData(productId: number): Promise<IProduct> {\n return this.get<IProduct>(`/public/catalog/products/${productId}`, {}, (response) => new Product(response.data));\n }\n\n /**\n * Возвращает данные о коэффициентах цен для указанного продукта.\n *\n * @param productId Идентификатор продукта для которого нужно получить данные о коэффициентах цен.\n *\n * @see /doc/api/internal#/Каталог/api_internal_catalog_products_coefficients_get\n */\n public getProductPriceCoefficients(productId: number): Promise<IProductPriceCoefficient[]> {\n return this.get<IProductPriceCoefficient[]>(`/internal/catalog/products/${productId}/coefficients`, {}, (response) =>\n map(response.data, (rec) => new ProductPriceCoefficient(rec))\n );\n }\n\n /**\n * Выполняет публичный поиск данных о продуктах по терму.\n *\n * @param term Терм поиска.\n * @param limit Количество возвращаемых записей.\n */\n public publicSimpleSearch(term: string, limit: number = 10): Promise<IProduct[]> {\n return new Promise((resolve, reject) => {\n this.get<{ products: IProduct[] }>(`/public/catalog/search/simple?limit=${limit}&term=${term}`)\n .then((response) => {\n resolve(response.products.map((value) => new Product(value)));\n })\n .catch((error) => {\n reject(error);\n });\n });\n }\n}\n","import { ClientCategory } from '@sc/catalog/classes/client-category';\nimport { ClientProduct } from '@sc/catalog/classes/client-product';\nimport { IClientCategory } from '@sc/catalog/interfaces/i-client-category';\nimport { IClientProduct } from '@sc/catalog/interfaces/i-client-product';\nimport { HttpRequester } from '@sc/http/classes/http-requester';\nimport { map } from 'lodash-es';\n\n/**\n * Предоставляет механизмы получения/управления данными о категориях продуктов для клиентов.\n */\nexport class ClientProductCategoryDataProvider extends HttpRequester {\n /**\n * Возвращает список данных о корневых категориях указанного клиента.\n *\n * @param clientId Идентификатор клиента для которого необходимо вернуть список корневых категорий.\n * @param showHidden Признак необходимости также возвращать данные о скрытых категориях.\n *\n * @see /doc/api/internal#/Каталог/api_internal_catalog_categories_get_list\n */\n public getRootCategoriesList(clientId: number, showHidden: boolean = false): Promise<IClientCategory[]> {\n return this.get<IClientCategory[]>(\n `/internal/catalog/categories`,\n {\n clientId: clientId,\n showHidden: showHidden,\n },\n (response) => response.data.map((c) => new ClientCategory(c))\n );\n }\n\n /**\n * Возвращает данные об указанной категории клиента.\n *\n * @param clientId Идентификатор клиента для которого необходимо получить данные категории.\n * @param categoryID Идентификатор категории для которой нужно получить данные.\n * @param showHidden Признак необходимости также возвращать данные о скрытых категориях.\n * @param withNestedCategories Признак необходимости также вернуть список с данными о вложенных категориях.\n *\n * @see /doc/api/internal#/Каталог/api_internal_catalog_categories_get\n */\n public getCategoryData(clientId: number, categoryID: number, showHidden: boolean = false, withNestedCategories: boolean = false): Promise<IClientCategory> {\n return this.get<IClientCategory>(\n `/internal/catalog/categories/${categoryID}`,\n {\n clientId: clientId,\n showHidden: showHidden,\n withNestedCategories: withNestedCategories,\n },\n (response) => new ClientCategory(response.data)\n );\n }\n\n /**\n * Возвращает список продуктов категории указанного клиента.\n *\n * @param clientId Идентификатор клиента для которого необходимо получить список продуктов.\n * @param categoryID Идентификатор категории для которой нужно получить список продуктов.\n * @param withPriceCoefficients Признак того, что необходимо включить в ответ данные о коэффициентах цен на продукты.\n * @param showHidden Признак необходимости также возвращать данные о скрытых продуктах.\n *\n * @see /doc/api/internal#/Каталог/api_internal_catalog_categories_products_get\n */\n public getCategoryProductsList(clientId: number, categoryID: number, withPriceCoefficients: boolean = true, showHidden: boolean = false): Promise<IClientProduct[]> {\n return this.get<IClientProduct[]>(\n `/internal/catalog/categories/${categoryID}/products`,\n {\n client_id: clientId,\n showHidden: showHidden,\n withPriceCoefficients: withPriceCoefficients,\n },\n (response) => map(response.data, (p) => new ClientProduct(p))\n );\n }\n}\n","import { ClientProduct } from '@sc/catalog/classes/client-product';\nimport { IClientProduct } from '@sc/catalog/interfaces/i-client-product';\nimport { HttpRequester } from '@sc/http/classes/http-requester';\n\n/**\n * Предоставляет механизмы получения/управления данными о продуктах для клиентов.\n */\nexport class ClientProductDataProvider extends HttpRequester {\n /**\n * Возвращает данные об указанном продукте для указанного клиента.\n *\n * @param productId Идентификатор продукта о котором нужно получить данные.\n * @param clientId Идентификатор клиента.\n * @param withPriceCoefficients Признак того, что необходимо включить в ответ данные о коэффициентах цен на продукты.\n *\n * @see /doc/api/internal#/Каталог/api_internal_catalog_products_get\n */\n public getProductData(productId: number, clientId: number, withPriceCoefficients: boolean = false): Promise<IClientProduct> {\n return this.get<IClientProduct>(\n `/internal/catalog/products/${productId}`,\n {\n clientId: clientId,\n withPriceCoefficients: withPriceCoefficients,\n },\n (response) => new ClientProduct(response.data)\n );\n }\n}\n","/* eslint-disable no-unused-vars, no-shadow */\n\n/**\n * Перечисление допустимых значений действий сравнения для фильтров.\n */\nexport enum FilterOpEnum {\n /**\n * Начинается с, эквивалентно `field LIKE \"value%\"`.\n */\n BeginWith = 'bw',\n\n /**\n * Содержит, эквивалентно `field LIKE \"%value%\"`.\n */\n Contains = 'cn',\n\n /**\n * Индивидуальный фильтр.\n */\n Custom = 'custom',\n\n /**\n * Заканчивается на, эквивалентно `field LIKE \"%value\"`.\n */\n EndsWith = 'ew',\n\n /**\n * Равно, эквивалентно `field = value`.\n */\n Equals = 'eq',\n\n /**\n * Больше или равно, эквивалентно `field >= value`.\n */\n GreaterOrEqual = 'ge',\n\n /**\n * Больше, эквивалентно `field > value`.\n */\n GreaterThan = 'gt',\n\n /**\n * Находится в списке, эквивалентно `field IN (value1, value2)`.\n */\n InList = 'in',\n\n /**\n * Меньше или равно, эквивалентно `field <= value`.\n */\n LessOrEqual = 'le',\n\n /**\n * Меньше, эквивалентно `field < value`.\n */\n LessThan = 'lt',\n\n /**\n * Не начинается с, эквивалентно `field NOT LIKE \"value%\"`.\n */\n NotBeginWith = 'bn',\n\n /**\n * Не содержит, эквивалентно `field NOT LIKE \"%value%\"`.\n */\n NotContains = 'nc',\n\n /**\n * Не заканчивается на, эквивалентно `field NOT LIKE \"%value\"`.\n */\n NotEndsWith = 'en',\n\n /**\n * Не равно, эквивалентно `field <> value`.\n */\n NotEqual = 'ne',\n\n /**\n * Не находится в списке, эквивалентно `field NOT IN (value1, value2)`.\n */\n NotInList = 'ni',\n\n /**\n * Не равно NULL, эквивалентно `field IS NOT NULL`.\n */\n NotNull = 'nn',\n\n /**\n * Равно NULL, эквивалентно `field IS NULL`.\n */\n Null = 'nu',\n}\n","import { AppConfigProvider } from '@sc/config';\nimport { FilterOpEnum } from '@sc/data-table/enums/filter-op-enum';\nimport { IFilterItem } from '@sc/data-table/interfaces/i-filter-item';\nimport { format } from 'date-fns';\nimport { isDate } from 'lodash-es';\n\n/**\n * Данные о фильтре по некоторому полю.\n */\nexport class FilterItem implements IFilterItem {\n /**\n * Поле, по которому производится поиск.\n */\n public field: string;\n\n /**\n * Операция сравнения.\n */\n public op: FilterOpEnum;\n\n /**\n * Значение с которым сравнивается поле.\n */\n public value: string | boolean | number | Date;\n\n /**\n * Инициализирует экземпляр класса {@link FilterItem}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IFilterItem>) {\n this.field = data?.field ?? '';\n this.op = data?.op ?? FilterOpEnum.Equals;\n this.value = data?.value ?? '';\n }\n\n /**\n * Преобразует фильтр в примитивное представление для API.\n *\n * @returns Примитивное представление фильтра.\n */\n public toPrimitive(): Record<string, string | boolean | number> {\n const result: Record<string, string | boolean | number> = {\n field: this.field,\n op: this.op,\n };\n\n result.value = isDate(this.value) ? format(this.value, AppConfigProvider.getConfig().dateFormats.api) : this.value;\n\n return result;\n }\n}\n","import { FilterItem } from '@sc/data-table/classes/filter-item';\nimport { IFilterGroup } from '@sc/data-table/interfaces/i-filter-group';\nimport { IFilterItem } from '@sc/data-table/interfaces/i-filter-item';\nimport { isFunction } from 'lodash-es';\n\n/**\n * Данные о группе фильтров.\n */\nexport class FilterGroup implements IFilterGroup {\n /**\n * Условие объединения фильтров.\n */\n public groupOp: 'and' | 'or';\n\n /**\n * Список фильтров.\n */\n public filters: IFilterItem[];\n\n /**\n * Список вложенных групп фильтров.\n */\n public groups: IFilterGroup[];\n\n /**\n * Инициализирует экземпляр класса {@link FilterGroup}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IFilterGroup>) {\n this.groupOp = data?.groupOp ?? 'and';\n this.filters = data?.filters?.map((filter) => new FilterItem(filter)) ?? [];\n this.groups = data?.groups?.map((group) => new FilterGroup(group)) ?? [];\n }\n\n /**\n * Преобразует группу фильтров в примитивное представление для API.\n *\n * @returns Примитивное представление группы фильтров.\n */\n public toPrimitive(): Record<string, unknown> {\n return {\n groupOp: this.groupOp,\n filters: this.filters.map((filter) => {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n if (filter instanceof FilterItem && isFunction(filter.toPrimitive)) {\n return filter.toPrimitive();\n }\n\n return filter;\n }),\n groups: this.groups.map((group) => {\n if (group instanceof FilterGroup) {\n return group.toPrimitive();\n }\n\n return group;\n }),\n };\n }\n}\n","import { FilterGroup } from '@sc/data-table/classes/filter-group';\nimport { IFilterGroup } from '@sc/data-table/interfaces/i-filter-group';\nimport { IPaginationRequestParams } from '@sc/data-table/interfaces/i-pagination-request-params';\nimport { ISortRequestParams } from '@sc/data-table/interfaces/i-sort-request-params';\nimport { HttpRequester } from '@sc/http/classes/http-requester';\nimport { IPaginatedResponse } from '@sc/pagination/interfaces';\nimport { AxiosResponse } from 'axios';\nimport { isArray, isEmpty } from 'lodash-es';\n\n/**\n * Базовый класс для предоставления механизмов пагинации.\n */\nexport abstract class BasePaginationProvider extends HttpRequester {\n /**\n * Получает пагинированный список данных.\n *\n * @param url URL запроса.\n * @param filters Параметры фильтрации.\n * @param sortParams Параметры сортировки.\n * @param paginationParams Параметры пагинации.\n * @param extraParams Дополнительные параметры запроса.\n * @param successHandler Обработчик успешного выполнения запроса.\n * @param disableDefaultNotificationErrorResponseHandler Признак отключения стандартного обработчика ошибок.\n */\n protected getPaginated<D, T extends D = D>(\n url: string,\n filters?: IFilterGroup,\n sortParams?: ISortRequestParams[] | ISortRequestParams,\n paginationParams?: IPaginationRequestParams,\n extraParams?: object,\n successHandler?: (response: AxiosResponse<IPaginatedResponse<D>>) => IPaginatedResponse<T>,\n disableDefaultNotificationErrorResponseHandler?: boolean\n ): Promise<IPaginatedResponse<T>> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let requestParams: Record<string, any> = {\n page: paginationParams?.page ?? 1,\n perPage: paginationParams?.pageSize ?? 10,\n };\n\n if (filters) {\n requestParams.filters = JSON.stringify((filters instanceof FilterGroup ? filters : new FilterGroup(filters)).toPrimitive());\n }\n\n if (!isEmpty(sortParams)) {\n requestParams.sort = isArray(sortParams) ? sortParams : [sortParams];\n }\n\n if (extraParams) {\n requestParams = { ...requestParams, ...extraParams };\n }\n\n return this.get<IPaginatedResponse<T>>(url, requestParams, successHandler, disableDefaultNotificationErrorResponseHandler);\n }\n}\n","import { PriceTemplate, PriceTemplateCategory, PriceTemplateClient, PriceTemplateProduct } from '@sc/catalog/classes';\nimport { IPriceTemplate, IPriceTemplateCategory, IPriceTemplateClient, IPriceTemplateCreateData, IPriceTemplateProduct, IPriceUpdateData } from '@sc/catalog/interfaces';\nimport { IFilterGroup, IPaginationRequestParams, ISortRequestParams } from '@sc/data-table';\nimport { IPaginatedResponse } from '@sc/pagination/interfaces/i-paginated-response';\nimport { BasePaginationProvider } from '@sc/pagination/providers/base-pagination-provider';\nimport { IFieldValidationResultData } from '@sc/validation/interfaces';\n\n/**\n * Предоставляет механизмы получения/управления шаблонами прайс-листа.\n */\nexport class PriceTemplateProvider extends BasePaginationProvider {\n /**\n * Возвращает список шаблонов прайс-листа.\n *\n * @param filters Параметры фильтрации данных.\n * @param sortParams Параметры сортировки.\n * @param paginationParams Параметры пагинации.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_template_get_list\n */\n public getTemplateList(\n filters?: IFilterGroup,\n sortParams?: ISortRequestParams[] | ISortRequestParams,\n paginationParams?: IPaginationRequestParams\n ): Promise<IPaginatedResponse<IPriceTemplate>> {\n return this.getPaginated<IPriceTemplate>('/internal/price/templates', filters, sortParams, paginationParams, {}, (response) => {\n const result = { ...response.data };\n\n result.data = result.data.map((propertyData: IPriceTemplate) => new PriceTemplate(propertyData));\n\n return result;\n });\n }\n\n /**\n * Создание нового шаблона прайс-листа.\n *\n * @param data Данные для создания шаблона прайс-листа.\n * @param validationFieldResultData Список полей, для которых необходимо\n * установить данные об ошибках валидации\n * в случае ошибок в запросах.\n * @see /doc/api/internal#/operations/api_internal_catalog_price_template_create\n */\n public createTemplate(data: IPriceTemplateCreateData, validationFieldResultData: Record<string, IFieldValidationResultData> = {}): Promise<IPriceTemplate> {\n return this.post<IPriceTemplate>('/internal/price/templates', data, (response) => new PriceTemplate(response.data), validationFieldResultData);\n }\n\n /**\n * Возвращает данные о шаблоне прайс-листа.\n *\n * @param priceTemplateId Идентификатор шаблона прайс-листа.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_template_get\n */\n public getTemplate(priceTemplateId: number): Promise<IPriceTemplate> {\n return this.get<IPriceTemplate>(`/internal/price/templates/${priceTemplateId}`, {}, (response) => new PriceTemplate(response.data));\n }\n\n /**\n * Изменяет данные о шаблоне прайс-листа.\n *\n * @param priceTemplateId Идентификатор шаблона прайс-листа.\n * @param data Данные для изменения шаблона прайс-листа.\n * @param validationFieldResultData Список полей, для которых необходимо\n * установить данные об ошибках валидации\n * в случае ошибок в запросах.\n * @see /doc/api/internal#/operations/api_internal_catalog_price_template_update\n */\n public updateTemplate(\n priceTemplateId: number,\n data: IPriceTemplateCreateData,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<IPriceTemplate> {\n return this.patch<IPriceTemplate>(`/internal/price/templates/${priceTemplateId}`, data, (response) => new PriceTemplate(response.data), validationFieldResultData);\n }\n\n /**\n * Удаляет данные о шаблоне прайс-листа.\n *\n * @param priceTemplateId Идентификатор шаблона прайс-листа.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_template_delete\n */\n public removeTemplate(priceTemplateId: number): Promise<void> {\n return this.delete(`/internal/price/templates/${priceTemplateId}`);\n }\n\n /**\n * Возвращает список цен шаблона прайс-листа, установленных на продукты.\n *\n * @param priceTemplateId Идентификатор шаблона прайс-листа.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_template_product_get_list\n */\n public getProductTemplatePrices(priceTemplateId: number): Promise<IPriceTemplateProduct[]> {\n return this.get<IPriceTemplateProduct[]>(`/internal/price/templates/${priceTemplateId}/products`, {}, (response) =>\n response.data.map((product) => new PriceTemplateProduct(product))\n );\n }\n\n /**\n * Возвращает данные о цене на продукт в шаблоне прайс-листа.\n *\n * @param priceTemplateId Идентификатор шаблона прайс-листа.\n * @param productId Идентификатор продукта.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_template_product_get\n */\n public getProductTemplatePrice(priceTemplateId: number, productId: number): Promise<IPriceTemplateProduct> {\n return this.get<IPriceTemplateProduct>(`/internal/price/templates/${priceTemplateId}/products/${productId}`, {}, (response) => new PriceTemplateProduct(response.data));\n }\n\n /**\n * Сохраняет цену на продукт в шаблоне прайс-листа.\n *\n * @param priceTemplateId Идентификатор шаблона прайс-листа.\n * @param productId Идентификатор продукта.\n * @param data Данные для сохранения цены.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_template_product_save\n */\n public saveProductTemplatePrice(priceTemplateId: number, productId: number, data: IPriceUpdateData): Promise<IPriceTemplateProduct> {\n return this.post<IPriceTemplateProduct>(\n `/internal/price/templates/${priceTemplateId}/products/${productId}`,\n {\n price_coefficient_id: data.coefficient?.id,\n increase_percent: data.value,\n },\n (response) => new PriceTemplateProduct(response.data)\n );\n }\n\n /**\n * Удаляет данные о цене на продукт в шаблоне прайс-листа.\n *\n * @param priceTemplateId Идентификатор шаблона прайс-листа.\n * @param productId Идентификатор продукта.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_template_product_delete\n */\n public deleteProductTemplatePrice(priceTemplateId: number, productId: number): Promise<void> {\n return this.delete(`/internal/price/templates/${priceTemplateId}/products/${productId}`);\n }\n\n /**\n * Возвращает список цен шаблона прайс-листа, установленных на категории.\n *\n * @param priceTemplateId Идентификатор шаблона прайс-листа.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_template_category_get_list\n */\n public getCategoryTemplatePrices(priceTemplateId: number): Promise<IPriceTemplateCategory[]> {\n return this.get<IPriceTemplateCategory[]>(`/internal/price/templates/${priceTemplateId}/categories`, {}, (response) =>\n response.data.map((category) => new PriceTemplateCategory(category))\n );\n }\n\n /**\n * Возвращает данные о цене на категорию продуктов в шаблоне прайс-листа.\n *\n * @param priceTemplateId Идентификатор шаблона прайс-листа.\n * @param productCategoryId Идентификатор категории продуктов.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_template_category_get\n */\n public getCategoryTemplatePrice(priceTemplateId: number, productCategoryId: number): Promise<IPriceTemplateCategory> {\n return this.get<IPriceTemplateCategory>(\n `/internal/price/templates/${priceTemplateId}/categories/${productCategoryId}`,\n {},\n (response) => new PriceTemplateCategory(response.data)\n );\n }\n\n /**\n * Сохраняет цену на категорию продуктов в шаблоне прайс-листа.\n *\n * @param priceTemplateId Идентификатор шаблона прайс-листа.\n * @param productCategoryId Идентификатор категории продуктов.\n * @param data Данные для сохранения цены.\n * @param recursively Признак того, что действие необходимо осуществить\n * рекурсивно для всех дочерних категорий.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_template_category_save\n */\n public saveCategoryTemplatePrice(priceTemplateId: number, productCategoryId: number, data: IPriceUpdateData, recursively: boolean = false): Promise<IPriceTemplateCategory> {\n return this.request<IPriceTemplateCategory>(\n {\n method: 'POST',\n url: `/internal/price/templates/${priceTemplateId}/categories/${productCategoryId}`,\n data: {\n price_coefficient_id: data.coefficient?.id,\n increase_percent: data.value,\n },\n params: recursively ? { recursively: true } : {},\n },\n (response) => new PriceTemplateCategory(response.data)\n );\n }\n\n /**\n * Удаляет данные о цене на категорию продуктов в шаблоне прайс-листа.\n *\n * @param priceTemplateId Идентификатор шаблона прайс-листа.\n * @param productCategoryId Идентификатор категории продуктов.\n * @param recursively Признак того, что действие необходимо осуществить\n * рекурсивно для всех дочерних категорий.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_template_category_delete\n */\n public deleteCategoryTemplatePrice(priceTemplateId: number, productCategoryId: number, recursively: boolean = false): Promise<void> {\n return this.request<never>({\n method: 'DELETE',\n url: `/internal/price/templates/${priceTemplateId}/categories/${productCategoryId}`,\n params: recursively ? { recursively: true } : {},\n });\n }\n\n /**\n * Возвращает список клиентов, привязанных к шаблону прайс-листа.\n *\n * @param priceTemplateId Идентификатор шаблона прайс-листа.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_template_clients_get_list\n */\n public getTemplateClients(priceTemplateId: number): Promise<IPriceTemplateClient[]> {\n return this.get<IPriceTemplateClient[]>(`/internal/price/templates/${priceTemplateId}/clients`, {}, (response) =>\n response.data.map((client) => new PriceTemplateClient(client))\n );\n }\n}\n","import { CategoryPricingRule } from '@sc/catalog/classes/category-pricing-rule';\nimport { PricingRole } from '@sc/catalog/classes/pricing-role';\nimport { ICategoryPricingRule } from '@sc/catalog/interfaces/i-category-pricing-rule';\nimport { ICategoryPricingRuleUpdateData } from '@sc/catalog/interfaces/i-category-pricing-rule-update-data';\nimport { IPricingRole } from '@sc/catalog/interfaces/i-pricing-role';\nimport { IPricingRoleCreateData } from '@sc/catalog/interfaces/i-pricing-role-create-data';\nimport { HttpRequester } from '@sc/http/classes/http-requester';\n\n/**\n * Предоставляет механизмы получения/управления данными о ролях ценообразования.\n */\nexport class PricingRoleProvider extends HttpRequester {\n /**\n * Возвращает список ролей ценообразования.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_roles_get_list\n */\n public getRoles(): Promise<IPricingRole[]> {\n return this.get<IPricingRole[]>('/internal/price/roles', {}, (response) => response.data.map((role) => new PricingRole(role)));\n }\n\n /**\n * Добавляет новую роль ценообразования.\n *\n * @param data Данные для создания роли ценообразования.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_roles_create\n */\n public createRole(data: IPricingRoleCreateData): Promise<IPricingRole> {\n return this.post<IPricingRole>('/internal/price/roles', data, (response) => new PricingRole(response.data));\n }\n\n /**\n * Возвращает данные роли ценообразования.\n *\n * @param id Идентификатор роли ценообразования.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_roles_get\n */\n public getRole(id: number): Promise<IPricingRole> {\n return this.get<IPricingRole>(`/internal/price/roles/${id}`, {}, (response) => new PricingRole(response.data));\n }\n\n /**\n * Обновляет данные роли ценообразования.\n *\n * @param id Идентификатор роли ценообразования.\n * @param data Данные для обновления роли ценообразования.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_roles_update\n */\n public updateRole(id: number, data: IPricingRoleCreateData): Promise<IPricingRole> {\n return this.patch<IPricingRole>(`/internal/price/roles/${id}`, data, (response) => new PricingRole(response.data));\n }\n\n /**\n * Удаляет роль ценообразования.\n *\n * @param id Идентификатор роли ценообразования.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_roles_delete\n */\n public deleteRole(id: number): Promise<void> {\n return this.delete(`/internal/price/roles/${id}`);\n }\n\n /**\n * Возвращает список правил для роли ценообразования по указанной категории.\n *\n * @param categoryId Идентификатор категории.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_roles_category_rules_get\n */\n public getCategoryRules(categoryId: number): Promise<ICategoryPricingRule[]> {\n return this.get<ICategoryPricingRule[]>(`/internal/price/roles/rules/categories/${categoryId}`, {}, (response) =>\n response.data.map((rule) => new CategoryPricingRule(rule))\n );\n }\n\n /**\n * Обновляет правила для роли ценообразования по указанной категории.\n *\n * @param categoryId Идентификатор категории.\n * @param data Данные для обновления правил.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_roles_category_rules_update\n */\n public updateCategoryRules(categoryId: number, data: ICategoryPricingRuleUpdateData): Promise<ICategoryPricingRule[]> {\n return this.patch<ICategoryPricingRule[]>(`/internal/price/roles/rules/categories/${categoryId}`, data, (response) =>\n response.data.map((rec) => new CategoryPricingRule(rec))\n );\n }\n}\n","import { Property } from '@sc/catalog/classes/property';\nimport { PropertyValue } from '@sc/catalog/classes/property-value';\nimport { IDescription, IFileUpdateData, IFileUploadData, IProperty, IPropertyCreateData, IPropertyValue, ISpecification } from '@sc/catalog/interfaces';\nimport { ICatalogItemPropertyFile } from '@sc/catalog/interfaces/i-catalog-item-property-file';\nimport { IFilterGroup } from '@sc/data-table/interfaces/i-filter-group';\nimport { IPaginationRequestParams } from '@sc/data-table/interfaces/i-pagination-request-params';\nimport { ISortRequestParams } from '@sc/data-table/interfaces/i-sort-request-params';\nimport { IPaginatedResponse } from '@sc/pagination/interfaces';\nimport { BasePaginationProvider } from '@sc/pagination/providers/base-pagination-provider';\nimport { IFile } from '@sc/system/interfaces/i-file';\n\n/**\n * Провайдер для работы со свойствами продуктов и категорий.\n */\nexport class PropertiesProvider extends BasePaginationProvider {\n /**\n * Возвращает пагинированный список свойств.\n *\n * @param filters Параметры фильтрации данных.\n * @param sortParams Параметры сортировки.\n * @param paginationParams Параметры пагинации.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_properties_get_list\n */\n public getProperties(\n filters?: IFilterGroup,\n sortParams?: ISortRequestParams[] | ISortRequestParams,\n paginationParams?: IPaginationRequestParams\n ): Promise<IPaginatedResponse<IProperty>> {\n return this.getPaginated<IProperty>('/internal/catalog/properties', filters, sortParams, paginationParams, {}, (response) => {\n const result = { ...response.data };\n\n result.data = result.data.map((propertyData: IProperty) => new Property(propertyData));\n\n return result;\n });\n }\n\n /**\n * Создает новое свойство.\n *\n * @param propertyData Данные свойства.\n * @see /doc/api/internal#/operations/api_internal_catalog_properties_create\n */\n public createProperty(propertyData: IPropertyCreateData): Promise<IProperty> {\n const { typeId, ...rest } = propertyData;\n\n return this.post<IProperty>(\n '/internal/catalog/properties',\n {\n ...rest,\n type: typeId,\n },\n (response) => new Property(response.data)\n );\n }\n\n /**\n * Возвращает свойство по идентификатору.\n *\n * @param propertyId Идентификатор свойства.\n * @see /doc/api/internal#/operations/api_internal_catalog_properties_get\n */\n public getProperty(propertyId: number): Promise<IProperty> {\n return this.get<IProperty>(`/internal/catalog/properties/${propertyId}`, {}, (response) => new Property(response.data));\n }\n\n /**\n * Обновляет существующее свойство.\n *\n * @param propertyId Идентификатор свойства.\n * @param propertyData Данные свойства.\n * @see /doc/api/internal#/operations/api_internal_catalog_properties_update\n */\n public updateProperty(propertyId: number, propertyData: IPropertyCreateData): Promise<IProperty> {\n const { typeId, ...rest } = propertyData;\n return this.patch<IProperty>(\n `/internal/catalog/properties/${propertyId}`,\n {\n ...rest,\n type: typeId,\n },\n (response) => new Property(response.data)\n );\n }\n\n /**\n * Удаляет свойство.\n *\n * @param propertyId Идентификатор свойства.\n * @see /doc/api/internal#/operations/api_internal_catalog_properties_delete\n */\n public deleteProperty(propertyId: number): Promise<void> {\n return this.delete(`/internal/catalog/properties/${propertyId}`);\n }\n\n /**\n * Возвращает список свойств продукта.\n *\n * @param productId Идентификатор продукта.\n * @see /doc/api/internal#/operations/api_internal_catalog_product_properties_get_list\n */\n public getProductProperties(productId: number): Promise<IPropertyValue[]> {\n return this.get<IPropertyValue[]>(`/internal/catalog/products/${productId}/properties`, {}, (response) => response.data.map((value) => new PropertyValue(value)));\n }\n\n /**\n * Возвращает значение свойства продукта.\n *\n * @param productId Идентификатор продукта.\n * @param propertyId Идентификатор свойства.\n * @see /doc/api/internal#/operations/api_internal_catalog_product_properties_get\n */\n public getProductProperty(productId: number, propertyId: number): Promise<IPropertyValue> {\n return this.get<IPropertyValue>(`/internal/catalog/products/${productId}/properties/${propertyId}`, {}, (response) => new PropertyValue(response.data));\n }\n\n /**\n * Обновляет значение свойства продукта.\n *\n * @param productId Идентификатор продукта.\n * @param propertyId Идентификатор свойства.\n * @param value Новое значение свойства.\n * @see /doc/api/internal#/operations/api_internal_catalog_product_properties_update\n */\n public updateProductProperty(productId: number, propertyId: number, value: IPropertyValue['value']): Promise<IPropertyValue> {\n return this.patch<IPropertyValue>(`/internal/catalog/products/${productId}/properties/${propertyId}`, { value }, (response) => new PropertyValue(response.data));\n }\n\n /**\n * Удаляет значение свойства продукта.\n *\n * @param productId Идентификатор продукта.\n * @param propertyId Идентификатор свойства.\n * @see /doc/api/internal#/operations/api_internal_catalog_product_properties_delete\n */\n public deleteProductProperty(productId: number, propertyId: number): Promise<void> {\n return this.delete(`/internal/catalog/products/${productId}/properties/${propertyId}`);\n }\n\n /**\n * Возвращает описание продукта.\n *\n * @param productId Идентификатор продукта.\n * @see /doc/api/internal#/operations/api_internal_catalog_product_description_get\n */\n public getProductDescription(productId: number): Promise<IDescription> {\n return this.get<IDescription>(`/internal/catalog/products/${productId}/properties/description`);\n }\n\n /**\n * Обновляет описание продукта.\n *\n * @param productId Идентификатор продукта.\n * @param text Текст описания в формате HTML.\n * @see /doc/api/internal#/operations/api_internal_catalog_product_description_update\n */\n public updateProductDescription(productId: number, text: string): Promise<undefined> {\n return this.patch(`/internal/catalog/products/${productId}/properties/description`, { text });\n }\n\n /**\n * Удаляет описание продукта.\n *\n * @param productId Идентификатор продукта.\n * @see /doc/api/internal#/operations/api_internal_catalog_product_description_delete\n */\n public deleteProductDescription(productId: number): Promise<void> {\n return this.delete(`/internal/catalog/products/${productId}/properties/description`);\n }\n\n /**\n * Возвращает спецификацию продукта.\n *\n * @param productId Идентификатор продукта.\n * @see /doc/api/internal#/operations/api_internal_catalog_product_specification_get\n */\n public getProductSpecification(productId: number): Promise<ISpecification> {\n return this.get<ISpecification>(`/internal/catalog/products/${productId}/properties/specification`);\n }\n\n /**\n * Обновляет спецификацию продукта.\n *\n * @param productId Идентификатор продукта.\n * @param text Текст спецификации в формате HTML.\n * @see /doc/api/internal#/operations/api_internal_catalog_product_specification_update\n */\n public updateProductSpecification(productId: number, text: string): Promise<void> {\n return this.patch(`/internal/catalog/products/${productId}/properties/specification`, { text });\n }\n\n /**\n * Удаляет спецификацию продукта.\n *\n * @param productId Идентификатор продукта.\n * @see /doc/api/internal#/operations/api_internal_catalog_product_specification_delete\n */\n public deleteProductSpecification(productId: number): Promise<void> {\n return this.delete(`/internal/catalog/products/${productId}/properties/specification`);\n }\n\n /**\n * Возвращает список файлов продукта.\n *\n * @param productId Идентификатор продукта.\n * @see /doc/api/internal#/operations/api_internal_catalog_product_files_get_list\n */\n public getProductFiles(productId: number): Promise<ICatalogItemPropertyFile[]> {\n return this.get<ICatalogItemPropertyFile[]>(`/internal/catalog/products/${productId}/properties/files`);\n }\n\n /**\n * Добавляет файл к продукту.\n *\n * @param productId Идентификатор продукта.\n * @param fileData Данные загружаемого файла.\n * @see /doc/api/internal#/operations/api_internal_catalog_product_files_create\n */\n public addProductFile(productId: number, fileData: IFileUploadData): Promise<ICatalogItemPropertyFile> {\n return this.post<ICatalogItemPropertyFile>(`/internal/catalog/products/${productId}/properties/files`, fileData);\n }\n\n /**\n * Обновляет файл продукта.\n *\n * @param productId Идентификатор продукта.\n * @param fileId Идентификатор файла.\n * @param fileData Данные файла.\n * @see /doc/api/internal#/operations/api_internal_catalog_product_files_update\n */\n public updateProductFile(productId: number, fileId: number, fileData: IFileUpdateData): Promise<ICatalogItemPropertyFile> {\n return this.patch<ICatalogItemPropertyFile>(`/internal/catalog/products/${productId}/properties/files/${fileId}`, fileData);\n }\n\n /**\n * Удаляет файл продукта.\n *\n * @param productId Идентификатор продукта.\n * @param fileId Идентификатор файла.\n * @see /doc/api/internal#/operations/api_internal_catalog_products_slug_save\n */\n public deleteProductFile(productId: number, fileId: number): Promise<void> {\n return this.delete(`/internal/catalog/products/${productId}/properties/files/${fileId}`);\n }\n\n /**\n * Обновляет URL-slug продукта.\n *\n * @param productId Идентификатор продукта.\n * @param slug Новый URL-slug.\n * @see /doc/api/internal#/operations/api_internal_catalog_product_slug_update\n */\n public updateProductSlug(productId: number, slug: string): Promise<void> {\n return this.patch(`/internal/catalog/products/${productId}/properties/slug`, { slug });\n }\n\n /**\n * Возвращает список свойств категории.\n *\n * @param categoryId Идентификатор категории.\n * @see /doc/api/internal#/operations/api_internal_catalog_category_properties_get_list\n */\n public getCategoryProperties(categoryId: number): Promise<IPropertyValue[]> {\n return this.get<IPropertyValue[]>(`/internal/catalog/categories/${categoryId}/properties`, {}, (response) => response.data.map((value) => new PropertyValue(value)));\n }\n\n /**\n * Возвращает значение свойства категории.\n *\n * @param categoryId Идентификатор категории.\n * @param propertyId Идентификатор свойства.\n * @see /doc/api/internal#/operations/api_internal_catalog_category_properties_get\n */\n public getCategoryProperty(categoryId: number, propertyId: number): Promise<IPropertyValue> {\n return this.get<IPropertyValue>(`/internal/catalog/categories/${categoryId}/properties/${propertyId}`, {}, (response) => new PropertyValue(response.data));\n }\n\n /**\n * Обновляет значение свойства категории.\n *\n * @param categoryId Идентификатор категории.\n * @param propertyId Идентификатор свойства.\n * @param value Новое значение свойства.\n * @see /doc/api/internal#/operations/api_internal_catalog_category_properties_update\n */\n public updateCategoryProperty(categoryId: number, propertyId: number, value: IPropertyValue['value']): Promise<IPropertyValue> {\n return this.patch<IPropertyValue>(`/internal/catalog/categories/${categoryId}/properties/${propertyId}`, { value }, (response) => new PropertyValue(response.data));\n }\n\n /**\n * Удаляет значение свойства категории.\n *\n * @param categoryId Идентификатор категории.\n * @param propertyId Идентификатор свойства.\n * @see /doc/api/internal#/operations/api_internal_catalog_category_properties_delete\n */\n public deleteCategoryProperty(categoryId: number, propertyId: number): Promise<void> {\n return this.delete(`/internal/catalog/categories/${categoryId}/properties/${propertyId}`);\n }\n\n /**\n * Возвращает описание категории.\n *\n * @param categoryId Идентификатор категории.\n * @see /doc/api/internal#/operations/api_internal_catalog_category_description_get\n */\n public getCategoryDescription(categoryId: number): Promise<IDescription> {\n return this.get<IDescription>(`/internal/catalog/categories/${categoryId}/properties/description`);\n }\n\n /**\n * Обновляет описание категории.\n *\n * @param categoryId Идентификатор категории.\n * @param text Текст описания в формате HTML.\n * @see /doc/api/internal#/operations/api_internal_catalog_category_description_update\n */\n public updateCategoryDescription(categoryId: number, text: string): Promise<void> {\n return this.patch(`/internal/catalog/categories/${categoryId}/properties/description`, { text });\n }\n\n /**\n * Удаляет описание категории.\n *\n * @param categoryId Идентификатор категории.\n * @see /doc/api/internal#/operations/api_internal_catalog_category_description_delete\n */\n public deleteCategoryDescription(categoryId: number): Promise<void> {\n return this.delete(`/internal/catalog/categories/${categoryId}/properties/description`);\n }\n\n /**\n * Возвращает спецификацию категории.\n *\n * @param categoryId Идентификатор категории.\n * @see /doc/api/internal#/operations/api_internal_catalog_category_specification_get\n */\n public getCategorySpecification(categoryId: number): Promise<ISpecification> {\n return this.get<ISpecification>(`/internal/catalog/categories/${categoryId}/properties/specification`);\n }\n\n /**\n * Обновляет спецификацию категории.\n *\n * @param categoryId Идентификатор категории.\n * @param text Текст спецификации в формате HTML.\n * @see /doc/api/internal#/operations/api_internal_catalog_category_specification_update\n */\n public updateCategorySpecification(categoryId: number, text: string): Promise<void> {\n return this.patch(`/internal/catalog/categories/${categoryId}/properties/specification`, { text });\n }\n\n /**\n * Удаляет спецификацию категории.\n *\n * @param categoryId Идентификатор категории.\n * @see /doc/api/internal#/operations/api_internal_catalog_category_specification_delete\n */\n public deleteCategorySpecification(categoryId: number): Promise<void> {\n return this.delete(`/internal/catalog/categories/${categoryId}/properties/specification`);\n }\n\n /**\n * Возвращает список файлов категории.\n *\n * @param categoryId Идентификатор категории.\n * @see /doc/api/internal#/operations/api_internal_catalog_category_files_get_list\n */\n public getCategoryFiles(categoryId: number): Promise<ICatalogItemPropertyFile[]> {\n return this.get<ICatalogItemPropertyFile[]>(`/internal/catalog/categories/${categoryId}/properties/files`);\n }\n\n /**\n * Добавляет файл к категории.\n *\n * @param categoryId Идентификатор категории.\n * @param fileData Данные загружаемого файла.\n * @see /doc/api/internal#/operations/api_internal_catalog_category_files_create\n */\n public addCategoryFile(categoryId: number, fileData: IFileUploadData): Promise<ICatalogItemPropertyFile> {\n return this.post<ICatalogItemPropertyFile>(`/internal/catalog/categories/${categoryId}/properties/files`, fileData);\n }\n\n /**\n * Обновляет файл категории.\n *\n * @param categoryId Идентификатор категории.\n * @param fileId Идентификатор файла.\n * @param fileData Данные для обновления файла.\n * @see /doc/api/internal#/operations/api_internal_catalog_category_files_update\n */\n public updateCategoryFile(categoryId: number, fileId: number, fileData: IFileUpdateData): Promise<ICatalogItemPropertyFile> {\n return this.patch<ICatalogItemPropertyFile>(`/internal/catalog/categories/${categoryId}/properties/files/${fileId}`, fileData);\n }\n\n /**\n * Удаляет файл категории.\n *\n * @param categoryId Идентификатор категории.\n * @param fileId Идентификатор файла.\n * @see /doc/api/internal#/operations/api_internal_catalog_category_files_delete\n */\n public deleteCategoryFile(categoryId: number, fileId: number): Promise<void> {\n return this.delete(`/internal/catalog/categories/${categoryId}/properties/files/${fileId}`);\n }\n\n /**\n * Обновляет URL-slug категории.\n *\n * @param categoryId Идентификатор категории.\n * @param slug Новый URL-slug.\n * @see /doc/api/internal#/operations/api_internal_catalog_categories_slug_save\n */\n public updateCategorySlug(categoryId: number, slug: string): Promise<void> {\n return this.patch(`/internal/catalog/categories/${categoryId}/properties/slug`, { slug });\n }\n\n /**\n * Обновляет изображение категории.\n *\n * @param categoryId Идентификатор категории.\n * @param fileData Данные загружаемого файла.\n * @see /doc/api/internal#/operations/api_internal_catalog_categories_image_save\n */\n public updateCategoryImage(categoryId: number, fileData: IFile): Promise<void> {\n return this.post(`/internal/catalog/categories/${categoryId}/image`, { image: fileData });\n }\n}\n","/* eslint-disable lodash/prefer-lodash-method */\n\nimport { ICategory } from '@sc/catalog/interfaces/i-category';\nimport { IProduct } from '@sc/catalog/interfaces/i-product';\nimport { ICatalogableItem } from '@sc/system/interfaces/i-catalogable-item';\nimport { CatalogableItemType } from '@sc/system/types/catalogable-item-type';\n\n/**\n * Рекурсивный поиск товара в каталоге по id.\n *\n * @param items Массив элементов каталога для поиска.\n * @param id Идентификатор товара.\n * @param type Тип элемента каталога (product).\n */\n// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters\nfunction findCatalogItemByIdRecursive<T extends IProduct = IProduct>(items: ICatalogableItem[], id: number, type: 'product'): T | undefined;\n\n/**\n * Рекурсивный поиск категории в каталоге по id.\n *\n * @param items Массив элементов каталога для поиска.\n * @param id Идентификатор категории.\n * @param type Тип элемента каталога (category).\n */\n// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters, @typescript-eslint/unified-signatures\nfunction findCatalogItemByIdRecursive<T extends ICategory = ICategory>(items: ICatalogableItem[], id: number, type: 'category'): T | undefined;\n\n/**\n * Рекурсивный поиск элемента каталога по id и типу.\n *\n * @param items Массив элементов каталога для поиска.\n * @param id Идентификатор элемента.\n * @param type Тип элемента каталога (product или category).\n */\n// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters, @typescript-eslint/unified-signatures\nfunction findCatalogItemByIdRecursive<T extends ICatalogableItem = ICatalogableItem>(items: ICatalogableItem[], id: number, type: CatalogableItemType): T | undefined;\n\n/**\n * Рекурсивный поиск элемента каталога по id и типу.\n *\n * @param items Массив элементов каталога для поиска.\n * @param id Идентификатор элемента.\n * @param type Тип элемента каталога.\n */\nfunction findCatalogItemByIdRecursive<T extends ICatalogableItem = ICatalogableItem>(items: ICatalogableItem[], id: number, type: CatalogableItemType): T | undefined {\n let result: T | undefined;\n\n items.some((item) => {\n // Проверяем тип и id элемента.\n if (item.type === type && item.id === id) {\n result = item as T;\n\n return true;\n }\n\n if (item.type === 'product') {\n return false;\n }\n\n const category = item as ICategory;\n\n // Рекурсивный поиск в продуктах категории.\n if (category.products && category.products.length > 0) {\n const foundInProducts = findCatalogItemByIdRecursive<T>(category.products, id, type);\n\n if (foundInProducts) {\n result = foundInProducts;\n\n return true;\n }\n }\n\n // Рекурсивный поиск в дочерних категориях.\n if (category.categories && category.categories.length > 0) {\n const foundInChildren = findCatalogItemByIdRecursive<T>(category.categories, id, type);\n\n if (foundInChildren) {\n result = foundInChildren;\n\n return true;\n }\n }\n\n return false;\n });\n\n return result;\n}\n\nexport { findCatalogItemByIdRecursive };\n","import { ICatalogableItem } from '../../system/interfaces/i-catalogable-item';\nimport { ICategory } from '../interfaces/i-category';\n\n/**\n * Преобразует иерархическую структуру каталога в плоский список всех элементов.\n *\n * @param items Массив элементов каталога для преобразования.\n */\nexport function flattenCatalogItems(items: ICatalogableItem[]): ICatalogableItem[] {\n const result: ICatalogableItem[] = [];\n\n items.forEach((item) => {\n // Добавляем текущий элемент в результат.\n result.push(item);\n\n // Если это категория, рекурсивно обрабатываем её дочерние элементы.\n if (item.type === 'category') {\n const category = item as ICategory;\n\n // Добавляем все продукты категории.\n if (category.products && category.products.length > 0) {\n result.push(...flattenCatalogItems(category.products));\n }\n\n // Рекурсивно обрабатываем дочерние категории.\n if (category.categories && category.categories.length > 0) {\n result.push(...flattenCatalogItems(category.categories));\n }\n }\n });\n\n return result;\n}\n","/* eslint-disable no-shadow */\n\n/**\n * Список типов дополнительно запрашиваемых данных клиента.\n */\nexport enum ClientsAdditionalDataRequestTypeEnum {\n /**\n * Данные последнего заказа клиента.\n */\n LastOrder = 'last_order',\n\n /**\n * Список контактных лиц клиента.\n */\n Contacts = 'contacts',\n\n /**\n * Список групп партнеров клиента.\n */\n PartnerGroups = 'partner_groups',\n\n /**\n * Предпочитаемый тип доставки клиента.\n */\n PreferredDeliveryType = 'preferred_delivery_type',\n\n /**\n * Направление продаж.\n */\n SalesDirection = 'sales_direction',\n\n /**\n * Список менеджеров.\n */\n Managers = 'managers',\n}\n","/* eslint-disable no-unused-vars, no-shadow */\n\n/**\n * Перечисление типов организационно-правовых форм контрагентов.\n */\nexport enum OpfEnum {\n /**\n * Физическое лицо.\n */\n Person = 'individual',\n\n /**\n * Индивидуальный предприниматель.\n */\n Ic = 'entrepreneur',\n\n /**\n * Юридическое лицо - резидент.\n */\n UlR = 'legal',\n\n /**\n * Юридическое лицо - нерезидент.\n */\n UlNr = 'non_resident_legal',\n}\n","import { Reference } from '@sc/system/classes/reference';\nimport { IReference } from '@sc/system/interfaces/i-reference';\n\n/**\n * Данные записи из справочника.\n */\nexport class AnyReference extends Reference implements IReference {}\n","import { IChannelPrimaryInterest } from '@sc/references/interfaces/i-channel-primary-interest';\nimport { Reference } from '@sc/system/classes/reference';\n\n/**\n * Данные о канале первичного интереса.\n */\nexport class ChannelPrimaryInterest extends Reference implements IChannelPrimaryInterest {}\n","import { ICity } from '@sc/references/interfaces/i-city';\nimport { Reference } from '@sc/system/classes/reference';\n\n/**\n * Данные о городе.\n */\nexport class City extends Reference implements ICity {}\n","import { IContactPosition } from '@sc/references/interfaces/i-contact-position';\nimport { Reference } from '@sc/system/classes/reference';\n\n/**\n * Должность контактного лица.\n */\nexport class ContactPosition extends Reference implements IContactPosition {}\n","/* eslint-disable @typescript-eslint/no-unnecessary-condition */\n\nimport { ICurrency } from '@sc/references/interfaces/i-currency';\nimport { NamedIdentity } from '@sc/system/classes';\n\n/**\n * Данные о валюте.\n */\nexport class Currency extends NamedIdentity implements ICurrency {\n /**\n * Сигнатура валюты.\n */\n public signature: string = '';\n\n /**\n * Символ валюты.\n */\n public symbol: string = '';\n\n /**\n * Инициализирует экземпляр класса {@link Currency}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: ICurrency) {\n super(data);\n\n if (data) {\n this.signature = data.signature ?? '';\n this.symbol = data.symbol ?? '';\n }\n }\n}\n","import { OpfEnum } from '@sc/clients/enums/opf-enum';\nimport { IOpf } from '@sc/references/interfaces/i-opf';\nimport { Reference } from '@sc/system/classes/reference';\n\n/**\n * Данные об организационно-правовой форме.\n */\nexport class Opf extends Reference<OpfEnum> implements IOpf {\n /**\n * Возвращает сгенерированную запись-описание физического лица.\n */\n public static generatePersonItem(): IOpf {\n return new Opf({\n id: 1,\n guid: '',\n slug: OpfEnum.Person,\n name: '',\n } as IOpf);\n }\n}\n","import { IOrderPaymentStatus } from '@sc/references/interfaces/i-order-payment-status';\nimport { Reference } from '@sc/system/classes/reference';\n\n/**\n * Данные о статусе оплаты заказа.\n */\nexport class OrderPaymentStatus extends Reference implements IOrderPaymentStatus {}\n","import { IOrderStatus } from '@sc/references/interfaces/i-order-status';\nimport { Reference } from '@sc/system/classes/reference';\n\n/**\n * Данные о статусе заказа.\n */\nexport class OrderStatus extends Reference implements IOrderStatus {}\n","import { IPartnerGroup } from '@sc/references/interfaces/i-partner-group';\nimport { Reference } from '@sc/system/classes/reference';\n\n/**\n * Группа партнеров (направление деятельности).\n */\nexport class PartnerGroup extends Reference implements IPartnerGroup {}\n","import { IPaymentType } from '@sc/references/interfaces/i-payment-type';\nimport { Reference } from '@sc/system/classes/reference';\n\n/**\n * Данные о типе оплаты заказа.\n */\nexport class PaymentType extends Reference implements IPaymentType {}\n","import { IProductFileType } from '@sc/references/interfaces/i-product-file-type';\nimport { Reference } from '@sc/system/classes/reference';\n\n/**\n * Данные о типах файлов продуктов/категорий.\n */\nexport class ProductFileType extends Reference implements IProductFileType {}\n","import { IResourceType } from '@sc/references/interfaces/i-resource-type';\nimport { Reference } from '@sc/system/classes/reference';\n\n/**\n * Данные о типе ресурса.\n */\nexport class ResourceType extends Reference implements IResourceType {}\n","import { ISourcePrimaryInterest } from '@sc/references/interfaces/i-source-primary-interest';\nimport { Reference } from '@sc/system/classes/reference';\n\n/**\n * Данные об источнике первичного интереса.\n */\nexport class SourcePrimaryInterest extends Reference implements ISourcePrimaryInterest {}\n","/* eslint-disable @typescript-eslint/no-unnecessary-condition */\n\nimport { IBankAccount } from '@sc/clients/interfaces';\nimport { Currency } from '@sc/references/classes';\nimport { ICurrency } from '@sc/references/interfaces';\nimport { Identity } from '@sc/system/classes';\n\n/**\n * Данные о банковском счёте контрагента.\n */\nexport class BankAccount extends Identity implements IBankAccount {\n /**\n * Наименование банка.\n */\n public bankName: string = '';\n\n /**\n * Банковский идентификационный код ЦБ РФ (БИК).\n */\n public bic: string = '';\n\n /**\n * Номер счёта.\n */\n public accountNumber: string = '';\n\n /**\n * Корреспондентский счет в ЦБ РФ.\n */\n public correspondentAccount: string = '';\n\n /**\n * Данные о валюте.\n */\n public currency: ICurrency = new Currency();\n\n /**\n * Инициализирует экземпляр класса {@link BankAccount}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IBankAccount) {\n super(data);\n\n if (data) {\n this.bankName = data.bankName ?? '';\n this.bic = data.bic ?? '';\n this.accountNumber = data.accountNumber ?? '';\n this.correspondentAccount = data.correspondentAccount ?? '';\n this.currency = new Currency(data.currency);\n }\n }\n}\n","import { IContact } from '@sc/contacts/interfaces/i-contact';\nimport { NamedIdentity } from '@sc/system/classes/named-identity';\n\n/**\n * Полные данные контакта.\n */\nexport class Contact extends NamedIdentity implements IContact {\n /**\n * Номер телефона. В формате \"79203436527\" или \"+79203436527\".\n */\n public phone?: string;\n\n /**\n * Адрес электронной почты.\n */\n public email?: string;\n\n /**\n * Инициализирует экземпляр класса {@link Contact}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IContact) {\n super(data);\n\n this.email = data?.email;\n this.phone = /^\\d+$/.test(data?.phone ?? '') ? `+${data?.phone}` : data?.phone;\n }\n}\n","import { Contact } from '@sc/contacts/classes/contact';\nimport { IContactPerson } from '@sc/contacts/interfaces/i-contact-person';\nimport { parseISO } from 'date-fns';\nimport { isString } from 'lodash-es';\n\n/**\n * Данные о контактном лице.\n */\nexport class ContactPerson extends Contact implements IContactPerson {\n /**\n * Признак того, что контакт является основным.\n */\n public isPrimary?: boolean;\n\n /**\n * Должность контактного лица.\n */\n public position?: string;\n\n /**\n * Признак, что контактное лицо не нужно беспокоить.\n */\n public notDisturb?: boolean;\n\n /**\n * Комментарий к контактному лицу.\n */\n public comment?: string;\n\n /**\n * Дата и время последнего изменения.\n */\n public updatedAt?: Date;\n\n /**\n * Дата и время последнего удаления.\n */\n public deletedAt?: Date;\n\n /**\n * Инициализирует экземпляр класса {@link ContactPerson}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IContactPerson) {\n super(data);\n\n this.isPrimary = data?.isPrimary ?? false;\n this.position = data?.position;\n this.notDisturb = data?.notDisturb ?? false;\n this.comment = data?.comment;\n this.updatedAt = data?.updatedAt;\n this.deletedAt = isString(data?.deletedAt) ? parseISO(data.deletedAt) : data?.deletedAt;\n }\n}\n","/* eslint-disable @typescript-eslint/no-unnecessary-condition */\n\nimport { BankAccount } from '@sc/clients/classes/bank-account';\nimport { IContragentBase } from '@sc/clients/interfaces/contragent/i-contragent-base';\nimport { IBankAccount } from '@sc/clients/interfaces/i-bank-account';\nimport { ContactPerson } from '@sc/contacts/classes/contact-person';\nimport { IContactPerson } from '@sc/contacts/interfaces/i-contact-person';\nimport { ManagerCommon } from '@sc/managers/classes/manager-common';\nimport { IManagerCommon } from '@sc/managers/interfaces/i-manager-common';\nimport { Opf, PartnerGroup, SalesDirection } from '@sc/references/classes';\nimport { IOpf, IPartnerGroup, ISalesDirection } from '@sc/references/interfaces';\nimport { NamedIdentity } from '@sc/system/classes/named-identity';\nimport { UserShortInfo } from '@sc/user/classes/user-short-info';\nimport { IUserShortInfo } from '@sc/user/interfaces/i-user-short-info';\nimport { parseISO } from 'date-fns';\nimport { isString } from 'lodash-es';\n\n/**\n * Базовые данные о контрагенте.\n */\nexport abstract class ContragentBase extends NamedIdentity implements IContragentBase {\n /**\n * Данные о менеджере.\n */\n public manager: IManagerCommon = new ManagerCommon();\n\n /**\n * Данные об организационно-правовой форме.\n */\n public opf: IOpf = Opf.generatePersonItem();\n\n /**\n * Направление продаж.\n */\n public salesDirection: ISalesDirection = new SalesDirection();\n\n /**\n * Группа партнеров (направление деятельности).\n */\n public partnerGroup: IPartnerGroup = new PartnerGroup();\n\n /**\n * Список контактных лиц контрагента.\n */\n public contacts: IContactPerson[] = [] as IContactPerson[];\n\n /**\n * Список банковских счетов контрагента.\n */\n public bankAccounts: IBankAccount[] = [] as IBankAccount[];\n\n /**\n * Комментарий к контрагенту.\n */\n public comment?: string;\n\n /**\n * Альтернативное название контрагента.\n */\n public alternativeName?: string;\n\n /**\n * Дата и время создания записи.\n */\n public createdAt?: Date;\n\n /**\n * Данные пользователя, создавшего запись.\n */\n public creator?: IUserShortInfo;\n\n /**\n * Дата и время последнего изменения данных.\n */\n public updatedAt?: Date;\n\n /**\n * Данные пользователя, который внес последние изменения в запись.\n */\n public updater?: IUserShortInfo;\n\n /**\n * Инициализирует экземпляр класса {@link ContragentBase}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n // eslint-disable-next-line sonarjs/cognitive-complexity\n protected constructor(data?: IContragentBase) {\n super(data);\n\n if (data) {\n this.opf = new Opf(data.opf);\n this.salesDirection = new SalesDirection(data.salesDirection);\n this.comment = data.comment;\n this.alternativeName = data.alternativeName;\n this.createdAt = isString(data?.createdAt) ? parseISO(data.createdAt) : data.createdAt;\n this.creator = data.creator ? new UserShortInfo(data.creator) : undefined;\n this.updatedAt = isString(data?.updatedAt) ? parseISO(data.updatedAt) : data.updatedAt;\n this.updater = data.updater ? new UserShortInfo(data.updater) : undefined;\n\n if (data.partnerGroup) {\n this.partnerGroup = new PartnerGroup(data.partnerGroup);\n }\n\n if (data.manager) {\n this.manager = new ManagerCommon(data.manager);\n }\n\n if (data.contacts) {\n const contactsList = [] as IContactPerson[];\n data.contacts.forEach((value) => {\n contactsList.push(new ContactPerson(value));\n });\n this.contacts = contactsList;\n }\n\n if (data.bankAccounts) {\n const contactsList = [] as IBankAccount[];\n data.bankAccounts.forEach((value) => {\n contactsList.push(new BankAccount(value));\n });\n this.bankAccounts = contactsList;\n }\n }\n }\n}\n","import { IContragentPerson } from '@sc/clients/interfaces/contragent';\n\nimport { ContragentBase } from './contragent-base';\n\n/**\n * Данные о контрагенте - физическом лице.\n */\nexport class ContragentPerson extends ContragentBase implements IContragentPerson {\n /**\n * Инициализирует экземпляр класса {@link ContragentPerson}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IContragentPerson) {\n super(data);\n }\n}\n","/* eslint-disable @typescript-eslint/no-unnecessary-condition */\n\nimport { IContragentIc } from '../../interfaces';\nimport { ContragentBase } from './contragent-base';\n\n/**\n * Данные о контрагенте - индивидуальном предпринимателе.\n */\nexport class ContragentIc extends ContragentBase implements IContragentIc {\n /**\n * ИНН.\n */\n public inn: string = '';\n\n /**\n * Код ОКПО.\n */\n public okpo: string = '';\n\n /**\n * ФИО руководителя.\n */\n public directorName: string = '';\n\n /**\n * Должность руководителя.\n */\n public directorPosition: string = '';\n\n /**\n * Основания полномочий руководителя.\n */\n public directorActsOn: string = '';\n\n /**\n * Юридический адрес.\n */\n public legalAddress: string = '';\n\n /**\n * Почтовый адрес.\n */\n public postalAddress: string = '';\n\n /**\n * Фактический адрес.\n */\n public actualAddress: string = '';\n\n /**\n * Инициализирует экземпляр класса {@link ContragentIc}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IContragentIc) {\n super(data);\n\n if (data) {\n this.inn = data.inn ?? '';\n this.okpo = data.okpo ?? '';\n this.directorName = data.directorName ?? '';\n this.directorPosition = data.directorPosition ?? '';\n this.directorActsOn = data.directorActsOn ?? '';\n this.legalAddress = data.legalAddress ?? '';\n this.postalAddress = data.postalAddress ?? '';\n this.actualAddress = data.actualAddress ?? '';\n }\n }\n}\n","/* eslint-disable @typescript-eslint/no-unnecessary-condition */\n\nimport { IContragentUlR } from '@sc/clients/interfaces/contragent';\n\nimport { ContragentIc } from './contragent-ic';\n\n/**\n * Данные о контрагенте - юридическом лице, резиденте.\n */\nexport class ContragentUlR extends ContragentIc implements IContragentUlR {\n /**\n * КПП организации.\n */\n public kpp: string = '';\n\n /**\n * Инициализирует экземпляр класса {@link ContragentUlR}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IContragentUlR) {\n super(data);\n\n if (data) {\n this.kpp = data.kpp ?? '';\n }\n }\n}\n","/* eslint-disable @typescript-eslint/no-unnecessary-condition */\n\nimport { IContragentUlNr } from '@sc/clients/interfaces/contragent';\nimport { Country } from '@sc/references/classes';\nimport { ICountry } from '@sc/references/interfaces';\n\nimport { ContragentUlR } from './contragent-ul-r';\n\n/**\n * Данные о контрагенте - юридическом лице, нерезиденте.\n */\nexport class ContragentUlNr extends ContragentUlR implements IContragentUlNr {\n /**\n * Страна регистрации юридического лица нерезидента.\n */\n public registrationCountry: ICountry = new Country();\n\n /**\n * Регистрационный номер юридического лица нерезидента.\n */\n public registrationNumber: string = '';\n\n /**\n * Налоговый номер юридического лица нерезидента.\n */\n public taxNumber: string = '';\n\n /**\n * Инициализирует экземпляр класса {@link ContragentUlNr}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IContragentUlNr) {\n super(data);\n\n if (data) {\n this.registrationCountry = new Country(data.registrationCountry);\n this.registrationNumber = data.registrationNumber ?? '';\n this.taxNumber = data.taxNumber ?? '';\n }\n }\n}\n","import { OpfEnum } from '@sc/clients/enums';\nimport { IContragentBase, IContragentIc, IContragentPerson, IContragentUlNr, IContragentUlR } from '@sc/clients/interfaces/contragent';\n\nimport { ContragentIc } from './contragent-ic';\nimport { ContragentPerson } from './contragent-person';\nimport { ContragentUlNr } from './contragent-ul-nr';\nimport { ContragentUlR } from './contragent-ul-r';\n\n/**\n * Фабрика создания экземпляров классов с данными о контрагентах.\n */\nexport class ContragentFactory {\n /**\n * Инициализирует и возвращает экземпляр класса с данными о контрагенте.\n *\n * @param data Данные для инициализации.\n */\n public static createInstance(data: IContragentBase): ContragentPerson | ContragentIc | ContragentUlR | ContragentUlNr {\n switch (data.opf.slug) {\n case OpfEnum.Ic:\n return new ContragentIc(data as IContragentIc);\n case OpfEnum.UlR:\n return new ContragentUlR(data as IContragentUlR);\n case OpfEnum.UlNr:\n return new ContragentUlNr(data as IContragentUlNr);\n default:\n return new ContragentPerson(data as IContragentPerson);\n }\n }\n}\n","import { IContactRelation } from '@sc/contacts/interfaces/i-contact-relation';\nimport { Identity } from '@sc/system/classes/identity';\n\n/**\n * Данные об отношении контактного лица с данными о клиенте.\n */\nexport class ContactRelation extends Identity implements IContactRelation {\n /**\n * Признак того, что контакт является основным.\n */\n public isPrimary?: boolean;\n\n /**\n * Инициализирует экземпляр класса {@link ContactRelation}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data: IContactRelation) {\n super(data);\n\n this.isPrimary = data.isPrimary;\n }\n}\n","/* eslint-disable @typescript-eslint/no-unnecessary-condition */\n\nimport { ContactPerson } from '@sc/contacts/classes/contact-person';\nimport { ContactRelation } from '@sc/contacts/classes/contact-relation';\nimport { IContactPersonRelated } from '@sc/contacts/interfaces/i-contact-person-related';\nimport { IContactRelation } from '@sc/contacts/interfaces/i-contact-relation';\n\n/**\n * Данные о контактном лице и его связях с данными о клиенте.\n */\nexport class ContactPersonRelated extends ContactPerson implements IContactPersonRelated {\n /**\n * Список связей контактного лица с сущностями.\n */\n public relations = {\n /**\n * Список клиентов, с которыми связано контактное лицо.\n */\n clients: [] as IContactRelation[],\n\n /**\n * Список контрагентов, с которыми связано контактное лицо.\n */\n contragents: [] as IContactRelation[],\n\n /**\n * Список адресов доставки, с которыми связано контактное лицо.\n */\n addresses: [] as IContactRelation[],\n };\n\n /**\n * Инициализирует экземпляр класса {@link ContactPersonRelated}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data: IContactPersonRelated) {\n super(data);\n\n if (data.relations) {\n if (data.relations.addresses) {\n this.relations.addresses = data.relations.addresses.map((item: IContactRelation) => new ContactRelation(item));\n }\n\n if (data.relations.clients) {\n this.relations.clients = data.relations.clients.map((item: IContactRelation) => new ContactRelation(item));\n }\n\n if (data.relations.contragents) {\n this.relations.contragents = data.relations.contragents.map((item: IContactRelation) => new ContactRelation(item));\n }\n }\n }\n}\n","/* eslint-disable @typescript-eslint/no-unnecessary-condition */\n\nimport { IDeliveryAddress } from '@sc/clients/interfaces';\nimport { ContactPerson } from '@sc/contacts/classes';\nimport { IContactPerson } from '@sc/contacts/interfaces';\nimport { GeoCoordinates } from '@sc/geo/classes';\nimport { IGeoCoordinates } from '@sc/geo/interfaces';\nimport { DeletableNamedIdentity } from '@sc/system/classes/deletable-named-identity';\n\n/**\n * Данные об адресе доставки клиента.\n */\nexport class DeliveryAddress extends DeletableNamedIdentity implements IDeliveryAddress {\n /**\n * Адрес.\n */\n address: string = '';\n\n /**\n * Координаты.\n */\n coordinates?: IGeoCoordinates;\n\n /**\n * Данные о контактных лицах.\n */\n contacts: IContactPerson[];\n\n /**\n * Комментарий к адресу доставки клиента.\n */\n public comment?: string;\n\n /**\n * Данные о времени работы.\n */\n public operatingHours?: {\n /**\n * Время работы, с (в формате ЧЧ:ММ).\n */\n from: string;\n\n /**\n * Время работы, до (в формате ЧЧ:ММ).\n */\n to: string;\n };\n\n /**\n * Признак одноразового адреса (адрес, который удаляется после завершения заказа).\n */\n public isOneTime?: boolean;\n\n /**\n * Признак того, что указанный адрес является адресом транспортной компании.\n */\n public isTransportCompanyAddress?: boolean;\n\n /**\n * Инициализирует экземпляр класса {@link DeliveryAddress}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IDeliveryAddress) {\n super(data);\n\n this.address = data?.address ?? '';\n this.coordinates = new GeoCoordinates(data?.coordinates);\n this.contacts = data?.contacts?.map((c) => new ContactPerson(c)) ?? [];\n this.comment = data?.comment;\n this.operatingHours = data?.operatingHours;\n this.isOneTime = data?.isOneTime;\n this.isTransportCompanyAddress = data?.isTransportCompanyAddress;\n }\n}\n","/* eslint-disable @typescript-eslint/no-unnecessary-condition */\n\nimport { ClientShortInfo } from '@sc/clients/classes/client-short-info';\nimport { ContragentFactory } from '@sc/clients/classes/contragent/contragent-factory';\nimport { DeliveryAddress } from '@sc/clients/classes/delivery-address';\nimport { IContragentIc } from '@sc/clients/interfaces/contragent/i-contragent-ic';\nimport { IContragentPerson } from '@sc/clients/interfaces/contragent/i-contragent-person';\nimport { IContragentUlNr } from '@sc/clients/interfaces/contragent/i-contragent-ul-nr';\nimport { IContragentUlR } from '@sc/clients/interfaces/contragent/i-contragent-ul-r';\nimport { IClient } from '@sc/clients/interfaces/i-client';\nimport { IDeliveryAddress } from '@sc/clients/interfaces/i-delivery-address';\nimport { ContactPerson } from '@sc/contacts/classes/contact-person';\nimport { IContactPerson } from '@sc/contacts/interfaces/i-contact-person';\nimport { ChannelPrimaryInterest } from '@sc/references/classes/channel-primary-interest';\nimport { DeliveryType } from '@sc/references/classes/delivery-type';\nimport { PartnerGroup } from '@sc/references/classes/partner-group';\nimport { SourcePrimaryInterest } from '@sc/references/classes/source-primary-interest';\nimport { Warehouse } from '@sc/references/classes/warehouse';\nimport { IChannelPrimaryInterest } from '@sc/references/interfaces/i-channel-primary-interest';\nimport { IDeliveryType } from '@sc/references/interfaces/i-delivery-type';\nimport { IPartnerGroup } from '@sc/references/interfaces/i-partner-group';\nimport { ISourcePrimaryInterest } from '@sc/references/interfaces/i-source-primary-interest';\nimport { IWarehouse } from '@sc/references/interfaces/i-warehouse';\n\n/**\n * Данные о клиенте.\n */\nexport class Client extends ClientShortInfo implements IClient {\n /**\n * @inheritDoc\n */\n public contragents: Array<IContragentPerson | IContragentIc | IContragentUlR | IContragentUlNr>;\n\n /**\n * @inheritDoc\n */\n public partnerGroups: IPartnerGroup[];\n\n /**\n * @inheritDoc\n */\n public contacts: IContactPerson[];\n\n /**\n * @inheritDoc\n */\n public deliveryAddresses: IDeliveryAddress[];\n\n /**\n * @inheritDoc\n */\n public channelPrimaryInterest: IChannelPrimaryInterest;\n\n /**\n * @inheritDoc\n */\n public sourcePrimaryInterest: ISourcePrimaryInterest;\n\n /**\n * @inheritDoc\n */\n public preferredDeliveryType: IDeliveryType;\n\n /**\n * @inheritDoc\n */\n public primaryDemand?: string;\n\n /**\n * @inheritDoc\n */\n public isExcludedFromMsCallsToClients?: boolean;\n\n /**\n * @inheritDoc\n */\n public reasonExcludedFromMsCallsToClients?: string;\n\n /**\n * @inheritDoc\n */\n public preferredWarehouse?: IWarehouse;\n\n /**\n * @inheritDoc\n */\n public extraData?: Record<string, unknown>;\n\n /**\n * Инициализирует экземпляр класса {@link Client}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n // eslint-disable-next-line sonarjs/cognitive-complexity\n public constructor(data?: IClient) {\n super(data);\n\n this.contragents = data?.contragents?.map((c) => ContragentFactory.createInstance(c)) ?? [];\n this.partnerGroups = data?.partnerGroups?.map((pg) => new PartnerGroup(pg)) ?? [];\n this.contacts = data?.contacts?.map((c) => new ContactPerson(c)) ?? [];\n this.deliveryAddresses = data?.deliveryAddresses?.map((da) => new DeliveryAddress(da)) ?? [];\n this.channelPrimaryInterest = new ChannelPrimaryInterest(data?.channelPrimaryInterest);\n this.sourcePrimaryInterest = new SourcePrimaryInterest(data?.sourcePrimaryInterest);\n this.preferredDeliveryType = new DeliveryType(data?.preferredDeliveryType);\n this.primaryDemand = data?.primaryDemand;\n this.isExcludedFromMsCallsToClients = data?.isExcludedFromMsCallsToClients ?? false;\n this.reasonExcludedFromMsCallsToClients = data?.reasonExcludedFromMsCallsToClients;\n this.preferredWarehouse = data?.preferredWarehouse ? new Warehouse(data.preferredWarehouse) : undefined;\n this.extraData = data?.extraData ?? {};\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any,@typescript-eslint/no-unnecessary-condition */\n\nimport { IClientsListFilters } from '@sc/clients/interfaces/i-clients-list-filters';\nimport { Contact } from '@sc/contacts/classes/contact';\nimport { IContact } from '@sc/contacts/interfaces/i-contact';\nimport { Curator } from '@sc/managers/classes/curator';\nimport { Manager } from '@sc/managers/classes/manager';\nimport { ICurator } from '@sc/managers/interfaces/i-curator';\nimport { IManager } from '@sc/managers/interfaces/i-manager';\nimport { IOrdersListFilters } from '@sc/orders/interfaces/i-orders-list-filters';\nimport { CityWithRegionAndCountry } from '@sc/references/classes/city-with-region-and-country';\nimport { Country } from '@sc/references/classes/country';\nimport { DeliveryType } from '@sc/references/classes/delivery-type';\nimport { Opf } from '@sc/references/classes/opf';\nimport { PartnerGroup } from '@sc/references/classes/partner-group';\nimport { Region } from '@sc/references/classes/region';\nimport { SalesDirection } from '@sc/references/classes/sales-direction';\nimport { ICityWithRegionAndCountry } from '@sc/references/interfaces/i-city-with-region-and-country';\nimport { ICountry } from '@sc/references/interfaces/i-country';\nimport { IDeliveryType } from '@sc/references/interfaces/i-delivery-type';\nimport { IOpf } from '@sc/references/interfaces/i-opf';\nimport { IPartnerGroup } from '@sc/references/interfaces/i-partner-group';\nimport { IRegion } from '@sc/references/interfaces/i-region';\nimport { ISalesDirection } from '@sc/references/interfaces/i-sales-direction';\nimport { DatePeriod } from '@sc/system/classes/date-period';\nimport { IDatePeriod } from '@sc/system/interfaces/i-date-period';\nimport { IReference } from '@sc/system/interfaces/i-reference';\nimport { isFunction, isNil, isString } from 'lodash-es';\n\n/**\n * Данные о параметрах фильтрации списка клиентов.\n */\nexport class ClientsListFilters implements IClientsListFilters {\n /**\n * @inheritDoc\n */\n public id?: string;\n\n /**\n * @inheritDoc\n */\n public name?: string;\n\n /**\n * @inheritDoc\n */\n public alternativeName?: string;\n\n /**\n * @inheritDoc\n */\n public searchTerm?: string;\n\n /**\n * @inheritDoc\n */\n public cities?: ICityWithRegionAndCountry[];\n\n /**\n * @inheritDoc\n */\n public region?: IRegion;\n\n /**\n * @inheritDoc\n */\n public country?: ICountry;\n\n /**\n * @inheritDoc\n */\n public phone?: string;\n\n /**\n * @inheritDoc\n */\n public email?: string;\n\n /**\n * @inheritDoc\n */\n public isActive?: boolean;\n\n /**\n * @inheritDoc\n */\n public createdAt: IDatePeriod = new DatePeriod();\n\n /**\n * @inheritDoc\n */\n public lastLoginDate: IDatePeriod = new DatePeriod();\n\n /**\n * @inheritDoc\n */\n public lastLoginDateHasOrder?: boolean;\n\n /**\n * @inheritDoc\n */\n public managers?: IManager[];\n\n /**\n * @inheritDoc\n */\n public curators?: ICurator[];\n\n /**\n * @inheritDoc\n */\n public isManagerRequired?: boolean;\n\n /**\n * @inheritDoc\n */\n public salesDirections?: ISalesDirection[];\n\n /**\n * @inheritDoc\n */\n public contragentInn?: string;\n\n /**\n * @inheritDoc\n */\n public contragentType?: IOpf;\n\n /**\n * @inheritDoc\n */\n public preferredDeliveryType?: IDeliveryType;\n\n /**\n * @inheritDoc\n */\n public partnerGroups?: IPartnerGroup[];\n\n /**\n * @inheritDoc\n */\n public contact?: IContact;\n\n /**\n * @inheritDoc\n */\n public lastOrder?: Partial<Pick<IOrdersListFilters, 'createdAt' | 'creator' | 'isApproved'>>;\n\n /**\n * @inheritDoc\n */\n public isExcludedFromMsCallsToClients?: boolean;\n\n /**\n * Инициализирует экземпляр класса {@link ClientsListFilters}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IClientsListFilters) {\n this.id = data?.id;\n this.name = data?.name;\n this.alternativeName = data?.alternativeName;\n this.searchTerm = data?.searchTerm;\n this.cities = data?.cities?.map((c) => new CityWithRegionAndCountry(c));\n this.region = new Region(data?.region);\n this.country = new Country(data?.country);\n this.phone = data?.phone;\n this.email = data?.email;\n // eslint-disable-next-line no-nested-ternary\n this.isActive = data && Object.prototype.hasOwnProperty.call(data, 'isActive') ? data?.isActive : true;\n this.createdAt = new DatePeriod(data?.createdAt);\n this.lastLoginDate = new DatePeriod(data?.lastLoginDate);\n // eslint-disable-next-line no-nested-ternary\n this.lastLoginDateHasOrder = data?.lastLoginDateHasOrder ?? undefined;\n // eslint-disable-next-line prettier/prettier\n this.managers = data?.managers?.map((m) => new Manager(m)) ?? [];\n this.curators = data?.curators?.map((c) => new Curator(c)) ?? [];\n this.salesDirections = data?.salesDirections?.map((s) => new SalesDirection(s));\n this.contragentInn = data?.contragentInn;\n this.contragentType = new Opf(data?.contragentType);\n this.preferredDeliveryType = new DeliveryType(data?.preferredDeliveryType);\n this.partnerGroups = data?.partnerGroups?.map((p) => new PartnerGroup(p));\n this.contact = new Contact(data?.contact);\n this.lastOrder = {\n createdAt: new DatePeriod(data?.lastOrder?.createdAt),\n creator: data?.lastOrder?.creator,\n isApproved: data?.lastOrder?.isApproved,\n };\n this.isExcludedFromMsCallsToClients = data?.isExcludedFromMsCallsToClients;\n }\n\n /**\n * Выполняет сброс указанного фильтра в значение по умолчанию.\n *\n * @param key Название фильтра, значение которого необходимо сбросить.\n */\n public resetFilterValue(key: string): this {\n switch (key) {\n case 'cities':\n this.cities = [] as ICityWithRegionAndCountry[];\n break;\n case 'region':\n this.region = new Region();\n break;\n case 'isActive':\n this.isActive = true;\n break;\n case 'createdAt':\n this.createdAt.from = null;\n this.createdAt.to = null;\n break;\n case 'lastLoginDate':\n this.lastLoginDate.from = null;\n this.lastLoginDate.to = null;\n break;\n case 'lastOrder':\n this.lastOrder = {};\n break;\n case 'managers':\n this.managers = [] as IManager[];\n break;\n case 'curators':\n this.curators = [] as ICurator[];\n break;\n case 'salesDirections':\n this.salesDirections = [] as ISalesDirection[];\n break;\n case 'contragentType':\n this.contragentType = new Opf();\n break;\n case 'preferredDeliveryType':\n this.preferredDeliveryType = new DeliveryType();\n break;\n case 'partnerGroups':\n this.partnerGroups = [] as IPartnerGroup[];\n break;\n case 'contact':\n this.contact = new Contact();\n break;\n default:\n // eslint-disable-next-line security/detect-object-injection,@typescript-eslint/no-explicit-any,@typescript-eslint/no-unsafe-member-access\n (this as any)[key] = undefined;\n break;\n }\n\n return this;\n }\n\n /**\n * Возвращает очищенное значение фильтров, содержащие\n * только актуальные данные.\n */\n public asClearRaw(): Record<string, any> {\n const result: Record<string, any> = {};\n\n // eslint-disable-next-line lodash/prefer-lodash-method\n Object.keys(this).forEach((k) => {\n const value = this[k as keyof IClientsListFilters];\n\n if (\n !(\n // eslint-disable-next-line prettier/prettier\n isNil(value)\n // eslint-disable-next-line prettier/prettier,lodash/prefer-lodash-method\n || (isString(value) && value.trim().length === 0)\n // eslint-disable-next-line @typescript-eslint/unbound-method,prettier/prettier\n || (isFunction((value as IReference).isNewRec) && (value as IReference).isNewRec())\n )\n ) {\n // eslint-disable-next-line security/detect-object-injection\n result[k] = value;\n }\n });\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (!result?.createdAt?.from && !result?.createdAt?.to) {\n delete result.createdAt;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (!result?.lastLoginDate?.from && !result?.lastLoginDate?.to) {\n delete result.lastLoginDate;\n }\n\n return result;\n }\n}\n","import { IOrderShortInfo } from '@sc/orders/interfaces/i-order-short-info';\nimport { Identity } from '@sc/system/classes/identity';\nimport { UserShortInfo } from '@sc/user/classes/user-short-info';\nimport { IUserShortInfo } from '@sc/user/interfaces/i-user-short-info';\nimport { parseISO } from 'date-fns';\nimport { isString } from 'lodash-es';\n\n/**\n * Краткие данные о заказе.\n */\nexport class OrderShortInfo extends Identity implements IOrderShortInfo {\n /**\n * Дата и время создания заказа.\n */\n public createdAt: Date;\n\n /**\n * Краткие данные о пользователе, который создал заказ.\n */\n public creator: IUserShortInfo;\n\n /**\n * Признак того, что заказ подтвержден в 1С.\n */\n public isApproved1c: boolean;\n\n /**\n * Инициализирует экземпляр класса {@link OrderShortInfo}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IOrderShortInfo>) {\n super(data);\n\n this.createdAt = isString(data?.createdAt) ? parseISO(data.createdAt) : (data?.createdAt ?? new Date());\n this.creator = new UserShortInfo(data?.creator);\n this.isApproved1c = data?.isApproved1c ?? false;\n }\n}\n","import { IClientAdditionalData } from '@sc/clients/interfaces/i-client-additional-data';\nimport { ContactPerson } from '@sc/contacts/classes/contact-person';\nimport { IContactPerson } from '@sc/contacts/interfaces/i-contact-person';\nimport { ManagerCommon } from '@sc/managers/classes/manager-common';\nimport { IManagerCommon } from '@sc/managers/interfaces/i-manager-common';\nimport { OrderShortInfo } from '@sc/orders/classes/order-short-info';\nimport { IOrderShortInfo } from '@sc/orders/interfaces/i-order-short-info';\nimport { DeliveryType } from '@sc/references/classes/delivery-type';\nimport { PartnerGroup } from '@sc/references/classes/partner-group';\nimport { SalesDirection } from '@sc/references/classes/sales-direction';\nimport { IDeliveryType } from '@sc/references/interfaces/i-delivery-type';\nimport { IPartnerGroup } from '@sc/references/interfaces/i-partner-group';\nimport { ISalesDirection } from '@sc/references/interfaces/i-sales-direction';\nimport { NamedIdentity } from '@sc/system/classes/named-identity';\n\n/**\n * Дополнительные данные о клиенте.\n */\nexport class ClientAdditionalData extends NamedIdentity implements IClientAdditionalData {\n /**\n * Список контактов клиента.\n */\n public contacts?: IContactPerson[] = [];\n\n /**\n * Предпочтительный тип доставки.\n */\n public preferredDeliveryType?: IDeliveryType;\n\n /**\n * Список групп партнеров (направлений деятельности), к которым относится клиент.\n */\n public partnerGroups?: IPartnerGroup[] = [];\n\n /**\n * Данные о последнем заказе клиента.\n */\n public lastOrder?: IOrderShortInfo;\n\n /**\n * Направление продаж.\n */\n public salesDirection?: ISalesDirection;\n\n /**\n * Список менеджеров.\n */\n public managers?: IManagerCommon[];\n\n /**\n * Инициализирует экземпляр класса {@link ClientAdditionalData}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data: IClientAdditionalData) {\n super(data);\n\n if (data.contacts?.length) {\n this.contacts = data.contacts.map((c) => new ContactPerson(c));\n }\n\n if (data.lastOrder) {\n this.lastOrder = new OrderShortInfo(data.lastOrder);\n }\n\n if (data.partnerGroups?.length) {\n this.partnerGroups = data.partnerGroups.map((g) => new PartnerGroup(g));\n }\n\n if (data.preferredDeliveryType) {\n this.preferredDeliveryType = new DeliveryType(data.preferredDeliveryType);\n }\n\n if (data.salesDirection) {\n this.salesDirection = new SalesDirection(data.salesDirection);\n }\n\n if (data.managers) {\n this.managers = data.managers.map((g) => new ManagerCommon(g));\n }\n }\n}\n","import { IPaginationRequestParams } from '@sc/data-table/interfaces/i-pagination-request-params';\n\n/**\n * Данные о пагинации записей таблицы.\n */\nexport class DataTablePaginationRequestParams implements IPaginationRequestParams {\n /**\n * Номер текущей страницы.\n */\n public page = 1;\n\n /**\n * Количество записей на странице.\n */\n public pageSize = 50;\n\n /**\n * Инициализирует экземпляр класса {@link DataTablePaginationRequestParams}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IPaginationRequestParams) {\n this.page = data?.page ?? 1;\n this.pageSize = data?.pageSize ?? 50;\n }\n}\n","import { DataTablePaginationRequestParams } from '@sc/data-table/classes/data-table-pagination-request-params';\nimport { IPagination } from '@sc/data-table/interfaces/i-pagination';\n\n/**\n * Данные о пагинации записей таблицы.\n */\nexport class DataTablePagination extends DataTablePaginationRequestParams implements IPagination {\n /**\n * Количество записей в таблице.\n */\n public itemCount = 0;\n\n /**\n * Число страниц с данными.\n */\n public pageCount = 1;\n\n /**\n * Число отображаемых номеров страниц.\n */\n public pageSlot = 5;\n\n /**\n * Значения для выпадающего списка \"Количество записей на странице\".\n */\n public pageSizes = [25, 50, 100];\n\n /**\n * Признак необходимости отображать список выбора числа отображаемых записей.\n */\n public showSizePicker = true;\n\n /**\n * Инициализирует экземпляр класса {@link DataTablePagination}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IPagination) {\n super(data);\n\n this.itemCount = data?.itemCount ?? 0;\n this.pageCount = data?.pageCount ?? 1;\n this.pageSlot = data?.pageSlot ?? 5;\n this.pageSizes = data?.pageSizes ?? [25, 50, 100];\n this.showSizePicker = data?.showSizePicker ?? true;\n }\n}\n","import { ISortRequestParams } from '@sc/data-table/interfaces/i-sort-request-params';\n\n/**\n * Данные о сортировке записей таблицы.\n */\nexport class DataTableSortRequestParams implements ISortRequestParams {\n /**\n * Поле по которому необходимо выполнить сортировку\n */\n public field: string;\n\n /**\n * Направление сортировки.\n */\n public direction: 'asc' | 'desc';\n\n /**\n * Инициализирует экземпляр класса {@link ISortRequestParams}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: ISortRequestParams) {\n this.field = data?.field ?? '';\n this.direction = data?.direction ?? 'asc';\n }\n}\n","/* eslint-disable @typescript-eslint/no-unnecessary-condition,@typescript-eslint/no-unsafe-argument,@typescript-eslint/prefer-promise-reject-errors,@typescript-eslint/use-unknown-in-catch-callback-variable,vue/max-len */\n\nimport { BankAccount } from '@sc/clients/classes/bank-account';\nimport { Client } from '@sc/clients/classes/client';\nimport { ClientAdditionalData } from '@sc/clients/classes/client-additional-data';\nimport { ClientShortInfo } from '@sc/clients/classes/client-short-info';\nimport { ContragentFactory } from '@sc/clients/classes/contragent/contragent-factory';\nimport { DeliveryAddress } from '@sc/clients/classes/delivery-address';\nimport { ClientsAdditionalDataRequestTypeEnum, OpfEnum } from '@sc/clients/enums';\nimport { IContragentBase } from '@sc/clients/interfaces/contragent/i-contragent-base';\nimport { IContragentIc } from '@sc/clients/interfaces/contragent/i-contragent-ic';\nimport { IContragentUlNr } from '@sc/clients/interfaces/contragent/i-contragent-ul-nr';\nimport { IContragentUlR } from '@sc/clients/interfaces/contragent/i-contragent-ul-r';\nimport { IBankAccount } from '@sc/clients/interfaces/i-bank-account';\nimport { IClient } from '@sc/clients/interfaces/i-client';\nimport { IClientAdditionalData } from '@sc/clients/interfaces/i-client-additional-data';\nimport { IClientShortInfo } from '@sc/clients/interfaces/i-client-short-info';\nimport { IDeliveryAddress } from '@sc/clients/interfaces/i-delivery-address';\nimport { ContactPerson } from '@sc/contacts/classes/contact-person';\nimport { ContactPersonRelated } from '@sc/contacts/classes/contact-person-related';\nimport { IContactPerson } from '@sc/contacts/interfaces/i-contact-person';\nimport { IContactPersonRelated } from '@sc/contacts/interfaces/i-contact-person-related';\nimport { FilterOpEnum } from '@sc/data-table';\nimport { IFilterGroup } from '@sc/data-table/interfaces/i-filter-group';\nimport { IPaginationRequestParams } from '@sc/data-table/interfaces/i-pagination-request-params';\nimport { ISortRequestParams } from '@sc/data-table/interfaces/i-sort-request-params';\nimport { IManagerCommon } from '@sc/managers/interfaces';\nimport { IPaginatedResponse } from '@sc/pagination/interfaces';\nimport { BasePaginationProvider } from '@sc/pagination/providers/base-pagination-provider';\nimport { ICuratedDirection } from '@sc/references';\nimport { IFieldValidationResultData } from '@sc/validation/interfaces';\n\n/**\n * Предоставляет механизмы получения/управления данными о клиенте.\n */\nexport class ClientDataProvider extends BasePaginationProvider {\n /**\n * Преобразует данные о клиенте в данные требуемые для запроса.\n *\n * @param client Данные о клиенте.\n */\n protected static transformClientDataToRequest(client: IClient): Record<string, unknown> {\n const data: Record<string, unknown> = {\n name: client.name,\n alternative_name: client.alternativeName,\n partner_groups: client.partnerGroups.map((pg) => pg.id),\n phone: client.phone,\n email: client.email,\n city_id: client.city.id,\n get_news: client.getNews,\n channel_primary_interest_id: client.channelPrimaryInterest.id,\n source_primary_interest_id: client.sourcePrimaryInterest.id,\n primary_demand: client.primaryDemand,\n is_excluded_from_ms_calls_to_clients: client.isExcludedFromMsCallsToClients,\n preferred_warehouse_id: client.preferredWarehouse?.id,\n };\n\n if (client.isExcludedFromMsCallsToClients) {\n data.reason_excluded_from_ms_calls_to_clients = client.reasonExcludedFromMsCallsToClients;\n }\n\n return data;\n }\n\n /**\n * Преобразует данные о контрагенте клиента в данные требуемые для запроса.\n *\n * @param contragent Данные о контрагенте клиента.\n */\n protected static transformContragentClientDataToRequest(contragent: IContragentBase): Record<string, unknown> {\n let data: Record<string, unknown>;\n const contragentIc = contragent as IContragentIc;\n const contragentUlR = contragent as IContragentUlR;\n const contragentUlNr = contragent as IContragentUlNr;\n\n switch (contragent.opf.slug) {\n case OpfEnum.Ic:\n data = {\n opf: contragentIc.opf.slug,\n name: contragentIc.name,\n alternative_name: contragentIc.alternativeName,\n partner_group_id: contragentIc.partnerGroup?.id,\n manager_id: contragentIc.manager?.id,\n comment: contragentIc.comment,\n inn: contragentIc.inn,\n okpo: contragentIc.okpo,\n director_name: contragentIc.directorName,\n director_position: contragentIc.directorPosition,\n director_acts_on: contragentIc.directorActsOn,\n legal_address: contragentIc.legalAddress,\n postal_address: contragentIc.postalAddress,\n actual_address: contragentIc.actualAddress,\n };\n break;\n case OpfEnum.UlR:\n data = {\n opf: contragentUlR.opf.slug,\n name: contragentUlR.name,\n alternative_name: contragentUlR.alternativeName,\n partner_group_id: contragentUlR.partnerGroup?.id,\n manager_id: contragentUlR.manager?.id,\n comment: contragentUlR.comment,\n inn: contragentUlR.inn,\n kpp: contragentUlR.kpp,\n okpo: contragentUlR.okpo,\n director_name: contragentUlR.directorName,\n director_position: contragentUlR.directorPosition,\n director_acts_on: contragentUlR.directorActsOn,\n legal_address: contragentUlR.legalAddress,\n postal_address: contragentUlR.postalAddress,\n actual_address: contragentUlR.actualAddress,\n };\n break;\n case OpfEnum.UlNr:\n data = {\n opf: contragentUlNr.opf.slug,\n name: contragentUlNr.name,\n alternative_name: contragentUlNr.alternativeName,\n partner_group_id: contragentUlNr.partnerGroup?.id,\n manager_id: contragentUlNr.manager?.id,\n comment: contragentUlNr.comment,\n director_name: contragentUlNr.directorName,\n director_position: contragentUlNr.directorPosition,\n director_acts_on: contragentUlNr.directorActsOn,\n legal_address: contragentUlNr.legalAddress,\n postal_address: contragentUlNr.postalAddress,\n actual_address: contragentUlNr.actualAddress,\n registration_country_id: contragentUlNr.registrationCountry.id,\n registration_number: contragentUlNr.registrationNumber,\n tax_number: contragentUlNr.taxNumber || undefined,\n };\n break;\n default:\n data = {\n opf: contragent.opf.slug,\n name: contragent.name,\n alternative_name: contragent.alternativeName,\n partner_group_id: contragent.partnerGroup?.id,\n manager_id: contragent.manager?.id,\n comment: contragent.comment,\n };\n break;\n }\n\n return data;\n }\n\n /**\n * Преобразует данные об адресе доставки клиенту в данные требуемые для запроса.\n *\n * @param deliveryAddress Данные об адресе доставки клиенту.\n */\n protected static transformClientDeliveryAddressToRequest(deliveryAddress: IDeliveryAddress): Record<string, unknown> {\n const data: Record<string, unknown> = {\n address: deliveryAddress.address,\n is_one_time: deliveryAddress.isOneTime ?? false,\n is_transport_company_address: deliveryAddress.isTransportCompanyAddress ?? false,\n comment: deliveryAddress.comment ?? '',\n };\n\n if (deliveryAddress.coordinates) {\n data.coordinates = {\n lat: deliveryAddress.coordinates?.lat,\n long: deliveryAddress.coordinates?.long,\n };\n }\n\n if (deliveryAddress.operatingHours) {\n data.operating_hours = {\n from: deliveryAddress.operatingHours.from,\n to: deliveryAddress.operatingHours.to,\n };\n }\n\n return data;\n }\n\n /**\n * Преобразует данные о банковских реквизитах контрагента в данные требуемые для запроса.\n *\n * @param bankAccount Данные о банковских реквизитах контрагента.\n */\n protected static transformClientContragentBankAccountToRequest(bankAccount: IBankAccount): Record<string, unknown> {\n return {\n bank_name: bankAccount.bankName,\n bic: bankAccount.bic,\n account_number: bankAccount.accountNumber,\n correspondent_account: bankAccount.correspondentAccount,\n currency_id: bankAccount.currency.id,\n };\n }\n\n /**\n * Возвращает данные об указанном клиенте.\n *\n * @param id Идентификатор клиента для которого необходимо получить данные.\n * @see /doc/api/internal#/Клиенты/api_internal_client_get_full_info\n */\n public getClient(id: number): Promise<IClient> {\n return this.get<IClient>(`/internal/clients/${id}`, {}, (response) => new Client(response.data));\n }\n\n /**\n * Возвращает данные о клиентах, удовлетворяющих указанным параметрам поиска.\n *\n * @param filters Параметры фильтрации данных.\n * @param sortParams Параметры сортировки.\n * @param paginationParams Параметры пагинации.\n * @param extraParams Дополнительные параметры запроса.\n *\n * @see /doc/api/internal#/Клиенты/api_internal_client_get_list\n */\n public getClientsList(\n filters?: IFilterGroup,\n sortParams?: ISortRequestParams[],\n paginationParams?: IPaginationRequestParams,\n extraParams?: object\n ): Promise<IPaginatedResponse<IClientShortInfo>> {\n return this.getPaginated<IClientShortInfo>('/internal/clients', filters, sortParams, paginationParams, extraParams, (response) => {\n const result = { ...response.data };\n\n result.data = result.data.map((clientData: IClientShortInfo) => new ClientShortInfo(clientData));\n\n return result;\n });\n }\n\n /**\n * Возвращает список клиентов с указанным телефонным номером.\n *\n * @param phone Телефонный номер по которому следует искать клиентов.\n */\n // eslint-disable-next-line class-methods-use-this\n public getClientByPhone(phone: string): Promise<IPaginatedResponse<IClientShortInfo>> {\n return this.getClientsList({\n groupOp: 'and',\n groups: [],\n filters: [{ field: 'phone', op: FilterOpEnum.Contains, value: phone }],\n });\n }\n\n /**\n * Возвращает дополнительные данные об указанных клиентах.\n *\n * @param clients Список данных о клиентах, для которых необходимо получить дополнительные данные.\n * @param dataTypes Список данных которые необходимо вернуть.\n * @see /doc/api/internal#/Клиенты/api_internal_client_get_additional_data_for_clients_list\n */\n public getAdditionalClientsData(\n clients: IClientShortInfo[],\n dataTypes: Array<ClientsAdditionalDataRequestTypeEnum | string>\n ): Promise<Array<IClientAdditionalData | Record<string, unknown>>> {\n const clientIDs = clients.map((client) => client.id);\n\n return this.post<IClientAdditionalData[]>('/internal/clients/additional-data', { clients: clientIDs, requested_data_types: dataTypes }, (response) => {\n let dataList = [] as IClientAdditionalData[];\n\n if (response?.data.length > 0) {\n dataList = response.data.map((item: IClientAdditionalData) => new ClientAdditionalData(item));\n }\n\n return dataList;\n });\n }\n\n /**\n * Возвращает список всех контактных лиц указанного клиента.\n *\n * @param id Идентификатор клиента для которого необходимо получить данные.\n * @see /doc/api/internal#/Контакты/api_internal_client_contact_get_all_contact_list\n */\n public getAllClientContacts(id: number): Promise<IContactPersonRelated[]> {\n return this.get<IContactPersonRelated[]>(`/internal/clients/${id}/contacts/all`, {}, (response) => {\n let contactsList = [] as IContactPersonRelated[];\n\n if (response?.data.length > 0) {\n contactsList = response.data.map((item: IContactPersonRelated) => new ContactPersonRelated(item));\n }\n\n return contactsList;\n });\n }\n\n /**\n * Создаёт нового клиента на основе указанных данных.\n *\n * @param client Данные о клиенте.\n * @param validationFieldResultData Список полей, для которых необходимо установить данные об ошибках валидации в случае ошибок в запросах.\n * @see /doc/api/internal#/Клиенты/api_internal_client_create\n */\n public createClientCommonData(client: IClient, validationFieldResultData: Record<string, IFieldValidationResultData> = {}): Promise<IClient> {\n return this.post<IClient>('/internal/clients', ClientDataProvider.transformClientDataToRequest(client), (response) => new Client(response.data), validationFieldResultData);\n }\n\n /**\n * Обновляет данные указанного клиента.\n *\n * @param client Данные о клиенте.\n * @param validationFieldResultData Список полей, для которых необходимо установить данные об ошибках валидации в случае ошибок в запросах.\n * @see /doc/api/internal#/Клиенты/api_internal_client_change\n */\n public updateClientCommonData(client: IClient, validationFieldResultData: Record<string, IFieldValidationResultData> = {}): Promise<void> {\n return this.patch(`/internal/clients/${client.id}`, ClientDataProvider.transformClientDataToRequest(client), undefined, validationFieldResultData);\n }\n\n /**\n * Обновляет данные \"Не беспокоить\" указанного клиента.\n *\n * @param client Данные о клиенте.\n * @param validationFieldResultData Список полей, для которых необходимо установить данные об ошибках валидации в случае ошибок в запросах.\n * @see /doc/api/internal#/Клиенты/api_internal_client_change\n */\n public updateClientNotDistribCommonData(client: IClient, validationFieldResultData: Record<string, IFieldValidationResultData> = {}): Promise<void> {\n const data: Record<string, unknown> = {\n get_news: client.getNews,\n is_excluded_from_ms_calls_to_clients: client.isExcludedFromMsCallsToClients,\n };\n\n if (client.isExcludedFromMsCallsToClients) {\n data.reason_excluded_from_ms_calls_to_clients = client.reasonExcludedFromMsCallsToClients;\n }\n\n return this.patch(`/internal/clients/${client.id}`, data, undefined, validationFieldResultData);\n }\n\n /**\n * Изменяет пароль клиента.\n *\n * @param clientId Идентификатор клиента которому необходимо поменять пароль.\n * @param password Новый пароль.\n * @param passwordConfirm Пароль-подтверждение.\n * @param validationFieldResultData Список полей, для которых необходимо установить данные об ошибках валидации в случае ошибок в запросах.\n * @see /doc/api/internal#/Клиенты/api_internal_client_change\n */\n public changeClientPassword(\n clientId: number,\n password: string,\n passwordConfirm: string,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<void> {\n return this.patch(\n `/internal/clients/${clientId}`,\n {\n password: password,\n password_confirmation: passwordConfirm,\n },\n undefined,\n validationFieldResultData\n );\n }\n\n /**\n * Обновляет комментарий к клиенту.\n *\n * @param client Данные о клиенте.\n * @see /doc/api/internal#/Клиенты/api_internal_client_change\n */\n public updateClientComment(client: IClient): Promise<void> {\n return this.patch(`/internal/clients/${client.id}`, { comment: client.comment });\n }\n\n /**\n * Изменяет статус активности у клиента.\n *\n * @param client Данные о клиенте.\n * @see /doc/api/internal#/Клиенты/api_internal_client_change\n */\n public changeClientActivation(client: IClient): Promise<void> {\n return this.patch(`/internal/clients/${client.id}`, { is_active: client.isActive });\n }\n\n /**\n * Выполняет закрепление указанного клиента за указанными менеджерами.\n *\n * @param clientId Идентификатор клиента, к которому необходимо привязать менеджера.\n * @param managers Список менеджеров клиента.\n *\n * @see /doc/api/internal#/Клиенты/api_internal_client_manager_attach\n */\n public async attachClientToManagers(clientId: number, managers: IManagerCommon[]) {\n const promises = managers.map((m: IManagerCommon) => this.patch(`/internal/clients/${clientId}/managers/${m.id}/attach`, { is_primary: m.isDefault }));\n\n await Promise.all(promises);\n }\n\n /**\n * Выполняет открепление указанного клиента от указанных менеджеров.\n *\n * @param clientId Идентификатор клиента, которого необходимо открепить от менеджера.\n * @param managers Список менеджеров клиента.\n *\n * @see /doc/api/internal#/Клиенты/api_internal_client_manager_detach\n */\n public async detachClientFromManagers(clientId: number, managers: IManagerCommon[]): Promise<void> {\n const promises = managers.map((m: IManagerCommon) => this.patch(`/internal/clients/${clientId}/managers/${m.id}/detach`));\n\n await Promise.all(promises);\n }\n\n /**\n * Закрепляет клиента за указанным куратором.\n *\n * @param clientId Идентификатор клиента, которого необходимо закрепить за куратором.\n * @param curatorId Идентификатор куратора, за которого необходимо закрепить клиента.\n * @param curatedDirection Направление кураторства.\n *\n * @see /doc/api/internal#/Клиенты/api_internal_client_curator_attach\n */\n public attachToCurator(clientId: number, curatorId: number, curatedDirection: ICuratedDirection): Promise<void> {\n return this.patch(`/internal/clients/${clientId}/curators/${curatorId}/attach`, { curated_direction_id: curatedDirection.id });\n }\n\n /**\n * Открепляет клиента от указанного куратора.\n *\n * @param clientId Идентификатор клиента, которого необходимо открепить от куратора.\n * @param curatorId Идентификатор куратора, от которого необходимо открепить клиента.\n * @param curatedDirection Направление кураторства.\n *\n * @see /doc/api/internal#/Клиенты/api_internal_client_curator_detach\n */\n public detachFromCurator(clientId: number, curatorId: number, curatedDirection: ICuratedDirection): Promise<void> {\n return this.patch(`/internal/clients/${clientId}/curators/${curatorId}/detach`, { curated_direction_id: curatedDirection.id });\n }\n\n /**\n * Устанавливает кураторов для указанного клиента.\n * При этом все ранее установленные кураторы будут удалены.\n *\n * @param clientId Идентификатор клиента, для которого необходимо установить кураторов.\n * @param curators Список данных о кураторах.\n *\n * @see /doc/api/internal#/Клиенты/api_internal_client_curator_update_list\n */\n public setCurators(clientId: number, curators: Array<{ curatorId: number; curatedDirection: ICuratedDirection }>): Promise<void> {\n return this.patch(`/internal/clients/${clientId}/curators`, {\n curators: curators.map((curator) => ({\n curator_id: curator.curatorId,\n curated_direction_id: curator.curatedDirection.id,\n })),\n });\n }\n\n /**\n * Создаёт нового контрагента клиента.\n *\n * @param clientId Идентификатор клиента, к которому необходимо привязать контрагента.\n * @param contragent Данные о контрагенте клиента.\n * @param validationFieldResultData Список полей, для которых необходимо установить данные об ошибках валидации в случае ошибок в запросах.\n * @see /doc/api/internal#/Контрагенты/api_internal_client_contragent_create\n */\n public createContragentClientData(\n clientId: number,\n contragent: IContragentBase,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<IContragentBase> {\n return this.post<IContragentBase>(\n `/internal/clients/${clientId}/contragents`,\n ClientDataProvider.transformContragentClientDataToRequest(contragent),\n (response) => ContragentFactory.createInstance(response.data),\n validationFieldResultData\n );\n }\n\n /**\n * Обновляет данные указанного контрагента клиента.\n *\n * @param clientId Идентификатор клиента, к которому привязан контрагент.\n * @param contragent Данные о контрагенте клиента.\n * @param validationFieldResultData Список полей, для которых необходимо установить данные об ошибках валидации в случае ошибок в запросах.\n * @see /doc/api/internal#/Контрагенты/api_internal_client_contragent_update\n */\n public updateContragentClientData(\n clientId: number,\n contragent: IContragentBase,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<IContragentBase> {\n return this.patch<IContragentBase>(\n `/internal/clients/${clientId}/contragents/${contragent.id}`,\n ClientDataProvider.transformContragentClientDataToRequest(contragent),\n (response) => ContragentFactory.createInstance(response.data),\n validationFieldResultData\n );\n }\n\n /**\n * Удаляет указанного контрагента клиента.\n *\n * @param clientId Идентификатор клиента, к которому привязан контрагент.\n * @param contragent Данные о контрагенте клиента.\n * @see /doc/api/internal#/Контрагенты/api_internal_client_contragent_delete\n */\n public deleteClientContragent(clientId: number, contragent: IContragentBase): Promise<void> {\n return this.delete(`/internal/clients/${clientId}/contragents/${contragent.id}`);\n }\n\n /**\n * Создаёт новую запись об адресе доставки клиента.\n *\n * @param clientId Идентификатор клиента, к которому необходимо привязать адрес доставки.\n * @param deliveryAddress Данные об адресе доставки.\n * @param validationFieldResultData Список полей, для которых необходимо установить данные об ошибках валидации в случае ошибок в запросах.\n * @see /doc/api/internal#/Адреса доставки/api_internal_client_delivery_address_create\n */\n public createClientDeliveryAddress(\n clientId: number,\n deliveryAddress: IDeliveryAddress,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<IDeliveryAddress> {\n return this.post<IDeliveryAddress>(\n `/internal/clients/${clientId}/delivery-addresses`,\n ClientDataProvider.transformClientDeliveryAddressToRequest(deliveryAddress),\n (response) => new DeliveryAddress(response.data),\n validationFieldResultData\n );\n }\n\n /**\n * Обновляет данные об адресе доставки клиента.\n *\n * @param clientId Идентификатор клиента, к которому привязан адрес доставки.\n * @param deliveryAddress Данные об адресе доставки.\n * @param validationFieldResultData Список полей, для которых необходимо установить данные об ошибках валидации в случае ошибок в запросах.\n * @see /doc/api/internal#/Адреса доставки/api_internal_client_delivery_address_update\n */\n public updateClientDeliveryAddress(\n clientId: number,\n deliveryAddress: IDeliveryAddress,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<IDeliveryAddress> {\n return this.patch<IDeliveryAddress>(\n `/internal/clients/${clientId}/delivery-addresses/${deliveryAddress.id}`,\n ClientDataProvider.transformClientDeliveryAddressToRequest(deliveryAddress),\n (response) => new DeliveryAddress(response.data),\n validationFieldResultData\n );\n }\n\n /**\n * Удаляет указанный адрес доставки клиента.\n *\n * @param clientId Идентификатор клиента, к которому привязан адрес доставки .\n * @param deliveryAddress Данные об адресе доставки клиента.\n * @see /doc/api/internal#/Адреса доставки/api_internal_client_delivery_address_delete\n */\n public deleteClientDeliveryAddress(clientId: number, deliveryAddress: IDeliveryAddress): Promise<void> {\n return this.delete(`/internal/clients/${clientId}/delivery-addresses/${deliveryAddress.id}`);\n }\n\n /**\n * Создаёт новую запись банковских реквизитов контрагента.\n *\n * @param clientId Идентификатор клиента, к которому необходимо привязать банковские реквизиты.\n * @param contragentId Идентификатор контрагента, к которому необходимо привязать банковские реквизиты.\n * @param bankAccount Данные банковских реквизитов.\n * @param validationFieldResultData Список полей, для которых необходимо установить данные об ошибках валидации в случае ошибок в запросах.\n * @see /doc/api/internal#/Банковские реквизиты/api_internal_client_contragent_bank_accounts_create\n */\n public createContragentBankAccount(\n clientId: number,\n contragentId: number,\n bankAccount: IBankAccount,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<IBankAccount> {\n return this.post<IBankAccount>(\n `/internal/clients/${clientId}/contragents/${contragentId}/bank-accounts`,\n ClientDataProvider.transformClientContragentBankAccountToRequest(bankAccount),\n (response) => new BankAccount(response.data),\n validationFieldResultData\n );\n }\n\n /**\n * Обновляет данные о банковских реквизитах контрагента.\n *\n * @param clientId Идентификатор клиента, к которому необходимо привязать банковские реквизиты.\n * @param contragentId Идентификатор контрагента, к которому необходимо привязать банковские реквизиты.\n * @param bankAccount Данные банковских реквизитов.\n * @param validationFieldResultData Список полей, для которых необходимо установить данные об ошибках валидации в случае ошибок в запросах.\n * @see /doc/api/internal#/Адреса доставки/api_internal_client_delivery_address_update\n */\n public updateContragentBankAccount(\n clientId: number,\n contragentId: number,\n bankAccount: IBankAccount,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<IBankAccount> {\n return this.patch<IBankAccount>(\n `/internal/clients/${clientId}/contragents/${contragentId}/bank-accounts/${bankAccount.id}`,\n ClientDataProvider.transformClientContragentBankAccountToRequest(bankAccount),\n (response) => new BankAccount(response.data),\n validationFieldResultData\n );\n }\n\n /**\n * Удаляет указанные банковские реквизиты контрагента.\n *\n * @param clientId Идентификатор клиента, к которому необходимо привязать банковские реквизиты.\n * @param contragentId Идентификатор контрагента, к которому необходимо привязать банковские реквизиты.\n * @param bankAccount Данные банковских реквизитов.\n * @see /doc/api/internal#/Банковские реквизиты/api_internal_client_contragent_bank_accounts_delete\n */\n public deleteContragentBankAccount(clientId: number, contragentId: number, bankAccount: IBankAccount): Promise<void> {\n return this.delete(`/internal/clients/${clientId}/contragents/${contragentId}/bank-accounts/${bankAccount.id}`);\n }\n\n /**\n * Создаёт новую запись о контактном лице клиента.\n *\n * @param clientId Идентификатор клиента, к которому привязано контактное лицо.\n * @param contactPerson Данные о контактном лице.\n * @param validationFieldResultData Список полей, для которых необходимо установить данные об ошибках валидации в случае ошибок в запросах.\n * @see /doc/api/internal#/Контакты/api_internal_client_contact_create\n */\n public createClientContact(\n clientId: number,\n contactPerson: IContactPerson,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<IContactPerson> {\n return this.createContact(\n clientId,\n contactPerson,\n {\n client: {\n id: clientId,\n is_primary: contactPerson.isPrimary ?? false,\n not_disturb: contactPerson.notDisturb ?? false,\n },\n },\n validationFieldResultData\n );\n }\n\n /**\n * Обновляет данные указанного контактного лица.\n *\n * @param clientId Идентификатор клиента, к которому привязано контактное лицо.\n * @param contactPerson Данные о контактном лице.\n * @param validationFieldResultData Список полей, для которых необходимо установить данные об ошибках валидации в случае ошибок в запросах.\n * @see /doc/api/internal#/Контакты/api_internal_client_contact_change\n */\n public updateClientContact(\n clientId: number,\n contactPerson: IContactPerson,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<IContactPerson> {\n return this.patch<IContactPerson>(\n `/internal/clients/${clientId}/contacts/${contactPerson.id}`,\n {\n name: contactPerson.name,\n position: contactPerson.position,\n phone: contactPerson.phone,\n email: contactPerson.email,\n comment: contactPerson.comment,\n not_disturb: contactPerson.notDisturb,\n },\n (response) => new ContactPerson(response.data),\n validationFieldResultData\n );\n }\n\n /**\n * Устанавливает признак основного контактного лица для клиента.\n *\n * @param clientId Идентификатор клиента, к которому привязано контактное лицо.\n * @param contactPerson Данные о контактном лице.\n * @see /doc/api/internal#/Контакты/api_internal_client_contact_change_is_primary\n */\n public setPrimaryClientContact(clientId: number, contactPerson: IContactPerson): Promise<void> {\n return this.setPrimaryContact(`/internal/clients/${clientId}/contacts/${contactPerson.id}/primary`, contactPerson.isPrimary ?? false);\n }\n\n /**\n * Удаляет связь между указанным контактным лицом и клиентом.\n *\n * @param clientId Идентификатор клиента, к которому привязано контактное лицо.\n * @param contactPerson Данные о контактном лице.\n * @see /doc/api/internal#/Контакты/api_internal_client_contact_client_detach\n */\n public detachClientContact(clientId: number, contactPerson: IContactPerson): Promise<void> {\n return this.detachContact(`/internal/clients/${clientId}/contacts/${contactPerson.id}/detach`);\n }\n\n /**\n * Создаёт новую запись о контактном лице контрагента.\n *\n * @param clientId Идентификатор клиента, к которому привязано контактное лицо.\n * @param contragentId Идентификатор контрагента, к которому привязано контактное лицо.\n * @param contactPerson Данные о контактном лице.\n * @param validationFieldResultData Список полей, для которых необходимо установить данные об ошибках валидации в случае ошибок в запросах.\n * @see /doc/api/internal#/Контакты/api_internal_client_contact_create\n */\n public createContragentContact(\n clientId: number,\n contragentId: number,\n contactPerson: IContactPerson,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<IContactPerson> {\n return this.createContact(\n clientId,\n contactPerson,\n {\n contragents: [\n {\n id: contragentId,\n is_primary: contactPerson.isPrimary ?? false,\n not_disturb: contactPerson.notDisturb ?? false,\n },\n ],\n },\n validationFieldResultData\n );\n }\n\n /**\n * Устанавливает признак основного контактного лица контрагента.\n *\n * @param clientId Идентификатор клиента, к которому привязано контактное лицо.\n * @param contragentId Идентификатор контрагента, к которому привязано контактное лицо.\n * @param contactPerson Данные о контактном лице.\n * @see /doc/api/internal#/Контакты/api_internal_client_contragent_contact_change_is_primary\n */\n public setPrimaryContragentContact(clientId: number, contragentId: number, contactPerson: IContactPerson): Promise<void> {\n return this.setPrimaryContact(`/internal/clients/${clientId}/contragents/${contragentId}/contacts/${contactPerson.id}/primary`, contactPerson.isPrimary ?? false);\n }\n\n /**\n * Удаляет связь между указанным контактным лицом и контрагентом.\n *\n * @param clientId Идентификатор клиента, к которому привязано контактное лицо.\n * @param contragentId Идентификатор контрагента, к которому привязано контактное лицо.\n * @param contactPerson Данные о контактном лице.\n * @see /doc/api/internal#/Контакты/api_internal_client_contragent_contact_detach\n */\n public detachContragentContact(clientId: number, contragentId: number, contactPerson: IContactPerson): Promise<void> {\n return this.detachContact(`/internal/clients/${clientId}/contragents/${contragentId}/contacts/${contactPerson.id}/detach`);\n }\n\n /**\n * Создаёт новую запись о контактном лице адреса доставки.\n *\n * @param clientId Идентификатор клиента, к которому привязано контактное лицо.\n * @param deliveryAddressId Идентификатор контрагента, к которому привязано контактное лицо.\n * @param contactPerson Данные о контактном лице.\n * @param validationFieldResultData Список полей, для которых необходимо установить данные об ошибках валидации в случае ошибок в запросах.\n * @see /doc/api/internal#/Контакты/api_internal_client_contact_create\n */\n public createDeliveryAddressContact(\n clientId: number,\n deliveryAddressId: number,\n contactPerson: IContactPerson,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<IContactPerson> {\n return this.createContact(\n clientId,\n contactPerson,\n {\n addresses: [\n {\n id: deliveryAddressId,\n is_primary: contactPerson.isPrimary ?? false,\n not_disturb: contactPerson.notDisturb ?? false,\n },\n ],\n },\n validationFieldResultData\n );\n }\n\n /**\n * Устанавливает признак основного контактного лица адреса доставки.\n *\n * @param clientId Идентификатор клиента, к которому привязано контактное лицо.\n * @param deliveryAddressId Идентификатор адреса доставки, к которому привязано контактное лицо.\n * @param contactPerson Данные о контактном лице.\n * @see /doc/api/internal#/Контакты/api_internal_client_delivery_address_contact_change_is_primary\n */\n public setPrimaryDeliveryAddressContact(clientId: number, deliveryAddressId: number, contactPerson: IContactPerson): Promise<void> {\n return this.setPrimaryContact(\n `/internal/clients/${clientId}/delivery-addresses/${deliveryAddressId}/contacts/${contactPerson.id}/primary`,\n contactPerson.isPrimary ?? false\n );\n }\n\n /**\n * Удаляет связь между указанным контактным лицом и адресом доставки.\n *\n * @param clientId Идентификатор клиента, к которому привязано контактное лицо.\n * @param deliveryAddressId Идентификатор адреса доставки, к которому привязано контактное лицо.\n * @param contactPerson Данные о контактном лице.\n * @see /doc/api/internal#/Контакты/api_internal_client_delivery_address_contact_detach\n */\n public detachDeliveryAddressContact(clientId: number, deliveryAddressId: number, contactPerson: IContactPerson): Promise<void> {\n return this.detachContact(`/internal/clients/${clientId}/delivery-addresses/${deliveryAddressId}/contacts/${contactPerson.id}/detach`);\n }\n\n /**\n * Создаёт новую запись о контактном лице клиента.\n *\n * @param clientId Идентификатор клиента, к которому привязано контактное лицо.\n * @param contactPerson Данные о контактном лице.\n * @param extraData Дополнительные данные\n * @param validationFieldResultData Список полей, для которых необходимо установить данные об ошибках валидации в случае ошибок в запросах.\n */\n protected createContact(\n clientId: number,\n contactPerson: IContactPerson,\n extraData: object,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<IContactPerson> {\n const data: Record<string, unknown> = {\n name: contactPerson.name,\n position: contactPerson.position,\n comment: contactPerson.comment,\n ...extraData,\n };\n\n if (contactPerson.phone?.length) {\n data.phone = contactPerson.phone;\n }\n\n if (contactPerson.email?.length) {\n data.email = contactPerson.email;\n }\n\n return this.post<IContactPerson>(`/internal/clients/${clientId}/contacts`, data, (response) => new ContactPerson(response.data), validationFieldResultData);\n }\n\n /**\n * Устанавливает признак основного контактного лица.\n *\n * @param url URL изменения флага основного контакта.\n * @param isPrimary Признак, что это основной контакт.\n */\n protected setPrimaryContact(url: string, isPrimary: boolean): Promise<void> {\n return this.patch(url, { is_primary: isPrimary });\n }\n\n /**\n * Удаляет связь с контактным лицом.\n *\n * @param url URL для удаления связи.\n */\n protected detachContact(url: string): Promise<void> {\n return this.patch(url);\n }\n\n /**\n * Отправляет сообщение электронной почты для подтверждения адреса электронной почты.\n *\n * @param client Данные о клиенте.\n * @see /doc/api/public#/Пользователь/api_public_user_verification_email\n */\n public sendClientEmailConfirmation(client: IClient): Promise<void> {\n return this.get(`/internal/clients/${client.id}/verification/email?email=${client.email}`);\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unnecessary-condition,@typescript-eslint/no-unsafe-assignment,@typescript-eslint/prefer-function-type,@typescript-eslint/no-unsafe-argument,@typescript-eslint/prefer-promise-reject-errors,@typescript-eslint/use-unknown-in-catch-callback-variable */\n\nimport { AppConfigProvider } from '@sc/config/providers/app-config-provider';\nimport { HttpRequester } from '@sc/http/classes/http-requester';\nimport { TypedInstanceFactory } from '@sc/system/providers/typed-instance-factory';\nimport { addSeconds } from 'date-fns';\nimport { isEmpty } from 'lodash-es';\n\n/**\n * Предоставляет базовые механизмы для выполнения запросов с возможностью кэширования.\n */\nexport abstract class HttpCachedRequester extends HttpRequester {\n /**\n * Кэш результатов запросов.\n */\n private static responseDataCache: Map<string, { validTo: Date; val: any }> = new Map<string, { validTo: Date; val: any }>();\n\n /**\n * Возвращает кэшированные данные.\n * Если кэшированные данные отсутствуют, то вернет undefined.\n *\n * @param key Ключ запроса.\n */\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters\n protected static getCachedResponse<T = any>(key: string): T | undefined {\n const cachedResponseData = HttpCachedRequester.responseDataCache.get(key);\n\n if (cachedResponseData && cachedResponseData.validTo > new Date()) {\n return cachedResponseData.val as T;\n }\n\n return undefined;\n }\n\n /**\n * Время кэширования данных ответов на запросы (секунд).\n */\n protected readonly responseDataCacheTimeout: number;\n\n /**\n * Инициализирует экземпляр класса {@link HttpCachedRequester}.\n */\n public constructor() {\n super();\n\n this.responseDataCacheTimeout = AppConfigProvider.getConfig().http.responseDataCacheTimeout as number;\n }\n\n /**\n * Сохраняет указанные данные из запроса в кэш результатов.\n *\n * @param url URL запроса.\n * @param data Данные для кэширования.\n */\n protected cacheResponse(url: string, data: any): void {\n HttpCachedRequester.responseDataCache.set(url, {\n validTo: addSeconds(new Date(), this.responseDataCacheTimeout),\n val: data,\n });\n }\n\n /**\n * Возвращает {@link Promise} типизированного результата выполнения запроса.\n *\n * @param type Тип возвращаемых данных.\n * @param url URL запроса для получения данных.\n * @param useResponseDataCache Признак необходимости кэшировать данные ответов на запросы\n * и использовать в случае аналогичных запросов.\n * @param params Дополнительные параметры запроса.\n */\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters\n protected getTypedDataArrayRequester<OutDataInterface, SourceDataInterface>(\n // eslint-disable-next-line no-unused-vars\n type: new (data: SourceDataInterface) => OutDataInterface,\n url: string,\n useResponseDataCache = false,\n params: Record<string, string | number | boolean | Array<string | number | boolean> | object> = {}\n ): Promise<OutDataInterface[]> {\n const cacheKey = url + (isEmpty(params) ? '' : ` >>> ${JSON.stringify(params)}`);\n const cachedResponse = useResponseDataCache ? HttpCachedRequester.getCachedResponse(cacheKey) : undefined;\n\n if (cachedResponse) {\n return Promise.resolve(cachedResponse);\n }\n\n return this.get<SourceDataInterface[]>(url, params).then((data) => {\n const responseData = data.map((value) => TypedInstanceFactory.instanceInitializer(type, value as unknown as SourceDataInterface));\n\n if (useResponseDataCache && responseData) {\n this.cacheResponse(url, responseData);\n }\n\n return responseData;\n });\n }\n}\n","import { HttpRequester } from '@sc/http';\n\n/**\n * Предоставляет механизмы получения данных о неизвестных пользователях.\n */\nexport class UnknownClientDataProvider extends HttpRequester {\n /**\n * Выполняет проверку занят ли указанный номер телефона.\n *\n * @param phone Номер телефона который необходимо проверить.\n */\n public checkPhoneIsBusy(phone: string): Promise<boolean> {\n return new Promise<boolean>((resolve, reject) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.request<Record<string, any>>({ method: 'GET', url: '/public/user/verification/phone/check', params: { phone: phone } })\n .then((result) => {\n resolve(!!result.isBusy);\n })\n .catch(reject);\n });\n }\n}\n","import { ICartItemConfiguratorParamsBase } from '@sc/cart/interfaces/i-cart-item-configurator-params-base';\nimport { Product } from '@sc/catalog/classes/product';\nimport { ICategory } from '@sc/catalog/interfaces/i-category';\nimport { IProduct } from '@sc/catalog/interfaces/i-product';\nimport { IConfiguratorSettingsBase } from '@sc/configurator/interfaces/i-configurator-settings-base';\nimport { IHttpResponseError } from '@sc/http';\nimport { HttpRequester } from '@sc/http/classes/http-requester';\nimport { IFieldValidationResultData } from '@sc/validation/interfaces/i-field-validation-result-data';\n\n/**\n * Предоставляет механизмы получения/управления данными конфигураторов.\n */\nexport class ConfiguratorProvider extends HttpRequester {\n /**\n * Возвращает настройки указанного конфигуратора для указанной категории.\n *\n * @param category Данные о категории.\n *\n * @see /doc/api/internal#/Каталог/api_internal_catalog_categories_configurator_settings\n */\n public getConfiguratorSettings<T extends IConfiguratorSettingsBase>(category: ICategory): Promise<T> {\n return this.get<T>(`internal/catalog/categories/${category.id}/configurators/${category.properties?.configurator}/settings`);\n }\n\n /**\n * Возвращает данные о продукте, который соответствует указанной в запросе конфигурации для указанного конфигуратора.\n *\n * @param category Данные о категории.\n * @param params Параметры конфигуратора для поиска товара.\n * @param validationFieldResultData Список полей, для которых необходимо\n * установить данные об ошибках валидации\n * в случае ошибок в запросах.\n *\n * @see /doc/api/internal#/Каталог/api_internal_catalog_categories_configurator_products_get\n */\n public searchProduct(\n category: ICategory,\n params: ICartItemConfiguratorParamsBase,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<IProduct> {\n const requestPromise = this.get<IProduct>(\n `internal/catalog/categories/${category.id}/configurators/${category.properties?.configurator}/product`,\n { params: params },\n (response) => new Product(response.data)\n );\n\n requestPromise.catch((error: IHttpResponseError) => {\n this.errorResponseHandler(error, validationFieldResultData);\n });\n\n return requestPromise;\n }\n\n /**\n * Создает пользовательский шаблон конфигуратора.\n *\n * @param category Данные о категории.\n * @param newTemplate Параметры конфигуратора для поиска товара.\n * @param validationFieldResultData Список полей, для которых необходимо\n * установить данные об ошибках валидации\n * в случае ошибок в запросах.\n *\n * @see /doc/api/internal#/Каталог/api_internal_catalog_categories_configurator_template_create\n */\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters\n public createTemplate<T extends object>(category: ICategory, newTemplate: T, validationFieldResultData: Record<string, IFieldValidationResultData> = {}): Promise<undefined> {\n return this.post<undefined>(\n `internal/catalog/categories/${category.id}/configurators/${category.properties?.configurator}/template`,\n { ...newTemplate },\n // eslint-disable-next-line lodash/prefer-noop, @typescript-eslint/no-empty-function\n () => {},\n validationFieldResultData\n );\n }\n\n /**\n * Удаляет пользовательский шаблон конфигуратора.\n *\n * @param category Данные о категории.\n * @param templateId Идентификатор записи шаблона.\n *\n * @see /doc/api/internal#/Каталог/api_internal_catalog_categories_configurator_template_delete\n */\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters\n public removeTemplate(category: ICategory, templateId: number): Promise<void> {\n return this.delete(`internal/catalog/categories/${category.id}/configurators/${category.properties?.configurator}/template/${templateId}`);\n }\n}\n","import { IDatePeriod } from '@sc/system/interfaces/i-date-period';\nimport { addBusinessDays, endOfDay, endOfToday, endOfTomorrow, endOfYesterday, startOfDay, startOfToday, startOfTomorrow, startOfYesterday } from 'date-fns';\n\n/**\n * Провайдер даты и времени.\n */\nexport class DateTimeProvider {\n /**\n * Возвращает диапазон дат по умолчанию.\n */\n public static defaultDateRanges(): Record<\n string,\n IDatePeriod & {\n /**\n * Текстовое описание.\n */\n label: string;\n }\n > {\n // Прибавляем 1 рабочий день к текущей дате, чтобы получить следующий рабочий день.\n const nextWorkingDay = addBusinessDays(new Date(), 1);\n\n return {\n // 'Следующий рабочий день' - это значение по-умолчанию\n nextWorkingDay: { label: 'Следующий рабочий день', from: startOfDay(nextWorkingDay), to: endOfDay(nextWorkingDay) },\n today: { label: 'Сегодня', from: startOfToday(), to: endOfToday() },\n yesterday: { label: 'Вчера', from: startOfYesterday(), to: endOfYesterday() },\n tomorrow: { label: 'Завтра', from: startOfTomorrow(), to: endOfTomorrow() },\n };\n }\n}\n","import { IProduct } from '@sc/catalog/interfaces/i-product';\n\n/**\n * Класс-помощник для работы со значениями единиц измерения товара.\n */\n\nexport class UnitsHelper {\n /**\n * Список единиц измерения линейной величины.\n */\n private static linearValues: string[] = ['пог.м.', 'м.', 'м2'];\n\n /**\n * Устанавливает список единиц измерения линейной величины.\n *\n * @param linearValues Список единиц измерения линейной величины.\n */\n public static setLinearValues(linearValues: string[]) {\n UnitsHelper.linearValues = linearValues;\n }\n\n /**\n * Возвращает признак, что указанный товар имеет линейную единицу измерения.\n *\n * @param product Данные о товаре для которого нужно проверить линейность его единицы измерения.\n */\n public static productIsMeasurable(product: IProduct): boolean {\n return UnitsHelper.linearValues.includes(product.unit);\n }\n\n /**\n * Возвращает кратность количества для указанного товара.\n *\n * @param product Данные о товаре для которого необходимо вернуть кратность количества.\n */\n public static getProductMultiplicity(product: IProduct): number {\n return !product.properties?.ignoreMinCountCheck && product.properties?.minCount && !UnitsHelper.productIsMeasurable(product) ? product.properties.minCount : 1;\n }\n\n /**\n * Возвращает кратность длины для указанного товара.\n *\n * @param product Данные о товаре для которого необходимо вернуть кратность длины.\n */\n public static getProductLengthMultiplicity(product: IProduct): number {\n if (product.properties?.lengthStep) {\n return product.properties.lengthStep;\n }\n\n return !product.properties?.ignoreMinCountCheck && product.properties?.minCount ? product.properties.minCount : 0.01;\n }\n}\n","import { Manager } from '@sc/managers/classes/manager';\nimport { IManager } from '@sc/managers/interfaces/i-manager';\n\n/**\n * Содержит механизмы генерации данных о менеджере.\n */\nexport class ManagerDataFactory {\n /**\n * Генерирует и возвращает данные-заглушку неопределённого менеджера.\n */\n public static generateUndefinedManagerInstance(): IManager {\n return new Manager({ id: 0, name: '- Не назначен -', isActive: true, guid: '-undefined-' } as IManager);\n }\n\n /**\n * Выполняет проверку, является ли указанная запись записью-заглушкой с данными о неопределённом менеджере.\n *\n * @param manager Запись для проверки.\n */\n public static isUndefinedManagerInstance(manager: IManager): boolean {\n return manager.id === 0 && manager.guid === '-undefined-';\n }\n}\n","import { HttpCachedRequester } from '@sc/http/classes/http-cached-requester';\nimport { Manager } from '@sc/managers/classes/manager';\nimport { IManager } from '@sc/managers/interfaces/i-manager';\nimport { IPaginatedResponse } from '@sc/pagination/interfaces/i-paginated-response';\nimport { TypedInstanceFactory } from '@sc/system/providers/typed-instance-factory';\n\n/**\n * Предоставляет механизмы получения/управления данными о пользователях.\n */\nexport class ManagerDataProvider extends HttpCachedRequester {\n /**\n * Возвращает {@link Promise} для получения справочника списка менеджеров.\n */\n public async getManagers(): Promise<IManager[]> {\n const url = '/internal/managers';\n const cachedResponse = HttpCachedRequester.getCachedResponse<IManager[]>(url);\n\n if (cachedResponse) {\n return cachedResponse;\n }\n\n const data = await this.get<IPaginatedResponse<IManager>>(url);\n const responseData = data.data.map((value) => TypedInstanceFactory.instanceInitializer(Manager, value));\n\n this.cacheResponse(url, responseData);\n\n return responseData;\n }\n}\n","/* eslint-disable @typescript-eslint/no-unnecessary-condition */\n\nimport { ClientShortInfo } from '@sc/clients/classes/client-short-info';\nimport { DeliveryAddress } from '@sc/clients/classes/delivery-address';\nimport { IClientShortInfo } from '@sc/clients/interfaces/i-client-short-info';\nimport { OrderShortInfo } from '@sc/orders/classes/order-short-info';\nimport { IOrderInfo } from '@sc/orders/interfaces/i-order-info';\nimport { SalesDirection } from '@sc/references/classes/sales-direction';\nimport { Warehouse } from '@sc/references/classes/warehouse';\nimport { ISalesDirection } from '@sc/references/interfaces/i-sales-direction';\nimport { UserShortInfo } from '@sc/user/classes/user-short-info';\nimport { IUserShortInfo } from '@sc/user/interfaces/i-user-short-info';\nimport { parseISO } from 'date-fns';\nimport { isString } from 'lodash-es';\n\n/**\n * Краткие данные о заказе.\n */\nexport class OrderInfo extends OrderShortInfo implements IOrderInfo {\n /**\n * Краткие данные о клиенте.\n */\n public client: IClientShortInfo;\n\n /**\n * Данные об оплате заказа.\n */\n public payment: IOrderInfo['payment'];\n\n /**\n * Данные о доставке заказа.\n */\n public delivery: IOrderInfo['delivery'];\n\n /**\n * Краткие данные о пользователе, за которым закреплен заказ.\n */\n public attachedUser?: IUserShortInfo;\n\n /**\n * Идентификатор статуса заказа.\n */\n public status: number;\n\n /**\n * Направление продаж заказа.\n */\n public salesDirection: ISalesDirection;\n\n /**\n * Дата и время начала обработки заказа.\n */\n public pendingAt?: Date;\n\n /**\n * Дата и время завершения обработки заказа.\n */\n public processedAt?: Date;\n\n /**\n * Признак того, что заказ создан из товаров, которые имеют признак \"Под заказ\".\n */\n public isOnOrder: boolean;\n\n /**\n * Признак того, что заказ создан из товаров, которые имеют признак \"Нет в наличии\".\n */\n public isNotInStock: boolean;\n\n /**\n * Инициализирует экземпляр класса {@link OrderInfo}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IOrderInfo>) {\n super(data);\n\n this.client = new ClientShortInfo(data?.client);\n this.payment = {\n type: data?.payment?.type ?? -1,\n status: data?.payment?.status ?? -1,\n onlinePaymentLink: data?.payment?.onlinePaymentLink,\n };\n this.delivery = {\n type: data?.delivery?.type ?? -1,\n date: isString(data?.delivery?.date) ? parseISO(data.delivery.date) : (data?.delivery?.date ?? new Date()),\n address: data?.delivery?.address ? new DeliveryAddress(data.delivery.address) : undefined,\n warehouse: data?.delivery?.warehouse ? new Warehouse(data.delivery.warehouse) : undefined,\n };\n this.attachedUser = new UserShortInfo(data?.attachedUser);\n this.status = data?.status ?? 0;\n this.salesDirection = new SalesDirection(data?.salesDirection);\n this.pendingAt = isString(data?.pendingAt) ? parseISO(data.pendingAt) : data?.pendingAt;\n this.processedAt = isString(data?.processedAt) ? parseISO(data.processedAt) : data?.processedAt;\n\n this.isOnOrder = data?.isOnOrder ?? false;\n this.isNotInStock = data?.isNotInStock ?? false;\n }\n}\n","import { ICartItemConfiguratorParamsBase } from '@sc/cart/interfaces/i-cart-item-configurator-params-base';\nimport { ClientProduct } from '@sc/catalog/classes/client-product';\nimport { IClientProduct } from '@sc/catalog/interfaces/i-client-product';\nimport { IOrderProduct } from '@sc/orders/interfaces/i-order-product';\nimport { Identity } from '@sc/system/classes/identity';\n\n/**\n * Данные о продукте заказа.\n */\nexport class OrderProduct extends Identity implements IOrderProduct {\n /**\n * Данные о продукте.\n */\n public product: IClientProduct;\n\n /**\n * Количество товара/услуги.\n */\n public quantity: number;\n\n /**\n * Валюта товара или услуги.\n */\n public currency: string;\n\n /**\n * Стоимость единицы товара или услуги в валюте.\n */\n public costOne: number;\n\n /**\n * Стоимость единицы товара или услуги в рублях.\n */\n public costOneRub: number;\n\n /**\n * Итоговая стоимость товара или услуги в валюте.\n */\n public cost: number;\n\n /**\n * Итоговая стоимость товара или услуги в рублях.\n */\n public costRub: number;\n\n /**\n * Описание позиции.\n */\n public marker?: string;\n\n /**\n * Высота товара.\n */\n public height?: number;\n\n /**\n * Длина товара.\n */\n public length?: number;\n\n /**\n * Ширина товара.\n */\n public width?: number;\n\n /**\n * Идентификатор логической группы товаров/услуг.\n */\n public logicGroupId?: string;\n\n /**\n * Направление продаж.\n */\n public salesDirection?: number;\n\n /**\n * URL изображения со спецификацией.\n */\n public specificationImgUrl?: string;\n\n /**\n * Название (slug) конфигуратора.\n */\n public configurator?: string;\n\n /**\n * Параметры введенные в конфигуратор, при добавлении позиции в корзину.\n */\n public configuratorParams?: ICartItemConfiguratorParamsBase;\n\n /**\n * Вариант продольного распила.\n *\n * В качестве значения указывается ширина продукта,\n * а в качестве ключа указывается код продукта,\n * который соответствует указанной ширине. Количество не ограничено.\n */\n public sawing?: Record<string, number>;\n\n /**\n * Инициализирует экземпляр класса {@link OrderProduct}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data: IOrderProduct) {\n super(data);\n\n this.product = new ClientProduct(data.product);\n this.quantity = data.quantity;\n this.currency = data.currency;\n this.costOne = data.costOne;\n this.costOneRub = data.costOneRub;\n this.cost = data.cost;\n this.costRub = data.costRub;\n this.marker = data.marker;\n this.height = data.height;\n this.length = data.length;\n this.width = data.width;\n this.logicGroupId = data.logicGroupId;\n this.salesDirection = data.salesDirection;\n this.specificationImgUrl = data.specificationImgUrl;\n this.configurator = data.configurator;\n this.configuratorParams = data.configuratorParams;\n this.sawing = data.sawing;\n }\n}\n","import { ContragentFactory } from '@sc/clients/classes/contragent/contragent-factory';\nimport { IContragentIc } from '@sc/clients/interfaces/contragent/i-contragent-ic';\nimport { IContragentPerson } from '@sc/clients/interfaces/contragent/i-contragent-person';\nimport { IContragentUlNr } from '@sc/clients/interfaces/contragent/i-contragent-ul-nr';\nimport { IContragentUlR } from '@sc/clients/interfaces/contragent/i-contragent-ul-r';\nimport { OrderInfo } from '@sc/orders/classes/order-info';\nimport { OrderProduct } from '@sc/orders/classes/order-product';\nimport { IOrder } from '@sc/orders/interfaces/i-order';\nimport { IOrderProduct } from '@sc/orders/interfaces/i-order-product';\nimport { Reference } from '@sc/system/classes/reference';\nimport { IReference } from '@sc/system/interfaces/i-reference';\n\n/**\n * Данные о заказе.\n */\nexport class Order extends OrderInfo implements IOrder {\n /**\n * Список продуктов заказа.\n */\n public products: IOrderProduct[];\n\n /**\n * Список счетов заказа.\n */\n public invoices?: string[];\n\n /**\n * Комментарий клиента к заказу.\n */\n public comment?: string;\n\n /**\n * Изображение, прикрепленное к заказу клиентом во время создания.\n */\n public image?: string;\n\n /**\n * Данные о контрагенте.\n */\n public contragent?: IContragentPerson | IContragentIc | IContragentUlR | IContragentUlNr;\n\n /**\n * Штрих-код заказа.\n */\n public barcode?: string;\n\n /**\n * Данные об источнике заказа.\n */\n public orderSource?: IReference;\n\n /**\n * Признак, что разрешена передача заказа в работу без оплаты.\n */\n public isAllowProcessingWithoutPayment?: boolean;\n\n /**\n * Инициализирует экземпляр класса {@link Order}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data: Partial<IOrder>) {\n super(data);\n\n this.products = (data.products ?? []).map((product) => new OrderProduct(product));\n this.invoices = data.invoices ?? [];\n this.comment = data.comment;\n this.image = data.image;\n this.contragent = data.contragent ? ContragentFactory.createInstance(data.contragent) : undefined;\n this.barcode = data.barcode;\n this.orderSource = data.orderSource ? new Reference(data.orderSource) : undefined;\n this.isAllowProcessingWithoutPayment = data.isAllowProcessingWithoutPayment;\n }\n}\n","/* eslint-disable @typescript-eslint/no-unnecessary-condition,@typescript-eslint/no-unsafe-argument,@typescript-eslint/prefer-promise-reject-errors,@typescript-eslint/use-unknown-in-catch-callback-variable,vue/max-len */\n\nimport { IFilterGroup } from '@sc/data-table/interfaces/i-filter-group';\nimport { IPaginationRequestParams } from '@sc/data-table/interfaces/i-pagination-request-params';\nimport { ISortRequestParams } from '@sc/data-table/interfaces/i-sort-request-params';\nimport { Order } from '@sc/orders/classes/order';\nimport { OrderInfo } from '@sc/orders/classes/order-info';\nimport { IClientOrderStatistics } from '@sc/orders/interfaces/i-client-order-statistics';\nimport { IOrder } from '@sc/orders/interfaces/i-order';\nimport { IOrderInfo } from '@sc/orders/interfaces/i-order-info';\nimport { IPaginatedResponse } from '@sc/pagination/interfaces';\nimport { BasePaginationProvider } from '@sc/pagination/providers/base-pagination-provider';\nimport { IDatePeriod } from '@sc/system/interfaces/i-date-period';\n\n/**\n * Предоставляет механизмы получения/управления данными о заказах.\n */\nexport class OrdersDataProvider extends BasePaginationProvider {\n /**\n * Возвращает данные о заказах, удовлетворяющих указанным параметрам поиска.\n *\n * @param filters Параметры фильтрации данных.\n * @param sortParams Параметры сортировки.\n * @param paginationParams Параметры пагинации.\n *\n * @see /doc/api/internal#/Заказы/api_internal_orders_get_list\n */\n public getOrders(filters?: IFilterGroup, sortParams?: ISortRequestParams, paginationParams?: IPaginationRequestParams): Promise<IPaginatedResponse<IOrderInfo>> {\n return this.getPaginated<IOrderInfo>('/internal/orders', filters, sortParams ? [sortParams] : undefined, paginationParams, {}, (response) => {\n const result = { ...response.data };\n\n result.data = result.data.map((item: IOrderInfo) => new OrderInfo(item));\n\n return result;\n });\n }\n\n /**\n * Возвращает данные о количестве и сумме заказов клиента помесячно, с возможностью ограничения периода.\n *\n * @param clientId Идентификатор клиента для которого необходимо вернуть данные.\n * @param period Период, за который запрашивается статистика.\n */\n public getClientOrderStatistics(clientId: number, period?: IDatePeriod): Promise<IClientOrderStatistics> {\n return this.get<IClientOrderStatistics>(`/internal/clients/${clientId}/orders/statistics`, period ? { period: period } : {});\n }\n\n /**\n * Возвращает данные заказа с указанным идентификатором.\n *\n * @param orderId Идентификатор заказа для которого необходимо вернуть данные.\n */\n public getOrder(orderId: number): Promise<IOrder> {\n return this.get<IOrder>(`/internal/orders/${orderId}`, {}, (response) => new Order(response.data));\n }\n}\n","import { Product } from '@sc/catalog/classes/product';\nimport { CostSourceEnum } from '@sc/catalog/enums/cost-source-enum';\nimport { IProduct } from '@sc/catalog/interfaces/i-product';\nimport { ClientShortInfo } from '@sc/clients/classes/client-short-info';\nimport { IClientShortInfo } from '@sc/clients/interfaces/i-client-short-info';\nimport { IPriceAnalyze } from '@sc/price-analyze/interfaces/i-price-analyze';\n\n/**\n * Результат анализа цен.\n */\nexport class PriceAnalyze implements IPriceAnalyze {\n /**\n * Краткие данные о клиенте.\n */\n public client: IClientShortInfo;\n\n /**\n * Базовые данные о продукте.\n */\n public product: IProduct;\n\n /**\n * Стоимость товара или услуги.\n */\n public cost: number;\n\n /**\n * Коэффициент стоимости продукта от розничной цены.\n */\n public costCoefficient: number;\n\n /**\n * Источник клиентской цены.\n */\n public source: CostSourceEnum;\n\n /**\n * Инициализирует экземпляр класса {@link PriceAnalyze}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IPriceAnalyze) {\n this.client = new ClientShortInfo(data?.client);\n this.product = new Product(data?.product);\n this.cost = data?.cost ?? 0;\n this.costCoefficient = data?.costCoefficient ?? 0;\n this.source = data?.source ?? CostSourceEnum.Product;\n }\n}\n","import { IPriceAnalyzeFilters } from '@sc/price-analyze/interfaces/i-price-analyze-filters';\nimport { isArray, isEmpty, isNil, isObject, omitBy } from 'lodash-es';\n\n/**\n * Конвертирует параметры фильтрации в валидные параметры запроса.\n *\n * @param filters Параметры фильтрации.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const convertPriceAnalyzeFilters = (filters?: IPriceAnalyzeFilters): Record<string, any> => {\n if (!filters) {\n return {};\n }\n\n return omitBy(\n {\n cities: filters.cities?.map((city) => city.id),\n clients: filters.clients?.map((client) => client.id),\n managers: filters.managers?.map((manager) => manager.id),\n partnerGroups: filters.partnerGroups?.map((partnerGroup) => partnerGroup.id),\n salesDirections: filters.salesDirections?.map((salesDirection) => salesDirection.id),\n hideNotActive: filters.hideNotActive,\n },\n (value) => isNil(value) || ((isArray(value) || isObject(value)) && isEmpty(value))\n );\n};\n","import { IPriceAnalyzeParameter } from '@sc/price-analyze/interfaces/i-price-analyze-parameter';\nimport { IPriceAnalyzeParams } from '@sc/price-analyze/interfaces/i-price-analyze-params';\nimport { ITypedNullableRange } from '@sc/system/interfaces/i-typed-nullable-range';\n\n/**\n * Конвертирует параметры анализа цен в валидные параметры запроса.\n *\n * @param params Параметры для конвертации.\n */\nexport const convertPriceAnalyzeParams = (params: IPriceAnalyzeParams): ITypedNullableRange<IPriceAnalyzeParameter> => {\n const result: ITypedNullableRange<IPriceAnalyzeParameter> = {};\n\n if (params.from && (params.from.coefficient || params.from.value)) {\n result.from = {};\n\n if (params.from.coefficient) {\n result.from.priceCoefficientId = params.from.coefficient.id;\n }\n\n if (params.from.value) {\n result.from.increasePercent = params.from.value;\n }\n }\n\n if (params.to && (params.to.coefficient || params.to.value)) {\n result.to = {};\n\n if (params.to.coefficient) {\n result.to.priceCoefficientId = params.to.coefficient.id;\n }\n\n if (params.to.value) {\n result.to.increasePercent = params.to.value;\n }\n }\n\n return result;\n};\n","import { HttpRequester } from '@sc/http/classes/http-requester';\nimport { PriceAnalyze } from '@sc/price-analyze/classes/price-analyze';\nimport { convertPriceAnalyzeFilters } from '@sc/price-analyze/converters/price-analyze-filters';\nimport { convertPriceAnalyzeParams } from '@sc/price-analyze/converters/price-analyze-params';\nimport { IPriceAnalyze } from '@sc/price-analyze/interfaces/i-price-analyze';\nimport { IPriceAnalyzeFilters } from '@sc/price-analyze/interfaces/i-price-analyze-filters';\nimport { IPriceAnalyzeParams } from '@sc/price-analyze/interfaces/i-price-analyze-params';\nimport { ITypedNullableRange } from '@sc/system/interfaces/i-typed-nullable-range';\n\n/**\n * Предоставляет механизмы анализа цен.\n */\nexport class PriceAnalyzeProvider extends HttpRequester {\n /**\n * Возвращает список клиентских цен на продукты в указанном диапазоне цены.\n *\n * @param productId Идентификатор продукта.\n * @param params Параметры анализа цен.\n * @param filters Параметры фильтрации данных.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_products_analyze\n */\n public analyzeProductPrices(productId: number, params: IPriceAnalyzeParams, filters?: IPriceAnalyzeFilters): Promise<IPriceAnalyze[]> {\n return this.get<IPriceAnalyze[]>(\n `/internal/price/products/${productId}/analyze`,\n {\n ...convertPriceAnalyzeParams(params),\n filters: convertPriceAnalyzeFilters(filters),\n },\n (response) => response.data.map((result) => new PriceAnalyze(result))\n );\n }\n\n /**\n * Возвращает список клиентских цен на продукты категории в указанном диапазоне цены.\n *\n * @param productCategoryId Идентификатор категории продукта.\n * @param params Параметры анализа цен.\n * @param filters Параметры фильтрации данных.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_categories_analyze\n */\n public analyzeCategoryPrices(productCategoryId: number, params: IPriceAnalyzeParams, filters?: IPriceAnalyzeFilters): Promise<IPriceAnalyze[]> {\n return this.get<IPriceAnalyze[]>(\n `/internal/price/categories/${productCategoryId}/analyze`,\n {\n ...convertPriceAnalyzeParams(params),\n filters: convertPriceAnalyzeFilters(filters),\n },\n (response) => response.data.map((result) => new PriceAnalyze(result))\n );\n }\n\n /**\n * Возвращает список клиентских цен на продукты категории в указанном диапазоне цены за квадратный метр.\n *\n * @param productCategoryId Идентификатор категории продукта.\n * @param params Параметры анализа цен.\n * @param params.from Цена больше или равна значению.\n * @param params.to Цена меньше или равна значению.\n * @param filters Параметры фильтрации данных.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_categories_analyze_by_square\n */\n public analyzeCategoryPricesBySquare(productCategoryId: number, params: ITypedNullableRange<number>, filters?: IPriceAnalyzeFilters): Promise<IPriceAnalyze[]> {\n return this.get<IPriceAnalyze[]>(\n `/internal/price/categories/${productCategoryId}/analyze/square`,\n {\n ...params,\n filters: convertPriceAnalyzeFilters(filters),\n },\n (response) => response.data.map((result) => new PriceAnalyze(result))\n );\n }\n}\n","import { IPriceHistoryItem } from '@sc/price-history/interfaces/i-price-history-item';\nimport { Currency } from '@sc/references/classes/currency';\nimport { ICurrency } from '@sc/references/interfaces/i-currency';\nimport { CodedIdentity } from '@sc/system/classes/coded-identity';\nimport { ICodedIdentity } from '@sc/system/interfaces/i-coded-identity';\nimport { UserShortInfo } from '@sc/user/classes/user-short-info';\nimport { IUserShortInfo } from '@sc/user/interfaces/i-user-short-info';\nimport { parseISO } from 'date-fns';\nimport { isString } from 'lodash-es';\n\n/**\n * Данные о единичной записи истории цены на продукт/услугу.\n */\nexport class PriceHistoryItem implements IPriceHistoryItem {\n /**\n * @inheritDoc\n */\n public cost: number;\n\n /**\n * @inheritDoc\n */\n public isLowCost: boolean;\n\n /**\n * @inheritDoc\n */\n public isRetail: boolean;\n\n /**\n * @inheritDoc\n */\n public costDate: Date;\n\n /**\n * @inheritDoc\n */\n public discountName?: string;\n\n /**\n * @inheritDoc\n */\n public priceTemplateName?: string;\n\n /**\n * @inheritDoc\n */\n public product?: ICodedIdentity;\n\n /**\n * @inheritDoc\n */\n public client?: IUserShortInfo;\n\n /**\n * @inheritDoc\n */\n public executor?: IUserShortInfo;\n\n /**\n * @inheritDoc\n */\n public currency?: ICurrency;\n\n /**\n * Инициализирует экземпляр класса {@link PriceHistoryItem}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data: Partial<IPriceHistoryItem>) {\n this.cost = data.cost ?? 0;\n this.isLowCost = data.isLowCost ?? false;\n this.isRetail = data.isRetail ?? false;\n this.costDate = isString(data.costDate) ? parseISO(data.costDate) : (data.costDate ?? new Date());\n this.discountName = data.discountName;\n this.priceTemplateName = data.priceTemplateName;\n this.product = data.product ? new CodedIdentity(data.product) : undefined;\n this.client = data.client ? new UserShortInfo(data.client) : undefined;\n this.executor = data.executor ? new UserShortInfo(data.executor) : undefined;\n this.currency = data.currency ? new Currency(data.currency) : undefined;\n }\n}\n","import { PriceHistoryItem } from '@sc/price-history/classes/price-history-item';\nimport { IPriceHistoryItem } from '@sc/price-history/interfaces/i-price-history-item';\nimport { IProductPriceHistory } from '@sc/price-history/interfaces/i-product-price-history';\nimport { CodedIdentity } from '@sc/system/classes/coded-identity';\nimport { map } from 'lodash-es';\n\n/**\n * Данные записи истории изменения цены на товар или услугу.\n */\nexport class ProductPriceHistory extends CodedIdentity implements IProductPriceHistory {\n /**\n * @inheritDoc\n */\n public history: IPriceHistoryItem[];\n\n /**\n * Инициализирует экземпляр класса {@link ProductPriceHistory}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data: IProductPriceHistory) {\n super(data);\n\n this.history = map(data.history, (item) => new PriceHistoryItem(item));\n }\n}\n","import { AppConfigProvider } from '@sc/config/providers/app-config-provider';\nimport { HttpRequester } from '@sc/http/classes/http-requester';\nimport { ProductPriceHistory } from '@sc/price-history/classes/product-price-history';\nimport { IPriceHistoryRequestParams } from '@sc/price-history/interfaces/i-price-history-request-params';\nimport { IProductPriceHistory } from '@sc/price-history/interfaces/i-product-price-history';\nimport { format } from 'date-fns';\nimport { isArray, isDate, isEmpty, isNil, isObject, map, merge, omitBy } from 'lodash-es';\n\n/**\n * Предоставляет механизмы для получения истории изменения цен.\n */\nexport class PriceHistoryDataProvider extends HttpRequester {\n /**\n * Инициализирует экземпляр класса {@link UserAuthDataProvider}.\n */\n public constructor() {\n super();\n\n this.baseUrl = `${(AppConfigProvider.getConfig().http.priceHistoryApiUrl ?? '') as string}/api`;\n }\n\n /**\n * Возвращает данные об истории изменения цен.\n *\n * @param filters Фильтры для поиска истории изменения цен.\n *\n * @see /docs/api#/operations/api_internal_price_history_get\n */\n public getProductPriceHistory(filters: IPriceHistoryRequestParams): Promise<IProductPriceHistory[]> {\n const apiDateFormat = AppConfigProvider.getConfig().dateFormats.api;\n const updatedFilters = omitBy(\n merge(filters, {\n costDate: {\n from: isDate(filters.costDate?.from) ? format(filters.costDate.from, apiDateFormat) : filters.costDate?.from,\n to: isDate(filters.costDate?.to) ? format(filters.costDate.to, apiDateFormat) : filters.costDate?.to,\n },\n } as IPriceHistoryRequestParams),\n (value) => isNil(value) || ((isArray(value) || isObject(value)) && isEmpty(value))\n );\n\n return this.get<IProductPriceHistory[]>('/internal/history', updatedFilters, (response) => map(response.data, (rec) => new ProductPriceHistory(rec)));\n }\n}\n","import { IRecommendationsList } from '@sc/recommendations/interfaces/i-recommendations-list';\nimport { CodedIdentity } from '@sc/system/';\nimport { ICodedIdentity } from '@sc/system/interfaces/i-coded-identity';\n\n/**\n * Список рекомендованных продуктов и категорий.\n */\nexport class RecommendationsList implements IRecommendationsList {\n /**\n * Список рекомендованных продуктов.\n */\n public products: ICodedIdentity[] = [];\n\n /**\n * Список рекомендованных категорий продуктов.\n */\n public productCategories: ICodedIdentity[] = [];\n\n /**\n * Инициализирует экземпляр класса {@link RecommendationsList}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IRecommendationsList) {\n if (data?.products) {\n this.products = data.products.map((value) => new CodedIdentity(value));\n }\n\n if (data?.productCategories) {\n this.productCategories = data.productCategories.map((value) => new CodedIdentity(value));\n }\n }\n}\n","import { AppConfigProvider } from '@sc/config';\nimport { HttpRequester } from '@sc/http/classes/http-requester';\nimport { RecommendationsList } from '@sc/recommendations/classes/recommendations-list';\nimport { IRecommendationsList } from '@sc/recommendations/interfaces/i-recommendations-list';\nimport { ICatalogableItem } from '@sc/system/interfaces/i-catalogable-item';\n\n/**\n * Предоставляет механизмы получения/управления данными о рекомендациях к продуктам и категориям.\n */\nexport class RecommendationsDataProvider extends HttpRequester {\n /**\n * Инициализирует экземпляр класса {@link UserAuthDataProvider}.\n */\n public constructor() {\n super();\n\n this.baseUrl = `${(AppConfigProvider.getConfig().http.recommendationsApiUrl ?? '') as string}/api`;\n }\n\n /**\n * Возвращает данные о рекомендациях указанной категории продуктов.\n *\n * @param productCategory Данные о категории продуктов, для которой необходимо получить рекомендации.\n * @see /docs/api#/operations/api_internal_recommendations_product_category_get\n */\n public getProductCategoryRecommendations(productCategory: ICatalogableItem): Promise<IRecommendationsList> {\n return this.get<IRecommendationsList>(`/internal/recommendations/categories/${productCategory.id}`, {}, (response) => new RecommendationsList(response.data));\n }\n\n /**\n * Возвращает данные о рекомендациях указанного продукта.\n *\n * @param product Данные о продукте, для которого необходимо получить рекомендации.\n * @see /docs/api#/operations/api_internal_recommendations_product_get\n */\n public getProductRecommendations(product: ICatalogableItem): Promise<IRecommendationsList> {\n return this.get<IRecommendationsList>(`/internal/recommendations/products/${product.id}`, {}, (response) => new RecommendationsList(response.data));\n }\n\n /**\n * Выполняет сохранение данных о рекомендуемых категориях продуктов.\n *\n * @param productCategory Данные о категории для которой необходимо сохранить список рекомендуемых товаров.\n * @param recommendations Список рекомендованных продуктов и категорий.\n * @see /docs/api#/operations/api_internal_recommendations_product_category_save\n */\n public saveProductCategoryRecommendations(productCategory: ICatalogableItem, recommendations: IRecommendationsList): Promise<void> {\n return this.post(`/internal/recommendations/categories/${productCategory.id}`, {\n product_categories: recommendations.productCategories.map((item) => item.id),\n products: recommendations.products.map((item) => item.id),\n });\n }\n\n /**\n * Выполняет сохранение данных о рекомендуемых продуктах.\n *\n * @param product Данные о продукте для которого необходимо сохранить список рекомендуемых товаров.\n * @param recommendations Список рекомендованных продуктов и категорий.\n * @see /docs/api#/operations/api_internal_recommendations_product_save\n */\n public saveProductRecommendations(product: ICatalogableItem, recommendations: IRecommendationsList): Promise<void> {\n return this.post(`/internal/recommendations/products/${product.id}`, {\n product_categories: recommendations.productCategories.map((item) => item.id),\n products: recommendations.products.map((item) => item.id),\n });\n }\n}\n","/* eslint-disable @typescript-eslint/no-unnecessary-condition */\n\nimport { PropertyType } from '@sc/catalog/classes/property-type';\nimport { IPropertyType } from '@sc/catalog/interfaces/i-property-type';\nimport { HttpCachedRequester } from '@sc/http/classes/http-cached-requester';\nimport { AnyReference } from '@sc/references/classes/any-reference';\nimport { ChannelPrimaryInterest } from '@sc/references/classes/channel-primary-interest';\nimport { CityWithRegionAndCountry } from '@sc/references/classes/city-with-region-and-country';\nimport { ContactPosition } from '@sc/references/classes/contact-position';\nimport { Country } from '@sc/references/classes/country';\nimport { CuratedDirection } from '@sc/references/classes/curated-direction';\nimport { Currency } from '@sc/references/classes/currency';\nimport { DeliveryType } from '@sc/references/classes/delivery-type';\nimport { Opf } from '@sc/references/classes/opf';\nimport { OrderPaymentStatus } from '@sc/references/classes/order-payment-status';\nimport { OrderStatus } from '@sc/references/classes/order-status';\nimport { PartnerGroup } from '@sc/references/classes/partner-group';\nimport { PaymentType } from '@sc/references/classes/payment-type';\nimport { PriceCoefficient } from '@sc/references/classes/price-coefficient';\nimport { ProductFileType } from '@sc/references/classes/product-file-type';\nimport { Region } from '@sc/references/classes/region';\nimport { ResourceType } from '@sc/references/classes/resource-type';\nimport { SalesDirection } from '@sc/references/classes/sales-direction';\nimport { SourcePrimaryInterest } from '@sc/references/classes/source-primary-interest';\nimport { Warehouse } from '@sc/references/classes/warehouse';\nimport { IChannelPrimaryInterest } from '@sc/references/interfaces/i-channel-primary-interest';\nimport { ICityWithRegionAndCountry } from '@sc/references/interfaces/i-city-with-region-and-country';\nimport { IContactPosition } from '@sc/references/interfaces/i-contact-position';\nimport { ICountry } from '@sc/references/interfaces/i-country';\nimport { ICuratedDirection } from '@sc/references/interfaces/i-curated-direction';\nimport { ICurrency } from '@sc/references/interfaces/i-currency';\nimport { IDeliveryType } from '@sc/references/interfaces/i-delivery-type';\nimport { IOpf } from '@sc/references/interfaces/i-opf';\nimport { IOrderPaymentStatus } from '@sc/references/interfaces/i-order-payment-status';\nimport { IOrderStatus } from '@sc/references/interfaces/i-order-status';\nimport { IPartnerGroup } from '@sc/references/interfaces/i-partner-group';\nimport { IPaymentType } from '@sc/references/interfaces/i-payment-type';\nimport { IPriceCoefficient } from '@sc/references/interfaces/i-price-coefficient';\nimport { IProductFileType } from '@sc/references/interfaces/i-product-file-type';\nimport { IRegion } from '@sc/references/interfaces/i-region';\nimport { IResourceType } from '@sc/references/interfaces/i-resource-type';\nimport { ISalesDirection } from '@sc/references/interfaces/i-sales-direction';\nimport { ISourcePrimaryInterest } from '@sc/references/interfaces/i-source-primary-interest';\nimport { IWarehouse } from '@sc/references/interfaces/i-warehouse';\nimport { IReference } from '@sc/system/interfaces/i-reference';\n\n/**\n * Предоставляет механизмы получения данных из справочников.\n */\nexport class ReferenceDataProvider extends HttpCachedRequester {\n /**\n * Возвращает {@link Promise} для получения данных указанного справочника.\n *\n * @param referenceName Название справочника.\n * @param useResponseDataCache Признак необходимости кэшировать данные ответов на запросы\n * и использовать в случае аналогичных запросов.\n */\n public getReference(referenceName: string, useResponseDataCache = false): Promise<IReference[]> {\n return this.getTypedDataArrayRequester(AnyReference, `/internal/references/${referenceName}`, useResponseDataCache);\n }\n\n /**\n * Возвращает {@link Promise} для получения справочника данных о канале\n * первичного интереса.\n */\n public getChannelPrimaryInterest(): Promise<IChannelPrimaryInterest[]> {\n return this.getTypedDataArrayRequester(ChannelPrimaryInterest, '/internal/references/channel-primary-interest', true);\n }\n\n /**\n * Возвращает {@link Promise} для получения справочника должностей контактных лиц.\n */\n public getContactPositions(): Promise<IContactPosition[]> {\n return this.getTypedDataArrayRequester(ContactPosition, '/internal/references/contact-position', true);\n }\n\n /**\n * Возвращает {@link Promise} для получения справочника списка направлений кураторства.\n */\n public getCuratedDirection(): Promise<ICuratedDirection[]> {\n return this.getTypedDataArrayRequester(CuratedDirection, '/internal/references/curated-direction', true);\n }\n\n /**\n * Возвращает {@link Promise} для получения справочника списка валют.\n */\n public getCurrency(): Promise<ICurrency[]> {\n return this.getTypedDataArrayRequester(Currency, '/public/references/currency', true);\n }\n\n /**\n * Возвращает {@link Promise} для получения справочника данных\n * групп партнеров (направлений деятельности).\n */\n public getPartnerGroup(): Promise<IPartnerGroup[]> {\n return this.getTypedDataArrayRequester(PartnerGroup, '/internal/references/partner-group', true);\n }\n\n /**\n * Возвращает {@link Promise} для получения справочника данных организационно-правовых форм.\n */\n public getOpf(): Promise<IOpf[]> {\n return this.getTypedDataArrayRequester(Opf, '/public/references/opf', true);\n }\n\n /**\n * Возвращает {@link Promise} для получения справочника данных статусов оплаты заказов.\n */\n public getOrderPaymentStatuses(): Promise<IOrderPaymentStatus[]> {\n return this.getTypedDataArrayRequester(OrderPaymentStatus, '/public/references/order-payment-status', true);\n }\n\n /**\n * Возвращает {@link Promise} для получения справочника данных статусов заказов.\n */\n public getOrderStatuses(): Promise<IOrderStatus[]> {\n return this.getTypedDataArrayRequester(OrderStatus, '/public/references/order-status', true);\n }\n\n /**\n * Возвращает {@link Promise} для получения справочника данных типов оплаты заказов.\n */\n public getPaymentTypes(): Promise<IPaymentType[]> {\n return this.getTypedDataArrayRequester(PaymentType, '/public/references/payment-type', true);\n }\n\n /**\n * Возвращает {@link Promise} для получения справочника типов ресурсов.\n */\n public getResourceTypes(): Promise<IResourceType[]> {\n return this.getTypedDataArrayRequester(ResourceType, '/internal/references/resource-type', true);\n }\n\n /**\n * Возвращает {@link Promise} для получения справочника данных направлений продаж.\n */\n public getSalesDirections(): Promise<ISalesDirection[]> {\n return this.getTypedDataArrayRequester(SalesDirection, '/public/references/sales-direction', true);\n }\n\n /**\n * Возвращает {@link Promise} для получения справочника данных об источнике первичного интереса.\n */\n public getSourcePrimaryInterest(): Promise<ISourcePrimaryInterest[]> {\n return this.getTypedDataArrayRequester(SourcePrimaryInterest, '/internal/references/source-primary-interest', true);\n }\n\n /**\n * Выполняет поиск данных о городах по терму в названии.\n *\n * @param term Терм поиска.\n */\n public searchCity(term: string): Promise<ICityWithRegionAndCountry[]> {\n return this.getTypedDataArrayRequester(CityWithRegionAndCountry, `/internal/references/city-with-region-and-country/search?term=${term}`);\n }\n\n /**\n * Выполняет поиск данных о регионах по терму в названии.\n *\n * @param term Терм поиска.\n */\n public searchRegion(term: string): Promise<IRegion[]> {\n return this.getTypedDataArrayRequester(Region, `/internal/references/region-with-country/search?term=${term}`);\n }\n\n /**\n * Выполняет поиск данных о странах по терму в названии.\n *\n * @param term Терм поиска.\n */\n public searchCountry(term: string): Promise<ICountry[]> {\n return this.getTypedDataArrayRequester(Country, `/internal/references/country/search?term=${term}`);\n }\n\n /**\n * Возвращает {@link Promise} для получения справочника типов доставки.\n */\n public getDeliveryTypes(): Promise<IDeliveryType[]> {\n return this.getTypedDataArrayRequester(DeliveryType, '/internal/references/delivery-type', true);\n }\n\n /**\n * Возвращает {@link Promise} для получения справочника складов.\n */\n public getWarehouses(): Promise<IWarehouse[]> {\n return this.getTypedDataArrayRequester(Warehouse, '/public/references/warehouse', true);\n }\n\n /**\n * Возвращает {@link Promise} для получения справочника типов свойств.\n */\n public getPropertyTypes(): Promise<IPropertyType[]> {\n return this.getTypedDataArrayRequester(PropertyType, '/internal/references/property-type', true);\n }\n\n /**\n * Возвращает {@link Promise} для получения справочника коэффициентов цен.\n */\n public getPriceCoefficients(): Promise<IPriceCoefficient[]> {\n return this.getTypedDataArrayRequester(PriceCoefficient, '/internal/references/price-coefficient', true);\n }\n\n /**\n * Возвращает {@link Promise} для получения справочника типов файлов продуктов/категорий.\n */\n public getProductFileType(): Promise<IProductFileType[]> {\n return this.getTypedDataArrayRequester(ProductFileType, '/public/references/product-file-type', true);\n }\n}\n","import { IPropertyType } from '@sc/catalog/interfaces/i-property-type';\nimport { HttpRequester } from '@sc/http/classes/http-requester';\nimport { IManager } from '@sc/managers/interfaces/i-manager';\nimport { ManagerDataProvider } from '@sc/managers/providers/manager-data-provider';\nimport { IChannelPrimaryInterest } from '@sc/references/interfaces/i-channel-primary-interest';\nimport { IContactPosition } from '@sc/references/interfaces/i-contact-position';\nimport { ICurrency } from '@sc/references/interfaces/i-currency';\nimport { IDeliveryType } from '@sc/references/interfaces/i-delivery-type';\nimport { IOpf } from '@sc/references/interfaces/i-opf';\nimport { IOrderPaymentStatus } from '@sc/references/interfaces/i-order-payment-status';\nimport { IOrderStatus } from '@sc/references/interfaces/i-order-status';\nimport { IPartnerGroup } from '@sc/references/interfaces/i-partner-group';\nimport { IPaymentType } from '@sc/references/interfaces/i-payment-type';\nimport { IPriceCoefficient } from '@sc/references/interfaces/i-price-coefficient';\nimport { IProductFileType } from '@sc/references/interfaces/i-product-file-type';\nimport { IResourceType } from '@sc/references/interfaces/i-resource-type';\nimport { ISalesDirection } from '@sc/references/interfaces/i-sales-direction';\nimport { ISourcePrimaryInterest } from '@sc/references/interfaces/i-source-primary-interest';\nimport { IWarehouse } from '@sc/references/interfaces/i-warehouse';\nimport { ReferenceDataProvider } from '@sc/references/providers/reference-data-provider';\nimport { noop } from 'lodash-es';\nimport { defineStore } from 'pinia';\nimport { computed, ref } from 'vue';\n\n/**\n * Приватное хранилище данных справочников.\n */\nconst useReferencesPrivateStore = defineStore('__references_private', () => {\n /**\n * Список загружаемых/загруженных на данный момент значений.\n */\n const dataLoaderList = ref<Record<string, boolean>>({});\n\n /**\n * Справочник каналов первичного интереса.\n */\n const channelPrimaryInterestReference = ref<IChannelPrimaryInterest[] | undefined>(undefined);\n\n /**\n * Справочник должностей контактных лиц.\n */\n const contactPositionsReference = ref<IContactPosition[] | undefined>(undefined);\n\n /**\n * Справочник валют.\n */\n const currencyReference = ref<ICurrency[] | undefined>(undefined);\n\n /**\n * Справочник типов доставки.\n */\n const deliveryTypeReference = ref<IDeliveryType[] | undefined>(undefined);\n\n /**\n * Список менеджеров.\n */\n const managersList = ref<IManager[] | undefined>(undefined);\n\n /**\n * Справочник организационно-правовых форм.\n */\n const opfReference = ref<IOpf[] | undefined>(undefined);\n\n /**\n * Справочник статусов оплаты заказа.\n */\n const orderPaymentStatusReference = ref<IOrderPaymentStatus[] | undefined>(undefined);\n\n /**\n * Справочник статусов заказов.\n */\n const orderStatusReference = ref<IOrderStatus[] | undefined>(undefined);\n\n /**\n * Справочник типов оплаты заказов.\n */\n const paymentTypeReference = ref<IPaymentType[] | undefined>(undefined);\n\n /**\n * Справочник групп партнеров.\n */\n const partnerGroupReference = ref<IPartnerGroup[] | undefined>(undefined);\n\n /**\n * Справочник типов файлов продукктов/категорий.\n */\n const productFileTypeReference = ref<IProductFileType[] | undefined>(undefined);\n\n /**\n * Справочник типов ресурсов.\n */\n const resourceTypesReference = ref<IResourceType[] | undefined>(undefined);\n\n /**\n * Справочник направлений продаж.\n */\n const salesDirectionsReference = ref<ISalesDirection[] | undefined>(undefined);\n\n /**\n * Справочник источников первичного интереса.\n */\n const sourcePrimaryInterestReference = ref<ISourcePrimaryInterest[] | undefined>(undefined);\n\n /**\n * Справочник складов.\n */\n const warehousesReference = ref<IWarehouse[] | undefined>(undefined);\n\n /**\n * Справочник типов свойств.\n */\n const propertyTypesReference = ref<IPropertyType[] | undefined>(undefined);\n\n /**\n * Справочник коэффициентов цен.\n */\n const priceCoefficientsReference = ref<IPriceCoefficient[] | undefined>(undefined);\n\n return {\n /**\n * Список загружаемых/загруженных на данный момент значений.\n */\n dataLoaderList,\n\n /**\n * Справочник каналов первичного интереса.\n */\n channelPrimaryInterestReference,\n\n /**\n * Справочник должностей контактных лиц.\n */\n contactPositionsReference,\n\n /**\n * Справочник валют.\n */\n currencyReference,\n\n /**\n * Справочник типов доставки.\n */\n deliveryTypeReference,\n\n /**\n * Список менеджеров.\n */\n managersList,\n\n /**\n * Справочник организационно-правовых форм.\n */\n opfReference,\n\n /**\n * Справочник статусов оплаты заказа.\n */\n orderPaymentStatusReference,\n\n /**\n * Справочник статусов заказов.\n */\n orderStatusReference,\n\n /**\n * Справочник типов оплаты заказов.\n */\n paymentTypeReference,\n\n /**\n * Справочник групп партнеров.\n */\n partnerGroupReference,\n\n /**\n * Справочник типов файлов продукктов/категорий.\n */\n productFileTypeReference,\n\n /**\n * Справочник типов ресурсов.\n */\n resourceTypesReference,\n\n /**\n * Справочник направлений продаж.\n */\n salesDirectionsReference,\n\n /**\n * Справочник источников первичного интереса.\n */\n sourcePrimaryInterestReference,\n\n /**\n * Справочник складов.\n */\n warehousesReference,\n\n /**\n * Справочник типов свойств.\n */\n propertyTypesReference,\n\n /**\n * Справочник коэффициентов цен.\n */\n priceCoefficientsReference,\n };\n});\n\n/**\n * Хранилище данных справочников.\n */\nexport const useReferencesStore = defineStore('references', () => {\n /**\n * Справочник каналов первичного интереса.\n */\n const channelPrimaryInterestsReference = computed((): IChannelPrimaryInterest[] | undefined => {\n const referencesStore = useReferencesPrivateStore();\n\n if (!referencesStore.channelPrimaryInterestReference && !referencesStore.dataLoaderList.channelPrimaryInterestReference) {\n referencesStore.dataLoaderList.channelPrimaryInterestReference = true;\n\n HttpRequester.getInstance(ReferenceDataProvider)\n .getChannelPrimaryInterest()\n .then((data) => {\n referencesStore.channelPrimaryInterestReference = data;\n })\n .catch(noop);\n }\n\n return referencesStore.channelPrimaryInterestReference;\n });\n\n /**\n * Справочник должностей контактных лиц.\n */\n const contactPositionsReference = computed((): IContactPosition[] | undefined => {\n const referencesStore = useReferencesPrivateStore();\n\n if (!referencesStore.contactPositionsReference && !referencesStore.dataLoaderList.contactPositionsReference) {\n referencesStore.dataLoaderList.contactPositionsReference = true;\n\n HttpRequester.getInstance(ReferenceDataProvider)\n .getContactPositions()\n .then((data) => {\n referencesStore.contactPositionsReference = data;\n })\n .catch(noop);\n }\n\n return referencesStore.contactPositionsReference;\n });\n\n /**\n * Справочник валют.\n */\n const currencyReference = computed((): ICurrency[] | undefined => {\n const referencesStore = useReferencesPrivateStore();\n\n if (!referencesStore.currencyReference && !referencesStore.dataLoaderList.currencyReference) {\n referencesStore.dataLoaderList.currencyReference = true;\n\n HttpRequester.getInstance(ReferenceDataProvider)\n .getCurrency()\n .then((data) => {\n referencesStore.currencyReference = data;\n })\n .catch(noop);\n }\n\n return referencesStore.currencyReference;\n });\n\n /**\n * Справочник организационно-правовых форм.\n */\n const opfReference = computed((): IOpf[] | undefined => {\n const referencesStore = useReferencesPrivateStore();\n\n if (!referencesStore.opfReference && !referencesStore.dataLoaderList.opfReference) {\n referencesStore.dataLoaderList.opfReference = true;\n\n HttpRequester.getInstance(ReferenceDataProvider)\n .getOpf()\n .then((data) => {\n referencesStore.opfReference = data;\n })\n .catch(noop);\n }\n\n return referencesStore.opfReference;\n });\n\n /**\n * Справочник статусов оплаты заказа.\n */\n const orderPaymentStatusReference = computed((): IOrderPaymentStatus[] | undefined => {\n const referencesStore = useReferencesPrivateStore();\n\n if (!referencesStore.orderPaymentStatusReference && !referencesStore.dataLoaderList.orderPaymentStatusReference) {\n referencesStore.dataLoaderList.orderPaymentStatusReference = true;\n\n HttpRequester.getInstance(ReferenceDataProvider)\n .getOrderPaymentStatuses()\n .then((data) => {\n referencesStore.orderPaymentStatusReference = data;\n })\n .catch(noop);\n }\n\n return referencesStore.orderPaymentStatusReference;\n });\n\n /**\n * Справочник статусов заказов.\n */\n const orderStatusReference = computed((): IOrderStatus[] | undefined => {\n const referencesStore = useReferencesPrivateStore();\n\n if (!referencesStore.orderStatusReference && !referencesStore.dataLoaderList.orderStatusReference) {\n referencesStore.dataLoaderList.orderStatusReference = true;\n\n HttpRequester.getInstance(ReferenceDataProvider)\n .getOrderStatuses()\n .then((data) => {\n referencesStore.orderStatusReference = data;\n })\n .catch(noop);\n }\n\n return referencesStore.orderStatusReference;\n });\n\n /**\n * Справочник типов оплаты заказов.\n */\n const paymentTypeReference = computed((): IPaymentType[] | undefined => {\n const referencesStore = useReferencesPrivateStore();\n\n if (!referencesStore.paymentTypeReference && !referencesStore.dataLoaderList.paymentTypeReference) {\n referencesStore.dataLoaderList.paymentTypeReference = true;\n\n HttpRequester.getInstance(ReferenceDataProvider)\n .getPaymentTypes()\n .then((data) => {\n referencesStore.paymentTypeReference = data;\n })\n .catch(noop);\n }\n\n return referencesStore.paymentTypeReference;\n });\n\n /**\n * Справочник групп партнеров.\n */\n const partnerGroupsReference = computed((): IPartnerGroup[] | undefined => {\n const referencesStore = useReferencesPrivateStore();\n\n if (!referencesStore.partnerGroupReference && !referencesStore.dataLoaderList.partnerGroupReference) {\n referencesStore.dataLoaderList.partnerGroupReference = true;\n\n HttpRequester.getInstance(ReferenceDataProvider)\n .getPartnerGroup()\n .then((data) => {\n referencesStore.partnerGroupReference = data;\n })\n .catch(noop);\n }\n\n return referencesStore.partnerGroupReference;\n });\n\n /**\n * Справочник типов файлов продуктов/категорий.\n */\n const productFilesTypesReference = computed((): IProductFileType[] | undefined => {\n const referencesStore = useReferencesPrivateStore();\n\n if (!referencesStore.productFileTypeReference && !referencesStore.dataLoaderList.productFileTypeReference) {\n referencesStore.dataLoaderList.productFileTypeReference = true;\n\n HttpRequester.getInstance(ReferenceDataProvider)\n .getProductFileType()\n .then((data) => {\n referencesStore.productFileTypeReference = data;\n })\n .catch(noop);\n }\n\n return referencesStore.productFileTypeReference;\n });\n\n /**\n * Справочник типов ресурсов.\n */\n const resourceTypesReference = computed((): IResourceType[] | undefined => {\n const referencesStore = useReferencesPrivateStore();\n\n if (!referencesStore.resourceTypesReference && !referencesStore.dataLoaderList.resourceTypesReference) {\n referencesStore.dataLoaderList.resourceTypesReference = true;\n\n HttpRequester.getInstance(ReferenceDataProvider)\n .getResourceTypes()\n .then((data) => {\n referencesStore.resourceTypesReference = data;\n })\n .catch(noop);\n }\n\n return referencesStore.resourceTypesReference;\n });\n\n /**\n * Справочник направлений продаж.\n */\n const salesDirectionsReference = computed((): ISalesDirection[] | undefined => {\n const referencesStore = useReferencesPrivateStore();\n\n if (!referencesStore.salesDirectionsReference && !referencesStore.dataLoaderList.salesDirectionsReference) {\n referencesStore.dataLoaderList.salesDirectionsReference = true;\n\n HttpRequester.getInstance(ReferenceDataProvider)\n .getSalesDirections()\n .then((data) => {\n referencesStore.salesDirectionsReference = data;\n })\n .catch(noop);\n }\n\n return referencesStore.salesDirectionsReference;\n });\n\n /**\n * Справочник каналов первичного интереса.\n */\n const sourcePrimaryInterestsReference = computed((): ISourcePrimaryInterest[] | undefined => {\n const referencesStore = useReferencesPrivateStore();\n\n if (!referencesStore.sourcePrimaryInterestReference && !referencesStore.dataLoaderList.sourcePrimaryInterestReference) {\n referencesStore.dataLoaderList.sourcePrimaryInterestReference = true;\n\n HttpRequester.getInstance(ReferenceDataProvider)\n .getSourcePrimaryInterest()\n .then((data) => {\n referencesStore.sourcePrimaryInterestReference = data;\n })\n .catch(noop);\n }\n\n return referencesStore.sourcePrimaryInterestReference;\n });\n\n /**\n * Справочник типов доставки.\n */\n const deliveryTypeReference = computed((): IDeliveryType[] | undefined => {\n const referencesStore = useReferencesPrivateStore();\n\n if (!referencesStore.deliveryTypeReference && !referencesStore.dataLoaderList.deliveryTypeReference) {\n referencesStore.dataLoaderList.deliveryTypeReference = true;\n\n HttpRequester.getInstance(ReferenceDataProvider)\n .getDeliveryTypes()\n .then((data) => {\n referencesStore.deliveryTypeReference = data;\n })\n .catch(noop);\n }\n\n return referencesStore.deliveryTypeReference;\n });\n\n /**\n * Список менеджеров.\n */\n const managersList = computed((): IManager[] | undefined => {\n const referencesStore = useReferencesPrivateStore();\n\n if (!referencesStore.managersList && !referencesStore.dataLoaderList.managersList) {\n referencesStore.dataLoaderList.managersList = true;\n\n HttpRequester.getInstance(ManagerDataProvider)\n .getManagers()\n .then((data) => {\n referencesStore.managersList = data;\n })\n .catch(noop);\n }\n\n return referencesStore.managersList;\n });\n\n /**\n * Справочник складов.\n */\n const warehousesReference = computed((): IWarehouse[] | undefined => {\n const referencesStore = useReferencesPrivateStore();\n\n if (!referencesStore.warehousesReference && !referencesStore.dataLoaderList.warehousesReference) {\n referencesStore.dataLoaderList.warehousesReference = true;\n\n HttpRequester.getInstance(ReferenceDataProvider)\n .getWarehouses()\n .then((data) => {\n referencesStore.warehousesReference = data;\n })\n .catch(noop);\n }\n\n return referencesStore.warehousesReference;\n });\n\n /**\n * Справочник типов свойств.\n */\n const propertyTypesReference = computed((): IPropertyType[] | undefined => {\n const referencesStore = useReferencesPrivateStore();\n\n if (!referencesStore.propertyTypesReference && !referencesStore.dataLoaderList.propertyTypesReference) {\n referencesStore.dataLoaderList.propertyTypesReference = true;\n\n HttpRequester.getInstance(ReferenceDataProvider)\n .getPropertyTypes()\n .then((data) => {\n referencesStore.propertyTypesReference = data;\n })\n .catch(noop);\n }\n\n return referencesStore.propertyTypesReference;\n });\n\n /**\n * Справочник коэффициентов цен.\n */\n const priceCoefficientsReference = computed((): IPriceCoefficient[] | undefined => {\n const referencesStore = useReferencesPrivateStore();\n\n if (!referencesStore.priceCoefficientsReference && !referencesStore.dataLoaderList.priceCoefficientsReference) {\n referencesStore.dataLoaderList.priceCoefficientsReference = true;\n\n HttpRequester.getInstance(ReferenceDataProvider)\n .getPriceCoefficients()\n .then((data) => {\n referencesStore.priceCoefficientsReference = data;\n })\n .catch(noop);\n }\n\n return referencesStore.priceCoefficientsReference;\n });\n\n return {\n /**\n * Справочник каналов первичного интереса.\n */\n channelPrimaryInterestsReference,\n\n /**\n * Справочник должностей контактных лиц.\n */\n contactPositionsReference,\n\n /**\n * Справочник валют.\n */\n currencyReference,\n\n /**\n * Справочник организационно-правовых форм.\n */\n opfReference,\n\n /**\n * Справочник статусов оплаты заказа.\n */\n orderPaymentStatusReference,\n\n /**\n * Справочник статусов заказов.\n */\n orderStatusReference,\n\n /**\n * Справочник типов оплаты заказов.\n */\n paymentTypeReference,\n\n /**\n * Справочник групп партнеров.\n */\n partnerGroupsReference,\n\n /**\n * Справочник типов файлов продуктов/категорий.\n */\n productFilesTypesReference,\n\n /**\n * Справочник типов ресурсов.\n */\n resourceTypesReference,\n\n /**\n * Справочник направлений продаж.\n */\n salesDirectionsReference,\n\n /**\n * Справочник каналов первичного интереса.\n */\n sourcePrimaryInterestsReference,\n\n /**\n * Справочник типов доставки.\n */\n deliveryTypeReference,\n\n /**\n * Список менеджеров.\n */\n managersList,\n\n /**\n * Справочник складов.\n */\n warehousesReference,\n\n /**\n * Справочник типов свойств.\n */\n propertyTypesReference,\n\n /**\n * Справочник коэффициентов цен.\n */\n priceCoefficientsReference,\n };\n});\n","import { IMetaTagItem } from '@sc/seo/interfaces/i-meta-tag-item';\n\n/**\n * Значение метатега.\n */\nexport class MetaTagItem implements IMetaTagItem {\n /**\n * Наименование метатега.\n */\n public name: string;\n\n /**\n * Значение метатега.\n */\n public content: string;\n\n /**\n * Инициализирует экземпляр класса {@link MetaTagItem}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data: IMetaTagItem) {\n this.name = data.name;\n this.content = data.content;\n }\n}\n","import { ResourceType } from '@sc/references/classes/resource-type';\nimport { IResourceType } from '@sc/references/interfaces/i-resource-type';\nimport { MetaTagItem } from '@sc/seo/classes/meta-tag-item';\nimport { IMetaTagItem } from '@sc/seo/interfaces/i-meta-tag-item';\nimport { ISeo } from '@sc/seo/interfaces/i-seo';\n\n/**\n * Данные о SEO-параметрах ресурса.\n */\nexport class Seo implements ISeo {\n /**\n * Тип ресурса.\n */\n public resourceType: IResourceType;\n\n /**\n * Идентификатор ресурса.\n */\n public resourceId: string;\n\n /**\n * Значение заголовка H1 на странице.\n */\n public h1?: string;\n\n /**\n * Значение метатега Title.\n */\n public title?: string;\n\n /**\n * Значение метатега Description.\n */\n public description?: string;\n\n /**\n * Значение метатега Keywords.\n */\n public keywords?: string;\n\n /**\n * Массив дополнительных значений метатегов.\n */\n public meta: IMetaTagItem[];\n\n /**\n * Инициализирует экземпляр класса {@link Seo}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: ISeo) {\n this.resourceType = new ResourceType(data?.resourceType);\n this.resourceId = data?.resourceId ?? '';\n\n this.h1 = data?.h1;\n this.title = data?.title;\n this.description = data?.description;\n this.keywords = data?.keywords;\n this.meta = data?.meta?.map((e) => new MetaTagItem(e)) ?? [];\n }\n}\n","import { HttpRequester } from '@sc/http/classes/http-requester';\nimport { IResourceType } from '@sc/references/interfaces/i-resource-type';\nimport { Seo } from '@sc/seo/classes/seo';\nimport { ISeo } from '@sc/seo/interfaces/i-seo';\nimport { IFieldValidationResultData } from '@sc/validation';\n\n/**\n * Предоставляет механизмы получения SEO-данных ресурсов.\n */\nexport class SeoDataProvider extends HttpRequester {\n /**\n * Возвращает {@link Promise} для получения данных о SEO-параметрах указанного ресурса.\n *\n * @param resourceType Данные о типе ресурса для которого необходимо получить SEO-данные.\n * @param resourceId Идентификатор ресурса для которого необходимо получить SEO-данные.\n */\n public getResourceSeoData(resourceType: IResourceType, resourceId: string): Promise<ISeo> {\n return this.get<ISeo>(`/internal/seo/${resourceType.slug}/${resourceId}`, {}, (response) => new Seo(response.data));\n }\n\n /**\n * Выполняет сохранение данных о SEO-параметрах для указанного ресурса.\n *\n * @param seo SEO-данные о ресурсе.\n * @param validationFieldResultData Список полей, для которых необходимо\n * установить данные об ошибках валидации\n * в случае ошибок в запросах.\n */\n public saveResourceSeoData(seo: ISeo, validationFieldResultData: Record<string, IFieldValidationResultData> = {}): Promise<ISeo> {\n return this.post<ISeo>(`/internal/seo/${seo.resourceType.slug}/${seo.resourceId}`, seo, (response) => new Seo(response.data), validationFieldResultData);\n }\n\n /**\n * Возвращает {@link Promise} для удаления данных о SEO-параметрах указанного ресурса.\n *\n * @param resourceType Данные о типе ресурса для которого необходимо удалить SEO-данные.\n * @param resourceId Идентификатор ресурса для которого необходимо удалить SEO-данные.\n */\n public deleteResourceSeoData(resourceType: IResourceType, resourceId: string): Promise<void> {\n return this.delete(`/internal/seo/${resourceType.slug}/${resourceId}`);\n }\n}\n","/* eslint-disable @typescript-eslint/no-unnecessary-condition,@typescript-eslint/no-unsafe-argument,@typescript-eslint/prefer-promise-reject-errors,@typescript-eslint/use-unknown-in-catch-callback-variable */\n\nimport { HttpRequester } from '@sc/http';\nimport { IAddressSuggestion, IBankSuggestion, IOrganizationSuggestion } from '@sc/suggestion/interfaces';\nimport { IIdentity } from '@sc/system/interfaces';\n\n/**\n * Предоставляет механизмы получения подсказок.\n */\nexport class DataSuggestionProvider extends HttpRequester {\n /**\n * Возвращает подсказки по адресам.\n *\n * @param term Терм поиска.\n *\n * @see /doc/api/public_client_ui#/Подсказки/api_public_get_address_suggestions\n */\n public searchAddresses(term: string): Promise<IAddressSuggestion[]> {\n return this.execSuggestionQuery<IAddressSuggestion>('/public/suggestions/address', term);\n }\n\n /**\n * Возвращает подсказки по банкам.\n *\n * @param term Терм поиска.\n *\n * @see /doc/api/public_client_ui#/Подсказки/api_public_get_bank_suggestions\n */\n public searchBank(term: string): Promise<IBankSuggestion[]> {\n return this.execSuggestionQuery<IBankSuggestion>('/public/suggestions/bank', term);\n }\n\n /**\n * Возвращает подсказки по организациям.\n *\n * @param term Терм поиска (ИНН, ОГРН, Название).\n *\n * @see /doc/api/public_client_ui#/Подсказки/api_public_get_organization_suggestions\n */\n public searchOrganization(term: string): Promise<IOrganizationSuggestion[]> {\n return this.execSuggestionQuery<IOrganizationSuggestion>('/public/suggestions/organization', term);\n }\n\n /**\n * Выполняет запрос и возвращает подсказки.\n *\n * @param url URL запроса.\n * @param term Терм поиска.\n */\n protected execSuggestionQuery<T extends IIdentity>(url: string, term: string): Promise<T[]> {\n return this.get<T[]>(url, { query: term }).then((responseData) => {\n // Так как идентификаторы записей отсутствуют, то генерируем их самостоятельно.\n const data = [...responseData];\n let id = 1;\n\n data.forEach((item) => {\n // eslint-disable-next-line no-param-reassign,no-plusplus\n item.id = id++;\n });\n\n return data;\n });\n }\n}\n","/* eslint-disable no-shadow */\n\n/**\n * Перечисление допустимых типов пользователей.\n */\nexport enum UserTypeEnum {\n /**\n * Администратор.\n */\n Admin = 'admin',\n\n /**\n * Менеджер.\n */\n Manager = 'manager',\n\n /**\n * Оператор.\n */\n Operator = 'operator',\n\n /**\n * Клиент.\n */\n Client = 'client',\n\n /**\n * Гость.\n */\n Guest = 'guest',\n}\n","import { UserCommonInfo } from '@sc/user/classes/user-common-info';\nimport { UserTypeEnum } from '@sc/user/enums/user-type-enum';\nimport { IUser } from '@sc/user/interfaces/i-user';\n\n/**\n * Данные о пользователе.\n */\nexport class User extends UserCommonInfo implements IUser {\n /**\n * Тип пользователя.\n */\n public type?: UserTypeEnum;\n\n /**\n * Признак того, что менеджер может работать с рекламациями.\n */\n public canDoReclamations: boolean;\n\n /**\n * URI путь к фотографии пользователя.\n */\n public photo?: string;\n\n /**\n * Инициализирует экземпляр класса {@link User}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IUser>) {\n super(data);\n\n this.type = data?.type;\n this.canDoReclamations = data?.canDoReclamations ?? false;\n this.photo = data?.photo;\n }\n}\n","import { AppConfigProvider } from '@sc/config/providers/app-config-provider';\nimport { HttpRequester } from '@sc/http/classes/http-requester';\n\n/**\n * Предоставляет механизмы аутентификации пользователей.\n */\nexport class UserAuthDataProvider extends HttpRequester {\n /**\n * Инициализирует экземпляр класса {@link UserAuthDataProvider}.\n */\n public constructor() {\n super();\n\n this.baseUrl = `${AppConfigProvider.getConfig().http.portalApiUrl as string}/api`;\n\n // Для запросов ключ доступа не нужен.\n if (this.interceptorIds.request.authRequestInterceptor) {\n this.httpClient.interceptors.request.eject(this.interceptorIds.request.authRequestInterceptor);\n }\n\n // TODO: Исправить зацикливание запросов.\n // В случае ошибки ответа на запрос не требуется повторное выполнение запроса.\n // if (this.interceptorIds.response.dataConverterRequestInterceptor) {\n // this.httpClient.interceptors.response.eject(this.interceptorIds.response.dataConverterRequestInterceptor);\n // }\n }\n\n /**\n * Функция для получения обновленных токенов доступа.\n *\n * @deprecated Данный механизм будет полностью удален при полном переходе на Vue приложение.\n */\n public getAccessToken(): Promise<string> {\n return this.get<{ accessToken: string }>('internal/users/current-tokens').then((data) => {\n return data.accessToken;\n });\n }\n}\n","import { HttpRequester } from '@sc/http/classes/http-requester';\nimport { User } from '@sc/user/classes/user';\nimport { IUser } from '@sc/user/interfaces/i-user';\n\n/**\n * Предоставляет механизмы получения/управления данными о клиенте.\n */\nexport class UserDataProvider extends HttpRequester {\n /**\n * Возвращает данные о текущем пользователе.\n */\n // eslint-disable-next-line class-methods-use-this\n public getCurrentUser(): Promise<IUser> {\n return this.get<IUser>(`/internal/users/info`, {}, (response) => new User(response.data));\n }\n}\n","import { HttpRequester } from '@sc/http/classes/http-requester';\nimport { IUser } from '@sc/user/interfaces/i-user';\nimport { UserDataProvider } from '@sc/user/providers/user-data-provider';\nimport { noop } from 'lodash-es';\nimport { defineStore } from 'pinia';\nimport { computed, ref } from 'vue';\n\n/**\n * Приватное хранилище данных состояния пользователя.\n */\nconst useUserStatePrivateStore = defineStore('__user_state_private', () => {\n /**\n * Список загружаемых/загруженных на данный момент значений.\n */\n const dataLoaderList = ref<Record<string, unknown>>({});\n\n /**\n * Данные о текущем пользователе.\n */\n const currentUser = ref<IUser | undefined>(undefined);\n\n return {\n /**\n * Список загружаемых/загруженных на данный момент значений.\n */\n dataLoaderList,\n\n /**\n * Данные о текущем пользователе.\n */\n currentUser,\n };\n});\n\n/**\n * Хранилище данных состояния пользователя.\n */\nexport const useUserStateStore = defineStore('user_state', () => {\n /**\n * Данные о текущем пользователе.\n */\n const currentUser = computed((): IUser | undefined => {\n const privateStore = useUserStatePrivateStore();\n\n if (!privateStore.currentUser && !privateStore.dataLoaderList.currentUser) {\n privateStore.dataLoaderList.currentUser = true;\n\n HttpRequester.getInstance(UserDataProvider)\n .getCurrentUser()\n .then((u) => {\n privateStore.currentUser = u;\n })\n .catch(noop)\n .finally(() => {\n privateStore.dataLoaderList.currentUser = false;\n });\n }\n\n return privateStore.currentUser;\n });\n\n return {\n /**\n * Данные о текущем пользователе.\n */\n currentUser,\n };\n});\n","import { IFieldValidationResultData } from '@sc/validation/interfaces/i-field-validation-result-data';\n\n/**\n * Результат валидации значения поля ввода в результате HTTP 422 ответа на запрос.\n */\nexport class FieldValidationResultData implements IFieldValidationResultData {\n /**\n * Признак необходимости отображать сообщение об ошибке валидации.\n */\n public showFeedback: boolean = false;\n\n /**\n * Сообщение об ошибке валидации.\n */\n public feedback: string = '';\n\n /**\n * Статус валидации.\n */\n public validationStatus: undefined | 'error' | 'success' | 'warning' = undefined;\n\n /**\n * Инициализирует экземпляр класса {@link FieldValidationResultData}.\n *\n * @param feedback Сообщение об ошибке валидации.\n * @param validationStatus Статус валидации.\n */\n public constructor(feedback: string, validationStatus?: 'error' | 'success' | 'warning') {\n this.showFeedback = !!feedback;\n this.feedback = feedback;\n this.validationStatus = validationStatus;\n }\n}\n"],"names":["JwtPayload","data","__publicField","merge","jwtToken","decodedJwtPayload","jwtDecode","payload","objectToCamel","DetailedJwtPayload","_AppConfigProvider","config","isUndefined","path","configPromise","response","resolve","error","AppConfigProvider","PreferencesStorageProvider","keyName","rawSavedData","savedData","isAfter","parseISO","startOfToday","isNil","isEmpty","availableFor","dataToSave","testKey","keysToRemove","i","key","rawData","getTokenExpirationDate","token","useAuthStatePrivateStore","defineStore","ref","storedToken","developmentToken","_a","jwtTokenUpdater","userPermissions","userPermissionsComputedRefs","markRaw","recalculateUserPermissions","jwtPayload","mapValues","value","noop","useAuthStateStore","computed","privateStore","updater","setJwtTokenUpdater","setJwtToken","invalidateJwtToken","hasUserPermission","name","isArray","hasUserPermissionComputedRef","isUserPermissionExist","checkedName","split","groupName","permissionName","group","every","item","Identity","defaultIdValue","NamedIdentity","CodedIdentity","CatalogableItem","PrimaryCatalogableItem","BaseCategory","toUpper","PriceCoefficientEnum","Reference","PriceCoefficient","constant","ProductPriceCoefficient","GeoCoordinates","DeliveryType","Warehouse","dt","StockCount","HiddenCatalogableItem","Image","mediaServer","Product","isString","sc","primaryCategory","_b","category","_c","im","_d","pc","unitsConfig","CartItemBase","cloneDeep","CartItem","Cart","TypedInstanceFactory","type","_HttpRequester","request","authToken","objectToSnake","toLower","originalRequest","appVersion","axios","format","handler","rawResponse","successHandler","validationFieldResultData","disableNotifications","requestPromise","url","params","HttpRequester","CartProvider","client","cartItem","file","blob","CalculationTypeEnum","CostSourceEnum","PropertyTypeEnum","Category","c","UpdatableNamedIdentity","DeletableNamedIdentity","UserShortInfo","DiscountShortInfo","PriceTemplate","ClientProduct","ContactLinks","SalesDirection","ManagerCommon","CuratedDirection","UserPricingRole","Manager","curatedDirection","BaseClientCategory","ClientCategory","PriceTemplateICatalogableItem","PriceTemplateCategory","Curator","Country","Region","CityWithRegionAndCountry","UserCommonInfo","ClientShortInfo","m","PriceTemplateClient","PriceTemplateProduct","PropertyType","Property","PropertyValue","DatePeriod","TemplatesListFilters","result","k","isFunction","PricingRole","CategoryPricingRule","DeviceTypeResolutionConfig","HttpParamsConfig","SentryConfig","VersionConfig","WebSocketConfig","AppBaseConfig","CatalogProvider","term","showHidden","categoryId","clientId","link","ClientPriceProvider","comment","managerId","productId","ClientPriceTemplateProvider","template","priceTemplateId","apiDateFormat","priceTemplateClientId","ProductCategoryDataProvider","categoryID","withNestedCategories","withPriceCoefficients","map","p","forEach","pcs","limit","reject","ProductDataProvider","rec","ClientProductCategoryDataProvider","ClientProductDataProvider","FilterOpEnum","FilterItem","isDate","FilterGroup","filter","BasePaginationProvider","filters","sortParams","paginationParams","extraParams","disableDefaultNotificationErrorResponseHandler","requestParams","PriceTemplateProvider","propertyData","product","productCategoryId","recursively","PricingRoleProvider","role","id","rule","PropertiesProvider","typeId","rest","propertyId","text","fileData","fileId","slug","findCatalogItemByIdRecursive","items","foundInProducts","foundInChildren","flattenCatalogItems","ClientsAdditionalDataRequestTypeEnum","OpfEnum","AnyReference","ChannelPrimaryInterest","City","ContactPosition","Currency","Opf","OrderPaymentStatus","OrderStatus","PartnerGroup","PaymentType","ProductFileType","ResourceType","SourcePrimaryInterest","BankAccount","Contact","ContactPerson","ContragentBase","contactsList","ContragentPerson","ContragentIc","ContragentUlR","ContragentUlNr","ContragentFactory","ContactRelation","ContactPersonRelated","DeliveryAddress","Client","pg","da","ClientsListFilters","s","_e","_f","_g","_h","OrderShortInfo","ClientAdditionalData","g","DataTablePaginationRequestParams","DataTablePagination","DataTableSortRequestParams","ClientDataProvider","contragent","contragentIc","contragentUlR","contragentUlNr","deliveryAddress","bankAccount","clientData","phone","clients","dataTypes","clientIDs","dataList","password","passwordConfirm","managers","promises","curatorId","curators","curator","contragentId","contactPerson","deliveryAddressId","extraData","isPrimary","_HttpCachedRequester","cachedResponseData","addSeconds","useResponseDataCache","cacheKey","cachedResponse","responseData","HttpCachedRequester","UnknownClientDataProvider","ConfiguratorProvider","newTemplate","templateId","DateTimeProvider","nextWorkingDay","addBusinessDays","startOfDay","endOfDay","endOfToday","startOfYesterday","endOfYesterday","startOfTomorrow","endOfTomorrow","_UnitsHelper","linearValues","UnitsHelper","ManagerDataFactory","manager","ManagerDataProvider","OrderInfo","OrderProduct","Order","OrdersDataProvider","period","orderId","PriceAnalyze","convertPriceAnalyzeFilters","omitBy","city","partnerGroup","salesDirection","isObject","convertPriceAnalyzeParams","PriceAnalyzeProvider","PriceHistoryItem","ProductPriceHistory","PriceHistoryDataProvider","updatedFilters","RecommendationsList","RecommendationsDataProvider","productCategory","recommendations","ReferenceDataProvider","referenceName","useReferencesPrivateStore","dataLoaderList","channelPrimaryInterestReference","contactPositionsReference","currencyReference","deliveryTypeReference","managersList","opfReference","orderPaymentStatusReference","orderStatusReference","paymentTypeReference","partnerGroupReference","productFileTypeReference","resourceTypesReference","salesDirectionsReference","sourcePrimaryInterestReference","warehousesReference","propertyTypesReference","priceCoefficientsReference","useReferencesStore","channelPrimaryInterestsReference","referencesStore","partnerGroupsReference","productFilesTypesReference","sourcePrimaryInterestsReference","MetaTagItem","Seo","e","SeoDataProvider","resourceType","resourceId","seo","DataSuggestionProvider","UserTypeEnum","User","UserAuthDataProvider","UserDataProvider","useUserStatePrivateStore","currentUser","useUserStateStore","u","FieldValidationResultData","feedback","validationStatus"],"mappings":"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"}