@snabcentr/client-core 3.21.0-profstroy → 3.21.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/catalog/dto/sc-product.d.ts +4 -7
- package/catalog/interfaces/sc-i-product.d.ts +4 -0
- package/config/sc-i-company-base-info.d.ts +9 -0
- package/config/sc-i-update-interval.d.ts +0 -12
- package/esm2022/catalog/classes/sc-catalog-item.mjs +2 -2
- package/esm2022/catalog/dto/sc-product.mjs +2 -13
- package/esm2022/catalog/interfaces/sc-i-product.mjs +1 -1
- package/esm2022/config/sc-i-company-base-info.mjs +1 -1
- package/esm2022/config/sc-i-update-interval.mjs +1 -1
- package/esm2022/helpers/index.mjs +1 -2
- package/esm2022/helpers/sc-units-helper.mjs +2 -3
- package/esm2022/order/classes/index.mjs +1 -3
- package/esm2022/order/classes/sc-order-draft-short.mjs +2 -7
- package/esm2022/order/classes/sc-order-draft.mjs +3 -15
- package/esm2022/order/classes/sc-order-item.mjs +1 -23
- package/esm2022/order/classes/sc-order-short.mjs +1 -3
- package/esm2022/order/enums/index.mjs +1 -2
- package/esm2022/order/internal/index.mjs +1 -6
- package/esm2022/order/internal/sc-i-order-draft-short.mjs +1 -1
- package/esm2022/order/internal/sc-i-order-draft.mjs +1 -1
- package/esm2022/order/internal/sc-i-order-short.mjs +1 -1
- package/esm2022/order/services/sc-order-drafts.service.mjs +11 -122
- package/esm2022/seo/classes/schema-org-factory.mjs +59 -30
- package/esm2022/user-metrika/enums/sc-user-metrika-goals-enum.mjs +1 -19
- package/fesm2022/snabcentr-client-core.mjs +111 -434
- package/fesm2022/snabcentr-client-core.mjs.map +1 -1
- package/helpers/index.d.ts +0 -1
- package/helpers/sc-units-helper.d.ts +1 -1
- package/order/classes/index.d.ts +0 -2
- package/order/classes/sc-order-draft-short.d.ts +2 -16
- package/order/classes/sc-order-draft.d.ts +2 -16
- package/order/classes/sc-order-item.d.ts +0 -12
- package/order/classes/sc-order-short.d.ts +0 -4
- package/order/enums/index.d.ts +0 -1
- package/order/internal/index.d.ts +0 -5
- package/order/internal/sc-i-order-draft-short.d.ts +0 -15
- package/order/internal/sc-i-order-draft.d.ts +1 -2
- package/order/internal/sc-i-order-short.d.ts +0 -4
- package/order/services/sc-order-drafts.service.d.ts +1 -63
- package/package.json +1 -1
- package/release_notes.tmp +1 -1
- package/seo/classes/schema-org-factory.d.ts +11 -0
- package/user-metrika/enums/sc-user-metrika-goals-enum.d.ts +0 -18
- package/esm2022/helpers/sc-date-helper.mjs +0 -23
- package/esm2022/order/classes/sc-order-draft-actualization.mjs +0 -46
- package/esm2022/order/classes/sc-profstroy-order-item.mjs +0 -88
- package/esm2022/order/enums/sc-order-draft-actualization-status.mjs +0 -24
- package/esm2022/order/internal/sc-i-new-profstroy-order-draft-request.mjs +0 -2
- package/esm2022/order/internal/sc-i-order-draft-actualization.mjs +0 -2
- package/esm2022/order/internal/sc-i-order-draft-file.mjs +0 -2
- package/esm2022/order/internal/sc-i-profstroy-order-item.mjs +0 -2
- package/esm2022/order/internal/sc-i-profstroy-product-stub.mjs +0 -2
- package/helpers/sc-date-helper.d.ts +0 -12
- package/order/classes/sc-order-draft-actualization.d.ts +0 -47
- package/order/classes/sc-profstroy-order-item.d.ts +0 -73
- package/order/enums/sc-order-draft-actualization-status.d.ts +0 -21
- package/order/internal/sc-i-new-profstroy-order-draft-request.d.ts +0 -14
- package/order/internal/sc-i-order-draft-actualization.d.ts +0 -22
- package/order/internal/sc-i-order-draft-file.d.ts +0 -13
- package/order/internal/sc-i-profstroy-order-item.d.ts +0 -28
- package/order/internal/sc-i-profstroy-product-stub.d.ts +0 -13
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as i1 from 'rxjs';
|
|
2
|
-
import { of, startWith as startWith$1, Subject, ReplaySubject, partition, combineLatest, map as map$1, debounceTime, switchMap, tap, filter, shareReplay, distinctUntilChanged, BehaviorSubject, materialize, dematerialize, merge, distinctUntilKeyChanged, skip, first, catchError as catchError$1, throwError, expand, takeWhile, toArray, EMPTY, take, defaultIfEmpty, concatMap, finalize, takeUntil, interval,
|
|
2
|
+
import { of, startWith as startWith$1, Subject, ReplaySubject, partition, combineLatest, map as map$1, debounceTime, switchMap, tap, filter, shareReplay, distinctUntilChanged, BehaviorSubject, materialize, dematerialize, merge, distinctUntilKeyChanged, skip, first, catchError as catchError$1, throwError, expand, takeWhile, toArray, EMPTY, take, defaultIfEmpty, concatMap, finalize, takeUntil, interval, share, scan, defer, from, lastValueFrom, timeout, TimeoutError } from 'rxjs';
|
|
3
3
|
import { map, startWith, catchError } from 'rxjs/operators';
|
|
4
|
-
import { parseISO,
|
|
4
|
+
import { parseISO, parse, isValid, format } from 'date-fns';
|
|
5
5
|
import { isString, isNil, isMatch, isArray, omit, get } from 'lodash-es';
|
|
6
6
|
import * as i0 from '@angular/core';
|
|
7
7
|
import { InjectionToken, inject, PLATFORM_ID, Injectable, Inject, Optional, EventEmitter, DestroyRef, LOCALE_ID, Pipe, assertInInjectionContext, RendererFactory2, makeEnvironmentProviders } from '@angular/core';
|
|
@@ -767,24 +767,6 @@ var ScUserMetrikaGoalsEnum;
|
|
|
767
767
|
* В качестве параметра должен быть указан идентификатор КП/черновика (параметр "offer_id").
|
|
768
768
|
*/
|
|
769
769
|
ScUserMetrikaGoalsEnum["orderDraftDeleted"] = "ORDER_DRAFT_DELETED";
|
|
770
|
-
/**
|
|
771
|
-
* Черновик заказа создан из файла программы «Профстрой».
|
|
772
|
-
*
|
|
773
|
-
* В качестве параметра должен быть указан идентификатор черновика (параметр "offer_id").
|
|
774
|
-
*/
|
|
775
|
-
ScUserMetrikaGoalsEnum["orderDraftProfstroyCreated"] = "ORDER_DRAFT_PROFSTROY_CREATED";
|
|
776
|
-
/**
|
|
777
|
-
* Запущена актуализация черновика Профстрой.
|
|
778
|
-
*
|
|
779
|
-
* В качестве параметра должен быть указан идентификатор черновика (параметр "offer_id").
|
|
780
|
-
*/
|
|
781
|
-
ScUserMetrikaGoalsEnum["orderDraftProfstroyActualized"] = "ORDER_DRAFT_PROFSTROY_ACTUALIZED";
|
|
782
|
-
/**
|
|
783
|
-
* Запущена пересборка черновика Профстрой из файла.
|
|
784
|
-
*
|
|
785
|
-
* В качестве параметра должен быть указан идентификатор черновика (параметр "offer_id").
|
|
786
|
-
*/
|
|
787
|
-
ScUserMetrikaGoalsEnum["orderDraftProfstroyReloaded"] = "ORDER_DRAFT_PROFSTROY_RELOADED";
|
|
788
770
|
/**
|
|
789
771
|
* Открыто диалоговое окно/страница конфигуратора товара.
|
|
790
772
|
*
|
|
@@ -1545,7 +1527,7 @@ class ScCatalogItem extends ScCatalogableItem {
|
|
|
1545
1527
|
super(data);
|
|
1546
1528
|
this.properties = data?.properties;
|
|
1547
1529
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any,@typescript-eslint/no-unsafe-assignment,no-underscore-dangle,@typescript-eslint/no-unsafe-member-access
|
|
1548
|
-
this.seo = data
|
|
1530
|
+
this.seo = data._Seo ?? data?.seo;
|
|
1549
1531
|
this.image = data?.image;
|
|
1550
1532
|
}
|
|
1551
1533
|
}
|
|
@@ -1733,18 +1715,6 @@ class ScCategory extends ScCatalogItem {
|
|
|
1733
1715
|
* Модель данных товара/услуги.
|
|
1734
1716
|
*/
|
|
1735
1717
|
class ScProduct extends ScCatalogItem {
|
|
1736
|
-
/**
|
|
1737
|
-
* Возвращает товар, не найденный в каталоге, с известными названием и артикулом поставщика.
|
|
1738
|
-
*
|
|
1739
|
-
* @param name Название товара.
|
|
1740
|
-
* @param supplierSku Артикул поставщика.
|
|
1741
|
-
*/
|
|
1742
|
-
static createNotFound(name, supplierSku) {
|
|
1743
|
-
const product = new ScProduct(null);
|
|
1744
|
-
product.name = name ?? product.name;
|
|
1745
|
-
product.supplierSku = supplierSku;
|
|
1746
|
-
return product;
|
|
1747
|
-
}
|
|
1748
1718
|
/**
|
|
1749
1719
|
* Инициализирует экземпляр класса {@link ScProduct}.
|
|
1750
1720
|
*
|
|
@@ -1778,6 +1748,7 @@ class ScProduct extends ScCatalogItem {
|
|
|
1778
1748
|
else {
|
|
1779
1749
|
this.image = data.images?.find((img) => img.isDefault)?.image ?? data.properties?.image;
|
|
1780
1750
|
this.supplierSku = data.supplierSku;
|
|
1751
|
+
this.brand = data.brand;
|
|
1781
1752
|
this.cost = data.cost;
|
|
1782
1753
|
this.costRub = data.costRub;
|
|
1783
1754
|
this.costDate = data.costDate;
|
|
@@ -1897,44 +1868,6 @@ class ScProduct extends ScCatalogItem {
|
|
|
1897
1868
|
}
|
|
1898
1869
|
}
|
|
1899
1870
|
|
|
1900
|
-
/**
|
|
1901
|
-
* Класс-помощник для работы со значениями единиц измерения товара.
|
|
1902
|
-
*/
|
|
1903
|
-
class ScUnitsHelper {
|
|
1904
|
-
/**
|
|
1905
|
-
* Возвращает признак, что указанный товар имеет линейную единицу измерения.
|
|
1906
|
-
*
|
|
1907
|
-
* @param product Данные о товаре для которого нужно проверить линейность его единицы измерения.
|
|
1908
|
-
*/
|
|
1909
|
-
static productIsMeasurable(product) {
|
|
1910
|
-
// У товара, не найденного в каталоге, единицы измерения нет.
|
|
1911
|
-
return !product.isNull && (product.unit.isLinear || product.unit.isSquare);
|
|
1912
|
-
}
|
|
1913
|
-
/**
|
|
1914
|
-
* Возвращает кратность количества для указанного товара.
|
|
1915
|
-
*
|
|
1916
|
-
* Кратность равна {@link ScProduct.minCount} и не зависит от {@link ScIProperties.ignoreMinCountCheck}:
|
|
1917
|
-
* этот признак только снимает валидацию кратности/минимума при ручном вводе, но начальное количество
|
|
1918
|
-
* и шаг кнопок +/- остаются кратны minCount.
|
|
1919
|
-
*
|
|
1920
|
-
* @param product Данные о товаре для которого необходимо вернуть кратность количества.
|
|
1921
|
-
*/
|
|
1922
|
-
static getProductMultiplicity(product) {
|
|
1923
|
-
return product.minCount && !ScUnitsHelper.productIsMeasurable(product) ? product.minCount : 1;
|
|
1924
|
-
}
|
|
1925
|
-
/**
|
|
1926
|
-
* Возвращает кратность длины для указанного товара.
|
|
1927
|
-
*
|
|
1928
|
-
* @param product Данные о товаре для которого необходимо вернуть кратность длины.
|
|
1929
|
-
*/
|
|
1930
|
-
static getProductLengthMultiplicity(product) {
|
|
1931
|
-
if (product.properties?.lengthStep) {
|
|
1932
|
-
return product.properties.lengthStep;
|
|
1933
|
-
}
|
|
1934
|
-
return !product.properties?.ignoreMinCountCheck && product.minCount ? product.minCount : 0.01;
|
|
1935
|
-
}
|
|
1936
|
-
}
|
|
1937
|
-
|
|
1938
1871
|
/**
|
|
1939
1872
|
* Данные о единичной позиции товара/услуги в заказе (корзине / черновике).
|
|
1940
1873
|
*/
|
|
@@ -1962,27 +1895,6 @@ class ScOrderItem {
|
|
|
1962
1895
|
this.configurator = data.configurator;
|
|
1963
1896
|
this.configuratorParams = data.configuratorParams;
|
|
1964
1897
|
}
|
|
1965
|
-
/**
|
|
1966
|
-
* Признак, что позиция может попасть в заказ: товар есть в каталоге и предоставляется.
|
|
1967
|
-
*/
|
|
1968
|
-
get isOrderable() {
|
|
1969
|
-
return !this.product.isNull && !this.product.isHidden;
|
|
1970
|
-
}
|
|
1971
|
-
/**
|
|
1972
|
-
* Шаг изменения количества позиции.
|
|
1973
|
-
*/
|
|
1974
|
-
get quantityStep() {
|
|
1975
|
-
return ScUnitsHelper.getProductMultiplicity(this.product);
|
|
1976
|
-
}
|
|
1977
|
-
/**
|
|
1978
|
-
* Возвращает причину, по которой позиция не может попасть в заказ, или пустую строку.
|
|
1979
|
-
*/
|
|
1980
|
-
getUnavailableReason() {
|
|
1981
|
-
if (this.product.isNull) {
|
|
1982
|
-
return 'Товар не найден в каталоге';
|
|
1983
|
-
}
|
|
1984
|
-
return this.product.isHidden ? 'Товар больше не предоставляется' : '';
|
|
1985
|
-
}
|
|
1986
1898
|
/**
|
|
1987
1899
|
* @inheritDoc
|
|
1988
1900
|
*/
|
|
@@ -4715,6 +4627,43 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
4715
4627
|
}]
|
|
4716
4628
|
}] });
|
|
4717
4629
|
|
|
4630
|
+
/**
|
|
4631
|
+
* Класс-помощник для работы со значениями единиц измерения товара.
|
|
4632
|
+
*/
|
|
4633
|
+
class ScUnitsHelper {
|
|
4634
|
+
/**
|
|
4635
|
+
* Возвращает признак, что указанный товар имеет линейную единицу измерения.
|
|
4636
|
+
*
|
|
4637
|
+
* @param product Данные о товаре для которого нужно проверить линейность его единицы измерения.
|
|
4638
|
+
*/
|
|
4639
|
+
static productIsMeasurable(product) {
|
|
4640
|
+
return product.unit.isLinear || product.unit.isSquare;
|
|
4641
|
+
}
|
|
4642
|
+
/**
|
|
4643
|
+
* Возвращает кратность количества для указанного товара.
|
|
4644
|
+
*
|
|
4645
|
+
* Кратность равна {@link ScProduct.minCount} и не зависит от {@link ScIProperties.ignoreMinCountCheck}:
|
|
4646
|
+
* этот признак только снимает валидацию кратности/минимума при ручном вводе, но начальное количество
|
|
4647
|
+
* и шаг кнопок +/- остаются кратны minCount.
|
|
4648
|
+
*
|
|
4649
|
+
* @param product Данные о товаре для которого необходимо вернуть кратность количества.
|
|
4650
|
+
*/
|
|
4651
|
+
static getProductMultiplicity(product) {
|
|
4652
|
+
return product.minCount && !ScUnitsHelper.productIsMeasurable(product) ? product.minCount : 1;
|
|
4653
|
+
}
|
|
4654
|
+
/**
|
|
4655
|
+
* Возвращает кратность длины для указанного товара.
|
|
4656
|
+
*
|
|
4657
|
+
* @param product Данные о товаре для которого необходимо вернуть кратность длины.
|
|
4658
|
+
*/
|
|
4659
|
+
static getProductLengthMultiplicity(product) {
|
|
4660
|
+
if (product.properties?.lengthStep) {
|
|
4661
|
+
return product.properties.lengthStep;
|
|
4662
|
+
}
|
|
4663
|
+
return !product.properties?.ignoreMinCountCheck && product.minCount ? product.minCount : 0.01;
|
|
4664
|
+
}
|
|
4665
|
+
}
|
|
4666
|
+
|
|
4718
4667
|
/**
|
|
4719
4668
|
* Возвращает текущий маршрут.
|
|
4720
4669
|
* Функция проходит по дереву маршрутов начиная с переданного route и возвращает самый вложенный активный маршрут.
|
|
@@ -4729,28 +4678,6 @@ const scGetCurrentRoute = (route) => {
|
|
|
4729
4678
|
return currentRoute;
|
|
4730
4679
|
};
|
|
4731
4680
|
|
|
4732
|
-
/**
|
|
4733
|
-
* Класс-помощник для работы с датами.
|
|
4734
|
-
*/
|
|
4735
|
-
class ScDateHelper {
|
|
4736
|
-
/**
|
|
4737
|
-
* Возвращает дату, полученную из строки в указанном формате, или `undefined`, если значение отсутствует или не является датой.
|
|
4738
|
-
*
|
|
4739
|
-
* @param value Дата строкой или готовый объект даты.
|
|
4740
|
-
* @param format Формат даты строкой (например, {@link ScIDateFormat.api}).
|
|
4741
|
-
*/
|
|
4742
|
-
static parse(value, format) {
|
|
4743
|
-
if (value instanceof Date) {
|
|
4744
|
-
return isValid(value) ? value : undefined;
|
|
4745
|
-
}
|
|
4746
|
-
if (!value) {
|
|
4747
|
-
return undefined;
|
|
4748
|
-
}
|
|
4749
|
-
const date = parse(value, format, new Date());
|
|
4750
|
-
return isValid(date) ? date : undefined;
|
|
4751
|
-
}
|
|
4752
|
-
}
|
|
4753
|
-
|
|
4754
4681
|
/**
|
|
4755
4682
|
* Токен состояния запроса данных о категории (загрузка / успех / ошибка).
|
|
4756
4683
|
*/
|
|
@@ -6883,160 +6810,6 @@ class ScOrderBase {
|
|
|
6883
6810
|
}
|
|
6884
6811
|
}
|
|
6885
6812
|
|
|
6886
|
-
/**
|
|
6887
|
-
* Перечисление статусов актуализации черновика Профстрой.
|
|
6888
|
-
*/
|
|
6889
|
-
// eslint-disable-next-line no-shadow
|
|
6890
|
-
var ScOrderDraftActualizationStatus;
|
|
6891
|
-
(function (ScOrderDraftActualizationStatus) {
|
|
6892
|
-
/**
|
|
6893
|
-
* Выполняется обработка файла или обмен с 1С.
|
|
6894
|
-
*/
|
|
6895
|
-
ScOrderDraftActualizationStatus["processing"] = "processing";
|
|
6896
|
-
/**
|
|
6897
|
-
* Последний обмен с 1С завершён успешно.
|
|
6898
|
-
*/
|
|
6899
|
-
ScOrderDraftActualizationStatus["completed"] = "completed";
|
|
6900
|
-
/**
|
|
6901
|
-
* Обработка завершилась с ошибкой.
|
|
6902
|
-
*/
|
|
6903
|
-
ScOrderDraftActualizationStatus["error"] = "error";
|
|
6904
|
-
/**
|
|
6905
|
-
* Состав черновика изменён после последней успешной актуализации.
|
|
6906
|
-
*/
|
|
6907
|
-
ScOrderDraftActualizationStatus["needsActualization"] = "needs_actualization";
|
|
6908
|
-
})(ScOrderDraftActualizationStatus || (ScOrderDraftActualizationStatus = {}));
|
|
6909
|
-
|
|
6910
|
-
/**
|
|
6911
|
-
* Данные об актуализации черновика Профстрой.
|
|
6912
|
-
*/
|
|
6913
|
-
class ScOrderDraftActualization {
|
|
6914
|
-
/**
|
|
6915
|
-
* Инициализирует экземпляр класса {@link ScOrderDraftActualization}.
|
|
6916
|
-
*
|
|
6917
|
-
* @param data Данные от API или готовый экземпляр актуализации.
|
|
6918
|
-
* @param apiDateFormat Формат дат в данных API.
|
|
6919
|
-
*/
|
|
6920
|
-
constructor(data, apiDateFormat) {
|
|
6921
|
-
this.status = data?.status ?? ScOrderDraftActualizationStatus.processing;
|
|
6922
|
-
this.actualizedAt = ScDateHelper.parse(data?.actualizedAt, apiDateFormat);
|
|
6923
|
-
this.expiresAt = ScDateHelper.parse(data?.expiresAt, apiDateFormat);
|
|
6924
|
-
this.error = data?.error ?? undefined;
|
|
6925
|
-
}
|
|
6926
|
-
/**
|
|
6927
|
-
* Признак, что выполняется обработка.
|
|
6928
|
-
*/
|
|
6929
|
-
get isProcessing() {
|
|
6930
|
-
return this.status === ScOrderDraftActualizationStatus.processing;
|
|
6931
|
-
}
|
|
6932
|
-
/**
|
|
6933
|
-
* Возвращает признак, что данные актуализации устарели на указанный момент: актуализация не завершена успешно или истёк срок её действия.
|
|
6934
|
-
* Момент, равный сроку действия, ещё допустим. Если срок не известен, данные считаются актуальными.
|
|
6935
|
-
*
|
|
6936
|
-
* @param now Момент проверки.
|
|
6937
|
-
*/
|
|
6938
|
-
isOutdatedAt(now) {
|
|
6939
|
-
if (this.status !== ScOrderDraftActualizationStatus.completed || !this.actualizedAt) {
|
|
6940
|
-
return true;
|
|
6941
|
-
}
|
|
6942
|
-
return this.expiresAt !== undefined && this.expiresAt.getTime() < now.getTime();
|
|
6943
|
-
}
|
|
6944
|
-
/**
|
|
6945
|
-
* Возвращает признак, что на указанный момент из черновика можно оформить заказ.
|
|
6946
|
-
*
|
|
6947
|
-
* @param now Момент проверки.
|
|
6948
|
-
*/
|
|
6949
|
-
isOrderAllowedAt(now) {
|
|
6950
|
-
return this.status === ScOrderDraftActualizationStatus.completed && !this.isOutdatedAt(now);
|
|
6951
|
-
}
|
|
6952
|
-
}
|
|
6953
|
-
|
|
6954
|
-
/**
|
|
6955
|
-
* Данные о позиции черновика Профстрой.
|
|
6956
|
-
*/
|
|
6957
|
-
class ScProfstroyOrderItem extends ScOrderItem {
|
|
6958
|
-
/**
|
|
6959
|
-
* Название группы для позиций без группы.
|
|
6960
|
-
*/
|
|
6961
|
-
static { this.ungroupedName = 'Без группы'; }
|
|
6962
|
-
/**
|
|
6963
|
-
* Шаг количества позиции, для которой не найден товар каталога и кратность не известна.
|
|
6964
|
-
*/
|
|
6965
|
-
static { this.stubQuantityStep = 0.001; }
|
|
6966
|
-
/**
|
|
6967
|
-
* Тексты ошибок строк по их кодам.
|
|
6968
|
-
*/
|
|
6969
|
-
static { this.lineErrorTexts = {
|
|
6970
|
-
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
6971
|
-
not_returned_by_1c: 'Продукт недоступен для заказа',
|
|
6972
|
-
}; }
|
|
6973
|
-
/**
|
|
6974
|
-
* Возвращает признак, что вместо товара каталога пришла заглушка.
|
|
6975
|
-
*
|
|
6976
|
-
* @param product Данные о товаре.
|
|
6977
|
-
*/
|
|
6978
|
-
static isStub(product) {
|
|
6979
|
-
return !product || (product instanceof ScProduct && product.isNull) || !('id' in product);
|
|
6980
|
-
}
|
|
6981
|
-
/**
|
|
6982
|
-
* Возвращает название группы позиции для отображения. Позиции обычного черновика относятся к группе «Без группы».
|
|
6983
|
-
*
|
|
6984
|
-
* @param item Позиция черновика.
|
|
6985
|
-
*/
|
|
6986
|
-
static getGroupTitle(item) {
|
|
6987
|
-
return item instanceof ScProfstroyOrderItem ? item.groupTitle : ScProfstroyOrderItem.ungroupedName;
|
|
6988
|
-
}
|
|
6989
|
-
/**
|
|
6990
|
-
* Инициализирует экземпляр класса {@link ScProfstroyOrderItem}.
|
|
6991
|
-
*
|
|
6992
|
-
* @param data Данные от API или готовый экземпляр позиции.
|
|
6993
|
-
*/
|
|
6994
|
-
constructor(data) {
|
|
6995
|
-
const isProductStub = ScProfstroyOrderItem.isStub(data.product);
|
|
6996
|
-
// Базовому классу нужны только собственные поля позиции, прототип не используется.
|
|
6997
|
-
// eslint-disable-next-line @typescript-eslint/no-misused-spread
|
|
6998
|
-
super({ ...data, product: isProductStub ? null : data.product });
|
|
6999
|
-
this.isProductStub = isProductStub;
|
|
7000
|
-
this.groupName = data.groupName ?? undefined;
|
|
7001
|
-
this.isIgnored = data.isIgnored ?? false;
|
|
7002
|
-
this.lineError = data.lineError ?? undefined;
|
|
7003
|
-
this.supplierSku = data.supplierSku ?? data.product?.supplierSku ?? undefined;
|
|
7004
|
-
if (isProductStub) {
|
|
7005
|
-
this.product = ScProduct.createNotFound(data.product?.name, this.supplierSku);
|
|
7006
|
-
}
|
|
7007
|
-
}
|
|
7008
|
-
/**
|
|
7009
|
-
* Название группы для отображения: группа из файла или «Без группы».
|
|
7010
|
-
*/
|
|
7011
|
-
get groupTitle() {
|
|
7012
|
-
return this.groupName?.trim() ? this.groupName.trim() : ScProfstroyOrderItem.ungroupedName;
|
|
7013
|
-
}
|
|
7014
|
-
/**
|
|
7015
|
-
* @inheritDoc
|
|
7016
|
-
*/
|
|
7017
|
-
get isOrderable() {
|
|
7018
|
-
return !this.isProductStub && !this.isIgnored && !this.lineError && super.isOrderable;
|
|
7019
|
-
}
|
|
7020
|
-
/**
|
|
7021
|
-
* @inheritDoc
|
|
7022
|
-
*/
|
|
7023
|
-
get quantityStep() {
|
|
7024
|
-
return this.isProductStub ? ScProfstroyOrderItem.stubQuantityStep : super.quantityStep;
|
|
7025
|
-
}
|
|
7026
|
-
/**
|
|
7027
|
-
* @inheritDoc
|
|
7028
|
-
*/
|
|
7029
|
-
getUnavailableReason() {
|
|
7030
|
-
if (this.isIgnored) {
|
|
7031
|
-
return 'Группа не участвует в заказе';
|
|
7032
|
-
}
|
|
7033
|
-
if (this.lineError) {
|
|
7034
|
-
return ScProfstroyOrderItem.lineErrorTexts[this.lineError] ?? this.lineError;
|
|
7035
|
-
}
|
|
7036
|
-
return super.getUnavailableReason();
|
|
7037
|
-
}
|
|
7038
|
-
}
|
|
7039
|
-
|
|
7040
6813
|
/**
|
|
7041
6814
|
* Данные о коммерческом предложении/черновике заказа.
|
|
7042
6815
|
*/
|
|
@@ -7045,9 +6818,8 @@ class ScOrderDraft {
|
|
|
7045
6818
|
* Инициализирует экземпляр класса {@link ScOrderDraft}.
|
|
7046
6819
|
*
|
|
7047
6820
|
* @param data Данные для первоначальной инициализации.
|
|
7048
|
-
* @param apiDateFormat Формат дат в данных API.
|
|
7049
6821
|
*/
|
|
7050
|
-
constructor(data
|
|
6822
|
+
constructor(data) {
|
|
7051
6823
|
/**
|
|
7052
6824
|
* Дата последнего обновления данных.
|
|
7053
6825
|
*/
|
|
@@ -7057,10 +6829,7 @@ class ScOrderDraft {
|
|
|
7057
6829
|
this.type = data.type;
|
|
7058
6830
|
this.createdAt = data.createdAt;
|
|
7059
6831
|
this.sum = data.sum;
|
|
7060
|
-
this.
|
|
7061
|
-
this.actualization = this.isProfstroy ? new ScOrderDraftActualization(data.actualization, apiDateFormat) : undefined;
|
|
7062
|
-
this.file = data.file ?? undefined;
|
|
7063
|
-
this.products = data.products.map((item) => (this.isProfstroy ? new ScProfstroyOrderItem(item) : new ScOrderItem(item)));
|
|
6832
|
+
this.products = data.products.map((item) => new ScOrderItem(item));
|
|
7064
6833
|
}
|
|
7065
6834
|
/**
|
|
7066
6835
|
* @inheritDoc
|
|
@@ -7088,9 +6857,6 @@ class ScOrderDraft {
|
|
|
7088
6857
|
this.type = offer.type;
|
|
7089
6858
|
this.sum = offer.sum;
|
|
7090
6859
|
this.products = offer.products;
|
|
7091
|
-
this.isProfstroy = offer.isProfstroy;
|
|
7092
|
-
this.actualization = offer.actualization;
|
|
7093
|
-
this.file = offer.file;
|
|
7094
6860
|
this.lastUpdateDate = new Date();
|
|
7095
6861
|
}
|
|
7096
6862
|
/**
|
|
@@ -7099,9 +6865,6 @@ class ScOrderDraft {
|
|
|
7099
6865
|
updateDataFromShortOffer(offer) {
|
|
7100
6866
|
this.name = offer.name;
|
|
7101
6867
|
this.type = offer.type;
|
|
7102
|
-
this.isProfstroy = offer.isProfstroy;
|
|
7103
|
-
this.actualization = offer.actualization;
|
|
7104
|
-
this.file = offer.file;
|
|
7105
6868
|
}
|
|
7106
6869
|
}
|
|
7107
6870
|
|
|
@@ -7113,15 +6876,11 @@ class ScOrderDraftShort extends ScOrderBase {
|
|
|
7113
6876
|
* Инициализирует экземпляр класса {@link ScOrderDraftShort}.
|
|
7114
6877
|
*
|
|
7115
6878
|
* @param data Данные для первоначальной инициализации.
|
|
7116
|
-
* @param apiDateFormat Формат дат в данных API.
|
|
7117
6879
|
*/
|
|
7118
|
-
constructor(data
|
|
6880
|
+
constructor(data) {
|
|
7119
6881
|
super(data);
|
|
7120
6882
|
this.name = data.name;
|
|
7121
6883
|
this.type = data.type;
|
|
7122
|
-
this.isProfstroy = data.isProfstroy === true;
|
|
7123
|
-
this.actualization = this.isProfstroy ? new ScOrderDraftActualization(data.actualization, apiDateFormat) : undefined;
|
|
7124
|
-
this.file = data.file ?? undefined;
|
|
7125
6884
|
}
|
|
7126
6885
|
}
|
|
7127
6886
|
|
|
@@ -7142,7 +6901,6 @@ class ScOrderShort extends ScOrderBase {
|
|
|
7142
6901
|
this.payment = data.payment;
|
|
7143
6902
|
this.numberDoc = data.numberDoc;
|
|
7144
6903
|
this.barcode = data.barcode;
|
|
7145
|
-
this.isProfstroy = data.isProfstroy === true;
|
|
7146
6904
|
}
|
|
7147
6905
|
/**
|
|
7148
6906
|
* @inheritDoc
|
|
@@ -7153,7 +6911,6 @@ class ScOrderShort extends ScOrderBase {
|
|
|
7153
6911
|
this.payment = order.payment;
|
|
7154
6912
|
this.sum = order.sum;
|
|
7155
6913
|
this.delivery = order.delivery;
|
|
7156
|
-
this.isProfstroy = order.isProfstroy;
|
|
7157
6914
|
}
|
|
7158
6915
|
}
|
|
7159
6916
|
|
|
@@ -7351,18 +7108,6 @@ class ScOrderDraftsService {
|
|
|
7351
7108
|
* Сервис для сбора метрик о действиях пользователей.
|
|
7352
7109
|
*/
|
|
7353
7110
|
this.userMetrikaService = inject(ScUserMetrikaService);
|
|
7354
|
-
/**
|
|
7355
|
-
* Форматы дат.
|
|
7356
|
-
*/
|
|
7357
|
-
this.dateFormats = inject(SC_DATE_FORMAT);
|
|
7358
|
-
/**
|
|
7359
|
-
* Сервис конвертации данных.
|
|
7360
|
-
*/
|
|
7361
|
-
this.convertersService = inject(ScConvertersService);
|
|
7362
|
-
/**
|
|
7363
|
-
* Объект документа.
|
|
7364
|
-
*/
|
|
7365
|
-
this.document = inject(DOCUMENT);
|
|
7366
7111
|
/**
|
|
7367
7112
|
* Коллекция пар ключ-значение для кэшированных коммерческих предложений/черновиков пользователя.
|
|
7368
7113
|
*/
|
|
@@ -7378,85 +7123,17 @@ class ScOrderDraftsService {
|
|
|
7378
7123
|
*/
|
|
7379
7124
|
getList$(params) {
|
|
7380
7125
|
return this.http.get(`${this.urls.apiUrl}/orders/offers`, { params: params }).pipe(map$1((offersPaginateDTO) => {
|
|
7381
|
-
offersPaginateDTO.data = offersPaginateDTO.data.map((item) => new ScOrderDraftShort(item
|
|
7126
|
+
offersPaginateDTO.data = offersPaginateDTO.data.map((item) => new ScOrderDraftShort(item));
|
|
7382
7127
|
return offersPaginateDTO;
|
|
7383
7128
|
}));
|
|
7384
7129
|
}
|
|
7385
|
-
/**
|
|
7386
|
-
* Возвращает краткие данные черновиков с указанными номерами. Используется для лёгкого опроса состояния актуализации без загрузки позиций.
|
|
7387
|
-
*
|
|
7388
|
-
* @param ids Номера черновиков.
|
|
7389
|
-
*/
|
|
7390
|
-
getShortList$(ids) {
|
|
7391
|
-
const params = { perPage: ids.length, filters: { number: { in: ids } } };
|
|
7392
|
-
return this.getList$(this.convertersService.toHttpParams(params, { nonNullable: true })).pipe(map$1((response) => response.data));
|
|
7393
|
-
}
|
|
7394
|
-
/**
|
|
7395
|
-
* Периодически запрашивает краткие данные черновиков с указанными номерами, пока есть подписка.
|
|
7396
|
-
* Пока вкладка браузера скрыта, запросы не выполняются; новый запрос не начинается до завершения предыдущего.
|
|
7397
|
-
*
|
|
7398
|
-
* @param ids Номера черновиков.
|
|
7399
|
-
*/
|
|
7400
|
-
watchShortList$(ids) {
|
|
7401
|
-
return this.poll$(this.updateInterval.orderDraftStatus, () => this.getShortList$(ids));
|
|
7402
|
-
}
|
|
7403
|
-
/**
|
|
7404
|
-
* Периодически перезапрашивает страницу списка черновиков в фоне, пока есть подписка. Условия запросов как у {@link watchShortList$}.
|
|
7405
|
-
*
|
|
7406
|
-
* @param params Параметры запроса получения списка.
|
|
7407
|
-
*/
|
|
7408
|
-
watchList$(params) {
|
|
7409
|
-
return this.poll$(this.updateInterval.orderDraftsList, () => this.getList$(params).pipe(map$1((response) => response.data)));
|
|
7410
|
-
}
|
|
7411
|
-
/**
|
|
7412
|
-
* Создаёт черновик заказа из файла программы «Профстрой» и запускает его обработку.
|
|
7413
|
-
*
|
|
7414
|
-
* @param data Данные для создания.
|
|
7415
|
-
*/
|
|
7416
|
-
createProfstroy$(data) {
|
|
7417
|
-
return this.http.post(`${this.urls.apiUrl}/orders/offers/profstroy`, data).pipe(map$1((offerDTO) => new ScOrderDraft(offerDTO, this.dateFormats.api)), tap((offer) => {
|
|
7418
|
-
this.userMetrikaService.emitUserMetrikaEvent({
|
|
7419
|
-
target: ScUserMetrikaGoalsEnum.orderDraftProfstroyCreated,
|
|
7420
|
-
params: { offer_id: offer.id },
|
|
7421
|
-
});
|
|
7422
|
-
this.offerMap.set(offer.id, new ScCachedItem(this.updateInterval.orderData, of(offer), loadingPlaceholder));
|
|
7423
|
-
}));
|
|
7424
|
-
}
|
|
7425
|
-
/**
|
|
7426
|
-
* Запускает актуализацию черновика Профстрой (повторный обмен с 1С по текущему составу).
|
|
7427
|
-
*
|
|
7428
|
-
* @param offerId Идентификатор черновика.
|
|
7429
|
-
*/
|
|
7430
|
-
actualizeProfstroy$(offerId) {
|
|
7431
|
-
return this.http.post(`${this.urls.apiUrl}/orders/offers/${offerId}/profstroy/actualize`, {}).pipe(map$1((offerDTO) => new ScOrderDraft(offerDTO, this.dateFormats.api)), tap((offer) => {
|
|
7432
|
-
this.userMetrikaService.emitUserMetrikaEvent({
|
|
7433
|
-
target: ScUserMetrikaGoalsEnum.orderDraftProfstroyActualized,
|
|
7434
|
-
params: { offer_id: offerId },
|
|
7435
|
-
});
|
|
7436
|
-
this.offerMap.get(offerId)?.setValue(offer);
|
|
7437
|
-
}));
|
|
7438
|
-
}
|
|
7439
|
-
/**
|
|
7440
|
-
* Запускает пересборку черновика Профстрой из ранее загруженного файла.
|
|
7441
|
-
*
|
|
7442
|
-
* @param offerId Идентификатор черновика.
|
|
7443
|
-
*/
|
|
7444
|
-
reloadProfstroy$(offerId) {
|
|
7445
|
-
return this.http.post(`${this.urls.apiUrl}/orders/offers/${offerId}/profstroy/reload`, {}).pipe(map$1((offerDTO) => new ScOrderDraft(offerDTO, this.dateFormats.api)), tap((offer) => {
|
|
7446
|
-
this.userMetrikaService.emitUserMetrikaEvent({
|
|
7447
|
-
target: ScUserMetrikaGoalsEnum.orderDraftProfstroyReloaded,
|
|
7448
|
-
params: { offer_id: offerId },
|
|
7449
|
-
});
|
|
7450
|
-
this.offerMap.get(offerId)?.setValue(offer);
|
|
7451
|
-
}));
|
|
7452
|
-
}
|
|
7453
7130
|
/**
|
|
7454
7131
|
* Создаёт новое коммерческое предложение/черновик заказа.
|
|
7455
7132
|
*
|
|
7456
7133
|
* @param data Данные для создания.
|
|
7457
7134
|
*/
|
|
7458
7135
|
create$(data) {
|
|
7459
|
-
return this.http.post(`${this.urls.apiUrl}/orders/offers`, data).pipe(map$1((offerDTO) => new ScOrderDraft(offerDTO
|
|
7136
|
+
return this.http.post(`${this.urls.apiUrl}/orders/offers`, data).pipe(map$1((offerDTO) => new ScOrderDraft(offerDTO)), tap((offer) => {
|
|
7460
7137
|
this.userMetrikaService.emitUserMetrikaEvent({
|
|
7461
7138
|
target: ScUserMetrikaGoalsEnum.orderDraftCreated,
|
|
7462
7139
|
params: { offer_id: offer.id },
|
|
@@ -7474,7 +7151,7 @@ class ScOrderDraftsService {
|
|
|
7474
7151
|
get$(draftId, cacheable = true) {
|
|
7475
7152
|
let cachedItem = this.offerMap.get(draftId);
|
|
7476
7153
|
if (!cachedItem) {
|
|
7477
|
-
cachedItem = new ScCachedItem(this.updateInterval.orderData, this.http.get(`${this.urls.apiUrl}/orders/offers/${draftId}`).pipe(map$1((data) => new ScOrderDraft(data
|
|
7154
|
+
cachedItem = new ScCachedItem(this.updateInterval.orderData, this.http.get(`${this.urls.apiUrl}/orders/offers/${draftId}`).pipe(map$1((data) => new ScOrderDraft(data))), loadingPlaceholder);
|
|
7478
7155
|
if (cacheable) {
|
|
7479
7156
|
this.offerMap.set(draftId, cachedItem);
|
|
7480
7157
|
}
|
|
@@ -7484,22 +7161,6 @@ class ScOrderDraftsService {
|
|
|
7484
7161
|
}
|
|
7485
7162
|
return cachedItem.item$;
|
|
7486
7163
|
}
|
|
7487
|
-
/**
|
|
7488
|
-
* Запрашивает полную информацию о черновике в обход кэша и обновляет кэш полученными данными.
|
|
7489
|
-
*
|
|
7490
|
-
* @param draftId Идентификатор записи.
|
|
7491
|
-
*/
|
|
7492
|
-
fetch$(draftId) {
|
|
7493
|
-
return this.http.get(`${this.urls.apiUrl}/orders/offers/${draftId}`).pipe(map$1((offerDTO) => new ScOrderDraft(offerDTO, this.dateFormats.api)), tap((offer) => {
|
|
7494
|
-
const cachedItem = this.offerMap.get(draftId);
|
|
7495
|
-
if (cachedItem) {
|
|
7496
|
-
cachedItem.setValue(offer);
|
|
7497
|
-
}
|
|
7498
|
-
else {
|
|
7499
|
-
this.offerMap.set(draftId, new ScCachedItem(this.updateInterval.orderData, of(offer), loadingPlaceholder));
|
|
7500
|
-
}
|
|
7501
|
-
}));
|
|
7502
|
-
}
|
|
7503
7164
|
/**
|
|
7504
7165
|
* Возвращает список элементов коммерческого предложения/черновика.
|
|
7505
7166
|
*
|
|
@@ -7516,7 +7177,7 @@ class ScOrderDraftsService {
|
|
|
7516
7177
|
*/
|
|
7517
7178
|
update$(draftId, patch) {
|
|
7518
7179
|
const cachedItem = this.offerMap.get(draftId);
|
|
7519
|
-
return this.http.patch(`${this.urls.apiUrl}/orders/offers/${draftId}`, patch).pipe(map$1((offerDTO) => new ScOrderDraft(offerDTO
|
|
7180
|
+
return this.http.patch(`${this.urls.apiUrl}/orders/offers/${draftId}`, patch).pipe(map$1((offerDTO) => new ScOrderDraft(offerDTO)), tap((offer) => {
|
|
7520
7181
|
this.userMetrikaService.emitUserMetrikaEvent({
|
|
7521
7182
|
target: ScUserMetrikaGoalsEnum.orderDraftUpdated,
|
|
7522
7183
|
params: { offer_id: draftId },
|
|
@@ -7555,15 +7216,6 @@ class ScOrderDraftsService {
|
|
|
7555
7216
|
this.removeOrderedProductsFromCache(offerId, data.items ?? []);
|
|
7556
7217
|
}));
|
|
7557
7218
|
}
|
|
7558
|
-
/**
|
|
7559
|
-
* Выполняет запрос с указанным интервалом, пока вкладка браузера видна. Новый запрос не начинается до завершения предыдущего, ошибки пропускаются.
|
|
7560
|
-
*
|
|
7561
|
-
* @param period Интервал запросов (ms).
|
|
7562
|
-
* @param request Функция, возвращающая запрос.
|
|
7563
|
-
*/
|
|
7564
|
-
poll$(period, request) {
|
|
7565
|
-
return timer(period, period).pipe(filter(() => this.document.visibilityState !== 'hidden'), exhaustMap(() => request().pipe(catchError$1(() => EMPTY))));
|
|
7566
|
-
}
|
|
7567
7219
|
/**
|
|
7568
7220
|
* Убирает заказанные позиции из кэша черновика локально (сервер сразу после заказа ещё может вернуть их в списке).
|
|
7569
7221
|
*
|
|
@@ -7581,15 +7233,11 @@ class ScOrderDraftsService {
|
|
|
7581
7233
|
return;
|
|
7582
7234
|
}
|
|
7583
7235
|
const currentDraft = draft;
|
|
7584
|
-
// Из черновика Профстрой позиции после оформления заказа не удаляются.
|
|
7585
|
-
if (currentDraft.isProfstroy) {
|
|
7586
|
-
return;
|
|
7587
|
-
}
|
|
7588
7236
|
const remainingProducts = currentDraft.products.filter((product) => !orderedIds.has(product.id));
|
|
7589
7237
|
if (remainingProducts.length === currentDraft.products.length) {
|
|
7590
7238
|
return;
|
|
7591
7239
|
}
|
|
7592
|
-
const updatedDraft = new ScOrderDraft(currentDraft
|
|
7240
|
+
const updatedDraft = new ScOrderDraft(currentDraft);
|
|
7593
7241
|
updatedDraft.products = remainingProducts;
|
|
7594
7242
|
updatedDraft.sum = remainingProducts.reduce((sum, product) => sum + product.costRub, 0);
|
|
7595
7243
|
cachedItem.setValue(updatedDraft);
|
|
@@ -7602,7 +7250,7 @@ class ScOrderDraftsService {
|
|
|
7602
7250
|
* @param offerId Идентификатор коммерческого предложения/черновика.
|
|
7603
7251
|
*/
|
|
7604
7252
|
addProduct$(productData, offerId) {
|
|
7605
|
-
return this.http.post(`${this.urls.apiUrl}/orders/offers/${offerId}/products`, productData).pipe(map$1((offerDTO) => new ScOrderDraft(offerDTO
|
|
7253
|
+
return this.http.post(`${this.urls.apiUrl}/orders/offers/${offerId}/products`, productData).pipe(map$1((offerDTO) => new ScOrderDraft(offerDTO)), tap((offer) => {
|
|
7606
7254
|
if (this.offerMap.has(offerId)) {
|
|
7607
7255
|
this.offerMap.get(offerId)?.setValue(offer);
|
|
7608
7256
|
}
|
|
@@ -7616,7 +7264,7 @@ class ScOrderDraftsService {
|
|
|
7616
7264
|
* @param offerId Идентификатор коммерческого предложения/черновика.
|
|
7617
7265
|
*/
|
|
7618
7266
|
updateProduct$(productId, patch, offerId) {
|
|
7619
|
-
return this.http.patch(`${this.urls.apiUrl}/orders/offers/${offerId}/products/${productId}`, patch).pipe(map$1((offerDTO) => new ScOrderDraft(offerDTO
|
|
7267
|
+
return this.http.patch(`${this.urls.apiUrl}/orders/offers/${offerId}/products/${productId}`, patch).pipe(map$1((offerDTO) => new ScOrderDraft(offerDTO)), tap((offer) => {
|
|
7620
7268
|
if (this.offerMap.has(offerId)) {
|
|
7621
7269
|
this.offerMap.get(offerId)?.setValue(offer);
|
|
7622
7270
|
}
|
|
@@ -7629,7 +7277,7 @@ class ScOrderDraftsService {
|
|
|
7629
7277
|
* @param offerId Идентификатор коммерческого предложения/черновика.
|
|
7630
7278
|
*/
|
|
7631
7279
|
deleteProduct$(item, offerId) {
|
|
7632
|
-
return this.http.delete(`${this.urls.apiUrl}/orders/offers/${offerId}/products/${item.id}`).pipe(map$1((offerDTO) => new ScOrderDraft(offerDTO
|
|
7280
|
+
return this.http.delete(`${this.urls.apiUrl}/orders/offers/${offerId}/products/${item.id}`).pipe(map$1((offerDTO) => new ScOrderDraft(offerDTO)), tap((offer) => {
|
|
7633
7281
|
if (this.offerMap.has(offerId)) {
|
|
7634
7282
|
this.offerMap.get(offerId)?.setValue(offer);
|
|
7635
7283
|
}
|
|
@@ -8344,7 +7992,6 @@ class SchemaOrgFactory {
|
|
|
8344
7992
|
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
8345
7993
|
const image = this.mediaImageTransformerPipe.transform(product?.getImagePreview?.() ?? product.image, true);
|
|
8346
7994
|
const description = product.properties?.description;
|
|
8347
|
-
const priceValidUntil = this.normalizePriceValidUntil(product.discount?.expiredAt);
|
|
8348
7995
|
return {
|
|
8349
7996
|
'@context': 'https://schema.org',
|
|
8350
7997
|
'@type': 'Product',
|
|
@@ -8352,21 +7999,16 @@ class SchemaOrgFactory {
|
|
|
8352
7999
|
name: product.name,
|
|
8353
8000
|
...(image && { image }),
|
|
8354
8001
|
...(description && { description: this.stripHtml(description) }),
|
|
8355
|
-
|
|
8356
|
-
|
|
8357
|
-
|
|
8358
|
-
|
|
8359
|
-
|
|
8360
|
-
|
|
8361
|
-
price: product.costRub,
|
|
8362
|
-
availability: this.getAvailability(product),
|
|
8363
|
-
itemCondition: 'https://schema.org/NewCondition',
|
|
8364
|
-
seller: {
|
|
8365
|
-
'@type': 'Organization',
|
|
8366
|
-
name: this.companyInfo.name,
|
|
8002
|
+
sku: product.code,
|
|
8003
|
+
...(product.supplierSku && { mpn: product.supplierSku }),
|
|
8004
|
+
...(product.brand && {
|
|
8005
|
+
brand: {
|
|
8006
|
+
'@type': 'Brand',
|
|
8007
|
+
name: product.brand,
|
|
8367
8008
|
},
|
|
8368
|
-
|
|
8369
|
-
|
|
8009
|
+
}),
|
|
8010
|
+
url: productUrl,
|
|
8011
|
+
offers: this.createOffer(product, productUrl),
|
|
8370
8012
|
};
|
|
8371
8013
|
}
|
|
8372
8014
|
/**
|
|
@@ -8450,6 +8092,7 @@ class SchemaOrgFactory {
|
|
|
8450
8092
|
// eslint-disable-next-line sonarjs/function-return-type
|
|
8451
8093
|
generateForOrganization() {
|
|
8452
8094
|
const postalAddress = this.createPostalAddress(this.companyInfo.address);
|
|
8095
|
+
const merchantReturnPolicy = this.createMerchantReturnPolicy();
|
|
8453
8096
|
return {
|
|
8454
8097
|
'@context': 'https://schema.org',
|
|
8455
8098
|
'@type': 'OnlineStore',
|
|
@@ -8479,6 +8122,13 @@ class SchemaOrgFactory {
|
|
|
8479
8122
|
address: warehouseAddress,
|
|
8480
8123
|
})),
|
|
8481
8124
|
}),
|
|
8125
|
+
...(merchantReturnPolicy && {
|
|
8126
|
+
// Тип возмещения Google принимает только в политике организации, в предложениях его нет.
|
|
8127
|
+
hasMerchantReturnPolicy: {
|
|
8128
|
+
...merchantReturnPolicy,
|
|
8129
|
+
refundType: 'https://schema.org/FullRefund',
|
|
8130
|
+
},
|
|
8131
|
+
}),
|
|
8482
8132
|
};
|
|
8483
8133
|
}
|
|
8484
8134
|
/**
|
|
@@ -8614,6 +8264,22 @@ class SchemaOrgFactory {
|
|
|
8614
8264
|
}
|
|
8615
8265
|
return contactPoints;
|
|
8616
8266
|
}
|
|
8267
|
+
/**
|
|
8268
|
+
* Формирует MerchantReturnPolicy по условиям возврата из данных о компании.
|
|
8269
|
+
*/
|
|
8270
|
+
createMerchantReturnPolicy() {
|
|
8271
|
+
if (!this.companyInfo.returnPolicy) {
|
|
8272
|
+
return undefined;
|
|
8273
|
+
}
|
|
8274
|
+
return {
|
|
8275
|
+
'@type': 'MerchantReturnPolicy',
|
|
8276
|
+
applicableCountry: 'RU',
|
|
8277
|
+
returnPolicyCategory: 'https://schema.org/MerchantReturnFiniteReturnWindow',
|
|
8278
|
+
merchantReturnDays: this.companyInfo.returnPolicy.returnDays,
|
|
8279
|
+
returnMethod: 'https://schema.org/ReturnInStore',
|
|
8280
|
+
returnFees: 'https://schema.org/FreeReturn',
|
|
8281
|
+
};
|
|
8282
|
+
}
|
|
8617
8283
|
/**
|
|
8618
8284
|
* Удаляет HTML-разметку из текста.
|
|
8619
8285
|
*
|
|
@@ -8707,6 +8373,30 @@ class SchemaOrgFactory {
|
|
|
8707
8373
|
const path = categoryPath.replace(':id', id);
|
|
8708
8374
|
return `${this.urls.siteUrl}${path}`;
|
|
8709
8375
|
}
|
|
8376
|
+
/**
|
|
8377
|
+
* Создаёт Offer о продаже товара.
|
|
8378
|
+
*
|
|
8379
|
+
* @param product Данные о продукте.
|
|
8380
|
+
* @param productUrl Полный URL страницы товара.
|
|
8381
|
+
*/
|
|
8382
|
+
createOffer(product, productUrl) {
|
|
8383
|
+
const priceValidUntil = this.normalizePriceValidUntil(product.discount?.expiredAt);
|
|
8384
|
+
const merchantReturnPolicy = this.createMerchantReturnPolicy();
|
|
8385
|
+
return {
|
|
8386
|
+
'@type': 'Offer',
|
|
8387
|
+
priceCurrency: 'RUB',
|
|
8388
|
+
...(priceValidUntil && { priceValidUntil }),
|
|
8389
|
+
price: product.costRub,
|
|
8390
|
+
availability: this.getAvailability(product),
|
|
8391
|
+
itemCondition: 'https://schema.org/NewCondition',
|
|
8392
|
+
seller: {
|
|
8393
|
+
'@type': 'Organization',
|
|
8394
|
+
name: this.companyInfo.name,
|
|
8395
|
+
},
|
|
8396
|
+
url: productUrl,
|
|
8397
|
+
...(merchantReturnPolicy && { hasMerchantReturnPolicy: merchantReturnPolicy }),
|
|
8398
|
+
};
|
|
8399
|
+
}
|
|
8710
8400
|
/**
|
|
8711
8401
|
* Создаёт элемент списка ItemList с кратким Product для страницы категории.
|
|
8712
8402
|
*
|
|
@@ -8719,7 +8409,6 @@ class SchemaOrgFactory {
|
|
|
8719
8409
|
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
8720
8410
|
const image = this.mediaImageTransformerPipe.transform(product?.getImagePreview?.() ?? product.image, true);
|
|
8721
8411
|
const description = product.seo?.description ?? product.properties?.description;
|
|
8722
|
-
const priceValidUntil = this.normalizePriceValidUntil(product.discount?.expiredAt);
|
|
8723
8412
|
return {
|
|
8724
8413
|
'@type': 'ListItem',
|
|
8725
8414
|
position,
|
|
@@ -8729,19 +8418,7 @@ class SchemaOrgFactory {
|
|
|
8729
8418
|
url: productUrl,
|
|
8730
8419
|
...(image && { image }),
|
|
8731
8420
|
...(description && { description: this.stripHtml(description) }),
|
|
8732
|
-
offers:
|
|
8733
|
-
'@type': 'Offer',
|
|
8734
|
-
priceCurrency: 'RUB',
|
|
8735
|
-
...(priceValidUntil && { priceValidUntil }),
|
|
8736
|
-
price: product.costRub,
|
|
8737
|
-
availability: this.getAvailability(product),
|
|
8738
|
-
itemCondition: 'https://schema.org/NewCondition',
|
|
8739
|
-
seller: {
|
|
8740
|
-
'@type': 'Organization',
|
|
8741
|
-
name: this.companyInfo.name,
|
|
8742
|
-
},
|
|
8743
|
-
url: productUrl,
|
|
8744
|
-
},
|
|
8421
|
+
offers: this.createOffer(product, productUrl),
|
|
8745
8422
|
},
|
|
8746
8423
|
};
|
|
8747
8424
|
}
|
|
@@ -9661,5 +9338,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
9661
9338
|
* Generated bundle index. Do not edit.
|
|
9662
9339
|
*/
|
|
9663
9340
|
|
|
9664
|
-
export { CATEGORY_PROVIDERS, EMPTY_CART, IS_BROWSER, IS_RUNNING_ON_TERMINAL, IS_SERVER, RESPONSE, SC_ACCESS_AUTH_TOKEN_STORAGE_KEY, SC_API_KEYS, SC_AUTH_ADD_HEADER_REQUIRED, SC_AUTH_AS_CLIENT_DEFAULT_OPTIONS, SC_AUTH_AS_CLIENT_OPTIONS, SC_CACHE_LIFETIME, SC_CACHE_SETTINGS, SC_CANONICAL_REDIRECT_ENABLED, SC_CATALOG_ITEM_PAGE_META, SC_CATALOG_ROOT_PAGE_META, SC_CATEGORY_INFO, SC_CATEGORY_STATE, SC_COMPANY_INFO, SC_COMPANY_NAME, SC_CONFIGURATOR_COMPONENTS, SC_CONFIGURATOR_SETTINGS, SC_COUNT_FIRST_DISCOUNTED_PRODUCTS, SC_COUNT_LAST_NEWS, SC_DATE_FORMAT, SC_DEFAULT_PAGE_META, SC_FEEDBACK_API, SC_GUEST_ENDPOINTS_TOKEN, SC_GUEST_PARAMETER_NAME_TOKEN, SC_GUEST_TOKEN_STORAGE_KEY, SC_ID_OR_SLUG_IN_ROUTE, SC_IS_HEADER_REQUIRED, SC_IS_HIDDEN_ERROR_ALERT, SC_IS_HIDDEN_ERROR_ALERT_HTTP_CONTEXT, SC_IS_LOGOUT_REQUEST, SC_IS_REFRESH_REQUIRED, SC_LINEAR_VALUES, SC_LINEAR_VALUES_TOKEN, SC_MAX_LENGTH_SEARCH_TERM, SC_MIN_LENGTH_SEARCH_TERM, SC_NEXT_PAGE_PAGINATION_CLICK, SC_ORDER_LOADER, SC_ORDER_LOADING, SC_PAGE_QUERY_PARAM, SC_PATH_IMAGE_NOT_FOUND, SC_PRODUCTS_PAGINATION_LOADER, SC_PRODUCT_PAGINATION_DEFAULT_OPTIONS, SC_PRODUCT_PAGINATION_OPTIONS, SC_REFRESH_AUTH_TOKEN_STORAGE_KEY, SC_RELEASE, SC_SSR_RESPONSE_CACHE, SC_SSR_RESPONSE_CACHE_SETTINGS, SC_UPDATE_INTERVAL, SC_URLS, SC_USER_INFO, SC_VACANCIES_DATA_SOURCE, SC_VIRTUAL_CATEGORY_INFO, SC_VIRTUAL_CATEGORY_PROVIDERS, SEARCH_TERM, SEARCH_TERM_PROVIDERS, ScAuthAsClientGuard, ScAuthInterceptor, ScAuthService, ScBanner, ScBannerService, ScCacheInterceptor, ScCacheSettings, ScCachedData, ScCachedItem, ScCart, ScCartService, ScCatalogFilterService, ScCatalogFormat, ScCatalogItem, ScCatalogRedirectService, ScCatalogService, ScCatalogableItem, ScCategory, ScClientType, ScCodedIdentity, ScConfiguratorService, ScContactsService, ScContragentService, ScConvertInterceptor, ScConvertersService, ScDateFormatInterceptor,
|
|
9341
|
+
export { CATEGORY_PROVIDERS, EMPTY_CART, IS_BROWSER, IS_RUNNING_ON_TERMINAL, IS_SERVER, RESPONSE, SC_ACCESS_AUTH_TOKEN_STORAGE_KEY, SC_API_KEYS, SC_AUTH_ADD_HEADER_REQUIRED, SC_AUTH_AS_CLIENT_DEFAULT_OPTIONS, SC_AUTH_AS_CLIENT_OPTIONS, SC_CACHE_LIFETIME, SC_CACHE_SETTINGS, SC_CANONICAL_REDIRECT_ENABLED, SC_CATALOG_ITEM_PAGE_META, SC_CATALOG_ROOT_PAGE_META, SC_CATEGORY_INFO, SC_CATEGORY_STATE, SC_COMPANY_INFO, SC_COMPANY_NAME, SC_CONFIGURATOR_COMPONENTS, SC_CONFIGURATOR_SETTINGS, SC_COUNT_FIRST_DISCOUNTED_PRODUCTS, SC_COUNT_LAST_NEWS, SC_DATE_FORMAT, SC_DEFAULT_PAGE_META, SC_FEEDBACK_API, SC_GUEST_ENDPOINTS_TOKEN, SC_GUEST_PARAMETER_NAME_TOKEN, SC_GUEST_TOKEN_STORAGE_KEY, SC_ID_OR_SLUG_IN_ROUTE, SC_IS_HEADER_REQUIRED, SC_IS_HIDDEN_ERROR_ALERT, SC_IS_HIDDEN_ERROR_ALERT_HTTP_CONTEXT, SC_IS_LOGOUT_REQUEST, SC_IS_REFRESH_REQUIRED, SC_LINEAR_VALUES, SC_LINEAR_VALUES_TOKEN, SC_MAX_LENGTH_SEARCH_TERM, SC_MIN_LENGTH_SEARCH_TERM, SC_NEXT_PAGE_PAGINATION_CLICK, SC_ORDER_LOADER, SC_ORDER_LOADING, SC_PAGE_QUERY_PARAM, SC_PATH_IMAGE_NOT_FOUND, SC_PRODUCTS_PAGINATION_LOADER, SC_PRODUCT_PAGINATION_DEFAULT_OPTIONS, SC_PRODUCT_PAGINATION_OPTIONS, SC_REFRESH_AUTH_TOKEN_STORAGE_KEY, SC_RELEASE, SC_SSR_RESPONSE_CACHE, SC_SSR_RESPONSE_CACHE_SETTINGS, SC_UPDATE_INTERVAL, SC_URLS, SC_USER_INFO, SC_VACANCIES_DATA_SOURCE, SC_VIRTUAL_CATEGORY_INFO, SC_VIRTUAL_CATEGORY_PROVIDERS, SEARCH_TERM, SEARCH_TERM_PROVIDERS, ScAuthAsClientGuard, ScAuthInterceptor, ScAuthService, ScBanner, ScBannerService, ScCacheInterceptor, ScCacheSettings, ScCachedData, ScCachedItem, ScCart, ScCartService, ScCatalogFilterService, ScCatalogFormat, ScCatalogItem, ScCatalogRedirectService, ScCatalogService, ScCatalogableItem, ScCategory, ScClientType, ScCodedIdentity, ScConfiguratorService, ScContactsService, ScContragentService, ScConvertInterceptor, ScConvertersService, ScDateFormatInterceptor, ScDeletableNamedIdentity, ScDeliveryAddressService, ScDeliveryCost, ScDeliveryType, ScDocumentInfoNode, ScDocumentInfoTypesEnum, ScErrorRequestState, ScErrorsInterceptor, ScFavoriteService, ScFeedbackForms, ScFeedbackService, ScFilesService, ScFrequentlyAskedQuestionsService, ScGuestInterceptor, ScHiddenCatalogableItem, ScIBreadcrumbItem, ScISuggestionType, ScIconTypesEnum, ScIdOrSlugGuard, ScIdOrSlugPipe, ScIdentity, ScImage, ScImageHelper, ScLoadingRequestState, ScLocationsService, ScMediaImageTransformerPipe, ScMimeTypes, ScNamedIdentity, ScNews, ScNewsService, ScNotificationActionTypes, ScNotificationLevelNames, ScNotificationsService, ScOpfList, ScOptionsInterceptor, ScOrder, ScOrderBase, ScOrderDraft, ScOrderDraftShort, ScOrderDraftType, ScOrderDraftsService, ScOrderItem, ScOrderShort, ScOrderStateStatus, ScOrdersService, ScPaginationPageQueryParamService, ScPaginationService, ScPaymentStatus, ScPaymentType, ScPhoneService, ScPrimaryCatalogableItem, ScProduct, ScProductTileType, ScQuestionnaireService, ScQuestionnaireStatusEnum, ScReclamationService, ScReclamationStatus, ScRecommendationService, ScRedirectStatusEnum, ScReference, ScReferenceName, ScReferencesService, ScRequestStateStatusEnum, ScRequisitesService, ScRouteKeys, ScSearchService, ScSeoService, ScSocialType, ScSsrResponseCache, ScSsrResponseCacheBackend, ScSuccessRequestState, ScSuggestionService, ScSum, ScTokenService, ScUIService, ScUTMService, ScUnitsHelper, ScUpdatableNamedIdentity, ScUploadedFile, ScUser, ScUserMetadata, ScUserMetrikaGoalsEnum, ScUserMetrikaService, ScUserService, ScUserType, ScVCardService, ScVacanciesList, ScVacanciesService, ScVacancy, ScVerificationService, ScVirtualCategory, ScWarehouseService, SchemaOrgFactory, TERMINAL_PROVIDERS, USER_AGENT_TERMINAL, filterChangedByKey, loadingPlaceholder, mapRequestStateToDataOrNull, mapToRequestState, provideSsrResponseCache, runningOnTerminalFactory, scGetCurrentRoute, scGetPageQueryParamChanges, scOrderIsLoaded, scParsePageQueryParam, searchTermFactory };
|
|
9665
9342
|
//# sourceMappingURL=snabcentr-client-core.mjs.map
|