@snabcentr/common-lib 4.2.0-dev → 4.3.0-dev

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/dist/manifest.json +1 -1
  2. package/dist/sc-common-lib.js +417 -347
  3. package/dist/sc-common-lib.js.map +1 -1
  4. package/dist/sc-common-lib.umd.cjs +1 -1
  5. package/dist/sc-common-lib.umd.cjs.map +1 -1
  6. package/dist/src/index.d.ts +1 -0
  7. package/dist/src/index.d.ts.map +1 -1
  8. package/dist/src/offers/providers/offers-data-provider.d.ts +9 -0
  9. package/dist/src/offers/providers/offers-data-provider.d.ts.map +1 -1
  10. package/dist/src/operators/classes/index.d.ts +4 -0
  11. package/dist/src/operators/classes/index.d.ts.map +1 -0
  12. package/dist/src/operators/classes/operator-full-info.d.ts +23 -0
  13. package/dist/src/operators/classes/operator-full-info.d.ts.map +1 -0
  14. package/dist/src/operators/classes/operator-short-info.d.ts +18 -0
  15. package/dist/src/operators/classes/operator-short-info.d.ts.map +1 -0
  16. package/dist/src/operators/classes/operators-list-filters.d.ts +47 -0
  17. package/dist/src/operators/classes/operators-list-filters.d.ts.map +1 -0
  18. package/dist/src/operators/index.d.ts +4 -0
  19. package/dist/src/operators/index.d.ts.map +1 -0
  20. package/dist/src/operators/interfaces/i-operator-full-info.d.ts +16 -0
  21. package/dist/src/operators/interfaces/i-operator-full-info.d.ts.map +1 -0
  22. package/dist/src/operators/interfaces/i-operator-save-data.d.ts +18 -0
  23. package/dist/src/operators/interfaces/i-operator-save-data.d.ts.map +1 -0
  24. package/dist/src/operators/interfaces/i-operator-short-info.d.ts +11 -0
  25. package/dist/src/operators/interfaces/i-operator-short-info.d.ts.map +1 -0
  26. package/dist/src/operators/interfaces/i-operators-list-filters.d.ts +36 -0
  27. package/dist/src/operators/interfaces/i-operators-list-filters.d.ts.map +1 -0
  28. package/dist/src/operators/interfaces/index.d.ts +5 -0
  29. package/dist/src/operators/interfaces/index.d.ts.map +1 -0
  30. package/dist/src/operators/providers/index.d.ts +2 -0
  31. package/dist/src/operators/providers/index.d.ts.map +1 -0
  32. package/dist/src/operators/providers/operator-provider.d.ts +61 -0
  33. package/dist/src/operators/providers/operator-provider.d.ts.map +1 -0
  34. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"sc-common-lib.js","names":["OrderItem","OrderItem","OrderItem","OrderItem","BlogPostMediaTypeEnum","\"Image\"","\"Video\"","BlogPostMediaFile","Identity","data","BlogPostPublicationStatusEnum","\"Draft\"","\"Published\"","\"Scheduled\"","CreatableIdentity","defaultIdValue","DateHelper","BlogPostShortInfo","isNil","publishedAt","slug","startsWith","endsWith","includes","value","isString","parseISO","BlogPost","mediaFile","withContent","PaginationFiltersBase","result","k","isFunction","DatePeriod","BlogPostsListFilters","key","BlogProvider","BasePaginationProvider","isUndefined","apiDateFormat","useBaseConfigStore","format","filters","sortParams","paginationParams","response","item","postId","validationFieldResultData","isCover","uploadProgressHandler","event","mediaId","DeletableNamedIdentity","UpdatableNamedIdentity","UserShortInfo","NamedIdentity","DiscountShortInfo","PriceTemplate","ProductPriceCoefficient","PriceCoefficient","StockCount","Warehouse","ProductUnit","CodedIdentity","CatalogableItem","HiddenCatalogableItem","Image","mediaServer","PrimaryCatalogableItem","Product","Currency","sc","primaryCategory","category","im","pc","CostSourceEnum","\"Discount\"","\"PriceTemplate\"","\"ClientPrice\"","\"Product\"","ClientProduct","BaseCategory","toUpper","OrderItemBase","cloneDeep","OrderItem$1","isArray","Cart","CartProvider","HttpRequester","client","cartItem","file","blob","CalculationTypeEnum","\"m2Cost\"","\"percent\"","\"value\"","ProductFilterTypeEnum","\"Checkbox\"","\"Range\"","\"Toggle\"","Category","c","BaseClientCategory","Manager","ClientCategory","PriceCatalogableItem","PriceTemplateICatalogableItem","PriceTemplateCategory","Curator","ContactLinks","CuratedDirection","ClientShortInfo","UserCommonInfo","SalesDirection","CityWithRegionAndCountry","ManagerCommon","m","DeletableIdentity","PriceTemplateClient","PriceTemplateProduct","Property","PropertyType","PropertyValue","TemplatesListFilters","ClientPriceCatalogableItem","ClientPriceProduct","ClientPriceCategory","PricingRole","CategoryPricingRule","FilterSettings","CategoryFilterSetting","CategoryFilterValue","CategoryFilter","CatalogProvider","showHidden","link","categoryId","clientId","ClientPriceProvider","disableNotifications","recursively","managerId","productId","params","ClientPriceTemplateProvider","priceTemplateId","priceTemplateClientId","ProductCategoryDataProvider","categoryID","map","p","forEach","pcs","limit","term","error","ProductDataProvider","rec","periodFrom","ClientProductCategoryDataProvider","ClientProductDataProvider","PriceTemplateProvider","productCategoryId","PricingRoleProvider","id","TypedInstanceFactory","PropertiesProvider","rest","propertyData","typeId","propertyId","fileData","fileId","filter","propertySlug","settingsData","TemplateProductCategoryDataProvider","findCatalogItemByIdRecursive","items","type","foundInProducts","foundInChildren","flattenCatalogItems","ClientsAdditionalDataRequestTypeEnum","\"LastOrder\"","\"Contacts\"","\"PartnerGroups\"","\"PreferredDeliveryType\"","\"SalesDirection\"","\"Managers\"","\"Curators\"","BankAccount","Contact","ContactPerson","ContragentBase","Opf","PartnerGroup","contactsList","ContragentPerson","ContragentIc","ContragentUlR","ContragentUlNr","Country","ContragentFactory","OpfEnum","ClientBaseInfo","DeliveryAddress","GeoCoordinates","Client","pg","da","ChannelPrimaryInterest","SourcePrimaryInterest","DeliveryType","ClientsListFilters","Region","s","OrderShortInfo","ClientAdditionalData","contact","partnerGroup","manager","curator","ContactRelation","ContactPersonRelated","ClientDataProvider","contragentIc","contragent","contragentUlR","contragentUlNr","deliveryAddress","bankAccount","extraParams","signal","FilterOpEnum","phone","clientIDs","clients","dataTypes","passwordConfirm","promises","managers","curatorId","curatedDirection","curators","contragentId","contactPerson","deliveryAddressId","extraData","url","isPrimary","UnknownClientDataProvider","reject","VersionConfig","ConfiguratorsEnum","\"Kozyrek\"","\"Mosquitto\"","\"Strip\"","\"MetalForDoors\"","\"Sandwich\"","\"SandwichM2\"","ConfiguratorProvider","newTemplate","templateId","TableDataPaginationRequestParams","TableDataPagination","TableDataSortRequestParams","CalendarHelper","from","to","date","shift","endOfMonth","addMonths","amount","monthOffset","differenceInCalendarMonths","startOfMonth","currentPeriodStart","targetMonthStart","shiftedPeriodStart","day","getDate","getDaysInMonth","startOfDay","endOfDay","setDate","startOfWeek","addWeeks","shiftWeeks","dayOffset","differenceInCalendarDays","addDays","currentStart","dayNumber","targetStart","targetEnd","targetLength","currentIndex","totalIndex","monthShift","decadeIndex","monthStart","daysAgoIso","subDays","startOfToday","days","pluralize","cases","normalized","titles","formatRelativeDate","isoDate","diffDays","DateTimeProvider","nextWorkingDay","addBusinessDays","now","yearStart","startOfYear","year","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","isEmpty","list","period","DiscountStateEnum","\"Active\"","\"Completed\"","DiscountStateHelper","discount","Discount","product","source","DiscountClientEligibility","DiscountsListFilters","DiscountProvider","discountId","updateFixedClients","FaqGroup","Faq","group","FaqProvider","groupId","faqId","formatPercentChange","percent","round","UnitsHelper","ManagerDataFactory","ManagersListFilters","salesDirection","ManagerProvider","ManagerDataProvider","UserRegionShortInfo","OfferActualizationStatus","\"Processing\"","\"Error\"","\"NeedsActualization\"","OfferActualization","OfferShortInfo","ProfstroyOfferItem","Offer","OffersListFilters","OrderInfo","OrderStatus","Reference","attachedAt","OrderItem","replacement","Order","OffersDataProvider","offerId","offerProductId","recipientText","OfferHelper","offer","OrderAction","\"View\"","\"Share\"","\"EditTags\"","\"SaveOrderIgnoredProducts\"","\"ChangeStatus\"","\"ChangeProducts\"","\"ChangeOrderParameters\"","\"Recalculate\"","\"AttachOrder\"","\"DetachOrder\"","\"ChangeAttachedOperator\"","\"SendOnlinePaymentLink\"","\"ConfirmOnlineFullPayment\"","\"MergeOrders\"","\"GetHistory\"","\"CloneOrder\"","\"DeleteAttachedFile\"","OrderEditorData","order","OrdersListFilters","o","Operator","PaymentType","w","OrderStatusHistoryInfo","createdAt","OrdersDataProvider","FilterGroup","orderId","cartItemIds","options","orderProductId","orderProduct","addressId","warehouseId","currentOrderInjectionKey","PriceAnalyze","convertPriceAnalyzeFilters","omitBy","city","isObject","convertPriceAnalyzeParams","PriceAnalyzeProvider","PriceHistoryItem","ProductPriceHistory","PriceHistoryDataProvider","updatedFilters","merge","isDate","responseData","ReclamationItem","ReclamationStatusEnum","\"Initiated\"","\"InfoRequired\"","\"Pending\"","ReclamationShortInfo","Reclamation","ReclamationsListFilters","ReclamationStatusHelper","status","statuses","ReclamationProvider","reclamationId","RecommendationsList","RecommendationsDataProvider","productCategory","recommendations","ReferenceDataFactory","Ctor","reference","MetaTagItem","Seo","ResourceType","SeoDataProvider","resourceType","resourceId","seo","SearchProductStatistic","StatisticsProvider","AddressQualityEnum","\"Undetermined\"","\"Complete\"","\"Incomplete\"","AddressQualityHelper","isIncompleteBlocked","quality","FieldValidationResultData","DataSuggestionProvider","UserAuthDataProvider","UserRegionEmployee","UserRegion","user","UserRegionsListFilters","UserRegionProvider","regionId","userId","salesDirectionId"],"sources":["../src/blog/enums/blog-post-media-type-enum.ts","../src/blog/classes/blog-post-media-file.ts","../src/blog/enums/blog-post-publication-status-enum.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/blog/providers/blog-provider.ts","../src/system/classes/deletable-named-identity.ts","../src/user/classes/user-short-info.ts","../src/catalog/classes/discount-short-info.ts","../src/catalog/classes/price-template.ts","../src/catalog/classes/product-price-coefficient.ts","../src/catalog/classes/stock-count.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/product-filter-type-enum.ts","../src/catalog/classes/category.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/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.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/classes/bank-account.ts","../src/contacts/classes/contact.ts","../src/contacts/classes/contact-person.ts","../src/clients/classes/contragent/contragent-base.ts","../src/clients/classes/contragent/contragent-person.ts","../src/clients/classes/contragent/contragent-ic.ts","../src/clients/classes/contragent/contragent-ul-r.ts","../src/clients/classes/contragent/contragent-ul-nr.ts","../src/clients/classes/contragent/contragent-factory.ts","../src/clients/classes/client-base-info.ts","../src/clients/classes/delivery-address.ts","../src/clients/classes/client.ts","../src/clients/classes/clients-list-filters.ts","../src/orders/classes/order-short-info.ts","../src/clients/classes/client-additional-data.ts","../src/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/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/managers/classes/manager-data-factory.ts","../src/managers/classes/managers-list-filters.ts","../src/managers/providers/manager-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/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/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/reclamations/classes/reclamation-item.ts","../src/reclamations/enums/reclamation-status-enum.ts","../src/reclamations/classes/reclamation-short-info.ts","../src/reclamations/classes/reclamation.ts","../src/reclamations/classes/reclamations-list-filters.ts","../src/reclamations/helpers/reclamation-status-helper.ts","../src/reclamations/providers/reclamation-provider.ts","../src/recommendations/classes/recommendations-list.ts","../src/recommendations/providers/recommendations-data-provider.ts","../src/references/classes/reference-data-factory.ts","../src/seo/classes/meta-tag-item.ts","../src/seo/classes/seo.ts","../src/seo/providers/seo-data-provider.ts","../src/statistics/classes/search-product-statistic.ts","../src/statistics/providers/statistics-provider.ts","../src/suggestion/enums/address-quality-enum.ts","../src/suggestion/helpers/address-quality-helper.ts","../src/suggestion/providers/data-suggestion-provider.ts","../src/user/providers/user-auth-data-provider.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"],"sourcesContent":["/* 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 { BlogPostMediaTypeEnum } from '@common/blog/enums/blog-post-media-type-enum';\nimport { IBlogPostMediaFile } from '@common/blog/interfaces/i-blog-post-media-file';\nimport { Identity } from '@snabcentr/common-core';\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 { ICreatableIdentity } from '@common/system/interfaces/i-creatable-identity';\nimport { DateHelper, Identity } from '@snabcentr/common-core';\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 '@common/blog/enums/blog-post-publication-status-enum';\nimport { IBlogPostShortInfo } from '@common/blog/interfaces/i-blog-post-short-info';\nimport { CreatableIdentity } from '@common/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 '@common/blog/classes/blog-post-media-file';\nimport { BlogPostShortInfo } from '@common/blog/classes/blog-post-short-info';\nimport { IBlogPost } from '@common/blog/interfaces/i-blog-post';\nimport { IBlogPostMediaFile } from '@common/blog/interfaces/i-blog-post-media-file';\nimport { IBlogPostSaveData } from '@common/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 '@common/pagination/filters/i-pagination-filters-base';\nimport { IReference } from '@snabcentr/common-core';\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 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 // eslint-disable-next-line security/detect-object-injection\n result[k] = value;\n }\n });\n\n return result;\n }\n}\n","import { IDatePeriod } from '@snabcentr/common-core';\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 '@common/blog/enums/blog-post-publication-status-enum';\nimport { IBlogPostsListFilters } from '@common/blog/interfaces/i-blog-posts-list-filters';\nimport { PaginationFiltersBase } from '@common/pagination/filters/pagination-filters-base';\nimport { DatePeriod } from '@common/system/classes/date-period';\nimport { IDatePeriod } from '@snabcentr/common-core';\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 { BlogPost } from '@common/blog/classes/blog-post';\nimport { BlogPostMediaFile } from '@common/blog/classes/blog-post-media-file';\nimport { BlogPostShortInfo } from '@common/blog/classes/blog-post-short-info';\nimport { IBlogPost } from '@common/blog/interfaces/i-blog-post';\nimport { IBlogPostMediaFile } from '@common/blog/interfaces/i-blog-post-media-file';\nimport { IBlogPostSaveData } from '@common/blog/interfaces/i-blog-post-save-data';\nimport { IBlogPostShortInfo } from '@common/blog/interfaces/i-blog-post-short-info';\nimport { IFile } from '@common/system/interfaces/i-file';\nimport {\n BasePaginationProvider,\n IFieldValidationResultData,\n IFilterGroup,\n IPaginatedResponse,\n IPaginationRequestParams,\n ISortRequestParams,\n useBaseConfigStore,\n} from '@snabcentr/common-core';\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 = useBaseConfigStore().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","import { IDeletableNamedIdentity } from '@common/system/interfaces/i-deletable-named-identity';\nimport { DateHelper, UpdatableNamedIdentity } from '@snabcentr/common-core';\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 { IUserShortInfo } from '@common/user/interfaces/i-user-short-info';\nimport { NamedIdentity, UserTypeEnum } from '@snabcentr/common-core';\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 '@common/catalog/interfaces/i-discount-short-info';\nimport { DeletableNamedIdentity } from '@common/system/classes/deletable-named-identity';\nimport { UserShortInfo } from '@common/user/classes/user-short-info';\nimport { IUserShortInfo } from '@common/user/interfaces/i-user-short-info';\nimport { DateHelper } from '@snabcentr/common-core';\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 '@common/catalog/interfaces/i-price-template';\nimport { UserShortInfo } from '@common/user/classes/user-short-info';\nimport { UpdatableNamedIdentity } from '@snabcentr/common-core';\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","import { IProductPriceCoefficient } from '@common/catalog/interfaces/i-product-price-coefficient';\nimport { IPriceCoefficient, PriceCoefficient } from '@snabcentr/common-core';\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 { IStockCount } from '@common/catalog/interfaces/i-stock-count';\nimport { IWarehouse, Warehouse } from '@snabcentr/common-core';\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 { IProductUnit } from '@common/references/interfaces/i-product-unit';\nimport { NamedIdentity } from '@snabcentr/common-core';\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 { ICodedIdentity } from '@common/system/interfaces/i-coded-identity';\nimport { NamedIdentity } from '@snabcentr/common-core';\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 '@common/system/classes/coded-identity';\nimport { ICatalogableItem } from '@common/system/interfaces/i-catalogable-item';\nimport { CatalogableItemType } from '@common/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 '@common/system/classes/catalogable-item';\nimport { IHiddenCatalogableItem } from '@common/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 '@common/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 '@common/system/classes/catalogable-item';\nimport { IPrimaryCatalogableItem } from '@common/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 '@common/catalog/classes/product-price-coefficient';\nimport { StockCount } from '@common/catalog/classes/stock-count';\nimport { IProduct } from '@common/catalog/interfaces/i-product';\nimport { IProductPriceCoefficient } from '@common/catalog/interfaces/i-product-price-coefficient';\nimport { IStockCount } from '@common/catalog/interfaces/i-stock-count';\nimport { PropertiesList } from '@common/catalog/types/properties-list';\nimport { ProductUnit } from '@common/references/classes/product-unit';\nimport { IProductUnit } from '@common/references/interfaces/i-product-unit';\nimport { HiddenCatalogableItem } from '@common/system/classes/hidden-catalogable-item';\nimport { Image } from '@common/system/classes/image';\nimport { PrimaryCatalogableItem } from '@common/system/classes/primary-catalogable-item';\nimport { IImage } from '@common/system/interfaces/i-image';\nimport { IPrimaryCatalogableItem } from '@common/system/interfaces/i-primary-catalogable-item';\nimport { Currency, ICurrency, useBaseConfigStore } from '@snabcentr/common-core';\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, useBaseConfigStore().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 '@common/catalog/classes/discount-short-info';\nimport { PriceTemplate } from '@common/catalog/classes/price-template';\nimport { Product } from '@common/catalog/classes/product';\nimport { CostSourceEnum } from '@common/catalog/enums/cost-source-enum';\nimport { IClientProduct } from '@common/catalog/interfaces/i-client-product';\nimport { IDiscountShortInfo } from '@common/catalog/interfaces/i-discount-short-info';\nimport { IPriceTemplate } from '@common/catalog/interfaces/i-price-template';\nimport { IPriceCoefficient, PriceCoefficient } from '@snabcentr/common-core';\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 '@common/catalog/interfaces/internal/base/i-base-category';\nimport { PropertiesList } from '@common/catalog/types/properties-list';\nimport { PrimaryCatalogableItem } from '@common/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 '@common/cart/interfaces/i-cart-item-configurator-params-base';\nimport { IOrderItemBase } from '@common/cart/interfaces/i-order-item-base';\nimport { ClientProduct } from '@common/catalog/classes/client-product';\nimport { BaseCategory } from '@common/catalog/classes/internal/base/base-category';\nimport { IClientProduct } from '@common/catalog/interfaces/i-client-product';\nimport { ConfiguratorName } from '@common/configurator/types/configurator-name';\nimport { UserShortInfo } from '@common/user/classes/user-short-info';\nimport { IUserShortInfo } from '@common/user/interfaces/i-user-short-info';\nimport { Currency, ICurrency, Identity } from '@snabcentr/common-core';\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 '@common/cart/interfaces/i-cart-item-configurator-params-base';\nimport { IOrderItem } from '@common/cart/interfaces/i-order-item';\nimport { OrderItemBase } from '@common/orders/classes/order-item-base';\nimport { Currency, ICurrency } from '@snabcentr/common-core';\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 '@common/cart/classes/order-item';\nimport { ICart } from '@common/cart/interfaces/i-cart';\nimport { ICartSum } from '@common/cart/interfaces/i-cart-sum';\nimport { IOrderItem } from '@common/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 '@common/cart/classes/cart';\nimport { ICart } from '@common/cart/interfaces/i-cart';\nimport { ICartItemConfiguratorParamsBase } from '@common/cart/interfaces/i-cart-item-configurator-params-base';\nimport { IOrderItemBase } from '@common/cart/interfaces/i-order-item-base';\nimport { IFileUploadData } from '@common/catalog/interfaces/i-file-upload-data';\nimport { IClient } from '@common/clients/interfaces/i-client';\nimport { HttpRequester, IFieldValidationResultData } from '@snabcentr/common-core';\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 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 '@common/catalog/classes/internal/base/base-category';\nimport { Product } from '@common/catalog/classes/product';\nimport { ICategory } from '@common/catalog/interfaces/i-category';\nimport { IProduct } from '@common/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 { BaseCategory } from '@common/catalog/classes/internal/base/base-category';\nimport { IBaseClientCategory } from '@common/catalog/interfaces/internal/base/i-base-client-category';\nimport { IManager, Manager } from '@snabcentr/common-core';\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 '@common/catalog/classes/client-product';\nimport { BaseClientCategory } from '@common/catalog/classes/internal/base/base-client-category';\nimport { IClientCategory } from '@common/catalog/interfaces/i-client-category';\nimport { IClientProduct } from '@common/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 '@common/catalog/interfaces/i-price-catalogable-item';\nimport { IPriceCoefficient, PriceCoefficient } from '@snabcentr/common-core';\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 '@common/catalog/classes/price-catalogable-item';\nimport { IPriceTemplateICatalogableItem } from '@common/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 '@common/catalog/classes/internal/base/base-category';\nimport { PriceTemplateICatalogableItem } from '@common/catalog/classes/price-template-catalogable-item';\nimport { IPriceTemplateCategory } from '@common/catalog/interfaces/i-price-template-category';\nimport { IBaseCategory } from '@common/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 { ICurator } from '@common/managers/interfaces/i-curator';\nimport { ContactLinks, CuratedDirection, IContactLinks, ICuratedDirection, NamedIdentity } from '@snabcentr/common-core';\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","/* eslint-disable @typescript-eslint/no-unnecessary-condition */\n\nimport { IClientShortInfo } from '@common/clients/interfaces/i-client-short-info';\nimport { Curator } from '@common/managers/classes/curator';\nimport { ICurator } from '@common/managers/interfaces/i-curator';\nimport { CityWithRegionAndCountry, ICityWithRegionAndCountry, IManagerCommon, ISalesDirection, ManagerCommon, SalesDirection, UserCommonInfo } from '@snabcentr/common-core';\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 { CreatableIdentity } from '@common/system/classes/creatable-identity';\nimport { IDeletableIdentity } from '@common/system/interfaces/i-deletable-identity';\nimport { DateHelper } from '@snabcentr/common-core';\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 '@common/catalog/classes/price-template';\nimport { IPriceTemplate } from '@common/catalog/interfaces/i-price-template';\nimport { IPriceTemplateClient } from '@common/catalog/interfaces/i-price-template-client';\nimport { ClientShortInfo } from '@common/clients/classes/client-short-info';\nimport { IClientShortInfo } from '@common/clients/interfaces/i-client-short-info';\nimport { DeletableIdentity } from '@common/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 '@common/catalog/classes/price-template-catalogable-item';\nimport { Product } from '@common/catalog/classes/product';\nimport { IPriceTemplateProduct } from '@common/catalog/interfaces/i-price-template-product';\nimport { IProduct } from '@common/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 { IProperty } from '@common/catalog/interfaces/i-property';\nimport { IPropertyType, NamedIdentity, PropertyType } from '@snabcentr/common-core';\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 '@common/catalog/classes/property';\nimport { IPropertyValue } from '@common/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 '@common/catalog/interfaces/i-templates-list-filters';\nimport { DatePeriod } from '@common/system/classes/date-period';\nimport { IDatePeriod, IReference } from '@snabcentr/common-core';\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 // eslint-disable-next-line @typescript-eslint/unbound-method\n const value = this[k as keyof ITemplatesListFilters];\n\n if (!(\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 // 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 '@common/catalog/classes/price-catalogable-item';\nimport { IClientPriceCatalogableItem } from '@common/catalog/interfaces/i-client-price-catalogable-item';\nimport { UserShortInfo } from '@common/user/classes/user-short-info';\nimport { IUserShortInfo } from '@common/user/interfaces/i-user-short-info';\nimport { DateHelper } from '@snabcentr/common-core';\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 '@common/catalog/classes/client-price-catalogable-item';\nimport { Product } from '@common/catalog/classes/product';\nimport { IClientPriceProduct } from '@common/catalog/interfaces/i-client-price-product';\nimport { IProduct } from '@common/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 '@common/catalog/classes/client-price-catalogable-item';\nimport { BaseCategory } from '@common/catalog/classes/internal/base/base-category';\nimport { IClientPriceCategory } from '@common/catalog/interfaces/i-client-price-category';\nimport { IBaseCategory } from '@common/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 '@common/catalog/interfaces/i-pricing-role';\nimport { NamedIdentity } from '@snabcentr/common-core';\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 '@common/catalog/classes/internal/base/base-category';\nimport { PricingRole } from '@common/catalog/classes/pricing-role';\nimport { ICategoryPricingRule } from '@common/catalog/interfaces/i-category-pricing-rule';\nimport { IPricingRole } from '@common/catalog/interfaces/i-pricing-role';\nimport { IBaseCategory } from '@common/catalog/interfaces/internal/base/i-base-category';\nimport { IPriceCoefficient, PriceCoefficient } from '@snabcentr/common-core';\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 '@common/catalog/enums/product-filter-type-enum';\nimport { IFilterSettings } from '@common/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 '@common/catalog/classes/filter-settings';\nimport { BaseCategory } from '@common/catalog/classes/internal/base/base-category';\nimport { Property } from '@common/catalog/classes/property';\nimport { ICategoryFilterSetting } from '@common/catalog/interfaces/i-category-filter-setting';\nimport { IFilterSettings } from '@common/catalog/interfaces/i-filter-settings';\nimport { IProperty } from '@common/catalog/interfaces/i-property';\nimport { IBaseCategory } from '@common/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 '@common/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 '@common/catalog/classes/category-filter-value';\nimport { ProductFilterTypeEnum } from '@common/catalog/enums/product-filter-type-enum';\nimport { ICategoryFilter } from '@common/catalog/interfaces/i-category-filter';\nimport { ICategoryFilterValue } from '@common/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 '@common/catalog/types/search-result';\nimport { HttpRequester, useBaseConfigStore } from '@snabcentr/common-core';\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 // eslint-disable-next-line @typescript-eslint/no-useless-default-assignment -- параметр не может быть последним необязательным без значения по умолчанию (default-param-last).\n categoryId: number | undefined = undefined,\n // eslint-disable-next-line @typescript-eslint/no-useless-default-assignment -- параметр не может быть последним необязательным без значения по умолчанию (default-param-last).\n clientId: number | undefined = undefined\n ): string {\n const appConfig = useBaseConfigStore().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 '@common/catalog/classes/client-price-category';\nimport { ClientPriceProduct } from '@common/catalog/classes/client-price-product';\nimport { IClientPriceCategory } from '@common/catalog/interfaces/i-client-price-category';\nimport { IClientPriceProduct } from '@common/catalog/interfaces/i-client-price-product';\nimport { ICommercialOffer } from '@common/catalog/interfaces/i-commercial-offer';\nimport { ICommercialOfferParams } from '@common/catalog/interfaces/i-commercial-offer-params';\nimport { IFileUploadData } from '@common/catalog/interfaces/i-file-upload-data';\nimport { IPriceUpdateData } from '@common/catalog/interfaces/i-price-update-data';\nimport { HttpRequester } from '@snabcentr/common-core';\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 '@common/catalog/classes/price-template-client';\nimport { IPriceTemplateClient } from '@common/catalog/interfaces/i-price-template-client';\nimport { IPriceTemplateClientUpdateData } from '@common/catalog/interfaces/i-price-template-client-update-data';\nimport { HttpRequester, useBaseConfigStore } from '@snabcentr/common-core';\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 = useBaseConfigStore().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 = useBaseConfigStore().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 '@common/catalog/classes/category';\nimport { Product } from '@common/catalog/classes/product';\nimport { ProductPriceCoefficient } from '@common/catalog/classes/product-price-coefficient';\nimport { ICategory } from '@common/catalog/interfaces/i-category';\nimport { IProduct } from '@common/catalog/interfaces/i-product';\nimport { IProductPriceCoefficient } from '@common/catalog/interfaces/i-product-price-coefficient';\nimport { HttpRequester } from '@snabcentr/common-core';\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 '@common/catalog/classes/product';\nimport { ProductPriceCoefficient } from '@common/catalog/classes/product-price-coefficient';\nimport { IProduct } from '@common/catalog/interfaces/i-product';\nimport { IProductPriceCoefficient } from '@common/catalog/interfaces/i-product-price-coefficient';\nimport { BasePaginationProvider, IPaginatedResponse, IPaginationRequestParams, useBaseConfigStore } from '@snabcentr/common-core';\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 = useBaseConfigStore().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 '@common/catalog/classes/client-category';\nimport { ClientProduct } from '@common/catalog/classes/client-product';\nimport { IClientCategory } from '@common/catalog/interfaces/i-client-category';\nimport { IClientProduct } from '@common/catalog/interfaces/i-client-product';\nimport { HttpRequester } from '@snabcentr/common-core';\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 '@common/catalog/classes/client-product';\nimport { IClientProduct } from '@common/catalog/interfaces/i-client-product';\nimport { BasePaginationProvider, IPaginatedResponse, IPaginationRequestParams, useBaseConfigStore } from '@snabcentr/common-core';\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 = useBaseConfigStore().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 '@common/catalog/classes/price-template';\nimport { PriceTemplateCategory } from '@common/catalog/classes/price-template-category';\nimport { PriceTemplateClient } from '@common/catalog/classes/price-template-client';\nimport { PriceTemplateProduct } from '@common/catalog/classes/price-template-product';\nimport { IPriceTemplate } from '@common/catalog/interfaces/i-price-template';\nimport { IPriceTemplateCategory } from '@common/catalog/interfaces/i-price-template-category';\nimport { IPriceTemplateClient } from '@common/catalog/interfaces/i-price-template-client';\nimport { IPriceTemplateCreateData } from '@common/catalog/interfaces/i-price-template-create-data';\nimport { IPriceTemplateProduct } from '@common/catalog/interfaces/i-price-template-product';\nimport { IPriceUpdateData } from '@common/catalog/interfaces/i-price-update-data';\nimport { BasePaginationProvider, IFieldValidationResultData, IFilterGroup, IPaginatedResponse, IPaginationRequestParams, ISortRequestParams } from '@snabcentr/common-core';\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 '@common/catalog/classes/category-pricing-rule';\nimport { PricingRole } from '@common/catalog/classes/pricing-role';\nimport { ICategoryPricingRule } from '@common/catalog/interfaces/i-category-pricing-rule';\nimport { ICategoryPricingRuleUpdateData } from '@common/catalog/interfaces/i-category-pricing-rule-update-data';\nimport { IPricingRole } from '@common/catalog/interfaces/i-pricing-role';\nimport { IPricingRoleCreateData } from '@common/catalog/interfaces/i-pricing-role-create-data';\nimport { HttpRequester, TypedInstanceFactory } from '@snabcentr/common-core';\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 '@common/catalog/classes/category-filter';\nimport { CategoryFilterSetting } from '@common/catalog/classes/category-filter-setting';\nimport { Property } from '@common/catalog/classes/property';\nimport { PropertyValue } from '@common/catalog/classes/property-value';\nimport { ICatalogItemPropertyFile } from '@common/catalog/interfaces/i-catalog-item-property-file';\nimport { ICategoryFilter } from '@common/catalog/interfaces/i-category-filter';\nimport { ICategoryFilterSetting } from '@common/catalog/interfaces/i-category-filter-setting';\nimport { ICategoryFilterSettingUpdateData } from '@common/catalog/interfaces/i-category-filter-setting-update-data';\nimport { IDescription } from '@common/catalog/interfaces/i-description';\nimport { IFileUpdateData } from '@common/catalog/interfaces/i-file-update-data';\nimport { IFileUploadData } from '@common/catalog/interfaces/i-file-upload-data';\nimport { IProperty } from '@common/catalog/interfaces/i-property';\nimport { IPropertyCreateData } from '@common/catalog/interfaces/i-property-create-data';\nimport { IPropertyValue } from '@common/catalog/interfaces/i-property-value';\nimport { ISpecification } from '@common/catalog/interfaces/i-specification';\nimport { IFile } from '@common/system/interfaces/i-file';\nimport { BasePaginationProvider, IFilterGroup, IPaginatedResponse, IPaginationRequestParams, ISortRequestParams } from '@snabcentr/common-core';\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 '@common/catalog/classes/category';\nimport { Product } from '@common/catalog/classes/product';\nimport { ICategory } from '@common/catalog/interfaces/i-category';\nimport { IProduct } from '@common/catalog/interfaces/i-product';\nimport { HttpRequester } from '@snabcentr/common-core';\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 '@common/catalog/interfaces/i-category';\nimport { IProduct } from '@common/catalog/interfaces/i-product';\nimport { ICatalogableItem } from '@common/system/interfaces/i-catalogable-item';\nimport { CatalogableItemType } from '@common/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 '@common/catalog/interfaces/i-category';\nimport { ICatalogableItem } from '@common/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 @typescript-eslint/no-unnecessary-condition */\n\nimport { IBankAccount } from '@common/clients/interfaces/i-bank-account';\nimport { Currency, ICurrency, Identity } from '@snabcentr/common-core';\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 '@common/contacts/interfaces/i-contact';\nimport { DeletableNamedIdentity } from '@common/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 '@common/contacts/classes/contact';\nimport { IContactPerson } from '@common/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","/* eslint-disable @typescript-eslint/no-unnecessary-condition */\n\nimport { BankAccount } from '@common/clients/classes/bank-account';\nimport { IContragentBase } from '@common/clients/interfaces/contragent/i-contragent-base';\nimport { IBankAccount } from '@common/clients/interfaces/i-bank-account';\nimport { ContactPerson } from '@common/contacts/classes/contact-person';\nimport { IContactPerson } from '@common/contacts/interfaces/i-contact-person';\nimport { DeletableNamedIdentity } from '@common/system/classes/deletable-named-identity';\nimport { UserShortInfo } from '@common/user/classes/user-short-info';\nimport { IUserShortInfo } from '@common/user/interfaces/i-user-short-info';\nimport { IOpf, IPartnerGroup, Opf, PartnerGroup } from '@snabcentr/common-core';\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 '@common/clients/classes/contragent/contragent-base';\nimport { IContragentPerson } from '@common/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 '@common/clients/classes/contragent/contragent-base';\nimport { IContragentIc } from '@common/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 ogrn: 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.ogrn = data.ogrn ?? '';\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 '@common/clients/classes/contragent/contragent-ic';\nimport { IContragentUlR } from '@common/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 '@common/clients/classes/contragent/contragent-ul-r';\nimport { IContragentUlNr } from '@common/clients/interfaces/contragent/i-contragent-ul-nr';\nimport { Country, ICountry } from '@snabcentr/common-core';\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 '@common/clients/classes/contragent/contragent-ic';\nimport { ContragentPerson } from '@common/clients/classes/contragent/contragent-person';\nimport { ContragentUlNr } from '@common/clients/classes/contragent/contragent-ul-nr';\nimport { ContragentUlR } from '@common/clients/classes/contragent/contragent-ul-r';\nimport { IContragentBase } from '@common/clients/interfaces/contragent/i-contragent-base';\nimport { IContragentIc } from '@common/clients/interfaces/contragent/i-contragent-ic';\nimport { IContragentUlNr } from '@common/clients/interfaces/contragent/i-contragent-ul-nr';\nimport { IContragentUlR } from '@common/clients/interfaces/contragent/i-contragent-ul-r';\nimport { OpfEnum } from '@snabcentr/common-core';\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);\n }\n }\n}\n","import { IClientBaseInfo } from '@common/clients/interfaces/i-client-base-info';\nimport { CityWithRegionAndCountry, ICityWithRegionAndCountry, NamedIdentity } from '@snabcentr/common-core';\n\n/**\n * Базовые данные о клиенте: название, город и признак активности.\n */\nexport class ClientBaseInfo extends NamedIdentity implements IClientBaseInfo {\n /**\n * @inheritDoc\n */\n public city?: ICityWithRegionAndCountry;\n\n /**\n * @inheritDoc\n */\n public isActive: boolean;\n\n /**\n * Инициализирует экземпляр класса {@link ClientBaseInfo}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IClientBaseInfo>) {\n super(data);\n\n this.city = data?.city ? new CityWithRegionAndCountry(data.city) : undefined;\n this.isActive = data?.isActive ?? false;\n }\n}\n","/* eslint-disable @typescript-eslint/no-unnecessary-condition */\n\nimport { IDeliveryAddress } from '@common/clients/interfaces/i-delivery-address';\nimport { ContactPerson } from '@common/contacts/classes/contact-person';\nimport { IContactPerson } from '@common/contacts/interfaces/i-contact-person';\nimport { DeletableNamedIdentity } from '@common/system/classes/deletable-named-identity';\nimport { GeoCoordinates, IGeoCoordinates } from '@snabcentr/common-core';\n\n/**\n * Данные об адресе доставки клиента.\n */\nexport class DeliveryAddress extends DeletableNamedIdentity implements IDeliveryAddress {\n /**\n * Адрес.\n */\n address: string = '';\n\n /**\n * Координаты.\n */\n coordinates?: IGeoCoordinates;\n\n /**\n * Данные о контактных лицах.\n */\n contacts: IContactPerson[];\n\n /**\n * Комментарий к адресу доставки клиента.\n */\n public comment?: string;\n\n /**\n * Данные о времени работы.\n */\n public operatingHours?: {\n /**\n * Время работы, с (в формате ЧЧ:ММ).\n */\n from: string;\n\n /**\n * Время работы, до (в формате ЧЧ:ММ).\n */\n to: string;\n };\n\n /**\n * Признак одноразового адреса (адрес, который удаляется после завершения заказа).\n */\n public isOneTime?: boolean;\n\n /**\n * Признак того, что указанный адрес является адресом транспортной компании.\n */\n public isTransportCompanyAddress?: boolean;\n\n /**\n * Инициализирует экземпляр класса {@link DeliveryAddress}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IDeliveryAddress) {\n super(data);\n\n this.address = data?.address ?? '';\n this.coordinates = new GeoCoordinates(data?.coordinates);\n this.contacts = data?.contacts?.map((c) => new ContactPerson(c)) ?? [];\n this.comment = data?.comment;\n this.operatingHours = data?.operatingHours;\n this.isOneTime = data?.isOneTime;\n this.isTransportCompanyAddress = data?.isTransportCompanyAddress;\n }\n}\n","/* eslint-disable @typescript-eslint/no-unnecessary-condition */\n\nimport { ClientShortInfo } from '@common/clients/classes/client-short-info';\nimport { ContragentFactory } from '@common/clients/classes/contragent/contragent-factory';\nimport { DeliveryAddress } from '@common/clients/classes/delivery-address';\nimport { IContragentIc } from '@common/clients/interfaces/contragent/i-contragent-ic';\nimport { IContragentPerson } from '@common/clients/interfaces/contragent/i-contragent-person';\nimport { IContragentUlNr } from '@common/clients/interfaces/contragent/i-contragent-ul-nr';\nimport { IContragentUlR } from '@common/clients/interfaces/contragent/i-contragent-ul-r';\nimport { IClient } from '@common/clients/interfaces/i-client';\nimport { IDeliveryAddress } from '@common/clients/interfaces/i-delivery-address';\nimport { ContactPerson } from '@common/contacts/classes/contact-person';\nimport { IContactPerson } from '@common/contacts/interfaces/i-contact-person';\nimport {\n ChannelPrimaryInterest,\n DeliveryType,\n IChannelPrimaryInterest,\n IDeliveryType,\n IPartnerGroup,\n ISourcePrimaryInterest,\n IWarehouse,\n PartnerGroup,\n SourcePrimaryInterest,\n Warehouse,\n} from '@snabcentr/common-core';\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 '@common/clients/interfaces/i-clients-list-filters';\nimport { Contact } from '@common/contacts/classes/contact';\nimport { IContact } from '@common/contacts/interfaces/i-contact';\nimport { Curator } from '@common/managers/classes/curator';\nimport { ICurator } from '@common/managers/interfaces/i-curator';\nimport { IOrdersListFilters } from '@common/orders/interfaces/i-orders-list-filters';\nimport { PaginationFiltersBase } from '@common/pagination/filters/pagination-filters-base';\nimport { DatePeriod } from '@common/system/classes/date-period';\nimport {\n CityWithRegionAndCountry,\n Country,\n DeliveryType,\n ICityWithRegionAndCountry,\n ICountry,\n IDatePeriod,\n IDeliveryType,\n IManager,\n IOpf,\n IPartnerGroup,\n IRegion,\n ISalesDirection,\n Manager,\n Opf,\n PartnerGroup,\n Region,\n SalesDirection,\n} from '@snabcentr/common-core';\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 '@common/orders/interfaces/i-order-short-info';\nimport { CreatableIdentity } from '@common/system/classes/creatable-identity';\nimport { UserShortInfo } from '@common/user/classes/user-short-info';\nimport { IUserShortInfo } from '@common/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 '@common/clients/interfaces/i-client-additional-data';\nimport { ContactPerson } from '@common/contacts/classes/contact-person';\nimport { IContactPerson } from '@common/contacts/interfaces/i-contact-person';\nimport { Curator } from '@common/managers/classes/curator';\nimport { ICurator } from '@common/managers/interfaces/i-curator';\nimport { OrderShortInfo } from '@common/orders/classes/order-short-info';\nimport { IOrderShortInfo } from '@common/orders/interfaces/i-order-short-info';\nimport { DeliveryType, IDeliveryType, IManagerCommon, IPartnerGroup, ISalesDirection, ManagerCommon, NamedIdentity, PartnerGroup, SalesDirection } from '@snabcentr/common-core';\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 '@common/contacts/interfaces/i-contact-relation';\nimport { Identity } from '@snabcentr/common-core';\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 '@common/contacts/classes/contact-person';\nimport { ContactRelation } from '@common/contacts/classes/contact-relation';\nimport { IContactPersonRelated } from '@common/contacts/interfaces/i-contact-person-related';\nimport { IContactRelation } from '@common/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 '@common/clients/classes/bank-account';\nimport { Client } from '@common/clients/classes/client';\nimport { ClientAdditionalData } from '@common/clients/classes/client-additional-data';\nimport { ClientShortInfo } from '@common/clients/classes/client-short-info';\nimport { ContragentFactory } from '@common/clients/classes/contragent/contragent-factory';\nimport { DeliveryAddress } from '@common/clients/classes/delivery-address';\nimport { ClientsAdditionalDataRequestTypeEnum } from '@common/clients/enums/clients-additional-data-request-type-enum';\nimport { IContragentBase } from '@common/clients/interfaces/contragent/i-contragent-base';\nimport { IContragentIc } from '@common/clients/interfaces/contragent/i-contragent-ic';\nimport { IContragentUlNr } from '@common/clients/interfaces/contragent/i-contragent-ul-nr';\nimport { IContragentUlR } from '@common/clients/interfaces/contragent/i-contragent-ul-r';\nimport { IBankAccount } from '@common/clients/interfaces/i-bank-account';\nimport { IClient } from '@common/clients/interfaces/i-client';\nimport { IClientAdditionalData } from '@common/clients/interfaces/i-client-additional-data';\nimport { IClientShortInfo } from '@common/clients/interfaces/i-client-short-info';\nimport { IDeliveryAddress } from '@common/clients/interfaces/i-delivery-address';\nimport { ContactPerson } from '@common/contacts/classes/contact-person';\nimport { ContactPersonRelated } from '@common/contacts/classes/contact-person-related';\nimport { IContactPerson } from '@common/contacts/interfaces/i-contact-person';\nimport { IContactPersonRelated } from '@common/contacts/interfaces/i-contact-person-related';\nimport {\n BasePaginationProvider,\n FilterOpEnum,\n ICuratedDirection,\n IFieldValidationResultData,\n IFilterGroup,\n IManagerCommon,\n IPaginatedResponse,\n IPaginationRequestParams,\n ISortRequestParams,\n OpfEnum,\n TypedInstanceFactory,\n} from '@snabcentr/common-core';\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 ogrn: contragentIc.ogrn || undefined,\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 ogrn: contragentUlR.ogrn || undefined,\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\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 '@snabcentr/common-core';\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 '@common/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 '@common/cart/interfaces/i-cart-item-configurator-params-base';\nimport { Product } from '@common/catalog/classes/product';\nimport { ICategory } from '@common/catalog/interfaces/i-category';\nimport { IProduct } from '@common/catalog/interfaces/i-product';\nimport { IConfiguratorCalculateParamsSandwich } from '@common/configurator/interfaces/i-configurator-calculate-params-sandwich';\nimport { IConfiguratorCalculateResultSandwich } from '@common/configurator/interfaces/i-configurator-calculate-result-sandwich';\nimport { IConfiguratorSettingsBase } from '@common/configurator/interfaces/i-configurator-settings-base';\nimport { HttpRequester, IFieldValidationResultData } from '@snabcentr/common-core';\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 return this.request<IProduct>(\n {\n method: 'GET',\n url: `internal/catalog/categories/${category.id}/configurators/${category.properties?.configurator}/product`,\n params: { params, client_id: clientId },\n },\n (response) => new Product(response.data),\n validationFieldResultData\n );\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 '@snabcentr/common-core';\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 '@common/table-data/classes/table-data-pagination-request-params';\nimport { IPagination } from '@common/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 '@snabcentr/common-core';\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 '@snabcentr/common-core';\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 '@common/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 '@common/date-time/helpers/calendar-helper';\nimport { ILabeledPeriod } from '@common/date-time/interfaces/i-labeled-period';\nimport { IStandardPeriod } from '@common/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 '@common/date-time/types/standard-period-group-type';\nimport { StandardPeriodSectionType } from '@common/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 { ClientBaseInfo } from '@common/clients/classes/client-base-info';\nimport { IDiscountClient } from '@common/discounts/interfaces/i-discount-client';\n\n/**\n * Краткие данные о клиенте в условиях скидки.\n */\nexport class DiscountClient extends ClientBaseInfo implements IDiscountClient {}\n","import { DiscountClient } from '@common/discounts/classes/discount-client';\nimport { IDiscountClient } from '@common/discounts/interfaces/i-discount-client';\nimport { IDiscountConditions } from '@common/discounts/interfaces/i-discount-conditions';\nimport { IDiscountConditionsSaveData } from '@common/discounts/interfaces/i-discount-conditions-save-data';\nimport { DatePeriod } from '@common/system/classes/date-period';\nimport { UserShortInfo } from '@common/user/classes/user-short-info';\nimport { IUserShortInfo } from '@common/user/interfaces/i-user-short-info';\nimport {\n CityWithRegionAndCountry,\n ICityWithRegionAndCountry,\n IDatePeriod,\n IPartnerGroup,\n IRegion,\n ISalesDirection,\n PartnerGroup,\n Region,\n SalesDirection,\n} from '@snabcentr/common-core';\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","/**\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 '@common/catalog/interfaces/i-discount-short-info';\nimport { DiscountStateEnum } from '@common/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 '@common/catalog/classes/category';\nimport { DiscountShortInfo } from '@common/catalog/classes/discount-short-info';\nimport { Product } from '@common/catalog/classes/product';\nimport { ICategory } from '@common/catalog/interfaces/i-category';\nimport { IProduct } from '@common/catalog/interfaces/i-product';\nimport { DiscountConditions } from '@common/discounts/classes/discount-conditions';\nimport { DiscountStateEnum } from '@common/discounts/enums/discount-state-enum';\nimport { DiscountStateHelper } from '@common/discounts/helpers/discount-state-helper';\nimport { IDiscount } from '@common/discounts/interfaces/i-discount';\nimport { IDiscountSaveData } from '@common/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 percent: 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 '@common/discounts/classes/discount-client';\nimport { IDiscountClient } from '@common/discounts/interfaces/i-discount-client';\nimport { IDiscountClientEligibility } from '@common/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 '@common/discounts/enums/discount-state-enum';\nimport { IDiscountsListFilters } from '@common/discounts/interfaces/i-discounts-list-filters';\nimport { PaginationFiltersBase } from '@common/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 '@common/catalog/classes/discount-short-info';\nimport { IDiscountShortInfo } from '@common/catalog/interfaces/i-discount-short-info';\nimport { Discount } from '@common/discounts/classes/discount';\nimport { DiscountClientEligibility } from '@common/discounts/classes/discount-client-eligibility';\nimport { IDiscount } from '@common/discounts/interfaces/i-discount';\nimport { IDiscountClientEligibility } from '@common/discounts/interfaces/i-discount-client-eligibility';\nimport { IDiscountSaveData } from '@common/discounts/interfaces/i-discount-save-data';\nimport { IDiscountSaveRequestData } from '@common/discounts/interfaces/i-discount-save-request-data';\nimport {\n BasePaginationProvider,\n DateHelper,\n IFieldValidationResultData,\n IFilterGroup,\n IPaginatedResponse,\n IPaginationRequestParams,\n ISortRequestParams,\n} from '@snabcentr/common-core';\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\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 * Ошибка размера скидки приходит по ключу `percent`.\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 * Ошибка размера скидки приходит по ключу `percent`.\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 '@common/faq/interfaces/i-faq-group';\nimport { NamedIdentity } from '@snabcentr/common-core';\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 '@common/faq/classes/faq-group';\nimport { IFaq } from '@common/faq/interfaces/i-faq';\nimport { IFaqGroup } from '@common/faq/interfaces/i-faq-group';\nimport { IFaqSaveData } from '@common/faq/interfaces/i-faq-save-data';\nimport { Identity } from '@snabcentr/common-core';\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 '@common/faq/classes/faq';\nimport { FaqGroup } from '@common/faq/classes/faq-group';\nimport { IFaq } from '@common/faq/interfaces/i-faq';\nimport { IFaqGroup } from '@common/faq/interfaces/i-faq-group';\nimport { IFaqGroupSaveData } from '@common/faq/interfaces/i-faq-group-save-data';\nimport { IFaqSaveData } from '@common/faq/interfaces/i-faq-save-data';\nimport { BasePaginationProvider, IFieldValidationResultData, IPaginatedResponse, IPaginationRequestParams } from '@snabcentr/common-core';\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 '@common/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","import { IManager, Manager } from '@snabcentr/common-core';\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 { IManagersListFilters } from '@common/managers/interfaces/i-managers-list-filters';\nimport { PaginationFiltersBase } from '@common/pagination/filters/pagination-filters-base';\nimport { ISalesDirection, SalesDirection } from '@snabcentr/common-core';\n\n/**\n * Данные о параметрах фильтрации списка менеджеров.\n */\nexport class ManagersListFilters extends PaginationFiltersBase implements IManagersListFilters {\n /**\n * @inheritDoc\n */\n public name?: string;\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 salesDirections?: ISalesDirection[];\n\n /**\n * @inheritDoc\n */\n public isActive?: boolean;\n\n /**\n * @inheritDoc\n */\n public isSupervisor?: boolean;\n\n /**\n * @inheritDoc\n */\n public canDoReclamations?: boolean;\n\n /**\n * Инициализирует экземпляр класса {@link ManagersListFilters}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IManagersListFilters) {\n super();\n\n this.name = data?.name;\n this.phone = data?.phone;\n this.email = data?.email;\n this.salesDirections = data?.salesDirections?.map((salesDirection) => new SalesDirection(salesDirection));\n this.isActive = data?.isActive;\n this.isSupervisor = data?.isSupervisor;\n this.canDoReclamations = data?.canDoReclamations;\n }\n\n /**\n * @inheritDoc\n */\n public resetFilterValue(key: string): this {\n switch (key) {\n case 'name':\n case 'phone':\n case 'email':\n case 'salesDirections':\n case 'isActive':\n case 'isSupervisor':\n case 'canDoReclamations':\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 { IManagerSaveData } from '@common/managers/interfaces/i-manager-save-data';\nimport {\n IFieldValidationResultData,\n IFilterGroup,\n IManager,\n IPaginatedResponse,\n IPaginationRequestParams,\n ISortRequestParams,\n IUserRegionShortInfo,\n Manager,\n ManagerDataProvider,\n UserRegionShortInfo,\n} from '@snabcentr/common-core';\nimport { map } from 'lodash-es';\n\n/**\n * Предоставляет механизмы управления менеджерами.\n *\n * Дополняет механизмы {@link ManagerDataProvider} (список всех менеджеров и данные менеджера) списком с фильтрами,\n * созданием и изменением менеджеров и списком регионов менеджеров.\n */\nexport class ManagerProvider extends ManagerDataProvider {\n /**\n * Преобразует данные менеджера в данные, требуемые для запроса создания или изменения.\n *\n * @param manager Данные менеджера для сохранения.\n */\n protected static transformManagerDataToRequest(manager: IManagerSaveData): Record<string, unknown> {\n return {\n name: manager.name,\n phone: manager.contacts?.phone ?? '',\n email: manager.contacts?.email ?? '',\n password: manager.password,\n isActive: manager.isActive,\n isSupervisor: manager.isSupervisor,\n canDoReclamations: manager.canDoReclamations,\n authAsOperator: manager.authAsOperator ?? false,\n salesDirectionId: manager.salesDirection.id,\n pricingRoleId: manager.pricingRole?.id,\n showAllCosts: manager.showAllCosts ?? false,\n storeIds: map(manager.stores, 'id'),\n curatedDirectionIds: map(manager.curatedDirections, 'id'),\n managerRegionIds: map(manager.managerRegions, 'id'),\n managerIds: map(manager.managers, 'id'),\n photo: manager.photoFile,\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_manager_get_list\n */\n public getManagersList(\n filters?: IFilterGroup,\n sortParams?: ISortRequestParams[] | ISortRequestParams,\n paginationParams?: IPaginationRequestParams,\n signal?: AbortSignal\n ): Promise<IPaginatedResponse<IManager>> {\n return this.getTypedPaginated(Manager, '/internal/managers', filters, sortParams, paginationParams, {}, undefined, signal);\n }\n\n /**\n * Создаёт нового менеджера.\n *\n * @param manager Данные менеджера для сохранения.\n * @param validationFieldResultData Список полей, для которых необходимо\n * установить данные об ошибках валидации\n * в случае ошибок в запросах.\n *\n * @see /doc/api/internal#/operations/api_internal_managers_create\n */\n public createManager(manager: IManagerSaveData, validationFieldResultData: Record<string, IFieldValidationResultData> = {}): Promise<IManager> {\n return this.post<IManager>(\n '/internal/managers',\n ManagerProvider.transformManagerDataToRequest(manager),\n (response) => new Manager(response.data),\n validationFieldResultData\n );\n }\n\n /**\n * Изменяет данные указанного менеджера.\n *\n * Изменение заменяет все данные менеджера: связи и признаки, которых нет в переданных данных, сохраняются пустыми.\n * Поэтому передаются полные данные менеджера, например полученные {@link ManagerDataProvider.getManager}.\n *\n * @param manager Данные менеджера для сохранения.\n * @param validationFieldResultData Список полей, для которых необходимо\n * установить данные об ошибках валидации\n * в случае ошибок в запросах.\n *\n * @see /doc/api/internal#/operations/api_internal_managers_update\n */\n public updateManager(manager: IManagerSaveData, validationFieldResultData: Record<string, IFieldValidationResultData> = {}): Promise<IManager> {\n return this.patch<IManager>(\n `/internal/managers/${manager.id}`,\n ManagerProvider.transformManagerDataToRequest(manager),\n (response) => new Manager(response.data),\n validationFieldResultData\n );\n }\n\n /**\n * Возвращает список регионов менеджеров.\n *\n * @param filters Параметры фильтрации данных.\n * @param sortParams Параметры сортировки.\n * @param paginationParams Параметры пагинации.\n *\n * @see /doc/api/internal#/operations/api_internal_manager_regions_get_list\n */\n public getManagerRegionsList(\n filters?: IFilterGroup,\n sortParams?: ISortRequestParams[] | ISortRequestParams,\n paginationParams?: IPaginationRequestParams\n ): Promise<IPaginatedResponse<IUserRegionShortInfo>> {\n return this.getTypedPaginated(UserRegionShortInfo, '/internal/managers/regions', filters, sortParams, paginationParams);\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 { OfferActualizationStatus } from '@common/offers/enums/offer-actualization-status';\nimport { IOfferActualization } from '@common/offers/interfaces/i-offer-actualization';\nimport { DateHelper } from '@snabcentr/common-core';\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 '@common/clients/classes/client-short-info';\nimport { IClientShortInfo } from '@common/clients/interfaces/i-client-short-info';\nimport { OfferActualization } from '@common/offers/classes/offer-actualization';\nimport { IOfferActualization } from '@common/offers/interfaces/i-offer-actualization';\nimport { IOfferShortInfo } from '@common/offers/interfaces/i-offer-short-info';\nimport { IProfstroyOfferFile } from '@common/offers/interfaces/i-profstroy-offer-file';\nimport { CreatableIdentity } from '@common/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 '@common/cart/classes/order-item';\nimport { IProfstroyOfferItem } from '@common/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 '@common/cart/classes/order-item';\nimport { IOrderItem } from '@common/cart/interfaces/i-order-item';\nimport { OfferShortInfo } from '@common/offers/classes/offer-short-info';\nimport { ProfstroyOfferItem } from '@common/offers/classes/profstroy-offer-item';\nimport { IOffer } from '@common/offers/interfaces/i-offer';\nimport { IProfstroyOfferItem } from '@common/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 '@common/offers/interfaces/i-offers-list-filters';\nimport { PaginationFiltersBase } from '@common/pagination/filters/pagination-filters-base';\nimport { DatePeriod } from '@common/system/classes/date-period';\nimport { IDatePeriod } from '@snabcentr/common-core';\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","/* eslint-disable @typescript-eslint/no-unnecessary-condition */\n\nimport { ClientShortInfo } from '@common/clients/classes/client-short-info';\nimport { DeliveryAddress } from '@common/clients/classes/delivery-address';\nimport { IClientShortInfo } from '@common/clients/interfaces/i-client-short-info';\nimport { OrderShortInfo } from '@common/orders/classes/order-short-info';\nimport { IOrderInfo } from '@common/orders/interfaces/i-order-info';\nimport { UserShortInfo } from '@common/user/classes/user-short-info';\nimport { IUserShortInfo } from '@common/user/interfaces/i-user-short-info';\nimport { IOrderStatus, IReference, ISalesDirection, OrderStatus, Reference, SalesDirection, Warehouse } from '@snabcentr/common-core';\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 const attachedAt: unknown = data?.attachedAt;\n\n this.attachedAt = isString(attachedAt) ? parseISO(attachedAt) : 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 '@common/cart/interfaces/i-cart-item-configurator-params-base';\nimport { IOrderItem } from '@common/cart/interfaces/i-order-item';\nimport { IOrderItemBase } from '@common/cart/interfaces/i-order-item-base';\nimport { ClientProduct } from '@common/catalog/classes/client-product';\nimport { IClientProduct } from '@common/catalog/interfaces/i-client-product';\nimport { OrderItemBase } from '@common/orders/classes/order-item-base';\nimport { Currency, ICurrency } from '@snabcentr/common-core';\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 '@common/clients/classes/contragent/contragent-factory';\nimport { IContragentIc } from '@common/clients/interfaces/contragent/i-contragent-ic';\nimport { IContragentPerson } from '@common/clients/interfaces/contragent/i-contragent-person';\nimport { IContragentUlNr } from '@common/clients/interfaces/contragent/i-contragent-ul-nr';\nimport { IContragentUlR } from '@common/clients/interfaces/contragent/i-contragent-ul-r';\nimport { OrderInfo } from '@common/orders/classes/order-info';\nimport { OrderItem } from '@common/orders/classes/order-item';\nimport { OrderAction } from '@common/orders/enums/order-action';\nimport { IOrder } from '@common/orders/interfaces/i-order';\nimport { IOrderStatus, IReference, OrderStatus, Reference } from '@snabcentr/common-core';\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 '@common/cart/interfaces/i-cart-item-configurator-params-base';\nimport { IOrderItemBase } from '@common/cart/interfaces/i-order-item-base';\nimport { Offer } from '@common/offers/classes/offer';\nimport { OfferShortInfo } from '@common/offers/classes/offer-short-info';\nimport { IOffer } from '@common/offers/interfaces/i-offer';\nimport { IOfferSendData } from '@common/offers/interfaces/i-offer-send-data';\nimport { IOfferShortInfo } from '@common/offers/interfaces/i-offer-short-info';\nimport { Order } from '@common/orders/classes/order';\nimport { IClientOrderCreateData } from '@common/orders/interfaces/i-client-order-create-data';\nimport { IOrder } from '@common/orders/interfaces/i-order';\nimport { IFile } from '@common/system/interfaces/i-file';\nimport {\n BasePaginationProvider,\n IFieldValidationResultData,\n IFilterGroup,\n IPaginatedResponse,\n IPaginationRequestParams,\n ISortRequestParams,\n TypedInstanceFactory,\n useBaseConfigStore,\n} from '@snabcentr/common-core';\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\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 = useBaseConfigStore().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 '@common/offers/interfaces/i-offer';\nimport { IOfferShortInfo } from '@common/offers/interfaces/i-offer-short-info';\nimport { IProfstroyOffer } from '@common/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 '@common/orders/interfaces/i-order';\nimport { IOrderEditorData } from '@common/orders/interfaces/i-order-editor-data';\nimport { IFile } from '@common/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","/* eslint-disable @typescript-eslint/no-explicit-any,@typescript-eslint/no-unnecessary-condition */\n\nimport { ClientShortInfo } from '@common/clients/classes/client-short-info';\nimport { IContragentUlNr } from '@common/clients/interfaces/contragent/i-contragent-ul-nr';\nimport { IClientShortInfo } from '@common/clients/interfaces/i-client-short-info';\nimport { IOrdersListFilters } from '@common/orders/interfaces/i-orders-list-filters';\nimport { PaginationFiltersBase } from '@common/pagination/filters/pagination-filters-base';\nimport { DatePeriod } from '@common/system/classes/date-period';\nimport { UserShortInfo } from '@common/user/classes/user-short-info';\nimport { IUserShortInfo } from '@common/user/interfaces/i-user-short-info';\nimport {\n CityWithRegionAndCountry,\n DeliveryType,\n ICityWithRegionAndCountry,\n IDatePeriod,\n IDeliveryType,\n IManager,\n IOperator,\n IOrderStatus,\n IPaymentType,\n IReference,\n ISalesDirection,\n IWarehouse,\n Manager,\n Operator,\n PaymentType,\n SalesDirection,\n Warehouse,\n} from '@snabcentr/common-core';\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 '@common/orders/interfaces/i-order-status-history-info';\nimport { UserShortInfo } from '@common/user/classes/user-short-info';\nimport { IUserShortInfo } from '@common/user/interfaces/i-user-short-info';\nimport { IOrderStatus, IReference, OrderStatus, Reference } from '@snabcentr/common-core';\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 const createdAt: unknown = data?.createdAt;\n\n this.createdAt = isString(createdAt) ? parseISO(createdAt) : (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 '@common/cart/interfaces/i-cart-item-configurator-params-base';\nimport { IOrderItemBase } from '@common/cart/interfaces/i-order-item-base';\nimport { Order } from '@common/orders/classes/order';\nimport { OrderInfo } from '@common/orders/classes/order-info';\nimport { OrderStatusHistoryInfo } from '@common/orders/classes/order-status-history-info';\nimport { IClientOrderCreateData } from '@common/orders/interfaces/i-client-order-create-data';\nimport { IClientOrderStatistics } from '@common/orders/interfaces/i-client-order-statistics';\nimport { IDeliveryCostInfo } from '@common/orders/interfaces/i-delivery-cost-info';\nimport { IOrder } from '@common/orders/interfaces/i-order';\nimport { IOrderEditorData } from '@common/orders/interfaces/i-order-editor-data';\nimport { IOrderInfo } from '@common/orders/interfaces/i-order-info';\nimport { IOrderPrintOptions } from '@common/orders/interfaces/i-order-print-options';\nimport { IOrderPrintSendData } from '@common/orders/interfaces/i-order-print-send-data';\nimport { IOrderStatusHistoryInfo } from '@common/orders/interfaces/i-order-status-history-info';\nimport {\n BasePaginationProvider,\n FilterGroup,\n IDatePeriod,\n IFieldValidationResultData,\n IFilterGroup,\n IPaginatedResponse,\n IPaginationRequestParams,\n ISortRequestParams,\n OrderStatusEnum,\n TypedInstanceFactory,\n useBaseConfigStore,\n} from '@snabcentr/common-core';\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\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): 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 = useBaseConfigStore().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 = useBaseConfigStore().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): 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): 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): Promise<IDeliveryCostInfo> {\n const apiDateFormat = useBaseConfigStore().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 '@common/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 '@common/catalog/classes/product';\nimport { CostSourceEnum } from '@common/catalog/enums/cost-source-enum';\nimport { IProduct } from '@common/catalog/interfaces/i-product';\nimport { ClientShortInfo } from '@common/clients/classes/client-short-info';\nimport { IClientShortInfo } from '@common/clients/interfaces/i-client-short-info';\nimport { IPriceAnalyze } from '@common/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 '@common/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 '@common/price-analyze/interfaces/i-price-analyze-parameter';\nimport { IPriceAnalyzeParams } from '@common/price-analyze/interfaces/i-price-analyze-params';\nimport { ITypedNullableRange } from '@snabcentr/common-core';\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 { PriceAnalyze } from '@common/price-analyze/classes/price-analyze';\nimport { convertPriceAnalyzeFilters } from '@common/price-analyze/converters/price-analyze-filters';\nimport { convertPriceAnalyzeParams } from '@common/price-analyze/converters/price-analyze-params';\nimport { IPriceAnalyze } from '@common/price-analyze/interfaces/i-price-analyze';\nimport { IPriceAnalyzeFilters } from '@common/price-analyze/interfaces/i-price-analyze-filters';\nimport { IPriceAnalyzeParams } from '@common/price-analyze/interfaces/i-price-analyze-params';\nimport { HttpRequester, ITypedNullableRange, TypedInstanceFactory } from '@snabcentr/common-core';\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 '@common/price-history/interfaces/i-price-history-item';\nimport { CodedIdentity } from '@common/system/classes/coded-identity';\nimport { ICodedIdentity } from '@common/system/interfaces/i-coded-identity';\nimport { UserShortInfo } from '@common/user/classes/user-short-info';\nimport { IUserShortInfo } from '@common/user/interfaces/i-user-short-info';\nimport { Currency, ICurrency } from '@snabcentr/common-core';\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 '@common/price-history/classes/price-history-item';\nimport { IPriceHistoryItem } from '@common/price-history/interfaces/i-price-history-item';\nimport { IProductPriceHistory } from '@common/price-history/interfaces/i-product-price-history';\nimport { CodedIdentity } from '@common/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 { ProductPriceHistory } from '@common/price-history/classes/product-price-history';\nimport { IPriceHistoryItem } from '@common/price-history/interfaces/i-price-history-item';\nimport { IPriceHistoryRequestParams } from '@common/price-history/interfaces/i-price-history-request-params';\nimport { IProductPriceHistory } from '@common/price-history/interfaces/i-product-price-history';\nimport { HttpRequester, useBaseConfigStore } from '@snabcentr/common-core';\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 = useBaseConfigStore().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 { ReclamationStatusEnum } from '@common/reclamations/enums/reclamation-status-enum';\nimport { IReclamationItem } from '@common/reclamations/interfaces/i-reclamation-item';\nimport { UserShortInfo } from '@common/user/classes/user-short-info';\nimport { IUserShortInfo } from '@common/user/interfaces/i-user-short-info';\nimport { DateHelper } from '@snabcentr/common-core';\nimport { isNil } from 'lodash-es';\n\n/**\n * Данные о сообщении в истории рекламации.\n */\nexport class ReclamationItem implements IReclamationItem {\n /**\n * @inheritDoc\n */\n public createdAt: Date;\n\n /**\n * @inheritDoc\n */\n public creator?: IUserShortInfo;\n\n /**\n * @inheritDoc\n */\n public files: string[];\n\n /**\n * @inheritDoc\n */\n public text?: string;\n\n /**\n * @inheritDoc\n */\n public status?: ReclamationStatusEnum;\n\n /**\n * Инициализирует экземпляр класса {@link ReclamationItem}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IReclamationItem>) {\n this.createdAt = DateHelper.parse(data?.createdAt) ?? new Date();\n this.creator = isNil(data?.creator) ? undefined : new UserShortInfo(data.creator);\n this.files = data?.files ?? [];\n this.text = data?.text ?? undefined;\n this.status = data?.status ?? undefined;\n }\n\n /**\n * Возвращает признак того, что сообщение изменило статус рекламации.\n */\n public isStatusChanged(): this is ReclamationItem & Required<Pick<IReclamationItem, 'status'>> {\n return !isNil(this.status);\n }\n}\n","/**\n * Статус рекламации.\n */\nexport enum ReclamationStatusEnum {\n /**\n * Рекламация создана клиентом.\n */\n Initiated = 1,\n\n /**\n * От клиента требуется дополнительная информация.\n */\n InfoRequired = 2,\n\n /**\n * Рекламация на рассмотрении.\n */\n Pending = 3,\n\n /**\n * Рекламация закрыта.\n */\n Completed = 4,\n}\n","import { ClientBaseInfo } from '@common/clients/classes/client-base-info';\nimport { IClientBaseInfo } from '@common/clients/interfaces/i-client-base-info';\nimport { ReclamationStatusEnum } from '@common/reclamations/enums/reclamation-status-enum';\nimport { IReclamationShortInfo } from '@common/reclamations/interfaces/i-reclamation-short-info';\nimport { CreatableIdentity } from '@common/system/classes/creatable-identity';\nimport { DateHelper } from '@snabcentr/common-core';\nimport { differenceInCalendarDays } from 'date-fns';\n\n/**\n * Краткие данные о рекламации.\n */\nexport class ReclamationShortInfo extends CreatableIdentity implements IReclamationShortInfo {\n /**\n * @inheritDoc\n */\n public status: ReclamationStatusEnum;\n\n /**\n * @inheritDoc\n */\n public closedAt?: Date;\n\n /**\n * @inheritDoc\n */\n public isRead: boolean;\n\n /**\n * @inheritDoc\n */\n public isDeleted: boolean;\n\n /**\n * @inheritDoc\n */\n public client: IClientBaseInfo;\n\n /**\n * Инициализирует экземпляр класса {@link ReclamationShortInfo}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IReclamationShortInfo>) {\n super(data);\n\n this.status = data?.status ?? ReclamationStatusEnum.Initiated;\n this.closedAt = DateHelper.parse(data?.closedAt);\n this.isRead = data?.isRead ?? false;\n this.isDeleted = data?.isDeleted ?? false;\n this.client = new ClientBaseInfo(data?.client);\n }\n\n /**\n * Возвращает признак того, что рекламация закрыта.\n */\n public isClosed(): boolean {\n return this.status === ReclamationStatusEnum.Completed;\n }\n\n /**\n * Возвращает признак того, что рекламацию можно удалить или восстановить: клиент пометил её на удаление, и она не закрыта.\n */\n public isDeletionPending(): boolean {\n return this.isDeleted && !this.isClosed();\n }\n\n /**\n * Возвращает признак того, что в рекламацию можно добавить сообщение: она не закрыта.\n */\n public canAddMessage(): boolean {\n return !this.isClosed();\n }\n\n /**\n * Возвращает количество календарных дней, которое рекламация находится на рассмотрении:\n * от создания до закрытия, а для незакрытой рекламации до указанного момента.\n *\n * @param now Момент, до которого считаются дни незакрытой рекламации.\n */\n public getConsiderationDays(now: Date = new Date()): number {\n return Math.max(differenceInCalendarDays(this.closedAt ?? now, this.createdAt), 0);\n }\n}\n","import { ReclamationItem } from '@common/reclamations/classes/reclamation-item';\nimport { ReclamationShortInfo } from '@common/reclamations/classes/reclamation-short-info';\nimport { IReclamation } from '@common/reclamations/interfaces/i-reclamation';\nimport { IReclamationItem } from '@common/reclamations/interfaces/i-reclamation-item';\nimport { map } from 'lodash-es';\n\n/**\n * Полные данные о рекламации.\n */\nexport class Reclamation extends ReclamationShortInfo implements IReclamation {\n /**\n * @inheritDoc\n */\n public items: ReclamationItem[];\n\n /**\n * Инициализирует экземпляр класса {@link Reclamation}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IReclamation>) {\n super(data);\n\n this.items = map(data?.items ?? [], (item) => new ReclamationItem(item));\n }\n\n /**\n * Возвращает признак того, что сообщение написал клиент, создавший рекламацию.\n *\n * @param item Сообщение рекламации.\n */\n public isClientMessage(item: IReclamationItem): boolean {\n return item.creator?.id === this.client.id;\n }\n}\n","import { PaginationFiltersBase } from '@common/pagination/filters/pagination-filters-base';\nimport { ReclamationStatusEnum } from '@common/reclamations/enums/reclamation-status-enum';\nimport { IReclamationsListFilters } from '@common/reclamations/interfaces/i-reclamations-list-filters';\nimport { DatePeriod } from '@common/system/classes/date-period';\nimport { IDatePeriod, ITypedNullableRange } from '@snabcentr/common-core';\n\n/**\n * Данные о параметрах фильтрации списка рекламаций.\n */\nexport class ReclamationsListFilters extends PaginationFiltersBase implements IReclamationsListFilters {\n /**\n * @inheritDoc\n */\n public id: ITypedNullableRange<number | null>;\n\n /**\n * @inheritDoc\n */\n public statuses?: ReclamationStatusEnum[];\n\n /**\n * @inheritDoc\n */\n public createdAt: IDatePeriod;\n\n /**\n * @inheritDoc\n */\n public closedAt: IDatePeriod;\n\n /**\n * @inheritDoc\n */\n public isRead?: boolean;\n\n /**\n * @inheritDoc\n */\n public isDeleted?: boolean;\n\n /**\n * @inheritDoc\n */\n public clientName?: string;\n\n /**\n * @inheritDoc\n */\n public cityName?: string;\n\n /**\n * Инициализирует экземпляр класса {@link ReclamationsListFilters}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IReclamationsListFilters>) {\n super();\n\n this.id = { from: data?.id?.from ?? null, to: data?.id?.to ?? null };\n this.statuses = data?.statuses;\n this.createdAt = new DatePeriod(data?.createdAt);\n this.closedAt = new DatePeriod(data?.closedAt);\n this.isRead = data?.isRead;\n this.isDeleted = data?.isDeleted;\n this.clientName = data?.clientName;\n this.cityName = data?.cityName;\n }\n\n /**\n * Выполняет сброс указанного фильтра в значение по умолчанию. Сброс признака пометки на удаление скрывает\n * рекламации, помеченные клиентом на удаление.\n *\n * @param key Название фильтра, значение которого необходимо сбросить.\n */\n public resetFilterValue(key: string): this {\n switch (key) {\n case 'isDeleted':\n this.isDeleted = false;\n break;\n case 'statuses':\n case 'isRead':\n case 'clientName':\n case 'cityName':\n // eslint-disable-next-line security/detect-object-injection\n this[key] = undefined;\n break;\n case 'id':\n this.id.from = null;\n this.id.to = null;\n break;\n case 'createdAt':\n this.createdAt.from = null;\n this.createdAt.to = null;\n break;\n case 'closedAt':\n this.closedAt.from = null;\n this.closedAt.to = null;\n break;\n default:\n break;\n }\n\n return this;\n }\n}\n","import { ReclamationStatusEnum } from '@common/reclamations/enums/reclamation-status-enum';\nimport { map } from 'lodash-es';\n\n/**\n * Класс-помощник для работы со статусами рекламаций.\n */\nexport class ReclamationStatusHelper {\n /**\n * Строковые коды статусов, которые API принимает в фильтрах списка рекламаций.\n */\n private static readonly apiCodes: Record<ReclamationStatusEnum, string> = {\n [ReclamationStatusEnum.Initiated]: 'initiated',\n [ReclamationStatusEnum.InfoRequired]: 'info_required',\n [ReclamationStatusEnum.Pending]: 'pending',\n [ReclamationStatusEnum.Completed]: 'completed',\n };\n\n /**\n * Возвращает строковый код статуса для фильтра списка рекламаций.\n *\n * @param status Статус рекламации.\n */\n public static toApiCode(status: ReclamationStatusEnum): string {\n // eslint-disable-next-line security/detect-object-injection\n return ReclamationStatusHelper.apiCodes[status];\n }\n\n /**\n * Возвращает список строковых кодов статусов для фильтра списка рекламаций.\n *\n * @param statuses Статусы рекламаций.\n */\n public static toApiCodes(statuses: ReclamationStatusEnum[]): string[] {\n return map(statuses, (status) => ReclamationStatusHelper.toApiCode(status));\n }\n}\n","import { Reclamation } from '@common/reclamations/classes/reclamation';\nimport { ReclamationShortInfo } from '@common/reclamations/classes/reclamation-short-info';\nimport { IReclamationMessageSaveData } from '@common/reclamations/interfaces/i-reclamation-message-save-data';\nimport { IReclamationsUpdates } from '@common/reclamations/interfaces/i-reclamations-updates';\nimport { BasePaginationProvider, IFieldValidationResultData, IFilterGroup, IPaginatedResponse, IPaginationRequestParams, ISortRequestParams } from '@snabcentr/common-core';\n\n/**\n * Предоставляет механизмы получения/управления рекламациями клиентов.\n */\nexport class ReclamationProvider extends BasePaginationProvider {\n /**\n * Возвращает список рекламаций.\n *\n * @param filters Параметры фильтрации данных. Статусы передаются строковыми кодами (см. ReclamationStatusHelper.toApiCodes).\n * @param sortParams Параметры сортировки.\n * @param paginationParams Параметры пагинации.\n * @param signal Сигнал отмены запроса.\n * @param disableNotifications Признак необходимости отключить уведомления об ошибках.\n *\n * @see /doc/api/internal#/operations/api_internal_reclamations_get_list\n */\n public getReclamationsList(\n filters?: IFilterGroup,\n sortParams?: ISortRequestParams[] | ISortRequestParams,\n paginationParams?: IPaginationRequestParams,\n signal?: AbortSignal,\n disableNotifications: boolean = false\n ): Promise<IPaginatedResponse<ReclamationShortInfo>> {\n return this.getTypedPaginated(ReclamationShortInfo, '/internal/reclamations', filters, sortParams, paginationParams, {}, disableNotifications, signal);\n }\n\n /**\n * Возвращает полные данные о рекламации. Открытие рекламации отмечает её прочитанной сотрудником.\n *\n * @param reclamationId Идентификатор рекламации.\n * @param signal Сигнал отмены запроса.\n * @param disableNotifications Признак необходимости отключить уведомления об ошибках.\n *\n * @see /doc/api/internal#/operations/api_internal_reclamation_get\n */\n public getReclamation(reclamationId: number, signal?: AbortSignal, disableNotifications: boolean = false): Promise<Reclamation> {\n return this.get<Reclamation>(`/internal/reclamations/${reclamationId}`, {}, (response) => new Reclamation(response.data), disableNotifications, signal);\n }\n\n /**\n * Добавляет сообщение в незакрытую рекламацию и возвращает её полные данные.\n *\n * @param reclamationId Идентификатор рекламации.\n * @param data Данные сообщения. Без статуса сообщение не меняет статус рекламации.\n * @param validationFieldResultData Список полей, для которых необходимо\n * установить данные об ошибках валидации\n * в случае ошибок в запросах.\n *\n * @see /doc/api/internal#/operations/api_internal_reclamation_create_message\n */\n public createMessage(\n reclamationId: number,\n data: IReclamationMessageSaveData,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<Reclamation> {\n return this.post<Reclamation>(`/internal/reclamations/${reclamationId}/messages`, data, (response) => new Reclamation(response.data), validationFieldResultData);\n }\n\n /**\n * Удаляет незакрытую рекламацию, помеченную клиентом на удаление.\n *\n * @param reclamationId Идентификатор рекламации.\n *\n * @see /doc/api/internal#/operations/api_internal_reclamation_delete\n */\n public deleteReclamation(reclamationId: number): Promise<void> {\n return this.delete(`/internal/reclamations/${reclamationId}`);\n }\n\n /**\n * Снимает пометку на удаление с незакрытой рекламации и возвращает её полные данные.\n *\n * @param reclamationId Идентификатор рекламации.\n *\n * @see /doc/api/internal#/operations/api_internal_reclamation_restore\n */\n public restoreReclamation(reclamationId: number): Promise<Reclamation> {\n return this.post<Reclamation>(`/internal/reclamations/${reclamationId}/restore`, {}, (response) => new Reclamation(response.data));\n }\n\n /**\n * Возвращает рекламацию в формате PDF.\n *\n * @param reclamationId Идентификатор рекламации.\n * @param disableNotifications Признак необходимости отключить уведомления об ошибках.\n *\n * @see /doc/api/internal#/operations/api_internal_reclamation_download\n */\n public downloadReclamation(reclamationId: number, disableNotifications: boolean = false): Promise<Blob> {\n return this.getBlob<Blob>(\n `/internal/reclamations/${reclamationId}/download`,\n {},\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (response) => new Blob([response.request.response], { type: 'application/pdf' }),\n disableNotifications\n );\n }\n\n /**\n * Возвращает данные о количестве рекламаций с изменениями, не просмотренными сотрудниками, включая помеченные клиентом на удаление.\n *\n * @param signal Сигнал отмены запроса.\n * @param disableNotifications Признак необходимости отключить уведомления об ошибках.\n *\n * @see /doc/api/internal#/operations/api_internal_reclamations_get_updates\n */\n public getUpdates(signal?: AbortSignal, disableNotifications: boolean = false): Promise<IReclamationsUpdates> {\n return this.get<IReclamationsUpdates>('/internal/reclamations/updates', {}, undefined, disableNotifications, signal);\n }\n}\n","import { IRecommendationsList } from '@common/recommendations/interfaces/i-recommendations-list';\nimport { CodedIdentity } from '@common/system/classes/coded-identity';\nimport { ICodedIdentity } from '@common/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 { RecommendationsList } from '@common/recommendations/classes/recommendations-list';\nimport { IRecommendationsList } from '@common/recommendations/interfaces/i-recommendations-list';\nimport { ICatalogableItem } from '@common/system/interfaces/i-catalogable-item';\nimport { HttpRequester } from '@snabcentr/common-core';\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","import { IReference, Reference } from '@snabcentr/common-core';\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 { IMetaTagItem } from '@common/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 { MetaTagItem } from '@common/seo/classes/meta-tag-item';\nimport { IMetaTagItem } from '@common/seo/interfaces/i-meta-tag-item';\nimport { ISeo } from '@common/seo/interfaces/i-seo';\nimport { IResourceType, ResourceType } from '@snabcentr/common-core';\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 { Seo } from '@common/seo/classes/seo';\nimport { ISeo } from '@common/seo/interfaces/i-seo';\nimport { HttpRequester, IFieldValidationResultData, IResourceType } from '@snabcentr/common-core';\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","import { ISearchProductStatistic } from '@common/statistics/interfaces/i-search-product-statistic';\nimport { DateHelper, Identity } from '@snabcentr/common-core';\n\n/**\n * Данные о поисковом запросе товаров клиентами.\n */\nexport class SearchProductStatistic extends Identity implements ISearchProductStatistic {\n /**\n * @inheritDoc\n */\n public text: string;\n\n /**\n * @inheritDoc\n */\n public searchCount: number;\n\n /**\n * @inheritDoc\n */\n public lastSearchedAt?: Date;\n\n /**\n * Инициализирует экземпляр класса {@link SearchProductStatistic}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<ISearchProductStatistic>) {\n super(data);\n\n this.text = data?.text ?? '';\n this.searchCount = data?.searchCount ?? 0;\n this.lastSearchedAt = DateHelper.parse(data?.lastSearchedAt);\n }\n}\n","import { SearchProductStatistic } from '@common/statistics/classes/search-product-statistic';\nimport { ISearchProductStatistic } from '@common/statistics/interfaces/i-search-product-statistic';\nimport { DateHelper, HttpRequester, IDatePeriod } from '@snabcentr/common-core';\n\n/**\n * Предоставляет механизмы получения/управления статистикой.\n */\nexport class StatisticsProvider extends HttpRequester {\n /**\n * Возвращает список поисковых запросов товаров, последний поиск по которым был в указанном периоде.\n *\n * @param period Период даты последнего поиска.\n * @param signal Сигнал отмены запроса.\n *\n * @see /doc/api/internal#/operations/api_internal_statistics_search_products_get_list\n */\n public getSearchProductsStatistics(period: IDatePeriod, signal?: AbortSignal): Promise<ISearchProductStatistic[]> {\n return this.getTypedList(SearchProductStatistic, '/internal/statistics/search/products', { date: DateHelper.periodToApiFormat(period) }, false, signal);\n }\n\n /**\n * Удаляет поисковый запрос товаров из статистики.\n *\n * @param id Идентификатор поискового запроса.\n *\n * @see /doc/api/internal#/operations/api_internal_statistics_search_products_delete\n */\n public removeSearchProductStatistic(id: number): Promise<void> {\n return this.delete(`/internal/statistics/search/products/${id}`);\n }\n}\n","/* eslint-disable no-shadow */\n\n/**\n * Перечисление вариантов полноты адреса в подсказках.\n */\nexport enum AddressQualityEnum {\n /**\n * Не удалось определить.\n */\n Undetermined = 0,\n\n /**\n * Полный адрес.\n */\n Complete = 1,\n\n /**\n * Неполный адрес: уровень детализации в ФИАС ниже порогового.\n */\n Incomplete = 2,\n}\n","import { AddressQualityEnum } from '@common/suggestion/enums/address-quality-enum';\nimport { FieldValidationResultData, IFieldValidationResultData } from '@snabcentr/common-core';\n\n/**\n * Класс-помощник для работы с полнотой адреса из подсказок.\n */\nexport class AddressQualityHelper {\n /**\n * Возвращает признак, что адрес с указанной полнотой нельзя сохранять.\n *\n * @param quality Полнота адреса или `undefined`, если она неизвестна.\n * @param isIncompleteBlocked Признак, что сохранение неполного адреса запрещено.\n */\n public static isBlocked(quality: AddressQualityEnum | undefined, isIncompleteBlocked: boolean): boolean {\n return isIncompleteBlocked && quality === AddressQualityEnum.Incomplete;\n }\n\n /**\n * Возвращает результат проверки полноты адреса для отображения под полем ввода\n * или `undefined`, если адрес полный или полнота неизвестна.\n *\n * Неполный адрес при запрете сохранения отображается как ошибка, в остальных случаях как предупреждение.\n * Текст не утверждает, что адрес неполный: дом может существовать, но быть записан в ФИАС иначе,\n * поэтому пользователя только просят проверить адрес.\n *\n * @param quality Полнота адреса.\n * @param isIncompleteBlocked Признак, что сохранение неполного адреса запрещено.\n */\n public static getValidationResult(quality: AddressQualityEnum | undefined, isIncompleteBlocked: boolean): IFieldValidationResultData | undefined {\n if (AddressQualityHelper.isBlocked(quality, isIncompleteBlocked)) {\n return new FieldValidationResultData('Проверьте адрес и выберите более точный вариант из подсказок', 'error');\n }\n\n return quality === AddressQualityEnum.Incomplete || quality === AddressQualityEnum.Undetermined\n ? new FieldValidationResultData('Проверьте правильность адреса', 'warning')\n : undefined;\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 { IAddressSuggestion } from '@common/suggestion/interfaces/i-address-suggestion';\nimport { IBankSuggestion } from '@common/suggestion/interfaces/i-bank-suggestion';\nimport { IOrganizationSuggestion } from '@common/suggestion/interfaces/i-organization-suggestion';\nimport { HttpRequester, IIdentity } from '@snabcentr/common-core';\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","import { HttpRequester, useBaseConfigStore } from '@snabcentr/common-core';\n\n/**\n * Предоставляет механизмы аутентификации пользователей.\n */\nexport class UserAuthDataProvider extends HttpRequester {\n /**\n * Инициализирует экземпляр класса {@link UserAuthDataProvider}.\n */\n public constructor() {\n super();\n\n this.baseUrl = `${useBaseConfigStore().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 { UserShortInfo } from '@common/user/classes/user-short-info';\nimport { IUserShortInfo } from '@common/user/interfaces/i-user-short-info';\nimport { IUserRegionEmployee } from '@common/user-regions/interfaces/i-user-region-employee';\nimport { ISalesDirection, SalesDirection } from '@snabcentr/common-core';\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 { UserRegionEmployee } from '@common/user-regions/classes/user-region-employee';\nimport { IUserRegion } from '@common/user-regions/interfaces/i-user-region';\nimport { IUserRegionEmployee } from '@common/user-regions/interfaces/i-user-region-employee';\nimport { CityWithRegionAndCountry, ICityWithRegionAndCountry, UserRegionShortInfo } from '@snabcentr/common-core';\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 '@common/pagination/filters/pagination-filters-base';\nimport { IUserRegionsListFilters } from '@common/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 { UserRegion } from '@common/user-regions/classes/user-region';\nimport { UserRegionEmployee } from '@common/user-regions/classes/user-region-employee';\nimport { IUserRegion } from '@common/user-regions/interfaces/i-user-region';\nimport { IUserRegionEmployee } from '@common/user-regions/interfaces/i-user-region-employee';\nimport { IUserRegionSaveData } from '@common/user-regions/interfaces/i-user-region-save-data';\nimport {\n BasePaginationProvider,\n IFieldValidationResultData,\n IFilterGroup,\n IPaginatedResponse,\n IPaginationRequestParams,\n ISortRequestParams,\n IUserRegionShortInfo,\n UserRegionShortInfo,\n} from '@snabcentr/common-core';\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"],"mappings":"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"}
