@snabcentr/common-lib 3.7.0 → 3.7.2
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.
- package/dist/manifest.json +1 -1
- package/dist/release_notes.tmp +3 -3
- package/dist/sc-common-lib.js +8 -3
- package/dist/sc-common-lib.js.map +1 -1
- package/dist/sc-common-lib.umd.cjs +1 -1
- package/dist/sc-common-lib.umd.cjs.map +1 -1
- package/dist/src/catalog/providers/client-price-provider.d.ts +2 -1
- package/dist/src/catalog/providers/client-price-provider.d.ts.map +1 -1
- package/dist/src/orders/classes/order.d.ts +4 -0
- package/dist/src/orders/classes/order.d.ts.map +1 -1
- package/dist/src/orders/interfaces/i-order.d.ts +4 -0
- package/dist/src/orders/interfaces/i-order.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sc-common-lib.umd.cjs","sources":["../src/auth/classes/jwt-payload.ts","../src/auth/classes/detailed-jwt-payload.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/websocket-config.ts","../src/config/classes/app-base-config.ts","../src/config/states/config-state-store.ts","../src/system/providers/preferences-storage-provider.ts","../src/auth/states/auth-state-store.ts","../src/blog/enums/blog-post-media-type-enum.ts","../src/system/classes/identity.ts","../src/blog/classes/blog-post-media-file.ts","../src/blog/enums/blog-post-publication-status-enum.ts","../src/date-time/helpers/date-helper.ts","../src/system/classes/creatable-identity.ts","../src/blog/classes/blog-post-short-info.ts","../src/blog/classes/blog-post.ts","../src/pagination/filters/pagination-filters-base.ts","../src/system/classes/date-period.ts","../src/blog/classes/blog-posts-list-filters.ts","../src/system/providers/typed-instance-factory.ts","../src/http/classes/http-requester.ts","../src/table-data/enums/filter-op-enum.ts","../src/table-data/classes/filter-item.ts","../src/table-data/classes/filter-group.ts","../src/pagination/providers/base-pagination-provider.ts","../src/blog/providers/blog-provider.ts","../src/system/classes/named-identity.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/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/references/classes/currency.ts","../src/references/classes/product-unit.ts","../src/system/classes/coded-identity.ts","../src/system/classes/catalogable-item.ts","../src/system/classes/hidden-catalogable-item.ts","../src/system/classes/image.ts","../src/system/classes/primary-catalogable-item.ts","../src/catalog/classes/product.ts","../src/catalog/enums/cost-source-enum.ts","../src/catalog/classes/client-product.ts","../src/catalog/classes/internal/base/base-category.ts","../src/orders/classes/order-item-base.ts","../src/cart/classes/order-item.ts","../src/cart/classes/cart.ts","../src/cart/providers/cart-provider.ts","../src/catalog/enums/calculation-type-enum.ts","../src/catalog/enums/property-type-enum.ts","../src/catalog/enums/product-filter-type-enum.ts","../src/catalog/classes/category.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/user-regions/classes/user-region-short-info.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-catalogable-item.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/system/classes/deletable-identity.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/catalog/classes/templates-list-filters.ts","../src/catalog/classes/client-price-catalogable-item.ts","../src/catalog/classes/client-price-product.ts","../src/catalog/classes/client-price-category.ts","../src/catalog/classes/pricing-role.ts","../src/catalog/classes/category-pricing-rule.ts","../src/catalog/classes/filter-settings.ts","../src/catalog/classes/category-filter-setting.ts","../src/catalog/classes/category-filter-value.ts","../src/catalog/classes/category-filter.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/catalog/providers/price-template-provider.ts","../src/catalog/providers/pricing-role-provider.ts","../src/catalog/providers/properties-provider.ts","../src/catalog/providers/template-product-category-data-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/clients/classes/bank-account.ts","../src/contacts/classes/contact.ts","../src/contacts/classes/contact-person.ts","../src/references/classes/opf.ts","../src/references/classes/partner-group.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/clients/classes/delivery-address.ts","../src/references/classes/channel-primary-interest.ts","../src/references/classes/source-primary-interest.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/contacts/classes/contact-relation.ts","../src/contacts/classes/contact-person-related.ts","../src/clients/providers/client-data-provider.ts","../src/clients/providers/unknown-client-data-provider.ts","../src/config/classes/version-config.ts","../src/configurator/enums/configurators-enum.ts","../src/configurator/providers/configurator-provider.ts","../src/table-data/classes/table-data-pagination-request-params.ts","../src/table-data/classes/table-data-pagination.ts","../src/table-data/classes/table-data-sort-request-params.ts","../src/date-time/helpers/calendar-helper.ts","../src/date-time/helpers/days-ago-iso.ts","../src/i18n/helpers/pluralize.ts","../src/date-time/helpers/format-relative-date.ts","../src/date-time/providers/date-time-provider.ts","../src/date-time/values/standard-period-groups.ts","../src/discounts/classes/discount-client.ts","../src/discounts/classes/discount-conditions.ts","../src/discounts/helpers/discount-helper.ts","../src/discounts/enums/discount-state-enum.ts","../src/discounts/helpers/discount-state-helper.ts","../src/discounts/classes/discount.ts","../src/discounts/classes/discount-client-eligibility.ts","../src/discounts/classes/discounts-list-filters.ts","../src/discounts/providers/discount-provider.ts","../src/faq/classes/faq-group.ts","../src/faq/classes/faq.ts","../src/faq/providers/faq-provider.ts","../src/helpers/format-percent-change.ts","../src/helpers/units-helper.ts","../src/http/classes/http-cached-requester.ts","../src/managers/classes/manager-data-factory.ts","../src/managers/providers/manager-data-provider.ts","../src/offers/enums/offer-actualization-status.ts","../src/offers/classes/offer-actualization.ts","../src/offers/classes/offer-short-info.ts","../src/offers/classes/profstroy-offer-item.ts","../src/offers/classes/offer.ts","../src/offers/classes/offers-list-filters.ts","../src/references/classes/order-status.ts","../src/orders/classes/order-info.ts","../src/orders/classes/order-item.ts","../src/orders/classes/order.ts","../src/offers/providers/offers-data-provider.ts","../src/offers/helpers/offer-helper.ts","../src/orders/enums/order-action.ts","../src/orders/classes/order-editor-data.ts","../src/references/classes/operator.ts","../src/references/classes/payment-type.ts","../src/orders/classes/orders-list-filters.ts","../src/orders/classes/order-status-history-info.ts","../src/orders/providers/orders-data-provider.ts","../src/orders/symbols/current-order-injection-key.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/enums/order-status-enum.ts","../src/references/enums/order-status-detail-enum.ts","../src/references/classes/any-reference.ts","../src/references/classes/city.ts","../src/references/classes/city-with-user-region.ts","../src/references/classes/contact-position.ts","../src/references/classes/order-payment-status.ts","../src/references/classes/order-status-detail.ts","../src/references/classes/product-file-type.ts","../src/references/classes/reference-data-factory.ts","../src/references/classes/resource-type.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/user-regions/classes/user-region-employee.ts","../src/user-regions/classes/user-region.ts","../src/user-regions/classes/user-regions-list-filters.ts","../src/user-regions/providers/user-region-provider.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 const decodedJwtPayload = jwtDecode<IDetailedJwtPayload<O>>(jwtToken);\n const payload = new DetailedJwtPayload(objectToCamel(decodedJwtPayload) as unknown as IDetailedJwtPayload<O>);\n\n // Необходимо сохранить в исходном виде названия ключей ресурсов, иначе может быть путаница.\n payload.resourceAccess = decodedJwtPayload.resource_access as IDetailedJwtPayload<O>['resourceAccess'];\n\n return payload;\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 { 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 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.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|404|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 { 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 { 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 { 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 * Конфигурация web-сокета.\n */\n public readonly websocket?: IWebsocketConfig;\n\n /**\n * @inheritDoc\n */\n public readonly dateFormats: IAppBaseConfig['dateFormats'];\n\n /**\n * @inheritDoc\n */\n public readonly numberPrecision: IAppBaseConfig['numberPrecision'];\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.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 this.numberPrecision = {\n priceCoefficient: data?.numberPrecision?.priceCoefficient ?? 7,\n };\n }\n}\n","import { AppBaseConfig } from '@sc/config/classes/app-base-config';\nimport { IAppBaseConfig } from '@sc/config/interfaces/i-app-base-config';\nimport { merge } from 'lodash-es';\nimport { defineStore } from 'pinia';\nimport { ref } from 'vue';\n\n/**\n * Приватное хранилище данных состояния приложения.\n */\nexport const useBaseConfigStateStore = defineStore('common.config', () => {\n /**\n * Конфигурационные данные приложения.\n */\n const config = ref<IAppBaseConfig>(new AppBaseConfig());\n\n /**\n * Получает конфигурацию приложения.\n *\n * @returns Конфигурация приложения.\n */\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters\n const getConfig = <T = IAppBaseConfig>(): T => {\n return config.value as T;\n };\n\n /**\n * Устанавливает конфигурацию приложения.\n *\n * @param appConfig Конфигурация приложения.\n */\n const setConfig = (appConfig: IAppBaseConfig): void => {\n config.value = merge(config.value, appConfig);\n };\n\n return {\n /**\n * Конфигурационные данные приложения.\n */\n config,\n\n /**\n * Получает конфигурацию приложения.\n *\n * @returns Конфигурация приложения.\n */\n getConfig,\n\n /**\n * Устанавливает конфигурацию приложения.\n *\n * @param appConfig Конфигурация приложения.\n */\n setConfig,\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\n // Просроченные данные удаляем, чтобы не занимали место в хранилище.\n localStorage.removeItem(keyName);\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 { useBaseConfigStateStore } from '@sc/config/states/config-state-store';\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('common.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 = useBaseConfigStateStore().config.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('common.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","/* eslint-disable no-shadow */\n\n/**\n * Перечисление допустимых типов медиафайлов статьи блога.\n */\nexport enum BlogPostMediaTypeEnum {\n /**\n * Изображение.\n */\n Image = 'image',\n\n /**\n * Видео.\n */\n Video = 'video',\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","import { BlogPostMediaTypeEnum } from '@sc/blog/enums/blog-post-media-type-enum';\nimport { IBlogPostMediaFile } from '@sc/blog/interfaces/i-blog-post-media-file';\nimport { Identity } from '@sc/system/classes/identity';\n\n/**\n * Данные о медиафайле статьи блога.\n */\nexport class BlogPostMediaFile extends Identity<string> implements IBlogPostMediaFile {\n /**\n * @inheritDoc\n */\n public mediaType: BlogPostMediaTypeEnum;\n\n /**\n * @inheritDoc\n */\n public isCover: boolean;\n\n /**\n * @inheritDoc\n */\n public isUnused: boolean;\n\n /**\n * @inheritDoc\n */\n public url: string;\n\n /**\n * @inheritDoc\n */\n public urlWebp?: string;\n\n /**\n * Инициализирует экземпляр класса {@link BlogPostMediaFile}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IBlogPostMediaFile>) {\n super(data, '');\n\n this.mediaType = data?.mediaType ?? BlogPostMediaTypeEnum.Image;\n this.isCover = data?.isCover ?? false;\n this.isUnused = data?.isUnused ?? false;\n this.url = data?.url ?? '';\n this.urlWebp = data?.urlWebp;\n }\n\n /**\n * Возвращает признак того, что медиафайл является изображением.\n */\n public isImage(): boolean {\n return this.mediaType === BlogPostMediaTypeEnum.Image;\n }\n\n /**\n * Возвращает признак того, что медиафайл является видео.\n */\n public isVideo(): boolean {\n return this.mediaType === BlogPostMediaTypeEnum.Video;\n }\n}\n","/* eslint-disable no-shadow */\n\n/**\n * Перечисление допустимых состояний публикации статьи блога.\n */\nexport enum BlogPostPublicationStatusEnum {\n /**\n * Черновик: дата публикации не задана, на сайте статья не отображается.\n */\n Draft = 'draft',\n\n /**\n * Опубликована: дата публикации наступила, статья отображается на сайте.\n */\n Published = 'published',\n\n /**\n * Запланирована: дата публикации задана, но ещё не наступила.\n */\n Scheduled = 'scheduled',\n}\n","import { useBaseConfigStateStore } from '@sc/config/states/config-state-store';\nimport { IDatePeriod } from '@sc/system/interfaces/i-date-period';\nimport { format, isValid, parseISO } from 'date-fns';\nimport { isNil, isString } from 'lodash-es';\n\n/**\n * Класс-помощник для приведения значений дат из данных ответов API и к данным запросов API.\n */\nexport class DateHelper {\n /**\n * Преобразует значение даты из данных ответа в дату.\n * Строки разбираются как ISO-даты; нечитаемое значение равносильно отсутствию даты.\n *\n * @param value Значение даты: дата, строка в формате ISO или пустое значение.\n */\n public static parse(value?: Date | string | null): Date | undefined {\n if (isNil(value)) {\n return undefined;\n }\n\n const date = isString(value) ? parseISO(value) : value;\n\n return isValid(date) ? date : undefined;\n }\n\n /**\n * Возвращает дату в формате API либо `null`, если дата не задана или некорректна.\n *\n * @param date Дата.\n */\n public static toApiFormat(date?: Date | null): string | null {\n return isNil(date) || !isValid(date) ? null : format(date, useBaseConfigStateStore().config.dateFormats.api);\n }\n\n /**\n * Возвращает период с датами начала и окончания в формате API.\n *\n * @param period Период.\n */\n public static periodToApiFormat(period: IDatePeriod): Record<keyof IDatePeriod, string | null> {\n return { from: DateHelper.toApiFormat(period.from), to: DateHelper.toApiFormat(period.to) };\n }\n}\n","import { DateHelper } from '@sc/date-time/helpers/date-helper';\nimport { Identity } from '@sc/system/classes/identity';\nimport { ICreatableIdentity } from '@sc/system/interfaces/i-creatable-identity';\n\n/**\n * Базовая идентифицируемая сущность с обязательной датой создания.\n */\nexport abstract class CreatableIdentity<T = number> extends Identity<T> implements ICreatableIdentity<T> {\n /**\n * Дата и время создания записи. Если не задана в данных, используется текущий момент.\n */\n public createdAt: Date;\n\n /**\n * Инициализирует экземпляр класса {@link CreatableIdentity}.\n *\n * @param data Данные для первоначальной инициализации.\n * @param defaultIdValue Значение идентификатора по-умолчанию, если оно не определено в данных.\n */\n protected constructor(data?: Partial<ICreatableIdentity<T>>, defaultIdValue?: T) {\n super(data, defaultIdValue);\n\n this.createdAt = DateHelper.parse(data?.createdAt) ?? new Date();\n }\n}\n","import { BlogPostPublicationStatusEnum } from '@sc/blog/enums/blog-post-publication-status-enum';\nimport { IBlogPostShortInfo } from '@sc/blog/interfaces/i-blog-post-short-info';\nimport { CreatableIdentity } from '@sc/system/classes/creatable-identity';\nimport { parseISO } from 'date-fns';\nimport { endsWith, includes, isNil, isString, startsWith } from 'lodash-es';\n\n/**\n * Краткие данные о статье блога.\n */\nexport class BlogPostShortInfo extends CreatableIdentity implements IBlogPostShortInfo {\n /**\n * Возвращает состояние публикации статьи по дате её публикации.\n *\n * @param publishedAt Дата и время публикации статьи.\n */\n public static resolvePublicationStatus(publishedAt?: Date | null): BlogPostPublicationStatusEnum {\n if (isNil(publishedAt)) {\n return BlogPostPublicationStatusEnum.Draft;\n }\n\n return publishedAt.getTime() > Date.now() ? BlogPostPublicationStatusEnum.Scheduled : BlogPostPublicationStatusEnum.Published;\n }\n\n /**\n * Возвращает описание ошибки символьного обозначения статьи либо пустую строку,\n * если обозначение заполнено правильно.\n *\n * Портал принимает обозначение вида `kak-vybrat-podokonnik`: строчные латинские буквы\n * и цифры, разделённые одиночными дефисами.\n *\n * @param slug Символьное обозначение статьи.\n */\n public static getSlugError(slug?: string | null): string {\n if (!slug) {\n return '';\n }\n\n if (/[^a-z0-9-]/.test(slug)) {\n return 'Допустимы только строчные латинские буквы, цифры и дефис: пример «kak-vybrat-podokonnik».';\n }\n\n if (startsWith(slug, '-') || endsWith(slug, '-')) {\n return 'Обозначение не может начинаться или заканчиваться дефисом.';\n }\n\n if (includes(slug, '--')) {\n return 'Дефисы не могут идти подряд: разделяйте слова одним дефисом.';\n }\n\n return '';\n }\n\n /**\n * Преобразует значение даты, полученное из API, в объект {@link Date}.\n *\n * @param value Значение даты.\n */\n protected static parseDate(value?: Date | string | null): Date | null {\n if (isNil(value)) {\n return null;\n }\n\n return isString(value) ? parseISO(value) : value;\n }\n\n /**\n * @inheritDoc\n */\n public slug: string;\n\n /**\n * @inheritDoc\n */\n public title: string;\n\n /**\n * @inheritDoc\n */\n public publishedAt: Date | null;\n\n /**\n * Инициализирует экземпляр класса {@link BlogPostShortInfo}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IBlogPostShortInfo>) {\n super(data, -1);\n\n this.slug = data?.slug ?? '';\n this.title = data?.title ?? '';\n this.publishedAt = BlogPostShortInfo.parseDate(data?.publishedAt);\n }\n\n /**\n * Возвращает состояние публикации статьи.\n */\n public getPublicationStatus(): BlogPostPublicationStatusEnum {\n return BlogPostShortInfo.resolvePublicationStatus(this.publishedAt);\n }\n}\n","import { BlogPostMediaFile } from '@sc/blog/classes/blog-post-media-file';\nimport { BlogPostShortInfo } from '@sc/blog/classes/blog-post-short-info';\nimport { IBlogPost } from '@sc/blog/interfaces/i-blog-post';\nimport { IBlogPostMediaFile } from '@sc/blog/interfaces/i-blog-post-media-file';\nimport { IBlogPostSaveData } from '@sc/blog/interfaces/i-blog-post-save-data';\n\n/**\n * Полные данные о статье блога.\n */\nexport class BlogPost extends BlogPostShortInfo implements IBlogPost {\n /**\n * @inheritDoc\n */\n public content: string;\n\n /**\n * @inheritDoc\n */\n public media: BlogPostMediaFile[];\n\n /**\n * Инициализирует экземпляр класса {@link BlogPost}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IBlogPost>) {\n super(data);\n\n this.content = data?.content ?? '';\n this.media = (data?.media ?? []).map((mediaFile: IBlogPostMediaFile) => new BlogPostMediaFile(mediaFile));\n }\n\n /**\n * Возвращает данные статьи для отправки на портал.\n *\n * Пустое символьное обозначение не передаётся. При создании статьи портал формирует его\n * самостоятельно из заголовка, при изменении - оставляет прежнее значение без изменений.\n *\n * @param withContent Признак того, что в данные необходимо включить текст статьи.\n */\n public toSaveData(withContent: boolean = false): IBlogPostSaveData {\n return {\n title: this.title,\n slug: this.slug.length > 0 ? this.slug : undefined,\n content: withContent ? this.content : undefined,\n publishedAt: this.publishedAt,\n };\n }\n\n /**\n * Возвращает данные обложки статьи.\n */\n public getCover(): BlogPostMediaFile | undefined {\n // eslint-disable-next-line lodash/prefer-lodash-method\n return this.media.find((mediaFile) => mediaFile.isCover);\n }\n\n /**\n * Возвращает список медиафайлов, не используемых в тексте статьи.\n */\n public getUnusedMedia(): BlogPostMediaFile[] {\n // eslint-disable-next-line lodash/prefer-lodash-method\n return this.media.filter((mediaFile) => mediaFile.isUnused);\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any,@typescript-eslint/no-unnecessary-condition */\n\nimport { IPaginationFiltersBase } from '@sc/pagination/filters/i-pagination-filters-base';\nimport { IReference } from '@sc/system/interfaces/i-reference';\nimport { isFunction, isNil, isString } from 'lodash-es';\n\n/**\n * Базовый абстрактный класс для фильтров пагинации.\n * Определяет контракт методов сброса и очистки фильтров.\n */\nexport abstract class PaginationFiltersBase implements IPaginationFiltersBase {\n /**\n * Выполняет сброс указанного фильтра в значение по умолчанию.\n *\n * @param key Название фильтра, значение которого необходимо сбросить.\n */\n public abstract resetFilterValue(key: string): this;\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 // eslint-disable-next-line security/detect-object-injection\n const value = (this as Record<string, unknown>)[k];\n\n if (\n !(\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 return result;\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 { BlogPostPublicationStatusEnum } from '@sc/blog/enums/blog-post-publication-status-enum';\nimport { IBlogPostsListFilters } from '@sc/blog/interfaces/i-blog-posts-list-filters';\nimport { PaginationFiltersBase } from '@sc/pagination/filters/pagination-filters-base';\nimport { DatePeriod } from '@sc/system/classes/date-period';\nimport { IDatePeriod } from '@sc/system/interfaces/i-date-period';\n\n/**\n * Данные о параметрах фильтрации списка статей блога.\n */\nexport class BlogPostsListFilters extends PaginationFiltersBase implements IBlogPostsListFilters {\n /**\n * @inheritDoc\n */\n public id?: string;\n\n /**\n * @inheritDoc\n */\n public title?: string;\n\n /**\n * @inheritDoc\n */\n public slug?: string;\n\n /**\n * @inheritDoc\n */\n public content?: string;\n\n /**\n * @inheritDoc\n */\n public publicationStatus?: BlogPostPublicationStatusEnum;\n\n /**\n * @inheritDoc\n */\n public publishedAt: IDatePeriod;\n\n /**\n * @inheritDoc\n */\n public createdAt: IDatePeriod;\n\n /**\n * Инициализирует экземпляр класса {@link BlogPostsListFilters}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IBlogPostsListFilters) {\n super();\n\n this.id = data?.id;\n this.title = data?.title;\n this.slug = data?.slug;\n this.content = data?.content;\n this.publicationStatus = data?.publicationStatus;\n this.publishedAt = new DatePeriod(data?.publishedAt);\n this.createdAt = new DatePeriod(data?.createdAt);\n }\n\n /**\n * Выполняет сброс указанного фильтра в значение по умолчанию.\n *\n * @param key Название фильтра, значение которого необходимо сбросить.\n */\n public resetFilterValue(key: string): this {\n switch (key) {\n case 'id':\n case 'title':\n case 'slug':\n case 'content':\n case 'publicationStatus':\n // eslint-disable-next-line security/detect-object-injection\n this[key] = undefined;\n break;\n case 'publishedAt':\n this.publishedAt.from = null;\n this.publishedAt.to = null;\n break;\n case 'createdAt':\n this.createdAt.from = null;\n this.createdAt.to = null;\n break;\n default:\n break;\n }\n\n return this;\n }\n\n /**\n * Возвращает очищенное значение фильтров, содержащие\n * только актуальные данные.\n *\n * TODO: Удаление незаполненных периодов повторяется в фильтрах нескольких доменов.\n * Общий механизм стоит перенести в {@link PaginationFiltersBase} отдельной\n * задачей по унификации.\n */\n public asClearRaw(): Record<string, any> {\n const result = super.asClearRaw();\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (!result?.publishedAt?.from && !result?.publishedAt?.to) {\n delete result.publishedAt;\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 return result;\n }\n}\n","import { isArray, map } from 'lodash-es';\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 /**\n * Инициализирует список экземпляров указанного класса.\n *\n * @param type Тип класса, на основе которого необходимо создать экземпляры (тип возвращаемых данных).\n * @param data Список начальных данных для инициализации (параметры конструктора).\n *\n * @throws TypeError Если вместо списка данных получены данные другого типа.\n */\n public static instanceListInitializer<OutDataInterface, SourceDataInterface>(\n // eslint-disable-next-line no-unused-vars\n type: new (data: SourceDataInterface) => OutDataInterface,\n data: SourceDataInterface[]\n ): OutDataInterface[] {\n // Источник данных может вернуть не список (пустое тело ответа, данные другого формата),\n // поэтому проверяем тип до инициализации экземпляров.\n if (!isArray(data)) {\n throw new TypeError(`Ожидался список данных для инициализации \"${type.name}\", получены данные типа \"${typeof data}\".`);\n }\n\n return map(data, (item) => TypedInstanceFactory.instanceInitializer(type, item));\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/states/auth-state-store';\nimport { useBaseConfigStateStore } from '@sc/config/states/config-state-store';\nimport { IHttpResponseError } from '@sc/http/interfaces/i-http-response-error';\nimport { ErrorResponseNotificationHandler } from '@sc/http/types/error-response-notification-handler';\nimport { HttpRequestParams } from '@sc/http/types/http-request-params';\nimport { RequestHook, ResponseHook } from '@sc/http/types/request-hook';\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, CanceledError, InternalAxiosRequestConfig } from 'axios';\nimport { isError, isNil, isObject, 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 protected static requestHooks: RequestHook[] = [];\n\n /**\n * Список зарегистрированных хуков для ответов.\n */\n protected static responseHooks: ResponseHook[] = [];\n\n /**\n * Устанавливает базовый обработчик ошибок выполнения запросов.\n *\n * @param handler Ссылка на функцию-обработчик ошибок.\n */\n public static setDefaultErrorsResponseHandler(handler: ErrorResponseNotificationHandler): void {\n HttpRequester.defaultErrorsResponseHandler = handler;\n }\n\n /**\n * Регистрирует хук, который будет вызываться перед выполнением каждого HTTP запроса.\n *\n * @param hook Функция-хук для обработки запроса.\n */\n public static addRequestHook(hook: RequestHook): void {\n if (!HttpRequester.requestHooks.includes(hook)) {\n HttpRequester.requestHooks.push(hook);\n }\n }\n\n /**\n * Удаляет зарегистрированный хук запроса.\n *\n * @param hook Функция-хук для удаления.\n */\n public static removeRequestHook(hook: RequestHook): void {\n const index = HttpRequester.requestHooks.indexOf(hook);\n\n if (index !== -1) {\n HttpRequester.requestHooks.splice(index, 1);\n }\n }\n\n /**\n * Регистрирует хук, который будет вызываться после получения ответа на каждый HTTP запрос.\n *\n * @param hook Функция-хук для обработки ответа.\n */\n public static addResponseHook(hook: ResponseHook): void {\n if (!HttpRequester.responseHooks.includes(hook)) {\n HttpRequester.responseHooks.push(hook);\n }\n }\n\n /**\n * Удаляет зарегистрированный хук ответа.\n *\n * @param hook Функция-хук для удаления.\n */\n public static removeResponseHook(hook: ResponseHook): void {\n const index = HttpRequester.responseHooks.indexOf(hook);\n\n if (index !== -1) {\n HttpRequester.responseHooks.splice(index, 1);\n }\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 * Ошибка обработки данных ответа не является ошибкой запроса, но пользователю о ней сообщить нужно,\n * поэтому она приводится к общему виду и обрабатывается обработчиком ошибок запросов.\n *\n * @param error Данные об ошибке.\n */\n protected static toHttpResponseError(error: unknown): IHttpResponseError {\n if (isObject(error) && 'status' in error) {\n return error as IHttpResponseError;\n }\n\n return {\n status: 0,\n statusText: 'Invalid response data',\n message: isError(error) ? error.message : 'Не удалось обработать данные ответа сервера.',\n headers: {},\n rawError: isError(error) ? error : new Error(String(error)),\n };\n }\n\n /**\n * Конвертирует данные ошибки HTTP запроса в более упрощённую и часто используемую форму.\n *\n * @param error Данные об ошибке.\n */\n protected static convertHttpErrorResponse(error: any): Promise<IHttpResponseError> {\n if (isNil(error) || !isNil(error.request) || !isNil(error.response)) {\n const rawResponse = isNil(error) ? {} : 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 = `${useBaseConfigStateStore().config.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 userRequestHooksInterceptor = async (request: InternalAxiosRequestConfig): Promise<InternalAxiosRequestConfig> => {\n // Вызываем все зарегистрированные пользовательские хуки запросов последовательно.\n // eslint-disable-next-line unicorn/no-array-reduce,lodash/prefer-lodash-method\n return HttpRequester.requestHooks.reduce(async (configPromise, hook) => hook(await configPromise), Promise.resolve(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 * Перехватчик ответа для приведения отмены запроса (AbortController) к единому виду.\n *\n * @param error Данные ошибки ответа на запрос (сырая ошибка axios до convertHttpErrorResponse).\n */\n // eslint-disable-next-line class-methods-use-this\n private canceledResponseInterceptor = (error: any): Promise<never> => {\n const raw = error.rawError ?? error;\n const isCanceled = raw.name === 'CanceledError' || raw.code === 'ERR_CANCELED';\n\n if (isCanceled) {\n throw new CanceledError('Request canceled');\n }\n\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 userResponseHooksInterceptor = async (response: AxiosResponse): Promise<AxiosResponse> => {\n // Вызываем все зарегистрированные пользовательские хуки ответов последовательно.\n // eslint-disable-next-line unicorn/no-array-reduce,lodash/prefer-lodash-method\n return HttpRequester.responseHooks.reduce(async (responsePromise, hook) => hook(await responsePromise), Promise.resolve(response));\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 // Устанавливаем обработчик ошибок по умолчанию для уведомления пользователей.\n this.errorResponseHandler = HttpRequester.defaultErrorsResponseHandler;\n\n // Инициализация клиента для выполнения HTTP запросов.\n this.httpClient = axios.create({\n headers: {\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 // Перехватчик запросов для вызова пользовательских хуков (должен быть после установки базового URL, но перед другими обработчиками).\n this.interceptorIds.request.userRequestHooksInterceptor = this.httpClient.interceptors.request.use(this.userRequestHooksInterceptor, (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 // Перехватчик ответов для приведения отмены запроса (AbortController) к единому виду.\n this.interceptorIds.response.canceledResponseInterceptor = this.httpClient.interceptors.response.use((response) => response, this.canceledResponseInterceptor);\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 this.interceptorIds.response.userResponseHooksInterceptor = this.httpClient.interceptors.response.use(this.userResponseHooksInterceptor, (error) => Promise.reject(error));\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 if ((error as any)?.name !== 'CanceledError') {\n this.errorResponseHandler(HttpRequester.toHttpResponseError(error), validationFieldResultData, disableNotifications);\n }\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 * @param signal Сигнал отмены запроса.\n */\n protected get<T>(\n url: string,\n params: HttpRequestParams = {},\n successHandler: undefined | ((response: AxiosResponse<T>) => T) = undefined,\n disableNotifications: boolean = false,\n signal: AbortSignal | undefined = undefined\n ): Promise<T> {\n return this.request<T>({ method: 'GET', url: url, params: params, signal }, successHandler, {}, disableNotifications);\n }\n\n /**\n * Выполняет get-запрос и возвращает список экземпляров указанного класса.\n *\n * @param type Тип класса, экземплярами которого являются элементы возвращаемого списка.\n * @param url URL запроса.\n * @param params Параметры запроса.\n * @param disableNotifications Признак необходимости отключить уведомления об ошибках.\n * @param signal Сигнал отмены запроса.\n */\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters\n protected getTypedList<OutDataInterface, SourceDataInterface>(\n // eslint-disable-next-line no-unused-vars\n type: new (data: SourceDataInterface) => OutDataInterface,\n url: string,\n params: HttpRequestParams = {},\n disableNotifications: boolean = false,\n signal: AbortSignal | undefined = undefined\n ): Promise<OutDataInterface[]> {\n return this.get<OutDataInterface[]>(\n url,\n params,\n (response) => TypedInstanceFactory.instanceListInitializer(type, response.data as unknown as SourceDataInterface[]),\n disableNotifications,\n signal\n );\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: HttpRequestParams = {},\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","/* 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 { useBaseConfigStateStore } from '@sc/config/states/config-state-store';\nimport { ITypedNullableRange } from '@sc/system/interfaces/i-typed-nullable-range';\nimport { FilterOpEnum } from '@sc/table-data/enums/filter-op-enum';\nimport { IFilterItem } from '@sc/table-data/interfaces/i-filter-item';\nimport { format } from 'date-fns';\nimport { isDate, isPlainObject } 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 | ITypedNullableRange<Date | null>;\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, unknown> {\n const apiDateFormat = useBaseConfigStateStore().config.dateFormats.api;\n\n const result: Record<string, unknown> = {\n field: this.field,\n op: this.op,\n };\n\n if (isDate(this.value)) {\n result.value = format(this.value, apiDateFormat);\n } else if (isPlainObject(this.value)) {\n const range = this.value as ITypedNullableRange<Date | null>;\n\n result.value = {\n from: range.from ? format(range.from, apiDateFormat) : null,\n to: range.to ? format(range.to, apiDateFormat) : null,\n };\n } else {\n result.value = this.value;\n }\n\n return result;\n }\n}\n","import { FilterItem } from '@sc/table-data/classes/filter-item';\nimport { IFilterGroup } from '@sc/table-data/interfaces/i-filter-group';\nimport { IFilterItem } from '@sc/table-data/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 { HttpRequester } from '@sc/http/classes/http-requester';\nimport { IPaginatedResponse } from '@sc/pagination/interfaces/i-paginated-response';\nimport { TypedInstanceFactory } from '@sc/system/providers/typed-instance-factory';\nimport { FilterGroup } from '@sc/table-data/classes/filter-group';\nimport { IFilterGroup } from '@sc/table-data/interfaces/i-filter-group';\nimport { IPaginationRequestParams } from '@sc/table-data/interfaces/i-pagination-request-params';\nimport { ISortRequestParams } from '@sc/table-data/interfaces/i-sort-request-params';\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 * @param signal Сигнал отмены запроса.\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 signal: AbortSignal | undefined = undefined\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, signal);\n }\n\n /**\n * Получает пагинированный список экземпляров указанного класса.\n *\n * @param type Тип класса, экземплярами которого являются элементы возвращаемого списка.\n * @param url URL запроса.\n * @param filters Параметры фильтрации.\n * @param sortParams Параметры сортировки.\n * @param paginationParams Параметры пагинации.\n * @param extraParams Дополнительные параметры запроса.\n * @param disableDefaultNotificationErrorResponseHandler Признак отключения стандартного обработчика ошибок.\n * @param signal Сигнал отмены запроса.\n */\n protected getTypedPaginated<SourceDataInterface, OutDataInterface extends SourceDataInterface>(\n // eslint-disable-next-line no-unused-vars\n type: new (data: SourceDataInterface) => OutDataInterface,\n url: string,\n filters?: IFilterGroup,\n sortParams?: ISortRequestParams[] | ISortRequestParams,\n paginationParams?: IPaginationRequestParams,\n extraParams?: object,\n disableDefaultNotificationErrorResponseHandler?: boolean,\n signal: AbortSignal | undefined = undefined\n ): Promise<IPaginatedResponse<OutDataInterface>> {\n return this.getPaginated<SourceDataInterface, OutDataInterface>(\n url,\n filters,\n sortParams,\n paginationParams,\n extraParams,\n (response) => ({\n ...response.data,\n data: TypedInstanceFactory.instanceListInitializer(type, response.data.data),\n }),\n disableDefaultNotificationErrorResponseHandler,\n signal\n );\n }\n}\n","import { BlogPost } from '@sc/blog/classes/blog-post';\nimport { BlogPostMediaFile } from '@sc/blog/classes/blog-post-media-file';\nimport { BlogPostShortInfo } from '@sc/blog/classes/blog-post-short-info';\nimport { IBlogPost } from '@sc/blog/interfaces/i-blog-post';\nimport { IBlogPostMediaFile } from '@sc/blog/interfaces/i-blog-post-media-file';\nimport { IBlogPostSaveData } from '@sc/blog/interfaces/i-blog-post-save-data';\nimport { IBlogPostShortInfo } from '@sc/blog/interfaces/i-blog-post-short-info';\nimport { useBaseConfigStateStore } from '@sc/config/states/config-state-store';\nimport { IPaginatedResponse } from '@sc/pagination/interfaces/i-paginated-response';\nimport { BasePaginationProvider } from '@sc/pagination/providers/base-pagination-provider';\nimport { IFile } from '@sc/system/interfaces/i-file';\nimport { IFilterGroup } from '@sc/table-data/interfaces/i-filter-group';\nimport { IPaginationRequestParams } from '@sc/table-data/interfaces/i-pagination-request-params';\nimport { ISortRequestParams } from '@sc/table-data/interfaces/i-sort-request-params';\nimport { IFieldValidationResultData } from '@sc/validation/interfaces/i-field-validation-result-data';\nimport { format } from 'date-fns';\nimport { isNil, isUndefined } from 'lodash-es';\n\n/**\n * Предоставляет механизмы получения/управления статьями блога.\n */\nexport class BlogProvider extends BasePaginationProvider {\n /**\n * Возвращает данные статьи блога, подготовленные для отправки на портал.\n *\n * TODO: Преобразование даты в формат портала повторяется в нескольких провайдерах\n * библиотеки. Общий механизм стоит вынести отдельной задачей по унификации.\n *\n * @param data Данные статьи блога.\n */\n private static preparePostSaveData(data: IBlogPostSaveData): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n if (!isUndefined(data.title)) {\n result.title = data.title;\n }\n\n if (!isUndefined(data.slug)) {\n result.slug = data.slug;\n }\n\n if (!isUndefined(data.content)) {\n result.content = data.content;\n }\n\n if (!isUndefined(data.publishedAt)) {\n const apiDateFormat = useBaseConfigStateStore().config.dateFormats.api;\n\n result.publishedAt = isNil(data.publishedAt) ? null : format(data.publishedAt, apiDateFormat);\n }\n\n return result;\n }\n\n /**\n * Возвращает список статей блога.\n *\n * TODO: При слиянии с develop заменить тело метода на `getTypedPaginated(BlogPostShortInfo, '/internal/blog', ...)`,\n * который появляется в базовом провайдере пагинации там.\n *\n * @param filters Параметры фильтрации данных.\n * @param sortParams Параметры сортировки.\n * @param paginationParams Параметры пагинации.\n *\n * @see /doc/api/internal#/operations/api_internal_blog_get_list\n */\n public getPostList(\n filters?: IFilterGroup,\n sortParams?: ISortRequestParams[] | ISortRequestParams,\n paginationParams?: IPaginationRequestParams\n ): Promise<IPaginatedResponse<IBlogPostShortInfo>> {\n return this.getPaginated<IBlogPostShortInfo, BlogPostShortInfo>('/internal/blog', filters, sortParams, paginationParams, {}, (response) => ({\n ...response.data,\n // eslint-disable-next-line lodash/prefer-lodash-method\n data: response.data.data.map((item: IBlogPostShortInfo) => new BlogPostShortInfo(item)),\n }));\n }\n\n /**\n * Возвращает данные о статье блога.\n *\n * @param postId Идентификатор статьи блога.\n *\n * @see /doc/api/internal#/operations/api_internal_blog_get\n */\n public getPost(postId: number): Promise<IBlogPost> {\n return this.get<IBlogPost>(`/internal/blog/${postId}`, {}, (response) => new BlogPost(response.data));\n }\n\n /**\n * Создаёт новую статью блога.\n *\n * @param data Данные для создания статьи блога.\n * @param validationFieldResultData Список полей, для которых необходимо\n * установить данные об ошибках валидации\n * в случае ошибок в запросах.\n *\n * @see /doc/api/internal#/operations/api_internal_blog_create\n */\n public createPost(data: IBlogPostSaveData, validationFieldResultData: Record<string, IFieldValidationResultData> = {}): Promise<IBlogPost> {\n return this.post<IBlogPost>('/internal/blog', BlogProvider.preparePostSaveData(data), (response) => new BlogPost(response.data), validationFieldResultData);\n }\n\n /**\n * Изменяет данные о статье блога.\n *\n * @param postId Идентификатор статьи блога.\n * @param data Данные для изменения статьи блога.\n * @param validationFieldResultData Список полей, для которых необходимо\n * установить данные об ошибках валидации\n * в случае ошибок в запросах.\n *\n * @see /doc/api/internal#/operations/api_internal_blog_update\n */\n public updatePost(postId: number, data: IBlogPostSaveData, validationFieldResultData: Record<string, IFieldValidationResultData> = {}): Promise<IBlogPost> {\n return this.patch<IBlogPost>(`/internal/blog/${postId}`, BlogProvider.preparePostSaveData(data), (response) => new BlogPost(response.data), validationFieldResultData);\n }\n\n /**\n * Удаляет статью блога.\n *\n * @param postId Идентификатор статьи блога.\n *\n * @see /doc/api/internal#/operations/api_internal_blog_delete\n */\n public removePost(postId: number): Promise<void> {\n return this.delete(`/internal/blog/${postId}`);\n }\n\n /**\n * Загружает медиафайл и привязывает его к статье блога.\n *\n * @param postId Идентификатор статьи блога.\n * @param file Данные загружаемого файла.\n * @param isCover Признак того, что файл является обложкой статьи.\n * @param uploadProgressHandler Обработчик хода отправки файла, получающий процент отправленных данных.\n * @param validationFieldResultData Список полей, для которых необходимо\n * установить данные об ошибках валидации\n * в случае ошибок в запросах.\n *\n * @see /doc/api/internal#/operations/api_internal_blog_upload_media\n */\n public uploadMedia(\n postId: number,\n file: IFile,\n isCover?: boolean,\n uploadProgressHandler?: (percentage: number) => void,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<IBlogPostMediaFile> {\n return this.request<IBlogPostMediaFile>(\n {\n method: 'POST',\n url: `/internal/blog/${postId}/media`,\n data: { file: file, isCover: isCover ?? false },\n onUploadProgress: (event) => {\n if (uploadProgressHandler) {\n uploadProgressHandler(event.total ? Math.round((event.loaded / event.total) * 100) : 0);\n }\n },\n },\n (response) => new BlogPostMediaFile(response.data),\n validationFieldResultData\n );\n }\n\n /**\n * Изменяет данные медиафайла статьи блога.\n *\n * @param postId Идентификатор статьи блога.\n * @param mediaId Идентификатор медиафайла.\n * @param isCover Признак того, что файл является обложкой статьи.\n * @param validationFieldResultData Список полей, для которых необходимо\n * установить данные об ошибках валидации\n * в случае ошибок в запросах.\n *\n * @see /doc/api/internal#/operations/api_internal_blog_update_media\n */\n public updateMedia(postId: number, mediaId: string, isCover: boolean, validationFieldResultData: Record<string, IFieldValidationResultData> = {}): Promise<IBlogPostMediaFile> {\n return this.patch<IBlogPostMediaFile>(\n `/internal/blog/${postId}/media/${mediaId}`,\n { isCover: isCover },\n (response) => new BlogPostMediaFile(response.data),\n validationFieldResultData\n );\n }\n\n /**\n * Удаляет медиафайл статьи блога.\n *\n * Портал запрещает удалять медиафайл, используемый в тексте статьи.\n *\n * @param postId Идентификатор статьи блога.\n * @param mediaId Идентификатор медиафайла.\n *\n * @see /doc/api/internal#/operations/api_internal_blog_delete_media\n */\n public removeMedia(postId: number, mediaId: string): Promise<void> {\n return this.delete(`/internal/blog/${postId}/media/${mediaId}`);\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';\nimport { isEmpty } from 'lodash-es';\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 /**\n * @inheritdoc\n */\n public nameOrGuid(): string {\n return isEmpty(this.name) ? this.guid : this.name;\n }\n}\n","import { DateHelper } from '@sc/date-time/helpers/date-helper';\nimport { NamedIdentity } from '@sc/system/classes/named-identity';\nimport { IUpdatableNamedIdentity } from '@sc/system/interfaces/i-updatable-named-identity';\n\n/**\n * Базовая идентифицируемая сущность содержащая название, даты создания и изменения.\n */\nexport abstract class UpdatableNamedIdentity extends NamedIdentity implements IUpdatableNamedIdentity {\n /**\n * Дата и время создания записи.\n */\n public createdAt?: Date;\n\n /**\n * Дата и время последнего изменения.\n */\n public updatedAt?: Date;\n\n /**\n * Инициализирует экземпляр класса {@link UpdatableNamedIdentity}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n protected constructor(data?: Partial<IUpdatableNamedIdentity>) {\n super(data);\n\n this.createdAt = DateHelper.parse(data?.createdAt);\n this.updatedAt = DateHelper.parse(data?.updatedAt);\n }\n}\n","import { DateHelper } from '@sc/date-time/helpers/date-helper';\nimport { UpdatableNamedIdentity } from '@sc/system/classes/updatable-named-identity';\nimport { IDeletableNamedIdentity } from '@sc/system/interfaces/i-deletable-named-identity';\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?: Partial<IDeletableNamedIdentity>) {\n super(data);\n\n this.deletedAt = DateHelper.parse(data?.deletedAt);\n }\n}\n","import { NamedIdentity } from '@sc/system/classes/named-identity';\nimport { UserTypeEnum } from '@sc/user/enums/user-type-enum';\nimport { IUserShortInfo } from '@sc/user/interfaces/i-user-short-info';\n\n/**\n * Краткие данные о пользователе.\n */\nexport class UserShortInfo extends NamedIdentity implements IUserShortInfo {\n /**\n * Тип пользователя.\n */\n public type?: UserTypeEnum;\n\n /**\n * @inheritDoc\n */\n public isActive?: boolean;\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 this.isActive = data?.isActive ?? true;\n }\n}\n","import { IDiscountShortInfo } from '@sc/catalog/interfaces/i-discount-short-info';\nimport { DateHelper } from '@sc/date-time/helpers/date-helper';\nimport { DeletableNamedIdentity } from '@sc/system/classes/deletable-named-identity';\nimport { UserShortInfo } from '@sc/user/classes/user-short-info';\nimport { IUserShortInfo } from '@sc/user/interfaces/i-user-short-info';\n\n/**\n * Краткие данные скидки.\n */\nexport class DiscountShortInfo extends DeletableNamedIdentity 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 * Инициализирует экземпляр класса {@link DiscountShortInfo}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IDiscountShortInfo>) {\n super(data);\n\n this.costCoefficient = data?.costCoefficient ?? 0;\n this.isLowPriceAllowed = data?.isLowPriceAllowed ?? false;\n this.publishedAt = DateHelper.parse(data?.publishedAt);\n this.description = data?.description ?? undefined;\n this.percent = data?.percent ?? 0;\n this.owner = new UserShortInfo(data?.owner);\n }\n}\n","import { IPriceTemplate } from '@sc/catalog/interfaces/i-price-template';\nimport { UpdatableNamedIdentity } from '@sc/system/classes/updatable-named-identity';\nimport { UserShortInfo } from '@sc/user/classes/user-short-info';\n\n/**\n * Данные шаблона прайс-листа.\n */\nexport class PriceTemplate extends UpdatableNamedIdentity implements IPriceTemplate {\n /**\n * Описание шаблона прайс-листа.\n */\n public description?: string;\n\n /**\n * Данные о пользователе, создавшем шаблон прайс-листа.\n */\n public owner?: UserShortInfo;\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.owner = data?.owner ? new UserShortInfo(data.owner) : 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 const coefficient = new PriceCoefficient({\n id: -2,\n slug: PriceCoefficientEnum.Retail,\n name: 'Розн. цена',\n guid: '',\n });\n\n // Виртуальная запись справочника всегда считается новой.\n coefficient.isNewRec = constant(true);\n\n return coefficient;\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","/* eslint-disable @typescript-eslint/no-unnecessary-condition */\n\nimport { ICurrency } from '@sc/references/interfaces/i-currency';\nimport { NamedIdentity } from '@sc/system/classes/named-identity';\n/**\n * Данные о валюте.\n */\nexport class Currency extends NamedIdentity implements ICurrency {\n /**\n * Сигнатура валюты.\n */\n public signature: string = '';\n\n /**\n * Цифровой код валюты по стандарту ISO 4217.\n */\n public code?: number;\n\n /**\n * Символ валюты.\n */\n public symbol: string = '';\n\n /**\n * Точность округления (количество знаков после запятой).\n */\n public precision?: number;\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.code = data.code;\n this.symbol = data.symbol ?? '';\n this.precision = data.precision;\n }\n }\n}\n","/* eslint-disable @typescript-eslint/no-unnecessary-condition */\n\nimport { IProductUnit } from '@sc/references/interfaces/i-product-unit';\nimport { NamedIdentity } from '@sc/system/classes/named-identity';\n/**\n * Данные единицы измерения продукта.\n */\nexport class ProductUnit extends NamedIdentity implements IProductUnit {\n /**\n * Символьное обозначение (slug) единицы измерения продукта.\n */\n public slug: string = '';\n\n /**\n * Описание единицы измерения продукта.\n */\n public description?: string;\n\n /**\n * Признак того, что единица измерения является единицей измерения площади.\n */\n public isSquare: boolean = false;\n\n /**\n * Признак того, что единица измерения является линейной величиной.\n */\n public isLinear: boolean = false;\n\n /**\n * Инициализирует экземпляр класса {@link ProductUnit}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IProductUnit) {\n super(data);\n\n if (data) {\n this.slug = data.slug ?? '';\n this.description = data.description;\n this.isSquare = data.isSquare ?? false;\n this.isLinear = data.isLinear ?? false;\n }\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 { 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 { 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 { 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 { useBaseConfigStateStore } from '@sc/config/states/config-state-store';\nimport { Currency } from '@sc/references/classes/currency';\nimport { ProductUnit } from '@sc/references/classes/product-unit';\nimport { ICurrency } from '@sc/references/interfaces/i-currency';\nimport { IProductUnit } from '@sc/references/interfaces/i-product-unit';\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: IProductUnit;\n\n /**\n * Норма упаковки.\n */\n public pack?: string;\n\n /**\n * Минимальное количество товара для заказа.\n */\n public minCount?: number;\n\n /**\n * Валюта товара или услуги.\n */\n public currency: ICurrency;\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 ? new ProductUnit(data.unit) : new ProductUnit();\n this.pack = data?.pack;\n this.minCount = data?.minCount;\n this.currency = data?.currency ? new Currency(data.currency) : new 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.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, useBaseConfigStateStore().config.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 return this.unit.isLinear || this.unit.isSquare;\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","/* 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","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';\nimport { PriceCoefficient } from '@sc/references/classes/price-coefficient';\nimport { IPriceCoefficient } from '@sc/references/interfaces/i-price-coefficient';\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 priceCoefficient?: IPriceCoefficient;\n\n /**\n * Процент, прибавленный к значению коэффициента цены при расчёте итоговой цены.\n */\n public increasePercent?: number;\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.priceCoefficient = data?.priceCoefficient ? new PriceCoefficient(data.priceCoefficient) : undefined;\n this.increasePercent = data?.increasePercent;\n this.isPreviouslyOrdered = data?.isPreviouslyOrdered;\n this.isRequired = data?.isRequired;\n this.isFavorite = data?.isFavorite;\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","import { ICartItemConfiguratorParamsBase } from '@sc/cart/interfaces/i-cart-item-configurator-params-base';\nimport { IOrderItemBase } from '@sc/cart/interfaces/i-order-item-base';\nimport { ClientProduct } from '@sc/catalog/classes/client-product';\nimport { BaseCategory } from '@sc/catalog/classes/internal/base/base-category';\nimport { IClientProduct } from '@sc/catalog/interfaces/i-client-product';\nimport { ConfiguratorName } from '@sc/configurator/types/configurator-name';\nimport { Currency } from '@sc/references/classes/currency';\nimport { ICurrency } from '@sc/references/interfaces/i-currency';\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 { cloneDeep } from 'lodash-es';\n\n/**\n * Базовая модель позиции заказа/корзины (без полей стоимости и распила).\n */\nexport class OrderItemBase<T extends ICartItemConfiguratorParamsBase | undefined = undefined, TId = number> extends Identity<TId> implements IOrderItemBase<T, TId> {\n /**\n * @inheritDoc\n */\n public category: BaseCategory;\n\n /**\n * @inheritDoc\n */\n public product: IClientProduct;\n\n /**\n * @inheritDoc\n */\n public quantity: number;\n\n /**\n * @inheritDoc\n */\n public currency: ICurrency;\n\n /**\n * @inheritDoc\n */\n public marker?: string;\n\n /**\n * @inheritDoc\n */\n public height?: number;\n\n /**\n * @inheritDoc\n */\n public length?: number;\n\n /**\n * @inheritDoc\n */\n public width?: number;\n\n /**\n * @inheritDoc\n */\n public configurator?: ConfiguratorName;\n\n /**\n * @inheritDoc\n */\n public configuratorParams: T;\n\n /**\n * @inheritDoc\n */\n public isAdditionalSale?: boolean;\n\n /**\n * @inheritDoc\n */\n public creator?: IUserShortInfo;\n\n /**\n * @inheritDoc\n */\n public isRemoved?: boolean;\n\n /**\n * @inheritDoc\n */\n public ord?: number;\n\n /**\n * @inheritDoc\n */\n public onOrder?: boolean;\n\n /**\n * @inheritDoc\n */\n public originalId?: number | null;\n\n /**\n * @inheritDoc\n */\n public replacementId?: number | null;\n\n /**\n * Инициализирует экземпляр класса {@link OrderItemBase}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data: Partial<IOrderItemBase<T, TId>>) {\n super(data);\n\n this.product = new ClientProduct(data.product);\n this.quantity = data.quantity ?? 0;\n this.marker = data.marker;\n this.category = data.category ?? new BaseCategory();\n this.currency = data.currency ? new Currency(data.currency) : (undefined as unknown as ICurrency);\n this.height = data.height;\n this.length = data.length;\n this.width = data.width;\n this.configurator = data.configurator;\n this.configuratorParams = (data.configuratorParams as T) && cloneDeep<T>(data.configuratorParams as T);\n this.isAdditionalSale = data.isAdditionalSale;\n this.creator = data.creator && new UserShortInfo(data.creator);\n this.isRemoved = data.isRemoved;\n this.ord = data.ord;\n this.onOrder = data.onOrder;\n this.originalId = data.originalId;\n this.replacementId = data.replacementId;\n }\n}\n","import { ICartItemConfiguratorParamsBase } from '@sc/cart/interfaces/i-cart-item-configurator-params-base';\nimport { IOrderItem } from '@sc/cart/interfaces/i-order-item';\nimport { OrderItemBase } from '@sc/orders/classes/order-item-base';\nimport { Currency } from '@sc/references/classes/currency';\nimport { ICurrency } from '@sc/references/interfaces/i-currency';\nimport { isArray } from 'lodash-es';\n\n/**\n * Данные о единичной позиции товара/услуги в корзине или заказе.\n */\nexport class OrderItem<T extends ICartItemConfiguratorParamsBase | undefined = undefined, TId = number> extends OrderItemBase<T, TId> implements IOrderItem<T, TId> {\n /**\n * @inheritDoc\n */\n public cost: number;\n\n /**\n * @inheritDoc\n */\n public costOne: number;\n\n /**\n * @inheritDoc\n */\n public costOneRub: number;\n\n /**\n * @inheritDoc\n */\n public costRub: number;\n\n /**\n * @inheritDoc\n */\n public logicGroupId?: string;\n\n /**\n * @inheritDoc\n */\n public salesDirection?: number;\n\n /**\n * @inheritDoc\n */\n public specificationImgUrl?: string;\n\n /**\n * @inheritDoc\n */\n public sawing?: Array<Record<string, number>>;\n\n /**\n * @inheritDoc\n */\n public currency: ICurrency;\n\n /**\n * Инициализирует экземпляр класса {@link OrderItem}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data: IOrderItem<T, TId>) {\n super(data);\n\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 // eslint-disable-next-line sonarjs/no-nested-conditional\n this.sawing = isArray(data.sawing) ? data.sawing : data.sawing ? [data.sawing] : undefined;\n this.currency = new Currency(data.currency);\n }\n}\n","import { OrderItem } from '@sc/cart/classes/order-item';\nimport { ICart } from '@sc/cart/interfaces/i-cart';\nimport { ICartSum } from '@sc/cart/interfaces/i-cart-sum';\nimport { IOrderItem } from '@sc/cart/interfaces/i-order-item';\n\n/**\n * Данные о содержимом корзины.\n */\nexport class Cart implements ICart {\n /**\n * @inheritDoc\n */\n public items: Array<IOrderItem<undefined, string>>;\n\n /**\n * @inheritDoc\n */\n public resultSum: ICartSum;\n\n /**\n * @inheritDoc\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 OrderItem(item));\n this.resultSum = data.resultSum;\n this.directionsSum = data.directionsSum;\n }\n}\n","import { Cart } from '@sc/cart/classes/cart';\nimport { ICart } from '@sc/cart/interfaces/i-cart';\nimport { ICartItemConfiguratorParamsBase } from '@sc/cart/interfaces/i-cart-item-configurator-params-base';\nimport { IOrderItemBase } from '@sc/cart/interfaces/i-order-item-base';\nimport { IFileUploadData } from '@sc/catalog/interfaces/i-file-upload-data';\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: IOrderItemBase<T>,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<ICart> {\n return this.patch<ICart>(\n `internal/clients/${client.id}/cart`,\n {\n product_id: cartItem.product.id,\n product_category_id: cartItem.configurator ? cartItem.category.id : undefined,\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 is_additional_sale: 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: IOrderItemBase<T>,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<ICart> {\n return this.patch<ICart>(\n `internal/clients/${client.id}/cart/${cartItem.id}`,\n {\n product_id: cartItem.product.id,\n product_category_id: cartItem.configurator ? cartItem.category.id : undefined,\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 is_additional_sale: 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: IOrderItemBase): Promise<ICart> {\n return this.delete<ICart>(`internal/clients/${client.id}/cart/${cartItem.id}`, (response) => new Cart(response.data));\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 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","/* eslint-disable no-shadow */\n\n/**\n * Перечисление типов фильтров продуктов.\n */\nexport enum ProductFilterTypeEnum {\n /**\n * Флажок (выбор одного или нескольких значений из списка).\n */\n Checkbox = 'checkbox',\n\n /**\n * Диапазон значений.\n */\n Range = 'range',\n\n /**\n * Переключатель (да/нет).\n */\n Toggle = 'toggle',\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 { 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 { UpdatableNamedIdentity } from '@sc/system/classes/updatable-named-identity';\n\n/**\n * Общие данные о менеджере клиента.\n */\nexport class ManagerCommon extends UpdatableNamedIdentity 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","import { NamedIdentity } from '@sc/system/classes/named-identity';\nimport { IUserRegionShortInfo } from '@sc/user-regions/interfaces/i-user-region-short-info';\n\n/**\n * Краткие данные о регионе пользователя.\n */\nexport class UserRegionShortInfo extends NamedIdentity implements IUserRegionShortInfo {\n /**\n * @inheritDoc\n */\n public abbr: string;\n\n /**\n * Инициализирует экземпляр класса {@link UserRegionShortInfo}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IUserRegionShortInfo>) {\n super(data);\n\n this.abbr = data?.abbr ?? '';\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';\nimport { UserRegionShortInfo } from '@sc/user-regions/classes/user-region-short-info';\nimport { IUserRegionShortInfo } from '@sc/user-regions/interfaces/i-user-region-short-info';\nimport { parseISO } from 'date-fns';\nimport { isString } from 'lodash-es';\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 supervisorId?: number;\n\n /**\n * Данные роли ценообразования менеджера.\n */\n public pricingRole?: IUserPricingRole;\n\n /**\n * Список направлений кураторства.\n */\n public curatedDirections?: ICuratedDirection[];\n\n /**\n * Признак того, что менеджер должен видеть все цены.\n */\n public showAllCosts?: boolean;\n\n /**\n * Признак того, что менеджер может входить как оператор.\n */\n public authAsOperator?: boolean;\n\n /**\n * Список регионов, за которые отвечает менеджер.\n */\n public managerRegions?: IUserRegionShortInfo[];\n\n /**\n * Список подчинённых менеджеров.\n */\n public managers?: IManager[];\n\n /**\n * Дата и время последнего входа в систему.\n */\n public lastLoginAt?: Date;\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.supervisorId = data?.supervisorId;\n this.pricingRole = data?.pricingRole ? new UserPricingRole(data.pricingRole) : undefined;\n this.curatedDirections = data?.curatedDirections?.map((curatedDirection) => new CuratedDirection(curatedDirection)) ?? [];\n this.showAllCosts = data?.showAllCosts;\n this.authAsOperator = data?.authAsOperator;\n this.managerRegions = data?.managerRegions?.map((region) => new UserRegionShortInfo(region));\n this.managers = data?.managers?.map((manager) => new Manager(manager));\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n this.lastLoginAt = isString(data?.lastLoginAt) ? parseISO(data.lastLoginAt) : data?.lastLoginAt;\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 { IPriceCatalogableItem } from '@sc/catalog/interfaces/i-price-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 PriceCatalogableItem implements IPriceCatalogableItem {\n /**\n * Коэффициент цены, от значения которого производится расчёт.\n */\n public priceCoefficient?: IPriceCoefficient;\n\n /**\n * Процент, который прибавляется к значению выбранного коэффициента.\n */\n public increasePercent?: number;\n\n /**\n * Инициализирует экземпляр класса {@link PriceCatalogableItem}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n protected constructor(data?: IPriceCatalogableItem) {\n this.priceCoefficient = data?.priceCoefficient && new PriceCoefficient(data.priceCoefficient);\n this.increasePercent = data?.increasePercent;\n }\n}\n","import { PriceCatalogableItem } from '@sc/catalog/classes/price-catalogable-item';\nimport { IPriceTemplateICatalogableItem } from '@sc/catalog/interfaces/i-price-template-catalogable-item';\n\n/**\n * Данные о цене элемента каталога в шаблоне прайс-листа.\n */\nexport class PriceTemplateICatalogableItem extends PriceCatalogableItem implements IPriceTemplateICatalogableItem {\n /**\n * Инициализирует экземпляр класса {@link PriceTemplateICatalogableItem}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n protected constructor(data?: IPriceTemplateICatalogableItem) {\n super(data);\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 { UpdatableNamedIdentity } from '@sc/system/classes/updatable-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 UpdatableNamedIdentity 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 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 // 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)) ?? undefined;\n }\n}\n","import { DateHelper } from '@sc/date-time/helpers/date-helper';\nimport { CreatableIdentity } from '@sc/system/classes/creatable-identity';\nimport { IDeletableIdentity } from '@sc/system/interfaces/i-deletable-identity';\n\n/**\n * Базовая идентифицируемая сущность с обязательной датой создания и датой удаления.\n */\nexport abstract class DeletableIdentity<T = number> extends CreatableIdentity<T> implements IDeletableIdentity<T> {\n /**\n * Дата и время удаления записи.\n */\n public deletedAt?: Date;\n\n /**\n * Инициализирует экземпляр класса {@link DeletableIdentity}.\n *\n * @param data Данные для первоначальной инициализации.\n * @param defaultIdValue Значение идентификатора по-умолчанию, если оно не определено в данных.\n */\n protected constructor(data?: Partial<IDeletableIdentity<T>>, defaultIdValue?: T) {\n super(data, defaultIdValue);\n\n this.deletedAt = DateHelper.parse(data?.deletedAt);\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 { DeletableIdentity } from '@sc/system/classes/deletable-identity';\n\n/**\n * Данные шаблона прайс-листа клиента.\n */\nexport class PriceTemplateClient extends DeletableIdentity implements IPriceTemplateClient {\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.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 * Признак того, что по свойству может производиться фильтрация в каталоге.\n */\n public isFilterable?: boolean;\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 this.isFilterable = data?.isFilterable;\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","/* 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 ownerName?: 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.ownerName = data?.ownerName;\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 case 'ownerName':\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 { PriceCatalogableItem } from '@sc/catalog/classes/price-catalogable-item';\nimport { IClientPriceCatalogableItem } from '@sc/catalog/interfaces/i-client-price-catalogable-item';\nimport { DateHelper } from '@sc/date-time/helpers/date-helper';\nimport { UserShortInfo } from '@sc/user/classes/user-short-info';\nimport { IUserShortInfo } from '@sc/user/interfaces/i-user-short-info';\n\n/**\n * Данные о цене элемента каталога в прайс-листе клиента.\n */\nexport class ClientPriceCatalogableItem extends PriceCatalogableItem implements IClientPriceCatalogableItem {\n /**\n * Данные о пользователе, установившем цену.\n */\n public executor?: IUserShortInfo;\n\n /**\n * Дата и время создания записи.\n */\n public createdAt?: Date;\n\n /**\n * Инициализирует экземпляр класса {@link ClientPriceCatalogableItem}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n protected constructor(data?: IClientPriceCatalogableItem) {\n super(data);\n\n this.executor = data?.executor ? new UserShortInfo(data.executor) : undefined;\n this.createdAt = DateHelper.parse(data?.createdAt);\n }\n}\n","import { ClientPriceCatalogableItem } from '@sc/catalog/classes/client-price-catalogable-item';\nimport { Product } from '@sc/catalog/classes/product';\nimport { IClientPriceProduct } from '@sc/catalog/interfaces/i-client-price-product';\nimport { IProduct } from '@sc/catalog/interfaces/i-product';\n\n/**\n * Данные о цене продукта в прайс-листе клиента.\n */\nexport class ClientPriceProduct extends ClientPriceCatalogableItem implements IClientPriceProduct {\n /**\n * Базовые данные о продукте.\n */\n public product: IProduct;\n\n /**\n * Инициализирует экземпляр класса {@link ClientPriceProduct}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IClientPriceProduct) {\n super(data);\n\n this.product = new Product(data?.product);\n }\n}\n","import { ClientPriceCatalogableItem } from '@sc/catalog/classes/client-price-catalogable-item';\nimport { BaseCategory } from '@sc/catalog/classes/internal/base/base-category';\nimport { IClientPriceCategory } from '@sc/catalog/interfaces/i-client-price-category';\nimport { IBaseCategory } from '@sc/catalog/interfaces/internal/base/i-base-category';\n\n/**\n * Данные о цене категории в прайс-листе клиента.\n */\nexport class ClientPriceCategory extends ClientPriceCatalogableItem implements IClientPriceCategory {\n /**\n * Базовые данные о категории.\n */\n public productCategory: IBaseCategory;\n\n /**\n * Инициализирует экземпляр класса {@link ClientPriceCategory}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IClientPriceCategory) {\n super(data);\n\n this.productCategory = new BaseCategory(data?.productCategory);\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 { ProductFilterTypeEnum } from '@sc/catalog/enums/product-filter-type-enum';\nimport { IFilterSettings } from '@sc/catalog/interfaces/i-filter-settings';\n\n/**\n * Настройки фильтра продуктов.\n */\nexport class FilterSettings implements IFilterSettings {\n /**\n * @inheritDoc\n */\n public isFake: boolean;\n\n /**\n * @inheritDoc\n */\n public isHidden: boolean;\n\n /**\n * @inheritDoc\n */\n public isMultiple: boolean | null;\n\n /**\n * @inheritDoc\n */\n public type: ProductFilterTypeEnum | null;\n\n /**\n * @inheritDoc\n */\n public ord: number;\n\n /**\n * Инициализирует экземпляр класса {@link FilterSettings}.\n *\n * Значения по умолчанию заданы намеренно: API не возвращает поля, значения которых совпадают\n * с настройками по умолчанию, поэтому отсутствующее поле означает значение по умолчанию.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IFilterSettings>) {\n this.isFake = data?.isFake ?? false;\n this.isHidden = data?.isHidden ?? false;\n this.isMultiple = data?.isMultiple ?? null;\n this.type = data?.type ?? null;\n this.ord = data?.ord ?? 0;\n }\n}\n","import { FilterSettings } from '@sc/catalog/classes/filter-settings';\nimport { BaseCategory } from '@sc/catalog/classes/internal/base/base-category';\nimport { Property } from '@sc/catalog/classes/property';\nimport { ICategoryFilterSetting } from '@sc/catalog/interfaces/i-category-filter-setting';\nimport { IFilterSettings } from '@sc/catalog/interfaces/i-filter-settings';\nimport { IProperty } from '@sc/catalog/interfaces/i-property';\nimport { IBaseCategory } from '@sc/catalog/interfaces/internal/base/i-base-category';\n\n/**\n * Настройки фильтра по свойству в конкретной категории.\n */\nexport class CategoryFilterSetting implements ICategoryFilterSetting {\n /**\n * @inheritDoc\n */\n public category: IBaseCategory;\n\n /**\n * @inheritDoc\n */\n public property: IProperty;\n\n /**\n * @inheritDoc\n */\n public settings: IFilterSettings;\n\n /**\n * Инициализирует экземпляр класса {@link CategoryFilterSetting}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<Omit<ICategoryFilterSetting, 'settings'>> & { settings?: Partial<IFilterSettings> }) {\n this.category = new BaseCategory(data?.category);\n this.property = new Property(data?.property);\n this.settings = new FilterSettings(data?.settings);\n }\n}\n","import { ICategoryFilterValue } from '@sc/catalog/interfaces/i-category-filter-value';\n\n/**\n * Значение фильтра категории.\n */\nexport class CategoryFilterValue implements ICategoryFilterValue {\n /**\n * @inheritDoc\n */\n public id: number | string;\n\n /**\n * @inheritDoc\n */\n public label: string;\n\n /**\n * Инициализирует экземпляр класса {@link CategoryFilterValue}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<ICategoryFilterValue>) {\n this.id = data?.id ?? '';\n this.label = data?.label ?? '';\n }\n}\n","import { CategoryFilterValue } from '@sc/catalog/classes/category-filter-value';\nimport { ProductFilterTypeEnum } from '@sc/catalog/enums/product-filter-type-enum';\nimport { ICategoryFilter } from '@sc/catalog/interfaces/i-category-filter';\nimport { ICategoryFilterValue } from '@sc/catalog/interfaces/i-category-filter-value';\n\n/**\n * Фильтр, доступный в категории продуктов.\n */\nexport class CategoryFilter implements ICategoryFilter {\n /**\n * @inheritDoc\n */\n public id: string;\n\n /**\n * @inheritDoc\n */\n public label: string;\n\n /**\n * @inheritDoc\n */\n public type: ProductFilterTypeEnum;\n\n /**\n * @inheritDoc\n */\n public ord: number;\n\n /**\n * @inheritDoc\n */\n public isMultiple: boolean | null;\n\n /**\n * @inheritDoc\n */\n public values: ICategoryFilterValue[];\n\n /**\n * @inheritDoc\n */\n public min: number | string | null;\n\n /**\n * @inheritDoc\n */\n public max: number | string | null;\n\n /**\n * Инициализирует экземпляр класса {@link CategoryFilter}.\n *\n * Значения по умолчанию заданы намеренно: API не возвращает поля, значения которых не заданы,\n * а также поля, не относящиеся к типу фильтра.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<ICategoryFilter>) {\n this.id = data?.id ?? '';\n this.label = data?.label ?? '';\n this.type = data?.type ?? ProductFilterTypeEnum.Checkbox;\n this.ord = data?.ord ?? 0;\n this.isMultiple = data?.isMultiple ?? null;\n this.values = data?.values?.map((value) => new CategoryFilterValue(value)) ?? [];\n this.min = data?.min ?? null;\n this.max = data?.max ?? null;\n }\n}\n","import { SearchResult } from '@sc/catalog/types/search-result';\nimport { useBaseConfigStateStore } from '@sc/config/states/config-state-store';\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 = useBaseConfigStateStore().config;\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 { ClientPriceCategory } from '@sc/catalog/classes/client-price-category';\nimport { ClientPriceProduct } from '@sc/catalog/classes/client-price-product';\nimport { IClientPriceCategory } from '@sc/catalog/interfaces/i-client-price-category';\nimport { IClientPriceProduct } from '@sc/catalog/interfaces/i-client-price-product';\nimport { ICommercialOffer } from '@sc/catalog/interfaces/i-commercial-offer';\nimport { ICommercialOfferParams } from '@sc/catalog/interfaces/i-commercial-offer-params';\nimport { IFileUploadData } from '@sc/catalog/interfaces/i-file-upload-data';\nimport { IPriceUpdateData } from '@sc/catalog/interfaces/i-price-update-data';\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 *\n * @see /doc/api/internal#/operations/api_internal_client_price_categories_get_list\n */\n public getCategoryPrices(clientId: number): Promise<IClientPriceCategory[]> {\n return this.getTypedList(ClientPriceCategory, `/internal/clients/${clientId}/price/categories`);\n }\n\n /**\n * Возвращает цену прайс-листа клиента, установленную на категорию.\n *\n * @param clientId Идентификатор клиента.\n * @param categoryId Идентификатор категории товаров.\n *\n * @see /doc/api/internal#/operations/api_internal_client_price_categories_get\n */\n public getCategoryPrice(clientId: number, categoryId: number): Promise<IClientPriceCategory> {\n return this.get<IClientPriceCategory>(`/internal/clients/${clientId}/price/categories/${categoryId}`, {}, (response) => new ClientPriceCategory(response.data));\n }\n\n /**\n * Устанавливает цену прайс-листа клиента на категорию.\n *\n * @param clientId Идентификатор клиента.\n * @param categoryId Идентификатор категории товаров.\n * @param data Данные для изменения цены.\n * @param recursively Признак того, что цену необходимо установить рекурсивно для всех дочерних категорий.\n *\n * @see /doc/api/internal#/operations/api_internal_client_price_categories_update\n */\n public updateCategoryPrices(clientId: number, categoryId: number, data: IPriceUpdateData, recursively: boolean = false): Promise<void> {\n return this.request<never>({\n method: 'PATCH',\n url: `/internal/clients/${clientId}/price/categories/${categoryId}`,\n data: {\n price_coefficient_id: data.coefficient?.id,\n increase_percent: data.value,\n },\n params: recursively ? { recursively: true } : {},\n });\n }\n\n /**\n * Удаляет цену прайс-листа клиента, установленную на категорию.\n *\n * @param clientId Идентификатор клиента.\n * @param categoryId Идентификатор категории товаров.\n * @param recursively Признак того, что цену необходимо удалить рекурсивно для всех дочерних категорий.\n *\n * @see /doc/api/internal#/operations/api_internal_client_price_categories_remove\n */\n public removeCategoryPrices(clientId: number, categoryId: number, recursively: boolean = false): Promise<void> {\n return this.request<never>({\n method: 'DELETE',\n url: `/internal/clients/${clientId}/price/categories/${categoryId}`,\n params: recursively ? { recursively: true } : {},\n });\n }\n\n /**\n * Удаляет цены прайс-листа клиента, установленные на продукты категории.\n *\n * @param clientId Идентификатор клиента.\n * @param categoryId Идентификатор категории товаров.\n * @param recursively Признак того, что цены необходимо удалить рекурсивно для продуктов всех дочерних категорий.\n *\n * @see /doc/api/internal#/operations/api_internal_client_price_categories_remove_product_client_prices\n */\n public removeCategoryProductsPrices(clientId: number, categoryId: number, recursively: boolean = false): Promise<void> {\n return this.request<never>({\n method: 'DELETE',\n url: `/internal/clients/${clientId}/price/categories/${categoryId}/products`,\n params: recursively ? { recursively: true } : {},\n });\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 *\n * @see /doc/api/internal#/operations/api_internal_client_price_products_get_list\n */\n public getProductPrices(clientId: number): Promise<IClientPriceProduct[]> {\n return this.getTypedList(ClientPriceProduct, `/internal/clients/${clientId}/price/products`);\n }\n\n /**\n * Возвращает цену прайс-листа клиента, установленную на продукт.\n *\n * @param clientId Идентификатор клиента.\n * @param productId Идентификатор продукта.\n *\n * @see /doc/api/internal#/operations/api_internal_client_price_products_get\n */\n public getProductPrice(clientId: number, productId: number): Promise<IClientPriceProduct> {\n return this.get<IClientPriceProduct>(`/internal/clients/${clientId}/price/products/${productId}`, {}, (response) => new ClientPriceProduct(response.data));\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<IClientPriceProduct> {\n return this.patch<IClientPriceProduct>(\n `/internal/clients/${clientId}/price/products/${productId}`,\n {\n price_coefficient_id: data.coefficient?.id,\n increase_percent: data.value,\n },\n (response) => new ClientPriceProduct(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<void> {\n return this.delete(`/internal/clients/${clientId}/price/products/${productId}`);\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/price-template-client';\nimport { IPriceTemplateClient } from '@sc/catalog/interfaces/i-price-template-client';\nimport { IPriceTemplateClientUpdateData } from '@sc/catalog/interfaces/i-price-template-client-update-data';\nimport { useBaseConfigStateStore } from '@sc/config/states/config-state-store';\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.getTypedList(PriceTemplateClient, `/internal/clients/${clientId}/price/templates`);\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 = useBaseConfigStateStore().config.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 = useBaseConfigStateStore().config.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.getTypedList(Category, `/internal/catalog/categories`, {\n showHidden: showHidden,\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 { useBaseConfigStateStore } from '@sc/config/states/config-state-store';\nimport { IPaginatedResponse } from '@sc/pagination/interfaces/i-paginated-response';\nimport { BasePaginationProvider } from '@sc/pagination/providers/base-pagination-provider';\nimport { IPaginationRequestParams } from '@sc/table-data/interfaces/i-pagination-request-params';\nimport { format } from 'date-fns';\nimport { map } from 'lodash-es';\n\n/**\n * Предоставляет механизмы получения/управления данными о продуктах.\n */\nexport class ProductDataProvider extends BasePaginationProvider {\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 periodFrom Дата начала периода, с которого продукты считаются новыми.\n * @param paginationParams Параметры пагинации.\n * @param withPriceCoefficients Признак того, что необходимо включить в ответ данные о коэффициентах цен на продукты.\n *\n * @see /doc/api/internal#/Каталог/api_internal_catalog_new_products_by_period_get\n */\n public getNewProducts(periodFrom: Date, paginationParams: IPaginationRequestParams, withPriceCoefficients: boolean = true): Promise<IPaginatedResponse<IProduct>> {\n const apiDateFormat = useBaseConfigStateStore().config.dateFormats.api;\n\n return this.getTypedPaginated(Product, '/internal/catalog/products/new', undefined, undefined, paginationParams, {\n period: { from: format(periodFrom, apiDateFormat) },\n withPriceCoefficients: withPriceCoefficients,\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.getTypedList(ClientCategory, `/internal/catalog/categories`, {\n clientId: clientId,\n showHidden: showHidden,\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 { useBaseConfigStateStore } from '@sc/config/states/config-state-store';\nimport { IPaginatedResponse } from '@sc/pagination/interfaces/i-paginated-response';\nimport { BasePaginationProvider } from '@sc/pagination/providers/base-pagination-provider';\nimport { IPaginationRequestParams } from '@sc/table-data/interfaces/i-pagination-request-params';\nimport { format } from 'date-fns';\n\n/**\n * Предоставляет механизмы получения/управления данными о продуктах для клиентов.\n */\nexport class ClientProductDataProvider extends BasePaginationProvider {\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 /**\n * Возвращает данные о новых продуктах каталога для указанного клиента, появившихся начиная с указанной даты.\n *\n * @param clientId Идентификатор клиента.\n * @param periodFrom Дата начала периода, с которого продукты считаются новыми.\n * @param paginationParams Параметры пагинации.\n * @param withPriceCoefficients Признак того, что необходимо включить в ответ данные о коэффициентах цен на продукты.\n *\n * @see /doc/api/internal#/Каталог/api_internal_catalog_new_products_by_period_get\n */\n public getNewProducts(\n clientId: number,\n periodFrom: Date,\n paginationParams: IPaginationRequestParams,\n withPriceCoefficients: boolean = true\n ): Promise<IPaginatedResponse<IClientProduct>> {\n const apiDateFormat = useBaseConfigStateStore().config.dateFormats.api;\n\n return this.getTypedPaginated(ClientProduct, '/internal/catalog/products/new', undefined, undefined, paginationParams, {\n clientId: clientId,\n period: { from: format(periodFrom, apiDateFormat) },\n withPriceCoefficients: withPriceCoefficients,\n });\n }\n}\n","import { PriceTemplate } from '@sc/catalog/classes/price-template';\nimport { PriceTemplateCategory } from '@sc/catalog/classes/price-template-category';\nimport { PriceTemplateClient } from '@sc/catalog/classes/price-template-client';\nimport { PriceTemplateProduct } from '@sc/catalog/classes/price-template-product';\nimport { IPriceTemplate } from '@sc/catalog/interfaces/i-price-template';\nimport { IPriceTemplateCategory } from '@sc/catalog/interfaces/i-price-template-category';\nimport { IPriceTemplateClient } from '@sc/catalog/interfaces/i-price-template-client';\nimport { IPriceTemplateCreateData } from '@sc/catalog/interfaces/i-price-template-create-data';\nimport { IPriceTemplateProduct } from '@sc/catalog/interfaces/i-price-template-product';\nimport { IPriceUpdateData } from '@sc/catalog/interfaces/i-price-update-data';\nimport { IPaginatedResponse } from '@sc/pagination/interfaces/i-paginated-response';\nimport { BasePaginationProvider } from '@sc/pagination/providers/base-pagination-provider';\nimport { IFilterGroup } from '@sc/table-data/interfaces/i-filter-group';\nimport { IPaginationRequestParams } from '@sc/table-data/interfaces/i-pagination-request-params';\nimport { ISortRequestParams } from '@sc/table-data/interfaces/i-sort-request-params';\nimport { IFieldValidationResultData } from '@sc/validation/interfaces/i-field-validation-result-data';\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.getTypedPaginated(PriceTemplate, '/internal/price/templates', filters, sortParams, paginationParams);\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.getTypedList(PriceTemplateProduct, `/internal/price/templates/${priceTemplateId}/products`);\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.getTypedList(PriceTemplateCategory, `/internal/price/templates/${priceTemplateId}/categories`);\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.getTypedList(PriceTemplateClient, `/internal/price/templates/${priceTemplateId}/clients`);\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';\nimport { TypedInstanceFactory } from '@sc/system/providers/typed-instance-factory';\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.getTypedList(PricingRole, '/internal/price/roles');\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.getTypedList(CategoryPricingRule, `/internal/price/roles/rules/categories/${categoryId}`);\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 TypedInstanceFactory.instanceListInitializer(CategoryPricingRule, response.data)\n );\n }\n}\n","import { CategoryFilter } from '@sc/catalog/classes/category-filter';\nimport { CategoryFilterSetting } from '@sc/catalog/classes/category-filter-setting';\nimport { Property } from '@sc/catalog/classes/property';\nimport { PropertyValue } from '@sc/catalog/classes/property-value';\nimport { ICatalogItemPropertyFile } from '@sc/catalog/interfaces/i-catalog-item-property-file';\nimport { ICategoryFilter } from '@sc/catalog/interfaces/i-category-filter';\nimport { ICategoryFilterSetting } from '@sc/catalog/interfaces/i-category-filter-setting';\nimport { ICategoryFilterSettingUpdateData } from '@sc/catalog/interfaces/i-category-filter-setting-update-data';\nimport { IDescription } from '@sc/catalog/interfaces/i-description';\nimport { IFileUpdateData } from '@sc/catalog/interfaces/i-file-update-data';\nimport { IFileUploadData } from '@sc/catalog/interfaces/i-file-upload-data';\nimport { IProperty } from '@sc/catalog/interfaces/i-property';\nimport { IPropertyCreateData } from '@sc/catalog/interfaces/i-property-create-data';\nimport { IPropertyValue } from '@sc/catalog/interfaces/i-property-value';\nimport { ISpecification } from '@sc/catalog/interfaces/i-specification';\nimport { IPaginatedResponse } from '@sc/pagination/interfaces/i-paginated-response';\nimport { BasePaginationProvider } from '@sc/pagination/providers/base-pagination-provider';\nimport { IFile } from '@sc/system/interfaces/i-file';\nimport { IFilterGroup } from '@sc/table-data/interfaces/i-filter-group';\nimport { IPaginationRequestParams } from '@sc/table-data/interfaces/i-pagination-request-params';\nimport { ISortRequestParams } from '@sc/table-data/interfaces/i-sort-request-params';\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.getTypedPaginated(Property, '/internal/catalog/properties', filters, sortParams, paginationParams);\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.getTypedList(PropertyValue, `/internal/catalog/products/${productId}/properties`);\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.getTypedList(PropertyValue, `/internal/catalog/categories/${categoryId}/properties`);\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 /**\n * Возвращает список фильтров, доступных в категории.\n *\n * @param categoryId Идентификатор категории.\n * @param recursively Признак необходимости включить в список фильтры дочерних категорий.\n * @see /doc/api/internal#/operations/api_internal_catalog_categories_category_filters_get\n */\n public getCategoryFilters(categoryId: number, recursively: boolean = false): Promise<ICategoryFilter[]> {\n return this.get<ICategoryFilter[]>(`/internal/catalog/categories/${categoryId}/filters`, { recursively }, (response) =>\n response.data.map((filter) => new CategoryFilter(filter))\n );\n }\n\n /**\n * Возвращает список настроенных фильтров категории.\n *\n * @param categoryId Идентификатор категории.\n * @see /doc/api/internal#/operations/api_internal_catalog_categories_filter_settings_get_list\n */\n public getCategoryFilterSettings(categoryId: number): Promise<ICategoryFilterSetting[]> {\n return this.getTypedList(CategoryFilterSetting, `/internal/catalog/categories/${categoryId}/filter-settings`);\n }\n\n /**\n * Сохраняет настройки фильтра в категории.\n *\n * @param categoryId Идентификатор категории.\n * @param propertySlug Символьный идентификатор свойства.\n * @param settingsData Данные настроек фильтра.\n * @see /doc/api/internal#/operations/api_internal_catalog_categories_filter_settings_save\n */\n public saveCategoryFilterSetting(categoryId: number, propertySlug: string, settingsData: ICategoryFilterSettingUpdateData): Promise<ICategoryFilterSetting> {\n return this.patch<ICategoryFilterSetting>(\n `/internal/catalog/categories/${categoryId}/filter-settings/${propertySlug}`,\n settingsData,\n (response) => new CategoryFilterSetting(response.data)\n );\n }\n\n /**\n * Удаляет настройки фильтра в категории, возвращая фильтру настройки по умолчанию.\n *\n * @param categoryId Идентификатор категории.\n * @param propertySlug Символьный идентификатор свойства.\n * @see /doc/api/internal#/operations/api_internal_catalog_categories_filter_settings_delete\n */\n public deleteCategoryFilterSetting(categoryId: number, propertySlug: string): Promise<void> {\n return this.delete(`/internal/catalog/categories/${categoryId}/filter-settings/${propertySlug}`);\n }\n}\n","import { Category } from '@sc/catalog/classes/category';\nimport { Product } from '@sc/catalog/classes/product';\nimport { ICategory } from '@sc/catalog/interfaces/i-category';\nimport { IProduct } from '@sc/catalog/interfaces/i-product';\nimport { HttpRequester } from '@sc/http/classes/http-requester';\nimport { map } from 'lodash-es';\n\n/**\n * Предоставляет механизмы получения/управления данными о категориях продуктов шаблона прайс-листа.\n */\nexport class TemplateProductCategoryDataProvider extends HttpRequester {\n /**\n * Возвращает список данных о корневых категориях указанного шаблона прайс-листа.\n *\n * @param priceTemplateId Идентификатор шаблона прайс-листа для которого необходимо вернуть список корневых категорий.\n * @param showHidden Признак необходимости также возвращать данные о скрытых категориях.\n *\n * @see /doc/api/internal#/Каталог/api_internal_catalog_categories_get_list\n */\n public getRootCategoriesList(priceTemplateId: number, showHidden: boolean = false): Promise<ICategory[]> {\n return this.getTypedList(Category, `/internal/catalog/categories`, {\n priceTemplateId: priceTemplateId,\n showHidden: showHidden,\n });\n }\n\n /**\n * Возвращает данные об указанной категории шаблона прайс-листа.\n *\n * @param priceTemplateId Идентификатор шаблона прайс-листа для которого необходимо получить данные категории.\n * @param categoryID Идентификатор категории для которой нужно получить данные.\n * @param showHidden Признак необходимости также возвращать данные о скрытых категориях.\n * @param withNestedCategories Признак необходимости также вернуть список с данными о вложенных категориях.\n *\n * @see /doc/api/internal#/Каталог/api_internal_catalog_categories_get\n */\n public getCategoryData(priceTemplateId: number, categoryID: number, showHidden: boolean = false, withNestedCategories: boolean = false): Promise<ICategory> {\n return this.get<ICategory>(\n `/internal/catalog/categories/${categoryID}`,\n {\n priceTemplateId: priceTemplateId,\n showHidden: showHidden,\n withNestedCategories: withNestedCategories,\n },\n (response) => new Category(response.data)\n );\n }\n\n /**\n * Возвращает список продуктов категории указанного шаблона прайс-листа.\n *\n * @param priceTemplateId Идентификатор шаблона прайс-листа для которого необходимо получить список продуктов.\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(priceTemplateId: number, categoryID: number, withPriceCoefficients: boolean = true, showHidden: boolean = false): Promise<IProduct[]> {\n return this.get<IProduct[]>(\n `/internal/catalog/categories/${categoryID}/products`,\n {\n priceTemplateId: priceTemplateId,\n showHidden: showHidden,\n withPriceCoefficients: withPriceCoefficients,\n },\n (response) => map(response.data, (p) => new Product(p))\n );\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 { ICategory } from '@sc/catalog/interfaces/i-category';\nimport { ICatalogableItem } from '@sc/system/interfaces/i-catalogable-item';\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 /**\n * Список кураторов.\n */\n Curators = 'curators',\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","/* eslint-disable @typescript-eslint/no-unnecessary-condition */\n\nimport { IBankAccount } from '@sc/clients/interfaces/i-bank-account';\nimport { Currency } from '@sc/references/classes/currency';\nimport { ICurrency } from '@sc/references/interfaces/i-currency';\nimport { Identity } from '@sc/system/classes/identity';\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 { DeletableNamedIdentity } from '@sc/system/classes/deletable-named-identity';\n\n/**\n * Полные данные контакта.\n */\nexport class Contact extends DeletableNamedIdentity 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';\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 * Инициализирует экземпляр класса {@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 }\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 { 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","/* 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 { Opf } from '@sc/references/classes/opf';\nimport { PartnerGroup } from '@sc/references/classes/partner-group';\nimport { IOpf } from '@sc/references/interfaces/i-opf';\nimport { IPartnerGroup } from '@sc/references/interfaces/i-partner-group';\nimport { DeletableNamedIdentity } from '@sc/system/classes/deletable-named-identity';\nimport { UserShortInfo } from '@sc/user/classes/user-short-info';\nimport { IUserShortInfo } from '@sc/user/interfaces/i-user-short-info';\n\n/**\n * Базовые данные о контрагенте.\n */\nexport abstract class ContragentBase extends DeletableNamedIdentity implements IContragentBase {\n /**\n * Данные об организационно-правовой форме.\n */\n public opf: IOpf = Opf.generatePersonItem();\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 creator?: IUserShortInfo;\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.comment = data.comment;\n this.alternativeName = data.alternativeName;\n this.creator = data.creator ? new UserShortInfo(data.creator) : undefined;\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.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 { ContragentBase } from '@sc/clients/classes/contragent/contragent-base';\nimport { IContragentPerson } from '@sc/clients/interfaces/contragent/i-contragent-person';\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 { ContragentBase } from '@sc/clients/classes/contragent/contragent-base';\nimport { IContragentIc } from '@sc/clients/interfaces/contragent/i-contragent-ic';\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 { ContragentIc } from '@sc/clients/classes/contragent/contragent-ic';\nimport { IContragentUlR } from '@sc/clients/interfaces/contragent/i-contragent-ul-r';\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 { ContragentUlR } from '@sc/clients/classes/contragent/contragent-ul-r';\nimport { IContragentUlNr } from '@sc/clients/interfaces/contragent/i-contragent-ul-nr';\nimport { Country } from '@sc/references/classes/country';\nimport { ICountry } from '@sc/references/interfaces/i-country';\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 { ContragentIc } from '@sc/clients/classes/contragent/contragent-ic';\nimport { ContragentPerson } from '@sc/clients/classes/contragent/contragent-person';\nimport { ContragentUlNr } from '@sc/clients/classes/contragent/contragent-ul-nr';\nimport { ContragentUlR } from '@sc/clients/classes/contragent/contragent-ul-r';\nimport { OpfEnum } from '@sc/clients/enums/opf-enum';\nimport { IContragentBase } from '@sc/clients/interfaces/contragent/i-contragent-base';\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';\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","/* eslint-disable @typescript-eslint/no-unnecessary-condition */\n\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 { GeoCoordinates } from '@sc/geo/classes/geo-coordinates';\nimport { IGeoCoordinates } from '@sc/geo/interfaces/i-geo-coordinates';\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","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 { 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 { 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 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.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 { PaginationFiltersBase } from '@sc/pagination/filters/pagination-filters-base';\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';\n\n/**\n * Данные о параметрах фильтрации списка клиентов.\n */\nexport class ClientsListFilters extends PaginationFiltersBase implements IClientsListFilters {\n /**\n * @inheritDoc\n */\n public id?: string;\n\n /**\n * @inheritDoc\n */\n public guid?: 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 includeSubordinateManagers?: boolean;\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 noOrdersPeriod: IDatePeriod = new DatePeriod();\n\n /**\n * Инициализирует экземпляр класса {@link ClientsListFilters}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IClientsListFilters) {\n super();\n this.id = data?.id;\n this.guid = data?.guid;\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 // По умолчанию учитываем клиентов подчинённых менеджеров (старое поведение).\n this.includeSubordinateManagers = data?.includeSubordinateManagers ?? true;\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 = data?.preferredDeliveryType ? new DeliveryType(data?.preferredDeliveryType) : undefined;\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.noOrdersPeriod = new DatePeriod(data?.noOrdersPeriod);\n }\n\n /**\n * @inheritDoc\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 'noOrdersPeriod':\n this.noOrdersPeriod.from = null;\n this.noOrdersPeriod.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 * @inheritDoc\n */\n public asClearRaw(): Record<string, any> {\n const result = super.asClearRaw();\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 // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (!result?.noOrdersPeriod?.from && !result?.noOrdersPeriod?.to) {\n delete result.noOrdersPeriod;\n }\n\n return result;\n }\n}\n","import { IOrderShortInfo } from '@sc/orders/interfaces/i-order-short-info';\nimport { CreatableIdentity } from '@sc/system/classes/creatable-identity';\nimport { UserShortInfo } from '@sc/user/classes/user-short-info';\nimport { IUserShortInfo } from '@sc/user/interfaces/i-user-short-info';\n\n/**\n * Краткие данные о заказе.\n */\nexport class OrderShortInfo extends CreatableIdentity implements IOrderShortInfo {\n /**\n * @inheritDoc\n */\n public creator: IUserShortInfo;\n\n /**\n * Инициализирует экземпляр класса {@link OrderShortInfo}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IOrderShortInfo>) {\n super(data);\n\n this.creator = new UserShortInfo(data?.creator);\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 { 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 { 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 * @inheritDoc\n */\n public contacts?: IContactPerson[] = [];\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 lastOrder?: IOrderShortInfo;\n\n /**\n * @inheritDoc\n */\n public salesDirection?: ISalesDirection;\n\n /**\n * @inheritDoc\n */\n public managers?: IManagerCommon[];\n\n /**\n * @inheritDoc\n */\n public curators?: ICurator[];\n\n /**\n * Инициализирует экземпляр класса {@link ClientAdditionalData}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data: IClientAdditionalData) {\n super(data);\n\n this.contacts = data.contacts?.map((contact) => new ContactPerson(contact)) ?? undefined;\n this.lastOrder = data.lastOrder ? new OrderShortInfo(data.lastOrder) : undefined;\n this.partnerGroups = data.partnerGroups?.map((partnerGroup) => new PartnerGroup(partnerGroup)) ?? undefined;\n this.preferredDeliveryType = data.preferredDeliveryType ? new DeliveryType(data.preferredDeliveryType) : undefined;\n this.salesDirection = data.salesDirection ? new SalesDirection(data.salesDirection) : undefined;\n this.managers = data.managers?.map((manager) => new ManagerCommon(manager)) ?? undefined;\n this.curators = data.curators?.map((curator) => new Curator(curator)) ?? undefined;\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,@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 } from '@sc/clients/enums/clients-additional-data-request-type-enum';\nimport { OpfEnum } from '@sc/clients/enums/opf-enum';\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 { IManagerCommon } from '@sc/managers/interfaces/i-manager-common';\nimport { IPaginatedResponse } from '@sc/pagination/interfaces/i-paginated-response';\nimport { BasePaginationProvider } from '@sc/pagination/providers/base-pagination-provider';\nimport { ICuratedDirection } from '@sc/references/interfaces/i-curated-direction';\nimport { TypedInstanceFactory } from '@sc/system/providers/typed-instance-factory';\nimport { FilterOpEnum } from '@sc/table-data/enums/filter-op-enum';\nimport { IFilterGroup } from '@sc/table-data/interfaces/i-filter-group';\nimport { IPaginationRequestParams } from '@sc/table-data/interfaces/i-pagination-request-params';\nimport { ISortRequestParams } from '@sc/table-data/interfaces/i-sort-request-params';\nimport { IFieldValidationResultData } from '@sc/validation/interfaces/i-field-validation-result-data';\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 preferred_warehouse_id: client.preferredWarehouse?.id,\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 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 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 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 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 Идентификатор или GUID клиента для которого необходимо получить данные.\n * @see /doc/api/internal#/Клиенты/api_internal_client_get_full_info\n */\n public getClient(id: number | string): 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 * @param signal Сигнал отмены запроса.\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 signal: AbortSignal | undefined = undefined\n ): Promise<IPaginatedResponse<IClientShortInfo>> {\n return this.getTypedPaginated(ClientShortInfo, '/internal/clients', filters, sortParams, paginationParams, extraParams, undefined, signal);\n }\n\n /**\n * Выполняет поиск клиентов по терму в строке.\n *\n * @param term Терм поиска.\n */\n public searchClient(term: string): Promise<IClientShortInfo[]> {\n return this.getClientsList(undefined, undefined, undefined, {\n searchTerm: term,\n }).then((response) => response.data);\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 TypedInstanceFactory.instanceListInitializer(ClientAdditionalData, response.data)\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.getTypedList(ContactPersonRelated, `/internal/clients/${id}/contacts/all`);\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 };\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 * @see /doc/api/internal#/operations/api_internal_client_delivery_address_get_list\n */\n public getClientDeliveryAddresses(clientId: number): Promise<IDeliveryAddress[]> {\n return this.getTypedList(DeliveryAddress, `/internal/clients/${clientId}/delivery-addresses`);\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","import { HttpRequester } from '@sc/http/classes/http-requester';\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 { 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","/**\n * Перечисление всех реализованных конфигураторов.\n */\nexport enum ConfiguratorsEnum {\n /**\n * Конфигуратор козырьков.\n */\n Kozyrek = 'kozyrek',\n\n /**\n * Конфигуратор москитных сеток.\n */\n Mosquitto = 'mosquitto',\n\n /**\n * Конфигуратор резки штрипса.\n */\n Strip = 'strip',\n\n /**\n * Конфигуратор металла для дверей.\n */\n MetalForDoors = 'metal_for_doors',\n\n /**\n * Конфигуратор сэндвич-панелей.\n */\n Sandwich = 'sandwich',\n\n /**\n * Конфигуратор распила сэндвич-панелей по площади.\n */\n SandwichM2 = 'sandwich_m2',\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 { IConfiguratorCalculateParamsSandwich } from '@sc/configurator/interfaces/i-configurator-calculate-params-sandwich';\nimport { IConfiguratorCalculateResultSandwich } from '@sc/configurator/interfaces/i-configurator-calculate-result-sandwich';\nimport { IConfiguratorSettingsBase } from '@sc/configurator/interfaces/i-configurator-settings-base';\nimport { HttpRequester } from '@sc/http/classes/http-requester';\nimport { IHttpResponseError } from '@sc/http/interfaces/i-http-response-error';\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 * @param clientId Идентификатор клиента.\n *\n * @see /doc/api/internal#/Каталог/api_internal_catalog_categories_configurator_settings\n */\n public getConfiguratorSettings<T extends IConfiguratorSettingsBase>(category: ICategory, clientId: number): Promise<T> {\n return this.get<T>(`internal/catalog/categories/${category.id}/configurators/${category.properties?.configurator}/settings?client_id=${clientId}`);\n }\n\n /**\n * Возвращает данные о продукте, который соответствует указанной в запросе конфигурации для указанного конфигуратора.\n *\n * @param category Данные о категории.\n * @param clientId Идентификатор клиента.\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 clientId: number,\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, client_id: clientId },\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 clientId Идентификатор клиента.\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>(\n category: ICategory,\n clientId: number,\n newTemplate: T,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<undefined> {\n return this.post<undefined>(\n `internal/catalog/categories/${category.id}/configurators/${category.properties?.configurator}/template?client_id=${clientId}`,\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 clientId Идентификатор клиента.\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, clientId: number, templateId: number): Promise<void> {\n return this.delete(`internal/catalog/categories/${category.id}/configurators/${category.properties?.configurator}/template/${templateId}?client_id=${clientId}`);\n }\n\n /**\n * Выполняет расчет, через указанный конфигуратор с переданными параметрами.\n *\n * @param category Данные о категории.\n * @param clientId Идентификатор клиента.\n * @param params Параметры запроса расчета конфигуратора.\n *\n * @see /doc/api/internal#/Каталог/api_public_catalog_categories_category_configurator_calculate\n */\n public calculate(category: ICategory, clientId: number, params: IConfiguratorCalculateParamsSandwich): Promise<IConfiguratorCalculateResultSandwich> {\n return this.get<IConfiguratorCalculateResultSandwich>(`internal/catalog/categories/${category.id}/configurators/${category.properties?.configurator}/calculate`, {\n client_id: clientId,\n ...params,\n });\n }\n}\n","import { IPaginationRequestParams } from '@sc/table-data/interfaces/i-pagination-request-params';\n\n/**\n * Данные о пагинации записей таблицы.\n */\nexport class TableDataPaginationRequestParams implements IPaginationRequestParams {\n /**\n * Номер текущей страницы.\n */\n public page = 1;\n\n /**\n * Количество записей на странице.\n */\n public pageSize = 50;\n\n /**\n * Инициализирует экземпляр класса {@link TableDataPaginationRequestParams}.\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 { TableDataPaginationRequestParams } from '@sc/table-data/classes/table-data-pagination-request-params';\nimport { IPagination } from '@sc/table-data/interfaces/i-pagination';\n\n/**\n * Данные о пагинации записей таблицы.\n */\nexport class TableDataPagination extends TableDataPaginationRequestParams 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 TableDataPagination}.\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/table-data/interfaces/i-sort-request-params';\n\n/**\n * Данные о сортировке записей таблицы.\n */\nexport class TableDataSortRequestParams 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","import { IDatePeriod } from '@sc/system/interfaces/i-date-period';\nimport {\n addDays,\n addMonths,\n addWeeks,\n differenceInCalendarDays,\n differenceInCalendarMonths,\n endOfDay,\n endOfMonth,\n getDate,\n getDaysInMonth,\n setDate,\n startOfDay,\n startOfMonth,\n startOfWeek,\n} from 'date-fns';\n\n/**\n * Класс-помощник для календарных вычислений, отсутствующих в date-fns: декады (1–10, 11–20, 21–конец месяца),\n * полугодия и интервалы «до такой же даты». Все возвращаемые периоды имеют заполненные границы.\n */\nexport class CalendarHelper {\n /**\n * Возвращает границы декады, в которую попадает указанная дата.\n *\n * @param date Дата.\n */\n public static decadeInterval(date: Date): IDatePeriod {\n const [from, to] = CalendarHelper.shiftedDecadeBounds(date, 0);\n\n return { from, to };\n }\n\n /**\n * Возвращает границы декады, отстоящей от декады указанной даты на заданное число декад.\n *\n * @param date Дата.\n * @param shift Смещение в декадах, может быть отрицательным.\n */\n public static shiftDecadeInterval(date: Date, shift: number): IDatePeriod {\n const [from, to] = CalendarHelper.shiftedDecadeBounds(date, shift);\n\n return { from, to };\n }\n\n /**\n * Возвращает начало полугодия, в которое попадает указанная дата.\n *\n * @param date Дата.\n */\n public static startOfHalfYear(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth() < 6 ? 0 : 6, 1);\n }\n\n /**\n * Возвращает конец полугодия, в которое попадает указанная дата.\n *\n * @param date Дата.\n */\n public static endOfHalfYear(date: Date): Date {\n return endOfMonth(new Date(date.getFullYear(), date.getMonth() < 6 ? 5 : 11, 1));\n }\n\n /**\n * Возвращает дату, сдвинутую на указанное число полугодий.\n *\n * @param date Дата.\n * @param amount Смещение в полугодиях, может быть отрицательным.\n */\n public static addHalfYears(date: Date, amount: number): Date {\n return addMonths(date, amount * 6);\n }\n\n /**\n * Возвращает интервал «сдвинутый период до такой же даты»: от начала сдвинутого периода до конца дня\n * с тем же порядковым номером месяца внутри периода и тем же числом, что у опорной даты.\n * Если в целевом месяце такого числа нет, берётся его последний день (31-е число в месяце из 30 дней станет 30-м).\n *\n * @param currentPeriodStart Начало периода, в который попадает опорная дата.\n * @param shiftedPeriodStart Начало сдвинутого периода.\n * @param date Опорная дата.\n */\n public static intervalTillSameDate(currentPeriodStart: Date, shiftedPeriodStart: Date, date: Date): IDatePeriod {\n const monthOffset = differenceInCalendarMonths(startOfMonth(date), startOfMonth(currentPeriodStart));\n const targetMonthStart = startOfMonth(addMonths(shiftedPeriodStart, monthOffset));\n const day = Math.min(getDate(date), getDaysInMonth(targetMonthStart));\n\n return { from: startOfDay(shiftedPeriodStart), to: endOfDay(setDate(targetMonthStart, day)) };\n }\n\n /**\n * Возвращает интервал «сдвинутая неделя до такого же дня недели»; недели начинаются с понедельника.\n *\n * @param date Опорная дата.\n * @param shiftWeeks Смещение в неделях, может быть отрицательным.\n */\n public static weekTillSameWeekday(date: Date, shiftWeeks: number): IDatePeriod {\n const from = startOfWeek(addWeeks(date, shiftWeeks), { weekStartsOn: 1 });\n const dayOffset = differenceInCalendarDays(date, startOfWeek(date, { weekStartsOn: 1 }));\n\n return { from, to: endOfDay(addDays(from, dayOffset)) };\n }\n\n /**\n * Возвращает интервал «сдвинутая декада до такого же номера дня»; если в целевой декаде дня с таким\n * номером нет, берётся её последний день (третья декада длится от 8 до 11 дней).\n *\n * @param date Опорная дата.\n * @param shift Смещение в декадах, может быть отрицательным.\n */\n public static decadeTillSameDayNumber(date: Date, shift: number): IDatePeriod {\n const [currentStart] = CalendarHelper.shiftedDecadeBounds(date, 0);\n const dayNumber = differenceInCalendarDays(date, currentStart) + 1;\n const [targetStart, targetEnd] = CalendarHelper.shiftedDecadeBounds(date, shift);\n const targetLength = differenceInCalendarDays(targetEnd, targetStart) + 1;\n\n return { from: targetStart, to: endOfDay(addDays(targetStart, Math.min(dayNumber, targetLength) - 1)) };\n }\n\n /**\n * Возвращает пару «начало и конец декады», отстоящей от декады указанной даты на заданное число декад.\n *\n * @param date Дата.\n * @param shift Смещение в декадах, может быть отрицательным.\n */\n private static shiftedDecadeBounds(date: Date, shift: number): [Date, Date] {\n const day = getDate(date);\n let currentIndex = 2;\n\n if (day <= 10) {\n currentIndex = 0;\n } else if (day <= 20) {\n currentIndex = 1;\n }\n\n const totalIndex = currentIndex + shift;\n const monthShift = Math.floor(totalIndex / 3);\n const decadeIndex = ((totalIndex % 3) + 3) % 3;\n const monthStart = startOfMonth(addMonths(date, monthShift));\n const from = addDays(monthStart, decadeIndex * 10);\n const to = decadeIndex === 2 ? endOfMonth(monthStart) : endOfDay(addDays(from, 9));\n\n return [from, to];\n }\n}\n","import { format, startOfToday, subDays } from 'date-fns';\n\n/**\n * Возвращает дату «сегодня минус n дней» в формате YYYY-MM-DD.\n *\n * @param days Число дней назад.\n */\nexport function daysAgoIso(days: number): string {\n return format(subDays(startOfToday(), days), 'yyyy-MM-dd');\n}\n","/**\n * Функция выбора склонения слов в зависимости от числа.\n *\n * @param value Анализируемое число.\n * @param titles Список склонений.\n * @example `pluralize(2, ['день', 'дня', 'дней'])` вернет `'дня'`\n */\nexport function pluralize(value: number, titles: string[]): string {\n const cases = [2, 0, 1, 1, 1, 2];\n // Берём абсолютное целое значение: отрицательные и дробные числа иначе дают некорректный индекс.\n const normalized = Math.floor(Math.abs(value));\n\n return titles[normalized % 100 > 4 && normalized % 100 < 20 ? 2 : cases[Math.min(normalized % 10, 5)]];\n}\n","import { pluralize } from '@sc/i18n/helpers/pluralize';\nimport { differenceInCalendarDays, parseISO, startOfToday } from 'date-fns';\n\n/**\n * Форматирует дату события относительно сегодняшнего дня.\n *\n * @param isoDate Дата в формате YYYY-MM-DD.\n */\nexport function formatRelativeDate(isoDate: string): string {\n const date = parseISO(isoDate);\n const diffDays = differenceInCalendarDays(startOfToday(), date);\n\n switch (true) {\n case diffDays === 0:\n return 'Сегодня';\n case diffDays === 1:\n return 'Вчера';\n case diffDays < 0:\n return isoDate;\n default:\n return `${diffDays} ${pluralize(diffDays, ['день', 'дня', 'дней'])} назад`;\n }\n}\n","import { CalendarHelper } from '@sc/date-time/helpers/calendar-helper';\nimport { ILabeledPeriod } from '@sc/date-time/interfaces/i-labeled-period';\nimport { IStandardPeriod } from '@sc/date-time/interfaces/i-standard-period';\nimport {\n addBusinessDays,\n addDays,\n addMonths,\n addQuarters,\n addWeeks,\n addYears,\n endOfDay,\n endOfMonth,\n endOfQuarter,\n endOfToday,\n endOfTomorrow,\n endOfWeek,\n endOfYear,\n endOfYesterday,\n startOfDay,\n startOfMonth,\n startOfQuarter,\n startOfToday,\n startOfTomorrow,\n startOfWeek,\n startOfYear,\n startOfYesterday,\n subDays,\n subMonths,\n subQuarters,\n subWeeks,\n subYears,\n} from 'date-fns';\n\n/**\n * Провайдер даты и времени.\n */\nexport class DateTimeProvider {\n /**\n * Возвращает предустановленные диапазоны дат.\n *\n * @param year Год, от которого считаются годовые периоды (1/3/9 месяцев, кварталы, полугодия, год); по умолчанию текущий.\n */\n public static defaultDateRanges(year?: number): Record<string, ILabeledPeriod> {\n // Следующий рабочий день — текущая дата + 1 рабочий день.\n const nextWorkingDay = addBusinessDays(new Date(), 1);\n\n const now = new Date();\n\n // Начало выбранного года — точка отсчёта для кварталов, полугодий и периодов нарастающим итогом.\n const yearStart = startOfYear(year === undefined ? now : new Date(year, 0, 1));\n const yearEnd = endOfYear(yearStart);\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 currentWeek: { label: 'Неделя', from: startOfWeek(now, { weekStartsOn: 1 }), to: endOfWeek(now, { weekStartsOn: 1 }) },\n currentMonth: { label: 'Месяц', from: startOfMonth(now), to: endOfMonth(now) },\n oneMonth: { label: '1 месяц', from: yearStart, to: endOfMonth(yearStart) },\n threeMonths: { label: '3 месяца', from: yearStart, to: endOfMonth(addMonths(yearStart, 2)) },\n nineMonths: { label: '9 месяцев', from: yearStart, to: endOfMonth(addMonths(yearStart, 8)) },\n firstQuarter: { label: 'I квартал', from: yearStart, to: endOfMonth(addMonths(yearStart, 2)) },\n secondQuarter: { label: 'II квартал', from: addMonths(yearStart, 3), to: endOfMonth(addMonths(yearStart, 5)) },\n thirdQuarter: { label: 'III квартал', from: addMonths(yearStart, 6), to: endOfMonth(addMonths(yearStart, 8)) },\n fourthQuarter: { label: 'IV квартал', from: addMonths(yearStart, 9), to: endOfMonth(addMonths(yearStart, 11)) },\n firstHalfYear: { label: 'I полугодие', from: yearStart, to: endOfMonth(addMonths(yearStart, 5)) },\n secondHalfYear: { label: 'II полугодие', from: addMonths(yearStart, 6), to: yearEnd },\n currentYear: { label: '12 месяцев', from: yearStart, to: yearEnd },\n };\n }\n\n /**\n * Возвращает стандартные периоды по образцу перечисления 1С «ВариантСтандартногоПериода»,\n * распределённые по группам {@link STANDARD_PERIOD_GROUPS}, а внутри группы «Прочее» — по разделам\n * {@link STANDARD_PERIOD_SECTIONS}. Ключи повторяют англоязычные имена значений перечисления платформы.\n *\n * @param now Опорная дата «сейчас»; по умолчанию текущая.\n */\n public static standardPeriods(now: Date = new Date()): Record<string, IStandardPeriod> {\n const weekOptions = { weekStartsOn: 1 } as const;\n const dayStart = startOfDay(now);\n const dayEnd = endOfDay(now);\n const decade = CalendarHelper.decadeInterval(now);\n const monthStart = startOfMonth(now);\n const quarterStart = startOfQuarter(now);\n const halfYearStart = CalendarHelper.startOfHalfYear(now);\n const yearStart = startOfYear(now);\n const previousHalfYear = CalendarHelper.addHalfYears(now, -1);\n const nextHalfYear = CalendarHelper.addHalfYears(now, 1);\n\n return {\n yesterday: { label: 'Вчера', group: 'day', from: startOfDay(subDays(now, 1)), to: endOfDay(subDays(now, 1)) },\n today: { label: 'Сегодня', group: 'day', from: dayStart, to: dayEnd },\n tomorrow: { label: 'Завтра', group: 'day', from: startOfDay(addDays(now, 1)), to: endOfDay(addDays(now, 1)) },\n\n lastWeek: { label: 'Прошлая неделя', group: 'week', from: startOfWeek(subWeeks(now, 1), weekOptions), to: endOfWeek(subWeeks(now, 1), weekOptions) },\n thisWeek: { label: 'Эта неделя', group: 'week', from: startOfWeek(now, weekOptions), to: endOfWeek(now, weekOptions) },\n nextWeek: { label: 'Следующая неделя', group: 'week', from: startOfWeek(addWeeks(now, 1), weekOptions), to: endOfWeek(addWeeks(now, 1), weekOptions) },\n\n lastTenDays: { label: 'Прошлая декада', group: 'decade', ...CalendarHelper.shiftDecadeInterval(now, -1) },\n thisTenDays: { label: 'Эта декада', group: 'decade', ...decade },\n nextTenDays: { label: 'Следующая декада', group: 'decade', ...CalendarHelper.shiftDecadeInterval(now, 1) },\n\n lastMonth: { label: 'Прошлый месяц', group: 'month', from: startOfMonth(subMonths(now, 1)), to: endOfMonth(subMonths(now, 1)) },\n thisMonth: { label: 'Этот месяц', group: 'month', from: monthStart, to: endOfMonth(now) },\n nextMonth: { label: 'Следующий месяц', group: 'month', from: startOfMonth(addMonths(now, 1)), to: endOfMonth(addMonths(now, 1)) },\n\n lastQuarter: { label: 'Прошлый квартал', group: 'quarter', from: startOfQuarter(subQuarters(now, 1)), to: endOfQuarter(subQuarters(now, 1)) },\n thisQuarter: { label: 'Этот квартал', group: 'quarter', from: quarterStart, to: endOfQuarter(now) },\n nextQuarter: { label: 'Следующий квартал', group: 'quarter', from: startOfQuarter(addQuarters(now, 1)), to: endOfQuarter(addQuarters(now, 1)) },\n\n lastHalfYear: {\n label: 'Прошлое полугодие',\n group: 'halfYear',\n from: CalendarHelper.startOfHalfYear(previousHalfYear),\n to: CalendarHelper.endOfHalfYear(previousHalfYear),\n },\n thisHalfYear: { label: 'Это полугодие', group: 'halfYear', from: halfYearStart, to: CalendarHelper.endOfHalfYear(now) },\n nextHalfYear: { label: 'Следующее полугодие', group: 'halfYear', from: CalendarHelper.startOfHalfYear(nextHalfYear), to: CalendarHelper.endOfHalfYear(nextHalfYear) },\n\n lastYear: { label: 'Прошлый год', group: 'year', from: startOfYear(subYears(now, 1)), to: endOfYear(subYears(now, 1)) },\n thisYear: { label: 'Этот год', group: 'year', from: yearStart, to: endOfYear(now) },\n nextYear: { label: 'Следующий год', group: 'year', from: startOfYear(addYears(now, 1)), to: endOfYear(addYears(now, 1)) },\n\n fromBeginningOfThisWeek: { label: 'С начала этой недели', group: 'other', section: 'fromBeginning', from: startOfWeek(now, weekOptions), to: dayEnd },\n fromBeginningOfThisTenDays: { label: 'С начала этой декады', group: 'other', section: 'fromBeginning', from: decade.from, to: dayEnd },\n fromBeginningOfThisMonth: { label: 'С начала этого месяца', group: 'other', section: 'fromBeginning', from: monthStart, to: dayEnd },\n fromBeginningOfThisQuarter: { label: 'С начала этого квартала', group: 'other', section: 'fromBeginning', from: quarterStart, to: dayEnd },\n fromBeginningOfThisHalfYear: { label: 'С начала этого полугодия', group: 'other', section: 'fromBeginning', from: halfYearStart, to: dayEnd },\n fromBeginningOfThisYear: { label: 'С начала этого года', group: 'other', section: 'fromBeginning', from: yearStart, to: dayEnd },\n\n tillEndOfThisWeek: { label: 'До конца этой недели', group: 'other', section: 'tillEnd', from: dayStart, to: endOfWeek(now, weekOptions) },\n tillEndOfThisTenDays: { label: 'До конца этой декады', group: 'other', section: 'tillEnd', from: dayStart, to: decade.to },\n tillEndOfThisMonth: { label: 'До конца этого месяца', group: 'other', section: 'tillEnd', from: dayStart, to: endOfMonth(now) },\n tillEndOfThisQuarter: { label: 'До конца этого квартала', group: 'other', section: 'tillEnd', from: dayStart, to: endOfQuarter(now) },\n tillEndOfThisHalfYear: { label: 'До конца этого полугодия', group: 'other', section: 'tillEnd', from: dayStart, to: CalendarHelper.endOfHalfYear(now) },\n tillEndOfThisYear: { label: 'До конца этого года', group: 'other', section: 'tillEnd', from: dayStart, to: endOfYear(now) },\n\n lastWeekTillSameWeekDay: { label: 'Прошлая неделя, до такого же дня недели', group: 'other', section: 'lastTillSame', ...CalendarHelper.weekTillSameWeekday(now, -1) },\n lastTenDaysTillSameDayNumber: {\n label: 'Прошлая декада, до такого же номера дня',\n group: 'other',\n section: 'lastTillSame',\n ...CalendarHelper.decadeTillSameDayNumber(now, -1),\n },\n lastMonthTillSameDate: {\n label: 'Прошлый месяц, до такой же даты',\n group: 'other',\n section: 'lastTillSame',\n ...CalendarHelper.intervalTillSameDate(monthStart, startOfMonth(subMonths(now, 1)), now),\n },\n lastQuarterTillSameDate: {\n label: 'Прошлый квартал, до такой же даты',\n group: 'other',\n section: 'lastTillSame',\n ...CalendarHelper.intervalTillSameDate(quarterStart, startOfQuarter(subQuarters(now, 1)), now),\n },\n lastHalfYearTillSameDate: {\n label: 'Прошлое полугодие, до такой же даты',\n group: 'other',\n section: 'lastTillSame',\n ...CalendarHelper.intervalTillSameDate(halfYearStart, CalendarHelper.startOfHalfYear(previousHalfYear), now),\n },\n lastYearTillSameDate: {\n label: 'Прошлый год, до такой же даты',\n group: 'other',\n section: 'lastTillSame',\n ...CalendarHelper.intervalTillSameDate(yearStart, startOfYear(subYears(now, 1)), now),\n },\n\n nextWeekTillSameWeekDay: { label: 'Следующая неделя, до такого же дня недели', group: 'other', section: 'nextTillSame', ...CalendarHelper.weekTillSameWeekday(now, 1) },\n nextTenDaysTillSameDayNumber: {\n label: 'Следующая декада, до такого же номера дня',\n group: 'other',\n section: 'nextTillSame',\n ...CalendarHelper.decadeTillSameDayNumber(now, 1),\n },\n nextMonthTillSameDate: {\n label: 'Следующий месяц, до такой же даты',\n group: 'other',\n section: 'nextTillSame',\n ...CalendarHelper.intervalTillSameDate(monthStart, startOfMonth(addMonths(now, 1)), now),\n },\n nextQuarterTillSameDate: {\n label: 'Следующий квартал, до такой же даты',\n group: 'other',\n section: 'nextTillSame',\n ...CalendarHelper.intervalTillSameDate(quarterStart, startOfQuarter(addQuarters(now, 1)), now),\n },\n nextHalfYearTillSameDate: {\n label: 'Следующее полугодие, до такой же даты',\n group: 'other',\n section: 'nextTillSame',\n ...CalendarHelper.intervalTillSameDate(halfYearStart, CalendarHelper.startOfHalfYear(nextHalfYear), now),\n },\n nextYearTillSameDate: {\n label: 'Следующий год, до такой же даты',\n group: 'other',\n section: 'nextTillSame',\n ...CalendarHelper.intervalTillSameDate(yearStart, startOfYear(addYears(now, 1)), now),\n },\n\n last7Days: { label: 'Последние 7 дней', group: 'other', section: 'rollingDays', from: startOfDay(subDays(now, 6)), to: dayEnd },\n next7Days: { label: 'Следующие 7 дней', group: 'other', section: 'rollingDays', from: dayStart, to: endOfDay(addDays(now, 6)) },\n };\n }\n}\n","import { StandardPeriodGroupType } from '@sc/date-time/types/standard-period-group-type';\nimport { StandardPeriodSectionType } from '@sc/date-time/types/standard-period-section-type';\n\n/**\n * Порядок отображения и названия групп стандартных периодов.\n */\nexport const STANDARD_PERIOD_GROUPS: Array<{\n /**\n * Ключ группы.\n */\n key: StandardPeriodGroupType;\n\n /**\n * Название группы.\n */\n label: string;\n}> = [\n { key: 'day', label: 'День' },\n { key: 'week', label: 'Неделя' },\n { key: 'decade', label: 'Декада' },\n { key: 'month', label: 'Месяц' },\n { key: 'quarter', label: 'Квартал' },\n { key: 'halfYear', label: 'Полугодие' },\n { key: 'year', label: 'Год' },\n { key: 'other', label: 'Прочее' },\n];\n\n/**\n * Порядок отображения и названия разделов группы «Прочее».\n */\nexport const STANDARD_PERIOD_SECTIONS: Array<{\n /**\n * Ключ раздела.\n */\n key: StandardPeriodSectionType;\n\n /**\n * Название раздела.\n */\n label: string;\n}> = [\n { key: 'fromBeginning', label: 'С начала периода' },\n { key: 'tillEnd', label: 'До конца периода' },\n { key: 'lastTillSame', label: 'Прошлые, до такой же даты' },\n { key: 'nextTillSame', label: 'Следующие, до такой же даты' },\n { key: 'rollingDays', label: '7 дней' },\n];\n","import { IDiscountClient } from '@sc/discounts/interfaces/i-discount-client';\nimport { CityWithRegionAndCountry } from '@sc/references/classes/city-with-region-and-country';\nimport { ICityWithRegionAndCountry } from '@sc/references/interfaces/i-city-with-region-and-country';\nimport { NamedIdentity } from '@sc/system/classes/named-identity';\n\n/**\n * Краткие данные о клиенте в условиях скидки.\n */\nexport class DiscountClient extends NamedIdentity implements IDiscountClient {\n /**\n * @inheritDoc\n */\n public city?: ICityWithRegionAndCountry;\n\n /**\n * @inheritDoc\n */\n public isActive: boolean;\n\n /**\n * Инициализирует экземпляр класса {@link DiscountClient}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IDiscountClient>) {\n super(data);\n\n this.city = data?.city ? new CityWithRegionAndCountry(data.city) : undefined;\n this.isActive = data?.isActive ?? false;\n }\n}\n","import { DiscountClient } from '@sc/discounts/classes/discount-client';\nimport { IDiscountClient } from '@sc/discounts/interfaces/i-discount-client';\nimport { IDiscountConditions } from '@sc/discounts/interfaces/i-discount-conditions';\nimport { IDiscountConditionsSaveData } from '@sc/discounts/interfaces/i-discount-conditions-save-data';\nimport { CityWithRegionAndCountry } from '@sc/references/classes/city-with-region-and-country';\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 { 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 { UserShortInfo } from '@sc/user/classes/user-short-info';\nimport { IUserShortInfo } from '@sc/user/interfaces/i-user-short-info';\nimport { endOfDay, startOfDay } from 'date-fns';\nimport { isEmpty, map, some } from 'lodash-es';\n\n/**\n * Условия отбора клиентов, которым доступна скидка.\n */\nexport class DiscountConditions implements IDiscountConditions {\n /**\n * @inheritDoc\n */\n public salesDirections: ISalesDirection[];\n\n /**\n * @inheritDoc\n */\n public partnerGroups: IPartnerGroup[];\n\n /**\n * @inheritDoc\n */\n public managers: IUserShortInfo[];\n\n /**\n * @inheritDoc\n */\n public additionalClients: IDiscountClient[];\n\n /**\n * @inheritDoc\n */\n public fixedClients: IDiscountClient[];\n\n /**\n * @inheritDoc\n */\n public regions: IRegion[];\n\n /**\n * @inheritDoc\n */\n public cities: ICityWithRegionAndCountry[];\n\n /**\n * @inheritDoc\n */\n public lastLoginDate: IDatePeriod;\n\n /**\n * @inheritDoc\n */\n public lastOrderDate: IDatePeriod;\n\n /**\n * Инициализирует экземпляр класса {@link DiscountConditions}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IDiscountConditions>) {\n this.salesDirections = map(data?.salesDirections ?? [], (item) => new SalesDirection(item));\n this.partnerGroups = map(data?.partnerGroups ?? [], (item) => new PartnerGroup(item));\n this.managers = map(data?.managers ?? [], (item) => new UserShortInfo(item));\n this.additionalClients = map(data?.additionalClients ?? [], (item) => new DiscountClient(item));\n this.fixedClients = map(data?.fixedClients ?? [], (item) => new DiscountClient(item));\n this.regions = map(data?.regions ?? [], (item) => new Region(item));\n this.cities = map(data?.cities ?? [], (item) => new CityWithRegionAndCountry(item));\n this.lastLoginDate = new DatePeriod(data?.lastLoginDate);\n this.lastOrderDate = new DatePeriod(data?.lastOrderDate);\n }\n\n /**\n * Возвращает признак того, что задано хотя бы одно условие отбора клиентов.\n *\n * Скидка без условий отбора клиентов доступна всем клиентам.\n */\n public hasClientConditions(): boolean {\n return (\n some([this.salesDirections, this.partnerGroups, this.managers, this.additionalClients, this.fixedClients, this.regions, this.cities], (list) => !isEmpty(list)) ||\n some([this.lastLoginDate, this.lastOrderDate], (period) => !!period.from || !!period.to)\n );\n }\n\n /**\n * Устанавливает период последнего входа или последнего заказа клиента целыми днями:\n * начало периода с начала дня, окончание до конца дня.\n *\n * @param key Название условия.\n * @param period Период; при отсутствии условие сбрасывается.\n */\n public setPeriod(key: 'lastLoginDate' | 'lastOrderDate', period?: IDatePeriod | null): this {\n // eslint-disable-next-line security/detect-object-injection\n this[key] = new DatePeriod({ from: period?.from ? startOfDay(period.from) : null, to: period?.to ? endOfDay(period.to) : null });\n\n return this;\n }\n\n /**\n * Возвращает условия для сохранения скидки.\n */\n public toSaveData(): IDiscountConditionsSaveData {\n return {\n salesDirections: map(this.salesDirections, 'id'),\n partnerGroups: map(this.partnerGroups, 'id'),\n managers: map(this.managers, 'id'),\n additionalClients: map(this.additionalClients, 'id'),\n regions: map(this.regions, 'id'),\n cities: map(this.cities, 'id'),\n lastLoginDate: new DatePeriod(this.lastLoginDate),\n lastOrderDate: new DatePeriod(this.lastOrderDate),\n };\n }\n}\n","import { useBaseConfigStateStore } from '@sc/config/states/config-state-store';\nimport { round } from 'lodash-es';\n\n/**\n * Класс-помощник для работы со скидками.\n */\nexport class DiscountHelper {\n /**\n * Возвращает коэффициент стоимости товара от розничной цены для указанного процента скидки\n * с точностью коэффициента из настроек приложения.\n *\n * @param percent Процент скидки (10 для скидки 10 %).\n */\n public static percentToCostCoefficient(percent: number): number {\n return round((100 - percent) / 100, useBaseConfigStateStore().config.numberPrecision.priceCoefficient);\n }\n}\n","/**\n * Состояние скидки по датам начала и окончания действия.\n */\nexport enum DiscountStateEnum {\n /**\n * Скидка действует.\n */\n Active = 'active',\n\n /**\n * Скидка начнёт действовать позже.\n */\n Scheduled = 'scheduled',\n\n /**\n * Скидка завершена или удалена.\n */\n Completed = 'completed',\n}\n","import { IDiscountShortInfo } from '@sc/catalog/interfaces/i-discount-short-info';\nimport { DiscountStateEnum } from '@sc/discounts/enums/discount-state-enum';\n\n/**\n * Класс-помощник для определения состояния скидки.\n */\nexport class DiscountStateHelper {\n /**\n * Возвращает состояние скидки на указанный момент по датам начала и окончания действия.\n *\n * @param discount Данные скидки с датами начала и окончания действия.\n * @param now Момент, на который определяется состояние.\n */\n public static resolve(discount: Pick<IDiscountShortInfo, 'publishedAt' | 'deletedAt'>, now: Date = new Date()): DiscountStateEnum {\n if (discount.deletedAt && discount.deletedAt.getTime() <= now.getTime()) {\n return DiscountStateEnum.Completed;\n }\n\n if (discount.publishedAt && discount.publishedAt.getTime() > now.getTime()) {\n return DiscountStateEnum.Scheduled;\n }\n\n return DiscountStateEnum.Active;\n }\n}\n","import { Category } from '@sc/catalog/classes/category';\nimport { DiscountShortInfo } from '@sc/catalog/classes/discount-short-info';\nimport { Product } from '@sc/catalog/classes/product';\nimport { ICategory } from '@sc/catalog/interfaces/i-category';\nimport { IProduct } from '@sc/catalog/interfaces/i-product';\nimport { DiscountConditions } from '@sc/discounts/classes/discount-conditions';\nimport { DiscountStateEnum } from '@sc/discounts/enums/discount-state-enum';\nimport { DiscountHelper } from '@sc/discounts/helpers/discount-helper';\nimport { DiscountStateHelper } from '@sc/discounts/helpers/discount-state-helper';\nimport { IDiscount } from '@sc/discounts/interfaces/i-discount';\nimport { IDiscountSaveData } from '@sc/discounts/interfaces/i-discount-save-data';\nimport { map } from 'lodash-es';\n\n/**\n * Полные данные о скидке.\n */\nexport class Discount extends DiscountShortInfo implements IDiscount {\n /**\n * @inheritDoc\n */\n public conditions: DiscountConditions;\n\n /**\n * @inheritDoc\n */\n public products: IProduct[];\n\n /**\n * @inheritDoc\n */\n public productCategories: ICategory[];\n\n /**\n * @inheritDoc\n */\n public countDiscountedPrices: number;\n\n /**\n * @inheritDoc\n */\n public expectedCountDiscountedPrices: number;\n\n /**\n * @inheritDoc\n */\n public countDiscountedProducts: number;\n\n /**\n * @inheritDoc\n */\n public countDiscountedClients: number;\n\n /**\n * Инициализирует экземпляр класса {@link Discount}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IDiscount>) {\n super(data);\n\n this.conditions = new DiscountConditions(data?.conditions);\n this.products = map(data?.products ?? [], (product) => new Product(product));\n this.productCategories = map(data?.productCategories ?? [], (category) => new Category(category));\n this.countDiscountedPrices = data?.countDiscountedPrices ?? 0;\n this.expectedCountDiscountedPrices = data?.expectedCountDiscountedPrices ?? 0;\n this.countDiscountedProducts = data?.countDiscountedProducts ?? 0;\n this.countDiscountedClients = data?.countDiscountedClients ?? 0;\n }\n\n /**\n * Возвращает состояние скидки на указанный момент.\n *\n * @param now Момент, на который определяется состояние.\n */\n public getState(now: Date = new Date()): DiscountStateEnum {\n return DiscountStateHelper.resolve(this, now);\n }\n\n /**\n * Переносит счётчики цен, товаров и клиентов из указанной скидки, не затрагивая остальные данные.\n *\n * @param source Скидка с актуальными значениями счётчиков.\n */\n public assignCounters(source: IDiscount): void {\n this.countDiscountedPrices = source.countDiscountedPrices;\n this.expectedCountDiscountedPrices = source.expectedCountDiscountedPrices;\n this.countDiscountedProducts = source.countDiscountedProducts;\n this.countDiscountedClients = source.countDiscountedClients;\n }\n\n /**\n * Возвращает признак того, что скидка ещё не применена ко всем клиентским ценам, которые ей соответствуют.\n */\n public isPricesUpdating(): boolean {\n return this.countDiscountedPrices !== this.expectedCountDiscountedPrices;\n }\n\n /**\n * Возвращает данные скидки для сохранения.\n */\n public toSaveData(): IDiscountSaveData {\n return {\n name: this.name,\n costCoefficient: DiscountHelper.percentToCostCoefficient(this.percent),\n isLowPriceAllowed: this.isLowPriceAllowed,\n publishedAt: this.publishedAt ?? null,\n deletedAt: this.deletedAt ?? null,\n description: this.description ?? '',\n products: map(this.products, 'id'),\n productCategories: map(this.productCategories, 'id'),\n conditions: this.conditions.toSaveData(),\n };\n }\n}\n","import { DiscountClient } from '@sc/discounts/classes/discount-client';\nimport { IDiscountClient } from '@sc/discounts/interfaces/i-discount-client';\nimport { IDiscountClientEligibility } from '@sc/discounts/interfaces/i-discount-client-eligibility';\n\n/**\n * Данные о том, по каким условиям клиент подходит под скидку.\n */\nexport class DiscountClientEligibility implements IDiscountClientEligibility {\n /**\n * @inheritDoc\n */\n public client: IDiscountClient;\n\n /**\n * @inheritDoc\n */\n public additionalClientsCondition: boolean;\n\n /**\n * @inheritDoc\n */\n public fixedClientsCondition: boolean;\n\n /**\n * @inheritDoc\n */\n public partnerGroupsCondition: boolean;\n\n /**\n * @inheritDoc\n */\n public managersCondition: boolean;\n\n /**\n * @inheritDoc\n */\n public citiesCondition: boolean;\n\n /**\n * @inheritDoc\n */\n public regionsCondition: boolean;\n\n /**\n * @inheritDoc\n */\n public salesDirectionsCondition: boolean;\n\n /**\n * Инициализирует экземпляр класса {@link DiscountClientEligibility}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IDiscountClientEligibility>) {\n this.client = new DiscountClient(data?.client);\n this.additionalClientsCondition = data?.additionalClientsCondition ?? false;\n this.fixedClientsCondition = data?.fixedClientsCondition ?? false;\n this.partnerGroupsCondition = data?.partnerGroupsCondition ?? false;\n this.managersCondition = data?.managersCondition ?? false;\n this.citiesCondition = data?.citiesCondition ?? false;\n this.regionsCondition = data?.regionsCondition ?? false;\n this.salesDirectionsCondition = data?.salesDirectionsCondition ?? false;\n }\n\n /**\n * Возвращает признак того, что у клиента выполнено хотя бы одно условие отбора скидки.\n */\n public isEligible(): boolean {\n return (\n this.additionalClientsCondition ||\n this.fixedClientsCondition ||\n this.partnerGroupsCondition ||\n this.managersCondition ||\n this.citiesCondition ||\n this.regionsCondition ||\n this.salesDirectionsCondition\n );\n }\n}\n","import { DiscountStateEnum } from '@sc/discounts/enums/discount-state-enum';\nimport { IDiscountsListFilters } from '@sc/discounts/interfaces/i-discounts-list-filters';\nimport { PaginationFiltersBase } from '@sc/pagination/filters/pagination-filters-base';\n\n/**\n * Данные о параметрах фильтрации списка скидок.\n */\nexport class DiscountsListFilters extends PaginationFiltersBase implements IDiscountsListFilters {\n /**\n * @inheritDoc\n */\n public id?: string;\n\n /**\n * @inheritDoc\n */\n public name?: string;\n\n /**\n * @inheritDoc\n */\n public states?: DiscountStateEnum[];\n\n /**\n * Инициализирует экземпляр класса {@link DiscountsListFilters}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IDiscountsListFilters) {\n super();\n\n this.id = data?.id;\n this.name = data?.name;\n this.states = data?.states;\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 'states':\n // eslint-disable-next-line security/detect-object-injection\n this[key] = undefined;\n break;\n default:\n break;\n }\n\n return this;\n }\n}\n","import { DiscountShortInfo } from '@sc/catalog/classes/discount-short-info';\nimport { IDiscountShortInfo } from '@sc/catalog/interfaces/i-discount-short-info';\nimport { DateHelper } from '@sc/date-time/helpers/date-helper';\nimport { Discount } from '@sc/discounts/classes/discount';\nimport { DiscountClientEligibility } from '@sc/discounts/classes/discount-client-eligibility';\nimport { IDiscount } from '@sc/discounts/interfaces/i-discount';\nimport { IDiscountClientEligibility } from '@sc/discounts/interfaces/i-discount-client-eligibility';\nimport { IDiscountSaveData } from '@sc/discounts/interfaces/i-discount-save-data';\nimport { IDiscountSaveRequestData } from '@sc/discounts/interfaces/i-discount-save-request-data';\nimport { IPaginatedResponse } from '@sc/pagination/interfaces/i-paginated-response';\nimport { BasePaginationProvider } from '@sc/pagination/providers/base-pagination-provider';\nimport { IFilterGroup } from '@sc/table-data/interfaces/i-filter-group';\nimport { IPaginationRequestParams } from '@sc/table-data/interfaces/i-pagination-request-params';\nimport { ISortRequestParams } from '@sc/table-data/interfaces/i-sort-request-params';\nimport { IFieldValidationResultData } from '@sc/validation/interfaces/i-field-validation-result-data';\n\n/**\n * Предоставляет механизмы получения/управления скидками и акциями.\n */\nexport class DiscountProvider extends BasePaginationProvider {\n /**\n * Возвращает данные скидки, подготовленные для запроса сохранения.\n *\n * @param data Данные скидки.\n * @param updateFixedClients Признак того, что список клиентов по датам последнего входа и заказа необходимо подобрать заново.\n */\n private static prepareSaveData(data: IDiscountSaveData, updateFixedClients: boolean): IDiscountSaveRequestData {\n return {\n ...data,\n publishedAt: DateHelper.toApiFormat(data.publishedAt),\n deletedAt: DateHelper.toApiFormat(data.deletedAt),\n conditions: {\n ...data.conditions,\n lastLoginDate: DateHelper.periodToApiFormat(data.conditions.lastLoginDate),\n lastOrderDate: DateHelper.periodToApiFormat(data.conditions.lastOrderDate),\n updateFixedClients,\n },\n };\n }\n\n /**\n * Возвращает список скидок, включая завершённые.\n *\n * @param filters Параметры фильтрации данных.\n * @param sortParams Параметры сортировки.\n * @param paginationParams Параметры пагинации.\n * @param signal Сигнал отмены запроса.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_discount_get_list\n */\n public getDiscountsList(\n filters?: IFilterGroup,\n sortParams?: ISortRequestParams[] | ISortRequestParams,\n paginationParams?: IPaginationRequestParams,\n signal: AbortSignal | undefined = undefined\n ): Promise<IPaginatedResponse<IDiscountShortInfo>> {\n return this.getTypedPaginated(DiscountShortInfo, '/internal/price/discounts', filters, sortParams, paginationParams, {}, undefined, signal);\n }\n\n /**\n * Возвращает полные данные о скидке.\n *\n * @param discountId Идентификатор скидки.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_discount_get\n */\n public getDiscount(discountId: number): Promise<IDiscount> {\n return this.get<IDiscount>(`/internal/price/discounts/${discountId}`, {}, (response) => new Discount(response.data));\n }\n\n /**\n * Создаёт новую скидку.\n *\n * @param data Данные для создания скидки.\n * @param updateFixedClients Признак того, что список клиентов по датам последнего входа и заказа необходимо подобрать заново.\n * @param validationFieldResultData Список полей, для которых необходимо\n * установить данные об ошибках валидации\n * в случае ошибок в запросах.\n * Ошибка размера скидки приходит по ключу `costCoefficient`.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_discount_create\n */\n public createDiscount(data: IDiscountSaveData, updateFixedClients: boolean, validationFieldResultData: Record<string, IFieldValidationResultData> = {}): Promise<IDiscount> {\n return this.post<IDiscount>(\n '/internal/price/discounts',\n DiscountProvider.prepareSaveData(data, updateFixedClients),\n (response) => new Discount(response.data),\n validationFieldResultData\n );\n }\n\n /**\n * Изменяет данные о скидке.\n *\n * @param discountId Идентификатор скидки.\n * @param data Данные для изменения скидки.\n * @param updateFixedClients Признак того, что список клиентов по датам последнего входа и заказа необходимо подобрать заново.\n * @param validationFieldResultData Список полей, для которых необходимо\n * установить данные об ошибках валидации\n * в случае ошибок в запросах.\n * Ошибка размера скидки приходит по ключу `costCoefficient`.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_discount_change\n */\n public updateDiscount(\n discountId: number,\n data: IDiscountSaveData,\n updateFixedClients: boolean,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<IDiscount> {\n return this.patch<IDiscount>(\n `/internal/price/discounts/${discountId}`,\n DiscountProvider.prepareSaveData(data, updateFixedClients),\n (response) => new Discount(response.data),\n validationFieldResultData\n );\n }\n\n /**\n * Завершает скидку текущим моментом.\n *\n * @param discountId Идентификатор скидки.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_discount_delete\n */\n public removeDiscount(discountId: number): Promise<void> {\n return this.delete(`/internal/price/discounts/${discountId}`);\n }\n\n /**\n * Возвращает список клиентов, подходящих под скидку, с условиями, по которым они подходят.\n *\n * @param discountId Идентификатор скидки.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_discount_clients_get\n */\n public getEligibleClients(discountId: number): Promise<IDiscountClientEligibility[]> {\n return this.getTypedList(DiscountClientEligibility, `/internal/price/discounts/${discountId}/clients`);\n }\n\n /**\n * Проверяет, подходит ли клиент под скидку.\n *\n * @param discountId Идентификатор скидки.\n * @param clientId Идентификатор клиента.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_discount_clients_check\n */\n public checkClient(discountId: number, clientId: number): Promise<IDiscountClientEligibility> {\n return this.get<IDiscountClientEligibility>(\n `/internal/price/discounts/${discountId}/clients/${clientId}/check`,\n {},\n (response) => new DiscountClientEligibility(response.data)\n );\n }\n}\n","import { IFaqGroup } from '@sc/faq/interfaces/i-faq-group';\nimport { NamedIdentity } from '@sc/system/classes/named-identity';\n\n/**\n * Данные о группе часто задаваемых вопросов.\n */\nexport class FaqGroup extends NamedIdentity implements IFaqGroup {\n /**\n * Инициализирует экземпляр класса {@link FaqGroup}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IFaqGroup>) {\n super(data);\n }\n}\n","import { FaqGroup } from '@sc/faq/classes/faq-group';\nimport { IFaq } from '@sc/faq/interfaces/i-faq';\nimport { IFaqGroup } from '@sc/faq/interfaces/i-faq-group';\nimport { IFaqSaveData } from '@sc/faq/interfaces/i-faq-save-data';\nimport { Identity } from '@sc/system/classes/identity';\nimport { map } from 'lodash-es';\n\n/**\n * Данные о часто задаваемом вопросе и ответе на него.\n */\nexport class Faq extends Identity implements IFaq {\n /**\n * @inheritDoc\n */\n public question: string;\n\n /**\n * @inheritDoc\n */\n public answer: string;\n\n /**\n * @inheritDoc\n */\n public groups: IFaqGroup[];\n\n /**\n * Инициализирует экземпляр класса {@link Faq}.\n *\n * Портал не передаёт поле групп, если вопрос не относится ни к одной группе.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IFaq>) {\n super(data, -1);\n\n this.question = data?.question ?? '';\n this.answer = data?.answer ?? '';\n this.groups = map(data?.groups ?? [], (group) => new FaqGroup(group));\n }\n\n /**\n * Возвращает данные вопроса для отправки на портал.\n */\n public toSaveData(): IFaqSaveData {\n return {\n question: this.question,\n answer: this.answer,\n groups: map(this.groups, 'id'),\n };\n }\n}\n","import { Faq } from '@sc/faq/classes/faq';\nimport { FaqGroup } from '@sc/faq/classes/faq-group';\nimport { IFaq } from '@sc/faq/interfaces/i-faq';\nimport { IFaqGroup } from '@sc/faq/interfaces/i-faq-group';\nimport { IFaqGroupSaveData } from '@sc/faq/interfaces/i-faq-group-save-data';\nimport { IFaqSaveData } from '@sc/faq/interfaces/i-faq-save-data';\nimport { IPaginatedResponse } from '@sc/pagination/interfaces/i-paginated-response';\nimport { BasePaginationProvider } from '@sc/pagination/providers/base-pagination-provider';\nimport { IPaginationRequestParams } from '@sc/table-data/interfaces/i-pagination-request-params';\nimport { IFieldValidationResultData } from '@sc/validation/interfaces/i-field-validation-result-data';\nimport { isNil } from 'lodash-es';\n\n/**\n * Предоставляет механизмы получения/управления часто задаваемыми вопросами и их группами.\n */\nexport class FaqProvider extends BasePaginationProvider {\n /**\n * Возвращает список часто задаваемых вопросов.\n *\n * @param groupId Идентификатор группы, вопросы которой необходимо получить. Если не задан, возвращаются все вопросы.\n * @param paginationParams Параметры пагинации.\n *\n * @see /doc/api/internal#/operations/api_internal_faq_get_list\n */\n public getFaqList(groupId?: number | null, paginationParams?: IPaginationRequestParams): Promise<IPaginatedResponse<IFaq>> {\n return this.getTypedPaginated(Faq, '/internal/faq', undefined, undefined, paginationParams, isNil(groupId) ? {} : { group: groupId });\n }\n\n /**\n * Возвращает данные о часто задаваемом вопросе.\n *\n * @param faqId Идентификатор вопроса.\n *\n * @see /doc/api/internal#/operations/api_internal_faq_get\n */\n public getFaq(faqId: number): Promise<IFaq> {\n return this.get<IFaq>(`/internal/faq/${faqId}`, {}, (response) => new Faq(response.data));\n }\n\n /**\n * Создаёт новый часто задаваемый вопрос.\n *\n * @param data Данные для создания вопроса.\n * @param validationFieldResultData Список полей, для которых необходимо\n * установить данные об ошибках валидации\n * в случае ошибок в запросах.\n *\n * @see /doc/api/internal#/operations/api_internal_faq_create\n */\n public createFaq(data: IFaqSaveData, validationFieldResultData: Record<string, IFieldValidationResultData> = {}): Promise<IFaq> {\n return this.post<IFaq>('/internal/faq', data, (response) => new Faq(response.data), validationFieldResultData);\n }\n\n /**\n * Изменяет данные о часто задаваемом вопросе.\n *\n * @param faqId Идентификатор вопроса.\n * @param data Данные для изменения вопроса.\n * @param validationFieldResultData Список полей, для которых необходимо\n * установить данные об ошибках валидации\n * в случае ошибок в запросах.\n *\n * @see /doc/api/internal#/operations/api_internal_faq_update\n */\n public updateFaq(faqId: number, data: IFaqSaveData, validationFieldResultData: Record<string, IFieldValidationResultData> = {}): Promise<IFaq> {\n return this.patch<IFaq>(`/internal/faq/${faqId}`, data, (response) => new Faq(response.data), validationFieldResultData);\n }\n\n /**\n * Удаляет часто задаваемый вопрос.\n *\n * @param faqId Идентификатор вопроса.\n *\n * @see /doc/api/internal#/operations/api_internal_faq_delete\n */\n public removeFaq(faqId: number): Promise<void> {\n return this.delete(`/internal/faq/${faqId}`);\n }\n\n /**\n * Возвращает список групп часто задаваемых вопросов.\n *\n * @see /doc/api/internal#/operations/api_internal_faq_groups_get_list\n */\n public getGroupsList(): Promise<IFaqGroup[]> {\n return this.getTypedList(FaqGroup, '/internal/faq/groups');\n }\n\n /**\n * Создаёт новую группу часто задаваемых вопросов.\n *\n * @param data Данные для создания группы.\n * @param validationFieldResultData Список полей, для которых необходимо\n * установить данные об ошибках валидации\n * в случае ошибок в запросах.\n *\n * @see /doc/api/internal#/operations/api_internal_faq_groups_create\n */\n public createGroup(data: IFaqGroupSaveData, validationFieldResultData: Record<string, IFieldValidationResultData> = {}): Promise<IFaqGroup> {\n return this.post<IFaqGroup>('/internal/faq/groups', data, (response) => new FaqGroup(response.data), validationFieldResultData);\n }\n\n /**\n * Изменяет данные о группе часто задаваемых вопросов.\n *\n * @param groupId Идентификатор группы.\n * @param data Данные для изменения группы.\n * @param validationFieldResultData Список полей, для которых необходимо\n * установить данные об ошибках валидации\n * в случае ошибок в запросах.\n *\n * @see /doc/api/internal#/operations/api_internal_faq_groups_update\n */\n public updateGroup(groupId: number, data: IFaqGroupSaveData, validationFieldResultData: Record<string, IFieldValidationResultData> = {}): Promise<IFaqGroup> {\n return this.patch<IFaqGroup>(`/internal/faq/groups/${groupId}`, data, (response) => new FaqGroup(response.data), validationFieldResultData);\n }\n\n /**\n * Удаляет группу часто задаваемых вопросов. Вопросы группы при этом не удаляются.\n *\n * @param groupId Идентификатор группы.\n *\n * @see /doc/api/internal#/operations/api_internal_faq_groups_delete\n */\n public removeGroup(groupId: number): Promise<void> {\n return this.delete(`/internal/faq/groups/${groupId}`);\n }\n}\n","import { round } from 'lodash-es';\n\n/**\n * Форматирует относительное изменение как процент со знаком.\n *\n * @param value Доля изменения (0.12 → +12%).\n */\nexport function formatPercentChange(value: number): string {\n const percent = round(value * 100);\n\n return `${percent >= 0 ? '+' : ''}${percent}%`;\n}\n","import { IProduct } from '@sc/catalog/interfaces/i-product';\n\n/**\n * Класс-помощник для работы со значениями единиц измерения товара.\n */\n\nexport class UnitsHelper {\n /**\n * Возвращает признак, что указанный товар имеет линейную единицу измерения.\n *\n * @param product Данные о товаре для которого нужно проверить линейность его единицы измерения.\n */\n public static productIsMeasurable(product: IProduct): boolean {\n return product.unit.isLinear || product.unit.isSquare;\n }\n\n /**\n * Возвращает кратность количества для указанного товара.\n *\n * @param product Данные о товаре для которого необходимо вернуть кратность количества.\n */\n public static getProductMultiplicity(product: IProduct): number {\n return !product.properties?.ignoreMinCountCheck && product.properties?.minCount != null && !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 != null) {\n return product.properties.lengthStep;\n }\n\n return !product.properties?.ignoreMinCountCheck && product.properties?.minCount != null ? product.properties.minCount : 0.01;\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 { useBaseConfigStateStore } from '@sc/config/states/config-state-store';\nimport { HttpRequester } from '@sc/http/classes/http-requester';\nimport { HttpRequestParams } from '@sc/http/types/http-request-params';\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 = useBaseConfigStateStore().config.http.responseDataCacheTimeout as number;\n }\n\n /**\n * Сохраняет указанные данные из запроса в кэш результатов.\n *\n * @param key Ключ кэша (URL запроса или URL с сериализованными params).\n * @param data Данные для кэширования.\n */\n protected cacheResponse(key: string, data: any): void {\n HttpCachedRequester.responseDataCache.set(key, {\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 * @param signal Сигнал отмены запроса.\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: HttpRequestParams = {},\n signal: AbortSignal | undefined = undefined\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.getTypedList<OutDataInterface, SourceDataInterface>(type, url, params, false, signal).then((responseData) => {\n if (useResponseDataCache && responseData) {\n this.cacheResponse(cacheKey, responseData);\n }\n\n return responseData;\n });\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 = TypedInstanceFactory.instanceListInitializer(Manager, data.data);\n\n this.cacheResponse(url, responseData);\n\n return responseData;\n }\n\n /**\n * Возвращает {@link Promise} для получения полных данных о менеджере с указанным идентификатором.\n *\n * @param managerId Идентификатор менеджера.\n *\n * @see /doc/api/internal#/operations/api_internal_managers_get\n */\n public getManager(managerId: number): Promise<IManager> {\n return this.get<IManager>(`/internal/managers/${managerId}`, {}, (response) => new Manager(response.data));\n }\n}\n","/**\n * Статус актуализации заказа-черновика, созданного из файла Профстрой.\n */\nexport enum OfferActualizationStatus {\n /**\n * Выполняется обработка файла и обмен с 1С.\n */\n Processing = 'processing',\n\n /**\n * Обработка завершена успешно.\n */\n Completed = 'completed',\n\n /**\n * Обработка завершилась с ошибкой.\n */\n Error = 'error',\n\n /**\n * Состав записи изменён после последней успешной обработки, требуется повторная актуализация.\n */\n NeedsActualization = 'needs_actualization',\n}\n","import { DateHelper } from '@sc/date-time/helpers/date-helper';\nimport { OfferActualizationStatus } from '@sc/offers/enums/offer-actualization-status';\nimport { IOfferActualization } from '@sc/offers/interfaces/i-offer-actualization';\nimport { isNil } from 'lodash-es';\n\n/**\n * Данные об актуализации заказа-черновика, созданного из файла Профстрой.\n */\nexport class OfferActualization implements IOfferActualization {\n /**\n * @inheritDoc\n */\n public status: OfferActualizationStatus;\n\n /**\n * @inheritDoc\n */\n public actualizedAt?: Date;\n\n /**\n * @inheritDoc\n */\n public expiresAt?: Date;\n\n /**\n * @inheritDoc\n */\n public error?: string;\n\n /**\n * Инициализирует экземпляр класса {@link OfferActualization}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IOfferActualization>) {\n this.status = data?.status ?? OfferActualizationStatus.Processing;\n this.actualizedAt = DateHelper.parse(data?.actualizedAt);\n this.expiresAt = DateHelper.parse(data?.expiresAt);\n this.error = data?.error;\n }\n\n /**\n * @inheritDoc\n */\n public get isProcessing(): boolean {\n return this.status === OfferActualizationStatus.Processing;\n }\n\n /**\n * @inheritDoc\n */\n public get isOutdated(): boolean {\n return this.isOutdatedAt(new Date());\n }\n\n /**\n * @inheritDoc\n */\n public get isOrderAllowed(): boolean {\n return this.isOrderAllowedAt(new Date());\n }\n\n /**\n * @inheritDoc\n */\n public isOutdatedAt(now: Date): boolean {\n if (this.status !== OfferActualizationStatus.Completed || isNil(this.actualizedAt)) {\n return true;\n }\n\n // Момент, равный сроку истечения, ещё допустим: так же проверяет и сервер.\n return !isNil(this.expiresAt) && this.expiresAt.getTime() < now.getTime();\n }\n\n /**\n * @inheritDoc\n */\n public isOrderAllowedAt(now: Date): boolean {\n return this.status === OfferActualizationStatus.Completed && !this.isOutdatedAt(now);\n }\n}\n","import { ClientShortInfo } from '@sc/clients/classes/client-short-info';\nimport { IClientShortInfo } from '@sc/clients/interfaces/i-client-short-info';\nimport { OfferActualization } from '@sc/offers/classes/offer-actualization';\nimport { IOfferActualization } from '@sc/offers/interfaces/i-offer-actualization';\nimport { IOfferShortInfo } from '@sc/offers/interfaces/i-offer-short-info';\nimport { IProfstroyOfferFile } from '@sc/offers/interfaces/i-profstroy-offer-file';\nimport { CreatableIdentity } from '@sc/system/classes/creatable-identity';\n\n/**\n * Краткие данные о заказе-черновике.\n */\nexport class OfferShortInfo extends CreatableIdentity implements IOfferShortInfo {\n /**\n * @inheritDoc\n */\n public name?: string;\n\n /**\n * @inheritDoc\n */\n public client: IClientShortInfo;\n\n /**\n * @inheritDoc\n */\n public sum?: number;\n\n /**\n * @inheritDoc\n */\n public isProfstroy?: boolean;\n\n /**\n * @inheritDoc\n */\n public actualization?: IOfferActualization;\n\n /**\n * @inheritDoc\n */\n public file?: IProfstroyOfferFile;\n\n /**\n * Инициализирует экземпляр класса {@link OfferShortInfo}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IOfferShortInfo>) {\n super(data);\n\n this.name = data?.name;\n this.client = new ClientShortInfo(data?.client);\n this.sum = data?.sum;\n this.isProfstroy = data?.isProfstroy;\n this.actualization = data?.actualization && new OfferActualization(data.actualization);\n this.file = data?.file;\n }\n}\n","import { OrderItem } from '@sc/cart/classes/order-item';\nimport { IProfstroyOfferItem } from '@sc/offers/interfaces/i-profstroy-offer-item';\nimport { isEmpty, isNil } from 'lodash-es';\n\n/**\n * Позиция заказа-черновика, созданного из файла Профстрой.\n */\nexport class ProfstroyOfferItem extends OrderItem<undefined, string> implements IProfstroyOfferItem {\n /**\n * @inheritDoc\n */\n public groupName?: string;\n\n /**\n * @inheritDoc\n */\n public supplierSku?: string;\n\n /**\n * @inheritDoc\n */\n public isIgnored?: boolean;\n\n /**\n * @inheritDoc\n */\n public lineError?: string;\n\n /**\n * Инициализирует экземпляр класса {@link ProfstroyOfferItem}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data: IProfstroyOfferItem) {\n super(data);\n\n this.groupName = data.groupName;\n this.supplierSku = data.supplierSku ?? data.product.supplierSku;\n this.isIgnored = data.isIgnored;\n this.lineError = data.lineError;\n }\n\n /**\n * @inheritDoc\n */\n public get isProductStub(): boolean {\n return isNil(this.product.id);\n }\n\n /**\n * @inheritDoc\n */\n public get isOrderable(): boolean {\n return !this.isProductStub && !this.isIgnored && isEmpty(this.lineError);\n }\n}\n","import { OrderItem } from '@sc/cart/classes/order-item';\nimport { IOrderItem } from '@sc/cart/interfaces/i-order-item';\nimport { OfferShortInfo } from '@sc/offers/classes/offer-short-info';\nimport { ProfstroyOfferItem } from '@sc/offers/classes/profstroy-offer-item';\nimport { IOffer } from '@sc/offers/interfaces/i-offer';\nimport { IProfstroyOfferItem } from '@sc/offers/interfaces/i-profstroy-offer-item';\n\n/**\n * Полные данные о заказе-черновике.\n */\nexport class Offer extends OfferShortInfo implements IOffer {\n /**\n * @inheritDoc\n */\n public sum: number;\n\n /**\n * @inheritDoc\n */\n public products: Array<OrderItem<undefined, string>>;\n\n /**\n * Инициализирует экземпляр класса {@link Offer}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data: Partial<IOffer>) {\n super(data);\n\n this.sum = data.sum ?? 0;\n // Позиции заявки Профстрой несут данные файла, у обычного черновика это обычные позиции корзины.\n this.products = (data.products ?? []).map((product: IOrderItem<undefined, string>) =>\n data.isProfstroy ? new ProfstroyOfferItem(product as IProfstroyOfferItem) : new OrderItem<undefined, string>(product)\n );\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any,@typescript-eslint/no-unnecessary-condition */\n\nimport { IOffersListFilters } from '@sc/offers/interfaces/i-offers-list-filters';\nimport { PaginationFiltersBase } from '@sc/pagination/filters/pagination-filters-base';\nimport { DatePeriod } from '@sc/system/classes/date-period';\nimport { IDatePeriod } from '@sc/system/interfaces/i-date-period';\n\n/**\n * Данные о параметрах фильтрации списка заказов-черновиков.\n */\nexport class OffersListFilters extends PaginationFiltersBase implements IOffersListFilters {\n /**\n * @inheritDoc\n */\n public id?: string;\n\n /**\n * @inheritDoc\n */\n public clientSearchTerm?: string;\n\n /**\n * @inheritDoc\n */\n public name?: string;\n\n /**\n * @inheritDoc\n */\n public createdAt: IDatePeriod = new DatePeriod();\n\n /**\n * Инициализирует экземпляр класса {@link OffersListFilters}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IOffersListFilters) {\n super();\n\n this.id = data?.id;\n this.clientSearchTerm = data?.clientSearchTerm;\n this.name = data?.name;\n this.createdAt = new DatePeriod(data?.createdAt);\n }\n\n /**\n * @inheritDoc\n */\n public resetFilterValue(key: string): this {\n if (key === 'createdAt') {\n this.createdAt.from = null;\n this.createdAt.to = null;\n } else {\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 }\n\n return this;\n }\n\n /**\n * @inheritDoc\n */\n public asClearRaw(): Record<string, any> {\n const result = super.asClearRaw();\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 return result;\n }\n}\n","import { OrderStatusEnum } from '@sc/references/enums/order-status-enum';\nimport { IOrderStatus } from '@sc/references/interfaces/i-order-status';\nimport { Reference } from '@sc/system/classes/reference';\n\n/**\n * Данные о статусе заказа.\n */\nexport class OrderStatus extends Reference<OrderStatusEnum> implements IOrderStatus {}\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 { OrderStatus } from '@sc/references/classes/order-status';\nimport { SalesDirection } from '@sc/references/classes/sales-direction';\nimport { Warehouse } from '@sc/references/classes/warehouse';\nimport { IOrderStatus } from '@sc/references/interfaces/i-order-status';\nimport { ISalesDirection } from '@sc/references/interfaces/i-sales-direction';\nimport { Reference } from '@sc/system/classes/reference';\nimport { IReference } from '@sc/system/interfaces/i-reference';\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 * @inheritDoc\n */\n public client: IClientShortInfo;\n\n /**\n * @inheritDoc\n */\n public payment: IOrderInfo['payment'];\n\n /**\n * @inheritDoc\n */\n public delivery: IOrderInfo['delivery'];\n\n /**\n * @inheritDoc\n */\n public attachedUser?: IUserShortInfo;\n\n /**\n * @inheritDoc\n */\n public status: IOrderStatus;\n\n /**\n * @inheritDoc\n */\n public statusDetail?: IReference;\n\n /**\n * @inheritDoc\n */\n public salesDirection: ISalesDirection;\n\n /**\n * @inheritDoc\n */\n public attachedAt?: Date;\n\n /**\n * @inheritDoc\n */\n public isOnOrder: boolean;\n\n /**\n * @inheritDoc\n */\n public isProfstroy: boolean;\n\n /**\n * @inheritDoc\n */\n public isNotInStock: boolean;\n\n /**\n * @inheritDoc\n */\n public sum: number;\n\n /**\n * @inheritDoc\n */\n public isLargeOrder: 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 = data?.attachedUser ? new UserShortInfo(data?.attachedUser) : undefined;\n this.status = new OrderStatus(data?.status);\n this.statusDetail = data?.statusDetail ? new Reference(data.statusDetail) : undefined;\n this.salesDirection = new SalesDirection(data?.salesDirection);\n this.attachedAt = isString(data?.attachedAt) ? parseISO(data.attachedAt as unknown as string) : data?.attachedAt;\n\n this.isOnOrder = data?.isOnOrder ?? false;\n this.isProfstroy = data?.isProfstroy ?? false;\n this.isNotInStock = data?.isNotInStock ?? false;\n this.sum = data?.sum ?? 0;\n this.isLargeOrder = data?.isLargeOrder ?? false;\n }\n}\n","import { ICartItemConfiguratorParamsBase } from '@sc/cart/interfaces/i-cart-item-configurator-params-base';\nimport { IOrderItem } from '@sc/cart/interfaces/i-order-item';\nimport { IOrderItemBase } from '@sc/cart/interfaces/i-order-item-base';\nimport { ClientProduct } from '@sc/catalog/classes/client-product';\nimport { IClientProduct } from '@sc/catalog/interfaces/i-client-product';\nimport { OrderItemBase } from '@sc/orders/classes/order-item-base';\nimport { Currency } from '@sc/references/classes/currency';\nimport { ICurrency } from '@sc/references/interfaces/i-currency';\nimport { isArray } from 'lodash-es';\n\n/**\n * Данные о единичной позиции товара/услуги в заказе (продукт заказа).\n */\nexport class OrderItem<T extends ICartItemConfiguratorParamsBase | undefined = undefined, TId = number> extends OrderItemBase<T, TId> implements IOrderItem<T, TId> {\n /**\n * @inheritDoc\n */\n public override product: IClientProduct;\n\n /**\n * @inheritDoc\n */\n public cost: number;\n\n /**\n * @inheritDoc\n */\n public costOne: number;\n\n /**\n * @inheritDoc\n */\n public costOneRub: number;\n\n /**\n * @inheritDoc\n */\n public costRub: number;\n\n /**\n * @inheritDoc\n */\n public logicGroupId?: string;\n\n /**\n * @inheritDoc\n */\n public salesDirection?: number;\n\n /**\n * @inheritDoc\n */\n public specificationImgUrl?: string;\n\n /**\n * @inheritDoc\n */\n public sawing?: Array<Record<string, number>>;\n\n /**\n * @inheritDoc\n */\n public override currency: ICurrency;\n\n /**\n * Список названий полей, значения которых отличаются между текущей позицией и позицией-заменителем.\n */\n public changedFields: string[] = [];\n\n /**\n * Продукт, которым заменена текущая запись.\n */\n public replacement?: IOrderItemBase;\n\n /**\n * Инициализирует экземпляр класса {@link OrderItem}.\n *\n * @param data Данные для первоначальной инициализации.\n * @param replacement Продукт, которым заменена текущая запись.\n */\n public constructor(data: IOrderItem<T, TId>, replacement?: IOrderItemBase) {\n super(data);\n\n this.product = new ClientProduct(data.product);\n this.currency = new 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 // eslint-disable-next-line sonarjs/no-nested-conditional\n this.sawing = isArray(data.sawing) ? data.sawing : data.sawing ? [data.sawing] : undefined;\n\n if (replacement) {\n this.replacement = replacement;\n\n if (this.quantity !== replacement.quantity) {\n this.changedFields.push('quantity');\n }\n\n if (this.length !== replacement.length) {\n this.changedFields.push('length');\n }\n }\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 { OrderItem } from '@sc/orders/classes/order-item';\nimport { OrderAction } from '@sc/orders/enums/order-action';\nimport { IOrder } from '@sc/orders/interfaces/i-order';\nimport { OrderStatus } from '@sc/references/classes/order-status';\nimport { IOrderStatus } from '@sc/references/interfaces/i-order-status';\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 * @inheritDoc\n */\n public products: OrderItem[];\n\n /**\n * @inheritDoc\n */\n public invoices?: string[];\n\n /**\n * @inheritDoc\n */\n public comment?: string;\n\n /**\n * @inheritDoc\n */\n public image?: string;\n\n /**\n * @inheritDoc\n */\n public contragent?: IContragentPerson | IContragentIc | IContragentUlR | IContragentUlNr;\n\n /**\n * @inheritDoc\n */\n public barcode?: string;\n\n /**\n * @inheritDoc\n */\n public orderSource?: IReference;\n\n /**\n * @inheritDoc\n */\n public isAllowProcessingWithoutPayment?: boolean;\n\n /**\n * @inheritDoc\n */\n public nextStatuses?: IOrderStatus[];\n\n /**\n * @inheritDoc\n */\n public actions?: OrderAction[];\n\n /**\n * @inheritDoc\n */\n public operatorsComment?: string;\n\n /**\n * @inheritDoc\n */\n public operatorsForWarehouseComment?: string;\n\n /**\n * @inheritDoc\n */\n public erpOrderUrl?: string;\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) => {\n const replacement = product.replacementId ? data.products?.find((p) => p.id === product.replacementId) : undefined;\n\n return new OrderItem(product, replacement);\n });\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 this.nextStatuses = data.nextStatuses?.map((s) => new OrderStatus(s));\n this.actions = data.actions;\n this.operatorsComment = data.operatorsComment;\n this.operatorsForWarehouseComment = data.operatorsForWarehouseComment;\n this.erpOrderUrl = data.erpOrderUrl;\n }\n}\n","/* eslint-disable @typescript-eslint/no-unnecessary-condition,@typescript-eslint/no-unsafe-argument,@typescript-eslint/no-unsafe-member-access,vue/max-len */\n\nimport { ICartItemConfiguratorParamsBase } from '@sc/cart/interfaces/i-cart-item-configurator-params-base';\nimport { IOrderItemBase } from '@sc/cart/interfaces/i-order-item-base';\nimport { useBaseConfigStateStore } from '@sc/config/states/config-state-store';\nimport { Offer } from '@sc/offers/classes/offer';\nimport { OfferShortInfo } from '@sc/offers/classes/offer-short-info';\nimport { IOffer } from '@sc/offers/interfaces/i-offer';\nimport { IOfferSendData } from '@sc/offers/interfaces/i-offer-send-data';\nimport { IOfferShortInfo } from '@sc/offers/interfaces/i-offer-short-info';\nimport { Order } from '@sc/orders/classes/order';\nimport { IClientOrderCreateData } from '@sc/orders/interfaces/i-client-order-create-data';\nimport { IOrder } from '@sc/orders/interfaces/i-order';\nimport { IPaginatedResponse } from '@sc/pagination/interfaces/i-paginated-response';\nimport { BasePaginationProvider } from '@sc/pagination/providers/base-pagination-provider';\nimport { IFile } from '@sc/system/interfaces/i-file';\nimport { TypedInstanceFactory } from '@sc/system/providers/typed-instance-factory';\nimport { IFilterGroup } from '@sc/table-data/interfaces/i-filter-group';\nimport { IPaginationRequestParams } from '@sc/table-data/interfaces/i-pagination-request-params';\nimport { ISortRequestParams } from '@sc/table-data/interfaces/i-sort-request-params';\nimport { IFieldValidationResultData } from '@sc/validation/interfaces/i-field-validation-result-data';\nimport { format } from 'date-fns';\n\n/**\n * Предоставляет механизмы получения/управления данными о заказах-черновиках.\n */\nexport class OffersDataProvider extends BasePaginationProvider {\n /**\n * Возвращает список заказов-черновиков, удовлетворяющих указанным параметрам поиска.\n *\n * @param filters Параметры фильтрации данных.\n * @param sortParams Параметры сортировки.\n * @param paginationParams Параметры пагинации.\n * @param signal Сигнал отмены запроса.\n *\n * @see /doc/api/internal#/Заказы/api_internal_order_commercial_offer_get_list\n */\n public getOffers(\n filters?: IFilterGroup,\n sortParams?: ISortRequestParams[],\n paginationParams?: IPaginationRequestParams,\n signal: AbortSignal | undefined = undefined\n ): Promise<IPaginatedResponse<IOfferShortInfo>> {\n return this.getTypedPaginated(OfferShortInfo, '/internal/orders/offers', filters, sortParams, paginationParams, {}, undefined, signal);\n }\n\n /**\n * Создаёт заказ-черновик из содержимого корзины клиента и возвращает данные созданной записи.\n *\n * @param clientId Идентификатор клиента.\n * @param name Название создаваемой записи.\n * @param items Идентификаторы позиций корзины, которые необходимо перенести (частичный перенос).\n * Если не указаны, переносится вся корзина.\n *\n * @see /doc/api/internal#/Заказы/api_internal_order_commercial_offer_create\n */\n public createOfferFromCart(clientId: number, name?: string, items?: string[]): Promise<IOffer> {\n return this.post<IOffer>(\n `/internal/orders/offers/${clientId}`,\n {\n name,\n items: items?.length ? items : undefined,\n },\n (response) => new Offer(response.data)\n );\n }\n\n /**\n * Создаёт заказ-черновик из файла выгрузки программы «Профстрой» и запускает его обработку.\n * Обработка выполняется в фоне: запись возвращается в статусе актуализации «выполняется».\n *\n * @param clientId Идентификатор клиента.\n * @param file Файл выгрузки программы «Профстрой».\n * @param name Название создаваемой записи.\n * @param validationFieldResultData Список полей, для которых необходимо установить данные об ошибках\n * валидации в случае ошибок в запросах.\n *\n * @see /doc/api/internal#/Заказы/api_internal_order_commercial_offer_create_profstroy\n */\n public createProfstroyOffer(clientId: number, file: IFile, name?: string, validationFieldResultData: Record<string, IFieldValidationResultData> = {}): Promise<IOffer> {\n return this.post<IOffer>(`/internal/orders/offers/${clientId}/profstroy`, { file, name }, (response) => new Offer(response.data), validationFieldResultData);\n }\n\n /**\n * Запускает актуализацию заказа-черновика, созданного из файла «Профстрой»: текущий состав записи\n * повторно отправляется в 1С без повторной обработки файла. Выполняется в фоне.\n *\n * @param offerId Идентификатор записи заказа-черновика.\n *\n * @see /doc/api/internal#/Заказы/api_internal_order_commercial_offer_profstroy_actualize\n */\n public actualizeProfstroyOffer(offerId: number): Promise<IOffer> {\n return this.post<IOffer>(`/internal/orders/offers/${offerId}/profstroy/actualize`, {}, (response) => new Offer(response.data));\n }\n\n /**\n * Пересобирает заказ-черновик из ранее сохранённого файла «Профстрой»: состав записи формируется заново,\n * внесённые вручную изменения количества и удалённые позиции при этом теряются. Выполняется в фоне.\n *\n * @param offerId Идентификатор записи заказа-черновика.\n *\n * @see /doc/api/internal#/Заказы/api_internal_order_commercial_offer_profstroy_reload\n */\n public reloadProfstroyOffer(offerId: number): Promise<IOffer> {\n return this.post<IOffer>(`/internal/orders/offers/${offerId}/profstroy/reload`, {}, (response) => new Offer(response.data));\n }\n\n /**\n * Возвращает данные заказа-черновика с указанным идентификатором.\n *\n * @param offerId Идентификатор записи заказа-черновика.\n *\n * @see /doc/api/internal#/Заказы/api_internal_order_commercial_offer_get\n */\n public getOffer(offerId: number): Promise<IOffer> {\n return this.get<IOffer>(`/internal/orders/offers/${offerId}`, {}, (response) => new Offer(response.data));\n }\n\n /**\n * Обновляет данные заказа-черновика и возвращает обновлённые данные.\n *\n * @param offerId Идентификатор записи заказа-черновика.\n * @param name Новое название записи.\n *\n * @see /doc/api/internal#/Заказы/api_internal_order_commercial_offer_change\n */\n public updateOffer(offerId: number, name?: string): Promise<IOffer> {\n return this.patch<IOffer>(`/internal/orders/offers/${offerId}`, { name }, (response) => new Offer(response.data));\n }\n\n /**\n * Удаляет заказ-черновик.\n *\n * @param offerId Идентификатор записи заказа-черновика.\n *\n * @see /doc/api/internal#/Заказы/api_internal_order_commercial_offer_delete\n */\n public deleteOffer(offerId: number): Promise<void> {\n return this.delete(`/internal/orders/offers/${offerId}`);\n }\n\n /**\n * Создаёт заказы на основе заказа-черновика: позиции группируются по направлениям продаж,\n * по каждому направлению создаётся отдельный заказ за один запрос. Возвращает список созданных заказов.\n *\n * @param offerId Идентификатор записи заказа-черновика.\n * @param data Данные для создания заказов (параметры доставки/оплаты, единые для всех направлений).\n * @param items Идентификаторы позиций записи, которые необходимо оформить (частичное оформление).\n * Если не указаны, оформляются все позиции.\n * @param validationFieldResultData Список полей, для которых необходимо установить данные об ошибках\n * валидации в случае ошибок в запросах.\n *\n * @see /doc/api/internal#/Заказы/api_internal_order_commercial_offer_create_order\n */\n public createOrderFromDraft(\n offerId: number,\n data: IClientOrderCreateData,\n items?: string[],\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<IOrder[]> {\n const apiDateFormat = useBaseConfigStateStore().config.dateFormats.api;\n\n return this.post<IOrder[]>(\n `/internal/orders/offers/${offerId}/create-order`,\n {\n ...data,\n deliveryDate: data.deliveryDate ? format(data.deliveryDate, apiDateFormat) : undefined,\n items: items?.length ? items : undefined,\n },\n (response) => TypedInstanceFactory.instanceListInitializer(Order, response.data),\n validationFieldResultData\n );\n }\n\n /**\n * Добавляет продукт в заказ-черновик и возвращает обновлённые данные записи.\n *\n * @param offerId Идентификатор записи заказа-черновика.\n * @param cartItem Данные о товаре, который необходимо добавить.\n * @param validationFieldResultData Список полей, для которых необходимо установить данные об ошибках\n * валидации в случае ошибок в запросах.\n *\n * @see /doc/api/internal#/Заказы/api_internal_order_commercial_offer_product_add\n */\n public addOfferProduct<T extends ICartItemConfiguratorParamsBase | undefined = undefined>(\n offerId: number,\n cartItem: IOrderItemBase<T>,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<IOffer> {\n return this.post<IOffer>(\n `/internal/orders/offers/${offerId}/products`,\n {\n product_id: cartItem.product.id,\n product_category_id: cartItem.configurator ? cartItem.category.id : undefined,\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 is_additional_sale: cartItem.isAdditionalSale,\n ...cartItem.configuratorParams,\n },\n (response) => new Offer(response.data),\n validationFieldResultData\n );\n }\n\n /**\n * Изменяет продукт в заказе-черновике и возвращает обновлённые данные записи.\n *\n * @param offerId Идентификатор записи заказа-черновика.\n * @param offerProductId Идентификатор позиции записи.\n * @param cartItem Данные о товаре, параметры которого необходимо изменить.\n * @param validationFieldResultData Список полей, для которых необходимо установить данные об ошибках\n * валидации в случае ошибок в запросах.\n *\n * @see /doc/api/internal#/Заказы/api_internal_order_commercial_offer_product_modify\n */\n public patchOfferProduct<T extends ICartItemConfiguratorParamsBase | undefined = undefined>(\n offerId: number,\n offerProductId: string,\n cartItem: IOrderItemBase<T>,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<IOffer> {\n return this.patch<IOffer>(\n `/internal/orders/offers/${offerId}/products/${offerProductId}`,\n {\n product_id: cartItem.product.id,\n product_category_id: cartItem.configurator ? cartItem.category.id : undefined,\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 is_additional_sale: cartItem.isAdditionalSale,\n ...cartItem.configuratorParams,\n },\n (response) => new Offer(response.data),\n validationFieldResultData\n );\n }\n\n /**\n * Удаляет продукт из заказа-черновика и возвращает обновлённые данные записи.\n *\n * @param offerId Идентификатор записи заказа-черновика.\n * @param offerProductId Идентификатор позиции записи.\n *\n * @see /doc/api/internal#/Заказы/api_internal_order_commercial_offer_product_delete\n */\n public deleteOfferProduct(offerId: number, offerProductId: string): Promise<IOffer> {\n return this.delete<IOffer>(`/internal/orders/offers/${offerId}/products/${offerProductId}`, (response) => new Offer(response.data));\n }\n\n /**\n * Возвращает содержимое печатной формы заказа-черновика в формате HTML.\n *\n * @param offerId Идентификатор записи заказа-черновика.\n * @param recipientText Текст блока «Кому» в документе.\n *\n * @see /doc/api/internal#/Заказы/api_internal_order_commercial_offer_view_html\n */\n public getOfferHtml(offerId: number, recipientText?: string): Promise<Blob> {\n return this.get<Blob>(`/internal/orders/offers/${offerId}/view`, recipientText ? { recipientText } : {}, (response) => new Blob([response.data], { type: 'text/html' }));\n }\n\n /**\n * Возвращает файл заказа-черновика в формате PDF.\n *\n * @param offerId Идентификатор записи заказа-черновика.\n * @param recipientText Текст блока «Кому» в документе.\n *\n * @see /doc/api/internal#/Заказы/api_internal_order_commercial_offer_download\n */\n public getOfferPdf(offerId: number, recipientText?: string): Promise<Blob> {\n return this.getBlob<Blob>(\n `/internal/orders/offers/${offerId}/download`,\n recipientText ? { recipientText } : {},\n (response) => new Blob([response.request.response], { type: 'application/pdf' })\n );\n }\n\n /**\n * Отправляет заказ-черновик на указанный адрес электронной почты.\n *\n * @param offerId Идентификатор записи заказа-черновика.\n * @param data Данные для отправки (текст «Кому», e-mail, дополнительные файлы).\n *\n * @see /doc/api/internal#/Заказы/api_internal_order_commercial_offer_send\n */\n public sendOffer(offerId: number, data: IOfferSendData): Promise<void> {\n return this.post(`/internal/orders/offers/${offerId}/send`, data);\n }\n}\n","import { IOffer } from '@sc/offers/interfaces/i-offer';\nimport { IOfferShortInfo } from '@sc/offers/interfaces/i-offer-short-info';\nimport { IProfstroyOffer } from '@sc/offers/interfaces/i-profstroy-offer';\nimport { isNil } from 'lodash-es';\n\n/**\n * Класс-помощник для работы с заказами-черновиками.\n */\nexport class OfferHelper {\n /**\n * Возвращает признак того, что запись создана из файла выгрузки программы «Профстрой».\n *\n * @param offer Данные записи заказа-черновика.\n */\n public static isProfstroy(offer?: IOfferShortInfo | null): boolean {\n return Boolean(offer?.isProfstroy);\n }\n\n /**\n * Возвращает признак того, что полные данные записи относятся к заявке Профстрой,\n * уточняя тип записи для доступа к данным актуализации и позициям заявки.\n *\n * @param offer Полные данные записи заказа-черновика.\n */\n public static isProfstroyOffer(offer?: IOffer | null): offer is IProfstroyOffer {\n return !isNil(offer) && offer.isProfstroy === true && !isNil(offer.actualization);\n }\n}\n","/**\n * Доступные пользователю действия с заказом.\n */\nexport enum OrderAction {\n /**\n * Разрешено просматривать заказ.\n */\n View = 'view',\n\n /**\n * Разрешено делиться заказом.\n */\n Share = 'share',\n\n /**\n * Разрешено редактировать теги заказа.\n */\n EditTags = 'edit_tags',\n\n /**\n * Разрешено сохранять информацию о незаказанных продуктах.\n */\n SaveOrderIgnoredProducts = 'save_order_ignored_products',\n\n /**\n * Разрешено изменять статус заказа.\n */\n ChangeStatus = 'change_status',\n\n /**\n * Разрешено изменять содержимое указанного заказа.\n */\n ChangeProducts = 'change_products',\n\n /**\n * Разрешено изменять данные заказа.\n */\n ChangeOrderParameters = 'change_order_parameters',\n\n /**\n * Разрешено пересчитывать стоимость указанного заказа.\n */\n Recalculate = 'recalculate',\n\n /**\n * Разрешено закрепить заказ.\n */\n AttachOrder = 'attach_order',\n\n /**\n * Разрешено открепить заказ.\n */\n DetachOrder = 'detach_order',\n\n /**\n * Разрешено заменить закрепленного оператора.\n */\n ChangeAttachedOperator = 'change_attached_operator',\n\n /**\n * Разрешено отправить ссылку на online-оплату заказа.\n */\n SendOnlinePaymentLink = 'send_online_payment_link',\n\n /**\n * Разрешено подтверждать полный расчёт online-оплаты заказа.\n */\n ConfirmOnlineFullPayment = 'confirm_online_full_payment',\n\n /**\n * Разрешено объединять заказы.\n */\n MergeOrders = 'merge_orders',\n\n /**\n * Разрешено просматривать историю статусов заказа.\n */\n GetHistory = 'get_history',\n\n /**\n * Разрешено копировать заказ.\n */\n CloneOrder = 'clone_order',\n\n /**\n * Разрешено удалять прикрепленный к заказу файл.\n */\n DeleteAttachedFile = 'delete_attached_file',\n}\n","import { IOrder } from '@sc/orders/interfaces/i-order';\nimport { IOrderEditorData } from '@sc/orders/interfaces/i-order-editor-data';\nimport { IFile } from '@sc/system/interfaces/i-file';\n\n/**\n * Данные для создания/редактирования заказа.\n */\nexport class OrderEditorData implements IOrderEditorData {\n /**\n * @inheritDoc\n */\n public paymentType?: number;\n\n /**\n * @inheritDoc\n */\n public deliveryType?: number;\n\n /**\n * @inheritDoc\n */\n public contragentId?: number;\n\n /**\n * @inheritDoc\n */\n public deliveryDate?: Date;\n\n /**\n * @inheritDoc\n */\n public addressId?: number;\n\n /**\n * @inheritDoc\n */\n public warehouseId?: number;\n\n /**\n * @inheritDoc\n */\n public image?: IFile;\n\n /**\n * @inheritDoc\n */\n public comment?: string;\n\n /**\n * @inheritDoc\n */\n public barcode?: string;\n\n /**\n * @inheritDoc\n */\n public operatorsComment?: string;\n\n /**\n * @inheritDoc\n */\n public operatorsForWarehouseComment?: string;\n\n /**\n * @inheritDoc\n */\n public additionalEmails?: string[];\n\n /**\n * @inheritDoc\n */\n public isAllowProcessingWithoutPayment?: boolean;\n\n /**\n * @inheritDoc\n */\n public isAdditionalSale?: boolean;\n\n /**\n * Инициализирует экземпляр класса {@link OrderEditorData}.\n *\n * @param order Данные заказа для первоначальной инициализации.\n */\n public constructor(order?: IOrder) {\n this.paymentType = order?.payment.type;\n this.deliveryType = order?.delivery.type;\n this.contragentId = order?.contragent?.id;\n this.deliveryDate = order?.delivery.date ? new Date(order.delivery.date) : undefined;\n this.addressId = order?.delivery.address?.id;\n this.warehouseId = order?.delivery.warehouse?.id;\n\n this.comment = order?.comment;\n this.barcode = order?.barcode;\n this.operatorsComment = order?.operatorsComment;\n this.operatorsForWarehouseComment = order?.operatorsForWarehouseComment;\n this.isAllowProcessingWithoutPayment = order?.isAllowProcessingWithoutPayment;\n }\n}\n","import { IOperator } from '@sc/references/interfaces/i-operator';\nimport { Reference } from '@sc/system/classes/reference';\n\n/**\n * Оператор.\n */\nexport class Operator extends Reference implements IOperator {}\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","/* eslint-disable @typescript-eslint/no-explicit-any,@typescript-eslint/no-unnecessary-condition */\n\nimport { ClientShortInfo } from '@sc/clients/classes/client-short-info';\nimport { IContragentUlNr } from '@sc/clients/interfaces/contragent/i-contragent-ul-nr';\nimport { IClientShortInfo } from '@sc/clients/interfaces/i-client-short-info';\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 { PaginationFiltersBase } from '@sc/pagination/filters/pagination-filters-base';\nimport { CityWithRegionAndCountry } from '@sc/references/classes/city-with-region-and-country';\nimport { DeliveryType } from '@sc/references/classes/delivery-type';\nimport { Operator } from '@sc/references/classes/operator';\nimport { PaymentType } from '@sc/references/classes/payment-type';\nimport { SalesDirection } from '@sc/references/classes/sales-direction';\nimport { Warehouse } from '@sc/references/classes/warehouse';\nimport { ICityWithRegionAndCountry } from '@sc/references/interfaces/i-city-with-region-and-country';\nimport { IDeliveryType } from '@sc/references/interfaces/i-delivery-type';\nimport { IOperator } from '@sc/references/interfaces/i-operator';\nimport { IOrderStatus } from '@sc/references/interfaces/i-order-status';\nimport { IPaymentType } from '@sc/references/interfaces/i-payment-type';\nimport { ISalesDirection } from '@sc/references/interfaces/i-sales-direction';\nimport { IWarehouse } from '@sc/references/interfaces/i-warehouse';\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 { UserShortInfo } from '@sc/user/classes/user-short-info';\nimport { IUserShortInfo } from '@sc/user/interfaces/i-user-short-info';\n\n/**\n * Данные о параметрах фильтрации списка заказов.\n */\nexport class OrdersListFilters extends PaginationFiltersBase implements IOrdersListFilters {\n /**\n * @inheritDoc\n */\n public attachedUsers?: Array<IOperator | IManager>;\n\n /**\n * @inheritDoc\n */\n public clientSearchTerm?: string;\n\n /**\n * @inheritDoc\n */\n public client?: IClientShortInfo;\n\n /**\n * @inheritDoc\n */\n public contragent?: Partial<IContragentUlNr>;\n\n /**\n * @inheritDoc\n */\n public createdAt: IDatePeriod = new DatePeriod();\n\n /**\n * @inheritDoc\n */\n public creator?: IUserShortInfo;\n\n /**\n * @inheritDoc\n */\n public deliveryDate: IDatePeriod = new DatePeriod();\n\n /**\n * @inheritDoc\n */\n public deliveryAddressSearch?: string;\n\n /**\n * @inheritDoc\n */\n public clientCities?: ICityWithRegionAndCountry[];\n\n /**\n * @inheritDoc\n */\n public id?: string;\n\n /**\n * @inheritDoc\n */\n public isApproved?: boolean;\n\n /**\n * @inheritDoc\n */\n public isNotInStock?: boolean;\n\n /**\n * @inheritDoc\n */\n public isOnOrder?: boolean;\n\n /**\n * @inheritDoc\n */\n public attachedAt: IDatePeriod = new DatePeriod();\n\n /**\n * @inheritDoc\n */\n public salesDirections?: ISalesDirection[];\n\n /**\n * @inheritDoc\n */\n public status?: IOrderStatus[];\n\n /**\n * @inheritDoc\n */\n public statusDetail?: IReference[];\n\n /**\n * @inheritDoc\n */\n public deliveryType?: IDeliveryType;\n\n /**\n * @inheritDoc\n */\n public paymentType?: IPaymentType;\n\n /**\n * @inheritDoc\n */\n public warehouses?: IWarehouse[];\n\n /**\n * @inheritDoc\n */\n public isLargeOrder?: boolean;\n\n /**\n * @inheritDoc\n */\n public isToProcess?: boolean;\n\n /**\n * @inheritDoc\n */\n public onlyMyRegions?: boolean;\n\n /**\n * Инициализирует экземпляр класса {@link OrdersListFilters}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IOrdersListFilters) {\n super();\n this.attachedUsers = data?.attachedUsers?.map((o) => ('isActive' in o ? new Manager(o) : new Operator(o)));\n this.clientSearchTerm = data?.clientSearchTerm;\n this.client = data?.client ? new ClientShortInfo(data.client) : undefined;\n this.contragent = data?.contragent;\n this.createdAt = new DatePeriod(data?.createdAt);\n this.creator = data?.creator ? new UserShortInfo(data.creator) : undefined;\n this.deliveryDate = new DatePeriod(data?.deliveryDate);\n this.deliveryAddressSearch = data?.deliveryAddressSearch;\n this.clientCities = data?.clientCities?.map((c) => new CityWithRegionAndCountry(c));\n this.id = data?.id;\n this.isApproved = data?.isApproved;\n this.isNotInStock = data?.isNotInStock;\n this.isOnOrder = data?.isOnOrder;\n this.isLargeOrder = data?.isLargeOrder;\n this.attachedAt = new DatePeriod(data?.attachedAt);\n this.salesDirections = data?.salesDirections?.map((s) => new SalesDirection(s));\n this.status = data?.status;\n this.statusDetail = data?.statusDetail;\n this.deliveryType = data?.deliveryType ? new DeliveryType(data.deliveryType) : undefined;\n this.paymentType = data?.paymentType ? new PaymentType(data.paymentType) : undefined;\n this.warehouses = data?.warehouses?.map((w) => new Warehouse(w));\n this.isToProcess = data?.isToProcess;\n }\n\n /**\n * @inheritDoc\n */\n public resetFilterValue(key: string): this {\n switch (key) {\n case 'createdAt':\n this.createdAt.from = null;\n this.createdAt.to = null;\n break;\n case 'creator':\n this.creator = undefined;\n break;\n case 'deliveryDate':\n this.deliveryDate.from = null;\n this.deliveryDate.to = null;\n break;\n case 'deliveryType':\n this.deliveryType = new DeliveryType();\n break;\n case 'clientCities':\n this.clientCities = [] as ICityWithRegionAndCountry[];\n break;\n case 'attachedAt':\n this.attachedAt.from = null;\n this.attachedAt.to = null;\n break;\n case 'salesDirection':\n case 'salesDirections':\n this.salesDirections = [] as ISalesDirection[];\n break;\n case 'status':\n this.status = [] as IOrderStatus[];\n break;\n case 'warehouse':\n case 'warehouses':\n this.warehouses = [] as IWarehouse[];\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 * @inheritDoc\n */\n public asClearRaw(): Record<string, any> {\n const result = super.asClearRaw();\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?.deliveryDate?.from && !result?.deliveryDate?.to) {\n delete result.deliveryDate;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (!result?.attachedAt?.from && !result?.attachedAt?.to) {\n delete result.attachedAt;\n }\n\n return result;\n }\n}\n","import { IOrderStatusHistoryInfo } from '@sc/orders/interfaces/i-order-status-history-info';\nimport { OrderStatus } from '@sc/references/classes/order-status';\nimport { IOrderStatus } from '@sc/references/interfaces/i-order-status';\nimport { Reference } from '@sc/system/classes/reference';\nimport { IReference } from '@sc/system/interfaces/i-reference';\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 OrderStatusHistoryInfo implements IOrderStatusHistoryInfo {\n /**\n * @inheritDoc\n */\n public user: IUserShortInfo;\n\n /**\n * @inheritDoc\n */\n public status: IOrderStatus;\n\n /**\n * @inheritDoc\n */\n public statusDetail?: IReference;\n\n /**\n * @inheritDoc\n */\n public createdAt: Date;\n\n /**\n * Инициализирует экземпляр класса {@link OrderStatusHistoryInfo}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IOrderStatusHistoryInfo>) {\n this.user = new UserShortInfo(data?.user);\n this.status = new OrderStatus(data?.status);\n this.statusDetail = data?.statusDetail ? new Reference<string>(data.statusDetail) : undefined;\n this.createdAt = isString(data?.createdAt) ? parseISO(data.createdAt as unknown as string) : (data?.createdAt ?? new Date());\n }\n}\n","/* eslint-disable @typescript-eslint/no-unnecessary-condition,@typescript-eslint/no-unsafe-argument,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/prefer-promise-reject-errors,@typescript-eslint/use-unknown-in-catch-callback-variable,vue/max-len */\n\nimport { ICartItemConfiguratorParamsBase } from '@sc/cart/interfaces/i-cart-item-configurator-params-base';\nimport { IOrderItemBase } from '@sc/cart/interfaces/i-order-item-base';\nimport { useBaseConfigStateStore } from '@sc/config/states/config-state-store';\nimport { Order } from '@sc/orders/classes/order';\nimport { OrderInfo } from '@sc/orders/classes/order-info';\nimport { OrderStatusHistoryInfo } from '@sc/orders/classes/order-status-history-info';\nimport { IClientOrderCreateData } from '@sc/orders/interfaces/i-client-order-create-data';\nimport { IClientOrderStatistics } from '@sc/orders/interfaces/i-client-order-statistics';\nimport { IDeliveryCostInfo } from '@sc/orders/interfaces/i-delivery-cost-info';\nimport { IOrder } from '@sc/orders/interfaces/i-order';\nimport { IOrderEditorData } from '@sc/orders/interfaces/i-order-editor-data';\nimport { IOrderInfo } from '@sc/orders/interfaces/i-order-info';\nimport { IOrderPrintOptions } from '@sc/orders/interfaces/i-order-print-options';\nimport { IOrderPrintSendData } from '@sc/orders/interfaces/i-order-print-send-data';\nimport { IOrderStatusHistoryInfo } from '@sc/orders/interfaces/i-order-status-history-info';\nimport { IPaginatedResponse } from '@sc/pagination/interfaces/i-paginated-response';\nimport { BasePaginationProvider } from '@sc/pagination/providers/base-pagination-provider';\nimport { OrderStatusEnum } from '@sc/references/enums/order-status-enum';\nimport { IDatePeriod } from '@sc/system/interfaces/i-date-period';\nimport { TypedInstanceFactory } from '@sc/system/providers/typed-instance-factory';\nimport { FilterGroup } from '@sc/table-data/classes/filter-group';\nimport { IFilterGroup } from '@sc/table-data/interfaces/i-filter-group';\nimport { IPaginationRequestParams } from '@sc/table-data/interfaces/i-pagination-request-params';\nimport { ISortRequestParams } from '@sc/table-data/interfaces/i-sort-request-params';\nimport { IFieldValidationResultData } from '@sc/validation/interfaces/i-field-validation-result-data';\nimport { format } from 'date-fns';\n\n/**\n * Предоставляет механизмы получения/управления данными о заказах.\n */\nexport class OrdersDataProvider extends BasePaginationProvider {\n /**\n * Возвращает данные о заказах, удовлетворяющих указанным параметрам поиска.\n *\n * @param filters Параметры фильтрации данных.\n * @param sortParams Параметры сортировки.\n * @param paginationParams Параметры пагинации.\n * @param signal Сигнал отмены запроса.\n *\n * @see /doc/api/internal#/Заказы/api_internal_orders_get_list\n */\n public getOrders(\n filters?: IFilterGroup,\n sortParams?: ISortRequestParams[],\n paginationParams?: IPaginationRequestParams,\n signal: AbortSignal | undefined = undefined\n ): Promise<IPaginatedResponse<IOrderInfo>> {\n return this.getTypedPaginated(OrderInfo, '/internal/orders', filters, sortParams, paginationParams, {}, undefined, signal);\n }\n\n /**\n * Возвращает количество заказов, соответствующих указанным фильтрам.\n *\n * @param filters Параметры фильтрации данных.\n * @param signal Сигнал отмены запроса.\n *\n * @see /doc/api/internal#/Заказы/api_internal_client_get_filtered_count\n */\n public getOrdersCount(filters?: IFilterGroup, signal: AbortSignal | undefined = undefined): Promise<number> {\n return this.get<{ count: number }>(\n '/internal/orders/count',\n filters ? { filters: JSON.stringify((filters instanceof FilterGroup ? filters : new FilterGroup(filters)).toPrimitive()) } : {},\n undefined,\n undefined,\n signal\n ).then((result) => result.count);\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 * @see /doc/api/internal#/Заказы/api_internal_orders_get\n */\n public getOrder(orderId: number): Promise<IOrder> {\n return this.get<IOrder>(`/internal/orders/${orderId}`, {}, (response) => new Order(response.data));\n }\n\n /**\n * Создаёт заказы клиента из содержимого корзины текущего пользователя.\n *\n * Позиции корзины распределяются по заказам на стороне сервера, поэтому может быть создано несколько заказов.\n *\n * @param clientId Идентификатор клиента.\n * @param data Данные для создания заказа.\n * @param cartItemIds Идентификаторы позиций корзины (`IOrderItem.id`),\n * которые необходимо включить в заказ (частичный заказ).\n * Если не указаны или список пуст, заказ создаётся из всех\n * товаров корзины.\n * @param validationFieldResultData Список полей, для которых необходимо\n * установить данные об ошибках валидации\n * в случае ошибок в запросах.\n * @see /doc/api/internal#/operations/api_internal_client_orders_create\n */\n public createClientOrder(\n clientId: number,\n data: IClientOrderCreateData,\n cartItemIds?: string[],\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<IOrder[]> {\n const apiDateFormat = useBaseConfigStateStore().config.dateFormats.api;\n\n return this.post<IOrder[]>(\n `/internal/clients/${clientId}/orders`,\n {\n ...data,\n deliveryDate: format(data.deliveryDate, apiDateFormat),\n items: cartItemIds?.length ? cartItemIds : undefined,\n },\n (response) => TypedInstanceFactory.instanceListInitializer(Order, response.data),\n validationFieldResultData\n );\n }\n\n /**\n * Закрепляет указанный заказ за текущим оператором и возвращает полные данные заказа.\n *\n * @param orderId Идентификатор записи заказа.\n *\n * @see /doc/api/internal#/Заказы/api_internal_orders_attach\n */\n public attachOrder(orderId: number): Promise<IOrder> {\n return this.patch<IOrder>(`/internal/orders/${orderId}/attach`, {}, (response) => new Order(response.data));\n }\n\n /**\n * Открепляет указанный заказ от оператора и возвращает полные данные заказа.\n *\n * @param orderId Идентификатор записи заказа.\n *\n * @see /doc/api/internal#/Заказы/api_internal_orders_detach\n */\n public detachOrder(orderId: number): Promise<IOrder> {\n return this.patch<IOrder>(`/internal/orders/${orderId}/detach`, {}, (response) => new Order(response.data));\n }\n\n /**\n * Объединяет указанные заказы в базовый заказ и возвращает обновлённые данные базового заказа.\n *\n * @param orderId Идентификатор базового заказа, в который переносятся товары.\n * @param ids Идентификаторы заказов, товары которых необходимо перенести в базовый заказ.\n *\n * @see /doc/api/internal#/Заказы/api_internal_orders_merge\n */\n public mergeOrders(orderId: number, ids: number[]): Promise<IOrder> {\n return this.patch<IOrder>(`/internal/orders/${orderId}/merge`, { ids }, (response) => new Order(response.data));\n }\n\n /**\n * Пересчитывает стоимость корзины указанного заказа и возвращает обновлённые данные заказа.\n *\n * @param orderId Идентификатор заказа.\n *\n * @see /doc/api/internal#/Заказы/api_internal_orders_recalculate\n */\n public recalculateOrder(orderId: number): Promise<IOrder> {\n return this.patch<IOrder>(`/internal/orders/${orderId}/recalculate`, {}, (response) => new Order(response.data));\n }\n\n /**\n * Копирует товары указанного заказа в текущую корзину пользователя.\n *\n * @param orderId Идентификатор заказа-источника.\n *\n * @see /doc/api/internal#/Заказы/api_internal_orders_clone\n */\n public cloneOrder(orderId: number): Promise<void> {\n return this.get(`/internal/orders/${orderId}/clone`, {});\n }\n\n /**\n * Обновляет данные заказа без изменения состава товаров и возвращает обновлённые данные заказа.\n *\n * @param orderId Идентификатор заказа.\n * @param data Данные для обновления заказа.\n * @param validationFieldResultData Список полей, для которых необходимо\n * установить данные об ошибках валидации\n * в случае ошибок в запросах.\n *\n * @see /doc/api/internal#/Заказы/api_internal_orders_update\n */\n public updateOrder(orderId: number, data: Partial<IOrderEditorData>, validationFieldResultData: Record<string, IFieldValidationResultData> = {}): Promise<IOrder> {\n const apiDateFormat = useBaseConfigStateStore().config.dateFormats.api;\n\n return this.patch<IOrder>(\n `/internal/orders/${orderId}`,\n {\n ...data,\n deliveryDate: data.deliveryDate ? format(data.deliveryDate, apiDateFormat) : undefined,\n },\n (response) => new Order(response.data),\n validationFieldResultData\n );\n }\n\n /**\n * Добавляет продукт в заказ и возвращает обновлённые данные заказа.\n *\n * @param orderId Идентификатор заказа, в который необходимо добавить продукт.\n * @param cartItem Данные о товаре, который необходимо добавить в заказ.\n * @param validationFieldResultData Список полей, для которых необходимо\n * установить данные об ошибках валидации\n * в случае ошибок в запросах.\n *\n * @see /doc/api/internal#/Заказы/api_internal_orders_product_add\n */\n public addOrderProduct<T extends ICartItemConfiguratorParamsBase | undefined = undefined>(\n orderId: number,\n cartItem: IOrderItemBase<T>,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<IOrder> {\n return this.post<IOrder>(\n `/internal/orders/${orderId}/products`,\n {\n product_id: cartItem.product.id,\n product_category_id: cartItem.configurator ? cartItem.category.id : undefined,\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 is_additional_sale: cartItem.isAdditionalSale,\n ...cartItem.configuratorParams,\n },\n (response) => new Order(response.data),\n validationFieldResultData\n );\n }\n\n /**\n * Изменяет статус заказа и возвращает обновлённые данные заказа.\n *\n * @param orderId Идентификатор заказа.\n * @param status Slug нового статуса заказа.\n * @param statusDetail Slug детализирующего статуса заказа.\n * @param validationFieldResultData Список полей, для которых необходимо\n * установить данные об ошибках валидации\n * в случае ошибок в запросах.\n *\n * @see /doc/api/internal#/Заказы/api_internal_orders_status_change\n */\n public changeOrderStatus(\n orderId: number,\n status: OrderStatusEnum,\n statusDetail?: string | null,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<IOrder> {\n return this.patch<IOrder>(\n `/internal/orders/${orderId}/status`,\n {\n status,\n statusDetail,\n },\n (response) => new Order(response.data),\n validationFieldResultData\n );\n }\n\n /**\n * Изменяет только детализирующий статус (подстатус) заказа без смены основного\n * статуса и возвращает обновлённые данные заказа.\n *\n * @param orderId Идентификатор заказа.\n * @param statusDetail Slug детализирующего статуса заказа.\n *\n * @see /doc/api/internal#/Заказы/api_internal_orders_status_change\n */\n public changeOrderStatusDetail(orderId: number, statusDetail: string): Promise<IOrder> {\n return this.patch<IOrder>(`/internal/orders/${orderId}/status`, { statusDetail }, (response) => new Order(response.data));\n }\n\n /**\n * Возвращает историю изменения статусов заказа.\n *\n * @param orderId Идентификатор заказа.\n *\n * @see /doc/api/internal#/Заказы/api_internal_orders_status_history_get\n */\n public getOrderStatusHistory(orderId: number): Promise<IOrderStatusHistoryInfo[]> {\n return this.getTypedList(OrderStatusHistoryInfo, `/internal/orders/${orderId}/history`);\n }\n\n /**\n * Возвращает содержимое печатной формы заказа в формате HTML.\n *\n * @param orderId Идентификатор заказа.\n * @param options Параметры состава печатной формы.\n *\n * @see /doc/api/internal#/Заказы/api_internal_order_print_view_html\n */\n public getOrderPrintHtml(orderId: number, options?: IOrderPrintOptions): Promise<Blob> {\n return this.get<Blob>(`/internal/orders/${orderId}/print/view`, { ...options }, (response) => new Blob([response.data], { type: 'text/html' }));\n }\n\n /**\n * Возвращает файл печатной формы заказа в формате PDF.\n *\n * @param orderId Идентификатор заказа.\n * @param options Параметры состава печатной формы.\n *\n * @see /doc/api/internal#/Заказы/api_internal_order_print_download\n */\n public getOrderPrintPdf(orderId: number, options?: IOrderPrintOptions): Promise<Blob> {\n return this.getBlob<Blob>(`/internal/orders/${orderId}/print/download`, { ...options }, (response) => new Blob([response.request.response], { type: 'application/pdf' }));\n }\n\n /**\n * Отправляет печатную форму заказа в формате PDF на указанный адрес электронной почты.\n *\n * @param orderId Идентификатор заказа.\n * @param data Данные для отправки (e-mail, дополнительные файлы, параметры состава печатной формы).\n *\n * @see /doc/api/internal#/Заказы/api_internal_order_print_send\n */\n public sendOrderPrint(orderId: number, data: IOrderPrintSendData): Promise<void> {\n return this.post(`/internal/orders/${orderId}/print/send`, data);\n }\n\n /**\n * Заменяет закреплённого за заказом оператора и возвращает обновлённые данные заказа.\n *\n * @param orderId Идентификатор заказа.\n * @param operatorId Идентификатор нового оператора.\n *\n * @see /doc/api/internal#/Заказы/api_internal_orders_change_attached_operator\n */\n public changeAttachedOperator(orderId: number, operatorId: number): Promise<IOrder> {\n return this.patch<IOrder>(`/internal/orders/${orderId}/change-attached-operator`, { operatorId }, (response) => new Order(response.data));\n }\n\n /**\n * Удаляет файл, прикреплённый к заказу клиентом, и возвращает обновлённые данные заказа.\n *\n * @param orderId Идентификатор заказа.\n *\n * @see /doc/api/internal#/Заказы/api_internal_orders_attached_file_delete\n */\n public deleteOrderAttachedFile(orderId: number): Promise<IOrder> {\n return this.delete<IOrder>(`/internal/orders/${orderId}/file/attached`, (response) => new Order(response.data));\n }\n\n /**\n * Удаляет продукт из заказа и возвращает обновлённые данные заказа.\n *\n * @param orderId Идентификатор заказа.\n * @param orderProductId Идентификатор записи продукта заказа.\n *\n * @see /doc/api/internal#/operations/api_internal_orders_product_delete\n */\n public deleteOrderProduct(orderId: number, orderProductId: number): Promise<IOrder> {\n return this.delete<IOrder>(`/internal/orders/${orderId}/products/${orderProductId}`, (response) => new Order(response.data));\n }\n\n /**\n * Изменяет продукт заказа и возвращает обновлённые данные заказа.\n *\n * @param orderId Идентификатор заказа.\n * @param orderProductId Идентификатор записи продукта заказа.\n * @param orderProduct Данные о товаре, параметры которого необходимо изменить в заказе.\n * @param validationFieldResultData Список полей, для которых необходимо\n * установить данные об ошибках валидации\n * в случае ошибок в запросах.\n *\n * @see /doc/api/internal#/Заказы/api_internal_orders_product_update\n */\n public patchOrderProduct<T extends ICartItemConfiguratorParamsBase | undefined = undefined>(\n orderId: number,\n orderProductId: number,\n orderProduct: IOrderItemBase<T>,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<IOrder> {\n return this.patch<IOrder>(\n `/internal/orders/${orderId}/products/${orderProductId}`,\n {\n product_id: orderProduct.product.id,\n product_category_id: orderProduct.configurator ? orderProduct.category.id : undefined,\n quantity: orderProduct.quantity,\n height: orderProduct.height,\n length: orderProduct.length,\n width: orderProduct.width,\n configurator: orderProduct.configurator,\n marker: orderProduct.marker,\n is_additional_sale: orderProduct.isAdditionalSale,\n ...orderProduct.configuratorParams,\n },\n (response) => new Order(response.data),\n validationFieldResultData\n );\n }\n\n /**\n * Возвращает список дат, в которые возможна доставка по указанному адресу.\n *\n * @param addressId Идентификатор адреса доставки клиента.\n * @param signal Сигнал отмены запроса.\n *\n * @see /doc/api/internal#/operations/api_internal_orders_delivery_get_nearest_dates\n */\n public getDeliveryNearestDates(addressId: number, signal: AbortSignal | undefined = undefined): Promise<string[]> {\n return this.get<string[]>(`/internal/orders/delivery/${addressId}/nearest-dates`, {}, (response) => response.data, undefined, signal);\n }\n\n /**\n * Возвращает список доступных дат самовывоза для указанного склада.\n *\n * @param warehouseId Идентификатор склада.\n * @param signal Сигнал отмены запроса.\n */\n public getSelfDeliveryNearestDates(warehouseId: number, signal: AbortSignal | undefined = undefined): Promise<string[]> {\n return this.get<string[]>(`/internal/orders/self-delivery/${warehouseId}/nearest-dates`, {}, (response) => response.data, undefined, signal);\n }\n\n /**\n * Возвращает информацию о стоимости доставки по указанному адресу.\n *\n * @param addressId Идентификатор адреса доставки клиента.\n * @param date Дата доставки.\n * @param warehouseId Идентификатор склада.\n * @param signal Сигнал отмены запроса.\n *\n * @see /doc/api/internal#/operations/api_internal_orders_delivery_get_cost\n */\n public getDeliveryCost(addressId: number, date: Date, warehouseId: number, signal: AbortSignal | undefined = undefined): Promise<IDeliveryCostInfo> {\n const apiDateFormat = useBaseConfigStateStore().config.dateFormats.api;\n\n return this.get<IDeliveryCostInfo>(\n `/internal/orders/delivery/${addressId}/cost`,\n {\n date: format(date, apiDateFormat),\n warehouse_id: warehouseId,\n },\n (response) => response.data,\n undefined,\n signal\n );\n }\n}\n","import { IOrderInfo } from '@sc/orders/interfaces/i-order-info';\nimport type { InjectionKey, MaybeRefOrGetter } from 'vue';\n\n/**\n * Ключ для инъекции данных текущего заказа.\n */\nexport const currentOrderInjectionKey: InjectionKey<MaybeRefOrGetter<IOrderInfo | null>> = Symbol('currentOrder');\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';\nimport { TypedInstanceFactory } from '@sc/system/providers/typed-instance-factory';\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) => TypedInstanceFactory.instanceListInitializer(PriceAnalyze, response.data)\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) => TypedInstanceFactory.instanceListInitializer(PriceAnalyze, response.data)\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) => TypedInstanceFactory.instanceListInitializer(PriceAnalyze, response.data)\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 { useBaseConfigStateStore } from '@sc/config/states/config-state-store';\nimport { HttpRequester } from '@sc/http/classes/http-requester';\nimport { ProductPriceHistory } from '@sc/price-history/classes/product-price-history';\nimport { IPriceHistoryItem } from '@sc/price-history/interfaces/i-price-history-item';\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, merge, omitBy } from 'lodash-es';\n\n/**\n * Предоставляет механизмы для получения истории изменения цен.\n */\nexport class PriceHistoryDataProvider extends HttpRequester {\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 = useBaseConfigStateStore().config.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 const productId = filters.product?.[0] ?? 0;\n delete updatedFilters.product;\n\n return this.get<IPriceHistoryItem[]>(`/internal/price/products/${productId}/history`, updatedFilters).then((responseData) => [\n new ProductPriceHistory(merge(responseData[0], { history: responseData }) as unknown as IProductPriceHistory),\n ]);\n }\n}\n","import { IRecommendationsList } from '@sc/recommendations/interfaces/i-recommendations-list';\nimport { CodedIdentity } from '@sc/system/classes/coded-identity';\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 { 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 * Возвращает данные о рекомендациях указанной категории продуктов.\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/catalog/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/catalog/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/catalog/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/catalog/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 no-shadow */\n\n/**\n * Перечисление допустимых статусов заказа.\n */\nexport enum OrderStatusEnum {\n /**\n * Новый.\n */\n New = 'new',\n\n /**\n * Принят в работу.\n */\n Processing = 'processing',\n\n /**\n * Ожидает поставки товара.\n */\n AwaitingSupplyProducts = 'awaiting_supply_products',\n\n /**\n * Выставлен счет.\n */\n InvoiceIssued = 'invoice_issued',\n\n /**\n * Сборка заказа.\n */\n ProcessingOnStock = 'processing_on_stock',\n\n /**\n * Завершен.\n */\n Finished = 'finished',\n\n /**\n * Заказ обновлён.\n */\n OrderUpdated = 'order_updated',\n\n /**\n * Отменён.\n */\n Canceled = 'canceled',\n\n /**\n * Ошибка.\n */\n Error = 'error',\n}\n","/* eslint-disable no-shadow */\n\n/**\n * Перечисление допустимых детализирующих статусов (подстатусов) заказа.\n */\nexport enum OrderStatusDetailEnum {\n /**\n * Отменён 1С.\n */\n CanceledBy1c = 'canceled_by1c',\n\n /**\n * Отменён клиентом.\n */\n CanceledByClient = 'canceled_by_client',\n\n /**\n * Завершён, не подтверждён.\n */\n FinishedNotApproved = 'finished_not_approved',\n\n /**\n * В обработке отделом закупок.\n */\n ProcessingByPurchasingDepartment = 'processing_by_purchasing_department',\n\n /**\n * Клиент будет ждать поставки товара.\n */\n WillWaiting = 'will_waiting',\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 { 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 { ICityWithUserRegion } from '@sc/references/interfaces/i-city-with-user-region';\nimport { Reference } from '@sc/system/classes/reference';\nimport { UserRegionShortInfo } from '@sc/user-regions/classes/user-region-short-info';\nimport { IUserRegionShortInfo } from '@sc/user-regions/interfaces/i-user-region-short-info';\n\n/**\n * Данные о городе, включая информацию о регионах пользователей, к которым он привязан.\n */\nexport class CityWithUserRegion extends Reference implements ICityWithUserRegion {\n /**\n * @inheritDoc\n */\n public userRegions: IUserRegionShortInfo[];\n\n /**\n * Инициализирует экземпляр класса {@link CityWithUserRegion}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: ICityWithUserRegion) {\n super(data);\n\n this.userRegions = data?.userRegions?.map((userRegion) => new UserRegionShortInfo(userRegion)) ?? [];\n }\n}\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","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 { OrderStatusDetailEnum } from '@sc/references/enums/order-status-detail-enum';\nimport { IOrderStatusDetail } from '@sc/references/interfaces/i-order-status-detail';\nimport { Reference } from '@sc/system/classes/reference';\n\n/**\n * Данные о детализирующем статусе (подстатусе) заказа.\n */\nexport class OrderStatusDetail extends Reference<OrderStatusDetailEnum> implements IOrderStatusDetail {}\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 { Reference } from '@sc/system/classes/reference';\nimport { IReference } from '@sc/system/interfaces/i-reference';\n\n/**\n * Описывает механизмы генерации данных о записи справочника.\n */\nexport class ReferenceDataFactory {\n /**\n * Генерирует и возвращает данные-заглушку неопределённой записи справочника.\n *\n * @param Ctor Конструктор конкретного класса справочника.\n * @param name Название записи.\n */\n public static generateUndefinedInstance<T extends Reference>(Ctor: new (data?: Partial<IReference>) => T, name: string = '- Не определён -'): T {\n return new Ctor({ id: 0, name, slug: '-undefined-' });\n }\n\n /**\n * Выполняет проверку, является ли указанная запись записью-заглушкой с данными о неопределённой записи справочника.\n *\n * @param reference Запись для проверки.\n */\n public static isUndefinedInstance(reference: IReference): boolean {\n return reference.id === 0 && reference.slug === '-undefined-';\n }\n}\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","/* 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 { City } from '@sc/references/classes/city';\nimport { CityWithRegionAndCountry } from '@sc/references/classes/city-with-region-and-country';\nimport { CityWithUserRegion } from '@sc/references/classes/city-with-user-region';\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 { Operator } from '@sc/references/classes/operator';\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 { OrderStatusDetail } from '@sc/references/classes/order-status-detail';\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 { ICity } from '@sc/references/interfaces/i-city';\nimport { ICityWithRegionAndCountry } from '@sc/references/interfaces/i-city-with-region-and-country';\nimport { ICityWithUserRegion } from '@sc/references/interfaces/i-city-with-user-region';\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 { IOperator } from '@sc/references/interfaces/i-operator';\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 { IOrderStatusDetail } from '@sc/references/interfaces/i-order-status-detail';\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 * Идентификатор служебных записей справочников регионов и городов,\n * обозначающих неизвестное местоположение.\n */\n private static readonly unknownLocationId = 1;\n\n /**\n * Исключает из списка записей справочника местоположений служебную запись\n * неизвестного региона или города.\n *\n * @param locations Записи справочника местоположений.\n */\n private static withoutUnknownLocation<T extends IReference>(locations: T[]): T[] {\n // eslint-disable-next-line lodash/prefer-lodash-method\n return locations.filter((location) => location.id !== ReferenceDataProvider.unknownLocationId);\n }\n\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 getOperators(): Promise<IOperator[]> {\n return this.getTypedDataArrayRequester(Operator, '/internal/references/operator', 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, '/internal/references/order-status', true);\n }\n\n /**\n * Возвращает {@link Promise} для получения справочника детализирующих статусов (подстатусов) заказов.\n */\n public getOrderStatusDetails(): Promise<IOrderStatusDetail[]> {\n return this.getTypedDataArrayRequester(OrderStatusDetail, '/internal/references/order-status-detail', 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 * Возвращает {@link Promise} для получения справочника регионов указанной страны.\n *\n * Служебная запись справочника, обозначающая неизвестный регион, из результата исключается.\n *\n * @param countryId Идентификатор страны.\n */\n public getRegionsByCountry(countryId: number): Promise<IRegion[]> {\n return this.getTypedDataArrayRequester(Region, '/internal/references/region', false, { params: { countryId } }).then((regions) =>\n ReferenceDataProvider.withoutUnknownLocation(regions)\n );\n }\n\n /**\n * Возвращает {@link Promise} для получения справочника городов указанного региона.\n *\n * Служебная запись справочника, обозначающая неизвестный город, из результата исключается.\n *\n * @param regionId Идентификатор региона.\n */\n public getCitiesByRegion(regionId: number): Promise<ICity[]> {\n return this.getTypedDataArrayRequester(City, '/internal/references/city', false, { params: { regionId } }).then((cities) =>\n ReferenceDataProvider.withoutUnknownLocation(cities)\n );\n }\n\n /**\n * Возвращает {@link Promise} для получения городов указанного региона,\n * которые уже привязаны к регионам пользователей.\n *\n * @param regionId Идентификатор региона.\n */\n public getCitiesWithUserRegionByRegion(regionId: number): Promise<ICityWithUserRegion[]> {\n return this.getTypedDataArrayRequester(CityWithUserRegion, '/internal/references/city-with-user-region', false, { params: { regionId } }).then((cities) =>\n ReferenceDataProvider.withoutUnknownLocation(cities)\n );\n }\n\n /**\n * Выполняет поиск данных о городах по терму в названии с данными о регионе,\n * в котором расположен город.\n *\n * @param term Терм поиска.\n * @param countryId Идентификатор страны, городами которой необходимо ограничить поиск.\n * @param signal Сигнал отмены запроса.\n */\n public searchCityWithRegion(term: string, countryId?: number, signal: AbortSignal | undefined = undefined): Promise<ICityWithRegionAndCountry[]> {\n return this.getTypedDataArrayRequester(\n CityWithRegionAndCountry,\n '/internal/references/city-with-region/search',\n false,\n { term, ...(countryId ? { params: { countryId } } : {}) },\n signal\n ).then((cities) => ReferenceDataProvider.withoutUnknownLocation(cities));\n }\n\n /**\n * Выполняет поиск данных о городах по терму в названии с данными\n * о регионах пользователей, к которым привязан город.\n *\n * @param term Терм поиска.\n * @param signal Сигнал отмены запроса.\n */\n public searchCityWithUserRegion(term: string, signal: AbortSignal | undefined = undefined): Promise<ICityWithUserRegion[]> {\n return this.getTypedDataArrayRequester(CityWithUserRegion, '/internal/references/city-with-user-region/search', false, { term }, signal).then((cities) =>\n ReferenceDataProvider.withoutUnknownLocation(cities)\n );\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 { IOperator } from '@sc/references/interfaces/i-operator';\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 { IOrderStatusDetail } from '@sc/references/interfaces/i-order-status-detail';\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('common.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 operatorReference = ref<IOperator[] | 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 orderStatusDetailReference = ref<IOrderStatusDetail[] | 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 operatorReference,\n\n /**\n * Справочник статусов оплаты заказа.\n */\n orderPaymentStatusReference,\n\n /**\n * Справочник статусов заказов.\n */\n orderStatusReference,\n\n /**\n * Справочник детализирующих статусов (подстатусов) заказов.\n */\n orderStatusDetailReference,\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('common.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 operatorReference = computed((): IOperator[] | undefined => {\n const referencesStore = useReferencesPrivateStore();\n\n if (!referencesStore.operatorReference && !referencesStore.dataLoaderList.operatorReference) {\n referencesStore.dataLoaderList.operatorReference = true;\n\n HttpRequester.getInstance(ReferenceDataProvider)\n .getOperators()\n .then((data) => {\n referencesStore.operatorReference = data;\n })\n .catch(noop);\n }\n\n return referencesStore.operatorReference;\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 orderStatusDetailReference = computed((): IOrderStatusDetail[] | undefined => {\n const referencesStore = useReferencesPrivateStore();\n\n if (!referencesStore.orderStatusDetailReference && !referencesStore.dataLoaderList.orderStatusDetailReference) {\n referencesStore.dataLoaderList.orderStatusDetailReference = true;\n\n HttpRequester.getInstance(ReferenceDataProvider)\n .getOrderStatusDetails()\n .then((data) => {\n referencesStore.orderStatusDetailReference = data;\n })\n .catch(noop);\n }\n\n return referencesStore.orderStatusDetailReference;\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 operatorReference,\n\n /**\n * Справочник статусов оплаты заказа.\n */\n orderPaymentStatusReference,\n\n /**\n * Справочник статусов заказов.\n */\n orderStatusReference,\n\n /**\n * Справочник детализирующих статусов (подстатусов) заказов.\n */\n orderStatusDetailReference,\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 * Список тегов.\n */\n public tags?: Array<{\n /**\n * Текст тега.\n */\n label: string;\n\n /**\n * Ссылка, на которую должен вести тег.\n */\n url?: string;\n }>;\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 this.tags = data?.tags;\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/interfaces/i-field-validation-result-data';\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/classes/http-requester';\nimport { IAddressSuggestion } from '@sc/suggestion/interfaces/i-address-suggestion';\nimport { IBankSuggestion } from '@sc/suggestion/interfaces/i-bank-suggestion';\nimport { IOrganizationSuggestion } from '@sc/suggestion/interfaces/i-organization-suggestion';\nimport { IIdentity } from '@sc/system/interfaces/i-identity';\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 * Внешний SEO-специалист.\n */\n ExternalSeo = 'external_seo',\n\n /**\n * Гость.\n */\n Guest = 'guest',\n}\n","import { UserCommonInfo } from '@sc/user/classes/user-common-info';\nimport { UserPricingRole } from '@sc/user/classes/user-pricing-role';\nimport { UserTypeEnum } from '@sc/user/enums/user-type-enum';\nimport { IUser } from '@sc/user/interfaces/i-user';\nimport { IUserPricingRole } from '@sc/user/interfaces/i-user-pricing-role';\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 * Роль ценообразования текущего пользователя.\n */\n public pricingRole?: IUserPricingRole;\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 this.pricingRole = data?.pricingRole ? new UserPricingRole(data.pricingRole) : undefined;\n }\n}\n","import { useBaseConfigStateStore } from '@sc/config/states/config-state-store';\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 = `${useBaseConfigStateStore().config.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), true);\n }\n}\n","import { 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 { UserTypeEnum } from '@sc/user/enums/user-type-enum';\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('common.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 /**\n * Данные о текущем менеджере (если текущий пользователь является менеджером).\n */\n const currentManager = ref<IManager | undefined>(undefined);\n\n return {\n /**\n * Список загружаемых/загруженных на данный момент значений.\n */\n dataLoaderList,\n\n /**\n * Данные о текущем пользователе.\n */\n currentUser,\n\n /**\n * Данные о текущем менеджере (если текущий пользователь является менеджером).\n */\n currentManager,\n };\n});\n\n/**\n * Инициирует загрузку данных о текущем менеджере, если текущий пользователь является менеджером\n * и загрузка ещё не была инициирована ранее.\n *\n * @param user Данные о текущем пользователе.\n */\nfunction loadCurrentManagerIfNeeded(user: IUser | undefined): void {\n const privateStore = useUserStatePrivateStore();\n\n if (user?.type !== UserTypeEnum.Manager || privateStore.currentManager || privateStore.dataLoaderList.currentManager) {\n return;\n }\n\n privateStore.dataLoaderList.currentManager = true;\n\n HttpRequester.getInstance(ManagerDataProvider)\n .getManager(user.id)\n .then((manager) => {\n privateStore.currentManager = manager;\n })\n .catch(noop)\n .finally(() => {\n privateStore.dataLoaderList.currentManager = false;\n });\n}\n\n/**\n * Хранилище данных состояния пользователя.\n */\nexport const useUserStateStore = defineStore('common.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 loadCurrentManagerIfNeeded(u);\n })\n .catch(noop)\n .finally(() => {\n privateStore.dataLoaderList.currentUser = false;\n });\n }\n\n return privateStore.currentUser;\n });\n\n /**\n * Данные о текущем менеджере (если текущий пользователь является менеджером).\n */\n const currentManager = computed((): IManager | undefined => {\n loadCurrentManagerIfNeeded(currentUser.value);\n\n return useUserStatePrivateStore().currentManager;\n });\n\n return {\n /**\n * Данные о текущем пользователе.\n */\n currentUser,\n\n /**\n * Данные о текущем менеджере (если текущий пользователь является менеджером).\n */\n currentManager,\n };\n});\n","import { SalesDirection } from '@sc/references/classes/sales-direction';\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 { IUserRegionEmployee } from '@sc/user-regions/interfaces/i-user-region-employee';\n\n/**\n * Данные о закреплении сотрудника за регионом пользователей по направлению продаж.\n */\nexport class UserRegionEmployee implements IUserRegionEmployee {\n /**\n * @inheritDoc\n */\n public user: IUserShortInfo;\n\n /**\n * @inheritDoc\n */\n public salesDirection: ISalesDirection;\n\n /**\n * Инициализирует экземпляр класса {@link UserRegionEmployee}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IUserRegionEmployee>) {\n this.user = new UserShortInfo(data?.user);\n this.salesDirection = new SalesDirection(data?.salesDirection);\n }\n}\n","import { CityWithRegionAndCountry } from '@sc/references/classes/city-with-region-and-country';\nimport { ICityWithRegionAndCountry } from '@sc/references/interfaces/i-city-with-region-and-country';\nimport { UserRegionEmployee } from '@sc/user-regions/classes/user-region-employee';\nimport { UserRegionShortInfo } from '@sc/user-regions/classes/user-region-short-info';\nimport { IUserRegion } from '@sc/user-regions/interfaces/i-user-region';\nimport { IUserRegionEmployee } from '@sc/user-regions/interfaces/i-user-region-employee';\n\n/**\n * Полные данные о регионе пользователя.\n */\nexport class UserRegion extends UserRegionShortInfo implements IUserRegion {\n /**\n * @inheritDoc\n */\n public cities: ICityWithRegionAndCountry[];\n\n /**\n * @inheritDoc\n */\n public users: IUserRegionEmployee[];\n\n /**\n * Инициализирует экземпляр класса {@link UserRegion}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IUserRegion>) {\n super(data);\n\n this.cities = data?.cities?.map((city) => new CityWithRegionAndCountry(city)) ?? [];\n this.users = data?.users?.map((user) => new UserRegionEmployee(user)) ?? [];\n }\n}\n","import { PaginationFiltersBase } from '@sc/pagination/filters/pagination-filters-base';\nimport { IUserRegionsListFilters } from '@sc/user-regions/interfaces/i-user-regions-list-filters';\n\n/**\n * Данные о параметрах фильтрации списка регионов пользователей.\n */\nexport class UserRegionsListFilters extends PaginationFiltersBase implements IUserRegionsListFilters {\n /**\n * @inheritDoc\n */\n public id?: string;\n\n /**\n * @inheritDoc\n */\n public name?: string;\n\n /**\n * @inheritDoc\n */\n public abbr?: string;\n\n /**\n * Инициализирует экземпляр класса {@link UserRegionsListFilters}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IUserRegionsListFilters) {\n super();\n\n this.id = data?.id;\n this.name = data?.name;\n this.abbr = data?.abbr;\n }\n\n /**\n * @inheritDoc\n */\n public resetFilterValue(key: string): this {\n switch (key) {\n case 'id':\n case 'name':\n case 'abbr':\n // eslint-disable-next-line security/detect-object-injection\n this[key] = undefined;\n break;\n default:\n break;\n }\n\n return this;\n }\n}\n","import { IPaginatedResponse } from '@sc/pagination/interfaces/i-paginated-response';\nimport { BasePaginationProvider } from '@sc/pagination/providers/base-pagination-provider';\nimport { IFilterGroup } from '@sc/table-data/interfaces/i-filter-group';\nimport { IPaginationRequestParams } from '@sc/table-data/interfaces/i-pagination-request-params';\nimport { ISortRequestParams } from '@sc/table-data/interfaces/i-sort-request-params';\nimport { UserRegion } from '@sc/user-regions/classes/user-region';\nimport { UserRegionEmployee } from '@sc/user-regions/classes/user-region-employee';\nimport { UserRegionShortInfo } from '@sc/user-regions/classes/user-region-short-info';\nimport { IUserRegion } from '@sc/user-regions/interfaces/i-user-region';\nimport { IUserRegionEmployee } from '@sc/user-regions/interfaces/i-user-region-employee';\nimport { IUserRegionSaveData } from '@sc/user-regions/interfaces/i-user-region-save-data';\nimport { IUserRegionShortInfo } from '@sc/user-regions/interfaces/i-user-region-short-info';\nimport { IFieldValidationResultData } from '@sc/validation/interfaces/i-field-validation-result-data';\n\n/**\n * Предоставляет механизмы получения/управления регионами пользователей.\n */\nexport class UserRegionProvider extends BasePaginationProvider {\n /**\n * Возвращает список регионов пользователей.\n *\n * @param filters Параметры фильтрации данных.\n * @param sortParams Параметры сортировки.\n * @param paginationParams Параметры пагинации.\n *\n * @see /doc/api/internal#/operations/api_internal_user_region_get_list\n */\n public getRegionsList(\n filters?: IFilterGroup,\n sortParams?: ISortRequestParams[] | ISortRequestParams,\n paginationParams?: IPaginationRequestParams\n ): Promise<IPaginatedResponse<IUserRegionShortInfo>> {\n return this.getTypedPaginated(UserRegionShortInfo, '/internal/users/regions', filters, sortParams, paginationParams);\n }\n\n /**\n * Возвращает полные данные о регионе пользователей.\n *\n * @param regionId Идентификатор региона.\n *\n * @see /doc/api/internal#/operations/api_internal_user_region_get\n */\n public getRegion(regionId: number): Promise<IUserRegion> {\n return this.get<IUserRegion>(`/internal/users/regions/${regionId}`, {}, (response) => new UserRegion(response.data));\n }\n\n /**\n * Создаёт новый регион пользователей.\n *\n * @param data Данные для создания региона.\n * @param validationFieldResultData Список полей, для которых необходимо\n * установить данные об ошибках валидации\n * в случае ошибок в запросах.\n *\n * @see /doc/api/internal#/operations/api_internal_user_region_create\n */\n public createRegion(data: IUserRegionSaveData, validationFieldResultData: Record<string, IFieldValidationResultData> = {}): Promise<IUserRegion> {\n return this.post<IUserRegion>('/internal/users/regions', data, (response) => new UserRegion(response.data), validationFieldResultData);\n }\n\n /**\n * Изменяет данные о регионе пользователей.\n *\n * @param regionId Идентификатор региона.\n * @param data Данные для изменения региона.\n * @param validationFieldResultData Список полей, для которых необходимо\n * установить данные об ошибках валидации\n * в случае ошибок в запросах.\n *\n * @see /doc/api/internal#/operations/api_internal_user_region_change\n */\n public updateRegion(regionId: number, data: IUserRegionSaveData, validationFieldResultData: Record<string, IFieldValidationResultData> = {}): Promise<IUserRegion> {\n return this.patch<IUserRegion>(`/internal/users/regions/${regionId}`, data, (response) => new UserRegion(response.data), validationFieldResultData);\n }\n\n /**\n * Удаляет регион пользователей.\n *\n * @param regionId Идентификатор региона.\n *\n * @see /doc/api/internal#/operations/api_internal_user_region_delete\n */\n public removeRegion(regionId: number): Promise<void> {\n return this.delete(`/internal/users/regions/${regionId}`);\n }\n\n /**\n * Возвращает список сотрудников, закреплённых за регионом.\n *\n * @param regionId Идентификатор региона.\n *\n * @see /doc/api/internal#/operations/api_internal_user_region_user_get_list\n */\n public getRegionEmployees(regionId: number): Promise<IUserRegionEmployee[]> {\n return this.getTypedList(UserRegionEmployee, `/internal/users/regions/${regionId}/users`);\n }\n\n /**\n * Закрепляет сотрудника за регионом по указанному направлению продаж.\n *\n * @param regionId Идентификатор региона.\n * @param userId Идентификатор сотрудника.\n * @param salesDirectionId Идентификатор направления продаж.\n *\n * @see /doc/api/internal#/operations/api_internal_user_region_user_add\n */\n public attachRegionEmployee(regionId: number, userId: number, salesDirectionId: number): Promise<IUserRegionEmployee> {\n return this.post<IUserRegionEmployee>(`/internal/users/regions/${regionId}/users/${userId}`, { salesDirectionId }, (response) => new UserRegionEmployee(response.data));\n }\n\n /**\n * Открепляет сотрудника от региона по указанному направлению продаж.\n *\n * @param regionId Идентификатор региона.\n * @param userId Идентификатор сотрудника.\n * @param salesDirectionId Идентификатор направления продаж.\n *\n * @see /doc/api/internal#/operations/api_internal_user_region_user_delete\n */\n public detachRegionEmployee(regionId: number, userId: number, salesDirectionId: number): Promise<void> {\n // Названия параметров запроса конвертируются в snake_case только для GET-запросов.\n return this.request<never>({\n method: 'DELETE',\n url: `/internal/users/regions/${regionId}/users/${userId}`,\n params: { sales_direction_id: salesDirectionId },\n });\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","DeviceTypeResolutionConfig","HttpParamsConfig","SentryConfig","_a","_b","_c","_d","WebSocketConfig","AppBaseConfig","useBaseConfigStateStore","defineStore","config","ref","appConfig","PreferencesStorageProvider","keyName","rawSavedData","savedData","isAfter","parseISO","startOfToday","isNil","isEmpty","availableFor","dataToSave","error","testKey","keysToRemove","i","key","rawData","getTokenExpirationDate","token","useAuthStatePrivateStore","storedToken","developmentToken","jwtTokenUpdater","userPermissions","userPermissionsComputedRefs","markRaw","recalculateUserPermissions","jwtPayload","mapValues","value","noop","useAuthStateStore","computed","privateStore","updater","setJwtTokenUpdater","setJwtToken","invalidateJwtToken","hasUserPermission","name","isArray","hasUserPermissionComputedRef","isUserPermissionExist","checkedName","path","split","groupName","permissionName","group","every","item","BlogPostMediaTypeEnum","Identity","defaultIdValue","BlogPostMediaFile","BlogPostPublicationStatusEnum","DateHelper","date","isString","isValid","format","period","CreatableIdentity","BlogPostShortInfo","publishedAt","slug","startsWith","endsWith","includes","BlogPost","mediaFile","withContent","PaginationFiltersBase","result","k","isFunction","DatePeriod","BlogPostsListFilters","TypedInstanceFactory","type","map","_HttpRequester","request","authToken","configPromise","hook","objectToSnake","toLower","originalRequest","raw","CanceledError","response","responsePromise","axios","handler","index","isObject","isError","rawResponse","successHandler","validationFieldResultData","disableNotifications","requestPromise","url","params","signal","HttpRequester","FilterOpEnum","FilterItem","apiDateFormat","isDate","isPlainObject","range","FilterGroup","filter","BasePaginationProvider","filters","sortParams","paginationParams","extraParams","disableDefaultNotificationErrorResponseHandler","requestParams","BlogProvider","isUndefined","postId","file","isCover","uploadProgressHandler","event","mediaId","NamedIdentity","UpdatableNamedIdentity","DeletableNamedIdentity","UserShortInfo","DiscountShortInfo","PriceTemplate","PriceCoefficientEnum","Reference","PriceCoefficient","coefficient","constant","ProductPriceCoefficient","GeoCoordinates","DeliveryType","Warehouse","dt","StockCount","Currency","ProductUnit","CodedIdentity","CatalogableItem","HiddenCatalogableItem","Image","mediaServer","PrimaryCatalogableItem","Product","sc","primaryCategory","category","im","pc","CostSourceEnum","ClientProduct","BaseCategory","toUpper","OrderItemBase","cloneDeep","Cart","OrderItem","CartProvider","client","cartItem","blob","CalculationTypeEnum","PropertyTypeEnum","ProductFilterTypeEnum","Category","c","ContactLinks","SalesDirection","ManagerCommon","CuratedDirection","UserPricingRole","UserRegionShortInfo","Manager","curatedDirection","region","manager","BaseClientCategory","ClientCategory","PriceCatalogableItem","PriceTemplateICatalogableItem","PriceTemplateCategory","Curator","Country","Region","CityWithRegionAndCountry","UserCommonInfo","ClientShortInfo","m","DeletableIdentity","PriceTemplateClient","PriceTemplateProduct","PropertyType","Property","PropertyValue","TemplatesListFilters","ClientPriceCatalogableItem","ClientPriceProduct","ClientPriceCategory","PricingRole","CategoryPricingRule","FilterSettings","CategoryFilterSetting","CategoryFilterValue","CategoryFilter","CatalogProvider","term","showHidden","categoryId","clientId","link","ClientPriceProvider","recursively","comment","managerId","productId","ClientPriceTemplateProvider","priceTemplateId","priceTemplateClientId","ProductCategoryDataProvider","categoryID","withNestedCategories","withPriceCoefficients","p","forEach","pcs","limit","resolve","reject","ProductDataProvider","rec","periodFrom","ClientProductCategoryDataProvider","ClientProductDataProvider","PriceTemplateProvider","productCategoryId","PricingRoleProvider","id","PropertiesProvider","propertyData","typeId","rest","propertyId","text","fileData","fileId","propertySlug","settingsData","TemplateProductCategoryDataProvider","findCatalogItemByIdRecursive","items","foundInProducts","foundInChildren","flattenCatalogItems","ClientsAdditionalDataRequestTypeEnum","OpfEnum","BankAccount","Contact","ContactPerson","Opf","PartnerGroup","ContragentBase","contactsList","ContragentPerson","ContragentIc","ContragentUlR","ContragentUlNr","ContragentFactory","DeliveryAddress","ChannelPrimaryInterest","SourcePrimaryInterest","Client","pg","da","ClientsListFilters","s","_e","_f","_g","_h","OrderShortInfo","ClientAdditionalData","contact","partnerGroup","curator","ContactRelation","ContactPersonRelated","ClientDataProvider","contragent","contragentIc","contragentUlR","contragentUlNr","deliveryAddress","bankAccount","phone","clients","dataTypes","clientIDs","password","passwordConfirm","managers","promises","curatorId","curators","contragentId","contactPerson","deliveryAddressId","extraData","isPrimary","UnknownClientDataProvider","VersionConfig","ConfiguratorsEnum","ConfiguratorProvider","newTemplate","templateId","TableDataPaginationRequestParams","TableDataPagination","TableDataSortRequestParams","CalendarHelper","from","to","shift","endOfMonth","amount","addMonths","currentPeriodStart","shiftedPeriodStart","monthOffset","differenceInCalendarMonths","startOfMonth","targetMonthStart","day","getDate","getDaysInMonth","startOfDay","endOfDay","setDate","shiftWeeks","startOfWeek","addWeeks","dayOffset","differenceInCalendarDays","addDays","currentStart","dayNumber","targetStart","targetEnd","targetLength","currentIndex","totalIndex","monthShift","decadeIndex","monthStart","daysAgoIso","days","subDays","pluralize","titles","cases","normalized","formatRelativeDate","isoDate","diffDays","DateTimeProvider","year","nextWorkingDay","addBusinessDays","now","yearStart","startOfYear","yearEnd","endOfYear","endOfToday","startOfYesterday","endOfYesterday","startOfTomorrow","endOfTomorrow","endOfWeek","weekOptions","dayStart","dayEnd","decade","quarterStart","startOfQuarter","halfYearStart","previousHalfYear","nextHalfYear","subWeeks","subMonths","subQuarters","endOfQuarter","addQuarters","subYears","addYears","STANDARD_PERIOD_GROUPS","STANDARD_PERIOD_SECTIONS","DiscountClient","DiscountConditions","some","list","DiscountHelper","percent","round","DiscountStateEnum","DiscountStateHelper","discount","Discount","product","source","DiscountClientEligibility","DiscountsListFilters","DiscountProvider","updateFixedClients","discountId","FaqGroup","Faq","FaqProvider","groupId","faqId","formatPercentChange","UnitsHelper","_HttpCachedRequester","cachedResponseData","addSeconds","useResponseDataCache","cacheKey","cachedResponse","responseData","HttpCachedRequester","ManagerDataFactory","ManagerDataProvider","OfferActualizationStatus","OfferActualization","OfferShortInfo","ProfstroyOfferItem","Offer","OffersListFilters","OrderStatus","OrderInfo","replacement","Order","OffersDataProvider","offerId","offerProductId","recipientText","OfferHelper","offer","OrderAction","OrderEditorData","order","Operator","PaymentType","OrdersListFilters","o","w","OrderStatusHistoryInfo","OrdersDataProvider","orderId","cartItemIds","ids","status","statusDetail","options","operatorId","orderProductId","orderProduct","addressId","warehouseId","currentOrderInjectionKey","PriceAnalyze","convertPriceAnalyzeFilters","omitBy","city","salesDirection","convertPriceAnalyzeParams","PriceAnalyzeProvider","PriceHistoryItem","ProductPriceHistory","PriceHistoryDataProvider","updatedFilters","RecommendationsList","RecommendationsDataProvider","productCategory","recommendations","OrderStatusEnum","OrderStatusDetailEnum","AnyReference","City","CityWithUserRegion","userRegion","ContactPosition","OrderPaymentStatus","OrderStatusDetail","ProductFileType","ReferenceDataFactory","Ctor","reference","ResourceType","_ReferenceDataProvider","locations","location","referenceName","countryId","regions","regionId","cities","ReferenceDataProvider","useReferencesPrivateStore","dataLoaderList","channelPrimaryInterestReference","contactPositionsReference","currencyReference","deliveryTypeReference","managersList","opfReference","operatorReference","orderPaymentStatusReference","orderStatusReference","orderStatusDetailReference","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","currentManager","loadCurrentManagerIfNeeded","user","useUserStateStore","u","UserRegionEmployee","UserRegion","UserRegionsListFilters","UserRegionProvider","userId","salesDirectionId","FieldValidationResultData","feedback","validationStatus"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sc-common-lib.umd.cjs","sources":["../src/auth/classes/jwt-payload.ts","../src/auth/classes/detailed-jwt-payload.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/websocket-config.ts","../src/config/classes/app-base-config.ts","../src/config/states/config-state-store.ts","../src/system/providers/preferences-storage-provider.ts","../src/auth/states/auth-state-store.ts","../src/blog/enums/blog-post-media-type-enum.ts","../src/system/classes/identity.ts","../src/blog/classes/blog-post-media-file.ts","../src/blog/enums/blog-post-publication-status-enum.ts","../src/date-time/helpers/date-helper.ts","../src/system/classes/creatable-identity.ts","../src/blog/classes/blog-post-short-info.ts","../src/blog/classes/blog-post.ts","../src/pagination/filters/pagination-filters-base.ts","../src/system/classes/date-period.ts","../src/blog/classes/blog-posts-list-filters.ts","../src/system/providers/typed-instance-factory.ts","../src/http/classes/http-requester.ts","../src/table-data/enums/filter-op-enum.ts","../src/table-data/classes/filter-item.ts","../src/table-data/classes/filter-group.ts","../src/pagination/providers/base-pagination-provider.ts","../src/blog/providers/blog-provider.ts","../src/system/classes/named-identity.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/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/references/classes/currency.ts","../src/references/classes/product-unit.ts","../src/system/classes/coded-identity.ts","../src/system/classes/catalogable-item.ts","../src/system/classes/hidden-catalogable-item.ts","../src/system/classes/image.ts","../src/system/classes/primary-catalogable-item.ts","../src/catalog/classes/product.ts","../src/catalog/enums/cost-source-enum.ts","../src/catalog/classes/client-product.ts","../src/catalog/classes/internal/base/base-category.ts","../src/orders/classes/order-item-base.ts","../src/cart/classes/order-item.ts","../src/cart/classes/cart.ts","../src/cart/providers/cart-provider.ts","../src/catalog/enums/calculation-type-enum.ts","../src/catalog/enums/property-type-enum.ts","../src/catalog/enums/product-filter-type-enum.ts","../src/catalog/classes/category.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/user-regions/classes/user-region-short-info.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-catalogable-item.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/system/classes/deletable-identity.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/catalog/classes/templates-list-filters.ts","../src/catalog/classes/client-price-catalogable-item.ts","../src/catalog/classes/client-price-product.ts","../src/catalog/classes/client-price-category.ts","../src/catalog/classes/pricing-role.ts","../src/catalog/classes/category-pricing-rule.ts","../src/catalog/classes/filter-settings.ts","../src/catalog/classes/category-filter-setting.ts","../src/catalog/classes/category-filter-value.ts","../src/catalog/classes/category-filter.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/catalog/providers/price-template-provider.ts","../src/catalog/providers/pricing-role-provider.ts","../src/catalog/providers/properties-provider.ts","../src/catalog/providers/template-product-category-data-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/clients/classes/bank-account.ts","../src/contacts/classes/contact.ts","../src/contacts/classes/contact-person.ts","../src/references/classes/opf.ts","../src/references/classes/partner-group.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/clients/classes/delivery-address.ts","../src/references/classes/channel-primary-interest.ts","../src/references/classes/source-primary-interest.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/contacts/classes/contact-relation.ts","../src/contacts/classes/contact-person-related.ts","../src/clients/providers/client-data-provider.ts","../src/clients/providers/unknown-client-data-provider.ts","../src/config/classes/version-config.ts","../src/configurator/enums/configurators-enum.ts","../src/configurator/providers/configurator-provider.ts","../src/table-data/classes/table-data-pagination-request-params.ts","../src/table-data/classes/table-data-pagination.ts","../src/table-data/classes/table-data-sort-request-params.ts","../src/date-time/helpers/calendar-helper.ts","../src/date-time/helpers/days-ago-iso.ts","../src/i18n/helpers/pluralize.ts","../src/date-time/helpers/format-relative-date.ts","../src/date-time/providers/date-time-provider.ts","../src/date-time/values/standard-period-groups.ts","../src/discounts/classes/discount-client.ts","../src/discounts/classes/discount-conditions.ts","../src/discounts/helpers/discount-helper.ts","../src/discounts/enums/discount-state-enum.ts","../src/discounts/helpers/discount-state-helper.ts","../src/discounts/classes/discount.ts","../src/discounts/classes/discount-client-eligibility.ts","../src/discounts/classes/discounts-list-filters.ts","../src/discounts/providers/discount-provider.ts","../src/faq/classes/faq-group.ts","../src/faq/classes/faq.ts","../src/faq/providers/faq-provider.ts","../src/helpers/format-percent-change.ts","../src/helpers/units-helper.ts","../src/http/classes/http-cached-requester.ts","../src/managers/classes/manager-data-factory.ts","../src/managers/providers/manager-data-provider.ts","../src/offers/enums/offer-actualization-status.ts","../src/offers/classes/offer-actualization.ts","../src/offers/classes/offer-short-info.ts","../src/offers/classes/profstroy-offer-item.ts","../src/offers/classes/offer.ts","../src/offers/classes/offers-list-filters.ts","../src/references/classes/order-status.ts","../src/orders/classes/order-info.ts","../src/orders/classes/order-item.ts","../src/orders/classes/order.ts","../src/offers/providers/offers-data-provider.ts","../src/offers/helpers/offer-helper.ts","../src/orders/enums/order-action.ts","../src/orders/classes/order-editor-data.ts","../src/references/classes/operator.ts","../src/references/classes/payment-type.ts","../src/orders/classes/orders-list-filters.ts","../src/orders/classes/order-status-history-info.ts","../src/orders/providers/orders-data-provider.ts","../src/orders/symbols/current-order-injection-key.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/enums/order-status-enum.ts","../src/references/enums/order-status-detail-enum.ts","../src/references/classes/any-reference.ts","../src/references/classes/city.ts","../src/references/classes/city-with-user-region.ts","../src/references/classes/contact-position.ts","../src/references/classes/order-payment-status.ts","../src/references/classes/order-status-detail.ts","../src/references/classes/product-file-type.ts","../src/references/classes/reference-data-factory.ts","../src/references/classes/resource-type.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/user-regions/classes/user-region-employee.ts","../src/user-regions/classes/user-region.ts","../src/user-regions/classes/user-regions-list-filters.ts","../src/user-regions/providers/user-region-provider.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 const decodedJwtPayload = jwtDecode<IDetailedJwtPayload<O>>(jwtToken);\n const payload = new DetailedJwtPayload(objectToCamel(decodedJwtPayload) as unknown as IDetailedJwtPayload<O>);\n\n // Необходимо сохранить в исходном виде названия ключей ресурсов, иначе может быть путаница.\n payload.resourceAccess = decodedJwtPayload.resource_access as IDetailedJwtPayload<O>['resourceAccess'];\n\n return payload;\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 { 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 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.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|404|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 { 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 { 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 { 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 * Конфигурация web-сокета.\n */\n public readonly websocket?: IWebsocketConfig;\n\n /**\n * @inheritDoc\n */\n public readonly dateFormats: IAppBaseConfig['dateFormats'];\n\n /**\n * @inheritDoc\n */\n public readonly numberPrecision: IAppBaseConfig['numberPrecision'];\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.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 this.numberPrecision = {\n priceCoefficient: data?.numberPrecision?.priceCoefficient ?? 7,\n };\n }\n}\n","import { AppBaseConfig } from '@sc/config/classes/app-base-config';\nimport { IAppBaseConfig } from '@sc/config/interfaces/i-app-base-config';\nimport { merge } from 'lodash-es';\nimport { defineStore } from 'pinia';\nimport { ref } from 'vue';\n\n/**\n * Приватное хранилище данных состояния приложения.\n */\nexport const useBaseConfigStateStore = defineStore('common.config', () => {\n /**\n * Конфигурационные данные приложения.\n */\n const config = ref<IAppBaseConfig>(new AppBaseConfig());\n\n /**\n * Получает конфигурацию приложения.\n *\n * @returns Конфигурация приложения.\n */\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters\n const getConfig = <T = IAppBaseConfig>(): T => {\n return config.value as T;\n };\n\n /**\n * Устанавливает конфигурацию приложения.\n *\n * @param appConfig Конфигурация приложения.\n */\n const setConfig = (appConfig: IAppBaseConfig): void => {\n config.value = merge(config.value, appConfig);\n };\n\n return {\n /**\n * Конфигурационные данные приложения.\n */\n config,\n\n /**\n * Получает конфигурацию приложения.\n *\n * @returns Конфигурация приложения.\n */\n getConfig,\n\n /**\n * Устанавливает конфигурацию приложения.\n *\n * @param appConfig Конфигурация приложения.\n */\n setConfig,\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\n // Просроченные данные удаляем, чтобы не занимали место в хранилище.\n localStorage.removeItem(keyName);\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 { useBaseConfigStateStore } from '@sc/config/states/config-state-store';\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('common.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 = useBaseConfigStateStore().config.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('common.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","/* eslint-disable no-shadow */\n\n/**\n * Перечисление допустимых типов медиафайлов статьи блога.\n */\nexport enum BlogPostMediaTypeEnum {\n /**\n * Изображение.\n */\n Image = 'image',\n\n /**\n * Видео.\n */\n Video = 'video',\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","import { BlogPostMediaTypeEnum } from '@sc/blog/enums/blog-post-media-type-enum';\nimport { IBlogPostMediaFile } from '@sc/blog/interfaces/i-blog-post-media-file';\nimport { Identity } from '@sc/system/classes/identity';\n\n/**\n * Данные о медиафайле статьи блога.\n */\nexport class BlogPostMediaFile extends Identity<string> implements IBlogPostMediaFile {\n /**\n * @inheritDoc\n */\n public mediaType: BlogPostMediaTypeEnum;\n\n /**\n * @inheritDoc\n */\n public isCover: boolean;\n\n /**\n * @inheritDoc\n */\n public isUnused: boolean;\n\n /**\n * @inheritDoc\n */\n public url: string;\n\n /**\n * @inheritDoc\n */\n public urlWebp?: string;\n\n /**\n * Инициализирует экземпляр класса {@link BlogPostMediaFile}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IBlogPostMediaFile>) {\n super(data, '');\n\n this.mediaType = data?.mediaType ?? BlogPostMediaTypeEnum.Image;\n this.isCover = data?.isCover ?? false;\n this.isUnused = data?.isUnused ?? false;\n this.url = data?.url ?? '';\n this.urlWebp = data?.urlWebp;\n }\n\n /**\n * Возвращает признак того, что медиафайл является изображением.\n */\n public isImage(): boolean {\n return this.mediaType === BlogPostMediaTypeEnum.Image;\n }\n\n /**\n * Возвращает признак того, что медиафайл является видео.\n */\n public isVideo(): boolean {\n return this.mediaType === BlogPostMediaTypeEnum.Video;\n }\n}\n","/* eslint-disable no-shadow */\n\n/**\n * Перечисление допустимых состояний публикации статьи блога.\n */\nexport enum BlogPostPublicationStatusEnum {\n /**\n * Черновик: дата публикации не задана, на сайте статья не отображается.\n */\n Draft = 'draft',\n\n /**\n * Опубликована: дата публикации наступила, статья отображается на сайте.\n */\n Published = 'published',\n\n /**\n * Запланирована: дата публикации задана, но ещё не наступила.\n */\n Scheduled = 'scheduled',\n}\n","import { useBaseConfigStateStore } from '@sc/config/states/config-state-store';\nimport { IDatePeriod } from '@sc/system/interfaces/i-date-period';\nimport { format, isValid, parseISO } from 'date-fns';\nimport { isNil, isString } from 'lodash-es';\n\n/**\n * Класс-помощник для приведения значений дат из данных ответов API и к данным запросов API.\n */\nexport class DateHelper {\n /**\n * Преобразует значение даты из данных ответа в дату.\n * Строки разбираются как ISO-даты; нечитаемое значение равносильно отсутствию даты.\n *\n * @param value Значение даты: дата, строка в формате ISO или пустое значение.\n */\n public static parse(value?: Date | string | null): Date | undefined {\n if (isNil(value)) {\n return undefined;\n }\n\n const date = isString(value) ? parseISO(value) : value;\n\n return isValid(date) ? date : undefined;\n }\n\n /**\n * Возвращает дату в формате API либо `null`, если дата не задана или некорректна.\n *\n * @param date Дата.\n */\n public static toApiFormat(date?: Date | null): string | null {\n return isNil(date) || !isValid(date) ? null : format(date, useBaseConfigStateStore().config.dateFormats.api);\n }\n\n /**\n * Возвращает период с датами начала и окончания в формате API.\n *\n * @param period Период.\n */\n public static periodToApiFormat(period: IDatePeriod): Record<keyof IDatePeriod, string | null> {\n return { from: DateHelper.toApiFormat(period.from), to: DateHelper.toApiFormat(period.to) };\n }\n}\n","import { DateHelper } from '@sc/date-time/helpers/date-helper';\nimport { Identity } from '@sc/system/classes/identity';\nimport { ICreatableIdentity } from '@sc/system/interfaces/i-creatable-identity';\n\n/**\n * Базовая идентифицируемая сущность с обязательной датой создания.\n */\nexport abstract class CreatableIdentity<T = number> extends Identity<T> implements ICreatableIdentity<T> {\n /**\n * Дата и время создания записи. Если не задана в данных, используется текущий момент.\n */\n public createdAt: Date;\n\n /**\n * Инициализирует экземпляр класса {@link CreatableIdentity}.\n *\n * @param data Данные для первоначальной инициализации.\n * @param defaultIdValue Значение идентификатора по-умолчанию, если оно не определено в данных.\n */\n protected constructor(data?: Partial<ICreatableIdentity<T>>, defaultIdValue?: T) {\n super(data, defaultIdValue);\n\n this.createdAt = DateHelper.parse(data?.createdAt) ?? new Date();\n }\n}\n","import { BlogPostPublicationStatusEnum } from '@sc/blog/enums/blog-post-publication-status-enum';\nimport { IBlogPostShortInfo } from '@sc/blog/interfaces/i-blog-post-short-info';\nimport { CreatableIdentity } from '@sc/system/classes/creatable-identity';\nimport { parseISO } from 'date-fns';\nimport { endsWith, includes, isNil, isString, startsWith } from 'lodash-es';\n\n/**\n * Краткие данные о статье блога.\n */\nexport class BlogPostShortInfo extends CreatableIdentity implements IBlogPostShortInfo {\n /**\n * Возвращает состояние публикации статьи по дате её публикации.\n *\n * @param publishedAt Дата и время публикации статьи.\n */\n public static resolvePublicationStatus(publishedAt?: Date | null): BlogPostPublicationStatusEnum {\n if (isNil(publishedAt)) {\n return BlogPostPublicationStatusEnum.Draft;\n }\n\n return publishedAt.getTime() > Date.now() ? BlogPostPublicationStatusEnum.Scheduled : BlogPostPublicationStatusEnum.Published;\n }\n\n /**\n * Возвращает описание ошибки символьного обозначения статьи либо пустую строку,\n * если обозначение заполнено правильно.\n *\n * Портал принимает обозначение вида `kak-vybrat-podokonnik`: строчные латинские буквы\n * и цифры, разделённые одиночными дефисами.\n *\n * @param slug Символьное обозначение статьи.\n */\n public static getSlugError(slug?: string | null): string {\n if (!slug) {\n return '';\n }\n\n if (/[^a-z0-9-]/.test(slug)) {\n return 'Допустимы только строчные латинские буквы, цифры и дефис: пример «kak-vybrat-podokonnik».';\n }\n\n if (startsWith(slug, '-') || endsWith(slug, '-')) {\n return 'Обозначение не может начинаться или заканчиваться дефисом.';\n }\n\n if (includes(slug, '--')) {\n return 'Дефисы не могут идти подряд: разделяйте слова одним дефисом.';\n }\n\n return '';\n }\n\n /**\n * Преобразует значение даты, полученное из API, в объект {@link Date}.\n *\n * @param value Значение даты.\n */\n protected static parseDate(value?: Date | string | null): Date | null {\n if (isNil(value)) {\n return null;\n }\n\n return isString(value) ? parseISO(value) : value;\n }\n\n /**\n * @inheritDoc\n */\n public slug: string;\n\n /**\n * @inheritDoc\n */\n public title: string;\n\n /**\n * @inheritDoc\n */\n public publishedAt: Date | null;\n\n /**\n * Инициализирует экземпляр класса {@link BlogPostShortInfo}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IBlogPostShortInfo>) {\n super(data, -1);\n\n this.slug = data?.slug ?? '';\n this.title = data?.title ?? '';\n this.publishedAt = BlogPostShortInfo.parseDate(data?.publishedAt);\n }\n\n /**\n * Возвращает состояние публикации статьи.\n */\n public getPublicationStatus(): BlogPostPublicationStatusEnum {\n return BlogPostShortInfo.resolvePublicationStatus(this.publishedAt);\n }\n}\n","import { BlogPostMediaFile } from '@sc/blog/classes/blog-post-media-file';\nimport { BlogPostShortInfo } from '@sc/blog/classes/blog-post-short-info';\nimport { IBlogPost } from '@sc/blog/interfaces/i-blog-post';\nimport { IBlogPostMediaFile } from '@sc/blog/interfaces/i-blog-post-media-file';\nimport { IBlogPostSaveData } from '@sc/blog/interfaces/i-blog-post-save-data';\n\n/**\n * Полные данные о статье блога.\n */\nexport class BlogPost extends BlogPostShortInfo implements IBlogPost {\n /**\n * @inheritDoc\n */\n public content: string;\n\n /**\n * @inheritDoc\n */\n public media: BlogPostMediaFile[];\n\n /**\n * Инициализирует экземпляр класса {@link BlogPost}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IBlogPost>) {\n super(data);\n\n this.content = data?.content ?? '';\n this.media = (data?.media ?? []).map((mediaFile: IBlogPostMediaFile) => new BlogPostMediaFile(mediaFile));\n }\n\n /**\n * Возвращает данные статьи для отправки на портал.\n *\n * Пустое символьное обозначение не передаётся. При создании статьи портал формирует его\n * самостоятельно из заголовка, при изменении - оставляет прежнее значение без изменений.\n *\n * @param withContent Признак того, что в данные необходимо включить текст статьи.\n */\n public toSaveData(withContent: boolean = false): IBlogPostSaveData {\n return {\n title: this.title,\n slug: this.slug.length > 0 ? this.slug : undefined,\n content: withContent ? this.content : undefined,\n publishedAt: this.publishedAt,\n };\n }\n\n /**\n * Возвращает данные обложки статьи.\n */\n public getCover(): BlogPostMediaFile | undefined {\n // eslint-disable-next-line lodash/prefer-lodash-method\n return this.media.find((mediaFile) => mediaFile.isCover);\n }\n\n /**\n * Возвращает список медиафайлов, не используемых в тексте статьи.\n */\n public getUnusedMedia(): BlogPostMediaFile[] {\n // eslint-disable-next-line lodash/prefer-lodash-method\n return this.media.filter((mediaFile) => mediaFile.isUnused);\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any,@typescript-eslint/no-unnecessary-condition */\n\nimport { IPaginationFiltersBase } from '@sc/pagination/filters/i-pagination-filters-base';\nimport { IReference } from '@sc/system/interfaces/i-reference';\nimport { isFunction, isNil, isString } from 'lodash-es';\n\n/**\n * Базовый абстрактный класс для фильтров пагинации.\n * Определяет контракт методов сброса и очистки фильтров.\n */\nexport abstract class PaginationFiltersBase implements IPaginationFiltersBase {\n /**\n * Выполняет сброс указанного фильтра в значение по умолчанию.\n *\n * @param key Название фильтра, значение которого необходимо сбросить.\n */\n public abstract resetFilterValue(key: string): this;\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 // eslint-disable-next-line security/detect-object-injection\n const value = (this as Record<string, unknown>)[k];\n\n if (\n !(\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 return result;\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 { BlogPostPublicationStatusEnum } from '@sc/blog/enums/blog-post-publication-status-enum';\nimport { IBlogPostsListFilters } from '@sc/blog/interfaces/i-blog-posts-list-filters';\nimport { PaginationFiltersBase } from '@sc/pagination/filters/pagination-filters-base';\nimport { DatePeriod } from '@sc/system/classes/date-period';\nimport { IDatePeriod } from '@sc/system/interfaces/i-date-period';\n\n/**\n * Данные о параметрах фильтрации списка статей блога.\n */\nexport class BlogPostsListFilters extends PaginationFiltersBase implements IBlogPostsListFilters {\n /**\n * @inheritDoc\n */\n public id?: string;\n\n /**\n * @inheritDoc\n */\n public title?: string;\n\n /**\n * @inheritDoc\n */\n public slug?: string;\n\n /**\n * @inheritDoc\n */\n public content?: string;\n\n /**\n * @inheritDoc\n */\n public publicationStatus?: BlogPostPublicationStatusEnum;\n\n /**\n * @inheritDoc\n */\n public publishedAt: IDatePeriod;\n\n /**\n * @inheritDoc\n */\n public createdAt: IDatePeriod;\n\n /**\n * Инициализирует экземпляр класса {@link BlogPostsListFilters}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IBlogPostsListFilters) {\n super();\n\n this.id = data?.id;\n this.title = data?.title;\n this.slug = data?.slug;\n this.content = data?.content;\n this.publicationStatus = data?.publicationStatus;\n this.publishedAt = new DatePeriod(data?.publishedAt);\n this.createdAt = new DatePeriod(data?.createdAt);\n }\n\n /**\n * Выполняет сброс указанного фильтра в значение по умолчанию.\n *\n * @param key Название фильтра, значение которого необходимо сбросить.\n */\n public resetFilterValue(key: string): this {\n switch (key) {\n case 'id':\n case 'title':\n case 'slug':\n case 'content':\n case 'publicationStatus':\n // eslint-disable-next-line security/detect-object-injection\n this[key] = undefined;\n break;\n case 'publishedAt':\n this.publishedAt.from = null;\n this.publishedAt.to = null;\n break;\n case 'createdAt':\n this.createdAt.from = null;\n this.createdAt.to = null;\n break;\n default:\n break;\n }\n\n return this;\n }\n\n /**\n * Возвращает очищенное значение фильтров, содержащие\n * только актуальные данные.\n *\n * TODO: Удаление незаполненных периодов повторяется в фильтрах нескольких доменов.\n * Общий механизм стоит перенести в {@link PaginationFiltersBase} отдельной\n * задачей по унификации.\n */\n public asClearRaw(): Record<string, any> {\n const result = super.asClearRaw();\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (!result?.publishedAt?.from && !result?.publishedAt?.to) {\n delete result.publishedAt;\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 return result;\n }\n}\n","import { isArray, map } from 'lodash-es';\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 /**\n * Инициализирует список экземпляров указанного класса.\n *\n * @param type Тип класса, на основе которого необходимо создать экземпляры (тип возвращаемых данных).\n * @param data Список начальных данных для инициализации (параметры конструктора).\n *\n * @throws TypeError Если вместо списка данных получены данные другого типа.\n */\n public static instanceListInitializer<OutDataInterface, SourceDataInterface>(\n // eslint-disable-next-line no-unused-vars\n type: new (data: SourceDataInterface) => OutDataInterface,\n data: SourceDataInterface[]\n ): OutDataInterface[] {\n // Источник данных может вернуть не список (пустое тело ответа, данные другого формата),\n // поэтому проверяем тип до инициализации экземпляров.\n if (!isArray(data)) {\n throw new TypeError(`Ожидался список данных для инициализации \"${type.name}\", получены данные типа \"${typeof data}\".`);\n }\n\n return map(data, (item) => TypedInstanceFactory.instanceInitializer(type, item));\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/states/auth-state-store';\nimport { useBaseConfigStateStore } from '@sc/config/states/config-state-store';\nimport { IHttpResponseError } from '@sc/http/interfaces/i-http-response-error';\nimport { ErrorResponseNotificationHandler } from '@sc/http/types/error-response-notification-handler';\nimport { HttpRequestParams } from '@sc/http/types/http-request-params';\nimport { RequestHook, ResponseHook } from '@sc/http/types/request-hook';\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, CanceledError, InternalAxiosRequestConfig } from 'axios';\nimport { isError, isNil, isObject, 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 protected static requestHooks: RequestHook[] = [];\n\n /**\n * Список зарегистрированных хуков для ответов.\n */\n protected static responseHooks: ResponseHook[] = [];\n\n /**\n * Устанавливает базовый обработчик ошибок выполнения запросов.\n *\n * @param handler Ссылка на функцию-обработчик ошибок.\n */\n public static setDefaultErrorsResponseHandler(handler: ErrorResponseNotificationHandler): void {\n HttpRequester.defaultErrorsResponseHandler = handler;\n }\n\n /**\n * Регистрирует хук, который будет вызываться перед выполнением каждого HTTP запроса.\n *\n * @param hook Функция-хук для обработки запроса.\n */\n public static addRequestHook(hook: RequestHook): void {\n if (!HttpRequester.requestHooks.includes(hook)) {\n HttpRequester.requestHooks.push(hook);\n }\n }\n\n /**\n * Удаляет зарегистрированный хук запроса.\n *\n * @param hook Функция-хук для удаления.\n */\n public static removeRequestHook(hook: RequestHook): void {\n const index = HttpRequester.requestHooks.indexOf(hook);\n\n if (index !== -1) {\n HttpRequester.requestHooks.splice(index, 1);\n }\n }\n\n /**\n * Регистрирует хук, который будет вызываться после получения ответа на каждый HTTP запрос.\n *\n * @param hook Функция-хук для обработки ответа.\n */\n public static addResponseHook(hook: ResponseHook): void {\n if (!HttpRequester.responseHooks.includes(hook)) {\n HttpRequester.responseHooks.push(hook);\n }\n }\n\n /**\n * Удаляет зарегистрированный хук ответа.\n *\n * @param hook Функция-хук для удаления.\n */\n public static removeResponseHook(hook: ResponseHook): void {\n const index = HttpRequester.responseHooks.indexOf(hook);\n\n if (index !== -1) {\n HttpRequester.responseHooks.splice(index, 1);\n }\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 * Ошибка обработки данных ответа не является ошибкой запроса, но пользователю о ней сообщить нужно,\n * поэтому она приводится к общему виду и обрабатывается обработчиком ошибок запросов.\n *\n * @param error Данные об ошибке.\n */\n protected static toHttpResponseError(error: unknown): IHttpResponseError {\n if (isObject(error) && 'status' in error) {\n return error as IHttpResponseError;\n }\n\n return {\n status: 0,\n statusText: 'Invalid response data',\n message: isError(error) ? error.message : 'Не удалось обработать данные ответа сервера.',\n headers: {},\n rawError: isError(error) ? error : new Error(String(error)),\n };\n }\n\n /**\n * Конвертирует данные ошибки HTTP запроса в более упрощённую и часто используемую форму.\n *\n * @param error Данные об ошибке.\n */\n protected static convertHttpErrorResponse(error: any): Promise<IHttpResponseError> {\n if (isNil(error) || !isNil(error.request) || !isNil(error.response)) {\n const rawResponse = isNil(error) ? {} : 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 = `${useBaseConfigStateStore().config.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 userRequestHooksInterceptor = async (request: InternalAxiosRequestConfig): Promise<InternalAxiosRequestConfig> => {\n // Вызываем все зарегистрированные пользовательские хуки запросов последовательно.\n // eslint-disable-next-line unicorn/no-array-reduce,lodash/prefer-lodash-method\n return HttpRequester.requestHooks.reduce(async (configPromise, hook) => hook(await configPromise), Promise.resolve(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 * Перехватчик ответа для приведения отмены запроса (AbortController) к единому виду.\n *\n * @param error Данные ошибки ответа на запрос (сырая ошибка axios до convertHttpErrorResponse).\n */\n // eslint-disable-next-line class-methods-use-this\n private canceledResponseInterceptor = (error: any): Promise<never> => {\n const raw = error.rawError ?? error;\n const isCanceled = raw.name === 'CanceledError' || raw.code === 'ERR_CANCELED';\n\n if (isCanceled) {\n throw new CanceledError('Request canceled');\n }\n\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 userResponseHooksInterceptor = async (response: AxiosResponse): Promise<AxiosResponse> => {\n // Вызываем все зарегистрированные пользовательские хуки ответов последовательно.\n // eslint-disable-next-line unicorn/no-array-reduce,lodash/prefer-lodash-method\n return HttpRequester.responseHooks.reduce(async (responsePromise, hook) => hook(await responsePromise), Promise.resolve(response));\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 // Устанавливаем обработчик ошибок по умолчанию для уведомления пользователей.\n this.errorResponseHandler = HttpRequester.defaultErrorsResponseHandler;\n\n // Инициализация клиента для выполнения HTTP запросов.\n this.httpClient = axios.create({\n headers: {\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 // Перехватчик запросов для вызова пользовательских хуков (должен быть после установки базового URL, но перед другими обработчиками).\n this.interceptorIds.request.userRequestHooksInterceptor = this.httpClient.interceptors.request.use(this.userRequestHooksInterceptor, (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 // Перехватчик ответов для приведения отмены запроса (AbortController) к единому виду.\n this.interceptorIds.response.canceledResponseInterceptor = this.httpClient.interceptors.response.use((response) => response, this.canceledResponseInterceptor);\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 this.interceptorIds.response.userResponseHooksInterceptor = this.httpClient.interceptors.response.use(this.userResponseHooksInterceptor, (error) => Promise.reject(error));\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 if ((error as any)?.name !== 'CanceledError') {\n this.errorResponseHandler(HttpRequester.toHttpResponseError(error), validationFieldResultData, disableNotifications);\n }\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 * @param signal Сигнал отмены запроса.\n */\n protected get<T>(\n url: string,\n params: HttpRequestParams = {},\n successHandler: undefined | ((response: AxiosResponse<T>) => T) = undefined,\n disableNotifications: boolean = false,\n signal: AbortSignal | undefined = undefined\n ): Promise<T> {\n return this.request<T>({ method: 'GET', url: url, params: params, signal }, successHandler, {}, disableNotifications);\n }\n\n /**\n * Выполняет get-запрос и возвращает список экземпляров указанного класса.\n *\n * @param type Тип класса, экземплярами которого являются элементы возвращаемого списка.\n * @param url URL запроса.\n * @param params Параметры запроса.\n * @param disableNotifications Признак необходимости отключить уведомления об ошибках.\n * @param signal Сигнал отмены запроса.\n */\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters\n protected getTypedList<OutDataInterface, SourceDataInterface>(\n // eslint-disable-next-line no-unused-vars\n type: new (data: SourceDataInterface) => OutDataInterface,\n url: string,\n params: HttpRequestParams = {},\n disableNotifications: boolean = false,\n signal: AbortSignal | undefined = undefined\n ): Promise<OutDataInterface[]> {\n return this.get<OutDataInterface[]>(\n url,\n params,\n (response) => TypedInstanceFactory.instanceListInitializer(type, response.data as unknown as SourceDataInterface[]),\n disableNotifications,\n signal\n );\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: HttpRequestParams = {},\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","/* 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 { useBaseConfigStateStore } from '@sc/config/states/config-state-store';\nimport { ITypedNullableRange } from '@sc/system/interfaces/i-typed-nullable-range';\nimport { FilterOpEnum } from '@sc/table-data/enums/filter-op-enum';\nimport { IFilterItem } from '@sc/table-data/interfaces/i-filter-item';\nimport { format } from 'date-fns';\nimport { isDate, isPlainObject } 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 | ITypedNullableRange<Date | null>;\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, unknown> {\n const apiDateFormat = useBaseConfigStateStore().config.dateFormats.api;\n\n const result: Record<string, unknown> = {\n field: this.field,\n op: this.op,\n };\n\n if (isDate(this.value)) {\n result.value = format(this.value, apiDateFormat);\n } else if (isPlainObject(this.value)) {\n const range = this.value as ITypedNullableRange<Date | null>;\n\n result.value = {\n from: range.from ? format(range.from, apiDateFormat) : null,\n to: range.to ? format(range.to, apiDateFormat) : null,\n };\n } else {\n result.value = this.value;\n }\n\n return result;\n }\n}\n","import { FilterItem } from '@sc/table-data/classes/filter-item';\nimport { IFilterGroup } from '@sc/table-data/interfaces/i-filter-group';\nimport { IFilterItem } from '@sc/table-data/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 { HttpRequester } from '@sc/http/classes/http-requester';\nimport { IPaginatedResponse } from '@sc/pagination/interfaces/i-paginated-response';\nimport { TypedInstanceFactory } from '@sc/system/providers/typed-instance-factory';\nimport { FilterGroup } from '@sc/table-data/classes/filter-group';\nimport { IFilterGroup } from '@sc/table-data/interfaces/i-filter-group';\nimport { IPaginationRequestParams } from '@sc/table-data/interfaces/i-pagination-request-params';\nimport { ISortRequestParams } from '@sc/table-data/interfaces/i-sort-request-params';\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 * @param signal Сигнал отмены запроса.\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 signal: AbortSignal | undefined = undefined\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, signal);\n }\n\n /**\n * Получает пагинированный список экземпляров указанного класса.\n *\n * @param type Тип класса, экземплярами которого являются элементы возвращаемого списка.\n * @param url URL запроса.\n * @param filters Параметры фильтрации.\n * @param sortParams Параметры сортировки.\n * @param paginationParams Параметры пагинации.\n * @param extraParams Дополнительные параметры запроса.\n * @param disableDefaultNotificationErrorResponseHandler Признак отключения стандартного обработчика ошибок.\n * @param signal Сигнал отмены запроса.\n */\n protected getTypedPaginated<SourceDataInterface, OutDataInterface extends SourceDataInterface>(\n // eslint-disable-next-line no-unused-vars\n type: new (data: SourceDataInterface) => OutDataInterface,\n url: string,\n filters?: IFilterGroup,\n sortParams?: ISortRequestParams[] | ISortRequestParams,\n paginationParams?: IPaginationRequestParams,\n extraParams?: object,\n disableDefaultNotificationErrorResponseHandler?: boolean,\n signal: AbortSignal | undefined = undefined\n ): Promise<IPaginatedResponse<OutDataInterface>> {\n return this.getPaginated<SourceDataInterface, OutDataInterface>(\n url,\n filters,\n sortParams,\n paginationParams,\n extraParams,\n (response) => ({\n ...response.data,\n data: TypedInstanceFactory.instanceListInitializer(type, response.data.data),\n }),\n disableDefaultNotificationErrorResponseHandler,\n signal\n );\n }\n}\n","import { BlogPost } from '@sc/blog/classes/blog-post';\nimport { BlogPostMediaFile } from '@sc/blog/classes/blog-post-media-file';\nimport { BlogPostShortInfo } from '@sc/blog/classes/blog-post-short-info';\nimport { IBlogPost } from '@sc/blog/interfaces/i-blog-post';\nimport { IBlogPostMediaFile } from '@sc/blog/interfaces/i-blog-post-media-file';\nimport { IBlogPostSaveData } from '@sc/blog/interfaces/i-blog-post-save-data';\nimport { IBlogPostShortInfo } from '@sc/blog/interfaces/i-blog-post-short-info';\nimport { useBaseConfigStateStore } from '@sc/config/states/config-state-store';\nimport { IPaginatedResponse } from '@sc/pagination/interfaces/i-paginated-response';\nimport { BasePaginationProvider } from '@sc/pagination/providers/base-pagination-provider';\nimport { IFile } from '@sc/system/interfaces/i-file';\nimport { IFilterGroup } from '@sc/table-data/interfaces/i-filter-group';\nimport { IPaginationRequestParams } from '@sc/table-data/interfaces/i-pagination-request-params';\nimport { ISortRequestParams } from '@sc/table-data/interfaces/i-sort-request-params';\nimport { IFieldValidationResultData } from '@sc/validation/interfaces/i-field-validation-result-data';\nimport { format } from 'date-fns';\nimport { isNil, isUndefined } from 'lodash-es';\n\n/**\n * Предоставляет механизмы получения/управления статьями блога.\n */\nexport class BlogProvider extends BasePaginationProvider {\n /**\n * Возвращает данные статьи блога, подготовленные для отправки на портал.\n *\n * TODO: Преобразование даты в формат портала повторяется в нескольких провайдерах\n * библиотеки. Общий механизм стоит вынести отдельной задачей по унификации.\n *\n * @param data Данные статьи блога.\n */\n private static preparePostSaveData(data: IBlogPostSaveData): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n if (!isUndefined(data.title)) {\n result.title = data.title;\n }\n\n if (!isUndefined(data.slug)) {\n result.slug = data.slug;\n }\n\n if (!isUndefined(data.content)) {\n result.content = data.content;\n }\n\n if (!isUndefined(data.publishedAt)) {\n const apiDateFormat = useBaseConfigStateStore().config.dateFormats.api;\n\n result.publishedAt = isNil(data.publishedAt) ? null : format(data.publishedAt, apiDateFormat);\n }\n\n return result;\n }\n\n /**\n * Возвращает список статей блога.\n *\n * TODO: При слиянии с develop заменить тело метода на `getTypedPaginated(BlogPostShortInfo, '/internal/blog', ...)`,\n * который появляется в базовом провайдере пагинации там.\n *\n * @param filters Параметры фильтрации данных.\n * @param sortParams Параметры сортировки.\n * @param paginationParams Параметры пагинации.\n *\n * @see /doc/api/internal#/operations/api_internal_blog_get_list\n */\n public getPostList(\n filters?: IFilterGroup,\n sortParams?: ISortRequestParams[] | ISortRequestParams,\n paginationParams?: IPaginationRequestParams\n ): Promise<IPaginatedResponse<IBlogPostShortInfo>> {\n return this.getPaginated<IBlogPostShortInfo, BlogPostShortInfo>('/internal/blog', filters, sortParams, paginationParams, {}, (response) => ({\n ...response.data,\n // eslint-disable-next-line lodash/prefer-lodash-method\n data: response.data.data.map((item: IBlogPostShortInfo) => new BlogPostShortInfo(item)),\n }));\n }\n\n /**\n * Возвращает данные о статье блога.\n *\n * @param postId Идентификатор статьи блога.\n *\n * @see /doc/api/internal#/operations/api_internal_blog_get\n */\n public getPost(postId: number): Promise<IBlogPost> {\n return this.get<IBlogPost>(`/internal/blog/${postId}`, {}, (response) => new BlogPost(response.data));\n }\n\n /**\n * Создаёт новую статью блога.\n *\n * @param data Данные для создания статьи блога.\n * @param validationFieldResultData Список полей, для которых необходимо\n * установить данные об ошибках валидации\n * в случае ошибок в запросах.\n *\n * @see /doc/api/internal#/operations/api_internal_blog_create\n */\n public createPost(data: IBlogPostSaveData, validationFieldResultData: Record<string, IFieldValidationResultData> = {}): Promise<IBlogPost> {\n return this.post<IBlogPost>('/internal/blog', BlogProvider.preparePostSaveData(data), (response) => new BlogPost(response.data), validationFieldResultData);\n }\n\n /**\n * Изменяет данные о статье блога.\n *\n * @param postId Идентификатор статьи блога.\n * @param data Данные для изменения статьи блога.\n * @param validationFieldResultData Список полей, для которых необходимо\n * установить данные об ошибках валидации\n * в случае ошибок в запросах.\n *\n * @see /doc/api/internal#/operations/api_internal_blog_update\n */\n public updatePost(postId: number, data: IBlogPostSaveData, validationFieldResultData: Record<string, IFieldValidationResultData> = {}): Promise<IBlogPost> {\n return this.patch<IBlogPost>(`/internal/blog/${postId}`, BlogProvider.preparePostSaveData(data), (response) => new BlogPost(response.data), validationFieldResultData);\n }\n\n /**\n * Удаляет статью блога.\n *\n * @param postId Идентификатор статьи блога.\n *\n * @see /doc/api/internal#/operations/api_internal_blog_delete\n */\n public removePost(postId: number): Promise<void> {\n return this.delete(`/internal/blog/${postId}`);\n }\n\n /**\n * Загружает медиафайл и привязывает его к статье блога.\n *\n * @param postId Идентификатор статьи блога.\n * @param file Данные загружаемого файла.\n * @param isCover Признак того, что файл является обложкой статьи.\n * @param uploadProgressHandler Обработчик хода отправки файла, получающий процент отправленных данных.\n * @param validationFieldResultData Список полей, для которых необходимо\n * установить данные об ошибках валидации\n * в случае ошибок в запросах.\n *\n * @see /doc/api/internal#/operations/api_internal_blog_upload_media\n */\n public uploadMedia(\n postId: number,\n file: IFile,\n isCover?: boolean,\n uploadProgressHandler?: (percentage: number) => void,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<IBlogPostMediaFile> {\n return this.request<IBlogPostMediaFile>(\n {\n method: 'POST',\n url: `/internal/blog/${postId}/media`,\n data: { file: file, isCover: isCover ?? false },\n onUploadProgress: (event) => {\n if (uploadProgressHandler) {\n uploadProgressHandler(event.total ? Math.round((event.loaded / event.total) * 100) : 0);\n }\n },\n },\n (response) => new BlogPostMediaFile(response.data),\n validationFieldResultData\n );\n }\n\n /**\n * Изменяет данные медиафайла статьи блога.\n *\n * @param postId Идентификатор статьи блога.\n * @param mediaId Идентификатор медиафайла.\n * @param isCover Признак того, что файл является обложкой статьи.\n * @param validationFieldResultData Список полей, для которых необходимо\n * установить данные об ошибках валидации\n * в случае ошибок в запросах.\n *\n * @see /doc/api/internal#/operations/api_internal_blog_update_media\n */\n public updateMedia(postId: number, mediaId: string, isCover: boolean, validationFieldResultData: Record<string, IFieldValidationResultData> = {}): Promise<IBlogPostMediaFile> {\n return this.patch<IBlogPostMediaFile>(\n `/internal/blog/${postId}/media/${mediaId}`,\n { isCover: isCover },\n (response) => new BlogPostMediaFile(response.data),\n validationFieldResultData\n );\n }\n\n /**\n * Удаляет медиафайл статьи блога.\n *\n * Портал запрещает удалять медиафайл, используемый в тексте статьи.\n *\n * @param postId Идентификатор статьи блога.\n * @param mediaId Идентификатор медиафайла.\n *\n * @see /doc/api/internal#/operations/api_internal_blog_delete_media\n */\n public removeMedia(postId: number, mediaId: string): Promise<void> {\n return this.delete(`/internal/blog/${postId}/media/${mediaId}`);\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';\nimport { isEmpty } from 'lodash-es';\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 /**\n * @inheritdoc\n */\n public nameOrGuid(): string {\n return isEmpty(this.name) ? this.guid : this.name;\n }\n}\n","import { DateHelper } from '@sc/date-time/helpers/date-helper';\nimport { NamedIdentity } from '@sc/system/classes/named-identity';\nimport { IUpdatableNamedIdentity } from '@sc/system/interfaces/i-updatable-named-identity';\n\n/**\n * Базовая идентифицируемая сущность содержащая название, даты создания и изменения.\n */\nexport abstract class UpdatableNamedIdentity extends NamedIdentity implements IUpdatableNamedIdentity {\n /**\n * Дата и время создания записи.\n */\n public createdAt?: Date;\n\n /**\n * Дата и время последнего изменения.\n */\n public updatedAt?: Date;\n\n /**\n * Инициализирует экземпляр класса {@link UpdatableNamedIdentity}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n protected constructor(data?: Partial<IUpdatableNamedIdentity>) {\n super(data);\n\n this.createdAt = DateHelper.parse(data?.createdAt);\n this.updatedAt = DateHelper.parse(data?.updatedAt);\n }\n}\n","import { DateHelper } from '@sc/date-time/helpers/date-helper';\nimport { UpdatableNamedIdentity } from '@sc/system/classes/updatable-named-identity';\nimport { IDeletableNamedIdentity } from '@sc/system/interfaces/i-deletable-named-identity';\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?: Partial<IDeletableNamedIdentity>) {\n super(data);\n\n this.deletedAt = DateHelper.parse(data?.deletedAt);\n }\n}\n","import { NamedIdentity } from '@sc/system/classes/named-identity';\nimport { UserTypeEnum } from '@sc/user/enums/user-type-enum';\nimport { IUserShortInfo } from '@sc/user/interfaces/i-user-short-info';\n\n/**\n * Краткие данные о пользователе.\n */\nexport class UserShortInfo extends NamedIdentity implements IUserShortInfo {\n /**\n * Тип пользователя.\n */\n public type?: UserTypeEnum;\n\n /**\n * @inheritDoc\n */\n public isActive?: boolean;\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 this.isActive = data?.isActive ?? true;\n }\n}\n","import { IDiscountShortInfo } from '@sc/catalog/interfaces/i-discount-short-info';\nimport { DateHelper } from '@sc/date-time/helpers/date-helper';\nimport { DeletableNamedIdentity } from '@sc/system/classes/deletable-named-identity';\nimport { UserShortInfo } from '@sc/user/classes/user-short-info';\nimport { IUserShortInfo } from '@sc/user/interfaces/i-user-short-info';\n\n/**\n * Краткие данные скидки.\n */\nexport class DiscountShortInfo extends DeletableNamedIdentity 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 * Инициализирует экземпляр класса {@link DiscountShortInfo}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IDiscountShortInfo>) {\n super(data);\n\n this.costCoefficient = data?.costCoefficient ?? 0;\n this.isLowPriceAllowed = data?.isLowPriceAllowed ?? false;\n this.publishedAt = DateHelper.parse(data?.publishedAt);\n this.description = data?.description ?? undefined;\n this.percent = data?.percent ?? 0;\n this.owner = new UserShortInfo(data?.owner);\n }\n}\n","import { IPriceTemplate } from '@sc/catalog/interfaces/i-price-template';\nimport { UpdatableNamedIdentity } from '@sc/system/classes/updatable-named-identity';\nimport { UserShortInfo } from '@sc/user/classes/user-short-info';\n\n/**\n * Данные шаблона прайс-листа.\n */\nexport class PriceTemplate extends UpdatableNamedIdentity implements IPriceTemplate {\n /**\n * Описание шаблона прайс-листа.\n */\n public description?: string;\n\n /**\n * Данные о пользователе, создавшем шаблон прайс-листа.\n */\n public owner?: UserShortInfo;\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.owner = data?.owner ? new UserShortInfo(data.owner) : 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 const coefficient = new PriceCoefficient({\n id: -2,\n slug: PriceCoefficientEnum.Retail,\n name: 'Розн. цена',\n guid: '',\n });\n\n // Виртуальная запись справочника всегда считается новой.\n coefficient.isNewRec = constant(true);\n\n return coefficient;\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","/* eslint-disable @typescript-eslint/no-unnecessary-condition */\n\nimport { ICurrency } from '@sc/references/interfaces/i-currency';\nimport { NamedIdentity } from '@sc/system/classes/named-identity';\n/**\n * Данные о валюте.\n */\nexport class Currency extends NamedIdentity implements ICurrency {\n /**\n * Сигнатура валюты.\n */\n public signature: string = '';\n\n /**\n * Цифровой код валюты по стандарту ISO 4217.\n */\n public code?: number;\n\n /**\n * Символ валюты.\n */\n public symbol: string = '';\n\n /**\n * Точность округления (количество знаков после запятой).\n */\n public precision?: number;\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.code = data.code;\n this.symbol = data.symbol ?? '';\n this.precision = data.precision;\n }\n }\n}\n","/* eslint-disable @typescript-eslint/no-unnecessary-condition */\n\nimport { IProductUnit } from '@sc/references/interfaces/i-product-unit';\nimport { NamedIdentity } from '@sc/system/classes/named-identity';\n/**\n * Данные единицы измерения продукта.\n */\nexport class ProductUnit extends NamedIdentity implements IProductUnit {\n /**\n * Символьное обозначение (slug) единицы измерения продукта.\n */\n public slug: string = '';\n\n /**\n * Описание единицы измерения продукта.\n */\n public description?: string;\n\n /**\n * Признак того, что единица измерения является единицей измерения площади.\n */\n public isSquare: boolean = false;\n\n /**\n * Признак того, что единица измерения является линейной величиной.\n */\n public isLinear: boolean = false;\n\n /**\n * Инициализирует экземпляр класса {@link ProductUnit}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IProductUnit) {\n super(data);\n\n if (data) {\n this.slug = data.slug ?? '';\n this.description = data.description;\n this.isSquare = data.isSquare ?? false;\n this.isLinear = data.isLinear ?? false;\n }\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 { 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 { 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 { 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 { useBaseConfigStateStore } from '@sc/config/states/config-state-store';\nimport { Currency } from '@sc/references/classes/currency';\nimport { ProductUnit } from '@sc/references/classes/product-unit';\nimport { ICurrency } from '@sc/references/interfaces/i-currency';\nimport { IProductUnit } from '@sc/references/interfaces/i-product-unit';\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: IProductUnit;\n\n /**\n * Норма упаковки.\n */\n public pack?: string;\n\n /**\n * Минимальное количество товара для заказа.\n */\n public minCount?: number;\n\n /**\n * Валюта товара или услуги.\n */\n public currency: ICurrency;\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 ? new ProductUnit(data.unit) : new ProductUnit();\n this.pack = data?.pack;\n this.minCount = data?.minCount;\n this.currency = data?.currency ? new Currency(data.currency) : new 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.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, useBaseConfigStateStore().config.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 return this.unit.isLinear || this.unit.isSquare;\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","/* 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","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';\nimport { PriceCoefficient } from '@sc/references/classes/price-coefficient';\nimport { IPriceCoefficient } from '@sc/references/interfaces/i-price-coefficient';\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 priceCoefficient?: IPriceCoefficient;\n\n /**\n * Процент, прибавленный к значению коэффициента цены при расчёте итоговой цены.\n */\n public increasePercent?: number;\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.priceCoefficient = data?.priceCoefficient ? new PriceCoefficient(data.priceCoefficient) : undefined;\n this.increasePercent = data?.increasePercent;\n this.isPreviouslyOrdered = data?.isPreviouslyOrdered;\n this.isRequired = data?.isRequired;\n this.isFavorite = data?.isFavorite;\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","import { ICartItemConfiguratorParamsBase } from '@sc/cart/interfaces/i-cart-item-configurator-params-base';\nimport { IOrderItemBase } from '@sc/cart/interfaces/i-order-item-base';\nimport { ClientProduct } from '@sc/catalog/classes/client-product';\nimport { BaseCategory } from '@sc/catalog/classes/internal/base/base-category';\nimport { IClientProduct } from '@sc/catalog/interfaces/i-client-product';\nimport { ConfiguratorName } from '@sc/configurator/types/configurator-name';\nimport { Currency } from '@sc/references/classes/currency';\nimport { ICurrency } from '@sc/references/interfaces/i-currency';\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 { cloneDeep } from 'lodash-es';\n\n/**\n * Базовая модель позиции заказа/корзины (без полей стоимости и распила).\n */\nexport class OrderItemBase<T extends ICartItemConfiguratorParamsBase | undefined = undefined, TId = number> extends Identity<TId> implements IOrderItemBase<T, TId> {\n /**\n * @inheritDoc\n */\n public category: BaseCategory;\n\n /**\n * @inheritDoc\n */\n public product: IClientProduct;\n\n /**\n * @inheritDoc\n */\n public quantity: number;\n\n /**\n * @inheritDoc\n */\n public currency: ICurrency;\n\n /**\n * @inheritDoc\n */\n public marker?: string;\n\n /**\n * @inheritDoc\n */\n public height?: number;\n\n /**\n * @inheritDoc\n */\n public length?: number;\n\n /**\n * @inheritDoc\n */\n public width?: number;\n\n /**\n * @inheritDoc\n */\n public configurator?: ConfiguratorName;\n\n /**\n * @inheritDoc\n */\n public configuratorParams: T;\n\n /**\n * @inheritDoc\n */\n public isAdditionalSale?: boolean;\n\n /**\n * @inheritDoc\n */\n public creator?: IUserShortInfo;\n\n /**\n * @inheritDoc\n */\n public isRemoved?: boolean;\n\n /**\n * @inheritDoc\n */\n public ord?: number;\n\n /**\n * @inheritDoc\n */\n public onOrder?: boolean;\n\n /**\n * @inheritDoc\n */\n public originalId?: number | null;\n\n /**\n * @inheritDoc\n */\n public replacementId?: number | null;\n\n /**\n * Инициализирует экземпляр класса {@link OrderItemBase}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data: Partial<IOrderItemBase<T, TId>>) {\n super(data);\n\n this.product = new ClientProduct(data.product);\n this.quantity = data.quantity ?? 0;\n this.marker = data.marker;\n this.category = data.category ?? new BaseCategory();\n this.currency = data.currency ? new Currency(data.currency) : (undefined as unknown as ICurrency);\n this.height = data.height;\n this.length = data.length;\n this.width = data.width;\n this.configurator = data.configurator;\n this.configuratorParams = (data.configuratorParams as T) && cloneDeep<T>(data.configuratorParams as T);\n this.isAdditionalSale = data.isAdditionalSale;\n this.creator = data.creator && new UserShortInfo(data.creator);\n this.isRemoved = data.isRemoved;\n this.ord = data.ord;\n this.onOrder = data.onOrder;\n this.originalId = data.originalId;\n this.replacementId = data.replacementId;\n }\n}\n","import { ICartItemConfiguratorParamsBase } from '@sc/cart/interfaces/i-cart-item-configurator-params-base';\nimport { IOrderItem } from '@sc/cart/interfaces/i-order-item';\nimport { OrderItemBase } from '@sc/orders/classes/order-item-base';\nimport { Currency } from '@sc/references/classes/currency';\nimport { ICurrency } from '@sc/references/interfaces/i-currency';\nimport { isArray } from 'lodash-es';\n\n/**\n * Данные о единичной позиции товара/услуги в корзине или заказе.\n */\nexport class OrderItem<T extends ICartItemConfiguratorParamsBase | undefined = undefined, TId = number> extends OrderItemBase<T, TId> implements IOrderItem<T, TId> {\n /**\n * @inheritDoc\n */\n public cost: number;\n\n /**\n * @inheritDoc\n */\n public costOne: number;\n\n /**\n * @inheritDoc\n */\n public costOneRub: number;\n\n /**\n * @inheritDoc\n */\n public costRub: number;\n\n /**\n * @inheritDoc\n */\n public logicGroupId?: string;\n\n /**\n * @inheritDoc\n */\n public salesDirection?: number;\n\n /**\n * @inheritDoc\n */\n public specificationImgUrl?: string;\n\n /**\n * @inheritDoc\n */\n public sawing?: Array<Record<string, number>>;\n\n /**\n * @inheritDoc\n */\n public currency: ICurrency;\n\n /**\n * Инициализирует экземпляр класса {@link OrderItem}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data: IOrderItem<T, TId>) {\n super(data);\n\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 // eslint-disable-next-line sonarjs/no-nested-conditional\n this.sawing = isArray(data.sawing) ? data.sawing : data.sawing ? [data.sawing] : undefined;\n this.currency = new Currency(data.currency);\n }\n}\n","import { OrderItem } from '@sc/cart/classes/order-item';\nimport { ICart } from '@sc/cart/interfaces/i-cart';\nimport { ICartSum } from '@sc/cart/interfaces/i-cart-sum';\nimport { IOrderItem } from '@sc/cart/interfaces/i-order-item';\n\n/**\n * Данные о содержимом корзины.\n */\nexport class Cart implements ICart {\n /**\n * @inheritDoc\n */\n public items: Array<IOrderItem<undefined, string>>;\n\n /**\n * @inheritDoc\n */\n public resultSum: ICartSum;\n\n /**\n * @inheritDoc\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 OrderItem(item));\n this.resultSum = data.resultSum;\n this.directionsSum = data.directionsSum;\n }\n}\n","import { Cart } from '@sc/cart/classes/cart';\nimport { ICart } from '@sc/cart/interfaces/i-cart';\nimport { ICartItemConfiguratorParamsBase } from '@sc/cart/interfaces/i-cart-item-configurator-params-base';\nimport { IOrderItemBase } from '@sc/cart/interfaces/i-order-item-base';\nimport { IFileUploadData } from '@sc/catalog/interfaces/i-file-upload-data';\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: IOrderItemBase<T>,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<ICart> {\n return this.patch<ICart>(\n `internal/clients/${client.id}/cart`,\n {\n product_id: cartItem.product.id,\n product_category_id: cartItem.configurator ? cartItem.category.id : undefined,\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 is_additional_sale: 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: IOrderItemBase<T>,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<ICart> {\n return this.patch<ICart>(\n `internal/clients/${client.id}/cart/${cartItem.id}`,\n {\n product_id: cartItem.product.id,\n product_category_id: cartItem.configurator ? cartItem.category.id : undefined,\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 is_additional_sale: 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: IOrderItemBase): Promise<ICart> {\n return this.delete<ICart>(`internal/clients/${client.id}/cart/${cartItem.id}`, (response) => new Cart(response.data));\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 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","/* eslint-disable no-shadow */\n\n/**\n * Перечисление типов фильтров продуктов.\n */\nexport enum ProductFilterTypeEnum {\n /**\n * Флажок (выбор одного или нескольких значений из списка).\n */\n Checkbox = 'checkbox',\n\n /**\n * Диапазон значений.\n */\n Range = 'range',\n\n /**\n * Переключатель (да/нет).\n */\n Toggle = 'toggle',\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 { 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 { UpdatableNamedIdentity } from '@sc/system/classes/updatable-named-identity';\n\n/**\n * Общие данные о менеджере клиента.\n */\nexport class ManagerCommon extends UpdatableNamedIdentity 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","import { NamedIdentity } from '@sc/system/classes/named-identity';\nimport { IUserRegionShortInfo } from '@sc/user-regions/interfaces/i-user-region-short-info';\n\n/**\n * Краткие данные о регионе пользователя.\n */\nexport class UserRegionShortInfo extends NamedIdentity implements IUserRegionShortInfo {\n /**\n * @inheritDoc\n */\n public abbr: string;\n\n /**\n * Инициализирует экземпляр класса {@link UserRegionShortInfo}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IUserRegionShortInfo>) {\n super(data);\n\n this.abbr = data?.abbr ?? '';\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';\nimport { UserRegionShortInfo } from '@sc/user-regions/classes/user-region-short-info';\nimport { IUserRegionShortInfo } from '@sc/user-regions/interfaces/i-user-region-short-info';\nimport { parseISO } from 'date-fns';\nimport { isString } from 'lodash-es';\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 supervisorId?: number;\n\n /**\n * Данные роли ценообразования менеджера.\n */\n public pricingRole?: IUserPricingRole;\n\n /**\n * Список направлений кураторства.\n */\n public curatedDirections?: ICuratedDirection[];\n\n /**\n * Признак того, что менеджер должен видеть все цены.\n */\n public showAllCosts?: boolean;\n\n /**\n * Признак того, что менеджер может входить как оператор.\n */\n public authAsOperator?: boolean;\n\n /**\n * Список регионов, за которые отвечает менеджер.\n */\n public managerRegions?: IUserRegionShortInfo[];\n\n /**\n * Список подчинённых менеджеров.\n */\n public managers?: IManager[];\n\n /**\n * Дата и время последнего входа в систему.\n */\n public lastLoginAt?: Date;\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.supervisorId = data?.supervisorId;\n this.pricingRole = data?.pricingRole ? new UserPricingRole(data.pricingRole) : undefined;\n this.curatedDirections = data?.curatedDirections?.map((curatedDirection) => new CuratedDirection(curatedDirection)) ?? [];\n this.showAllCosts = data?.showAllCosts;\n this.authAsOperator = data?.authAsOperator;\n this.managerRegions = data?.managerRegions?.map((region) => new UserRegionShortInfo(region));\n this.managers = data?.managers?.map((manager) => new Manager(manager));\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n this.lastLoginAt = isString(data?.lastLoginAt) ? parseISO(data.lastLoginAt) : data?.lastLoginAt;\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 { IPriceCatalogableItem } from '@sc/catalog/interfaces/i-price-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 PriceCatalogableItem implements IPriceCatalogableItem {\n /**\n * Коэффициент цены, от значения которого производится расчёт.\n */\n public priceCoefficient?: IPriceCoefficient;\n\n /**\n * Процент, который прибавляется к значению выбранного коэффициента.\n */\n public increasePercent?: number;\n\n /**\n * Инициализирует экземпляр класса {@link PriceCatalogableItem}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n protected constructor(data?: IPriceCatalogableItem) {\n this.priceCoefficient = data?.priceCoefficient && new PriceCoefficient(data.priceCoefficient);\n this.increasePercent = data?.increasePercent;\n }\n}\n","import { PriceCatalogableItem } from '@sc/catalog/classes/price-catalogable-item';\nimport { IPriceTemplateICatalogableItem } from '@sc/catalog/interfaces/i-price-template-catalogable-item';\n\n/**\n * Данные о цене элемента каталога в шаблоне прайс-листа.\n */\nexport class PriceTemplateICatalogableItem extends PriceCatalogableItem implements IPriceTemplateICatalogableItem {\n /**\n * Инициализирует экземпляр класса {@link PriceTemplateICatalogableItem}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n protected constructor(data?: IPriceTemplateICatalogableItem) {\n super(data);\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 { UpdatableNamedIdentity } from '@sc/system/classes/updatable-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 UpdatableNamedIdentity 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 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 // 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)) ?? undefined;\n }\n}\n","import { DateHelper } from '@sc/date-time/helpers/date-helper';\nimport { CreatableIdentity } from '@sc/system/classes/creatable-identity';\nimport { IDeletableIdentity } from '@sc/system/interfaces/i-deletable-identity';\n\n/**\n * Базовая идентифицируемая сущность с обязательной датой создания и датой удаления.\n */\nexport abstract class DeletableIdentity<T = number> extends CreatableIdentity<T> implements IDeletableIdentity<T> {\n /**\n * Дата и время удаления записи.\n */\n public deletedAt?: Date;\n\n /**\n * Инициализирует экземпляр класса {@link DeletableIdentity}.\n *\n * @param data Данные для первоначальной инициализации.\n * @param defaultIdValue Значение идентификатора по-умолчанию, если оно не определено в данных.\n */\n protected constructor(data?: Partial<IDeletableIdentity<T>>, defaultIdValue?: T) {\n super(data, defaultIdValue);\n\n this.deletedAt = DateHelper.parse(data?.deletedAt);\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 { DeletableIdentity } from '@sc/system/classes/deletable-identity';\n\n/**\n * Данные шаблона прайс-листа клиента.\n */\nexport class PriceTemplateClient extends DeletableIdentity implements IPriceTemplateClient {\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.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 * Признак того, что по свойству может производиться фильтрация в каталоге.\n */\n public isFilterable?: boolean;\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 this.isFilterable = data?.isFilterable;\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","/* 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 ownerName?: 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.ownerName = data?.ownerName;\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 case 'ownerName':\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 { PriceCatalogableItem } from '@sc/catalog/classes/price-catalogable-item';\nimport { IClientPriceCatalogableItem } from '@sc/catalog/interfaces/i-client-price-catalogable-item';\nimport { DateHelper } from '@sc/date-time/helpers/date-helper';\nimport { UserShortInfo } from '@sc/user/classes/user-short-info';\nimport { IUserShortInfo } from '@sc/user/interfaces/i-user-short-info';\n\n/**\n * Данные о цене элемента каталога в прайс-листе клиента.\n */\nexport class ClientPriceCatalogableItem extends PriceCatalogableItem implements IClientPriceCatalogableItem {\n /**\n * Данные о пользователе, установившем цену.\n */\n public executor?: IUserShortInfo;\n\n /**\n * Дата и время создания записи.\n */\n public createdAt?: Date;\n\n /**\n * Инициализирует экземпляр класса {@link ClientPriceCatalogableItem}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n protected constructor(data?: IClientPriceCatalogableItem) {\n super(data);\n\n this.executor = data?.executor ? new UserShortInfo(data.executor) : undefined;\n this.createdAt = DateHelper.parse(data?.createdAt);\n }\n}\n","import { ClientPriceCatalogableItem } from '@sc/catalog/classes/client-price-catalogable-item';\nimport { Product } from '@sc/catalog/classes/product';\nimport { IClientPriceProduct } from '@sc/catalog/interfaces/i-client-price-product';\nimport { IProduct } from '@sc/catalog/interfaces/i-product';\n\n/**\n * Данные о цене продукта в прайс-листе клиента.\n */\nexport class ClientPriceProduct extends ClientPriceCatalogableItem implements IClientPriceProduct {\n /**\n * Базовые данные о продукте.\n */\n public product: IProduct;\n\n /**\n * Инициализирует экземпляр класса {@link ClientPriceProduct}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IClientPriceProduct) {\n super(data);\n\n this.product = new Product(data?.product);\n }\n}\n","import { ClientPriceCatalogableItem } from '@sc/catalog/classes/client-price-catalogable-item';\nimport { BaseCategory } from '@sc/catalog/classes/internal/base/base-category';\nimport { IClientPriceCategory } from '@sc/catalog/interfaces/i-client-price-category';\nimport { IBaseCategory } from '@sc/catalog/interfaces/internal/base/i-base-category';\n\n/**\n * Данные о цене категории в прайс-листе клиента.\n */\nexport class ClientPriceCategory extends ClientPriceCatalogableItem implements IClientPriceCategory {\n /**\n * Базовые данные о категории.\n */\n public productCategory: IBaseCategory;\n\n /**\n * Инициализирует экземпляр класса {@link ClientPriceCategory}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IClientPriceCategory) {\n super(data);\n\n this.productCategory = new BaseCategory(data?.productCategory);\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 { ProductFilterTypeEnum } from '@sc/catalog/enums/product-filter-type-enum';\nimport { IFilterSettings } from '@sc/catalog/interfaces/i-filter-settings';\n\n/**\n * Настройки фильтра продуктов.\n */\nexport class FilterSettings implements IFilterSettings {\n /**\n * @inheritDoc\n */\n public isFake: boolean;\n\n /**\n * @inheritDoc\n */\n public isHidden: boolean;\n\n /**\n * @inheritDoc\n */\n public isMultiple: boolean | null;\n\n /**\n * @inheritDoc\n */\n public type: ProductFilterTypeEnum | null;\n\n /**\n * @inheritDoc\n */\n public ord: number;\n\n /**\n * Инициализирует экземпляр класса {@link FilterSettings}.\n *\n * Значения по умолчанию заданы намеренно: API не возвращает поля, значения которых совпадают\n * с настройками по умолчанию, поэтому отсутствующее поле означает значение по умолчанию.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IFilterSettings>) {\n this.isFake = data?.isFake ?? false;\n this.isHidden = data?.isHidden ?? false;\n this.isMultiple = data?.isMultiple ?? null;\n this.type = data?.type ?? null;\n this.ord = data?.ord ?? 0;\n }\n}\n","import { FilterSettings } from '@sc/catalog/classes/filter-settings';\nimport { BaseCategory } from '@sc/catalog/classes/internal/base/base-category';\nimport { Property } from '@sc/catalog/classes/property';\nimport { ICategoryFilterSetting } from '@sc/catalog/interfaces/i-category-filter-setting';\nimport { IFilterSettings } from '@sc/catalog/interfaces/i-filter-settings';\nimport { IProperty } from '@sc/catalog/interfaces/i-property';\nimport { IBaseCategory } from '@sc/catalog/interfaces/internal/base/i-base-category';\n\n/**\n * Настройки фильтра по свойству в конкретной категории.\n */\nexport class CategoryFilterSetting implements ICategoryFilterSetting {\n /**\n * @inheritDoc\n */\n public category: IBaseCategory;\n\n /**\n * @inheritDoc\n */\n public property: IProperty;\n\n /**\n * @inheritDoc\n */\n public settings: IFilterSettings;\n\n /**\n * Инициализирует экземпляр класса {@link CategoryFilterSetting}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<Omit<ICategoryFilterSetting, 'settings'>> & { settings?: Partial<IFilterSettings> }) {\n this.category = new BaseCategory(data?.category);\n this.property = new Property(data?.property);\n this.settings = new FilterSettings(data?.settings);\n }\n}\n","import { ICategoryFilterValue } from '@sc/catalog/interfaces/i-category-filter-value';\n\n/**\n * Значение фильтра категории.\n */\nexport class CategoryFilterValue implements ICategoryFilterValue {\n /**\n * @inheritDoc\n */\n public id: number | string;\n\n /**\n * @inheritDoc\n */\n public label: string;\n\n /**\n * Инициализирует экземпляр класса {@link CategoryFilterValue}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<ICategoryFilterValue>) {\n this.id = data?.id ?? '';\n this.label = data?.label ?? '';\n }\n}\n","import { CategoryFilterValue } from '@sc/catalog/classes/category-filter-value';\nimport { ProductFilterTypeEnum } from '@sc/catalog/enums/product-filter-type-enum';\nimport { ICategoryFilter } from '@sc/catalog/interfaces/i-category-filter';\nimport { ICategoryFilterValue } from '@sc/catalog/interfaces/i-category-filter-value';\n\n/**\n * Фильтр, доступный в категории продуктов.\n */\nexport class CategoryFilter implements ICategoryFilter {\n /**\n * @inheritDoc\n */\n public id: string;\n\n /**\n * @inheritDoc\n */\n public label: string;\n\n /**\n * @inheritDoc\n */\n public type: ProductFilterTypeEnum;\n\n /**\n * @inheritDoc\n */\n public ord: number;\n\n /**\n * @inheritDoc\n */\n public isMultiple: boolean | null;\n\n /**\n * @inheritDoc\n */\n public values: ICategoryFilterValue[];\n\n /**\n * @inheritDoc\n */\n public min: number | string | null;\n\n /**\n * @inheritDoc\n */\n public max: number | string | null;\n\n /**\n * Инициализирует экземпляр класса {@link CategoryFilter}.\n *\n * Значения по умолчанию заданы намеренно: API не возвращает поля, значения которых не заданы,\n * а также поля, не относящиеся к типу фильтра.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<ICategoryFilter>) {\n this.id = data?.id ?? '';\n this.label = data?.label ?? '';\n this.type = data?.type ?? ProductFilterTypeEnum.Checkbox;\n this.ord = data?.ord ?? 0;\n this.isMultiple = data?.isMultiple ?? null;\n this.values = data?.values?.map((value) => new CategoryFilterValue(value)) ?? [];\n this.min = data?.min ?? null;\n this.max = data?.max ?? null;\n }\n}\n","import { SearchResult } from '@sc/catalog/types/search-result';\nimport { useBaseConfigStateStore } from '@sc/config/states/config-state-store';\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 = useBaseConfigStateStore().config;\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 { ClientPriceCategory } from '@sc/catalog/classes/client-price-category';\nimport { ClientPriceProduct } from '@sc/catalog/classes/client-price-product';\nimport { IClientPriceCategory } from '@sc/catalog/interfaces/i-client-price-category';\nimport { IClientPriceProduct } from '@sc/catalog/interfaces/i-client-price-product';\nimport { ICommercialOffer } from '@sc/catalog/interfaces/i-commercial-offer';\nimport { ICommercialOfferParams } from '@sc/catalog/interfaces/i-commercial-offer-params';\nimport { IFileUploadData } from '@sc/catalog/interfaces/i-file-upload-data';\nimport { IPriceUpdateData } from '@sc/catalog/interfaces/i-price-update-data';\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 * @param disableNotifications Признак необходимости отключить уведомления об ошибках.\n *\n * @see /doc/api/internal#/operations/api_internal_client_price_import\n */\n public importPrices(clientId: number, file: IFileUploadData, disableNotifications: boolean = false): Promise<void> {\n return this.post(`/internal/clients/${clientId}/price/import`, file, undefined, {}, disableNotifications);\n }\n\n /**\n * Возвращает список цен прайс-листа клиента, установленных на категории.\n *\n * @param clientId Идентификатор клиента.\n *\n * @see /doc/api/internal#/operations/api_internal_client_price_categories_get_list\n */\n public getCategoryPrices(clientId: number): Promise<IClientPriceCategory[]> {\n return this.getTypedList(ClientPriceCategory, `/internal/clients/${clientId}/price/categories`);\n }\n\n /**\n * Возвращает цену прайс-листа клиента, установленную на категорию.\n *\n * @param clientId Идентификатор клиента.\n * @param categoryId Идентификатор категории товаров.\n *\n * @see /doc/api/internal#/operations/api_internal_client_price_categories_get\n */\n public getCategoryPrice(clientId: number, categoryId: number): Promise<IClientPriceCategory> {\n return this.get<IClientPriceCategory>(`/internal/clients/${clientId}/price/categories/${categoryId}`, {}, (response) => new ClientPriceCategory(response.data));\n }\n\n /**\n * Устанавливает цену прайс-листа клиента на категорию.\n *\n * @param clientId Идентификатор клиента.\n * @param categoryId Идентификатор категории товаров.\n * @param data Данные для изменения цены.\n * @param recursively Признак того, что цену необходимо установить рекурсивно для всех дочерних категорий.\n *\n * @see /doc/api/internal#/operations/api_internal_client_price_categories_update\n */\n public updateCategoryPrices(clientId: number, categoryId: number, data: IPriceUpdateData, recursively: boolean = false): Promise<void> {\n return this.request<never>({\n method: 'PATCH',\n url: `/internal/clients/${clientId}/price/categories/${categoryId}`,\n data: {\n price_coefficient_id: data.coefficient?.id,\n increase_percent: data.value,\n },\n params: recursively ? { recursively: true } : {},\n });\n }\n\n /**\n * Удаляет цену прайс-листа клиента, установленную на категорию.\n *\n * @param clientId Идентификатор клиента.\n * @param categoryId Идентификатор категории товаров.\n * @param recursively Признак того, что цену необходимо удалить рекурсивно для всех дочерних категорий.\n *\n * @see /doc/api/internal#/operations/api_internal_client_price_categories_remove\n */\n public removeCategoryPrices(clientId: number, categoryId: number, recursively: boolean = false): Promise<void> {\n return this.request<never>({\n method: 'DELETE',\n url: `/internal/clients/${clientId}/price/categories/${categoryId}`,\n params: recursively ? { recursively: true } : {},\n });\n }\n\n /**\n * Удаляет цены прайс-листа клиента, установленные на продукты категории.\n *\n * @param clientId Идентификатор клиента.\n * @param categoryId Идентификатор категории товаров.\n * @param recursively Признак того, что цены необходимо удалить рекурсивно для продуктов всех дочерних категорий.\n *\n * @see /doc/api/internal#/operations/api_internal_client_price_categories_remove_product_client_prices\n */\n public removeCategoryProductsPrices(clientId: number, categoryId: number, recursively: boolean = false): Promise<void> {\n return this.request<never>({\n method: 'DELETE',\n url: `/internal/clients/${clientId}/price/categories/${categoryId}/products`,\n params: recursively ? { recursively: true } : {},\n });\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 *\n * @see /doc/api/internal#/operations/api_internal_client_price_products_get_list\n */\n public getProductPrices(clientId: number): Promise<IClientPriceProduct[]> {\n return this.getTypedList(ClientPriceProduct, `/internal/clients/${clientId}/price/products`);\n }\n\n /**\n * Возвращает цену прайс-листа клиента, установленную на продукт.\n *\n * @param clientId Идентификатор клиента.\n * @param productId Идентификатор продукта.\n *\n * @see /doc/api/internal#/operations/api_internal_client_price_products_get\n */\n public getProductPrice(clientId: number, productId: number): Promise<IClientPriceProduct> {\n return this.get<IClientPriceProduct>(`/internal/clients/${clientId}/price/products/${productId}`, {}, (response) => new ClientPriceProduct(response.data));\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<IClientPriceProduct> {\n return this.patch<IClientPriceProduct>(\n `/internal/clients/${clientId}/price/products/${productId}`,\n {\n price_coefficient_id: data.coefficient?.id,\n increase_percent: data.value,\n },\n (response) => new ClientPriceProduct(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<void> {\n return this.delete(`/internal/clients/${clientId}/price/products/${productId}`);\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/price-template-client';\nimport { IPriceTemplateClient } from '@sc/catalog/interfaces/i-price-template-client';\nimport { IPriceTemplateClientUpdateData } from '@sc/catalog/interfaces/i-price-template-client-update-data';\nimport { useBaseConfigStateStore } from '@sc/config/states/config-state-store';\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.getTypedList(PriceTemplateClient, `/internal/clients/${clientId}/price/templates`);\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 = useBaseConfigStateStore().config.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 = useBaseConfigStateStore().config.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.getTypedList(Category, `/internal/catalog/categories`, {\n showHidden: showHidden,\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 { useBaseConfigStateStore } from '@sc/config/states/config-state-store';\nimport { IPaginatedResponse } from '@sc/pagination/interfaces/i-paginated-response';\nimport { BasePaginationProvider } from '@sc/pagination/providers/base-pagination-provider';\nimport { IPaginationRequestParams } from '@sc/table-data/interfaces/i-pagination-request-params';\nimport { format } from 'date-fns';\nimport { map } from 'lodash-es';\n\n/**\n * Предоставляет механизмы получения/управления данными о продуктах.\n */\nexport class ProductDataProvider extends BasePaginationProvider {\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 periodFrom Дата начала периода, с которого продукты считаются новыми.\n * @param paginationParams Параметры пагинации.\n * @param withPriceCoefficients Признак того, что необходимо включить в ответ данные о коэффициентах цен на продукты.\n *\n * @see /doc/api/internal#/Каталог/api_internal_catalog_new_products_by_period_get\n */\n public getNewProducts(periodFrom: Date, paginationParams: IPaginationRequestParams, withPriceCoefficients: boolean = true): Promise<IPaginatedResponse<IProduct>> {\n const apiDateFormat = useBaseConfigStateStore().config.dateFormats.api;\n\n return this.getTypedPaginated(Product, '/internal/catalog/products/new', undefined, undefined, paginationParams, {\n period: { from: format(periodFrom, apiDateFormat) },\n withPriceCoefficients: withPriceCoefficients,\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.getTypedList(ClientCategory, `/internal/catalog/categories`, {\n clientId: clientId,\n showHidden: showHidden,\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 { useBaseConfigStateStore } from '@sc/config/states/config-state-store';\nimport { IPaginatedResponse } from '@sc/pagination/interfaces/i-paginated-response';\nimport { BasePaginationProvider } from '@sc/pagination/providers/base-pagination-provider';\nimport { IPaginationRequestParams } from '@sc/table-data/interfaces/i-pagination-request-params';\nimport { format } from 'date-fns';\n\n/**\n * Предоставляет механизмы получения/управления данными о продуктах для клиентов.\n */\nexport class ClientProductDataProvider extends BasePaginationProvider {\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 /**\n * Возвращает данные о новых продуктах каталога для указанного клиента, появившихся начиная с указанной даты.\n *\n * @param clientId Идентификатор клиента.\n * @param periodFrom Дата начала периода, с которого продукты считаются новыми.\n * @param paginationParams Параметры пагинации.\n * @param withPriceCoefficients Признак того, что необходимо включить в ответ данные о коэффициентах цен на продукты.\n *\n * @see /doc/api/internal#/Каталог/api_internal_catalog_new_products_by_period_get\n */\n public getNewProducts(\n clientId: number,\n periodFrom: Date,\n paginationParams: IPaginationRequestParams,\n withPriceCoefficients: boolean = true\n ): Promise<IPaginatedResponse<IClientProduct>> {\n const apiDateFormat = useBaseConfigStateStore().config.dateFormats.api;\n\n return this.getTypedPaginated(ClientProduct, '/internal/catalog/products/new', undefined, undefined, paginationParams, {\n clientId: clientId,\n period: { from: format(periodFrom, apiDateFormat) },\n withPriceCoefficients: withPriceCoefficients,\n });\n }\n}\n","import { PriceTemplate } from '@sc/catalog/classes/price-template';\nimport { PriceTemplateCategory } from '@sc/catalog/classes/price-template-category';\nimport { PriceTemplateClient } from '@sc/catalog/classes/price-template-client';\nimport { PriceTemplateProduct } from '@sc/catalog/classes/price-template-product';\nimport { IPriceTemplate } from '@sc/catalog/interfaces/i-price-template';\nimport { IPriceTemplateCategory } from '@sc/catalog/interfaces/i-price-template-category';\nimport { IPriceTemplateClient } from '@sc/catalog/interfaces/i-price-template-client';\nimport { IPriceTemplateCreateData } from '@sc/catalog/interfaces/i-price-template-create-data';\nimport { IPriceTemplateProduct } from '@sc/catalog/interfaces/i-price-template-product';\nimport { IPriceUpdateData } from '@sc/catalog/interfaces/i-price-update-data';\nimport { IPaginatedResponse } from '@sc/pagination/interfaces/i-paginated-response';\nimport { BasePaginationProvider } from '@sc/pagination/providers/base-pagination-provider';\nimport { IFilterGroup } from '@sc/table-data/interfaces/i-filter-group';\nimport { IPaginationRequestParams } from '@sc/table-data/interfaces/i-pagination-request-params';\nimport { ISortRequestParams } from '@sc/table-data/interfaces/i-sort-request-params';\nimport { IFieldValidationResultData } from '@sc/validation/interfaces/i-field-validation-result-data';\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.getTypedPaginated(PriceTemplate, '/internal/price/templates', filters, sortParams, paginationParams);\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.getTypedList(PriceTemplateProduct, `/internal/price/templates/${priceTemplateId}/products`);\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.getTypedList(PriceTemplateCategory, `/internal/price/templates/${priceTemplateId}/categories`);\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.getTypedList(PriceTemplateClient, `/internal/price/templates/${priceTemplateId}/clients`);\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';\nimport { TypedInstanceFactory } from '@sc/system/providers/typed-instance-factory';\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.getTypedList(PricingRole, '/internal/price/roles');\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.getTypedList(CategoryPricingRule, `/internal/price/roles/rules/categories/${categoryId}`);\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 TypedInstanceFactory.instanceListInitializer(CategoryPricingRule, response.data)\n );\n }\n}\n","import { CategoryFilter } from '@sc/catalog/classes/category-filter';\nimport { CategoryFilterSetting } from '@sc/catalog/classes/category-filter-setting';\nimport { Property } from '@sc/catalog/classes/property';\nimport { PropertyValue } from '@sc/catalog/classes/property-value';\nimport { ICatalogItemPropertyFile } from '@sc/catalog/interfaces/i-catalog-item-property-file';\nimport { ICategoryFilter } from '@sc/catalog/interfaces/i-category-filter';\nimport { ICategoryFilterSetting } from '@sc/catalog/interfaces/i-category-filter-setting';\nimport { ICategoryFilterSettingUpdateData } from '@sc/catalog/interfaces/i-category-filter-setting-update-data';\nimport { IDescription } from '@sc/catalog/interfaces/i-description';\nimport { IFileUpdateData } from '@sc/catalog/interfaces/i-file-update-data';\nimport { IFileUploadData } from '@sc/catalog/interfaces/i-file-upload-data';\nimport { IProperty } from '@sc/catalog/interfaces/i-property';\nimport { IPropertyCreateData } from '@sc/catalog/interfaces/i-property-create-data';\nimport { IPropertyValue } from '@sc/catalog/interfaces/i-property-value';\nimport { ISpecification } from '@sc/catalog/interfaces/i-specification';\nimport { IPaginatedResponse } from '@sc/pagination/interfaces/i-paginated-response';\nimport { BasePaginationProvider } from '@sc/pagination/providers/base-pagination-provider';\nimport { IFile } from '@sc/system/interfaces/i-file';\nimport { IFilterGroup } from '@sc/table-data/interfaces/i-filter-group';\nimport { IPaginationRequestParams } from '@sc/table-data/interfaces/i-pagination-request-params';\nimport { ISortRequestParams } from '@sc/table-data/interfaces/i-sort-request-params';\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.getTypedPaginated(Property, '/internal/catalog/properties', filters, sortParams, paginationParams);\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.getTypedList(PropertyValue, `/internal/catalog/products/${productId}/properties`);\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.getTypedList(PropertyValue, `/internal/catalog/categories/${categoryId}/properties`);\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 /**\n * Возвращает список фильтров, доступных в категории.\n *\n * @param categoryId Идентификатор категории.\n * @param recursively Признак необходимости включить в список фильтры дочерних категорий.\n * @see /doc/api/internal#/operations/api_internal_catalog_categories_category_filters_get\n */\n public getCategoryFilters(categoryId: number, recursively: boolean = false): Promise<ICategoryFilter[]> {\n return this.get<ICategoryFilter[]>(`/internal/catalog/categories/${categoryId}/filters`, { recursively }, (response) =>\n response.data.map((filter) => new CategoryFilter(filter))\n );\n }\n\n /**\n * Возвращает список настроенных фильтров категории.\n *\n * @param categoryId Идентификатор категории.\n * @see /doc/api/internal#/operations/api_internal_catalog_categories_filter_settings_get_list\n */\n public getCategoryFilterSettings(categoryId: number): Promise<ICategoryFilterSetting[]> {\n return this.getTypedList(CategoryFilterSetting, `/internal/catalog/categories/${categoryId}/filter-settings`);\n }\n\n /**\n * Сохраняет настройки фильтра в категории.\n *\n * @param categoryId Идентификатор категории.\n * @param propertySlug Символьный идентификатор свойства.\n * @param settingsData Данные настроек фильтра.\n * @see /doc/api/internal#/operations/api_internal_catalog_categories_filter_settings_save\n */\n public saveCategoryFilterSetting(categoryId: number, propertySlug: string, settingsData: ICategoryFilterSettingUpdateData): Promise<ICategoryFilterSetting> {\n return this.patch<ICategoryFilterSetting>(\n `/internal/catalog/categories/${categoryId}/filter-settings/${propertySlug}`,\n settingsData,\n (response) => new CategoryFilterSetting(response.data)\n );\n }\n\n /**\n * Удаляет настройки фильтра в категории, возвращая фильтру настройки по умолчанию.\n *\n * @param categoryId Идентификатор категории.\n * @param propertySlug Символьный идентификатор свойства.\n * @see /doc/api/internal#/operations/api_internal_catalog_categories_filter_settings_delete\n */\n public deleteCategoryFilterSetting(categoryId: number, propertySlug: string): Promise<void> {\n return this.delete(`/internal/catalog/categories/${categoryId}/filter-settings/${propertySlug}`);\n }\n}\n","import { Category } from '@sc/catalog/classes/category';\nimport { Product } from '@sc/catalog/classes/product';\nimport { ICategory } from '@sc/catalog/interfaces/i-category';\nimport { IProduct } from '@sc/catalog/interfaces/i-product';\nimport { HttpRequester } from '@sc/http/classes/http-requester';\nimport { map } from 'lodash-es';\n\n/**\n * Предоставляет механизмы получения/управления данными о категориях продуктов шаблона прайс-листа.\n */\nexport class TemplateProductCategoryDataProvider extends HttpRequester {\n /**\n * Возвращает список данных о корневых категориях указанного шаблона прайс-листа.\n *\n * @param priceTemplateId Идентификатор шаблона прайс-листа для которого необходимо вернуть список корневых категорий.\n * @param showHidden Признак необходимости также возвращать данные о скрытых категориях.\n *\n * @see /doc/api/internal#/Каталог/api_internal_catalog_categories_get_list\n */\n public getRootCategoriesList(priceTemplateId: number, showHidden: boolean = false): Promise<ICategory[]> {\n return this.getTypedList(Category, `/internal/catalog/categories`, {\n priceTemplateId: priceTemplateId,\n showHidden: showHidden,\n });\n }\n\n /**\n * Возвращает данные об указанной категории шаблона прайс-листа.\n *\n * @param priceTemplateId Идентификатор шаблона прайс-листа для которого необходимо получить данные категории.\n * @param categoryID Идентификатор категории для которой нужно получить данные.\n * @param showHidden Признак необходимости также возвращать данные о скрытых категориях.\n * @param withNestedCategories Признак необходимости также вернуть список с данными о вложенных категориях.\n *\n * @see /doc/api/internal#/Каталог/api_internal_catalog_categories_get\n */\n public getCategoryData(priceTemplateId: number, categoryID: number, showHidden: boolean = false, withNestedCategories: boolean = false): Promise<ICategory> {\n return this.get<ICategory>(\n `/internal/catalog/categories/${categoryID}`,\n {\n priceTemplateId: priceTemplateId,\n showHidden: showHidden,\n withNestedCategories: withNestedCategories,\n },\n (response) => new Category(response.data)\n );\n }\n\n /**\n * Возвращает список продуктов категории указанного шаблона прайс-листа.\n *\n * @param priceTemplateId Идентификатор шаблона прайс-листа для которого необходимо получить список продуктов.\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(priceTemplateId: number, categoryID: number, withPriceCoefficients: boolean = true, showHidden: boolean = false): Promise<IProduct[]> {\n return this.get<IProduct[]>(\n `/internal/catalog/categories/${categoryID}/products`,\n {\n priceTemplateId: priceTemplateId,\n showHidden: showHidden,\n withPriceCoefficients: withPriceCoefficients,\n },\n (response) => map(response.data, (p) => new Product(p))\n );\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 { ICategory } from '@sc/catalog/interfaces/i-category';\nimport { ICatalogableItem } from '@sc/system/interfaces/i-catalogable-item';\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 /**\n * Список кураторов.\n */\n Curators = 'curators',\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","/* eslint-disable @typescript-eslint/no-unnecessary-condition */\n\nimport { IBankAccount } from '@sc/clients/interfaces/i-bank-account';\nimport { Currency } from '@sc/references/classes/currency';\nimport { ICurrency } from '@sc/references/interfaces/i-currency';\nimport { Identity } from '@sc/system/classes/identity';\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 { DeletableNamedIdentity } from '@sc/system/classes/deletable-named-identity';\n\n/**\n * Полные данные контакта.\n */\nexport class Contact extends DeletableNamedIdentity 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';\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 * Инициализирует экземпляр класса {@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 }\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 { 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","/* 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 { Opf } from '@sc/references/classes/opf';\nimport { PartnerGroup } from '@sc/references/classes/partner-group';\nimport { IOpf } from '@sc/references/interfaces/i-opf';\nimport { IPartnerGroup } from '@sc/references/interfaces/i-partner-group';\nimport { DeletableNamedIdentity } from '@sc/system/classes/deletable-named-identity';\nimport { UserShortInfo } from '@sc/user/classes/user-short-info';\nimport { IUserShortInfo } from '@sc/user/interfaces/i-user-short-info';\n\n/**\n * Базовые данные о контрагенте.\n */\nexport abstract class ContragentBase extends DeletableNamedIdentity implements IContragentBase {\n /**\n * Данные об организационно-правовой форме.\n */\n public opf: IOpf = Opf.generatePersonItem();\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 creator?: IUserShortInfo;\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.comment = data.comment;\n this.alternativeName = data.alternativeName;\n this.creator = data.creator ? new UserShortInfo(data.creator) : undefined;\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.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 { ContragentBase } from '@sc/clients/classes/contragent/contragent-base';\nimport { IContragentPerson } from '@sc/clients/interfaces/contragent/i-contragent-person';\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 { ContragentBase } from '@sc/clients/classes/contragent/contragent-base';\nimport { IContragentIc } from '@sc/clients/interfaces/contragent/i-contragent-ic';\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 { ContragentIc } from '@sc/clients/classes/contragent/contragent-ic';\nimport { IContragentUlR } from '@sc/clients/interfaces/contragent/i-contragent-ul-r';\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 { ContragentUlR } from '@sc/clients/classes/contragent/contragent-ul-r';\nimport { IContragentUlNr } from '@sc/clients/interfaces/contragent/i-contragent-ul-nr';\nimport { Country } from '@sc/references/classes/country';\nimport { ICountry } from '@sc/references/interfaces/i-country';\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 { ContragentIc } from '@sc/clients/classes/contragent/contragent-ic';\nimport { ContragentPerson } from '@sc/clients/classes/contragent/contragent-person';\nimport { ContragentUlNr } from '@sc/clients/classes/contragent/contragent-ul-nr';\nimport { ContragentUlR } from '@sc/clients/classes/contragent/contragent-ul-r';\nimport { OpfEnum } from '@sc/clients/enums/opf-enum';\nimport { IContragentBase } from '@sc/clients/interfaces/contragent/i-contragent-base';\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';\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","/* eslint-disable @typescript-eslint/no-unnecessary-condition */\n\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 { GeoCoordinates } from '@sc/geo/classes/geo-coordinates';\nimport { IGeoCoordinates } from '@sc/geo/interfaces/i-geo-coordinates';\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","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 { 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 { 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 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.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 { PaginationFiltersBase } from '@sc/pagination/filters/pagination-filters-base';\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';\n\n/**\n * Данные о параметрах фильтрации списка клиентов.\n */\nexport class ClientsListFilters extends PaginationFiltersBase implements IClientsListFilters {\n /**\n * @inheritDoc\n */\n public id?: string;\n\n /**\n * @inheritDoc\n */\n public guid?: 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 includeSubordinateManagers?: boolean;\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 noOrdersPeriod: IDatePeriod = new DatePeriod();\n\n /**\n * Инициализирует экземпляр класса {@link ClientsListFilters}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IClientsListFilters) {\n super();\n this.id = data?.id;\n this.guid = data?.guid;\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 // По умолчанию учитываем клиентов подчинённых менеджеров (старое поведение).\n this.includeSubordinateManagers = data?.includeSubordinateManagers ?? true;\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 = data?.preferredDeliveryType ? new DeliveryType(data?.preferredDeliveryType) : undefined;\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.noOrdersPeriod = new DatePeriod(data?.noOrdersPeriod);\n }\n\n /**\n * @inheritDoc\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 'noOrdersPeriod':\n this.noOrdersPeriod.from = null;\n this.noOrdersPeriod.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 * @inheritDoc\n */\n public asClearRaw(): Record<string, any> {\n const result = super.asClearRaw();\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 // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (!result?.noOrdersPeriod?.from && !result?.noOrdersPeriod?.to) {\n delete result.noOrdersPeriod;\n }\n\n return result;\n }\n}\n","import { IOrderShortInfo } from '@sc/orders/interfaces/i-order-short-info';\nimport { CreatableIdentity } from '@sc/system/classes/creatable-identity';\nimport { UserShortInfo } from '@sc/user/classes/user-short-info';\nimport { IUserShortInfo } from '@sc/user/interfaces/i-user-short-info';\n\n/**\n * Краткие данные о заказе.\n */\nexport class OrderShortInfo extends CreatableIdentity implements IOrderShortInfo {\n /**\n * @inheritDoc\n */\n public creator: IUserShortInfo;\n\n /**\n * Инициализирует экземпляр класса {@link OrderShortInfo}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IOrderShortInfo>) {\n super(data);\n\n this.creator = new UserShortInfo(data?.creator);\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 { 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 { 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 * @inheritDoc\n */\n public contacts?: IContactPerson[] = [];\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 lastOrder?: IOrderShortInfo;\n\n /**\n * @inheritDoc\n */\n public salesDirection?: ISalesDirection;\n\n /**\n * @inheritDoc\n */\n public managers?: IManagerCommon[];\n\n /**\n * @inheritDoc\n */\n public curators?: ICurator[];\n\n /**\n * Инициализирует экземпляр класса {@link ClientAdditionalData}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data: IClientAdditionalData) {\n super(data);\n\n this.contacts = data.contacts?.map((contact) => new ContactPerson(contact)) ?? undefined;\n this.lastOrder = data.lastOrder ? new OrderShortInfo(data.lastOrder) : undefined;\n this.partnerGroups = data.partnerGroups?.map((partnerGroup) => new PartnerGroup(partnerGroup)) ?? undefined;\n this.preferredDeliveryType = data.preferredDeliveryType ? new DeliveryType(data.preferredDeliveryType) : undefined;\n this.salesDirection = data.salesDirection ? new SalesDirection(data.salesDirection) : undefined;\n this.managers = data.managers?.map((manager) => new ManagerCommon(manager)) ?? undefined;\n this.curators = data.curators?.map((curator) => new Curator(curator)) ?? undefined;\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,@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 } from '@sc/clients/enums/clients-additional-data-request-type-enum';\nimport { OpfEnum } from '@sc/clients/enums/opf-enum';\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 { IManagerCommon } from '@sc/managers/interfaces/i-manager-common';\nimport { IPaginatedResponse } from '@sc/pagination/interfaces/i-paginated-response';\nimport { BasePaginationProvider } from '@sc/pagination/providers/base-pagination-provider';\nimport { ICuratedDirection } from '@sc/references/interfaces/i-curated-direction';\nimport { TypedInstanceFactory } from '@sc/system/providers/typed-instance-factory';\nimport { FilterOpEnum } from '@sc/table-data/enums/filter-op-enum';\nimport { IFilterGroup } from '@sc/table-data/interfaces/i-filter-group';\nimport { IPaginationRequestParams } from '@sc/table-data/interfaces/i-pagination-request-params';\nimport { ISortRequestParams } from '@sc/table-data/interfaces/i-sort-request-params';\nimport { IFieldValidationResultData } from '@sc/validation/interfaces/i-field-validation-result-data';\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 preferred_warehouse_id: client.preferredWarehouse?.id,\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 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 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 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 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 Идентификатор или GUID клиента для которого необходимо получить данные.\n * @see /doc/api/internal#/Клиенты/api_internal_client_get_full_info\n */\n public getClient(id: number | string): 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 * @param signal Сигнал отмены запроса.\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 signal: AbortSignal | undefined = undefined\n ): Promise<IPaginatedResponse<IClientShortInfo>> {\n return this.getTypedPaginated(ClientShortInfo, '/internal/clients', filters, sortParams, paginationParams, extraParams, undefined, signal);\n }\n\n /**\n * Выполняет поиск клиентов по терму в строке.\n *\n * @param term Терм поиска.\n */\n public searchClient(term: string): Promise<IClientShortInfo[]> {\n return this.getClientsList(undefined, undefined, undefined, {\n searchTerm: term,\n }).then((response) => response.data);\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 TypedInstanceFactory.instanceListInitializer(ClientAdditionalData, response.data)\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.getTypedList(ContactPersonRelated, `/internal/clients/${id}/contacts/all`);\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 };\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 * @see /doc/api/internal#/operations/api_internal_client_delivery_address_get_list\n */\n public getClientDeliveryAddresses(clientId: number): Promise<IDeliveryAddress[]> {\n return this.getTypedList(DeliveryAddress, `/internal/clients/${clientId}/delivery-addresses`);\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","import { HttpRequester } from '@sc/http/classes/http-requester';\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 { 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","/**\n * Перечисление всех реализованных конфигураторов.\n */\nexport enum ConfiguratorsEnum {\n /**\n * Конфигуратор козырьков.\n */\n Kozyrek = 'kozyrek',\n\n /**\n * Конфигуратор москитных сеток.\n */\n Mosquitto = 'mosquitto',\n\n /**\n * Конфигуратор резки штрипса.\n */\n Strip = 'strip',\n\n /**\n * Конфигуратор металла для дверей.\n */\n MetalForDoors = 'metal_for_doors',\n\n /**\n * Конфигуратор сэндвич-панелей.\n */\n Sandwich = 'sandwich',\n\n /**\n * Конфигуратор распила сэндвич-панелей по площади.\n */\n SandwichM2 = 'sandwich_m2',\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 { IConfiguratorCalculateParamsSandwich } from '@sc/configurator/interfaces/i-configurator-calculate-params-sandwich';\nimport { IConfiguratorCalculateResultSandwich } from '@sc/configurator/interfaces/i-configurator-calculate-result-sandwich';\nimport { IConfiguratorSettingsBase } from '@sc/configurator/interfaces/i-configurator-settings-base';\nimport { HttpRequester } from '@sc/http/classes/http-requester';\nimport { IHttpResponseError } from '@sc/http/interfaces/i-http-response-error';\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 * @param clientId Идентификатор клиента.\n *\n * @see /doc/api/internal#/Каталог/api_internal_catalog_categories_configurator_settings\n */\n public getConfiguratorSettings<T extends IConfiguratorSettingsBase>(category: ICategory, clientId: number): Promise<T> {\n return this.get<T>(`internal/catalog/categories/${category.id}/configurators/${category.properties?.configurator}/settings?client_id=${clientId}`);\n }\n\n /**\n * Возвращает данные о продукте, который соответствует указанной в запросе конфигурации для указанного конфигуратора.\n *\n * @param category Данные о категории.\n * @param clientId Идентификатор клиента.\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 clientId: number,\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, client_id: clientId },\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 clientId Идентификатор клиента.\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>(\n category: ICategory,\n clientId: number,\n newTemplate: T,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<undefined> {\n return this.post<undefined>(\n `internal/catalog/categories/${category.id}/configurators/${category.properties?.configurator}/template?client_id=${clientId}`,\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 clientId Идентификатор клиента.\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, clientId: number, templateId: number): Promise<void> {\n return this.delete(`internal/catalog/categories/${category.id}/configurators/${category.properties?.configurator}/template/${templateId}?client_id=${clientId}`);\n }\n\n /**\n * Выполняет расчет, через указанный конфигуратор с переданными параметрами.\n *\n * @param category Данные о категории.\n * @param clientId Идентификатор клиента.\n * @param params Параметры запроса расчета конфигуратора.\n *\n * @see /doc/api/internal#/Каталог/api_public_catalog_categories_category_configurator_calculate\n */\n public calculate(category: ICategory, clientId: number, params: IConfiguratorCalculateParamsSandwich): Promise<IConfiguratorCalculateResultSandwich> {\n return this.get<IConfiguratorCalculateResultSandwich>(`internal/catalog/categories/${category.id}/configurators/${category.properties?.configurator}/calculate`, {\n client_id: clientId,\n ...params,\n });\n }\n}\n","import { IPaginationRequestParams } from '@sc/table-data/interfaces/i-pagination-request-params';\n\n/**\n * Данные о пагинации записей таблицы.\n */\nexport class TableDataPaginationRequestParams implements IPaginationRequestParams {\n /**\n * Номер текущей страницы.\n */\n public page = 1;\n\n /**\n * Количество записей на странице.\n */\n public pageSize = 50;\n\n /**\n * Инициализирует экземпляр класса {@link TableDataPaginationRequestParams}.\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 { TableDataPaginationRequestParams } from '@sc/table-data/classes/table-data-pagination-request-params';\nimport { IPagination } from '@sc/table-data/interfaces/i-pagination';\n\n/**\n * Данные о пагинации записей таблицы.\n */\nexport class TableDataPagination extends TableDataPaginationRequestParams 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 TableDataPagination}.\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/table-data/interfaces/i-sort-request-params';\n\n/**\n * Данные о сортировке записей таблицы.\n */\nexport class TableDataSortRequestParams 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","import { IDatePeriod } from '@sc/system/interfaces/i-date-period';\nimport {\n addDays,\n addMonths,\n addWeeks,\n differenceInCalendarDays,\n differenceInCalendarMonths,\n endOfDay,\n endOfMonth,\n getDate,\n getDaysInMonth,\n setDate,\n startOfDay,\n startOfMonth,\n startOfWeek,\n} from 'date-fns';\n\n/**\n * Класс-помощник для календарных вычислений, отсутствующих в date-fns: декады (1–10, 11–20, 21–конец месяца),\n * полугодия и интервалы «до такой же даты». Все возвращаемые периоды имеют заполненные границы.\n */\nexport class CalendarHelper {\n /**\n * Возвращает границы декады, в которую попадает указанная дата.\n *\n * @param date Дата.\n */\n public static decadeInterval(date: Date): IDatePeriod {\n const [from, to] = CalendarHelper.shiftedDecadeBounds(date, 0);\n\n return { from, to };\n }\n\n /**\n * Возвращает границы декады, отстоящей от декады указанной даты на заданное число декад.\n *\n * @param date Дата.\n * @param shift Смещение в декадах, может быть отрицательным.\n */\n public static shiftDecadeInterval(date: Date, shift: number): IDatePeriod {\n const [from, to] = CalendarHelper.shiftedDecadeBounds(date, shift);\n\n return { from, to };\n }\n\n /**\n * Возвращает начало полугодия, в которое попадает указанная дата.\n *\n * @param date Дата.\n */\n public static startOfHalfYear(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth() < 6 ? 0 : 6, 1);\n }\n\n /**\n * Возвращает конец полугодия, в которое попадает указанная дата.\n *\n * @param date Дата.\n */\n public static endOfHalfYear(date: Date): Date {\n return endOfMonth(new Date(date.getFullYear(), date.getMonth() < 6 ? 5 : 11, 1));\n }\n\n /**\n * Возвращает дату, сдвинутую на указанное число полугодий.\n *\n * @param date Дата.\n * @param amount Смещение в полугодиях, может быть отрицательным.\n */\n public static addHalfYears(date: Date, amount: number): Date {\n return addMonths(date, amount * 6);\n }\n\n /**\n * Возвращает интервал «сдвинутый период до такой же даты»: от начала сдвинутого периода до конца дня\n * с тем же порядковым номером месяца внутри периода и тем же числом, что у опорной даты.\n * Если в целевом месяце такого числа нет, берётся его последний день (31-е число в месяце из 30 дней станет 30-м).\n *\n * @param currentPeriodStart Начало периода, в который попадает опорная дата.\n * @param shiftedPeriodStart Начало сдвинутого периода.\n * @param date Опорная дата.\n */\n public static intervalTillSameDate(currentPeriodStart: Date, shiftedPeriodStart: Date, date: Date): IDatePeriod {\n const monthOffset = differenceInCalendarMonths(startOfMonth(date), startOfMonth(currentPeriodStart));\n const targetMonthStart = startOfMonth(addMonths(shiftedPeriodStart, monthOffset));\n const day = Math.min(getDate(date), getDaysInMonth(targetMonthStart));\n\n return { from: startOfDay(shiftedPeriodStart), to: endOfDay(setDate(targetMonthStart, day)) };\n }\n\n /**\n * Возвращает интервал «сдвинутая неделя до такого же дня недели»; недели начинаются с понедельника.\n *\n * @param date Опорная дата.\n * @param shiftWeeks Смещение в неделях, может быть отрицательным.\n */\n public static weekTillSameWeekday(date: Date, shiftWeeks: number): IDatePeriod {\n const from = startOfWeek(addWeeks(date, shiftWeeks), { weekStartsOn: 1 });\n const dayOffset = differenceInCalendarDays(date, startOfWeek(date, { weekStartsOn: 1 }));\n\n return { from, to: endOfDay(addDays(from, dayOffset)) };\n }\n\n /**\n * Возвращает интервал «сдвинутая декада до такого же номера дня»; если в целевой декаде дня с таким\n * номером нет, берётся её последний день (третья декада длится от 8 до 11 дней).\n *\n * @param date Опорная дата.\n * @param shift Смещение в декадах, может быть отрицательным.\n */\n public static decadeTillSameDayNumber(date: Date, shift: number): IDatePeriod {\n const [currentStart] = CalendarHelper.shiftedDecadeBounds(date, 0);\n const dayNumber = differenceInCalendarDays(date, currentStart) + 1;\n const [targetStart, targetEnd] = CalendarHelper.shiftedDecadeBounds(date, shift);\n const targetLength = differenceInCalendarDays(targetEnd, targetStart) + 1;\n\n return { from: targetStart, to: endOfDay(addDays(targetStart, Math.min(dayNumber, targetLength) - 1)) };\n }\n\n /**\n * Возвращает пару «начало и конец декады», отстоящей от декады указанной даты на заданное число декад.\n *\n * @param date Дата.\n * @param shift Смещение в декадах, может быть отрицательным.\n */\n private static shiftedDecadeBounds(date: Date, shift: number): [Date, Date] {\n const day = getDate(date);\n let currentIndex = 2;\n\n if (day <= 10) {\n currentIndex = 0;\n } else if (day <= 20) {\n currentIndex = 1;\n }\n\n const totalIndex = currentIndex + shift;\n const monthShift = Math.floor(totalIndex / 3);\n const decadeIndex = ((totalIndex % 3) + 3) % 3;\n const monthStart = startOfMonth(addMonths(date, monthShift));\n const from = addDays(monthStart, decadeIndex * 10);\n const to = decadeIndex === 2 ? endOfMonth(monthStart) : endOfDay(addDays(from, 9));\n\n return [from, to];\n }\n}\n","import { format, startOfToday, subDays } from 'date-fns';\n\n/**\n * Возвращает дату «сегодня минус n дней» в формате YYYY-MM-DD.\n *\n * @param days Число дней назад.\n */\nexport function daysAgoIso(days: number): string {\n return format(subDays(startOfToday(), days), 'yyyy-MM-dd');\n}\n","/**\n * Функция выбора склонения слов в зависимости от числа.\n *\n * @param value Анализируемое число.\n * @param titles Список склонений.\n * @example `pluralize(2, ['день', 'дня', 'дней'])` вернет `'дня'`\n */\nexport function pluralize(value: number, titles: string[]): string {\n const cases = [2, 0, 1, 1, 1, 2];\n // Берём абсолютное целое значение: отрицательные и дробные числа иначе дают некорректный индекс.\n const normalized = Math.floor(Math.abs(value));\n\n return titles[normalized % 100 > 4 && normalized % 100 < 20 ? 2 : cases[Math.min(normalized % 10, 5)]];\n}\n","import { pluralize } from '@sc/i18n/helpers/pluralize';\nimport { differenceInCalendarDays, parseISO, startOfToday } from 'date-fns';\n\n/**\n * Форматирует дату события относительно сегодняшнего дня.\n *\n * @param isoDate Дата в формате YYYY-MM-DD.\n */\nexport function formatRelativeDate(isoDate: string): string {\n const date = parseISO(isoDate);\n const diffDays = differenceInCalendarDays(startOfToday(), date);\n\n switch (true) {\n case diffDays === 0:\n return 'Сегодня';\n case diffDays === 1:\n return 'Вчера';\n case diffDays < 0:\n return isoDate;\n default:\n return `${diffDays} ${pluralize(diffDays, ['день', 'дня', 'дней'])} назад`;\n }\n}\n","import { CalendarHelper } from '@sc/date-time/helpers/calendar-helper';\nimport { ILabeledPeriod } from '@sc/date-time/interfaces/i-labeled-period';\nimport { IStandardPeriod } from '@sc/date-time/interfaces/i-standard-period';\nimport {\n addBusinessDays,\n addDays,\n addMonths,\n addQuarters,\n addWeeks,\n addYears,\n endOfDay,\n endOfMonth,\n endOfQuarter,\n endOfToday,\n endOfTomorrow,\n endOfWeek,\n endOfYear,\n endOfYesterday,\n startOfDay,\n startOfMonth,\n startOfQuarter,\n startOfToday,\n startOfTomorrow,\n startOfWeek,\n startOfYear,\n startOfYesterday,\n subDays,\n subMonths,\n subQuarters,\n subWeeks,\n subYears,\n} from 'date-fns';\n\n/**\n * Провайдер даты и времени.\n */\nexport class DateTimeProvider {\n /**\n * Возвращает предустановленные диапазоны дат.\n *\n * @param year Год, от которого считаются годовые периоды (1/3/9 месяцев, кварталы, полугодия, год); по умолчанию текущий.\n */\n public static defaultDateRanges(year?: number): Record<string, ILabeledPeriod> {\n // Следующий рабочий день — текущая дата + 1 рабочий день.\n const nextWorkingDay = addBusinessDays(new Date(), 1);\n\n const now = new Date();\n\n // Начало выбранного года — точка отсчёта для кварталов, полугодий и периодов нарастающим итогом.\n const yearStart = startOfYear(year === undefined ? now : new Date(year, 0, 1));\n const yearEnd = endOfYear(yearStart);\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 currentWeek: { label: 'Неделя', from: startOfWeek(now, { weekStartsOn: 1 }), to: endOfWeek(now, { weekStartsOn: 1 }) },\n currentMonth: { label: 'Месяц', from: startOfMonth(now), to: endOfMonth(now) },\n oneMonth: { label: '1 месяц', from: yearStart, to: endOfMonth(yearStart) },\n threeMonths: { label: '3 месяца', from: yearStart, to: endOfMonth(addMonths(yearStart, 2)) },\n nineMonths: { label: '9 месяцев', from: yearStart, to: endOfMonth(addMonths(yearStart, 8)) },\n firstQuarter: { label: 'I квартал', from: yearStart, to: endOfMonth(addMonths(yearStart, 2)) },\n secondQuarter: { label: 'II квартал', from: addMonths(yearStart, 3), to: endOfMonth(addMonths(yearStart, 5)) },\n thirdQuarter: { label: 'III квартал', from: addMonths(yearStart, 6), to: endOfMonth(addMonths(yearStart, 8)) },\n fourthQuarter: { label: 'IV квартал', from: addMonths(yearStart, 9), to: endOfMonth(addMonths(yearStart, 11)) },\n firstHalfYear: { label: 'I полугодие', from: yearStart, to: endOfMonth(addMonths(yearStart, 5)) },\n secondHalfYear: { label: 'II полугодие', from: addMonths(yearStart, 6), to: yearEnd },\n currentYear: { label: '12 месяцев', from: yearStart, to: yearEnd },\n };\n }\n\n /**\n * Возвращает стандартные периоды по образцу перечисления 1С «ВариантСтандартногоПериода»,\n * распределённые по группам {@link STANDARD_PERIOD_GROUPS}, а внутри группы «Прочее» — по разделам\n * {@link STANDARD_PERIOD_SECTIONS}. Ключи повторяют англоязычные имена значений перечисления платформы.\n *\n * @param now Опорная дата «сейчас»; по умолчанию текущая.\n */\n public static standardPeriods(now: Date = new Date()): Record<string, IStandardPeriod> {\n const weekOptions = { weekStartsOn: 1 } as const;\n const dayStart = startOfDay(now);\n const dayEnd = endOfDay(now);\n const decade = CalendarHelper.decadeInterval(now);\n const monthStart = startOfMonth(now);\n const quarterStart = startOfQuarter(now);\n const halfYearStart = CalendarHelper.startOfHalfYear(now);\n const yearStart = startOfYear(now);\n const previousHalfYear = CalendarHelper.addHalfYears(now, -1);\n const nextHalfYear = CalendarHelper.addHalfYears(now, 1);\n\n return {\n yesterday: { label: 'Вчера', group: 'day', from: startOfDay(subDays(now, 1)), to: endOfDay(subDays(now, 1)) },\n today: { label: 'Сегодня', group: 'day', from: dayStart, to: dayEnd },\n tomorrow: { label: 'Завтра', group: 'day', from: startOfDay(addDays(now, 1)), to: endOfDay(addDays(now, 1)) },\n\n lastWeek: { label: 'Прошлая неделя', group: 'week', from: startOfWeek(subWeeks(now, 1), weekOptions), to: endOfWeek(subWeeks(now, 1), weekOptions) },\n thisWeek: { label: 'Эта неделя', group: 'week', from: startOfWeek(now, weekOptions), to: endOfWeek(now, weekOptions) },\n nextWeek: { label: 'Следующая неделя', group: 'week', from: startOfWeek(addWeeks(now, 1), weekOptions), to: endOfWeek(addWeeks(now, 1), weekOptions) },\n\n lastTenDays: { label: 'Прошлая декада', group: 'decade', ...CalendarHelper.shiftDecadeInterval(now, -1) },\n thisTenDays: { label: 'Эта декада', group: 'decade', ...decade },\n nextTenDays: { label: 'Следующая декада', group: 'decade', ...CalendarHelper.shiftDecadeInterval(now, 1) },\n\n lastMonth: { label: 'Прошлый месяц', group: 'month', from: startOfMonth(subMonths(now, 1)), to: endOfMonth(subMonths(now, 1)) },\n thisMonth: { label: 'Этот месяц', group: 'month', from: monthStart, to: endOfMonth(now) },\n nextMonth: { label: 'Следующий месяц', group: 'month', from: startOfMonth(addMonths(now, 1)), to: endOfMonth(addMonths(now, 1)) },\n\n lastQuarter: { label: 'Прошлый квартал', group: 'quarter', from: startOfQuarter(subQuarters(now, 1)), to: endOfQuarter(subQuarters(now, 1)) },\n thisQuarter: { label: 'Этот квартал', group: 'quarter', from: quarterStart, to: endOfQuarter(now) },\n nextQuarter: { label: 'Следующий квартал', group: 'quarter', from: startOfQuarter(addQuarters(now, 1)), to: endOfQuarter(addQuarters(now, 1)) },\n\n lastHalfYear: {\n label: 'Прошлое полугодие',\n group: 'halfYear',\n from: CalendarHelper.startOfHalfYear(previousHalfYear),\n to: CalendarHelper.endOfHalfYear(previousHalfYear),\n },\n thisHalfYear: { label: 'Это полугодие', group: 'halfYear', from: halfYearStart, to: CalendarHelper.endOfHalfYear(now) },\n nextHalfYear: { label: 'Следующее полугодие', group: 'halfYear', from: CalendarHelper.startOfHalfYear(nextHalfYear), to: CalendarHelper.endOfHalfYear(nextHalfYear) },\n\n lastYear: { label: 'Прошлый год', group: 'year', from: startOfYear(subYears(now, 1)), to: endOfYear(subYears(now, 1)) },\n thisYear: { label: 'Этот год', group: 'year', from: yearStart, to: endOfYear(now) },\n nextYear: { label: 'Следующий год', group: 'year', from: startOfYear(addYears(now, 1)), to: endOfYear(addYears(now, 1)) },\n\n fromBeginningOfThisWeek: { label: 'С начала этой недели', group: 'other', section: 'fromBeginning', from: startOfWeek(now, weekOptions), to: dayEnd },\n fromBeginningOfThisTenDays: { label: 'С начала этой декады', group: 'other', section: 'fromBeginning', from: decade.from, to: dayEnd },\n fromBeginningOfThisMonth: { label: 'С начала этого месяца', group: 'other', section: 'fromBeginning', from: monthStart, to: dayEnd },\n fromBeginningOfThisQuarter: { label: 'С начала этого квартала', group: 'other', section: 'fromBeginning', from: quarterStart, to: dayEnd },\n fromBeginningOfThisHalfYear: { label: 'С начала этого полугодия', group: 'other', section: 'fromBeginning', from: halfYearStart, to: dayEnd },\n fromBeginningOfThisYear: { label: 'С начала этого года', group: 'other', section: 'fromBeginning', from: yearStart, to: dayEnd },\n\n tillEndOfThisWeek: { label: 'До конца этой недели', group: 'other', section: 'tillEnd', from: dayStart, to: endOfWeek(now, weekOptions) },\n tillEndOfThisTenDays: { label: 'До конца этой декады', group: 'other', section: 'tillEnd', from: dayStart, to: decade.to },\n tillEndOfThisMonth: { label: 'До конца этого месяца', group: 'other', section: 'tillEnd', from: dayStart, to: endOfMonth(now) },\n tillEndOfThisQuarter: { label: 'До конца этого квартала', group: 'other', section: 'tillEnd', from: dayStart, to: endOfQuarter(now) },\n tillEndOfThisHalfYear: { label: 'До конца этого полугодия', group: 'other', section: 'tillEnd', from: dayStart, to: CalendarHelper.endOfHalfYear(now) },\n tillEndOfThisYear: { label: 'До конца этого года', group: 'other', section: 'tillEnd', from: dayStart, to: endOfYear(now) },\n\n lastWeekTillSameWeekDay: { label: 'Прошлая неделя, до такого же дня недели', group: 'other', section: 'lastTillSame', ...CalendarHelper.weekTillSameWeekday(now, -1) },\n lastTenDaysTillSameDayNumber: {\n label: 'Прошлая декада, до такого же номера дня',\n group: 'other',\n section: 'lastTillSame',\n ...CalendarHelper.decadeTillSameDayNumber(now, -1),\n },\n lastMonthTillSameDate: {\n label: 'Прошлый месяц, до такой же даты',\n group: 'other',\n section: 'lastTillSame',\n ...CalendarHelper.intervalTillSameDate(monthStart, startOfMonth(subMonths(now, 1)), now),\n },\n lastQuarterTillSameDate: {\n label: 'Прошлый квартал, до такой же даты',\n group: 'other',\n section: 'lastTillSame',\n ...CalendarHelper.intervalTillSameDate(quarterStart, startOfQuarter(subQuarters(now, 1)), now),\n },\n lastHalfYearTillSameDate: {\n label: 'Прошлое полугодие, до такой же даты',\n group: 'other',\n section: 'lastTillSame',\n ...CalendarHelper.intervalTillSameDate(halfYearStart, CalendarHelper.startOfHalfYear(previousHalfYear), now),\n },\n lastYearTillSameDate: {\n label: 'Прошлый год, до такой же даты',\n group: 'other',\n section: 'lastTillSame',\n ...CalendarHelper.intervalTillSameDate(yearStart, startOfYear(subYears(now, 1)), now),\n },\n\n nextWeekTillSameWeekDay: { label: 'Следующая неделя, до такого же дня недели', group: 'other', section: 'nextTillSame', ...CalendarHelper.weekTillSameWeekday(now, 1) },\n nextTenDaysTillSameDayNumber: {\n label: 'Следующая декада, до такого же номера дня',\n group: 'other',\n section: 'nextTillSame',\n ...CalendarHelper.decadeTillSameDayNumber(now, 1),\n },\n nextMonthTillSameDate: {\n label: 'Следующий месяц, до такой же даты',\n group: 'other',\n section: 'nextTillSame',\n ...CalendarHelper.intervalTillSameDate(monthStart, startOfMonth(addMonths(now, 1)), now),\n },\n nextQuarterTillSameDate: {\n label: 'Следующий квартал, до такой же даты',\n group: 'other',\n section: 'nextTillSame',\n ...CalendarHelper.intervalTillSameDate(quarterStart, startOfQuarter(addQuarters(now, 1)), now),\n },\n nextHalfYearTillSameDate: {\n label: 'Следующее полугодие, до такой же даты',\n group: 'other',\n section: 'nextTillSame',\n ...CalendarHelper.intervalTillSameDate(halfYearStart, CalendarHelper.startOfHalfYear(nextHalfYear), now),\n },\n nextYearTillSameDate: {\n label: 'Следующий год, до такой же даты',\n group: 'other',\n section: 'nextTillSame',\n ...CalendarHelper.intervalTillSameDate(yearStart, startOfYear(addYears(now, 1)), now),\n },\n\n last7Days: { label: 'Последние 7 дней', group: 'other', section: 'rollingDays', from: startOfDay(subDays(now, 6)), to: dayEnd },\n next7Days: { label: 'Следующие 7 дней', group: 'other', section: 'rollingDays', from: dayStart, to: endOfDay(addDays(now, 6)) },\n };\n }\n}\n","import { StandardPeriodGroupType } from '@sc/date-time/types/standard-period-group-type';\nimport { StandardPeriodSectionType } from '@sc/date-time/types/standard-period-section-type';\n\n/**\n * Порядок отображения и названия групп стандартных периодов.\n */\nexport const STANDARD_PERIOD_GROUPS: Array<{\n /**\n * Ключ группы.\n */\n key: StandardPeriodGroupType;\n\n /**\n * Название группы.\n */\n label: string;\n}> = [\n { key: 'day', label: 'День' },\n { key: 'week', label: 'Неделя' },\n { key: 'decade', label: 'Декада' },\n { key: 'month', label: 'Месяц' },\n { key: 'quarter', label: 'Квартал' },\n { key: 'halfYear', label: 'Полугодие' },\n { key: 'year', label: 'Год' },\n { key: 'other', label: 'Прочее' },\n];\n\n/**\n * Порядок отображения и названия разделов группы «Прочее».\n */\nexport const STANDARD_PERIOD_SECTIONS: Array<{\n /**\n * Ключ раздела.\n */\n key: StandardPeriodSectionType;\n\n /**\n * Название раздела.\n */\n label: string;\n}> = [\n { key: 'fromBeginning', label: 'С начала периода' },\n { key: 'tillEnd', label: 'До конца периода' },\n { key: 'lastTillSame', label: 'Прошлые, до такой же даты' },\n { key: 'nextTillSame', label: 'Следующие, до такой же даты' },\n { key: 'rollingDays', label: '7 дней' },\n];\n","import { IDiscountClient } from '@sc/discounts/interfaces/i-discount-client';\nimport { CityWithRegionAndCountry } from '@sc/references/classes/city-with-region-and-country';\nimport { ICityWithRegionAndCountry } from '@sc/references/interfaces/i-city-with-region-and-country';\nimport { NamedIdentity } from '@sc/system/classes/named-identity';\n\n/**\n * Краткие данные о клиенте в условиях скидки.\n */\nexport class DiscountClient extends NamedIdentity implements IDiscountClient {\n /**\n * @inheritDoc\n */\n public city?: ICityWithRegionAndCountry;\n\n /**\n * @inheritDoc\n */\n public isActive: boolean;\n\n /**\n * Инициализирует экземпляр класса {@link DiscountClient}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IDiscountClient>) {\n super(data);\n\n this.city = data?.city ? new CityWithRegionAndCountry(data.city) : undefined;\n this.isActive = data?.isActive ?? false;\n }\n}\n","import { DiscountClient } from '@sc/discounts/classes/discount-client';\nimport { IDiscountClient } from '@sc/discounts/interfaces/i-discount-client';\nimport { IDiscountConditions } from '@sc/discounts/interfaces/i-discount-conditions';\nimport { IDiscountConditionsSaveData } from '@sc/discounts/interfaces/i-discount-conditions-save-data';\nimport { CityWithRegionAndCountry } from '@sc/references/classes/city-with-region-and-country';\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 { 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 { UserShortInfo } from '@sc/user/classes/user-short-info';\nimport { IUserShortInfo } from '@sc/user/interfaces/i-user-short-info';\nimport { endOfDay, startOfDay } from 'date-fns';\nimport { isEmpty, map, some } from 'lodash-es';\n\n/**\n * Условия отбора клиентов, которым доступна скидка.\n */\nexport class DiscountConditions implements IDiscountConditions {\n /**\n * @inheritDoc\n */\n public salesDirections: ISalesDirection[];\n\n /**\n * @inheritDoc\n */\n public partnerGroups: IPartnerGroup[];\n\n /**\n * @inheritDoc\n */\n public managers: IUserShortInfo[];\n\n /**\n * @inheritDoc\n */\n public additionalClients: IDiscountClient[];\n\n /**\n * @inheritDoc\n */\n public fixedClients: IDiscountClient[];\n\n /**\n * @inheritDoc\n */\n public regions: IRegion[];\n\n /**\n * @inheritDoc\n */\n public cities: ICityWithRegionAndCountry[];\n\n /**\n * @inheritDoc\n */\n public lastLoginDate: IDatePeriod;\n\n /**\n * @inheritDoc\n */\n public lastOrderDate: IDatePeriod;\n\n /**\n * Инициализирует экземпляр класса {@link DiscountConditions}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IDiscountConditions>) {\n this.salesDirections = map(data?.salesDirections ?? [], (item) => new SalesDirection(item));\n this.partnerGroups = map(data?.partnerGroups ?? [], (item) => new PartnerGroup(item));\n this.managers = map(data?.managers ?? [], (item) => new UserShortInfo(item));\n this.additionalClients = map(data?.additionalClients ?? [], (item) => new DiscountClient(item));\n this.fixedClients = map(data?.fixedClients ?? [], (item) => new DiscountClient(item));\n this.regions = map(data?.regions ?? [], (item) => new Region(item));\n this.cities = map(data?.cities ?? [], (item) => new CityWithRegionAndCountry(item));\n this.lastLoginDate = new DatePeriod(data?.lastLoginDate);\n this.lastOrderDate = new DatePeriod(data?.lastOrderDate);\n }\n\n /**\n * Возвращает признак того, что задано хотя бы одно условие отбора клиентов.\n *\n * Скидка без условий отбора клиентов доступна всем клиентам.\n */\n public hasClientConditions(): boolean {\n return (\n some([this.salesDirections, this.partnerGroups, this.managers, this.additionalClients, this.fixedClients, this.regions, this.cities], (list) => !isEmpty(list)) ||\n some([this.lastLoginDate, this.lastOrderDate], (period) => !!period.from || !!period.to)\n );\n }\n\n /**\n * Устанавливает период последнего входа или последнего заказа клиента целыми днями:\n * начало периода с начала дня, окончание до конца дня.\n *\n * @param key Название условия.\n * @param period Период; при отсутствии условие сбрасывается.\n */\n public setPeriod(key: 'lastLoginDate' | 'lastOrderDate', period?: IDatePeriod | null): this {\n // eslint-disable-next-line security/detect-object-injection\n this[key] = new DatePeriod({ from: period?.from ? startOfDay(period.from) : null, to: period?.to ? endOfDay(period.to) : null });\n\n return this;\n }\n\n /**\n * Возвращает условия для сохранения скидки.\n */\n public toSaveData(): IDiscountConditionsSaveData {\n return {\n salesDirections: map(this.salesDirections, 'id'),\n partnerGroups: map(this.partnerGroups, 'id'),\n managers: map(this.managers, 'id'),\n additionalClients: map(this.additionalClients, 'id'),\n regions: map(this.regions, 'id'),\n cities: map(this.cities, 'id'),\n lastLoginDate: new DatePeriod(this.lastLoginDate),\n lastOrderDate: new DatePeriod(this.lastOrderDate),\n };\n }\n}\n","import { useBaseConfigStateStore } from '@sc/config/states/config-state-store';\nimport { round } from 'lodash-es';\n\n/**\n * Класс-помощник для работы со скидками.\n */\nexport class DiscountHelper {\n /**\n * Возвращает коэффициент стоимости товара от розничной цены для указанного процента скидки\n * с точностью коэффициента из настроек приложения.\n *\n * @param percent Процент скидки (10 для скидки 10 %).\n */\n public static percentToCostCoefficient(percent: number): number {\n return round((100 - percent) / 100, useBaseConfigStateStore().config.numberPrecision.priceCoefficient);\n }\n}\n","/**\n * Состояние скидки по датам начала и окончания действия.\n */\nexport enum DiscountStateEnum {\n /**\n * Скидка действует.\n */\n Active = 'active',\n\n /**\n * Скидка начнёт действовать позже.\n */\n Scheduled = 'scheduled',\n\n /**\n * Скидка завершена или удалена.\n */\n Completed = 'completed',\n}\n","import { IDiscountShortInfo } from '@sc/catalog/interfaces/i-discount-short-info';\nimport { DiscountStateEnum } from '@sc/discounts/enums/discount-state-enum';\n\n/**\n * Класс-помощник для определения состояния скидки.\n */\nexport class DiscountStateHelper {\n /**\n * Возвращает состояние скидки на указанный момент по датам начала и окончания действия.\n *\n * @param discount Данные скидки с датами начала и окончания действия.\n * @param now Момент, на который определяется состояние.\n */\n public static resolve(discount: Pick<IDiscountShortInfo, 'publishedAt' | 'deletedAt'>, now: Date = new Date()): DiscountStateEnum {\n if (discount.deletedAt && discount.deletedAt.getTime() <= now.getTime()) {\n return DiscountStateEnum.Completed;\n }\n\n if (discount.publishedAt && discount.publishedAt.getTime() > now.getTime()) {\n return DiscountStateEnum.Scheduled;\n }\n\n return DiscountStateEnum.Active;\n }\n}\n","import { Category } from '@sc/catalog/classes/category';\nimport { DiscountShortInfo } from '@sc/catalog/classes/discount-short-info';\nimport { Product } from '@sc/catalog/classes/product';\nimport { ICategory } from '@sc/catalog/interfaces/i-category';\nimport { IProduct } from '@sc/catalog/interfaces/i-product';\nimport { DiscountConditions } from '@sc/discounts/classes/discount-conditions';\nimport { DiscountStateEnum } from '@sc/discounts/enums/discount-state-enum';\nimport { DiscountHelper } from '@sc/discounts/helpers/discount-helper';\nimport { DiscountStateHelper } from '@sc/discounts/helpers/discount-state-helper';\nimport { IDiscount } from '@sc/discounts/interfaces/i-discount';\nimport { IDiscountSaveData } from '@sc/discounts/interfaces/i-discount-save-data';\nimport { map } from 'lodash-es';\n\n/**\n * Полные данные о скидке.\n */\nexport class Discount extends DiscountShortInfo implements IDiscount {\n /**\n * @inheritDoc\n */\n public conditions: DiscountConditions;\n\n /**\n * @inheritDoc\n */\n public products: IProduct[];\n\n /**\n * @inheritDoc\n */\n public productCategories: ICategory[];\n\n /**\n * @inheritDoc\n */\n public countDiscountedPrices: number;\n\n /**\n * @inheritDoc\n */\n public expectedCountDiscountedPrices: number;\n\n /**\n * @inheritDoc\n */\n public countDiscountedProducts: number;\n\n /**\n * @inheritDoc\n */\n public countDiscountedClients: number;\n\n /**\n * Инициализирует экземпляр класса {@link Discount}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IDiscount>) {\n super(data);\n\n this.conditions = new DiscountConditions(data?.conditions);\n this.products = map(data?.products ?? [], (product) => new Product(product));\n this.productCategories = map(data?.productCategories ?? [], (category) => new Category(category));\n this.countDiscountedPrices = data?.countDiscountedPrices ?? 0;\n this.expectedCountDiscountedPrices = data?.expectedCountDiscountedPrices ?? 0;\n this.countDiscountedProducts = data?.countDiscountedProducts ?? 0;\n this.countDiscountedClients = data?.countDiscountedClients ?? 0;\n }\n\n /**\n * Возвращает состояние скидки на указанный момент.\n *\n * @param now Момент, на который определяется состояние.\n */\n public getState(now: Date = new Date()): DiscountStateEnum {\n return DiscountStateHelper.resolve(this, now);\n }\n\n /**\n * Переносит счётчики цен, товаров и клиентов из указанной скидки, не затрагивая остальные данные.\n *\n * @param source Скидка с актуальными значениями счётчиков.\n */\n public assignCounters(source: IDiscount): void {\n this.countDiscountedPrices = source.countDiscountedPrices;\n this.expectedCountDiscountedPrices = source.expectedCountDiscountedPrices;\n this.countDiscountedProducts = source.countDiscountedProducts;\n this.countDiscountedClients = source.countDiscountedClients;\n }\n\n /**\n * Возвращает признак того, что скидка ещё не применена ко всем клиентским ценам, которые ей соответствуют.\n */\n public isPricesUpdating(): boolean {\n return this.countDiscountedPrices !== this.expectedCountDiscountedPrices;\n }\n\n /**\n * Возвращает данные скидки для сохранения.\n */\n public toSaveData(): IDiscountSaveData {\n return {\n name: this.name,\n costCoefficient: DiscountHelper.percentToCostCoefficient(this.percent),\n isLowPriceAllowed: this.isLowPriceAllowed,\n publishedAt: this.publishedAt ?? null,\n deletedAt: this.deletedAt ?? null,\n description: this.description ?? '',\n products: map(this.products, 'id'),\n productCategories: map(this.productCategories, 'id'),\n conditions: this.conditions.toSaveData(),\n };\n }\n}\n","import { DiscountClient } from '@sc/discounts/classes/discount-client';\nimport { IDiscountClient } from '@sc/discounts/interfaces/i-discount-client';\nimport { IDiscountClientEligibility } from '@sc/discounts/interfaces/i-discount-client-eligibility';\n\n/**\n * Данные о том, по каким условиям клиент подходит под скидку.\n */\nexport class DiscountClientEligibility implements IDiscountClientEligibility {\n /**\n * @inheritDoc\n */\n public client: IDiscountClient;\n\n /**\n * @inheritDoc\n */\n public additionalClientsCondition: boolean;\n\n /**\n * @inheritDoc\n */\n public fixedClientsCondition: boolean;\n\n /**\n * @inheritDoc\n */\n public partnerGroupsCondition: boolean;\n\n /**\n * @inheritDoc\n */\n public managersCondition: boolean;\n\n /**\n * @inheritDoc\n */\n public citiesCondition: boolean;\n\n /**\n * @inheritDoc\n */\n public regionsCondition: boolean;\n\n /**\n * @inheritDoc\n */\n public salesDirectionsCondition: boolean;\n\n /**\n * Инициализирует экземпляр класса {@link DiscountClientEligibility}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IDiscountClientEligibility>) {\n this.client = new DiscountClient(data?.client);\n this.additionalClientsCondition = data?.additionalClientsCondition ?? false;\n this.fixedClientsCondition = data?.fixedClientsCondition ?? false;\n this.partnerGroupsCondition = data?.partnerGroupsCondition ?? false;\n this.managersCondition = data?.managersCondition ?? false;\n this.citiesCondition = data?.citiesCondition ?? false;\n this.regionsCondition = data?.regionsCondition ?? false;\n this.salesDirectionsCondition = data?.salesDirectionsCondition ?? false;\n }\n\n /**\n * Возвращает признак того, что у клиента выполнено хотя бы одно условие отбора скидки.\n */\n public isEligible(): boolean {\n return (\n this.additionalClientsCondition ||\n this.fixedClientsCondition ||\n this.partnerGroupsCondition ||\n this.managersCondition ||\n this.citiesCondition ||\n this.regionsCondition ||\n this.salesDirectionsCondition\n );\n }\n}\n","import { DiscountStateEnum } from '@sc/discounts/enums/discount-state-enum';\nimport { IDiscountsListFilters } from '@sc/discounts/interfaces/i-discounts-list-filters';\nimport { PaginationFiltersBase } from '@sc/pagination/filters/pagination-filters-base';\n\n/**\n * Данные о параметрах фильтрации списка скидок.\n */\nexport class DiscountsListFilters extends PaginationFiltersBase implements IDiscountsListFilters {\n /**\n * @inheritDoc\n */\n public id?: string;\n\n /**\n * @inheritDoc\n */\n public name?: string;\n\n /**\n * @inheritDoc\n */\n public states?: DiscountStateEnum[];\n\n /**\n * Инициализирует экземпляр класса {@link DiscountsListFilters}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IDiscountsListFilters) {\n super();\n\n this.id = data?.id;\n this.name = data?.name;\n this.states = data?.states;\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 'states':\n // eslint-disable-next-line security/detect-object-injection\n this[key] = undefined;\n break;\n default:\n break;\n }\n\n return this;\n }\n}\n","import { DiscountShortInfo } from '@sc/catalog/classes/discount-short-info';\nimport { IDiscountShortInfo } from '@sc/catalog/interfaces/i-discount-short-info';\nimport { DateHelper } from '@sc/date-time/helpers/date-helper';\nimport { Discount } from '@sc/discounts/classes/discount';\nimport { DiscountClientEligibility } from '@sc/discounts/classes/discount-client-eligibility';\nimport { IDiscount } from '@sc/discounts/interfaces/i-discount';\nimport { IDiscountClientEligibility } from '@sc/discounts/interfaces/i-discount-client-eligibility';\nimport { IDiscountSaveData } from '@sc/discounts/interfaces/i-discount-save-data';\nimport { IDiscountSaveRequestData } from '@sc/discounts/interfaces/i-discount-save-request-data';\nimport { IPaginatedResponse } from '@sc/pagination/interfaces/i-paginated-response';\nimport { BasePaginationProvider } from '@sc/pagination/providers/base-pagination-provider';\nimport { IFilterGroup } from '@sc/table-data/interfaces/i-filter-group';\nimport { IPaginationRequestParams } from '@sc/table-data/interfaces/i-pagination-request-params';\nimport { ISortRequestParams } from '@sc/table-data/interfaces/i-sort-request-params';\nimport { IFieldValidationResultData } from '@sc/validation/interfaces/i-field-validation-result-data';\n\n/**\n * Предоставляет механизмы получения/управления скидками и акциями.\n */\nexport class DiscountProvider extends BasePaginationProvider {\n /**\n * Возвращает данные скидки, подготовленные для запроса сохранения.\n *\n * @param data Данные скидки.\n * @param updateFixedClients Признак того, что список клиентов по датам последнего входа и заказа необходимо подобрать заново.\n */\n private static prepareSaveData(data: IDiscountSaveData, updateFixedClients: boolean): IDiscountSaveRequestData {\n return {\n ...data,\n publishedAt: DateHelper.toApiFormat(data.publishedAt),\n deletedAt: DateHelper.toApiFormat(data.deletedAt),\n conditions: {\n ...data.conditions,\n lastLoginDate: DateHelper.periodToApiFormat(data.conditions.lastLoginDate),\n lastOrderDate: DateHelper.periodToApiFormat(data.conditions.lastOrderDate),\n updateFixedClients,\n },\n };\n }\n\n /**\n * Возвращает список скидок, включая завершённые.\n *\n * @param filters Параметры фильтрации данных.\n * @param sortParams Параметры сортировки.\n * @param paginationParams Параметры пагинации.\n * @param signal Сигнал отмены запроса.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_discount_get_list\n */\n public getDiscountsList(\n filters?: IFilterGroup,\n sortParams?: ISortRequestParams[] | ISortRequestParams,\n paginationParams?: IPaginationRequestParams,\n signal: AbortSignal | undefined = undefined\n ): Promise<IPaginatedResponse<IDiscountShortInfo>> {\n return this.getTypedPaginated(DiscountShortInfo, '/internal/price/discounts', filters, sortParams, paginationParams, {}, undefined, signal);\n }\n\n /**\n * Возвращает полные данные о скидке.\n *\n * @param discountId Идентификатор скидки.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_discount_get\n */\n public getDiscount(discountId: number): Promise<IDiscount> {\n return this.get<IDiscount>(`/internal/price/discounts/${discountId}`, {}, (response) => new Discount(response.data));\n }\n\n /**\n * Создаёт новую скидку.\n *\n * @param data Данные для создания скидки.\n * @param updateFixedClients Признак того, что список клиентов по датам последнего входа и заказа необходимо подобрать заново.\n * @param validationFieldResultData Список полей, для которых необходимо\n * установить данные об ошибках валидации\n * в случае ошибок в запросах.\n * Ошибка размера скидки приходит по ключу `costCoefficient`.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_discount_create\n */\n public createDiscount(data: IDiscountSaveData, updateFixedClients: boolean, validationFieldResultData: Record<string, IFieldValidationResultData> = {}): Promise<IDiscount> {\n return this.post<IDiscount>(\n '/internal/price/discounts',\n DiscountProvider.prepareSaveData(data, updateFixedClients),\n (response) => new Discount(response.data),\n validationFieldResultData\n );\n }\n\n /**\n * Изменяет данные о скидке.\n *\n * @param discountId Идентификатор скидки.\n * @param data Данные для изменения скидки.\n * @param updateFixedClients Признак того, что список клиентов по датам последнего входа и заказа необходимо подобрать заново.\n * @param validationFieldResultData Список полей, для которых необходимо\n * установить данные об ошибках валидации\n * в случае ошибок в запросах.\n * Ошибка размера скидки приходит по ключу `costCoefficient`.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_discount_change\n */\n public updateDiscount(\n discountId: number,\n data: IDiscountSaveData,\n updateFixedClients: boolean,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<IDiscount> {\n return this.patch<IDiscount>(\n `/internal/price/discounts/${discountId}`,\n DiscountProvider.prepareSaveData(data, updateFixedClients),\n (response) => new Discount(response.data),\n validationFieldResultData\n );\n }\n\n /**\n * Завершает скидку текущим моментом.\n *\n * @param discountId Идентификатор скидки.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_discount_delete\n */\n public removeDiscount(discountId: number): Promise<void> {\n return this.delete(`/internal/price/discounts/${discountId}`);\n }\n\n /**\n * Возвращает список клиентов, подходящих под скидку, с условиями, по которым они подходят.\n *\n * @param discountId Идентификатор скидки.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_discount_clients_get\n */\n public getEligibleClients(discountId: number): Promise<IDiscountClientEligibility[]> {\n return this.getTypedList(DiscountClientEligibility, `/internal/price/discounts/${discountId}/clients`);\n }\n\n /**\n * Проверяет, подходит ли клиент под скидку.\n *\n * @param discountId Идентификатор скидки.\n * @param clientId Идентификатор клиента.\n *\n * @see /doc/api/internal#/operations/api_internal_catalog_price_discount_clients_check\n */\n public checkClient(discountId: number, clientId: number): Promise<IDiscountClientEligibility> {\n return this.get<IDiscountClientEligibility>(\n `/internal/price/discounts/${discountId}/clients/${clientId}/check`,\n {},\n (response) => new DiscountClientEligibility(response.data)\n );\n }\n}\n","import { IFaqGroup } from '@sc/faq/interfaces/i-faq-group';\nimport { NamedIdentity } from '@sc/system/classes/named-identity';\n\n/**\n * Данные о группе часто задаваемых вопросов.\n */\nexport class FaqGroup extends NamedIdentity implements IFaqGroup {\n /**\n * Инициализирует экземпляр класса {@link FaqGroup}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IFaqGroup>) {\n super(data);\n }\n}\n","import { FaqGroup } from '@sc/faq/classes/faq-group';\nimport { IFaq } from '@sc/faq/interfaces/i-faq';\nimport { IFaqGroup } from '@sc/faq/interfaces/i-faq-group';\nimport { IFaqSaveData } from '@sc/faq/interfaces/i-faq-save-data';\nimport { Identity } from '@sc/system/classes/identity';\nimport { map } from 'lodash-es';\n\n/**\n * Данные о часто задаваемом вопросе и ответе на него.\n */\nexport class Faq extends Identity implements IFaq {\n /**\n * @inheritDoc\n */\n public question: string;\n\n /**\n * @inheritDoc\n */\n public answer: string;\n\n /**\n * @inheritDoc\n */\n public groups: IFaqGroup[];\n\n /**\n * Инициализирует экземпляр класса {@link Faq}.\n *\n * Портал не передаёт поле групп, если вопрос не относится ни к одной группе.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IFaq>) {\n super(data, -1);\n\n this.question = data?.question ?? '';\n this.answer = data?.answer ?? '';\n this.groups = map(data?.groups ?? [], (group) => new FaqGroup(group));\n }\n\n /**\n * Возвращает данные вопроса для отправки на портал.\n */\n public toSaveData(): IFaqSaveData {\n return {\n question: this.question,\n answer: this.answer,\n groups: map(this.groups, 'id'),\n };\n }\n}\n","import { Faq } from '@sc/faq/classes/faq';\nimport { FaqGroup } from '@sc/faq/classes/faq-group';\nimport { IFaq } from '@sc/faq/interfaces/i-faq';\nimport { IFaqGroup } from '@sc/faq/interfaces/i-faq-group';\nimport { IFaqGroupSaveData } from '@sc/faq/interfaces/i-faq-group-save-data';\nimport { IFaqSaveData } from '@sc/faq/interfaces/i-faq-save-data';\nimport { IPaginatedResponse } from '@sc/pagination/interfaces/i-paginated-response';\nimport { BasePaginationProvider } from '@sc/pagination/providers/base-pagination-provider';\nimport { IPaginationRequestParams } from '@sc/table-data/interfaces/i-pagination-request-params';\nimport { IFieldValidationResultData } from '@sc/validation/interfaces/i-field-validation-result-data';\nimport { isNil } from 'lodash-es';\n\n/**\n * Предоставляет механизмы получения/управления часто задаваемыми вопросами и их группами.\n */\nexport class FaqProvider extends BasePaginationProvider {\n /**\n * Возвращает список часто задаваемых вопросов.\n *\n * @param groupId Идентификатор группы, вопросы которой необходимо получить. Если не задан, возвращаются все вопросы.\n * @param paginationParams Параметры пагинации.\n *\n * @see /doc/api/internal#/operations/api_internal_faq_get_list\n */\n public getFaqList(groupId?: number | null, paginationParams?: IPaginationRequestParams): Promise<IPaginatedResponse<IFaq>> {\n return this.getTypedPaginated(Faq, '/internal/faq', undefined, undefined, paginationParams, isNil(groupId) ? {} : { group: groupId });\n }\n\n /**\n * Возвращает данные о часто задаваемом вопросе.\n *\n * @param faqId Идентификатор вопроса.\n *\n * @see /doc/api/internal#/operations/api_internal_faq_get\n */\n public getFaq(faqId: number): Promise<IFaq> {\n return this.get<IFaq>(`/internal/faq/${faqId}`, {}, (response) => new Faq(response.data));\n }\n\n /**\n * Создаёт новый часто задаваемый вопрос.\n *\n * @param data Данные для создания вопроса.\n * @param validationFieldResultData Список полей, для которых необходимо\n * установить данные об ошибках валидации\n * в случае ошибок в запросах.\n *\n * @see /doc/api/internal#/operations/api_internal_faq_create\n */\n public createFaq(data: IFaqSaveData, validationFieldResultData: Record<string, IFieldValidationResultData> = {}): Promise<IFaq> {\n return this.post<IFaq>('/internal/faq', data, (response) => new Faq(response.data), validationFieldResultData);\n }\n\n /**\n * Изменяет данные о часто задаваемом вопросе.\n *\n * @param faqId Идентификатор вопроса.\n * @param data Данные для изменения вопроса.\n * @param validationFieldResultData Список полей, для которых необходимо\n * установить данные об ошибках валидации\n * в случае ошибок в запросах.\n *\n * @see /doc/api/internal#/operations/api_internal_faq_update\n */\n public updateFaq(faqId: number, data: IFaqSaveData, validationFieldResultData: Record<string, IFieldValidationResultData> = {}): Promise<IFaq> {\n return this.patch<IFaq>(`/internal/faq/${faqId}`, data, (response) => new Faq(response.data), validationFieldResultData);\n }\n\n /**\n * Удаляет часто задаваемый вопрос.\n *\n * @param faqId Идентификатор вопроса.\n *\n * @see /doc/api/internal#/operations/api_internal_faq_delete\n */\n public removeFaq(faqId: number): Promise<void> {\n return this.delete(`/internal/faq/${faqId}`);\n }\n\n /**\n * Возвращает список групп часто задаваемых вопросов.\n *\n * @see /doc/api/internal#/operations/api_internal_faq_groups_get_list\n */\n public getGroupsList(): Promise<IFaqGroup[]> {\n return this.getTypedList(FaqGroup, '/internal/faq/groups');\n }\n\n /**\n * Создаёт новую группу часто задаваемых вопросов.\n *\n * @param data Данные для создания группы.\n * @param validationFieldResultData Список полей, для которых необходимо\n * установить данные об ошибках валидации\n * в случае ошибок в запросах.\n *\n * @see /doc/api/internal#/operations/api_internal_faq_groups_create\n */\n public createGroup(data: IFaqGroupSaveData, validationFieldResultData: Record<string, IFieldValidationResultData> = {}): Promise<IFaqGroup> {\n return this.post<IFaqGroup>('/internal/faq/groups', data, (response) => new FaqGroup(response.data), validationFieldResultData);\n }\n\n /**\n * Изменяет данные о группе часто задаваемых вопросов.\n *\n * @param groupId Идентификатор группы.\n * @param data Данные для изменения группы.\n * @param validationFieldResultData Список полей, для которых необходимо\n * установить данные об ошибках валидации\n * в случае ошибок в запросах.\n *\n * @see /doc/api/internal#/operations/api_internal_faq_groups_update\n */\n public updateGroup(groupId: number, data: IFaqGroupSaveData, validationFieldResultData: Record<string, IFieldValidationResultData> = {}): Promise<IFaqGroup> {\n return this.patch<IFaqGroup>(`/internal/faq/groups/${groupId}`, data, (response) => new FaqGroup(response.data), validationFieldResultData);\n }\n\n /**\n * Удаляет группу часто задаваемых вопросов. Вопросы группы при этом не удаляются.\n *\n * @param groupId Идентификатор группы.\n *\n * @see /doc/api/internal#/operations/api_internal_faq_groups_delete\n */\n public removeGroup(groupId: number): Promise<void> {\n return this.delete(`/internal/faq/groups/${groupId}`);\n }\n}\n","import { round } from 'lodash-es';\n\n/**\n * Форматирует относительное изменение как процент со знаком.\n *\n * @param value Доля изменения (0.12 → +12%).\n */\nexport function formatPercentChange(value: number): string {\n const percent = round(value * 100);\n\n return `${percent >= 0 ? '+' : ''}${percent}%`;\n}\n","import { IProduct } from '@sc/catalog/interfaces/i-product';\n\n/**\n * Класс-помощник для работы со значениями единиц измерения товара.\n */\n\nexport class UnitsHelper {\n /**\n * Возвращает признак, что указанный товар имеет линейную единицу измерения.\n *\n * @param product Данные о товаре для которого нужно проверить линейность его единицы измерения.\n */\n public static productIsMeasurable(product: IProduct): boolean {\n return product.unit.isLinear || product.unit.isSquare;\n }\n\n /**\n * Возвращает кратность количества для указанного товара.\n *\n * @param product Данные о товаре для которого необходимо вернуть кратность количества.\n */\n public static getProductMultiplicity(product: IProduct): number {\n return !product.properties?.ignoreMinCountCheck && product.properties?.minCount != null && !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 != null) {\n return product.properties.lengthStep;\n }\n\n return !product.properties?.ignoreMinCountCheck && product.properties?.minCount != null ? product.properties.minCount : 0.01;\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 { useBaseConfigStateStore } from '@sc/config/states/config-state-store';\nimport { HttpRequester } from '@sc/http/classes/http-requester';\nimport { HttpRequestParams } from '@sc/http/types/http-request-params';\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 = useBaseConfigStateStore().config.http.responseDataCacheTimeout as number;\n }\n\n /**\n * Сохраняет указанные данные из запроса в кэш результатов.\n *\n * @param key Ключ кэша (URL запроса или URL с сериализованными params).\n * @param data Данные для кэширования.\n */\n protected cacheResponse(key: string, data: any): void {\n HttpCachedRequester.responseDataCache.set(key, {\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 * @param signal Сигнал отмены запроса.\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: HttpRequestParams = {},\n signal: AbortSignal | undefined = undefined\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.getTypedList<OutDataInterface, SourceDataInterface>(type, url, params, false, signal).then((responseData) => {\n if (useResponseDataCache && responseData) {\n this.cacheResponse(cacheKey, responseData);\n }\n\n return responseData;\n });\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 = TypedInstanceFactory.instanceListInitializer(Manager, data.data);\n\n this.cacheResponse(url, responseData);\n\n return responseData;\n }\n\n /**\n * Возвращает {@link Promise} для получения полных данных о менеджере с указанным идентификатором.\n *\n * @param managerId Идентификатор менеджера.\n *\n * @see /doc/api/internal#/operations/api_internal_managers_get\n */\n public getManager(managerId: number): Promise<IManager> {\n return this.get<IManager>(`/internal/managers/${managerId}`, {}, (response) => new Manager(response.data));\n }\n}\n","/**\n * Статус актуализации заказа-черновика, созданного из файла Профстрой.\n */\nexport enum OfferActualizationStatus {\n /**\n * Выполняется обработка файла и обмен с 1С.\n */\n Processing = 'processing',\n\n /**\n * Обработка завершена успешно.\n */\n Completed = 'completed',\n\n /**\n * Обработка завершилась с ошибкой.\n */\n Error = 'error',\n\n /**\n * Состав записи изменён после последней успешной обработки, требуется повторная актуализация.\n */\n NeedsActualization = 'needs_actualization',\n}\n","import { DateHelper } from '@sc/date-time/helpers/date-helper';\nimport { OfferActualizationStatus } from '@sc/offers/enums/offer-actualization-status';\nimport { IOfferActualization } from '@sc/offers/interfaces/i-offer-actualization';\nimport { isNil } from 'lodash-es';\n\n/**\n * Данные об актуализации заказа-черновика, созданного из файла Профстрой.\n */\nexport class OfferActualization implements IOfferActualization {\n /**\n * @inheritDoc\n */\n public status: OfferActualizationStatus;\n\n /**\n * @inheritDoc\n */\n public actualizedAt?: Date;\n\n /**\n * @inheritDoc\n */\n public expiresAt?: Date;\n\n /**\n * @inheritDoc\n */\n public error?: string;\n\n /**\n * Инициализирует экземпляр класса {@link OfferActualization}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IOfferActualization>) {\n this.status = data?.status ?? OfferActualizationStatus.Processing;\n this.actualizedAt = DateHelper.parse(data?.actualizedAt);\n this.expiresAt = DateHelper.parse(data?.expiresAt);\n this.error = data?.error;\n }\n\n /**\n * @inheritDoc\n */\n public get isProcessing(): boolean {\n return this.status === OfferActualizationStatus.Processing;\n }\n\n /**\n * @inheritDoc\n */\n public get isOutdated(): boolean {\n return this.isOutdatedAt(new Date());\n }\n\n /**\n * @inheritDoc\n */\n public get isOrderAllowed(): boolean {\n return this.isOrderAllowedAt(new Date());\n }\n\n /**\n * @inheritDoc\n */\n public isOutdatedAt(now: Date): boolean {\n if (this.status !== OfferActualizationStatus.Completed || isNil(this.actualizedAt)) {\n return true;\n }\n\n // Момент, равный сроку истечения, ещё допустим: так же проверяет и сервер.\n return !isNil(this.expiresAt) && this.expiresAt.getTime() < now.getTime();\n }\n\n /**\n * @inheritDoc\n */\n public isOrderAllowedAt(now: Date): boolean {\n return this.status === OfferActualizationStatus.Completed && !this.isOutdatedAt(now);\n }\n}\n","import { ClientShortInfo } from '@sc/clients/classes/client-short-info';\nimport { IClientShortInfo } from '@sc/clients/interfaces/i-client-short-info';\nimport { OfferActualization } from '@sc/offers/classes/offer-actualization';\nimport { IOfferActualization } from '@sc/offers/interfaces/i-offer-actualization';\nimport { IOfferShortInfo } from '@sc/offers/interfaces/i-offer-short-info';\nimport { IProfstroyOfferFile } from '@sc/offers/interfaces/i-profstroy-offer-file';\nimport { CreatableIdentity } from '@sc/system/classes/creatable-identity';\n\n/**\n * Краткие данные о заказе-черновике.\n */\nexport class OfferShortInfo extends CreatableIdentity implements IOfferShortInfo {\n /**\n * @inheritDoc\n */\n public name?: string;\n\n /**\n * @inheritDoc\n */\n public client: IClientShortInfo;\n\n /**\n * @inheritDoc\n */\n public sum?: number;\n\n /**\n * @inheritDoc\n */\n public isProfstroy?: boolean;\n\n /**\n * @inheritDoc\n */\n public actualization?: IOfferActualization;\n\n /**\n * @inheritDoc\n */\n public file?: IProfstroyOfferFile;\n\n /**\n * Инициализирует экземпляр класса {@link OfferShortInfo}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IOfferShortInfo>) {\n super(data);\n\n this.name = data?.name;\n this.client = new ClientShortInfo(data?.client);\n this.sum = data?.sum;\n this.isProfstroy = data?.isProfstroy;\n this.actualization = data?.actualization && new OfferActualization(data.actualization);\n this.file = data?.file;\n }\n}\n","import { OrderItem } from '@sc/cart/classes/order-item';\nimport { IProfstroyOfferItem } from '@sc/offers/interfaces/i-profstroy-offer-item';\nimport { isEmpty, isNil } from 'lodash-es';\n\n/**\n * Позиция заказа-черновика, созданного из файла Профстрой.\n */\nexport class ProfstroyOfferItem extends OrderItem<undefined, string> implements IProfstroyOfferItem {\n /**\n * @inheritDoc\n */\n public groupName?: string;\n\n /**\n * @inheritDoc\n */\n public supplierSku?: string;\n\n /**\n * @inheritDoc\n */\n public isIgnored?: boolean;\n\n /**\n * @inheritDoc\n */\n public lineError?: string;\n\n /**\n * Инициализирует экземпляр класса {@link ProfstroyOfferItem}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data: IProfstroyOfferItem) {\n super(data);\n\n this.groupName = data.groupName;\n this.supplierSku = data.supplierSku ?? data.product.supplierSku;\n this.isIgnored = data.isIgnored;\n this.lineError = data.lineError;\n }\n\n /**\n * @inheritDoc\n */\n public get isProductStub(): boolean {\n return isNil(this.product.id);\n }\n\n /**\n * @inheritDoc\n */\n public get isOrderable(): boolean {\n return !this.isProductStub && !this.isIgnored && isEmpty(this.lineError);\n }\n}\n","import { OrderItem } from '@sc/cart/classes/order-item';\nimport { IOrderItem } from '@sc/cart/interfaces/i-order-item';\nimport { OfferShortInfo } from '@sc/offers/classes/offer-short-info';\nimport { ProfstroyOfferItem } from '@sc/offers/classes/profstroy-offer-item';\nimport { IOffer } from '@sc/offers/interfaces/i-offer';\nimport { IProfstroyOfferItem } from '@sc/offers/interfaces/i-profstroy-offer-item';\n\n/**\n * Полные данные о заказе-черновике.\n */\nexport class Offer extends OfferShortInfo implements IOffer {\n /**\n * @inheritDoc\n */\n public sum: number;\n\n /**\n * @inheritDoc\n */\n public products: Array<OrderItem<undefined, string>>;\n\n /**\n * Инициализирует экземпляр класса {@link Offer}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data: Partial<IOffer>) {\n super(data);\n\n this.sum = data.sum ?? 0;\n // Позиции заявки Профстрой несут данные файла, у обычного черновика это обычные позиции корзины.\n this.products = (data.products ?? []).map((product: IOrderItem<undefined, string>) =>\n data.isProfstroy ? new ProfstroyOfferItem(product as IProfstroyOfferItem) : new OrderItem<undefined, string>(product)\n );\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any,@typescript-eslint/no-unnecessary-condition */\n\nimport { IOffersListFilters } from '@sc/offers/interfaces/i-offers-list-filters';\nimport { PaginationFiltersBase } from '@sc/pagination/filters/pagination-filters-base';\nimport { DatePeriod } from '@sc/system/classes/date-period';\nimport { IDatePeriod } from '@sc/system/interfaces/i-date-period';\n\n/**\n * Данные о параметрах фильтрации списка заказов-черновиков.\n */\nexport class OffersListFilters extends PaginationFiltersBase implements IOffersListFilters {\n /**\n * @inheritDoc\n */\n public id?: string;\n\n /**\n * @inheritDoc\n */\n public clientSearchTerm?: string;\n\n /**\n * @inheritDoc\n */\n public name?: string;\n\n /**\n * @inheritDoc\n */\n public createdAt: IDatePeriod = new DatePeriod();\n\n /**\n * Инициализирует экземпляр класса {@link OffersListFilters}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IOffersListFilters) {\n super();\n\n this.id = data?.id;\n this.clientSearchTerm = data?.clientSearchTerm;\n this.name = data?.name;\n this.createdAt = new DatePeriod(data?.createdAt);\n }\n\n /**\n * @inheritDoc\n */\n public resetFilterValue(key: string): this {\n if (key === 'createdAt') {\n this.createdAt.from = null;\n this.createdAt.to = null;\n } else {\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 }\n\n return this;\n }\n\n /**\n * @inheritDoc\n */\n public asClearRaw(): Record<string, any> {\n const result = super.asClearRaw();\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 return result;\n }\n}\n","import { OrderStatusEnum } from '@sc/references/enums/order-status-enum';\nimport { IOrderStatus } from '@sc/references/interfaces/i-order-status';\nimport { Reference } from '@sc/system/classes/reference';\n\n/**\n * Данные о статусе заказа.\n */\nexport class OrderStatus extends Reference<OrderStatusEnum> implements IOrderStatus {}\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 { OrderStatus } from '@sc/references/classes/order-status';\nimport { SalesDirection } from '@sc/references/classes/sales-direction';\nimport { Warehouse } from '@sc/references/classes/warehouse';\nimport { IOrderStatus } from '@sc/references/interfaces/i-order-status';\nimport { ISalesDirection } from '@sc/references/interfaces/i-sales-direction';\nimport { Reference } from '@sc/system/classes/reference';\nimport { IReference } from '@sc/system/interfaces/i-reference';\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 * @inheritDoc\n */\n public client: IClientShortInfo;\n\n /**\n * @inheritDoc\n */\n public payment: IOrderInfo['payment'];\n\n /**\n * @inheritDoc\n */\n public delivery: IOrderInfo['delivery'];\n\n /**\n * @inheritDoc\n */\n public attachedUser?: IUserShortInfo;\n\n /**\n * @inheritDoc\n */\n public status: IOrderStatus;\n\n /**\n * @inheritDoc\n */\n public statusDetail?: IReference;\n\n /**\n * @inheritDoc\n */\n public salesDirection: ISalesDirection;\n\n /**\n * @inheritDoc\n */\n public attachedAt?: Date;\n\n /**\n * @inheritDoc\n */\n public isOnOrder: boolean;\n\n /**\n * @inheritDoc\n */\n public isProfstroy: boolean;\n\n /**\n * @inheritDoc\n */\n public isNotInStock: boolean;\n\n /**\n * @inheritDoc\n */\n public sum: number;\n\n /**\n * @inheritDoc\n */\n public isLargeOrder: 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 = data?.attachedUser ? new UserShortInfo(data?.attachedUser) : undefined;\n this.status = new OrderStatus(data?.status);\n this.statusDetail = data?.statusDetail ? new Reference(data.statusDetail) : undefined;\n this.salesDirection = new SalesDirection(data?.salesDirection);\n this.attachedAt = isString(data?.attachedAt) ? parseISO(data.attachedAt as unknown as string) : data?.attachedAt;\n\n this.isOnOrder = data?.isOnOrder ?? false;\n this.isProfstroy = data?.isProfstroy ?? false;\n this.isNotInStock = data?.isNotInStock ?? false;\n this.sum = data?.sum ?? 0;\n this.isLargeOrder = data?.isLargeOrder ?? false;\n }\n}\n","import { ICartItemConfiguratorParamsBase } from '@sc/cart/interfaces/i-cart-item-configurator-params-base';\nimport { IOrderItem } from '@sc/cart/interfaces/i-order-item';\nimport { IOrderItemBase } from '@sc/cart/interfaces/i-order-item-base';\nimport { ClientProduct } from '@sc/catalog/classes/client-product';\nimport { IClientProduct } from '@sc/catalog/interfaces/i-client-product';\nimport { OrderItemBase } from '@sc/orders/classes/order-item-base';\nimport { Currency } from '@sc/references/classes/currency';\nimport { ICurrency } from '@sc/references/interfaces/i-currency';\nimport { isArray } from 'lodash-es';\n\n/**\n * Данные о единичной позиции товара/услуги в заказе (продукт заказа).\n */\nexport class OrderItem<T extends ICartItemConfiguratorParamsBase | undefined = undefined, TId = number> extends OrderItemBase<T, TId> implements IOrderItem<T, TId> {\n /**\n * @inheritDoc\n */\n public override product: IClientProduct;\n\n /**\n * @inheritDoc\n */\n public cost: number;\n\n /**\n * @inheritDoc\n */\n public costOne: number;\n\n /**\n * @inheritDoc\n */\n public costOneRub: number;\n\n /**\n * @inheritDoc\n */\n public costRub: number;\n\n /**\n * @inheritDoc\n */\n public logicGroupId?: string;\n\n /**\n * @inheritDoc\n */\n public salesDirection?: number;\n\n /**\n * @inheritDoc\n */\n public specificationImgUrl?: string;\n\n /**\n * @inheritDoc\n */\n public sawing?: Array<Record<string, number>>;\n\n /**\n * @inheritDoc\n */\n public override currency: ICurrency;\n\n /**\n * Список названий полей, значения которых отличаются между текущей позицией и позицией-заменителем.\n */\n public changedFields: string[] = [];\n\n /**\n * Продукт, которым заменена текущая запись.\n */\n public replacement?: IOrderItemBase;\n\n /**\n * Инициализирует экземпляр класса {@link OrderItem}.\n *\n * @param data Данные для первоначальной инициализации.\n * @param replacement Продукт, которым заменена текущая запись.\n */\n public constructor(data: IOrderItem<T, TId>, replacement?: IOrderItemBase) {\n super(data);\n\n this.product = new ClientProduct(data.product);\n this.currency = new 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 // eslint-disable-next-line sonarjs/no-nested-conditional\n this.sawing = isArray(data.sawing) ? data.sawing : data.sawing ? [data.sawing] : undefined;\n\n if (replacement) {\n this.replacement = replacement;\n\n if (this.quantity !== replacement.quantity) {\n this.changedFields.push('quantity');\n }\n\n if (this.length !== replacement.length) {\n this.changedFields.push('length');\n }\n }\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 { OrderItem } from '@sc/orders/classes/order-item';\nimport { OrderAction } from '@sc/orders/enums/order-action';\nimport { IOrder } from '@sc/orders/interfaces/i-order';\nimport { OrderStatus } from '@sc/references/classes/order-status';\nimport { IOrderStatus } from '@sc/references/interfaces/i-order-status';\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 * @inheritDoc\n */\n public products: OrderItem[];\n\n /**\n * @inheritDoc\n */\n public invoices?: string[];\n\n /**\n * @inheritDoc\n */\n public comment?: string;\n\n /**\n * @inheritDoc\n */\n public image?: string;\n\n /**\n * @inheritDoc\n */\n public contragent?: IContragentPerson | IContragentIc | IContragentUlR | IContragentUlNr;\n\n /**\n * @inheritDoc\n */\n public barcode?: string;\n\n /**\n * @inheritDoc\n */\n public orderSource?: IReference;\n\n /**\n * @inheritDoc\n */\n public isAllowProcessingWithoutPayment?: boolean;\n\n /**\n * @inheritDoc\n */\n public nextStatuses?: IOrderStatus[];\n\n /**\n * @inheritDoc\n */\n public actions?: OrderAction[];\n\n /**\n * @inheritDoc\n */\n public operatorsComment?: string;\n\n /**\n * @inheritDoc\n */\n public operatorsForWarehouseComment?: string;\n\n /**\n * @inheritDoc\n */\n public erpOrderUrl?: string;\n\n /**\n * @inheritDoc\n */\n public numberDoc?: string;\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) => {\n const replacement = product.replacementId ? data.products?.find((p) => p.id === product.replacementId) : undefined;\n\n return new OrderItem(product, replacement);\n });\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 this.nextStatuses = data.nextStatuses?.map((s) => new OrderStatus(s));\n this.actions = data.actions;\n this.operatorsComment = data.operatorsComment;\n this.operatorsForWarehouseComment = data.operatorsForWarehouseComment;\n this.erpOrderUrl = data.erpOrderUrl;\n this.numberDoc = data.numberDoc;\n }\n}\n","/* eslint-disable @typescript-eslint/no-unnecessary-condition,@typescript-eslint/no-unsafe-argument,@typescript-eslint/no-unsafe-member-access,vue/max-len */\n\nimport { ICartItemConfiguratorParamsBase } from '@sc/cart/interfaces/i-cart-item-configurator-params-base';\nimport { IOrderItemBase } from '@sc/cart/interfaces/i-order-item-base';\nimport { useBaseConfigStateStore } from '@sc/config/states/config-state-store';\nimport { Offer } from '@sc/offers/classes/offer';\nimport { OfferShortInfo } from '@sc/offers/classes/offer-short-info';\nimport { IOffer } from '@sc/offers/interfaces/i-offer';\nimport { IOfferSendData } from '@sc/offers/interfaces/i-offer-send-data';\nimport { IOfferShortInfo } from '@sc/offers/interfaces/i-offer-short-info';\nimport { Order } from '@sc/orders/classes/order';\nimport { IClientOrderCreateData } from '@sc/orders/interfaces/i-client-order-create-data';\nimport { IOrder } from '@sc/orders/interfaces/i-order';\nimport { IPaginatedResponse } from '@sc/pagination/interfaces/i-paginated-response';\nimport { BasePaginationProvider } from '@sc/pagination/providers/base-pagination-provider';\nimport { IFile } from '@sc/system/interfaces/i-file';\nimport { TypedInstanceFactory } from '@sc/system/providers/typed-instance-factory';\nimport { IFilterGroup } from '@sc/table-data/interfaces/i-filter-group';\nimport { IPaginationRequestParams } from '@sc/table-data/interfaces/i-pagination-request-params';\nimport { ISortRequestParams } from '@sc/table-data/interfaces/i-sort-request-params';\nimport { IFieldValidationResultData } from '@sc/validation/interfaces/i-field-validation-result-data';\nimport { format } from 'date-fns';\n\n/**\n * Предоставляет механизмы получения/управления данными о заказах-черновиках.\n */\nexport class OffersDataProvider extends BasePaginationProvider {\n /**\n * Возвращает список заказов-черновиков, удовлетворяющих указанным параметрам поиска.\n *\n * @param filters Параметры фильтрации данных.\n * @param sortParams Параметры сортировки.\n * @param paginationParams Параметры пагинации.\n * @param signal Сигнал отмены запроса.\n *\n * @see /doc/api/internal#/Заказы/api_internal_order_commercial_offer_get_list\n */\n public getOffers(\n filters?: IFilterGroup,\n sortParams?: ISortRequestParams[],\n paginationParams?: IPaginationRequestParams,\n signal: AbortSignal | undefined = undefined\n ): Promise<IPaginatedResponse<IOfferShortInfo>> {\n return this.getTypedPaginated(OfferShortInfo, '/internal/orders/offers', filters, sortParams, paginationParams, {}, undefined, signal);\n }\n\n /**\n * Создаёт заказ-черновик из содержимого корзины клиента и возвращает данные созданной записи.\n *\n * @param clientId Идентификатор клиента.\n * @param name Название создаваемой записи.\n * @param items Идентификаторы позиций корзины, которые необходимо перенести (частичный перенос).\n * Если не указаны, переносится вся корзина.\n *\n * @see /doc/api/internal#/Заказы/api_internal_order_commercial_offer_create\n */\n public createOfferFromCart(clientId: number, name?: string, items?: string[]): Promise<IOffer> {\n return this.post<IOffer>(\n `/internal/orders/offers/${clientId}`,\n {\n name,\n items: items?.length ? items : undefined,\n },\n (response) => new Offer(response.data)\n );\n }\n\n /**\n * Создаёт заказ-черновик из файла выгрузки программы «Профстрой» и запускает его обработку.\n * Обработка выполняется в фоне: запись возвращается в статусе актуализации «выполняется».\n *\n * @param clientId Идентификатор клиента.\n * @param file Файл выгрузки программы «Профстрой».\n * @param name Название создаваемой записи.\n * @param validationFieldResultData Список полей, для которых необходимо установить данные об ошибках\n * валидации в случае ошибок в запросах.\n *\n * @see /doc/api/internal#/Заказы/api_internal_order_commercial_offer_create_profstroy\n */\n public createProfstroyOffer(clientId: number, file: IFile, name?: string, validationFieldResultData: Record<string, IFieldValidationResultData> = {}): Promise<IOffer> {\n return this.post<IOffer>(`/internal/orders/offers/${clientId}/profstroy`, { file, name }, (response) => new Offer(response.data), validationFieldResultData);\n }\n\n /**\n * Запускает актуализацию заказа-черновика, созданного из файла «Профстрой»: текущий состав записи\n * повторно отправляется в 1С без повторной обработки файла. Выполняется в фоне.\n *\n * @param offerId Идентификатор записи заказа-черновика.\n *\n * @see /doc/api/internal#/Заказы/api_internal_order_commercial_offer_profstroy_actualize\n */\n public actualizeProfstroyOffer(offerId: number): Promise<IOffer> {\n return this.post<IOffer>(`/internal/orders/offers/${offerId}/profstroy/actualize`, {}, (response) => new Offer(response.data));\n }\n\n /**\n * Пересобирает заказ-черновик из ранее сохранённого файла «Профстрой»: состав записи формируется заново,\n * внесённые вручную изменения количества и удалённые позиции при этом теряются. Выполняется в фоне.\n *\n * @param offerId Идентификатор записи заказа-черновика.\n *\n * @see /doc/api/internal#/Заказы/api_internal_order_commercial_offer_profstroy_reload\n */\n public reloadProfstroyOffer(offerId: number): Promise<IOffer> {\n return this.post<IOffer>(`/internal/orders/offers/${offerId}/profstroy/reload`, {}, (response) => new Offer(response.data));\n }\n\n /**\n * Возвращает данные заказа-черновика с указанным идентификатором.\n *\n * @param offerId Идентификатор записи заказа-черновика.\n *\n * @see /doc/api/internal#/Заказы/api_internal_order_commercial_offer_get\n */\n public getOffer(offerId: number): Promise<IOffer> {\n return this.get<IOffer>(`/internal/orders/offers/${offerId}`, {}, (response) => new Offer(response.data));\n }\n\n /**\n * Обновляет данные заказа-черновика и возвращает обновлённые данные.\n *\n * @param offerId Идентификатор записи заказа-черновика.\n * @param name Новое название записи.\n *\n * @see /doc/api/internal#/Заказы/api_internal_order_commercial_offer_change\n */\n public updateOffer(offerId: number, name?: string): Promise<IOffer> {\n return this.patch<IOffer>(`/internal/orders/offers/${offerId}`, { name }, (response) => new Offer(response.data));\n }\n\n /**\n * Удаляет заказ-черновик.\n *\n * @param offerId Идентификатор записи заказа-черновика.\n *\n * @see /doc/api/internal#/Заказы/api_internal_order_commercial_offer_delete\n */\n public deleteOffer(offerId: number): Promise<void> {\n return this.delete(`/internal/orders/offers/${offerId}`);\n }\n\n /**\n * Создаёт заказы на основе заказа-черновика: позиции группируются по направлениям продаж,\n * по каждому направлению создаётся отдельный заказ за один запрос. Возвращает список созданных заказов.\n *\n * @param offerId Идентификатор записи заказа-черновика.\n * @param data Данные для создания заказов (параметры доставки/оплаты, единые для всех направлений).\n * @param items Идентификаторы позиций записи, которые необходимо оформить (частичное оформление).\n * Если не указаны, оформляются все позиции.\n * @param validationFieldResultData Список полей, для которых необходимо установить данные об ошибках\n * валидации в случае ошибок в запросах.\n *\n * @see /doc/api/internal#/Заказы/api_internal_order_commercial_offer_create_order\n */\n public createOrderFromDraft(\n offerId: number,\n data: IClientOrderCreateData,\n items?: string[],\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<IOrder[]> {\n const apiDateFormat = useBaseConfigStateStore().config.dateFormats.api;\n\n return this.post<IOrder[]>(\n `/internal/orders/offers/${offerId}/create-order`,\n {\n ...data,\n deliveryDate: data.deliveryDate ? format(data.deliveryDate, apiDateFormat) : undefined,\n items: items?.length ? items : undefined,\n },\n (response) => TypedInstanceFactory.instanceListInitializer(Order, response.data),\n validationFieldResultData\n );\n }\n\n /**\n * Добавляет продукт в заказ-черновик и возвращает обновлённые данные записи.\n *\n * @param offerId Идентификатор записи заказа-черновика.\n * @param cartItem Данные о товаре, который необходимо добавить.\n * @param validationFieldResultData Список полей, для которых необходимо установить данные об ошибках\n * валидации в случае ошибок в запросах.\n *\n * @see /doc/api/internal#/Заказы/api_internal_order_commercial_offer_product_add\n */\n public addOfferProduct<T extends ICartItemConfiguratorParamsBase | undefined = undefined>(\n offerId: number,\n cartItem: IOrderItemBase<T>,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<IOffer> {\n return this.post<IOffer>(\n `/internal/orders/offers/${offerId}/products`,\n {\n product_id: cartItem.product.id,\n product_category_id: cartItem.configurator ? cartItem.category.id : undefined,\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 is_additional_sale: cartItem.isAdditionalSale,\n ...cartItem.configuratorParams,\n },\n (response) => new Offer(response.data),\n validationFieldResultData\n );\n }\n\n /**\n * Изменяет продукт в заказе-черновике и возвращает обновлённые данные записи.\n *\n * @param offerId Идентификатор записи заказа-черновика.\n * @param offerProductId Идентификатор позиции записи.\n * @param cartItem Данные о товаре, параметры которого необходимо изменить.\n * @param validationFieldResultData Список полей, для которых необходимо установить данные об ошибках\n * валидации в случае ошибок в запросах.\n *\n * @see /doc/api/internal#/Заказы/api_internal_order_commercial_offer_product_modify\n */\n public patchOfferProduct<T extends ICartItemConfiguratorParamsBase | undefined = undefined>(\n offerId: number,\n offerProductId: string,\n cartItem: IOrderItemBase<T>,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<IOffer> {\n return this.patch<IOffer>(\n `/internal/orders/offers/${offerId}/products/${offerProductId}`,\n {\n product_id: cartItem.product.id,\n product_category_id: cartItem.configurator ? cartItem.category.id : undefined,\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 is_additional_sale: cartItem.isAdditionalSale,\n ...cartItem.configuratorParams,\n },\n (response) => new Offer(response.data),\n validationFieldResultData\n );\n }\n\n /**\n * Удаляет продукт из заказа-черновика и возвращает обновлённые данные записи.\n *\n * @param offerId Идентификатор записи заказа-черновика.\n * @param offerProductId Идентификатор позиции записи.\n *\n * @see /doc/api/internal#/Заказы/api_internal_order_commercial_offer_product_delete\n */\n public deleteOfferProduct(offerId: number, offerProductId: string): Promise<IOffer> {\n return this.delete<IOffer>(`/internal/orders/offers/${offerId}/products/${offerProductId}`, (response) => new Offer(response.data));\n }\n\n /**\n * Возвращает содержимое печатной формы заказа-черновика в формате HTML.\n *\n * @param offerId Идентификатор записи заказа-черновика.\n * @param recipientText Текст блока «Кому» в документе.\n *\n * @see /doc/api/internal#/Заказы/api_internal_order_commercial_offer_view_html\n */\n public getOfferHtml(offerId: number, recipientText?: string): Promise<Blob> {\n return this.get<Blob>(`/internal/orders/offers/${offerId}/view`, recipientText ? { recipientText } : {}, (response) => new Blob([response.data], { type: 'text/html' }));\n }\n\n /**\n * Возвращает файл заказа-черновика в формате PDF.\n *\n * @param offerId Идентификатор записи заказа-черновика.\n * @param recipientText Текст блока «Кому» в документе.\n *\n * @see /doc/api/internal#/Заказы/api_internal_order_commercial_offer_download\n */\n public getOfferPdf(offerId: number, recipientText?: string): Promise<Blob> {\n return this.getBlob<Blob>(\n `/internal/orders/offers/${offerId}/download`,\n recipientText ? { recipientText } : {},\n (response) => new Blob([response.request.response], { type: 'application/pdf' })\n );\n }\n\n /**\n * Отправляет заказ-черновик на указанный адрес электронной почты.\n *\n * @param offerId Идентификатор записи заказа-черновика.\n * @param data Данные для отправки (текст «Кому», e-mail, дополнительные файлы).\n *\n * @see /doc/api/internal#/Заказы/api_internal_order_commercial_offer_send\n */\n public sendOffer(offerId: number, data: IOfferSendData): Promise<void> {\n return this.post(`/internal/orders/offers/${offerId}/send`, data);\n }\n}\n","import { IOffer } from '@sc/offers/interfaces/i-offer';\nimport { IOfferShortInfo } from '@sc/offers/interfaces/i-offer-short-info';\nimport { IProfstroyOffer } from '@sc/offers/interfaces/i-profstroy-offer';\nimport { isNil } from 'lodash-es';\n\n/**\n * Класс-помощник для работы с заказами-черновиками.\n */\nexport class OfferHelper {\n /**\n * Возвращает признак того, что запись создана из файла выгрузки программы «Профстрой».\n *\n * @param offer Данные записи заказа-черновика.\n */\n public static isProfstroy(offer?: IOfferShortInfo | null): boolean {\n return Boolean(offer?.isProfstroy);\n }\n\n /**\n * Возвращает признак того, что полные данные записи относятся к заявке Профстрой,\n * уточняя тип записи для доступа к данным актуализации и позициям заявки.\n *\n * @param offer Полные данные записи заказа-черновика.\n */\n public static isProfstroyOffer(offer?: IOffer | null): offer is IProfstroyOffer {\n return !isNil(offer) && offer.isProfstroy === true && !isNil(offer.actualization);\n }\n}\n","/**\n * Доступные пользователю действия с заказом.\n */\nexport enum OrderAction {\n /**\n * Разрешено просматривать заказ.\n */\n View = 'view',\n\n /**\n * Разрешено делиться заказом.\n */\n Share = 'share',\n\n /**\n * Разрешено редактировать теги заказа.\n */\n EditTags = 'edit_tags',\n\n /**\n * Разрешено сохранять информацию о незаказанных продуктах.\n */\n SaveOrderIgnoredProducts = 'save_order_ignored_products',\n\n /**\n * Разрешено изменять статус заказа.\n */\n ChangeStatus = 'change_status',\n\n /**\n * Разрешено изменять содержимое указанного заказа.\n */\n ChangeProducts = 'change_products',\n\n /**\n * Разрешено изменять данные заказа.\n */\n ChangeOrderParameters = 'change_order_parameters',\n\n /**\n * Разрешено пересчитывать стоимость указанного заказа.\n */\n Recalculate = 'recalculate',\n\n /**\n * Разрешено закрепить заказ.\n */\n AttachOrder = 'attach_order',\n\n /**\n * Разрешено открепить заказ.\n */\n DetachOrder = 'detach_order',\n\n /**\n * Разрешено заменить закрепленного оператора.\n */\n ChangeAttachedOperator = 'change_attached_operator',\n\n /**\n * Разрешено отправить ссылку на online-оплату заказа.\n */\n SendOnlinePaymentLink = 'send_online_payment_link',\n\n /**\n * Разрешено подтверждать полный расчёт online-оплаты заказа.\n */\n ConfirmOnlineFullPayment = 'confirm_online_full_payment',\n\n /**\n * Разрешено объединять заказы.\n */\n MergeOrders = 'merge_orders',\n\n /**\n * Разрешено просматривать историю статусов заказа.\n */\n GetHistory = 'get_history',\n\n /**\n * Разрешено копировать заказ.\n */\n CloneOrder = 'clone_order',\n\n /**\n * Разрешено удалять прикрепленный к заказу файл.\n */\n DeleteAttachedFile = 'delete_attached_file',\n}\n","import { IOrder } from '@sc/orders/interfaces/i-order';\nimport { IOrderEditorData } from '@sc/orders/interfaces/i-order-editor-data';\nimport { IFile } from '@sc/system/interfaces/i-file';\n\n/**\n * Данные для создания/редактирования заказа.\n */\nexport class OrderEditorData implements IOrderEditorData {\n /**\n * @inheritDoc\n */\n public paymentType?: number;\n\n /**\n * @inheritDoc\n */\n public deliveryType?: number;\n\n /**\n * @inheritDoc\n */\n public contragentId?: number;\n\n /**\n * @inheritDoc\n */\n public deliveryDate?: Date;\n\n /**\n * @inheritDoc\n */\n public addressId?: number;\n\n /**\n * @inheritDoc\n */\n public warehouseId?: number;\n\n /**\n * @inheritDoc\n */\n public image?: IFile;\n\n /**\n * @inheritDoc\n */\n public comment?: string;\n\n /**\n * @inheritDoc\n */\n public barcode?: string;\n\n /**\n * @inheritDoc\n */\n public operatorsComment?: string;\n\n /**\n * @inheritDoc\n */\n public operatorsForWarehouseComment?: string;\n\n /**\n * @inheritDoc\n */\n public additionalEmails?: string[];\n\n /**\n * @inheritDoc\n */\n public isAllowProcessingWithoutPayment?: boolean;\n\n /**\n * @inheritDoc\n */\n public isAdditionalSale?: boolean;\n\n /**\n * Инициализирует экземпляр класса {@link OrderEditorData}.\n *\n * @param order Данные заказа для первоначальной инициализации.\n */\n public constructor(order?: IOrder) {\n this.paymentType = order?.payment.type;\n this.deliveryType = order?.delivery.type;\n this.contragentId = order?.contragent?.id;\n this.deliveryDate = order?.delivery.date ? new Date(order.delivery.date) : undefined;\n this.addressId = order?.delivery.address?.id;\n this.warehouseId = order?.delivery.warehouse?.id;\n\n this.comment = order?.comment;\n this.barcode = order?.barcode;\n this.operatorsComment = order?.operatorsComment;\n this.operatorsForWarehouseComment = order?.operatorsForWarehouseComment;\n this.isAllowProcessingWithoutPayment = order?.isAllowProcessingWithoutPayment;\n }\n}\n","import { IOperator } from '@sc/references/interfaces/i-operator';\nimport { Reference } from '@sc/system/classes/reference';\n\n/**\n * Оператор.\n */\nexport class Operator extends Reference implements IOperator {}\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","/* eslint-disable @typescript-eslint/no-explicit-any,@typescript-eslint/no-unnecessary-condition */\n\nimport { ClientShortInfo } from '@sc/clients/classes/client-short-info';\nimport { IContragentUlNr } from '@sc/clients/interfaces/contragent/i-contragent-ul-nr';\nimport { IClientShortInfo } from '@sc/clients/interfaces/i-client-short-info';\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 { PaginationFiltersBase } from '@sc/pagination/filters/pagination-filters-base';\nimport { CityWithRegionAndCountry } from '@sc/references/classes/city-with-region-and-country';\nimport { DeliveryType } from '@sc/references/classes/delivery-type';\nimport { Operator } from '@sc/references/classes/operator';\nimport { PaymentType } from '@sc/references/classes/payment-type';\nimport { SalesDirection } from '@sc/references/classes/sales-direction';\nimport { Warehouse } from '@sc/references/classes/warehouse';\nimport { ICityWithRegionAndCountry } from '@sc/references/interfaces/i-city-with-region-and-country';\nimport { IDeliveryType } from '@sc/references/interfaces/i-delivery-type';\nimport { IOperator } from '@sc/references/interfaces/i-operator';\nimport { IOrderStatus } from '@sc/references/interfaces/i-order-status';\nimport { IPaymentType } from '@sc/references/interfaces/i-payment-type';\nimport { ISalesDirection } from '@sc/references/interfaces/i-sales-direction';\nimport { IWarehouse } from '@sc/references/interfaces/i-warehouse';\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 { UserShortInfo } from '@sc/user/classes/user-short-info';\nimport { IUserShortInfo } from '@sc/user/interfaces/i-user-short-info';\n\n/**\n * Данные о параметрах фильтрации списка заказов.\n */\nexport class OrdersListFilters extends PaginationFiltersBase implements IOrdersListFilters {\n /**\n * @inheritDoc\n */\n public attachedUsers?: Array<IOperator | IManager>;\n\n /**\n * @inheritDoc\n */\n public clientSearchTerm?: string;\n\n /**\n * @inheritDoc\n */\n public client?: IClientShortInfo;\n\n /**\n * @inheritDoc\n */\n public contragent?: Partial<IContragentUlNr>;\n\n /**\n * @inheritDoc\n */\n public createdAt: IDatePeriod = new DatePeriod();\n\n /**\n * @inheritDoc\n */\n public creator?: IUserShortInfo;\n\n /**\n * @inheritDoc\n */\n public deliveryDate: IDatePeriod = new DatePeriod();\n\n /**\n * @inheritDoc\n */\n public deliveryAddressSearch?: string;\n\n /**\n * @inheritDoc\n */\n public clientCities?: ICityWithRegionAndCountry[];\n\n /**\n * @inheritDoc\n */\n public id?: string;\n\n /**\n * @inheritDoc\n */\n public isApproved?: boolean;\n\n /**\n * @inheritDoc\n */\n public isNotInStock?: boolean;\n\n /**\n * @inheritDoc\n */\n public isOnOrder?: boolean;\n\n /**\n * @inheritDoc\n */\n public attachedAt: IDatePeriod = new DatePeriod();\n\n /**\n * @inheritDoc\n */\n public salesDirections?: ISalesDirection[];\n\n /**\n * @inheritDoc\n */\n public status?: IOrderStatus[];\n\n /**\n * @inheritDoc\n */\n public statusDetail?: IReference[];\n\n /**\n * @inheritDoc\n */\n public deliveryType?: IDeliveryType;\n\n /**\n * @inheritDoc\n */\n public paymentType?: IPaymentType;\n\n /**\n * @inheritDoc\n */\n public warehouses?: IWarehouse[];\n\n /**\n * @inheritDoc\n */\n public isLargeOrder?: boolean;\n\n /**\n * @inheritDoc\n */\n public isToProcess?: boolean;\n\n /**\n * @inheritDoc\n */\n public onlyMyRegions?: boolean;\n\n /**\n * Инициализирует экземпляр класса {@link OrdersListFilters}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IOrdersListFilters) {\n super();\n this.attachedUsers = data?.attachedUsers?.map((o) => ('isActive' in o ? new Manager(o) : new Operator(o)));\n this.clientSearchTerm = data?.clientSearchTerm;\n this.client = data?.client ? new ClientShortInfo(data.client) : undefined;\n this.contragent = data?.contragent;\n this.createdAt = new DatePeriod(data?.createdAt);\n this.creator = data?.creator ? new UserShortInfo(data.creator) : undefined;\n this.deliveryDate = new DatePeriod(data?.deliveryDate);\n this.deliveryAddressSearch = data?.deliveryAddressSearch;\n this.clientCities = data?.clientCities?.map((c) => new CityWithRegionAndCountry(c));\n this.id = data?.id;\n this.isApproved = data?.isApproved;\n this.isNotInStock = data?.isNotInStock;\n this.isOnOrder = data?.isOnOrder;\n this.isLargeOrder = data?.isLargeOrder;\n this.attachedAt = new DatePeriod(data?.attachedAt);\n this.salesDirections = data?.salesDirections?.map((s) => new SalesDirection(s));\n this.status = data?.status;\n this.statusDetail = data?.statusDetail;\n this.deliveryType = data?.deliveryType ? new DeliveryType(data.deliveryType) : undefined;\n this.paymentType = data?.paymentType ? new PaymentType(data.paymentType) : undefined;\n this.warehouses = data?.warehouses?.map((w) => new Warehouse(w));\n this.isToProcess = data?.isToProcess;\n }\n\n /**\n * @inheritDoc\n */\n public resetFilterValue(key: string): this {\n switch (key) {\n case 'createdAt':\n this.createdAt.from = null;\n this.createdAt.to = null;\n break;\n case 'creator':\n this.creator = undefined;\n break;\n case 'deliveryDate':\n this.deliveryDate.from = null;\n this.deliveryDate.to = null;\n break;\n case 'deliveryType':\n this.deliveryType = new DeliveryType();\n break;\n case 'clientCities':\n this.clientCities = [] as ICityWithRegionAndCountry[];\n break;\n case 'attachedAt':\n this.attachedAt.from = null;\n this.attachedAt.to = null;\n break;\n case 'salesDirection':\n case 'salesDirections':\n this.salesDirections = [] as ISalesDirection[];\n break;\n case 'status':\n this.status = [] as IOrderStatus[];\n break;\n case 'warehouse':\n case 'warehouses':\n this.warehouses = [] as IWarehouse[];\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 * @inheritDoc\n */\n public asClearRaw(): Record<string, any> {\n const result = super.asClearRaw();\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?.deliveryDate?.from && !result?.deliveryDate?.to) {\n delete result.deliveryDate;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (!result?.attachedAt?.from && !result?.attachedAt?.to) {\n delete result.attachedAt;\n }\n\n return result;\n }\n}\n","import { IOrderStatusHistoryInfo } from '@sc/orders/interfaces/i-order-status-history-info';\nimport { OrderStatus } from '@sc/references/classes/order-status';\nimport { IOrderStatus } from '@sc/references/interfaces/i-order-status';\nimport { Reference } from '@sc/system/classes/reference';\nimport { IReference } from '@sc/system/interfaces/i-reference';\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 OrderStatusHistoryInfo implements IOrderStatusHistoryInfo {\n /**\n * @inheritDoc\n */\n public user: IUserShortInfo;\n\n /**\n * @inheritDoc\n */\n public status: IOrderStatus;\n\n /**\n * @inheritDoc\n */\n public statusDetail?: IReference;\n\n /**\n * @inheritDoc\n */\n public createdAt: Date;\n\n /**\n * Инициализирует экземпляр класса {@link OrderStatusHistoryInfo}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IOrderStatusHistoryInfo>) {\n this.user = new UserShortInfo(data?.user);\n this.status = new OrderStatus(data?.status);\n this.statusDetail = data?.statusDetail ? new Reference<string>(data.statusDetail) : undefined;\n this.createdAt = isString(data?.createdAt) ? parseISO(data.createdAt as unknown as string) : (data?.createdAt ?? new Date());\n }\n}\n","/* eslint-disable @typescript-eslint/no-unnecessary-condition,@typescript-eslint/no-unsafe-argument,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/prefer-promise-reject-errors,@typescript-eslint/use-unknown-in-catch-callback-variable,vue/max-len */\n\nimport { ICartItemConfiguratorParamsBase } from '@sc/cart/interfaces/i-cart-item-configurator-params-base';\nimport { IOrderItemBase } from '@sc/cart/interfaces/i-order-item-base';\nimport { useBaseConfigStateStore } from '@sc/config/states/config-state-store';\nimport { Order } from '@sc/orders/classes/order';\nimport { OrderInfo } from '@sc/orders/classes/order-info';\nimport { OrderStatusHistoryInfo } from '@sc/orders/classes/order-status-history-info';\nimport { IClientOrderCreateData } from '@sc/orders/interfaces/i-client-order-create-data';\nimport { IClientOrderStatistics } from '@sc/orders/interfaces/i-client-order-statistics';\nimport { IDeliveryCostInfo } from '@sc/orders/interfaces/i-delivery-cost-info';\nimport { IOrder } from '@sc/orders/interfaces/i-order';\nimport { IOrderEditorData } from '@sc/orders/interfaces/i-order-editor-data';\nimport { IOrderInfo } from '@sc/orders/interfaces/i-order-info';\nimport { IOrderPrintOptions } from '@sc/orders/interfaces/i-order-print-options';\nimport { IOrderPrintSendData } from '@sc/orders/interfaces/i-order-print-send-data';\nimport { IOrderStatusHistoryInfo } from '@sc/orders/interfaces/i-order-status-history-info';\nimport { IPaginatedResponse } from '@sc/pagination/interfaces/i-paginated-response';\nimport { BasePaginationProvider } from '@sc/pagination/providers/base-pagination-provider';\nimport { OrderStatusEnum } from '@sc/references/enums/order-status-enum';\nimport { IDatePeriod } from '@sc/system/interfaces/i-date-period';\nimport { TypedInstanceFactory } from '@sc/system/providers/typed-instance-factory';\nimport { FilterGroup } from '@sc/table-data/classes/filter-group';\nimport { IFilterGroup } from '@sc/table-data/interfaces/i-filter-group';\nimport { IPaginationRequestParams } from '@sc/table-data/interfaces/i-pagination-request-params';\nimport { ISortRequestParams } from '@sc/table-data/interfaces/i-sort-request-params';\nimport { IFieldValidationResultData } from '@sc/validation/interfaces/i-field-validation-result-data';\nimport { format } from 'date-fns';\n\n/**\n * Предоставляет механизмы получения/управления данными о заказах.\n */\nexport class OrdersDataProvider extends BasePaginationProvider {\n /**\n * Возвращает данные о заказах, удовлетворяющих указанным параметрам поиска.\n *\n * @param filters Параметры фильтрации данных.\n * @param sortParams Параметры сортировки.\n * @param paginationParams Параметры пагинации.\n * @param signal Сигнал отмены запроса.\n *\n * @see /doc/api/internal#/Заказы/api_internal_orders_get_list\n */\n public getOrders(\n filters?: IFilterGroup,\n sortParams?: ISortRequestParams[],\n paginationParams?: IPaginationRequestParams,\n signal: AbortSignal | undefined = undefined\n ): Promise<IPaginatedResponse<IOrderInfo>> {\n return this.getTypedPaginated(OrderInfo, '/internal/orders', filters, sortParams, paginationParams, {}, undefined, signal);\n }\n\n /**\n * Возвращает количество заказов, соответствующих указанным фильтрам.\n *\n * @param filters Параметры фильтрации данных.\n * @param signal Сигнал отмены запроса.\n *\n * @see /doc/api/internal#/Заказы/api_internal_client_get_filtered_count\n */\n public getOrdersCount(filters?: IFilterGroup, signal: AbortSignal | undefined = undefined): Promise<number> {\n return this.get<{ count: number }>(\n '/internal/orders/count',\n filters ? { filters: JSON.stringify((filters instanceof FilterGroup ? filters : new FilterGroup(filters)).toPrimitive()) } : {},\n undefined,\n undefined,\n signal\n ).then((result) => result.count);\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 * @see /doc/api/internal#/Заказы/api_internal_orders_get\n */\n public getOrder(orderId: number): Promise<IOrder> {\n return this.get<IOrder>(`/internal/orders/${orderId}`, {}, (response) => new Order(response.data));\n }\n\n /**\n * Создаёт заказы клиента из содержимого корзины текущего пользователя.\n *\n * Позиции корзины распределяются по заказам на стороне сервера, поэтому может быть создано несколько заказов.\n *\n * @param clientId Идентификатор клиента.\n * @param data Данные для создания заказа.\n * @param cartItemIds Идентификаторы позиций корзины (`IOrderItem.id`),\n * которые необходимо включить в заказ (частичный заказ).\n * Если не указаны или список пуст, заказ создаётся из всех\n * товаров корзины.\n * @param validationFieldResultData Список полей, для которых необходимо\n * установить данные об ошибках валидации\n * в случае ошибок в запросах.\n * @see /doc/api/internal#/operations/api_internal_client_orders_create\n */\n public createClientOrder(\n clientId: number,\n data: IClientOrderCreateData,\n cartItemIds?: string[],\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<IOrder[]> {\n const apiDateFormat = useBaseConfigStateStore().config.dateFormats.api;\n\n return this.post<IOrder[]>(\n `/internal/clients/${clientId}/orders`,\n {\n ...data,\n deliveryDate: format(data.deliveryDate, apiDateFormat),\n items: cartItemIds?.length ? cartItemIds : undefined,\n },\n (response) => TypedInstanceFactory.instanceListInitializer(Order, response.data),\n validationFieldResultData\n );\n }\n\n /**\n * Закрепляет указанный заказ за текущим оператором и возвращает полные данные заказа.\n *\n * @param orderId Идентификатор записи заказа.\n *\n * @see /doc/api/internal#/Заказы/api_internal_orders_attach\n */\n public attachOrder(orderId: number): Promise<IOrder> {\n return this.patch<IOrder>(`/internal/orders/${orderId}/attach`, {}, (response) => new Order(response.data));\n }\n\n /**\n * Открепляет указанный заказ от оператора и возвращает полные данные заказа.\n *\n * @param orderId Идентификатор записи заказа.\n *\n * @see /doc/api/internal#/Заказы/api_internal_orders_detach\n */\n public detachOrder(orderId: number): Promise<IOrder> {\n return this.patch<IOrder>(`/internal/orders/${orderId}/detach`, {}, (response) => new Order(response.data));\n }\n\n /**\n * Объединяет указанные заказы в базовый заказ и возвращает обновлённые данные базового заказа.\n *\n * @param orderId Идентификатор базового заказа, в который переносятся товары.\n * @param ids Идентификаторы заказов, товары которых необходимо перенести в базовый заказ.\n *\n * @see /doc/api/internal#/Заказы/api_internal_orders_merge\n */\n public mergeOrders(orderId: number, ids: number[]): Promise<IOrder> {\n return this.patch<IOrder>(`/internal/orders/${orderId}/merge`, { ids }, (response) => new Order(response.data));\n }\n\n /**\n * Пересчитывает стоимость корзины указанного заказа и возвращает обновлённые данные заказа.\n *\n * @param orderId Идентификатор заказа.\n *\n * @see /doc/api/internal#/Заказы/api_internal_orders_recalculate\n */\n public recalculateOrder(orderId: number): Promise<IOrder> {\n return this.patch<IOrder>(`/internal/orders/${orderId}/recalculate`, {}, (response) => new Order(response.data));\n }\n\n /**\n * Копирует товары указанного заказа в текущую корзину пользователя.\n *\n * @param orderId Идентификатор заказа-источника.\n *\n * @see /doc/api/internal#/Заказы/api_internal_orders_clone\n */\n public cloneOrder(orderId: number): Promise<void> {\n return this.get(`/internal/orders/${orderId}/clone`, {});\n }\n\n /**\n * Обновляет данные заказа без изменения состава товаров и возвращает обновлённые данные заказа.\n *\n * @param orderId Идентификатор заказа.\n * @param data Данные для обновления заказа.\n * @param validationFieldResultData Список полей, для которых необходимо\n * установить данные об ошибках валидации\n * в случае ошибок в запросах.\n *\n * @see /doc/api/internal#/Заказы/api_internal_orders_update\n */\n public updateOrder(orderId: number, data: Partial<IOrderEditorData>, validationFieldResultData: Record<string, IFieldValidationResultData> = {}): Promise<IOrder> {\n const apiDateFormat = useBaseConfigStateStore().config.dateFormats.api;\n\n return this.patch<IOrder>(\n `/internal/orders/${orderId}`,\n {\n ...data,\n deliveryDate: data.deliveryDate ? format(data.deliveryDate, apiDateFormat) : undefined,\n },\n (response) => new Order(response.data),\n validationFieldResultData\n );\n }\n\n /**\n * Добавляет продукт в заказ и возвращает обновлённые данные заказа.\n *\n * @param orderId Идентификатор заказа, в который необходимо добавить продукт.\n * @param cartItem Данные о товаре, который необходимо добавить в заказ.\n * @param validationFieldResultData Список полей, для которых необходимо\n * установить данные об ошибках валидации\n * в случае ошибок в запросах.\n *\n * @see /doc/api/internal#/Заказы/api_internal_orders_product_add\n */\n public addOrderProduct<T extends ICartItemConfiguratorParamsBase | undefined = undefined>(\n orderId: number,\n cartItem: IOrderItemBase<T>,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<IOrder> {\n return this.post<IOrder>(\n `/internal/orders/${orderId}/products`,\n {\n product_id: cartItem.product.id,\n product_category_id: cartItem.configurator ? cartItem.category.id : undefined,\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 is_additional_sale: cartItem.isAdditionalSale,\n ...cartItem.configuratorParams,\n },\n (response) => new Order(response.data),\n validationFieldResultData\n );\n }\n\n /**\n * Изменяет статус заказа и возвращает обновлённые данные заказа.\n *\n * @param orderId Идентификатор заказа.\n * @param status Slug нового статуса заказа.\n * @param statusDetail Slug детализирующего статуса заказа.\n * @param validationFieldResultData Список полей, для которых необходимо\n * установить данные об ошибках валидации\n * в случае ошибок в запросах.\n *\n * @see /doc/api/internal#/Заказы/api_internal_orders_status_change\n */\n public changeOrderStatus(\n orderId: number,\n status: OrderStatusEnum,\n statusDetail?: string | null,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<IOrder> {\n return this.patch<IOrder>(\n `/internal/orders/${orderId}/status`,\n {\n status,\n statusDetail,\n },\n (response) => new Order(response.data),\n validationFieldResultData\n );\n }\n\n /**\n * Изменяет только детализирующий статус (подстатус) заказа без смены основного\n * статуса и возвращает обновлённые данные заказа.\n *\n * @param orderId Идентификатор заказа.\n * @param statusDetail Slug детализирующего статуса заказа.\n *\n * @see /doc/api/internal#/Заказы/api_internal_orders_status_change\n */\n public changeOrderStatusDetail(orderId: number, statusDetail: string): Promise<IOrder> {\n return this.patch<IOrder>(`/internal/orders/${orderId}/status`, { statusDetail }, (response) => new Order(response.data));\n }\n\n /**\n * Возвращает историю изменения статусов заказа.\n *\n * @param orderId Идентификатор заказа.\n *\n * @see /doc/api/internal#/Заказы/api_internal_orders_status_history_get\n */\n public getOrderStatusHistory(orderId: number): Promise<IOrderStatusHistoryInfo[]> {\n return this.getTypedList(OrderStatusHistoryInfo, `/internal/orders/${orderId}/history`);\n }\n\n /**\n * Возвращает содержимое печатной формы заказа в формате HTML.\n *\n * @param orderId Идентификатор заказа.\n * @param options Параметры состава печатной формы.\n *\n * @see /doc/api/internal#/Заказы/api_internal_order_print_view_html\n */\n public getOrderPrintHtml(orderId: number, options?: IOrderPrintOptions): Promise<Blob> {\n return this.get<Blob>(`/internal/orders/${orderId}/print/view`, { ...options }, (response) => new Blob([response.data], { type: 'text/html' }));\n }\n\n /**\n * Возвращает файл печатной формы заказа в формате PDF.\n *\n * @param orderId Идентификатор заказа.\n * @param options Параметры состава печатной формы.\n *\n * @see /doc/api/internal#/Заказы/api_internal_order_print_download\n */\n public getOrderPrintPdf(orderId: number, options?: IOrderPrintOptions): Promise<Blob> {\n return this.getBlob<Blob>(`/internal/orders/${orderId}/print/download`, { ...options }, (response) => new Blob([response.request.response], { type: 'application/pdf' }));\n }\n\n /**\n * Отправляет печатную форму заказа в формате PDF на указанный адрес электронной почты.\n *\n * @param orderId Идентификатор заказа.\n * @param data Данные для отправки (e-mail, дополнительные файлы, параметры состава печатной формы).\n *\n * @see /doc/api/internal#/Заказы/api_internal_order_print_send\n */\n public sendOrderPrint(orderId: number, data: IOrderPrintSendData): Promise<void> {\n return this.post(`/internal/orders/${orderId}/print/send`, data);\n }\n\n /**\n * Заменяет закреплённого за заказом оператора и возвращает обновлённые данные заказа.\n *\n * @param orderId Идентификатор заказа.\n * @param operatorId Идентификатор нового оператора.\n *\n * @see /doc/api/internal#/Заказы/api_internal_orders_change_attached_operator\n */\n public changeAttachedOperator(orderId: number, operatorId: number): Promise<IOrder> {\n return this.patch<IOrder>(`/internal/orders/${orderId}/change-attached-operator`, { operatorId }, (response) => new Order(response.data));\n }\n\n /**\n * Удаляет файл, прикреплённый к заказу клиентом, и возвращает обновлённые данные заказа.\n *\n * @param orderId Идентификатор заказа.\n *\n * @see /doc/api/internal#/Заказы/api_internal_orders_attached_file_delete\n */\n public deleteOrderAttachedFile(orderId: number): Promise<IOrder> {\n return this.delete<IOrder>(`/internal/orders/${orderId}/file/attached`, (response) => new Order(response.data));\n }\n\n /**\n * Удаляет продукт из заказа и возвращает обновлённые данные заказа.\n *\n * @param orderId Идентификатор заказа.\n * @param orderProductId Идентификатор записи продукта заказа.\n *\n * @see /doc/api/internal#/operations/api_internal_orders_product_delete\n */\n public deleteOrderProduct(orderId: number, orderProductId: number): Promise<IOrder> {\n return this.delete<IOrder>(`/internal/orders/${orderId}/products/${orderProductId}`, (response) => new Order(response.data));\n }\n\n /**\n * Изменяет продукт заказа и возвращает обновлённые данные заказа.\n *\n * @param orderId Идентификатор заказа.\n * @param orderProductId Идентификатор записи продукта заказа.\n * @param orderProduct Данные о товаре, параметры которого необходимо изменить в заказе.\n * @param validationFieldResultData Список полей, для которых необходимо\n * установить данные об ошибках валидации\n * в случае ошибок в запросах.\n *\n * @see /doc/api/internal#/Заказы/api_internal_orders_product_update\n */\n public patchOrderProduct<T extends ICartItemConfiguratorParamsBase | undefined = undefined>(\n orderId: number,\n orderProductId: number,\n orderProduct: IOrderItemBase<T>,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<IOrder> {\n return this.patch<IOrder>(\n `/internal/orders/${orderId}/products/${orderProductId}`,\n {\n product_id: orderProduct.product.id,\n product_category_id: orderProduct.configurator ? orderProduct.category.id : undefined,\n quantity: orderProduct.quantity,\n height: orderProduct.height,\n length: orderProduct.length,\n width: orderProduct.width,\n configurator: orderProduct.configurator,\n marker: orderProduct.marker,\n is_additional_sale: orderProduct.isAdditionalSale,\n ...orderProduct.configuratorParams,\n },\n (response) => new Order(response.data),\n validationFieldResultData\n );\n }\n\n /**\n * Возвращает список дат, в которые возможна доставка по указанному адресу.\n *\n * @param addressId Идентификатор адреса доставки клиента.\n * @param signal Сигнал отмены запроса.\n *\n * @see /doc/api/internal#/operations/api_internal_orders_delivery_get_nearest_dates\n */\n public getDeliveryNearestDates(addressId: number, signal: AbortSignal | undefined = undefined): Promise<string[]> {\n return this.get<string[]>(`/internal/orders/delivery/${addressId}/nearest-dates`, {}, (response) => response.data, undefined, signal);\n }\n\n /**\n * Возвращает список доступных дат самовывоза для указанного склада.\n *\n * @param warehouseId Идентификатор склада.\n * @param signal Сигнал отмены запроса.\n */\n public getSelfDeliveryNearestDates(warehouseId: number, signal: AbortSignal | undefined = undefined): Promise<string[]> {\n return this.get<string[]>(`/internal/orders/self-delivery/${warehouseId}/nearest-dates`, {}, (response) => response.data, undefined, signal);\n }\n\n /**\n * Возвращает информацию о стоимости доставки по указанному адресу.\n *\n * @param addressId Идентификатор адреса доставки клиента.\n * @param date Дата доставки.\n * @param warehouseId Идентификатор склада.\n * @param signal Сигнал отмены запроса.\n *\n * @see /doc/api/internal#/operations/api_internal_orders_delivery_get_cost\n */\n public getDeliveryCost(addressId: number, date: Date, warehouseId: number, signal: AbortSignal | undefined = undefined): Promise<IDeliveryCostInfo> {\n const apiDateFormat = useBaseConfigStateStore().config.dateFormats.api;\n\n return this.get<IDeliveryCostInfo>(\n `/internal/orders/delivery/${addressId}/cost`,\n {\n date: format(date, apiDateFormat),\n warehouse_id: warehouseId,\n },\n (response) => response.data,\n undefined,\n signal\n );\n }\n}\n","import { IOrderInfo } from '@sc/orders/interfaces/i-order-info';\nimport type { InjectionKey, MaybeRefOrGetter } from 'vue';\n\n/**\n * Ключ для инъекции данных текущего заказа.\n */\nexport const currentOrderInjectionKey: InjectionKey<MaybeRefOrGetter<IOrderInfo | null>> = Symbol('currentOrder');\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';\nimport { TypedInstanceFactory } from '@sc/system/providers/typed-instance-factory';\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) => TypedInstanceFactory.instanceListInitializer(PriceAnalyze, response.data)\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) => TypedInstanceFactory.instanceListInitializer(PriceAnalyze, response.data)\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) => TypedInstanceFactory.instanceListInitializer(PriceAnalyze, response.data)\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 { useBaseConfigStateStore } from '@sc/config/states/config-state-store';\nimport { HttpRequester } from '@sc/http/classes/http-requester';\nimport { ProductPriceHistory } from '@sc/price-history/classes/product-price-history';\nimport { IPriceHistoryItem } from '@sc/price-history/interfaces/i-price-history-item';\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, merge, omitBy } from 'lodash-es';\n\n/**\n * Предоставляет механизмы для получения истории изменения цен.\n */\nexport class PriceHistoryDataProvider extends HttpRequester {\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 = useBaseConfigStateStore().config.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 const productId = filters.product?.[0] ?? 0;\n delete updatedFilters.product;\n\n return this.get<IPriceHistoryItem[]>(`/internal/price/products/${productId}/history`, updatedFilters).then((responseData) => [\n new ProductPriceHistory(merge(responseData[0], { history: responseData }) as unknown as IProductPriceHistory),\n ]);\n }\n}\n","import { IRecommendationsList } from '@sc/recommendations/interfaces/i-recommendations-list';\nimport { CodedIdentity } from '@sc/system/classes/coded-identity';\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 { 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 * Возвращает данные о рекомендациях указанной категории продуктов.\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/catalog/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/catalog/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/catalog/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/catalog/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 no-shadow */\n\n/**\n * Перечисление допустимых статусов заказа.\n */\nexport enum OrderStatusEnum {\n /**\n * Новый.\n */\n New = 'new',\n\n /**\n * Принят в работу.\n */\n Processing = 'processing',\n\n /**\n * Ожидает поставки товара.\n */\n AwaitingSupplyProducts = 'awaiting_supply_products',\n\n /**\n * Выставлен счет.\n */\n InvoiceIssued = 'invoice_issued',\n\n /**\n * Сборка заказа.\n */\n ProcessingOnStock = 'processing_on_stock',\n\n /**\n * Завершен.\n */\n Finished = 'finished',\n\n /**\n * Заказ обновлён.\n */\n OrderUpdated = 'order_updated',\n\n /**\n * Отменён.\n */\n Canceled = 'canceled',\n\n /**\n * Ошибка.\n */\n Error = 'error',\n}\n","/* eslint-disable no-shadow */\n\n/**\n * Перечисление допустимых детализирующих статусов (подстатусов) заказа.\n */\nexport enum OrderStatusDetailEnum {\n /**\n * Отменён 1С.\n */\n CanceledBy1c = 'canceled_by1c',\n\n /**\n * Отменён клиентом.\n */\n CanceledByClient = 'canceled_by_client',\n\n /**\n * Завершён, не подтверждён.\n */\n FinishedNotApproved = 'finished_not_approved',\n\n /**\n * В обработке отделом закупок.\n */\n ProcessingByPurchasingDepartment = 'processing_by_purchasing_department',\n\n /**\n * Клиент будет ждать поставки товара.\n */\n WillWaiting = 'will_waiting',\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 { 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 { ICityWithUserRegion } from '@sc/references/interfaces/i-city-with-user-region';\nimport { Reference } from '@sc/system/classes/reference';\nimport { UserRegionShortInfo } from '@sc/user-regions/classes/user-region-short-info';\nimport { IUserRegionShortInfo } from '@sc/user-regions/interfaces/i-user-region-short-info';\n\n/**\n * Данные о городе, включая информацию о регионах пользователей, к которым он привязан.\n */\nexport class CityWithUserRegion extends Reference implements ICityWithUserRegion {\n /**\n * @inheritDoc\n */\n public userRegions: IUserRegionShortInfo[];\n\n /**\n * Инициализирует экземпляр класса {@link CityWithUserRegion}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: ICityWithUserRegion) {\n super(data);\n\n this.userRegions = data?.userRegions?.map((userRegion) => new UserRegionShortInfo(userRegion)) ?? [];\n }\n}\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","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 { OrderStatusDetailEnum } from '@sc/references/enums/order-status-detail-enum';\nimport { IOrderStatusDetail } from '@sc/references/interfaces/i-order-status-detail';\nimport { Reference } from '@sc/system/classes/reference';\n\n/**\n * Данные о детализирующем статусе (подстатусе) заказа.\n */\nexport class OrderStatusDetail extends Reference<OrderStatusDetailEnum> implements IOrderStatusDetail {}\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 { Reference } from '@sc/system/classes/reference';\nimport { IReference } from '@sc/system/interfaces/i-reference';\n\n/**\n * Описывает механизмы генерации данных о записи справочника.\n */\nexport class ReferenceDataFactory {\n /**\n * Генерирует и возвращает данные-заглушку неопределённой записи справочника.\n *\n * @param Ctor Конструктор конкретного класса справочника.\n * @param name Название записи.\n */\n public static generateUndefinedInstance<T extends Reference>(Ctor: new (data?: Partial<IReference>) => T, name: string = '- Не определён -'): T {\n return new Ctor({ id: 0, name, slug: '-undefined-' });\n }\n\n /**\n * Выполняет проверку, является ли указанная запись записью-заглушкой с данными о неопределённой записи справочника.\n *\n * @param reference Запись для проверки.\n */\n public static isUndefinedInstance(reference: IReference): boolean {\n return reference.id === 0 && reference.slug === '-undefined-';\n }\n}\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","/* 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 { City } from '@sc/references/classes/city';\nimport { CityWithRegionAndCountry } from '@sc/references/classes/city-with-region-and-country';\nimport { CityWithUserRegion } from '@sc/references/classes/city-with-user-region';\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 { Operator } from '@sc/references/classes/operator';\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 { OrderStatusDetail } from '@sc/references/classes/order-status-detail';\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 { ICity } from '@sc/references/interfaces/i-city';\nimport { ICityWithRegionAndCountry } from '@sc/references/interfaces/i-city-with-region-and-country';\nimport { ICityWithUserRegion } from '@sc/references/interfaces/i-city-with-user-region';\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 { IOperator } from '@sc/references/interfaces/i-operator';\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 { IOrderStatusDetail } from '@sc/references/interfaces/i-order-status-detail';\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 * Идентификатор служебных записей справочников регионов и городов,\n * обозначающих неизвестное местоположение.\n */\n private static readonly unknownLocationId = 1;\n\n /**\n * Исключает из списка записей справочника местоположений служебную запись\n * неизвестного региона или города.\n *\n * @param locations Записи справочника местоположений.\n */\n private static withoutUnknownLocation<T extends IReference>(locations: T[]): T[] {\n // eslint-disable-next-line lodash/prefer-lodash-method\n return locations.filter((location) => location.id !== ReferenceDataProvider.unknownLocationId);\n }\n\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 getOperators(): Promise<IOperator[]> {\n return this.getTypedDataArrayRequester(Operator, '/internal/references/operator', 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, '/internal/references/order-status', true);\n }\n\n /**\n * Возвращает {@link Promise} для получения справочника детализирующих статусов (подстатусов) заказов.\n */\n public getOrderStatusDetails(): Promise<IOrderStatusDetail[]> {\n return this.getTypedDataArrayRequester(OrderStatusDetail, '/internal/references/order-status-detail', 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 * Возвращает {@link Promise} для получения справочника регионов указанной страны.\n *\n * Служебная запись справочника, обозначающая неизвестный регион, из результата исключается.\n *\n * @param countryId Идентификатор страны.\n */\n public getRegionsByCountry(countryId: number): Promise<IRegion[]> {\n return this.getTypedDataArrayRequester(Region, '/internal/references/region', false, { params: { countryId } }).then((regions) =>\n ReferenceDataProvider.withoutUnknownLocation(regions)\n );\n }\n\n /**\n * Возвращает {@link Promise} для получения справочника городов указанного региона.\n *\n * Служебная запись справочника, обозначающая неизвестный город, из результата исключается.\n *\n * @param regionId Идентификатор региона.\n */\n public getCitiesByRegion(regionId: number): Promise<ICity[]> {\n return this.getTypedDataArrayRequester(City, '/internal/references/city', false, { params: { regionId } }).then((cities) =>\n ReferenceDataProvider.withoutUnknownLocation(cities)\n );\n }\n\n /**\n * Возвращает {@link Promise} для получения городов указанного региона,\n * которые уже привязаны к регионам пользователей.\n *\n * @param regionId Идентификатор региона.\n */\n public getCitiesWithUserRegionByRegion(regionId: number): Promise<ICityWithUserRegion[]> {\n return this.getTypedDataArrayRequester(CityWithUserRegion, '/internal/references/city-with-user-region', false, { params: { regionId } }).then((cities) =>\n ReferenceDataProvider.withoutUnknownLocation(cities)\n );\n }\n\n /**\n * Выполняет поиск данных о городах по терму в названии с данными о регионе,\n * в котором расположен город.\n *\n * @param term Терм поиска.\n * @param countryId Идентификатор страны, городами которой необходимо ограничить поиск.\n * @param signal Сигнал отмены запроса.\n */\n public searchCityWithRegion(term: string, countryId?: number, signal: AbortSignal | undefined = undefined): Promise<ICityWithRegionAndCountry[]> {\n return this.getTypedDataArrayRequester(\n CityWithRegionAndCountry,\n '/internal/references/city-with-region/search',\n false,\n { term, ...(countryId ? { params: { countryId } } : {}) },\n signal\n ).then((cities) => ReferenceDataProvider.withoutUnknownLocation(cities));\n }\n\n /**\n * Выполняет поиск данных о городах по терму в названии с данными\n * о регионах пользователей, к которым привязан город.\n *\n * @param term Терм поиска.\n * @param signal Сигнал отмены запроса.\n */\n public searchCityWithUserRegion(term: string, signal: AbortSignal | undefined = undefined): Promise<ICityWithUserRegion[]> {\n return this.getTypedDataArrayRequester(CityWithUserRegion, '/internal/references/city-with-user-region/search', false, { term }, signal).then((cities) =>\n ReferenceDataProvider.withoutUnknownLocation(cities)\n );\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 { IOperator } from '@sc/references/interfaces/i-operator';\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 { IOrderStatusDetail } from '@sc/references/interfaces/i-order-status-detail';\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('common.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 operatorReference = ref<IOperator[] | 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 orderStatusDetailReference = ref<IOrderStatusDetail[] | 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 operatorReference,\n\n /**\n * Справочник статусов оплаты заказа.\n */\n orderPaymentStatusReference,\n\n /**\n * Справочник статусов заказов.\n */\n orderStatusReference,\n\n /**\n * Справочник детализирующих статусов (подстатусов) заказов.\n */\n orderStatusDetailReference,\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('common.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 operatorReference = computed((): IOperator[] | undefined => {\n const referencesStore = useReferencesPrivateStore();\n\n if (!referencesStore.operatorReference && !referencesStore.dataLoaderList.operatorReference) {\n referencesStore.dataLoaderList.operatorReference = true;\n\n HttpRequester.getInstance(ReferenceDataProvider)\n .getOperators()\n .then((data) => {\n referencesStore.operatorReference = data;\n })\n .catch(noop);\n }\n\n return referencesStore.operatorReference;\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 orderStatusDetailReference = computed((): IOrderStatusDetail[] | undefined => {\n const referencesStore = useReferencesPrivateStore();\n\n if (!referencesStore.orderStatusDetailReference && !referencesStore.dataLoaderList.orderStatusDetailReference) {\n referencesStore.dataLoaderList.orderStatusDetailReference = true;\n\n HttpRequester.getInstance(ReferenceDataProvider)\n .getOrderStatusDetails()\n .then((data) => {\n referencesStore.orderStatusDetailReference = data;\n })\n .catch(noop);\n }\n\n return referencesStore.orderStatusDetailReference;\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 operatorReference,\n\n /**\n * Справочник статусов оплаты заказа.\n */\n orderPaymentStatusReference,\n\n /**\n * Справочник статусов заказов.\n */\n orderStatusReference,\n\n /**\n * Справочник детализирующих статусов (подстатусов) заказов.\n */\n orderStatusDetailReference,\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 * Список тегов.\n */\n public tags?: Array<{\n /**\n * Текст тега.\n */\n label: string;\n\n /**\n * Ссылка, на которую должен вести тег.\n */\n url?: string;\n }>;\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 this.tags = data?.tags;\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/interfaces/i-field-validation-result-data';\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/classes/http-requester';\nimport { IAddressSuggestion } from '@sc/suggestion/interfaces/i-address-suggestion';\nimport { IBankSuggestion } from '@sc/suggestion/interfaces/i-bank-suggestion';\nimport { IOrganizationSuggestion } from '@sc/suggestion/interfaces/i-organization-suggestion';\nimport { IIdentity } from '@sc/system/interfaces/i-identity';\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 * Внешний SEO-специалист.\n */\n ExternalSeo = 'external_seo',\n\n /**\n * Гость.\n */\n Guest = 'guest',\n}\n","import { UserCommonInfo } from '@sc/user/classes/user-common-info';\nimport { UserPricingRole } from '@sc/user/classes/user-pricing-role';\nimport { UserTypeEnum } from '@sc/user/enums/user-type-enum';\nimport { IUser } from '@sc/user/interfaces/i-user';\nimport { IUserPricingRole } from '@sc/user/interfaces/i-user-pricing-role';\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 * Роль ценообразования текущего пользователя.\n */\n public pricingRole?: IUserPricingRole;\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 this.pricingRole = data?.pricingRole ? new UserPricingRole(data.pricingRole) : undefined;\n }\n}\n","import { useBaseConfigStateStore } from '@sc/config/states/config-state-store';\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 = `${useBaseConfigStateStore().config.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), true);\n }\n}\n","import { 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 { UserTypeEnum } from '@sc/user/enums/user-type-enum';\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('common.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 /**\n * Данные о текущем менеджере (если текущий пользователь является менеджером).\n */\n const currentManager = ref<IManager | undefined>(undefined);\n\n return {\n /**\n * Список загружаемых/загруженных на данный момент значений.\n */\n dataLoaderList,\n\n /**\n * Данные о текущем пользователе.\n */\n currentUser,\n\n /**\n * Данные о текущем менеджере (если текущий пользователь является менеджером).\n */\n currentManager,\n };\n});\n\n/**\n * Инициирует загрузку данных о текущем менеджере, если текущий пользователь является менеджером\n * и загрузка ещё не была инициирована ранее.\n *\n * @param user Данные о текущем пользователе.\n */\nfunction loadCurrentManagerIfNeeded(user: IUser | undefined): void {\n const privateStore = useUserStatePrivateStore();\n\n if (user?.type !== UserTypeEnum.Manager || privateStore.currentManager || privateStore.dataLoaderList.currentManager) {\n return;\n }\n\n privateStore.dataLoaderList.currentManager = true;\n\n HttpRequester.getInstance(ManagerDataProvider)\n .getManager(user.id)\n .then((manager) => {\n privateStore.currentManager = manager;\n })\n .catch(noop)\n .finally(() => {\n privateStore.dataLoaderList.currentManager = false;\n });\n}\n\n/**\n * Хранилище данных состояния пользователя.\n */\nexport const useUserStateStore = defineStore('common.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 loadCurrentManagerIfNeeded(u);\n })\n .catch(noop)\n .finally(() => {\n privateStore.dataLoaderList.currentUser = false;\n });\n }\n\n return privateStore.currentUser;\n });\n\n /**\n * Данные о текущем менеджере (если текущий пользователь является менеджером).\n */\n const currentManager = computed((): IManager | undefined => {\n loadCurrentManagerIfNeeded(currentUser.value);\n\n return useUserStatePrivateStore().currentManager;\n });\n\n return {\n /**\n * Данные о текущем пользователе.\n */\n currentUser,\n\n /**\n * Данные о текущем менеджере (если текущий пользователь является менеджером).\n */\n currentManager,\n };\n});\n","import { SalesDirection } from '@sc/references/classes/sales-direction';\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 { IUserRegionEmployee } from '@sc/user-regions/interfaces/i-user-region-employee';\n\n/**\n * Данные о закреплении сотрудника за регионом пользователей по направлению продаж.\n */\nexport class UserRegionEmployee implements IUserRegionEmployee {\n /**\n * @inheritDoc\n */\n public user: IUserShortInfo;\n\n /**\n * @inheritDoc\n */\n public salesDirection: ISalesDirection;\n\n /**\n * Инициализирует экземпляр класса {@link UserRegionEmployee}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IUserRegionEmployee>) {\n this.user = new UserShortInfo(data?.user);\n this.salesDirection = new SalesDirection(data?.salesDirection);\n }\n}\n","import { CityWithRegionAndCountry } from '@sc/references/classes/city-with-region-and-country';\nimport { ICityWithRegionAndCountry } from '@sc/references/interfaces/i-city-with-region-and-country';\nimport { UserRegionEmployee } from '@sc/user-regions/classes/user-region-employee';\nimport { UserRegionShortInfo } from '@sc/user-regions/classes/user-region-short-info';\nimport { IUserRegion } from '@sc/user-regions/interfaces/i-user-region';\nimport { IUserRegionEmployee } from '@sc/user-regions/interfaces/i-user-region-employee';\n\n/**\n * Полные данные о регионе пользователя.\n */\nexport class UserRegion extends UserRegionShortInfo implements IUserRegion {\n /**\n * @inheritDoc\n */\n public cities: ICityWithRegionAndCountry[];\n\n /**\n * @inheritDoc\n */\n public users: IUserRegionEmployee[];\n\n /**\n * Инициализирует экземпляр класса {@link UserRegion}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IUserRegion>) {\n super(data);\n\n this.cities = data?.cities?.map((city) => new CityWithRegionAndCountry(city)) ?? [];\n this.users = data?.users?.map((user) => new UserRegionEmployee(user)) ?? [];\n }\n}\n","import { PaginationFiltersBase } from '@sc/pagination/filters/pagination-filters-base';\nimport { IUserRegionsListFilters } from '@sc/user-regions/interfaces/i-user-regions-list-filters';\n\n/**\n * Данные о параметрах фильтрации списка регионов пользователей.\n */\nexport class UserRegionsListFilters extends PaginationFiltersBase implements IUserRegionsListFilters {\n /**\n * @inheritDoc\n */\n public id?: string;\n\n /**\n * @inheritDoc\n */\n public name?: string;\n\n /**\n * @inheritDoc\n */\n public abbr?: string;\n\n /**\n * Инициализирует экземпляр класса {@link UserRegionsListFilters}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IUserRegionsListFilters) {\n super();\n\n this.id = data?.id;\n this.name = data?.name;\n this.abbr = data?.abbr;\n }\n\n /**\n * @inheritDoc\n */\n public resetFilterValue(key: string): this {\n switch (key) {\n case 'id':\n case 'name':\n case 'abbr':\n // eslint-disable-next-line security/detect-object-injection\n this[key] = undefined;\n break;\n default:\n break;\n }\n\n return this;\n }\n}\n","import { IPaginatedResponse } from '@sc/pagination/interfaces/i-paginated-response';\nimport { BasePaginationProvider } from '@sc/pagination/providers/base-pagination-provider';\nimport { IFilterGroup } from '@sc/table-data/interfaces/i-filter-group';\nimport { IPaginationRequestParams } from '@sc/table-data/interfaces/i-pagination-request-params';\nimport { ISortRequestParams } from '@sc/table-data/interfaces/i-sort-request-params';\nimport { UserRegion } from '@sc/user-regions/classes/user-region';\nimport { UserRegionEmployee } from '@sc/user-regions/classes/user-region-employee';\nimport { UserRegionShortInfo } from '@sc/user-regions/classes/user-region-short-info';\nimport { IUserRegion } from '@sc/user-regions/interfaces/i-user-region';\nimport { IUserRegionEmployee } from '@sc/user-regions/interfaces/i-user-region-employee';\nimport { IUserRegionSaveData } from '@sc/user-regions/interfaces/i-user-region-save-data';\nimport { IUserRegionShortInfo } from '@sc/user-regions/interfaces/i-user-region-short-info';\nimport { IFieldValidationResultData } from '@sc/validation/interfaces/i-field-validation-result-data';\n\n/**\n * Предоставляет механизмы получения/управления регионами пользователей.\n */\nexport class UserRegionProvider extends BasePaginationProvider {\n /**\n * Возвращает список регионов пользователей.\n *\n * @param filters Параметры фильтрации данных.\n * @param sortParams Параметры сортировки.\n * @param paginationParams Параметры пагинации.\n *\n * @see /doc/api/internal#/operations/api_internal_user_region_get_list\n */\n public getRegionsList(\n filters?: IFilterGroup,\n sortParams?: ISortRequestParams[] | ISortRequestParams,\n paginationParams?: IPaginationRequestParams\n ): Promise<IPaginatedResponse<IUserRegionShortInfo>> {\n return this.getTypedPaginated(UserRegionShortInfo, '/internal/users/regions', filters, sortParams, paginationParams);\n }\n\n /**\n * Возвращает полные данные о регионе пользователей.\n *\n * @param regionId Идентификатор региона.\n *\n * @see /doc/api/internal#/operations/api_internal_user_region_get\n */\n public getRegion(regionId: number): Promise<IUserRegion> {\n return this.get<IUserRegion>(`/internal/users/regions/${regionId}`, {}, (response) => new UserRegion(response.data));\n }\n\n /**\n * Создаёт новый регион пользователей.\n *\n * @param data Данные для создания региона.\n * @param validationFieldResultData Список полей, для которых необходимо\n * установить данные об ошибках валидации\n * в случае ошибок в запросах.\n *\n * @see /doc/api/internal#/operations/api_internal_user_region_create\n */\n public createRegion(data: IUserRegionSaveData, validationFieldResultData: Record<string, IFieldValidationResultData> = {}): Promise<IUserRegion> {\n return this.post<IUserRegion>('/internal/users/regions', data, (response) => new UserRegion(response.data), validationFieldResultData);\n }\n\n /**\n * Изменяет данные о регионе пользователей.\n *\n * @param regionId Идентификатор региона.\n * @param data Данные для изменения региона.\n * @param validationFieldResultData Список полей, для которых необходимо\n * установить данные об ошибках валидации\n * в случае ошибок в запросах.\n *\n * @see /doc/api/internal#/operations/api_internal_user_region_change\n */\n public updateRegion(regionId: number, data: IUserRegionSaveData, validationFieldResultData: Record<string, IFieldValidationResultData> = {}): Promise<IUserRegion> {\n return this.patch<IUserRegion>(`/internal/users/regions/${regionId}`, data, (response) => new UserRegion(response.data), validationFieldResultData);\n }\n\n /**\n * Удаляет регион пользователей.\n *\n * @param regionId Идентификатор региона.\n *\n * @see /doc/api/internal#/operations/api_internal_user_region_delete\n */\n public removeRegion(regionId: number): Promise<void> {\n return this.delete(`/internal/users/regions/${regionId}`);\n }\n\n /**\n * Возвращает список сотрудников, закреплённых за регионом.\n *\n * @param regionId Идентификатор региона.\n *\n * @see /doc/api/internal#/operations/api_internal_user_region_user_get_list\n */\n public getRegionEmployees(regionId: number): Promise<IUserRegionEmployee[]> {\n return this.getTypedList(UserRegionEmployee, `/internal/users/regions/${regionId}/users`);\n }\n\n /**\n * Закрепляет сотрудника за регионом по указанному направлению продаж.\n *\n * @param regionId Идентификатор региона.\n * @param userId Идентификатор сотрудника.\n * @param salesDirectionId Идентификатор направления продаж.\n *\n * @see /doc/api/internal#/operations/api_internal_user_region_user_add\n */\n public attachRegionEmployee(regionId: number, userId: number, salesDirectionId: number): Promise<IUserRegionEmployee> {\n return this.post<IUserRegionEmployee>(`/internal/users/regions/${regionId}/users/${userId}`, { salesDirectionId }, (response) => new UserRegionEmployee(response.data));\n }\n\n /**\n * Открепляет сотрудника от региона по указанному направлению продаж.\n *\n * @param regionId Идентификатор региона.\n * @param userId Идентификатор сотрудника.\n * @param salesDirectionId Идентификатор направления продаж.\n *\n * @see /doc/api/internal#/operations/api_internal_user_region_user_delete\n */\n public detachRegionEmployee(regionId: number, userId: number, salesDirectionId: number): Promise<void> {\n // Названия параметров запроса конвертируются в snake_case только для GET-запросов.\n return this.request<never>({\n method: 'DELETE',\n url: `/internal/users/regions/${regionId}/users/${userId}`,\n params: { sales_direction_id: salesDirectionId },\n });\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","DeviceTypeResolutionConfig","HttpParamsConfig","SentryConfig","_a","_b","_c","_d","WebSocketConfig","AppBaseConfig","useBaseConfigStateStore","defineStore","config","ref","appConfig","PreferencesStorageProvider","keyName","rawSavedData","savedData","isAfter","parseISO","startOfToday","isNil","isEmpty","availableFor","dataToSave","error","testKey","keysToRemove","i","key","rawData","getTokenExpirationDate","token","useAuthStatePrivateStore","storedToken","developmentToken","jwtTokenUpdater","userPermissions","userPermissionsComputedRefs","markRaw","recalculateUserPermissions","jwtPayload","mapValues","value","noop","useAuthStateStore","computed","privateStore","updater","setJwtTokenUpdater","setJwtToken","invalidateJwtToken","hasUserPermission","name","isArray","hasUserPermissionComputedRef","isUserPermissionExist","checkedName","path","split","groupName","permissionName","group","every","item","BlogPostMediaTypeEnum","Identity","defaultIdValue","BlogPostMediaFile","BlogPostPublicationStatusEnum","DateHelper","date","isString","isValid","format","period","CreatableIdentity","BlogPostShortInfo","publishedAt","slug","startsWith","endsWith","includes","BlogPost","mediaFile","withContent","PaginationFiltersBase","result","k","isFunction","DatePeriod","BlogPostsListFilters","TypedInstanceFactory","type","map","_HttpRequester","request","authToken","configPromise","hook","objectToSnake","toLower","originalRequest","raw","CanceledError","response","responsePromise","axios","handler","index","isObject","isError","rawResponse","successHandler","validationFieldResultData","disableNotifications","requestPromise","url","params","signal","HttpRequester","FilterOpEnum","FilterItem","apiDateFormat","isDate","isPlainObject","range","FilterGroup","filter","BasePaginationProvider","filters","sortParams","paginationParams","extraParams","disableDefaultNotificationErrorResponseHandler","requestParams","BlogProvider","isUndefined","postId","file","isCover","uploadProgressHandler","event","mediaId","NamedIdentity","UpdatableNamedIdentity","DeletableNamedIdentity","UserShortInfo","DiscountShortInfo","PriceTemplate","PriceCoefficientEnum","Reference","PriceCoefficient","coefficient","constant","ProductPriceCoefficient","GeoCoordinates","DeliveryType","Warehouse","dt","StockCount","Currency","ProductUnit","CodedIdentity","CatalogableItem","HiddenCatalogableItem","Image","mediaServer","PrimaryCatalogableItem","Product","sc","primaryCategory","category","im","pc","CostSourceEnum","ClientProduct","BaseCategory","toUpper","OrderItemBase","cloneDeep","Cart","OrderItem","CartProvider","client","cartItem","blob","CalculationTypeEnum","PropertyTypeEnum","ProductFilterTypeEnum","Category","c","ContactLinks","SalesDirection","ManagerCommon","CuratedDirection","UserPricingRole","UserRegionShortInfo","Manager","curatedDirection","region","manager","BaseClientCategory","ClientCategory","PriceCatalogableItem","PriceTemplateICatalogableItem","PriceTemplateCategory","Curator","Country","Region","CityWithRegionAndCountry","UserCommonInfo","ClientShortInfo","m","DeletableIdentity","PriceTemplateClient","PriceTemplateProduct","PropertyType","Property","PropertyValue","TemplatesListFilters","ClientPriceCatalogableItem","ClientPriceProduct","ClientPriceCategory","PricingRole","CategoryPricingRule","FilterSettings","CategoryFilterSetting","CategoryFilterValue","CategoryFilter","CatalogProvider","term","showHidden","categoryId","clientId","link","ClientPriceProvider","recursively","comment","managerId","productId","ClientPriceTemplateProvider","priceTemplateId","priceTemplateClientId","ProductCategoryDataProvider","categoryID","withNestedCategories","withPriceCoefficients","p","forEach","pcs","limit","resolve","reject","ProductDataProvider","rec","periodFrom","ClientProductCategoryDataProvider","ClientProductDataProvider","PriceTemplateProvider","productCategoryId","PricingRoleProvider","id","PropertiesProvider","propertyData","typeId","rest","propertyId","text","fileData","fileId","propertySlug","settingsData","TemplateProductCategoryDataProvider","findCatalogItemByIdRecursive","items","foundInProducts","foundInChildren","flattenCatalogItems","ClientsAdditionalDataRequestTypeEnum","OpfEnum","BankAccount","Contact","ContactPerson","Opf","PartnerGroup","ContragentBase","contactsList","ContragentPerson","ContragentIc","ContragentUlR","ContragentUlNr","ContragentFactory","DeliveryAddress","ChannelPrimaryInterest","SourcePrimaryInterest","Client","pg","da","ClientsListFilters","s","_e","_f","_g","_h","OrderShortInfo","ClientAdditionalData","contact","partnerGroup","curator","ContactRelation","ContactPersonRelated","ClientDataProvider","contragent","contragentIc","contragentUlR","contragentUlNr","deliveryAddress","bankAccount","phone","clients","dataTypes","clientIDs","password","passwordConfirm","managers","promises","curatorId","curators","contragentId","contactPerson","deliveryAddressId","extraData","isPrimary","UnknownClientDataProvider","VersionConfig","ConfiguratorsEnum","ConfiguratorProvider","newTemplate","templateId","TableDataPaginationRequestParams","TableDataPagination","TableDataSortRequestParams","CalendarHelper","from","to","shift","endOfMonth","amount","addMonths","currentPeriodStart","shiftedPeriodStart","monthOffset","differenceInCalendarMonths","startOfMonth","targetMonthStart","day","getDate","getDaysInMonth","startOfDay","endOfDay","setDate","shiftWeeks","startOfWeek","addWeeks","dayOffset","differenceInCalendarDays","addDays","currentStart","dayNumber","targetStart","targetEnd","targetLength","currentIndex","totalIndex","monthShift","decadeIndex","monthStart","daysAgoIso","days","subDays","pluralize","titles","cases","normalized","formatRelativeDate","isoDate","diffDays","DateTimeProvider","year","nextWorkingDay","addBusinessDays","now","yearStart","startOfYear","yearEnd","endOfYear","endOfToday","startOfYesterday","endOfYesterday","startOfTomorrow","endOfTomorrow","endOfWeek","weekOptions","dayStart","dayEnd","decade","quarterStart","startOfQuarter","halfYearStart","previousHalfYear","nextHalfYear","subWeeks","subMonths","subQuarters","endOfQuarter","addQuarters","subYears","addYears","STANDARD_PERIOD_GROUPS","STANDARD_PERIOD_SECTIONS","DiscountClient","DiscountConditions","some","list","DiscountHelper","percent","round","DiscountStateEnum","DiscountStateHelper","discount","Discount","product","source","DiscountClientEligibility","DiscountsListFilters","DiscountProvider","updateFixedClients","discountId","FaqGroup","Faq","FaqProvider","groupId","faqId","formatPercentChange","UnitsHelper","_HttpCachedRequester","cachedResponseData","addSeconds","useResponseDataCache","cacheKey","cachedResponse","responseData","HttpCachedRequester","ManagerDataFactory","ManagerDataProvider","OfferActualizationStatus","OfferActualization","OfferShortInfo","ProfstroyOfferItem","Offer","OffersListFilters","OrderStatus","OrderInfo","replacement","Order","OffersDataProvider","offerId","offerProductId","recipientText","OfferHelper","offer","OrderAction","OrderEditorData","order","Operator","PaymentType","OrdersListFilters","o","w","OrderStatusHistoryInfo","OrdersDataProvider","orderId","cartItemIds","ids","status","statusDetail","options","operatorId","orderProductId","orderProduct","addressId","warehouseId","currentOrderInjectionKey","PriceAnalyze","convertPriceAnalyzeFilters","omitBy","city","salesDirection","convertPriceAnalyzeParams","PriceAnalyzeProvider","PriceHistoryItem","ProductPriceHistory","PriceHistoryDataProvider","updatedFilters","RecommendationsList","RecommendationsDataProvider","productCategory","recommendations","OrderStatusEnum","OrderStatusDetailEnum","AnyReference","City","CityWithUserRegion","userRegion","ContactPosition","OrderPaymentStatus","OrderStatusDetail","ProductFileType","ReferenceDataFactory","Ctor","reference","ResourceType","_ReferenceDataProvider","locations","location","referenceName","countryId","regions","regionId","cities","ReferenceDataProvider","useReferencesPrivateStore","dataLoaderList","channelPrimaryInterestReference","contactPositionsReference","currencyReference","deliveryTypeReference","managersList","opfReference","operatorReference","orderPaymentStatusReference","orderStatusReference","orderStatusDetailReference","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","currentManager","loadCurrentManagerIfNeeded","user","useUserStateStore","u","UserRegionEmployee","UserRegion","UserRegionsListFilters","UserRegionProvider","userId","salesDirectionId","FieldValidationResultData","feedback","validationStatus"],"mappings":"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"}
|