1
+ {"version":3,"file":"sc-common-lib.js","names":["OrderItem","OrderItem","OrderItem","OrderItem","BlogPostMediaTypeEnum","\"Image\"","\"Video\"","BlogPostMediaFile","Identity","data","BlogPostPublicationStatusEnum","\"Draft\"","\"Published\"","\"Scheduled\"","CreatableIdentity","defaultIdValue","DateHelper","BlogPostShortInfo","isNil","publishedAt","slug","startsWith","endsWith","includes","value","isString","parseISO","BlogPost","mediaFile","withContent","PaginationFiltersBase","result","k","isFunction","DatePeriod","BlogPostsListFilters","key","BlogProvider","BasePaginationProvider","isUndefined","apiDateFormat","useBaseConfigStore","format","filters","sortParams","paginationParams","response","item","postId","validationFieldResultData","isCover","uploadProgressHandler","event","mediaId","DeletableNamedIdentity","UpdatableNamedIdentity","UserShortInfo","NamedIdentity","DiscountShortInfo","PriceTemplate","ProductPriceCoefficient","PriceCoefficient","StockCount","Warehouse","ProductUnit","CodedIdentity","CatalogableItem","HiddenCatalogableItem","Image","mediaServer","PrimaryCatalogableItem","Product","Currency","sc","primaryCategory","category","im","pc","CostSourceEnum","\"Discount\"","\"PriceTemplate\"","\"ClientPrice\"","\"Product\"","ClientProduct","BaseCategory","toUpper","OrderItemBase","cloneDeep","OrderItem$1","isArray","Cart","CartProvider","HttpRequester","client","cartItem","file","blob","CalculationTypeEnum","\"m2Cost\"","\"percent\"","\"value\"","ProductFilterTypeEnum","\"Checkbox\"","\"Range\"","\"Toggle\"","Category","c","BaseClientCategory","Manager","ClientCategory","PriceCatalogableItem","PriceTemplateICatalogableItem","PriceTemplateCategory","Curator","ContactLinks","CuratedDirection","ClientShortInfo","UserCommonInfo","SalesDirection","CityWithRegionAndCountry","ManagerCommon","m","DeletableIdentity","PriceTemplateClient","PriceTemplateProduct","Property","PropertyType","PropertyValue","TemplatesListFilters","ClientPriceCatalogableItem","ClientPriceProduct","ClientPriceCategory","PricingRole","CategoryPricingRule","FilterSettings","CategoryFilterSetting","CategoryFilterValue","CategoryFilter","CatalogProvider","showHidden","link","categoryId","clientId","ClientPriceProvider","disableNotifications","recursively","managerId","productId","params","ClientPriceTemplateProvider","priceTemplateId","priceTemplateClientId","ProductCategoryDataProvider","categoryID","map","p","forEach","pcs","limit","term","error","ProductDataProvider","rec","periodFrom","ClientProductCategoryDataProvider","ClientProductDataProvider","PriceTemplateProvider","productCategoryId","PricingRoleProvider","id","TypedInstanceFactory","PropertiesProvider","rest","propertyData","typeId","propertyId","fileData","fileId","filter","propertySlug","settingsData","TemplateProductCategoryDataProvider","findCatalogItemByIdRecursive","items","type","foundInProducts","foundInChildren","flattenCatalogItems","ClientsAdditionalDataRequestTypeEnum","\"LastOrder\"","\"Contacts\"","\"PartnerGroups\"","\"PreferredDeliveryType\"","\"SalesDirection\"","\"Managers\"","\"Curators\"","BankAccount","Contact","ContactPerson","ContragentBase","Opf","PartnerGroup","contactsList","ContragentPerson","ContragentIc","ContragentUlR","ContragentUlNr","Country","ContragentFactory","OpfEnum","ClientBaseInfo","DeliveryAddress","GeoCoordinates","Client","pg","da","ChannelPrimaryInterest","SourcePrimaryInterest","DeliveryType","ClientsListFilters","Region","s","OrderShortInfo","ClientAdditionalData","contact","partnerGroup","manager","curator","ContactRelation","ContactPersonRelated","ClientDataProvider","contragentIc","contragent","contragentUlR","contragentUlNr","deliveryAddress","bankAccount","extraParams","signal","FilterOpEnum","phone","clientIDs","clients","dataTypes","passwordConfirm","promises","managers","curatorId","curatedDirection","curators","contragentId","contactPerson","deliveryAddressId","extraData","url","isPrimary","UnknownClientDataProvider","reject","VersionConfig","ConfiguratorsEnum","\"Kozyrek\"","\"Mosquitto\"","\"Strip\"","\"MetalForDoors\"","\"Sandwich\"","\"SandwichM2\"","ConfiguratorProvider","newTemplate","templateId","TableDataPaginationRequestParams","TableDataPagination","TableDataSortRequestParams","CalendarHelper","from","to","date","shift","endOfMonth","addMonths","amount","monthOffset","differenceInCalendarMonths","startOfMonth","currentPeriodStart","targetMonthStart","shiftedPeriodStart","day","getDate","getDaysInMonth","startOfDay","endOfDay","setDate","startOfWeek","addWeeks","shiftWeeks","dayOffset","differenceInCalendarDays","addDays","currentStart","dayNumber","targetStart","targetEnd","targetLength","currentIndex","totalIndex","monthShift","decadeIndex","monthStart","daysAgoIso","subDays","startOfToday","days","pluralize","cases","normalized","titles","formatRelativeDate","isoDate","diffDays","DateTimeProvider","nextWorkingDay","addBusinessDays","now","yearStart","startOfYear","year","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","isEmpty","list","period","DiscountStateEnum","\"Active\"","\"Completed\"","DiscountStateHelper","discount","Discount","product","source","DiscountClientEligibility","DiscountsListFilters","DiscountProvider","discountId","updateFixedClients","FaqGroup","Faq","group","FaqProvider","groupId","faqId","formatPercentChange","percent","round","UnitsHelper","ManagerDataFactory","ManagersListFilters","salesDirection","ManagerProvider","ManagerDataProvider","UserRegionShortInfo","OfferActualizationStatus","\"Processing\"","\"Error\"","\"NeedsActualization\"","OfferActualization","OfferShortInfo","ProfstroyOfferItem","Offer","OffersListFilters","OrderInfo","OrderStatus","Reference","attachedAt","OrderItem","replacement","Order","OffersDataProvider","offerId","offerProductId","offerProductIds","recipientText","OfferHelper","offer","OperatorShortInfo","User","OperatorFullInfo","Shop","store","OperatorsListFilters","OperatorProvider","operator","operatorId","OrderAction","\"View\"","\"Share\"","\"EditTags\"","\"SaveOrderIgnoredProducts\"","\"ChangeStatus\"","\"ChangeProducts\"","\"ChangeOrderParameters\"","\"Recalculate\"","\"AttachOrder\"","\"DetachOrder\"","\"ChangeAttachedOperator\"","\"SendOnlinePaymentLink\"","\"ConfirmOnlineFullPayment\"","\"MergeOrders\"","\"GetHistory\"","\"CloneOrder\"","\"DeleteAttachedFile\"","OrderEditorData","order","OrdersListFilters","o","Operator","PaymentType","w","OrderStatusHistoryInfo","createdAt","OrdersDataProvider","FilterGroup","orderId","cartItemIds","options","orderProductId","orderProduct","addressId","warehouseId","currentOrderInjectionKey","PriceAnalyze","convertPriceAnalyzeFilters","omitBy","city","isObject","convertPriceAnalyzeParams","PriceAnalyzeProvider","PriceHistoryItem","ProductPriceHistory","PriceHistoryDataProvider","updatedFilters","merge","isDate","responseData","ReclamationItem","ReclamationStatusEnum","\"Initiated\"","\"InfoRequired\"","\"Pending\"","ReclamationShortInfo","Reclamation","ReclamationsListFilters","ReclamationStatusHelper","status","statuses","ReclamationProvider","reclamationId","RecommendationsList","RecommendationsDataProvider","productCategory","recommendations","ReferenceDataFactory","Ctor","reference","MetaTagItem","Seo","ResourceType","SeoDataProvider","resourceType","resourceId","seo","SearchProductStatistic","StatisticsProvider","AddressQualityEnum","\"Undetermined\"","\"Complete\"","\"Incomplete\"","AddressQualityHelper","isIncompleteBlocked","quality","FieldValidationResultData","DataSuggestionProvider","UserAuthDataProvider","UserRegionEmployee","UserRegion","user","UserRegionsListFilters","UserRegionProvider","regionId","userId","salesDirectionId"],"sources":["../src/blog/enums/blog-post-media-type-enum.ts","../src/blog/classes/blog-post-media-file.ts","../src/blog/enums/blog-post-publication-status-enum.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/blog/providers/blog-provider.ts","../src/system/classes/deletable-named-identity.ts","../src/user/classes/user-short-info.ts","../src/catalog/classes/discount-short-info.ts","../src/catalog/classes/price-template.ts","../src/catalog/classes/product-price-coefficient.ts","../src/catalog/classes/stock-count.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/product-filter-type-enum.ts","../src/catalog/classes/category.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/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.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/classes/bank-account.ts","../src/contacts/classes/contact.ts","../src/contacts/classes/contact-person.ts","../src/clients/classes/contragent/contragent-base.ts","../src/clients/classes/contragent/contragent-person.ts","../src/clients/classes/contragent/contragent-ic.ts","../src/clients/classes/contragent/contragent-ul-r.ts","../src/clients/classes/contragent/contragent-ul-nr.ts","../src/clients/classes/contragent/contragent-factory.ts","../src/clients/classes/client-base-info.ts","../src/clients/classes/delivery-address.ts","../src/clients/classes/client.ts","../src/clients/classes/clients-list-filters.ts","../src/orders/classes/order-short-info.ts","../src/clients/classes/client-additional-data.ts","../src/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/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/managers/classes/manager-data-factory.ts","../src/managers/classes/managers-list-filters.ts","../src/managers/providers/manager-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/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/operators/classes/operator-short-info.ts","../src/operators/classes/operator-full-info.ts","../src/operators/classes/operators-list-filters.ts","../src/operators/providers/operator-provider.ts","../src/orders/enums/order-action.ts","../src/orders/classes/order-editor-data.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/reclamations/classes/reclamation-item.ts","../src/reclamations/enums/reclamation-status-enum.ts","../src/reclamations/classes/reclamation-short-info.ts","../src/reclamations/classes/reclamation.ts","../src/reclamations/classes/reclamations-list-filters.ts","../src/reclamations/helpers/reclamation-status-helper.ts","../src/reclamations/providers/reclamation-provider.ts","../src/recommendations/classes/recommendations-list.ts","../src/recommendations/providers/recommendations-data-provider.ts","../src/references/classes/reference-data-factory.ts","../src/seo/classes/meta-tag-item.ts","../src/seo/classes/seo.ts","../src/seo/providers/seo-data-provider.ts","../src/statistics/classes/search-product-statistic.ts","../src/statistics/providers/statistics-provider.ts","../src/suggestion/enums/address-quality-enum.ts","../src/suggestion/helpers/address-quality-helper.ts","../src/suggestion/providers/data-suggestion-provider.ts","../src/user/providers/user-auth-data-provider.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"],"sourcesContent":["/* 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 { BlogPostMediaTypeEnum } from '@common/blog/enums/blog-post-media-type-enum';\nimport { IBlogPostMediaFile } from '@common/blog/interfaces/i-blog-post-media-file';\nimport { Identity } from '@snabcentr/common-core';\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 { ICreatableIdentity } from '@common/system/interfaces/i-creatable-identity';\nimport { DateHelper, Identity } from '@snabcentr/common-core';\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 '@common/blog/enums/blog-post-publication-status-enum';\nimport { IBlogPostShortInfo } from '@common/blog/interfaces/i-blog-post-short-info';\nimport { CreatableIdentity } from '@common/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 '@common/blog/classes/blog-post-media-file';\nimport { BlogPostShortInfo } from '@common/blog/classes/blog-post-short-info';\nimport { IBlogPost } from '@common/blog/interfaces/i-blog-post';\nimport { IBlogPostMediaFile } from '@common/blog/interfaces/i-blog-post-media-file';\nimport { IBlogPostSaveData } from '@common/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 '@common/pagination/filters/i-pagination-filters-base';\nimport { IReference } from '@snabcentr/common-core';\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 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 // eslint-disable-next-line security/detect-object-injection\n result[k] = value;\n }\n });\n\n return result;\n }\n}\n","import { IDatePeriod } from '@snabcentr/common-core';\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 '@common/blog/enums/blog-post-publication-status-enum';\nimport { IBlogPostsListFilters } from '@common/blog/interfaces/i-blog-posts-list-filters';\nimport { PaginationFiltersBase } from '@common/pagination/filters/pagination-filters-base';\nimport { DatePeriod } from '@common/system/classes/date-period';\nimport { IDatePeriod } from '@snabcentr/common-core';\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 { BlogPost } from '@common/blog/classes/blog-post';\nimport { BlogPostMediaFile } from '@common/blog/classes/blog-post-media-file';\nimport { BlogPostShortInfo } from '@common/blog/classes/blog-post-short-info';\nimport { IBlogPost } from '@common/blog/interfaces/i-blog-post';\nimport { IBlogPostMediaFile } from '@common/blog/interfaces/i-blog-post-media-file';\nimport { IBlogPostSaveData } from '@common/blog/interfaces/i-blog-post-save-data';\nimport { IBlogPostShortInfo } from '@common/blog/interfaces/i-blog-post-short-info';\nimport { IFile } from '@common/system/interfaces/i-file';\nimport {\n BasePaginationProvider,\n IFieldValidationResultData,\n IFilterGroup,\n IPaginatedResponse,\n IPaginationRequestParams,\n ISortRequestParams,\n useBaseConfigStore,\n} from '@snabcentr/common-core';\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 = useBaseConfigStore().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","import { IDeletableNamedIdentity } from '@common/system/interfaces/i-deletable-named-identity';\nimport { DateHelper, UpdatableNamedIdentity } from '@snabcentr/common-core';\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 { IUserShortInfo } from '@common/user/interfaces/i-user-short-info';\nimport { NamedIdentity, UserTypeEnum } from '@snabcentr/common-core';\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 '@common/catalog/interfaces/i-discount-short-info';\nimport { DeletableNamedIdentity } from '@common/system/classes/deletable-named-identity';\nimport { UserShortInfo } from '@common/user/classes/user-short-info';\nimport { IUserShortInfo } from '@common/user/interfaces/i-user-short-info';\nimport { DateHelper } from '@snabcentr/common-core';\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 '@common/catalog/interfaces/i-price-template';\nimport { UserShortInfo } from '@common/user/classes/user-short-info';\nimport { UpdatableNamedIdentity } from '@snabcentr/common-core';\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","import { IProductPriceCoefficient } from '@common/catalog/interfaces/i-product-price-coefficient';\nimport { IPriceCoefficient, PriceCoefficient } from '@snabcentr/common-core';\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 { IStockCount } from '@common/catalog/interfaces/i-stock-count';\nimport { IWarehouse, Warehouse } from '@snabcentr/common-core';\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 { IProductUnit } from '@common/references/interfaces/i-product-unit';\nimport { NamedIdentity } from '@snabcentr/common-core';\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 { ICodedIdentity } from '@common/system/interfaces/i-coded-identity';\nimport { NamedIdentity } from '@snabcentr/common-core';\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 '@common/system/classes/coded-identity';\nimport { ICatalogableItem } from '@common/system/interfaces/i-catalogable-item';\nimport { CatalogableItemType } from '@common/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 '@common/system/classes/catalogable-item';\nimport { IHiddenCatalogableItem } from '@common/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 '@common/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 '@common/system/classes/catalogable-item';\nimport { IPrimaryCatalogableItem } from '@common/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 '@common/catalog/classes/product-price-coefficient';\nimport { StockCount } from '@common/catalog/classes/stock-count';\nimport { IProduct } from '@common/catalog/interfaces/i-product';\nimport { IProductPriceCoefficient } from '@common/catalog/interfaces/i-product-price-coefficient';\nimport { IStockCount } from '@common/catalog/interfaces/i-stock-count';\nimport { PropertiesList } from '@common/catalog/types/properties-list';\nimport { ProductUnit } from '@common/references/classes/product-unit';\nimport { IProductUnit } from '@common/references/interfaces/i-product-unit';\nimport { HiddenCatalogableItem } from '@common/system/classes/hidden-catalogable-item';\nimport { Image } from '@common/system/classes/image';\nimport { PrimaryCatalogableItem } from '@common/system/classes/primary-catalogable-item';\nimport { IImage } from '@common/system/interfaces/i-image';\nimport { IPrimaryCatalogableItem } from '@common/system/interfaces/i-primary-catalogable-item';\nimport { Currency, ICurrency, useBaseConfigStore } from '@snabcentr/common-core';\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, useBaseConfigStore().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 '@common/catalog/classes/discount-short-info';\nimport { PriceTemplate } from '@common/catalog/classes/price-template';\nimport { Product } from '@common/catalog/classes/product';\nimport { CostSourceEnum } from '@common/catalog/enums/cost-source-enum';\nimport { IClientProduct } from '@common/catalog/interfaces/i-client-product';\nimport { IDiscountShortInfo } from '@common/catalog/interfaces/i-discount-short-info';\nimport { IPriceTemplate } from '@common/catalog/interfaces/i-price-template';\nimport { IPriceCoefficient, PriceCoefficient } from '@snabcentr/common-core';\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 '@common/catalog/interfaces/internal/base/i-base-category';\nimport { PropertiesList } from '@common/catalog/types/properties-list';\nimport { PrimaryCatalogableItem } from '@common/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 '@common/cart/interfaces/i-cart-item-configurator-params-base';\nimport { IOrderItemBase } from '@common/cart/interfaces/i-order-item-base';\nimport { ClientProduct } from '@common/catalog/classes/client-product';\nimport { BaseCategory } from '@common/catalog/classes/internal/base/base-category';\nimport { IClientProduct } from '@common/catalog/interfaces/i-client-product';\nimport { ConfiguratorName } from '@common/configurator/types/configurator-name';\nimport { UserShortInfo } from '@common/user/classes/user-short-info';\nimport { IUserShortInfo } from '@common/user/interfaces/i-user-short-info';\nimport { Currency, ICurrency, Identity } from '@snabcentr/common-core';\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 '@common/cart/interfaces/i-cart-item-configurator-params-base';\nimport { IOrderItem } from '@common/cart/interfaces/i-order-item';\nimport { OrderItemBase } from '@common/orders/classes/order-item-base';\nimport { Currency, ICurrency } from '@snabcentr/common-core';\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 '@common/cart/classes/order-item';\nimport { ICart } from '@common/cart/interfaces/i-cart';\nimport { ICartSum } from '@common/cart/interfaces/i-cart-sum';\nimport { IOrderItem } from '@common/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 '@common/cart/classes/cart';\nimport { ICart } from '@common/cart/interfaces/i-cart';\nimport { ICartItemConfiguratorParamsBase } from '@common/cart/interfaces/i-cart-item-configurator-params-base';\nimport { IOrderItemBase } from '@common/cart/interfaces/i-order-item-base';\nimport { IFileUploadData } from '@common/catalog/interfaces/i-file-upload-data';\nimport { IClient } from '@common/clients/interfaces/i-client';\nimport { HttpRequester, IFieldValidationResultData } from '@snabcentr/common-core';\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 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 '@common/catalog/classes/internal/base/base-category';\nimport { Product } from '@common/catalog/classes/product';\nimport { ICategory } from '@common/catalog/interfaces/i-category';\nimport { IProduct } from '@common/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 { BaseCategory } from '@common/catalog/classes/internal/base/base-category';\nimport { IBaseClientCategory } from '@common/catalog/interfaces/internal/base/i-base-client-category';\nimport { IManager, Manager } from '@snabcentr/common-core';\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 '@common/catalog/classes/client-product';\nimport { BaseClientCategory } from '@common/catalog/classes/internal/base/base-client-category';\nimport { IClientCategory } from '@common/catalog/interfaces/i-client-category';\nimport { IClientProduct } from '@common/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 '@common/catalog/interfaces/i-price-catalogable-item';\nimport { IPriceCoefficient, PriceCoefficient } from '@snabcentr/common-core';\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 '@common/catalog/classes/price-catalogable-item';\nimport { IPriceTemplateICatalogableItem } from '@common/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 '@common/catalog/classes/internal/base/base-category';\nimport { PriceTemplateICatalogableItem } from '@common/catalog/classes/price-template-catalogable-item';\nimport { IPriceTemplateCategory } from '@common/catalog/interfaces/i-price-template-category';\nimport { IBaseCategory } from '@common/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 { ICurator } from '@common/managers/interfaces/i-curator';\nimport { ContactLinks, CuratedDirection, IContactLinks, ICuratedDirection, NamedIdentity } from '@snabcentr/common-core';\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","/* eslint-disable @typescript-eslint/no-unnecessary-condition */\n\nimport { IClientShortInfo } from '@common/clients/interfaces/i-client-short-info';\nimport { Curator } from '@common/managers/classes/curator';\nimport { ICurator } from '@common/managers/interfaces/i-curator';\nimport { CityWithRegionAndCountry, ICityWithRegionAndCountry, IManagerCommon, ISalesDirection, ManagerCommon, SalesDirection, UserCommonInfo } from '@snabcentr/common-core';\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 { CreatableIdentity } from '@common/system/classes/creatable-identity';\nimport { IDeletableIdentity } from '@common/system/interfaces/i-deletable-identity';\nimport { DateHelper } from '@snabcentr/common-core';\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 '@common/catalog/classes/price-template';\nimport { IPriceTemplate } from '@common/catalog/interfaces/i-price-template';\nimport { IPriceTemplateClient } from '@common/catalog/interfaces/i-price-template-client';\nimport { ClientShortInfo } from '@common/clients/classes/client-short-info';\nimport { IClientShortInfo } from '@common/clients/interfaces/i-client-short-info';\nimport { DeletableIdentity } from '@common/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 '@common/catalog/classes/price-template-catalogable-item';\nimport { Product } from '@common/catalog/classes/product';\nimport { IPriceTemplateProduct } from '@common/catalog/interfaces/i-price-template-product';\nimport { IProduct } from '@common/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 { IProperty } from '@common/catalog/interfaces/i-property';\nimport { IPropertyType, NamedIdentity, PropertyType } from '@snabcentr/common-core';\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 '@common/catalog/classes/property';\nimport { IPropertyValue } from '@common/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 '@common/catalog/interfaces/i-templates-list-filters';\nimport { DatePeriod } from '@common/system/classes/date-period';\nimport { IDatePeriod, IReference } from '@snabcentr/common-core';\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 // eslint-disable-next-line @typescript-eslint/unbound-method\n const value = this[k as keyof ITemplatesListFilters];\n\n if (!(\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 // 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 '@common/catalog/classes/price-catalogable-item';\nimport { IClientPriceCatalogableItem } from '@common/catalog/interfaces/i-client-price-catalogable-item';\nimport { UserShortInfo } from '@common/user/classes/user-short-info';\nimport { IUserShortInfo } from '@common/user/interfaces/i-user-short-info';\nimport { DateHelper } from '@snabcentr/common-core';\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 '@common/catalog/classes/client-price-catalogable-item';\nimport { Product } from '@common/catalog/classes/product';\nimport { IClientPriceProduct } from '@common/catalog/interfaces/i-client-price-product';\nimport { IProduct } from '@common/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 '@common/catalog/classes/client-price-catalogable-item';\nimport { BaseCategory } from '@common/catalog/classes/internal/base/base-category';\nimport { IClientPriceCategory } from '@common/catalog/interfaces/i-client-price-category';\nimport { IBaseCategory } from '@common/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 '@common/catalog/interfaces/i-pricing-role';\nimport { NamedIdentity } from '@snabcentr/common-core';\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 '@common/catalog/classes/internal/base/base-category';\nimport { PricingRole } from '@common/catalog/classes/pricing-role';\nimport { ICategoryPricingRule } from '@common/catalog/interfaces/i-category-pricing-rule';\nimport { IPricingRole } from '@common/catalog/interfaces/i-pricing-role';\nimport { IBaseCategory } from '@common/catalog/interfaces/internal/base/i-base-category';\nimport { IPriceCoefficient, PriceCoefficient } from '@snabcentr/common-core';\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 '@common/catalog/enums/product-filter-type-enum';\nimport { IFilterSettings } from '@common/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 '@common/catalog/classes/filter-settings';\nimport { BaseCategory } from '@common/catalog/classes/internal/base/base-category';\nimport { Property } from '@common/catalog/classes/property';\nimport { ICategoryFilterSetting } from '@common/catalog/interfaces/i-category-filter-setting';\nimport { IFilterSettings } from '@common/catalog/interfaces/i-filter-settings';\nimport { IProperty } from '@common/catalog/interfaces/i-property';\nimport { IBaseCategory } from '@common/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 '@common/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 '@common/catalog/classes/category-filter-value';\nimport { ProductFilterTypeEnum } from '@common/catalog/enums/product-filter-type-enum';\nimport { ICategoryFilter } from '@common/catalog/interfaces/i-category-filter';\nimport { ICategoryFilterValue } from '@common/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 '@common/catalog/types/search-result';\nimport { HttpRequester, useBaseConfigStore } from '@snabcentr/common-core';\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 // eslint-disable-next-line @typescript-eslint/no-useless-default-assignment -- параметр не может быть последним необязательным без значения по умолчанию (default-param-last).\n categoryId: number | undefined = undefined,\n // eslint-disable-next-line @typescript-eslint/no-useless-default-assignment -- параметр не может быть последним необязательным без значения по умолчанию (default-param-last).\n clientId: number | undefined = undefined\n ): string {\n const appConfig = useBaseConfigStore().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 '@common/catalog/classes/client-price-category';\nimport { ClientPriceProduct } from '@common/catalog/classes/client-price-product';\nimport { IClientPriceCategory } from '@common/catalog/interfaces/i-client-price-category';\nimport { IClientPriceProduct } from '@common/catalog/interfaces/i-client-price-product';\nimport { ICommercialOffer } from '@common/catalog/interfaces/i-commercial-offer';\nimport { ICommercialOfferParams } from '@common/catalog/interfaces/i-commercial-offer-params';\nimport { IFileUploadData } from '@common/catalog/interfaces/i-file-upload-data';\nimport { IPriceUpdateData } from '@common/catalog/interfaces/i-price-update-data';\nimport { HttpRequester } from '@snabcentr/common-core';\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 '@common/catalog/classes/price-template-client';\nimport { IPriceTemplateClient } from '@common/catalog/interfaces/i-price-template-client';\nimport { IPriceTemplateClientUpdateData } from '@common/catalog/interfaces/i-price-template-client-update-data';\nimport { HttpRequester, useBaseConfigStore } from '@snabcentr/common-core';\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 = useBaseConfigStore().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 = useBaseConfigStore().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 '@common/catalog/classes/category';\nimport { Product } from '@common/catalog/classes/product';\nimport { ProductPriceCoefficient } from '@common/catalog/classes/product-price-coefficient';\nimport { ICategory } from '@common/catalog/interfaces/i-category';\nimport { IProduct } from '@common/catalog/interfaces/i-product';\nimport { IProductPriceCoefficient } from '@common/catalog/interfaces/i-product-price-coefficient';\nimport { HttpRequester } from '@snabcentr/common-core';\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 '@common/catalog/classes/product';\nimport { ProductPriceCoefficient } from '@common/catalog/classes/product-price-coefficient';\nimport { IProduct } from '@common/catalog/interfaces/i-product';\nimport { IProductPriceCoefficient } from '@common/catalog/interfaces/i-product-price-coefficient';\nimport { BasePaginationProvider, IPaginatedResponse, IPaginationRequestParams, useBaseConfigStore } from '@snabcentr/common-core';\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 = useBaseConfigStore().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 '@common/catalog/classes/client-category';\nimport { ClientProduct } from '@common/catalog/classes/client-product';\nimport { IClientCategory } from '@common/catalog/interfaces/i-client-category';\nimport { IClientProduct } from '@common/catalog/interfaces/i-client-product';\nimport { HttpRequester } from '@snabcentr/common-core';\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 '@common/catalog/classes/client-product';\nimport { IClientProduct } from '@common/catalog/interfaces/i-client-product';\nimport { BasePaginationProvider, IPaginatedResponse, IPaginationRequestParams, useBaseConfigStore } from '@snabcentr/common-core';\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 = useBaseConfigStore().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 '@common/catalog/classes/price-template';\nimport { PriceTemplateCategory } from '@common/catalog/classes/price-template-category';\nimport { PriceTemplateClient } from '@common/catalog/classes/price-template-client';\nimport { PriceTemplateProduct } from '@common/catalog/classes/price-template-product';\nimport { IPriceTemplate } from '@common/catalog/interfaces/i-price-template';\nimport { IPriceTemplateCategory } from '@common/catalog/interfaces/i-price-template-category';\nimport { IPriceTemplateClient } from '@common/catalog/interfaces/i-price-template-client';\nimport { IPriceTemplateCreateData } from '@common/catalog/interfaces/i-price-template-create-data';\nimport { IPriceTemplateProduct } from '@common/catalog/interfaces/i-price-template-product';\nimport { IPriceUpdateData } from '@common/catalog/interfaces/i-price-update-data';\nimport { BasePaginationProvider, IFieldValidationResultData, IFilterGroup, IPaginatedResponse, IPaginationRequestParams, ISortRequestParams } from '@snabcentr/common-core';\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 '@common/catalog/classes/category-pricing-rule';\nimport { PricingRole } from '@common/catalog/classes/pricing-role';\nimport { ICategoryPricingRule } from '@common/catalog/interfaces/i-category-pricing-rule';\nimport { ICategoryPricingRuleUpdateData } from '@common/catalog/interfaces/i-category-pricing-rule-update-data';\nimport { IPricingRole } from '@common/catalog/interfaces/i-pricing-role';\nimport { IPricingRoleCreateData } from '@common/catalog/interfaces/i-pricing-role-create-data';\nimport { HttpRequester, TypedInstanceFactory } from '@snabcentr/common-core';\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 '@common/catalog/classes/category-filter';\nimport { CategoryFilterSetting } from '@common/catalog/classes/category-filter-setting';\nimport { Property } from '@common/catalog/classes/property';\nimport { PropertyValue } from '@common/catalog/classes/property-value';\nimport { ICatalogItemPropertyFile } from '@common/catalog/interfaces/i-catalog-item-property-file';\nimport { ICategoryFilter } from '@common/catalog/interfaces/i-category-filter';\nimport { ICategoryFilterSetting } from '@common/catalog/interfaces/i-category-filter-setting';\nimport { ICategoryFilterSettingUpdateData } from '@common/catalog/interfaces/i-category-filter-setting-update-data';\nimport { IDescription } from '@common/catalog/interfaces/i-description';\nimport { IFileUpdateData } from '@common/catalog/interfaces/i-file-update-data';\nimport { IFileUploadData } from '@common/catalog/interfaces/i-file-upload-data';\nimport { IProperty } from '@common/catalog/interfaces/i-property';\nimport { IPropertyCreateData } from '@common/catalog/interfaces/i-property-create-data';\nimport { IPropertyValue } from '@common/catalog/interfaces/i-property-value';\nimport { ISpecification } from '@common/catalog/interfaces/i-specification';\nimport { IFile } from '@common/system/interfaces/i-file';\nimport { BasePaginationProvider, IFilterGroup, IPaginatedResponse, IPaginationRequestParams, ISortRequestParams } from '@snabcentr/common-core';\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 '@common/catalog/classes/category';\nimport { Product } from '@common/catalog/classes/product';\nimport { ICategory } from '@common/catalog/interfaces/i-category';\nimport { IProduct } from '@common/catalog/interfaces/i-product';\nimport { HttpRequester } from '@snabcentr/common-core';\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 '@common/catalog/interfaces/i-category';\nimport { IProduct } from '@common/catalog/interfaces/i-product';\nimport { ICatalogableItem } from '@common/system/interfaces/i-catalogable-item';\nimport { CatalogableItemType } from '@common/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 '@common/catalog/interfaces/i-category';\nimport { ICatalogableItem } from '@common/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 @typescript-eslint/no-unnecessary-condition */\n\nimport { IBankAccount } from '@common/clients/interfaces/i-bank-account';\nimport { Currency, ICurrency, Identity } from '@snabcentr/common-core';\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 '@common/contacts/interfaces/i-contact';\nimport { DeletableNamedIdentity } from '@common/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 '@common/contacts/classes/contact';\nimport { IContactPerson } from '@common/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","/* eslint-disable @typescript-eslint/no-unnecessary-condition */\n\nimport { BankAccount } from '@common/clients/classes/bank-account';\nimport { IContragentBase } from '@common/clients/interfaces/contragent/i-contragent-base';\nimport { IBankAccount } from '@common/clients/interfaces/i-bank-account';\nimport { ContactPerson } from '@common/contacts/classes/contact-person';\nimport { IContactPerson } from '@common/contacts/interfaces/i-contact-person';\nimport { DeletableNamedIdentity } from '@common/system/classes/deletable-named-identity';\nimport { UserShortInfo } from '@common/user/classes/user-short-info';\nimport { IUserShortInfo } from '@common/user/interfaces/i-user-short-info';\nimport { IOpf, IPartnerGroup, Opf, PartnerGroup } from '@snabcentr/common-core';\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 '@common/clients/classes/contragent/contragent-base';\nimport { IContragentPerson } from '@common/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 '@common/clients/classes/contragent/contragent-base';\nimport { IContragentIc } from '@common/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 ogrn: 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.ogrn = data.ogrn ?? '';\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 '@common/clients/classes/contragent/contragent-ic';\nimport { IContragentUlR } from '@common/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 '@common/clients/classes/contragent/contragent-ul-r';\nimport { IContragentUlNr } from '@common/clients/interfaces/contragent/i-contragent-ul-nr';\nimport { Country, ICountry } from '@snabcentr/common-core';\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 '@common/clients/classes/contragent/contragent-ic';\nimport { ContragentPerson } from '@common/clients/classes/contragent/contragent-person';\nimport { ContragentUlNr } from '@common/clients/classes/contragent/contragent-ul-nr';\nimport { ContragentUlR } from '@common/clients/classes/contragent/contragent-ul-r';\nimport { IContragentBase } from '@common/clients/interfaces/contragent/i-contragent-base';\nimport { IContragentIc } from '@common/clients/interfaces/contragent/i-contragent-ic';\nimport { IContragentUlNr } from '@common/clients/interfaces/contragent/i-contragent-ul-nr';\nimport { IContragentUlR } from '@common/clients/interfaces/contragent/i-contragent-ul-r';\nimport { OpfEnum } from '@snabcentr/common-core';\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);\n }\n }\n}\n","import { IClientBaseInfo } from '@common/clients/interfaces/i-client-base-info';\nimport { CityWithRegionAndCountry, ICityWithRegionAndCountry, NamedIdentity } from '@snabcentr/common-core';\n\n/**\n * Базовые данные о клиенте: название, город и признак активности.\n */\nexport class ClientBaseInfo extends NamedIdentity implements IClientBaseInfo {\n /**\n * @inheritDoc\n */\n public city?: ICityWithRegionAndCountry;\n\n /**\n * @inheritDoc\n */\n public isActive: boolean;\n\n /**\n * Инициализирует экземпляр класса {@link ClientBaseInfo}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IClientBaseInfo>) {\n super(data);\n\n this.city = data?.city ? new CityWithRegionAndCountry(data.city) : undefined;\n this.isActive = data?.isActive ?? false;\n }\n}\n","/* eslint-disable @typescript-eslint/no-unnecessary-condition */\n\nimport { IDeliveryAddress } from '@common/clients/interfaces/i-delivery-address';\nimport { ContactPerson } from '@common/contacts/classes/contact-person';\nimport { IContactPerson } from '@common/contacts/interfaces/i-contact-person';\nimport { DeletableNamedIdentity } from '@common/system/classes/deletable-named-identity';\nimport { GeoCoordinates, IGeoCoordinates } from '@snabcentr/common-core';\n\n/**\n * Данные об адресе доставки клиента.\n */\nexport class DeliveryAddress extends DeletableNamedIdentity implements IDeliveryAddress {\n /**\n * Адрес.\n */\n address: string = '';\n\n /**\n * Координаты.\n */\n coordinates?: IGeoCoordinates;\n\n /**\n * Данные о контактных лицах.\n */\n contacts: IContactPerson[];\n\n /**\n * Комментарий к адресу доставки клиента.\n */\n public comment?: string;\n\n /**\n * Данные о времени работы.\n */\n public operatingHours?: {\n /**\n * Время работы, с (в формате ЧЧ:ММ).\n */\n from: string;\n\n /**\n * Время работы, до (в формате ЧЧ:ММ).\n */\n to: string;\n };\n\n /**\n * Признак одноразового адреса (адрес, который удаляется после завершения заказа).\n */\n public isOneTime?: boolean;\n\n /**\n * Признак того, что указанный адрес является адресом транспортной компании.\n */\n public isTransportCompanyAddress?: boolean;\n\n /**\n * Инициализирует экземпляр класса {@link DeliveryAddress}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IDeliveryAddress) {\n super(data);\n\n this.address = data?.address ?? '';\n this.coordinates = new GeoCoordinates(data?.coordinates);\n this.contacts = data?.contacts?.map((c) => new ContactPerson(c)) ?? [];\n this.comment = data?.comment;\n this.operatingHours = data?.operatingHours;\n this.isOneTime = data?.isOneTime;\n this.isTransportCompanyAddress = data?.isTransportCompanyAddress;\n }\n}\n","/* eslint-disable @typescript-eslint/no-unnecessary-condition */\n\nimport { ClientShortInfo } from '@common/clients/classes/client-short-info';\nimport { ContragentFactory } from '@common/clients/classes/contragent/contragent-factory';\nimport { DeliveryAddress } from '@common/clients/classes/delivery-address';\nimport { IContragentIc } from '@common/clients/interfaces/contragent/i-contragent-ic';\nimport { IContragentPerson } from '@common/clients/interfaces/contragent/i-contragent-person';\nimport { IContragentUlNr } from '@common/clients/interfaces/contragent/i-contragent-ul-nr';\nimport { IContragentUlR } from '@common/clients/interfaces/contragent/i-contragent-ul-r';\nimport { IClient } from '@common/clients/interfaces/i-client';\nimport { IDeliveryAddress } from '@common/clients/interfaces/i-delivery-address';\nimport { ContactPerson } from '@common/contacts/classes/contact-person';\nimport { IContactPerson } from '@common/contacts/interfaces/i-contact-person';\nimport {\n ChannelPrimaryInterest,\n DeliveryType,\n IChannelPrimaryInterest,\n IDeliveryType,\n IPartnerGroup,\n ISourcePrimaryInterest,\n IWarehouse,\n PartnerGroup,\n SourcePrimaryInterest,\n Warehouse,\n} from '@snabcentr/common-core';\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 '@common/clients/interfaces/i-clients-list-filters';\nimport { Contact } from '@common/contacts/classes/contact';\nimport { IContact } from '@common/contacts/interfaces/i-contact';\nimport { Curator } from '@common/managers/classes/curator';\nimport { ICurator } from '@common/managers/interfaces/i-curator';\nimport { IOrdersListFilters } from '@common/orders/interfaces/i-orders-list-filters';\nimport { PaginationFiltersBase } from '@common/pagination/filters/pagination-filters-base';\nimport { DatePeriod } from '@common/system/classes/date-period';\nimport {\n CityWithRegionAndCountry,\n Country,\n DeliveryType,\n ICityWithRegionAndCountry,\n ICountry,\n IDatePeriod,\n IDeliveryType,\n IManager,\n IOpf,\n IPartnerGroup,\n IRegion,\n ISalesDirection,\n Manager,\n Opf,\n PartnerGroup,\n Region,\n SalesDirection,\n} from '@snabcentr/common-core';\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 '@common/orders/interfaces/i-order-short-info';\nimport { CreatableIdentity } from '@common/system/classes/creatable-identity';\nimport { UserShortInfo } from '@common/user/classes/user-short-info';\nimport { IUserShortInfo } from '@common/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 '@common/clients/interfaces/i-client-additional-data';\nimport { ContactPerson } from '@common/contacts/classes/contact-person';\nimport { IContactPerson } from '@common/contacts/interfaces/i-contact-person';\nimport { Curator } from '@common/managers/classes/curator';\nimport { ICurator } from '@common/managers/interfaces/i-curator';\nimport { OrderShortInfo } from '@common/orders/classes/order-short-info';\nimport { IOrderShortInfo } from '@common/orders/interfaces/i-order-short-info';\nimport { DeliveryType, IDeliveryType, IManagerCommon, IPartnerGroup, ISalesDirection, ManagerCommon, NamedIdentity, PartnerGroup, SalesDirection } from '@snabcentr/common-core';\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 '@common/contacts/interfaces/i-contact-relation';\nimport { Identity } from '@snabcentr/common-core';\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 '@common/contacts/classes/contact-person';\nimport { ContactRelation } from '@common/contacts/classes/contact-relation';\nimport { IContactPersonRelated } from '@common/contacts/interfaces/i-contact-person-related';\nimport { IContactRelation } from '@common/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 '@common/clients/classes/bank-account';\nimport { Client } from '@common/clients/classes/client';\nimport { ClientAdditionalData } from '@common/clients/classes/client-additional-data';\nimport { ClientShortInfo } from '@common/clients/classes/client-short-info';\nimport { ContragentFactory } from '@common/clients/classes/contragent/contragent-factory';\nimport { DeliveryAddress } from '@common/clients/classes/delivery-address';\nimport { ClientsAdditionalDataRequestTypeEnum } from '@common/clients/enums/clients-additional-data-request-type-enum';\nimport { IContragentBase } from '@common/clients/interfaces/contragent/i-contragent-base';\nimport { IContragentIc } from '@common/clients/interfaces/contragent/i-contragent-ic';\nimport { IContragentUlNr } from '@common/clients/interfaces/contragent/i-contragent-ul-nr';\nimport { IContragentUlR } from '@common/clients/interfaces/contragent/i-contragent-ul-r';\nimport { IBankAccount } from '@common/clients/interfaces/i-bank-account';\nimport { IClient } from '@common/clients/interfaces/i-client';\nimport { IClientAdditionalData } from '@common/clients/interfaces/i-client-additional-data';\nimport { IClientShortInfo } from '@common/clients/interfaces/i-client-short-info';\nimport { IDeliveryAddress } from '@common/clients/interfaces/i-delivery-address';\nimport { ContactPerson } from '@common/contacts/classes/contact-person';\nimport { ContactPersonRelated } from '@common/contacts/classes/contact-person-related';\nimport { IContactPerson } from '@common/contacts/interfaces/i-contact-person';\nimport { IContactPersonRelated } from '@common/contacts/interfaces/i-contact-person-related';\nimport {\n BasePaginationProvider,\n FilterOpEnum,\n ICuratedDirection,\n IFieldValidationResultData,\n IFilterGroup,\n IManagerCommon,\n IPaginatedResponse,\n IPaginationRequestParams,\n ISortRequestParams,\n OpfEnum,\n TypedInstanceFactory,\n} from '@snabcentr/common-core';\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 ogrn: contragentIc.ogrn || undefined,\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 ogrn: contragentUlR.ogrn || undefined,\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\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 '@snabcentr/common-core';\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 '@common/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 '@common/cart/interfaces/i-cart-item-configurator-params-base';\nimport { Product } from '@common/catalog/classes/product';\nimport { ICategory } from '@common/catalog/interfaces/i-category';\nimport { IProduct } from '@common/catalog/interfaces/i-product';\nimport { IConfiguratorCalculateParamsSandwich } from '@common/configurator/interfaces/i-configurator-calculate-params-sandwich';\nimport { IConfiguratorCalculateResultSandwich } from '@common/configurator/interfaces/i-configurator-calculate-result-sandwich';\nimport { IConfiguratorSettingsBase } from '@common/configurator/interfaces/i-configurator-settings-base';\nimport { HttpRequester, IFieldValidationResultData } from '@snabcentr/common-core';\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 return this.request<IProduct>(\n {\n method: 'GET',\n url: `internal/catalog/categories/${category.id}/configurators/${category.properties?.configurator}/product`,\n params: { params, client_id: clientId },\n },\n (response) => new Product(response.data),\n validationFieldResultData\n );\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 '@snabcentr/common-core';\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 '@common/table-data/classes/table-data-pagination-request-params';\nimport { IPagination } from '@common/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 '@snabcentr/common-core';\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 '@snabcentr/common-core';\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 '@common/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 '@common/date-time/helpers/calendar-helper';\nimport { ILabeledPeriod } from '@common/date-time/interfaces/i-labeled-period';\nimport { IStandardPeriod } from '@common/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 '@common/date-time/types/standard-period-group-type';\nimport { StandardPeriodSectionType } from '@common/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 { ClientBaseInfo } from '@common/clients/classes/client-base-info';\nimport { IDiscountClient } from '@common/discounts/interfaces/i-discount-client';\n\n/**\n * Краткие данные о клиенте в условиях скидки.\n */\nexport class DiscountClient extends ClientBaseInfo implements IDiscountClient {}\n","import { DiscountClient } from '@common/discounts/classes/discount-client';\nimport { IDiscountClient } from '@common/discounts/interfaces/i-discount-client';\nimport { IDiscountConditions } from '@common/discounts/interfaces/i-discount-conditions';\nimport { IDiscountConditionsSaveData } from '@common/discounts/interfaces/i-discount-conditions-save-data';\nimport { DatePeriod } from '@common/system/classes/date-period';\nimport { UserShortInfo } from '@common/user/classes/user-short-info';\nimport { IUserShortInfo } from '@common/user/interfaces/i-user-short-info';\nimport {\n CityWithRegionAndCountry,\n ICityWithRegionAndCountry,\n IDatePeriod,\n IPartnerGroup,\n IRegion,\n ISalesDirection,\n PartnerGroup,\n Region,\n SalesDirection,\n} from '@snabcentr/common-core';\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","/**\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 '@common/catalog/interfaces/i-discount-short-info';\nimport { DiscountStateEnum } from '@common/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 '@common/catalog/classes/category';\nimport { DiscountShortInfo } from '@common/catalog/classes/discount-short-info';\nimport { Product } from '@common/catalog/classes/product';\nimport { ICategory } from '@common/catalog/interfaces/i-category';\nimport { IProduct } from '@common/catalog/interfaces/i-product';\nimport { DiscountConditions } from '@common/discounts/classes/discount-conditions';\nimport { DiscountStateEnum } from '@common/discounts/enums/discount-state-enum';\nimport { DiscountStateHelper } from '@common/discounts/helpers/discount-state-helper';\nimport { IDiscount } from '@common/discounts/interfaces/i-discount';\nimport { IDiscountSaveData } from '@common/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 percent: 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 '@common/discounts/classes/discount-client';\nimport { IDiscountClient } from '@common/discounts/interfaces/i-discount-client';\nimport { IDiscountClientEligibility } from '@common/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 '@common/discounts/enums/discount-state-enum';\nimport { IDiscountsListFilters } from '@common/discounts/interfaces/i-discounts-list-filters';\nimport { PaginationFiltersBase } from '@common/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 '@common/catalog/classes/discount-short-info';\nimport { IDiscountShortInfo } from '@common/catalog/interfaces/i-discount-short-info';\nimport { Discount } from '@common/discounts/classes/discount';\nimport { DiscountClientEligibility } from '@common/discounts/classes/discount-client-eligibility';\nimport { IDiscount } from '@common/discounts/interfaces/i-discount';\nimport { IDiscountClientEligibility } from '@common/discounts/interfaces/i-discount-client-eligibility';\nimport { IDiscountSaveData } from '@common/discounts/interfaces/i-discount-save-data';\nimport { IDiscountSaveRequestData } from '@common/discounts/interfaces/i-discount-save-request-data';\nimport {\n BasePaginationProvider,\n DateHelper,\n IFieldValidationResultData,\n IFilterGroup,\n IPaginatedResponse,\n IPaginationRequestParams,\n ISortRequestParams,\n} from '@snabcentr/common-core';\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\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 * Ошибка размера скидки приходит по ключу `percent`.\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 * Ошибка размера скидки приходит по ключу `percent`.\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 '@common/faq/interfaces/i-faq-group';\nimport { NamedIdentity } from '@snabcentr/common-core';\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 '@common/faq/classes/faq-group';\nimport { IFaq } from '@common/faq/interfaces/i-faq';\nimport { IFaqGroup } from '@common/faq/interfaces/i-faq-group';\nimport { IFaqSaveData } from '@common/faq/interfaces/i-faq-save-data';\nimport { Identity } from '@snabcentr/common-core';\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 '@common/faq/classes/faq';\nimport { FaqGroup } from '@common/faq/classes/faq-group';\nimport { IFaq } from '@common/faq/interfaces/i-faq';\nimport { IFaqGroup } from '@common/faq/interfaces/i-faq-group';\nimport { IFaqGroupSaveData } from '@common/faq/interfaces/i-faq-group-save-data';\nimport { IFaqSaveData } from '@common/faq/interfaces/i-faq-save-data';\nimport { BasePaginationProvider, IFieldValidationResultData, IPaginatedResponse, IPaginationRequestParams } from '@snabcentr/common-core';\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 '@common/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","import { IManager, Manager } from '@snabcentr/common-core';\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 { IManagersListFilters } from '@common/managers/interfaces/i-managers-list-filters';\nimport { PaginationFiltersBase } from '@common/pagination/filters/pagination-filters-base';\nimport { ISalesDirection, SalesDirection } from '@snabcentr/common-core';\n\n/**\n * Данные о параметрах фильтрации списка менеджеров.\n */\nexport class ManagersListFilters extends PaginationFiltersBase implements IManagersListFilters {\n /**\n * @inheritDoc\n */\n public name?: string;\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 salesDirections?: ISalesDirection[];\n\n /**\n * @inheritDoc\n */\n public isActive?: boolean;\n\n /**\n * @inheritDoc\n */\n public isSupervisor?: boolean;\n\n /**\n * @inheritDoc\n */\n public canDoReclamations?: boolean;\n\n /**\n * Инициализирует экземпляр класса {@link ManagersListFilters}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IManagersListFilters) {\n super();\n\n this.name = data?.name;\n this.phone = data?.phone;\n this.email = data?.email;\n this.salesDirections = data?.salesDirections?.map((salesDirection) => new SalesDirection(salesDirection));\n this.isActive = data?.isActive;\n this.isSupervisor = data?.isSupervisor;\n this.canDoReclamations = data?.canDoReclamations;\n }\n\n /**\n * @inheritDoc\n */\n public resetFilterValue(key: string): this {\n switch (key) {\n case 'name':\n case 'phone':\n case 'email':\n case 'salesDirections':\n case 'isActive':\n case 'isSupervisor':\n case 'canDoReclamations':\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 { IManagerSaveData } from '@common/managers/interfaces/i-manager-save-data';\nimport {\n IFieldValidationResultData,\n IFilterGroup,\n IManager,\n IPaginatedResponse,\n IPaginationRequestParams,\n ISortRequestParams,\n IUserRegionShortInfo,\n Manager,\n ManagerDataProvider,\n UserRegionShortInfo,\n} from '@snabcentr/common-core';\nimport { map } from 'lodash-es';\n\n/**\n * Предоставляет механизмы управления менеджерами.\n *\n * Дополняет механизмы {@link ManagerDataProvider} (список всех менеджеров и данные менеджера) списком с фильтрами,\n * созданием и изменением менеджеров и списком регионов менеджеров.\n */\nexport class ManagerProvider extends ManagerDataProvider {\n /**\n * Преобразует данные менеджера в данные, требуемые для запроса создания или изменения.\n *\n * @param manager Данные менеджера для сохранения.\n */\n protected static transformManagerDataToRequest(manager: IManagerSaveData): Record<string, unknown> {\n return {\n name: manager.name,\n phone: manager.contacts?.phone ?? '',\n email: manager.contacts?.email ?? '',\n password: manager.password,\n isActive: manager.isActive,\n isSupervisor: manager.isSupervisor,\n canDoReclamations: manager.canDoReclamations,\n authAsOperator: manager.authAsOperator ?? false,\n salesDirectionId: manager.salesDirection.id,\n pricingRoleId: manager.pricingRole?.id,\n showAllCosts: manager.showAllCosts ?? false,\n storeIds: map(manager.stores, 'id'),\n curatedDirectionIds: map(manager.curatedDirections, 'id'),\n managerRegionIds: map(manager.managerRegions, 'id'),\n managerIds: map(manager.managers, 'id'),\n photo: manager.photoFile,\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_manager_get_list\n */\n public getManagersList(\n filters?: IFilterGroup,\n sortParams?: ISortRequestParams[] | ISortRequestParams,\n paginationParams?: IPaginationRequestParams,\n signal?: AbortSignal\n ): Promise<IPaginatedResponse<IManager>> {\n return this.getTypedPaginated(Manager, '/internal/managers', filters, sortParams, paginationParams, {}, undefined, signal);\n }\n\n /**\n * Создаёт нового менеджера.\n *\n * @param manager Данные менеджера для сохранения.\n * @param validationFieldResultData Список полей, для которых необходимо\n * установить данные об ошибках валидации\n * в случае ошибок в запросах.\n *\n * @see /doc/api/internal#/operations/api_internal_managers_create\n */\n public createManager(manager: IManagerSaveData, validationFieldResultData: Record<string, IFieldValidationResultData> = {}): Promise<IManager> {\n return this.post<IManager>(\n '/internal/managers',\n ManagerProvider.transformManagerDataToRequest(manager),\n (response) => new Manager(response.data),\n validationFieldResultData\n );\n }\n\n /**\n * Изменяет данные указанного менеджера.\n *\n * Изменение заменяет все данные менеджера: связи и признаки, которых нет в переданных данных, сохраняются пустыми.\n * Поэтому передаются полные данные менеджера, например полученные {@link ManagerDataProvider.getManager}.\n *\n * @param manager Данные менеджера для сохранения.\n * @param validationFieldResultData Список полей, для которых необходимо\n * установить данные об ошибках валидации\n * в случае ошибок в запросах.\n *\n * @see /doc/api/internal#/operations/api_internal_managers_update\n */\n public updateManager(manager: IManagerSaveData, validationFieldResultData: Record<string, IFieldValidationResultData> = {}): Promise<IManager> {\n return this.patch<IManager>(\n `/internal/managers/${manager.id}`,\n ManagerProvider.transformManagerDataToRequest(manager),\n (response) => new Manager(response.data),\n validationFieldResultData\n );\n }\n\n /**\n * Возвращает список регионов менеджеров.\n *\n * @param filters Параметры фильтрации данных.\n * @param sortParams Параметры сортировки.\n * @param paginationParams Параметры пагинации.\n *\n * @see /doc/api/internal#/operations/api_internal_manager_regions_get_list\n */\n public getManagerRegionsList(\n filters?: IFilterGroup,\n sortParams?: ISortRequestParams[] | ISortRequestParams,\n paginationParams?: IPaginationRequestParams\n ): Promise<IPaginatedResponse<IUserRegionShortInfo>> {\n return this.getTypedPaginated(UserRegionShortInfo, '/internal/managers/regions', filters, sortParams, paginationParams);\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 { OfferActualizationStatus } from '@common/offers/enums/offer-actualization-status';\nimport { IOfferActualization } from '@common/offers/interfaces/i-offer-actualization';\nimport { DateHelper } from '@snabcentr/common-core';\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 '@common/clients/classes/client-short-info';\nimport { IClientShortInfo } from '@common/clients/interfaces/i-client-short-info';\nimport { OfferActualization } from '@common/offers/classes/offer-actualization';\nimport { IOfferActualization } from '@common/offers/interfaces/i-offer-actualization';\nimport { IOfferShortInfo } from '@common/offers/interfaces/i-offer-short-info';\nimport { IProfstroyOfferFile } from '@common/offers/interfaces/i-profstroy-offer-file';\nimport { CreatableIdentity } from '@common/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 '@common/cart/classes/order-item';\nimport { IProfstroyOfferItem } from '@common/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 '@common/cart/classes/order-item';\nimport { IOrderItem } from '@common/cart/interfaces/i-order-item';\nimport { OfferShortInfo } from '@common/offers/classes/offer-short-info';\nimport { ProfstroyOfferItem } from '@common/offers/classes/profstroy-offer-item';\nimport { IOffer } from '@common/offers/interfaces/i-offer';\nimport { IProfstroyOfferItem } from '@common/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 '@common/offers/interfaces/i-offers-list-filters';\nimport { PaginationFiltersBase } from '@common/pagination/filters/pagination-filters-base';\nimport { DatePeriod } from '@common/system/classes/date-period';\nimport { IDatePeriod } from '@snabcentr/common-core';\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","/* eslint-disable @typescript-eslint/no-unnecessary-condition */\n\nimport { ClientShortInfo } from '@common/clients/classes/client-short-info';\nimport { DeliveryAddress } from '@common/clients/classes/delivery-address';\nimport { IClientShortInfo } from '@common/clients/interfaces/i-client-short-info';\nimport { OrderShortInfo } from '@common/orders/classes/order-short-info';\nimport { IOrderInfo } from '@common/orders/interfaces/i-order-info';\nimport { UserShortInfo } from '@common/user/classes/user-short-info';\nimport { IUserShortInfo } from '@common/user/interfaces/i-user-short-info';\nimport { IOrderStatus, IReference, ISalesDirection, OrderStatus, Reference, SalesDirection, Warehouse } from '@snabcentr/common-core';\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 const attachedAt: unknown = data?.attachedAt;\n\n this.attachedAt = isString(attachedAt) ? parseISO(attachedAt) : 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 '@common/cart/interfaces/i-cart-item-configurator-params-base';\nimport { IOrderItem } from '@common/cart/interfaces/i-order-item';\nimport { IOrderItemBase } from '@common/cart/interfaces/i-order-item-base';\nimport { ClientProduct } from '@common/catalog/classes/client-product';\nimport { IClientProduct } from '@common/catalog/interfaces/i-client-product';\nimport { OrderItemBase } from '@common/orders/classes/order-item-base';\nimport { Currency, ICurrency } from '@snabcentr/common-core';\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 '@common/clients/classes/contragent/contragent-factory';\nimport { IContragentIc } from '@common/clients/interfaces/contragent/i-contragent-ic';\nimport { IContragentPerson } from '@common/clients/interfaces/contragent/i-contragent-person';\nimport { IContragentUlNr } from '@common/clients/interfaces/contragent/i-contragent-ul-nr';\nimport { IContragentUlR } from '@common/clients/interfaces/contragent/i-contragent-ul-r';\nimport { OrderInfo } from '@common/orders/classes/order-info';\nimport { OrderItem } from '@common/orders/classes/order-item';\nimport { OrderAction } from '@common/orders/enums/order-action';\nimport { IOrder } from '@common/orders/interfaces/i-order';\nimport { IOrderStatus, IReference, OrderStatus, Reference } from '@snabcentr/common-core';\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 '@common/cart/interfaces/i-cart-item-configurator-params-base';\nimport { IOrderItemBase } from '@common/cart/interfaces/i-order-item-base';\nimport { Offer } from '@common/offers/classes/offer';\nimport { OfferShortInfo } from '@common/offers/classes/offer-short-info';\nimport { IOffer } from '@common/offers/interfaces/i-offer';\nimport { IOfferSendData } from '@common/offers/interfaces/i-offer-send-data';\nimport { IOfferShortInfo } from '@common/offers/interfaces/i-offer-short-info';\nimport { Order } from '@common/orders/classes/order';\nimport { IClientOrderCreateData } from '@common/orders/interfaces/i-client-order-create-data';\nimport { IOrder } from '@common/orders/interfaces/i-order';\nimport { IFile } from '@common/system/interfaces/i-file';\nimport {\n BasePaginationProvider,\n IFieldValidationResultData,\n IFilterGroup,\n IPaginatedResponse,\n IPaginationRequestParams,\n ISortRequestParams,\n TypedInstanceFactory,\n useBaseConfigStore,\n} from '@snabcentr/common-core';\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\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 = useBaseConfigStore().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 * Удаляет несколько продуктов из заказа-черновика одним запросом и возвращает обновлённые данные записи.\n *\n * @param offerId Идентификатор записи заказа-черновика.\n * @param offerProductIds Идентификаторы позиций записи.\n *\n * @see /doc/api/internal#/Заказы/api_internal_order_commercial_offer_product_delete_list\n */\n public deleteOfferProducts(offerId: number, offerProductIds: string[]): Promise<IOffer> {\n return this.request<IOffer>(\n { method: 'DELETE', url: `/internal/orders/offers/${offerId}/products`, data: { items: offerProductIds } },\n (response) => new Offer(response.data)\n );\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 '@common/offers/interfaces/i-offer';\nimport { IOfferShortInfo } from '@common/offers/interfaces/i-offer-short-info';\nimport { IProfstroyOffer } from '@common/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","import { IOperatorShortInfo } from '@common/operators/interfaces/i-operator-short-info';\nimport { User } from '@snabcentr/common-core';\n\n/**\n * Краткие данные об операторе, которые возвращает список операторов.\n */\nexport class OperatorShortInfo extends User implements IOperatorShortInfo {\n /**\n * @inheritDoc\n */\n public isBillingSupervisor: boolean;\n\n /**\n * Инициализирует экземпляр класса {@link OperatorShortInfo}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IOperatorShortInfo>) {\n super(data);\n\n this.isBillingSupervisor = data?.isBillingSupervisor ?? false;\n }\n}\n","import { OperatorShortInfo } from '@common/operators/classes/operator-short-info';\nimport { IOperatorFullInfo } from '@common/operators/interfaces/i-operator-full-info';\nimport { IShop, Shop } from '@snabcentr/common-core';\n\n/**\n * Полные данные об операторе.\n */\nexport class OperatorFullInfo extends OperatorShortInfo implements IOperatorFullInfo {\n /**\n * @inheritDoc\n */\n public showAllCosts?: boolean;\n\n /**\n * @inheritDoc\n */\n public stores?: IShop[];\n\n /**\n * Инициализирует экземпляр класса {@link OperatorFullInfo}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IOperatorFullInfo>) {\n super(data);\n\n this.showAllCosts = data?.showAllCosts;\n this.stores = data?.stores?.map((store) => new Shop(store));\n }\n}\n","import { IOperatorsListFilters } from '@common/operators/interfaces/i-operators-list-filters';\nimport { PaginationFiltersBase } from '@common/pagination/filters/pagination-filters-base';\nimport { ISalesDirection, SalesDirection } from '@snabcentr/common-core';\n\n/**\n * Данные о параметрах фильтрации списка операторов.\n */\nexport class OperatorsListFilters extends PaginationFiltersBase implements IOperatorsListFilters {\n /**\n * @inheritDoc\n */\n public name?: string;\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 salesDirections?: ISalesDirection[];\n\n /**\n * @inheritDoc\n */\n public isActive?: boolean;\n\n /**\n * @inheritDoc\n */\n public isBillingSupervisor?: boolean;\n\n /**\n * @inheritDoc\n */\n public canDoReclamations?: boolean;\n\n /**\n * Инициализирует экземпляр класса {@link OperatorsListFilters}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: IOperatorsListFilters) {\n super();\n\n this.name = data?.name;\n this.phone = data?.phone;\n this.email = data?.email;\n this.salesDirections = data?.salesDirections?.map((salesDirection) => new SalesDirection(salesDirection));\n this.isActive = data?.isActive;\n this.isBillingSupervisor = data?.isBillingSupervisor;\n this.canDoReclamations = data?.canDoReclamations;\n }\n\n /**\n * @inheritDoc\n */\n public resetFilterValue(key: string): this {\n switch (key) {\n case 'name':\n case 'phone':\n case 'email':\n case 'salesDirections':\n case 'isActive':\n case 'isBillingSupervisor':\n case 'canDoReclamations':\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 { OperatorFullInfo } from '@common/operators/classes/operator-full-info';\nimport { OperatorShortInfo } from '@common/operators/classes/operator-short-info';\nimport { IOperatorFullInfo } from '@common/operators/interfaces/i-operator-full-info';\nimport { IOperatorSaveData } from '@common/operators/interfaces/i-operator-save-data';\nimport { IOperatorShortInfo } from '@common/operators/interfaces/i-operator-short-info';\nimport { BasePaginationProvider, IFieldValidationResultData, IFilterGroup, IPaginatedResponse, IPaginationRequestParams, ISortRequestParams } from '@snabcentr/common-core';\nimport { map } from 'lodash-es';\n\n/**\n * Предоставляет механизмы управления операторами: список с фильтрами, получение, создание и изменение.\n */\nexport class OperatorProvider extends BasePaginationProvider {\n /**\n * Преобразует данные оператора в данные, требуемые для запроса создания или изменения.\n *\n * @param operator Данные оператора для сохранения.\n */\n protected static transformOperatorDataToRequest(operator: IOperatorSaveData): Record<string, unknown> {\n return {\n name: operator.name,\n phone: operator.phone,\n email: operator.email,\n password: operator.password,\n isActive: operator.isActive,\n isBillingSupervisor: operator.isBillingSupervisor,\n canDoReclamations: operator.canDoReclamations,\n salesDirectionId: operator.salesDirection?.id,\n pricingRoleId: operator.pricingRole?.id,\n showAllCosts: operator.showAllCosts ?? false,\n storeIds: map(operator.stores, 'id'),\n photo: operator.photoFile,\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_operators_get_list\n */\n public getOperatorsList(\n filters?: IFilterGroup,\n sortParams?: ISortRequestParams[] | ISortRequestParams,\n paginationParams?: IPaginationRequestParams,\n signal?: AbortSignal\n ): Promise<IPaginatedResponse<IOperatorShortInfo>> {\n return this.getTypedPaginated(OperatorShortInfo, '/internal/operators', filters, sortParams, paginationParams, {}, undefined, signal);\n }\n\n /**\n * Возвращает полные данные об операторе с указанным идентификатором.\n *\n * @param operatorId Идентификатор оператора (идентификатор его учётной записи).\n * @param disableNotifications Признак необходимости отключить уведомления об ошибках.\n *\n * @see /doc/api/internal#/operations/api_internal_operators_get\n */\n public getOperator(operatorId: number, disableNotifications: boolean = false): Promise<IOperatorFullInfo> {\n return this.get<IOperatorFullInfo>(`/internal/operators/${operatorId}`, {}, (response) => new OperatorFullInfo(response.data), disableNotifications);\n }\n\n /**\n * Создаёт нового оператора.\n *\n * @param operator Данные оператора для сохранения.\n * @param validationFieldResultData Список полей, для которых необходимо\n * установить данные об ошибках валидации\n * в случае ошибок в запросах.\n *\n * @see /doc/api/internal#/operations/api_internal_operators_create\n */\n public createOperator(operator: IOperatorSaveData, validationFieldResultData: Record<string, IFieldValidationResultData> = {}): Promise<IOperatorFullInfo> {\n return this.post<IOperatorFullInfo>(\n '/internal/operators',\n OperatorProvider.transformOperatorDataToRequest(operator),\n (response) => new OperatorFullInfo(response.data),\n validationFieldResultData\n );\n }\n\n /**\n * Изменяет данные указанного оператора.\n *\n * Изменение заменяет все данные оператора: признаки и магазины, которых нет в переданных данных, сохраняются пустыми.\n * Поэтому передаются полные данные оператора, например полученные {@link OperatorProvider.getOperator}.\n *\n * @param operator Данные оператора для сохранения.\n * @param validationFieldResultData Список полей, для которых необходимо\n * установить данные об ошибках валидации\n * в случае ошибок в запросах.\n *\n * @see /doc/api/internal#/operations/api_internal_operators_update\n */\n public updateOperator(operator: IOperatorSaveData, validationFieldResultData: Record<string, IFieldValidationResultData> = {}): Promise<IOperatorFullInfo> {\n return this.patch<IOperatorFullInfo>(\n `/internal/operators/${operator.id}`,\n OperatorProvider.transformOperatorDataToRequest(operator),\n (response) => new OperatorFullInfo(response.data),\n validationFieldResultData\n );\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 '@common/orders/interfaces/i-order';\nimport { IOrderEditorData } from '@common/orders/interfaces/i-order-editor-data';\nimport { IFile } from '@common/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","/* eslint-disable @typescript-eslint/no-explicit-any,@typescript-eslint/no-unnecessary-condition */\n\nimport { ClientShortInfo } from '@common/clients/classes/client-short-info';\nimport { IContragentUlNr } from '@common/clients/interfaces/contragent/i-contragent-ul-nr';\nimport { IClientShortInfo } from '@common/clients/interfaces/i-client-short-info';\nimport { IOrdersListFilters } from '@common/orders/interfaces/i-orders-list-filters';\nimport { PaginationFiltersBase } from '@common/pagination/filters/pagination-filters-base';\nimport { DatePeriod } from '@common/system/classes/date-period';\nimport { UserShortInfo } from '@common/user/classes/user-short-info';\nimport { IUserShortInfo } from '@common/user/interfaces/i-user-short-info';\nimport {\n CityWithRegionAndCountry,\n DeliveryType,\n ICityWithRegionAndCountry,\n IDatePeriod,\n IDeliveryType,\n IManager,\n IOperator,\n IOrderStatus,\n IPaymentType,\n IReference,\n ISalesDirection,\n IWarehouse,\n Manager,\n Operator,\n PaymentType,\n SalesDirection,\n Warehouse,\n} from '@snabcentr/common-core';\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 '@common/orders/interfaces/i-order-status-history-info';\nimport { UserShortInfo } from '@common/user/classes/user-short-info';\nimport { IUserShortInfo } from '@common/user/interfaces/i-user-short-info';\nimport { IOrderStatus, IReference, OrderStatus, Reference } from '@snabcentr/common-core';\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 const createdAt: unknown = data?.createdAt;\n\n this.createdAt = isString(createdAt) ? parseISO(createdAt) : (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 '@common/cart/interfaces/i-cart-item-configurator-params-base';\nimport { IOrderItemBase } from '@common/cart/interfaces/i-order-item-base';\nimport { Order } from '@common/orders/classes/order';\nimport { OrderInfo } from '@common/orders/classes/order-info';\nimport { OrderStatusHistoryInfo } from '@common/orders/classes/order-status-history-info';\nimport { IClientOrderCreateData } from '@common/orders/interfaces/i-client-order-create-data';\nimport { IClientOrderStatistics } from '@common/orders/interfaces/i-client-order-statistics';\nimport { IDeliveryCostInfo } from '@common/orders/interfaces/i-delivery-cost-info';\nimport { IOrder } from '@common/orders/interfaces/i-order';\nimport { IOrderEditorData } from '@common/orders/interfaces/i-order-editor-data';\nimport { IOrderInfo } from '@common/orders/interfaces/i-order-info';\nimport { IOrderPrintOptions } from '@common/orders/interfaces/i-order-print-options';\nimport { IOrderPrintSendData } from '@common/orders/interfaces/i-order-print-send-data';\nimport { IOrderStatusHistoryInfo } from '@common/orders/interfaces/i-order-status-history-info';\nimport {\n BasePaginationProvider,\n FilterGroup,\n IDatePeriod,\n IFieldValidationResultData,\n IFilterGroup,\n IPaginatedResponse,\n IPaginationRequestParams,\n ISortRequestParams,\n OrderStatusEnum,\n TypedInstanceFactory,\n useBaseConfigStore,\n} from '@snabcentr/common-core';\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\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): 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 = useBaseConfigStore().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 = useBaseConfigStore().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): 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): 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): Promise<IDeliveryCostInfo> {\n const apiDateFormat = useBaseConfigStore().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 '@common/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 '@common/catalog/classes/product';\nimport { CostSourceEnum } from '@common/catalog/enums/cost-source-enum';\nimport { IProduct } from '@common/catalog/interfaces/i-product';\nimport { ClientShortInfo } from '@common/clients/classes/client-short-info';\nimport { IClientShortInfo } from '@common/clients/interfaces/i-client-short-info';\nimport { IPriceAnalyze } from '@common/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 '@common/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 '@common/price-analyze/interfaces/i-price-analyze-parameter';\nimport { IPriceAnalyzeParams } from '@common/price-analyze/interfaces/i-price-analyze-params';\nimport { ITypedNullableRange } from '@snabcentr/common-core';\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 { PriceAnalyze } from '@common/price-analyze/classes/price-analyze';\nimport { convertPriceAnalyzeFilters } from '@common/price-analyze/converters/price-analyze-filters';\nimport { convertPriceAnalyzeParams } from '@common/price-analyze/converters/price-analyze-params';\nimport { IPriceAnalyze } from '@common/price-analyze/interfaces/i-price-analyze';\nimport { IPriceAnalyzeFilters } from '@common/price-analyze/interfaces/i-price-analyze-filters';\nimport { IPriceAnalyzeParams } from '@common/price-analyze/interfaces/i-price-analyze-params';\nimport { HttpRequester, ITypedNullableRange, TypedInstanceFactory } from '@snabcentr/common-core';\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 '@common/price-history/interfaces/i-price-history-item';\nimport { CodedIdentity } from '@common/system/classes/coded-identity';\nimport { ICodedIdentity } from '@common/system/interfaces/i-coded-identity';\nimport { UserShortInfo } from '@common/user/classes/user-short-info';\nimport { IUserShortInfo } from '@common/user/interfaces/i-user-short-info';\nimport { Currency, ICurrency } from '@snabcentr/common-core';\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 '@common/price-history/classes/price-history-item';\nimport { IPriceHistoryItem } from '@common/price-history/interfaces/i-price-history-item';\nimport { IProductPriceHistory } from '@common/price-history/interfaces/i-product-price-history';\nimport { CodedIdentity } from '@common/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 { ProductPriceHistory } from '@common/price-history/classes/product-price-history';\nimport { IPriceHistoryItem } from '@common/price-history/interfaces/i-price-history-item';\nimport { IPriceHistoryRequestParams } from '@common/price-history/interfaces/i-price-history-request-params';\nimport { IProductPriceHistory } from '@common/price-history/interfaces/i-product-price-history';\nimport { HttpRequester, useBaseConfigStore } from '@snabcentr/common-core';\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 = useBaseConfigStore().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 { ReclamationStatusEnum } from '@common/reclamations/enums/reclamation-status-enum';\nimport { IReclamationItem } from '@common/reclamations/interfaces/i-reclamation-item';\nimport { UserShortInfo } from '@common/user/classes/user-short-info';\nimport { IUserShortInfo } from '@common/user/interfaces/i-user-short-info';\nimport { DateHelper } from '@snabcentr/common-core';\nimport { isNil } from 'lodash-es';\n\n/**\n * Данные о сообщении в истории рекламации.\n */\nexport class ReclamationItem implements IReclamationItem {\n /**\n * @inheritDoc\n */\n public createdAt: Date;\n\n /**\n * @inheritDoc\n */\n public creator?: IUserShortInfo;\n\n /**\n * @inheritDoc\n */\n public files: string[];\n\n /**\n * @inheritDoc\n */\n public text?: string;\n\n /**\n * @inheritDoc\n */\n public status?: ReclamationStatusEnum;\n\n /**\n * Инициализирует экземпляр класса {@link ReclamationItem}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IReclamationItem>) {\n this.createdAt = DateHelper.parse(data?.createdAt) ?? new Date();\n this.creator = isNil(data?.creator) ? undefined : new UserShortInfo(data.creator);\n this.files = data?.files ?? [];\n this.text = data?.text ?? undefined;\n this.status = data?.status ?? undefined;\n }\n\n /**\n * Возвращает признак того, что сообщение изменило статус рекламации.\n */\n public isStatusChanged(): this is ReclamationItem & Required<Pick<IReclamationItem, 'status'>> {\n return !isNil(this.status);\n }\n}\n","/**\n * Статус рекламации.\n */\nexport enum ReclamationStatusEnum {\n /**\n * Рекламация создана клиентом.\n */\n Initiated = 1,\n\n /**\n * От клиента требуется дополнительная информация.\n */\n InfoRequired = 2,\n\n /**\n * Рекламация на рассмотрении.\n */\n Pending = 3,\n\n /**\n * Рекламация закрыта.\n */\n Completed = 4,\n}\n","import { ClientBaseInfo } from '@common/clients/classes/client-base-info';\nimport { IClientBaseInfo } from '@common/clients/interfaces/i-client-base-info';\nimport { ReclamationStatusEnum } from '@common/reclamations/enums/reclamation-status-enum';\nimport { IReclamationShortInfo } from '@common/reclamations/interfaces/i-reclamation-short-info';\nimport { CreatableIdentity } from '@common/system/classes/creatable-identity';\nimport { DateHelper } from '@snabcentr/common-core';\nimport { differenceInCalendarDays } from 'date-fns';\n\n/**\n * Краткие данные о рекламации.\n */\nexport class ReclamationShortInfo extends CreatableIdentity implements IReclamationShortInfo {\n /**\n * @inheritDoc\n */\n public status: ReclamationStatusEnum;\n\n /**\n * @inheritDoc\n */\n public closedAt?: Date;\n\n /**\n * @inheritDoc\n */\n public isRead: boolean;\n\n /**\n * @inheritDoc\n */\n public isDeleted: boolean;\n\n /**\n * @inheritDoc\n */\n public client: IClientBaseInfo;\n\n /**\n * Инициализирует экземпляр класса {@link ReclamationShortInfo}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IReclamationShortInfo>) {\n super(data);\n\n this.status = data?.status ?? ReclamationStatusEnum.Initiated;\n this.closedAt = DateHelper.parse(data?.closedAt);\n this.isRead = data?.isRead ?? false;\n this.isDeleted = data?.isDeleted ?? false;\n this.client = new ClientBaseInfo(data?.client);\n }\n\n /**\n * Возвращает признак того, что рекламация закрыта.\n */\n public isClosed(): boolean {\n return this.status === ReclamationStatusEnum.Completed;\n }\n\n /**\n * Возвращает признак того, что рекламацию можно удалить или восстановить: клиент пометил её на удаление, и она не закрыта.\n */\n public isDeletionPending(): boolean {\n return this.isDeleted && !this.isClosed();\n }\n\n /**\n * Возвращает признак того, что в рекламацию можно добавить сообщение: она не закрыта.\n */\n public canAddMessage(): boolean {\n return !this.isClosed();\n }\n\n /**\n * Возвращает количество календарных дней, которое рекламация находится на рассмотрении:\n * от создания до закрытия, а для незакрытой рекламации до указанного момента.\n *\n * @param now Момент, до которого считаются дни незакрытой рекламации.\n */\n public getConsiderationDays(now: Date = new Date()): number {\n return Math.max(differenceInCalendarDays(this.closedAt ?? now, this.createdAt), 0);\n }\n}\n","import { ReclamationItem } from '@common/reclamations/classes/reclamation-item';\nimport { ReclamationShortInfo } from '@common/reclamations/classes/reclamation-short-info';\nimport { IReclamation } from '@common/reclamations/interfaces/i-reclamation';\nimport { IReclamationItem } from '@common/reclamations/interfaces/i-reclamation-item';\nimport { map } from 'lodash-es';\n\n/**\n * Полные данные о рекламации.\n */\nexport class Reclamation extends ReclamationShortInfo implements IReclamation {\n /**\n * @inheritDoc\n */\n public items: ReclamationItem[];\n\n /**\n * Инициализирует экземпляр класса {@link Reclamation}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IReclamation>) {\n super(data);\n\n this.items = map(data?.items ?? [], (item) => new ReclamationItem(item));\n }\n\n /**\n * Возвращает признак того, что сообщение написал клиент, создавший рекламацию.\n *\n * @param item Сообщение рекламации.\n */\n public isClientMessage(item: IReclamationItem): boolean {\n return item.creator?.id === this.client.id;\n }\n}\n","import { PaginationFiltersBase } from '@common/pagination/filters/pagination-filters-base';\nimport { ReclamationStatusEnum } from '@common/reclamations/enums/reclamation-status-enum';\nimport { IReclamationsListFilters } from '@common/reclamations/interfaces/i-reclamations-list-filters';\nimport { DatePeriod } from '@common/system/classes/date-period';\nimport { IDatePeriod, ITypedNullableRange } from '@snabcentr/common-core';\n\n/**\n * Данные о параметрах фильтрации списка рекламаций.\n */\nexport class ReclamationsListFilters extends PaginationFiltersBase implements IReclamationsListFilters {\n /**\n * @inheritDoc\n */\n public id: ITypedNullableRange<number | null>;\n\n /**\n * @inheritDoc\n */\n public statuses?: ReclamationStatusEnum[];\n\n /**\n * @inheritDoc\n */\n public createdAt: IDatePeriod;\n\n /**\n * @inheritDoc\n */\n public closedAt: IDatePeriod;\n\n /**\n * @inheritDoc\n */\n public isRead?: boolean;\n\n /**\n * @inheritDoc\n */\n public isDeleted?: boolean;\n\n /**\n * @inheritDoc\n */\n public clientName?: string;\n\n /**\n * @inheritDoc\n */\n public cityName?: string;\n\n /**\n * Инициализирует экземпляр класса {@link ReclamationsListFilters}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<IReclamationsListFilters>) {\n super();\n\n this.id = { from: data?.id?.from ?? null, to: data?.id?.to ?? null };\n this.statuses = data?.statuses;\n this.createdAt = new DatePeriod(data?.createdAt);\n this.closedAt = new DatePeriod(data?.closedAt);\n this.isRead = data?.isRead;\n this.isDeleted = data?.isDeleted;\n this.clientName = data?.clientName;\n this.cityName = data?.cityName;\n }\n\n /**\n * Выполняет сброс указанного фильтра в значение по умолчанию. Сброс признака пометки на удаление скрывает\n * рекламации, помеченные клиентом на удаление.\n *\n * @param key Название фильтра, значение которого необходимо сбросить.\n */\n public resetFilterValue(key: string): this {\n switch (key) {\n case 'isDeleted':\n this.isDeleted = false;\n break;\n case 'statuses':\n case 'isRead':\n case 'clientName':\n case 'cityName':\n // eslint-disable-next-line security/detect-object-injection\n this[key] = undefined;\n break;\n case 'id':\n this.id.from = null;\n this.id.to = null;\n break;\n case 'createdAt':\n this.createdAt.from = null;\n this.createdAt.to = null;\n break;\n case 'closedAt':\n this.closedAt.from = null;\n this.closedAt.to = null;\n break;\n default:\n break;\n }\n\n return this;\n }\n}\n","import { ReclamationStatusEnum } from '@common/reclamations/enums/reclamation-status-enum';\nimport { map } from 'lodash-es';\n\n/**\n * Класс-помощник для работы со статусами рекламаций.\n */\nexport class ReclamationStatusHelper {\n /**\n * Строковые коды статусов, которые API принимает в фильтрах списка рекламаций.\n */\n private static readonly apiCodes: Record<ReclamationStatusEnum, string> = {\n [ReclamationStatusEnum.Initiated]: 'initiated',\n [ReclamationStatusEnum.InfoRequired]: 'info_required',\n [ReclamationStatusEnum.Pending]: 'pending',\n [ReclamationStatusEnum.Completed]: 'completed',\n };\n\n /**\n * Возвращает строковый код статуса для фильтра списка рекламаций.\n *\n * @param status Статус рекламации.\n */\n public static toApiCode(status: ReclamationStatusEnum): string {\n // eslint-disable-next-line security/detect-object-injection\n return ReclamationStatusHelper.apiCodes[status];\n }\n\n /**\n * Возвращает список строковых кодов статусов для фильтра списка рекламаций.\n *\n * @param statuses Статусы рекламаций.\n */\n public static toApiCodes(statuses: ReclamationStatusEnum[]): string[] {\n return map(statuses, (status) => ReclamationStatusHelper.toApiCode(status));\n }\n}\n","import { Reclamation } from '@common/reclamations/classes/reclamation';\nimport { ReclamationShortInfo } from '@common/reclamations/classes/reclamation-short-info';\nimport { IReclamationMessageSaveData } from '@common/reclamations/interfaces/i-reclamation-message-save-data';\nimport { IReclamationsUpdates } from '@common/reclamations/interfaces/i-reclamations-updates';\nimport { BasePaginationProvider, IFieldValidationResultData, IFilterGroup, IPaginatedResponse, IPaginationRequestParams, ISortRequestParams } from '@snabcentr/common-core';\n\n/**\n * Предоставляет механизмы получения/управления рекламациями клиентов.\n */\nexport class ReclamationProvider extends BasePaginationProvider {\n /**\n * Возвращает список рекламаций.\n *\n * @param filters Параметры фильтрации данных. Статусы передаются строковыми кодами (см. ReclamationStatusHelper.toApiCodes).\n * @param sortParams Параметры сортировки.\n * @param paginationParams Параметры пагинации.\n * @param signal Сигнал отмены запроса.\n * @param disableNotifications Признак необходимости отключить уведомления об ошибках.\n *\n * @see /doc/api/internal#/operations/api_internal_reclamations_get_list\n */\n public getReclamationsList(\n filters?: IFilterGroup,\n sortParams?: ISortRequestParams[] | ISortRequestParams,\n paginationParams?: IPaginationRequestParams,\n signal?: AbortSignal,\n disableNotifications: boolean = false\n ): Promise<IPaginatedResponse<ReclamationShortInfo>> {\n return this.getTypedPaginated(ReclamationShortInfo, '/internal/reclamations', filters, sortParams, paginationParams, {}, disableNotifications, signal);\n }\n\n /**\n * Возвращает полные данные о рекламации. Открытие рекламации отмечает её прочитанной сотрудником.\n *\n * @param reclamationId Идентификатор рекламации.\n * @param signal Сигнал отмены запроса.\n * @param disableNotifications Признак необходимости отключить уведомления об ошибках.\n *\n * @see /doc/api/internal#/operations/api_internal_reclamation_get\n */\n public getReclamation(reclamationId: number, signal?: AbortSignal, disableNotifications: boolean = false): Promise<Reclamation> {\n return this.get<Reclamation>(`/internal/reclamations/${reclamationId}`, {}, (response) => new Reclamation(response.data), disableNotifications, signal);\n }\n\n /**\n * Добавляет сообщение в незакрытую рекламацию и возвращает её полные данные.\n *\n * @param reclamationId Идентификатор рекламации.\n * @param data Данные сообщения. Без статуса сообщение не меняет статус рекламации.\n * @param validationFieldResultData Список полей, для которых необходимо\n * установить данные об ошибках валидации\n * в случае ошибок в запросах.\n *\n * @see /doc/api/internal#/operations/api_internal_reclamation_create_message\n */\n public createMessage(\n reclamationId: number,\n data: IReclamationMessageSaveData,\n validationFieldResultData: Record<string, IFieldValidationResultData> = {}\n ): Promise<Reclamation> {\n return this.post<Reclamation>(`/internal/reclamations/${reclamationId}/messages`, data, (response) => new Reclamation(response.data), validationFieldResultData);\n }\n\n /**\n * Удаляет незакрытую рекламацию, помеченную клиентом на удаление.\n *\n * @param reclamationId Идентификатор рекламации.\n *\n * @see /doc/api/internal#/operations/api_internal_reclamation_delete\n */\n public deleteReclamation(reclamationId: number): Promise<void> {\n return this.delete(`/internal/reclamations/${reclamationId}`);\n }\n\n /**\n * Снимает пометку на удаление с незакрытой рекламации и возвращает её полные данные.\n *\n * @param reclamationId Идентификатор рекламации.\n *\n * @see /doc/api/internal#/operations/api_internal_reclamation_restore\n */\n public restoreReclamation(reclamationId: number): Promise<Reclamation> {\n return this.post<Reclamation>(`/internal/reclamations/${reclamationId}/restore`, {}, (response) => new Reclamation(response.data));\n }\n\n /**\n * Возвращает рекламацию в формате PDF.\n *\n * @param reclamationId Идентификатор рекламации.\n * @param disableNotifications Признак необходимости отключить уведомления об ошибках.\n *\n * @see /doc/api/internal#/operations/api_internal_reclamation_download\n */\n public downloadReclamation(reclamationId: number, disableNotifications: boolean = false): Promise<Blob> {\n return this.getBlob<Blob>(\n `/internal/reclamations/${reclamationId}/download`,\n {},\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (response) => new Blob([response.request.response], { type: 'application/pdf' }),\n disableNotifications\n );\n }\n\n /**\n * Возвращает данные о количестве рекламаций с изменениями, не просмотренными сотрудниками, включая помеченные клиентом на удаление.\n *\n * @param signal Сигнал отмены запроса.\n * @param disableNotifications Признак необходимости отключить уведомления об ошибках.\n *\n * @see /doc/api/internal#/operations/api_internal_reclamations_get_updates\n */\n public getUpdates(signal?: AbortSignal, disableNotifications: boolean = false): Promise<IReclamationsUpdates> {\n return this.get<IReclamationsUpdates>('/internal/reclamations/updates', {}, undefined, disableNotifications, signal);\n }\n}\n","import { IRecommendationsList } from '@common/recommendations/interfaces/i-recommendations-list';\nimport { CodedIdentity } from '@common/system/classes/coded-identity';\nimport { ICodedIdentity } from '@common/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 { RecommendationsList } from '@common/recommendations/classes/recommendations-list';\nimport { IRecommendationsList } from '@common/recommendations/interfaces/i-recommendations-list';\nimport { ICatalogableItem } from '@common/system/interfaces/i-catalogable-item';\nimport { HttpRequester } from '@snabcentr/common-core';\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","import { IReference, Reference } from '@snabcentr/common-core';\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 { IMetaTagItem } from '@common/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 { MetaTagItem } from '@common/seo/classes/meta-tag-item';\nimport { IMetaTagItem } from '@common/seo/interfaces/i-meta-tag-item';\nimport { ISeo } from '@common/seo/interfaces/i-seo';\nimport { IResourceType, ResourceType } from '@snabcentr/common-core';\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 { Seo } from '@common/seo/classes/seo';\nimport { ISeo } from '@common/seo/interfaces/i-seo';\nimport { HttpRequester, IFieldValidationResultData, IResourceType } from '@snabcentr/common-core';\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","import { ISearchProductStatistic } from '@common/statistics/interfaces/i-search-product-statistic';\nimport { DateHelper, Identity } from '@snabcentr/common-core';\n\n/**\n * Данные о поисковом запросе товаров клиентами.\n */\nexport class SearchProductStatistic extends Identity implements ISearchProductStatistic {\n /**\n * @inheritDoc\n */\n public text: string;\n\n /**\n * @inheritDoc\n */\n public searchCount: number;\n\n /**\n * @inheritDoc\n */\n public lastSearchedAt?: Date;\n\n /**\n * Инициализирует экземпляр класса {@link SearchProductStatistic}.\n *\n * @param data Данные для первоначальной инициализации.\n */\n public constructor(data?: Partial<ISearchProductStatistic>) {\n super(data);\n\n this.text = data?.text ?? '';\n this.searchCount = data?.searchCount ?? 0;\n this.lastSearchedAt = DateHelper.parse(data?.lastSearchedAt);\n }\n}\n","import { SearchProductStatistic } from '@common/statistics/classes/search-product-statistic';\nimport { ISearchProductStatistic } from '@common/statistics/interfaces/i-search-product-statistic';\nimport { DateHelper, HttpRequester, IDatePeriod } from '@snabcentr/common-core';\n\n/**\n * Предоставляет механизмы получения/управления статистикой.\n */\nexport class StatisticsProvider extends HttpRequester {\n /**\n * Возвращает список поисковых запросов товаров, последний поиск по которым был в указанном периоде.\n *\n * @param period Период даты последнего поиска.\n * @param signal Сигнал отмены запроса.\n *\n * @see /doc/api/internal#/operations/api_internal_statistics_search_products_get_list\n */\n public getSearchProductsStatistics(period: IDatePeriod, signal?: AbortSignal): Promise<ISearchProductStatistic[]> {\n return this.getTypedList(SearchProductStatistic, '/internal/statistics/search/products', { date: DateHelper.periodToApiFormat(period) }, false, signal);\n }\n\n /**\n * Удаляет поисковый запрос товаров из статистики.\n *\n * @param id Идентификатор поискового запроса.\n *\n * @see /doc/api/internal#/operations/api_internal_statistics_search_products_delete\n */\n public removeSearchProductStatistic(id: number): Promise<void> {\n return this.delete(`/internal/statistics/search/products/${id}`);\n }\n}\n","/* eslint-disable no-shadow */\n\n/**\n * Перечисление вариантов полноты адреса в подсказках.\n */\nexport enum AddressQualityEnum {\n /**\n * Не удалось определить.\n */\n Undetermined = 0,\n\n /**\n * Полный адрес.\n */\n Complete = 1,\n\n /**\n * Неполный адрес: уровень детализации в ФИАС ниже порогового.\n */\n Incomplete = 2,\n}\n","import { AddressQualityEnum } from '@common/suggestion/enums/address-quality-enum';\nimport { FieldValidationResultData, IFieldValidationResultData } from '@snabcentr/common-core';\n\n/**\n * Класс-помощник для работы с полнотой адреса из подсказок.\n */\nexport class AddressQualityHelper {\n /**\n * Возвращает признак, что адрес с указанной полнотой нельзя сохранять.\n *\n * @param quality Полнота адреса или `undefined`, если она неизвестна.\n * @param isIncompleteBlocked Признак, что сохранение неполного адреса запрещено.\n */\n public static isBlocked(quality: AddressQualityEnum | undefined, isIncompleteBlocked: boolean): boolean {\n return isIncompleteBlocked && quality === AddressQualityEnum.Incomplete;\n }\n\n /**\n * Возвращает результат проверки полноты адреса для отображения под полем ввода\n * или `undefined`, если адрес полный или полнота неизвестна.\n *\n * Неполный адрес при запрете сохранения отображается как ошибка, в остальных случаях как предупреждение.\n * Текст не утверждает, что адрес неполный: дом может существовать, но быть записан в ФИАС иначе,\n * поэтому пользователя только просят проверить адрес.\n *\n * @param quality Полнота адреса.\n * @param isIncompleteBlocked Признак, что сохранение неполного адреса запрещено.\n */\n public static getValidationResult(quality: AddressQualityEnum | undefined, isIncompleteBlocked: boolean): IFieldValidationResultData | undefined {\n if (AddressQualityHelper.isBlocked(quality, isIncompleteBlocked)) {\n return new FieldValidationResultData('Проверьте адрес и выберите более точный вариант из подсказок', 'error');\n }\n\n return quality === AddressQualityEnum.Incomplete || quality === AddressQualityEnum.Undetermined\n ? new FieldValidationResultData('Проверьте правильность адреса', 'warning')\n : undefined;\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 { IAddressSuggestion } from '@common/suggestion/interfaces/i-address-suggestion';\nimport { IBankSuggestion } from '@common/suggestion/interfaces/i-bank-suggestion';\nimport { IOrganizationSuggestion } from '@common/suggestion/interfaces/i-organization-suggestion';\nimport { HttpRequester, IIdentity } from '@snabcentr/common-core';\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","import { HttpRequester, useBaseConfigStore } from '@snabcentr/common-core';\n\n/**\n * Предоставляет механизмы аутентификации пользователей.\n */\nexport class UserAuthDataProvider extends HttpRequester {\n /**\n * Инициализирует экземпляр класса {@link UserAuthDataProvider}.\n */\n public constructor() {\n super();\n\n this.baseUrl = `${useBaseConfigStore().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 { UserShortInfo } from '@common/user/classes/user-short-info';\nimport { IUserShortInfo } from '@common/user/interfaces/i-user-short-info';\nimport { IUserRegionEmployee } from '@common/user-regions/interfaces/i-user-region-employee';\nimport { ISalesDirection, SalesDirection } from '@snabcentr/common-core';\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 { UserRegionEmployee } from '@common/user-regions/classes/user-region-employee';\nimport { IUserRegion } from '@common/user-regions/interfaces/i-user-region';\nimport { IUserRegionEmployee } from '@common/user-regions/interfaces/i-user-region-employee';\nimport { CityWithRegionAndCountry, ICityWithRegionAndCountry, UserRegionShortInfo } from '@snabcentr/common-core';\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 '@common/pagination/filters/pagination-filters-base';\nimport { IUserRegionsListFilters } from '@common/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 { UserRegion } from '@common/user-regions/classes/user-region';\nimport { UserRegionEmployee } from '@common/user-regions/classes/user-region-employee';\nimport { IUserRegion } from '@common/user-regions/interfaces/i-user-region';\nimport { IUserRegionEmployee } from '@common/user-regions/interfaces/i-user-region-employee';\nimport { IUserRegionSaveData } from '@common/user-regions/interfaces/i-user-region-save-data';\nimport {\n BasePaginationProvider,\n IFieldValidationResultData,\n IFilterGroup,\n IPaginatedResponse,\n IPaginationRequestParams,\n ISortRequestParams,\n IUserRegionShortInfo,\n UserRegionShortInfo,\n} from '@snabcentr/common-core';\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"],"mappings":"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"}