@snabcentr/client-core 3.21.0-profstroy → 3.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cart/classes/sc-cart.d.ts +0 -4
- package/cart/constants/sc-empty-cart.d.ts +0 -1
- package/cart/internal/sc-i-cart.d.ts +0 -4
- package/cart/services/sc-cart.service.d.ts +0 -7
- package/catalog/dto/sc-product.d.ts +0 -7
- package/config/sc-i-update-interval.d.ts +0 -12
- package/esm2022/cart/classes/sc-cart.mjs +2 -3
- package/esm2022/cart/constants/sc-empty-cart.mjs +2 -2
- package/esm2022/cart/internal/sc-i-cart.mjs +1 -1
- package/esm2022/cart/services/sc-cart.service.mjs +2 -16
- package/esm2022/catalog/classes/sc-catalog-item.mjs +2 -2
- package/esm2022/catalog/dto/sc-product.mjs +1 -13
- 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 -24
- 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-item.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/order/services/sc-orders.service.mjs +5 -6
- package/esm2022/ui/services/sc-ui.service.mjs +13 -39
- package/esm2022/user/dto/sc-user-metadata.mjs +5 -6
- package/esm2022/user-metrika/enums/sc-user-metrika-goals-enum.mjs +1 -19
- package/fesm2022/snabcentr-client-core.mjs +74 -470
- 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 -16
- 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-item.d.ts +0 -4
- package/order/internal/sc-i-order-short.d.ts +0 -4
- package/order/services/sc-order-drafts.service.d.ts +1 -63
- package/order/services/sc-orders.service.d.ts +2 -3
- package/package.json +1 -1
- package/release_notes.tmp +4 -2
- package/ui/services/sc-ui.service.d.ts +6 -15
- package/user/dto/sc-user-metadata.d.ts +2 -2
- 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
|
*
|
|
@@ -1516,7 +1498,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
1516
1498
|
}]
|
|
1517
1499
|
}] });
|
|
1518
1500
|
|
|
1519
|
-
const EMPTY_CART = { items: [], result_sum: { rub: 0 }
|
|
1501
|
+
const EMPTY_CART = { items: [], result_sum: { rub: 0 } };
|
|
1520
1502
|
|
|
1521
1503
|
/**
|
|
1522
1504
|
* Данные об итоговой сумме.
|
|
@@ -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
|
*
|
|
@@ -1897,44 +1867,6 @@ class ScProduct extends ScCatalogItem {
|
|
|
1897
1867
|
}
|
|
1898
1868
|
}
|
|
1899
1869
|
|
|
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
1870
|
/**
|
|
1939
1871
|
* Данные о единичной позиции товара/услуги в заказе (корзине / черновике).
|
|
1940
1872
|
*/
|
|
@@ -1957,32 +1889,10 @@ class ScOrderItem {
|
|
|
1957
1889
|
this.length = data.length;
|
|
1958
1890
|
this.width = data.width;
|
|
1959
1891
|
this.logicGroupId = data.logicGroupId;
|
|
1960
|
-
this.salesDirection = data.salesDirection;
|
|
1961
1892
|
this.specificationImgUrl = data.specificationImgUrl;
|
|
1962
1893
|
this.configurator = data.configurator;
|
|
1963
1894
|
this.configuratorParams = data.configuratorParams;
|
|
1964
1895
|
}
|
|
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
1896
|
/**
|
|
1987
1897
|
* @inheritDoc
|
|
1988
1898
|
*/
|
|
@@ -2025,10 +1935,9 @@ class ScCart {
|
|
|
2025
1935
|
* @param data Данные для первоначальной инициализации.
|
|
2026
1936
|
*/
|
|
2027
1937
|
// eslint-disable-next-line unicorn/no-object-as-default-parameter
|
|
2028
|
-
constructor(data = { items: [], resultSum: { rub: 0 }
|
|
1938
|
+
constructor(data = { items: [], resultSum: { rub: 0 } }) {
|
|
2029
1939
|
this.items = data.items.map((item) => new ScOrderItem(item));
|
|
2030
1940
|
this.resultSum = data.resultSum;
|
|
2031
|
-
this.directionsSum = data.directionsSum;
|
|
2032
1941
|
}
|
|
2033
1942
|
}
|
|
2034
1943
|
|
|
@@ -2169,15 +2078,14 @@ class ScUserMetadata {
|
|
|
2169
2078
|
* Вид отображения плиток товаров.
|
|
2170
2079
|
*/
|
|
2171
2080
|
this.productTileType = ScProductTileType.grid;
|
|
2172
|
-
/**
|
|
2173
|
-
* Метаданные не оформленных заказов.
|
|
2174
|
-
*/
|
|
2175
|
-
this.newOrdersMetadata = [];
|
|
2176
2081
|
/**
|
|
2177
2082
|
* Формат отображения каталога.
|
|
2178
2083
|
*/
|
|
2179
2084
|
this.catalogFormat = ScCatalogFormat.normal;
|
|
2180
|
-
|
|
2085
|
+
const metadata = { ...data };
|
|
2086
|
+
// Устаревший ключ черновика заказа по направлениям, не переносится в актуальные метаданные.
|
|
2087
|
+
delete metadata['newOrdersMetadata'];
|
|
2088
|
+
Object.assign(this, metadata);
|
|
2181
2089
|
}
|
|
2182
2090
|
}
|
|
2183
2091
|
|
|
@@ -2285,54 +2193,28 @@ class ScUIService {
|
|
|
2285
2193
|
this.setMetadataByKey('paginatePageSize', paginatePageSize);
|
|
2286
2194
|
}
|
|
2287
2195
|
/**
|
|
2288
|
-
* Возвращает {@link Observable} метаданных неоформленного
|
|
2289
|
-
*
|
|
2290
|
-
* @param directionsId Идентификатор направления продаж.
|
|
2196
|
+
* Возвращает {@link Observable} метаданных неоформленного заказа.
|
|
2291
2197
|
*/
|
|
2292
|
-
getNewOrderMetadata$(
|
|
2293
|
-
|
|
2294
|
-
return this.userMetadataSubject.pipe(map$1((metadata) => metadata.newOrdersMetadata), distinctUntilChanged(), map$1((ordersMetadata) => ordersMetadata[directionsId]), distinctUntilChanged());
|
|
2198
|
+
getNewOrderMetadata$() {
|
|
2199
|
+
return this.getMetadataChangeByKey$('newOrderMetadata');
|
|
2295
2200
|
}
|
|
2296
2201
|
/**
|
|
2297
|
-
* Устанавливает метаданные неоформленного
|
|
2202
|
+
* Устанавливает метаданные неоформленного заказа.
|
|
2298
2203
|
*
|
|
2299
|
-
* @param directionsId Идентификатор направления продаж.
|
|
2300
2204
|
* @param newOrderMetadata Данные нового неоформленного заказа.
|
|
2301
2205
|
*/
|
|
2302
|
-
setNewOrderMetadata(
|
|
2206
|
+
setNewOrderMetadata(newOrderMetadata) {
|
|
2303
2207
|
// При сохранении изображения выдаёт ошибку 500 'Произошла ошибка при работе с базой данных'.
|
|
2304
2208
|
// TODO: TASK[#6370]: Доработать после решения задачи.
|
|
2305
|
-
|
|
2306
|
-
|
|
2307
|
-
|
|
2308
|
-
}
|
|
2309
|
-
this.getMetadataChangeByKey$('newOrdersMetadata')
|
|
2310
|
-
.pipe(first())
|
|
2311
|
-
.subscribe((ordersMetadata) => {
|
|
2312
|
-
// eslint-disable-next-line no-param-reassign
|
|
2313
|
-
ordersMetadata[directionsId] = newOrderMetadata;
|
|
2314
|
-
this.setMetadataByKey('newOrdersMetadata', structuredClone(ordersMetadata));
|
|
2315
|
-
});
|
|
2316
|
-
}
|
|
2317
|
-
/**
|
|
2318
|
-
* Удаляет метаданные неоформленного заказа по направлению продаж.
|
|
2319
|
-
*
|
|
2320
|
-
* @param directionsId Идентификатор направления продаж.
|
|
2321
|
-
*/
|
|
2322
|
-
removeNewOrderMetadata(directionsId) {
|
|
2323
|
-
this.getMetadataChangeByKey$('newOrdersMetadata')
|
|
2324
|
-
.pipe(first())
|
|
2325
|
-
.subscribe((ordersMetadata) => {
|
|
2326
|
-
// eslint-disable-next-line @typescript-eslint/no-dynamic-delete,no-param-reassign
|
|
2327
|
-
delete ordersMetadata[directionsId];
|
|
2328
|
-
this.setMetadataByKey('newOrdersMetadata', structuredClone(ordersMetadata));
|
|
2329
|
-
});
|
|
2209
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
2210
|
+
const { image, ...newOrderMetadataWithoutImage } = newOrderMetadata;
|
|
2211
|
+
this.setMetadataByKey('newOrderMetadata', newOrderMetadataWithoutImage);
|
|
2330
2212
|
}
|
|
2331
2213
|
/**
|
|
2332
|
-
* Удаляет метаданные
|
|
2214
|
+
* Удаляет метаданные неоформленного заказа.
|
|
2333
2215
|
*/
|
|
2334
|
-
|
|
2335
|
-
this.setMetadataByKey('
|
|
2216
|
+
removeNewOrderMetadata() {
|
|
2217
|
+
this.setMetadataByKey('newOrderMetadata', undefined);
|
|
2336
2218
|
}
|
|
2337
2219
|
/**
|
|
2338
2220
|
* Возвращает дату последнего открытия опросников.
|
|
@@ -3058,7 +2940,7 @@ class ScCartService {
|
|
|
3058
2940
|
target: ScUserMetrikaGoalsEnum.cartCleared,
|
|
3059
2941
|
});
|
|
3060
2942
|
}), tap(() => {
|
|
3061
|
-
this.uiService.
|
|
2943
|
+
this.uiService.removeNewOrderMetadata();
|
|
3062
2944
|
this.cartCachedItem$.setValue(new ScCart());
|
|
3063
2945
|
}));
|
|
3064
2946
|
}
|
|
@@ -3076,19 +2958,6 @@ class ScCartService {
|
|
|
3076
2958
|
getNullCartItems$() {
|
|
3077
2959
|
return this.get$().pipe(map$1((cart) => (cart === loadingPlaceholder ? loadingPlaceholder : cart.items.filter((item) => item.product.isNull || item.product.isHidden))));
|
|
3078
2960
|
}
|
|
3079
|
-
/**
|
|
3080
|
-
* Возвращает объект {@link ScCart} корзины, созданный из объекта заказа.
|
|
3081
|
-
*
|
|
3082
|
-
* @param order Данные о заказе.
|
|
3083
|
-
*/
|
|
3084
|
-
// eslint-disable-next-line class-methods-use-this
|
|
3085
|
-
getCartByOrder(order) {
|
|
3086
|
-
return {
|
|
3087
|
-
items: order.products,
|
|
3088
|
-
resultSum: { rub: order.sum },
|
|
3089
|
-
directionsSum: { [order.salesDirection.id]: new ScSum(order.sum) },
|
|
3090
|
-
};
|
|
3091
|
-
}
|
|
3092
2961
|
/**
|
|
3093
2962
|
* Возвращает пример CSV файла для добавления продуктов в корзину.
|
|
3094
2963
|
*/
|
|
@@ -4715,6 +4584,43 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
4715
4584
|
}]
|
|
4716
4585
|
}] });
|
|
4717
4586
|
|
|
4587
|
+
/**
|
|
4588
|
+
* Класс-помощник для работы со значениями единиц измерения товара.
|
|
4589
|
+
*/
|
|
4590
|
+
class ScUnitsHelper {
|
|
4591
|
+
/**
|
|
4592
|
+
* Возвращает признак, что указанный товар имеет линейную единицу измерения.
|
|
4593
|
+
*
|
|
4594
|
+
* @param product Данные о товаре для которого нужно проверить линейность его единицы измерения.
|
|
4595
|
+
*/
|
|
4596
|
+
static productIsMeasurable(product) {
|
|
4597
|
+
return product.unit.isLinear || product.unit.isSquare;
|
|
4598
|
+
}
|
|
4599
|
+
/**
|
|
4600
|
+
* Возвращает кратность количества для указанного товара.
|
|
4601
|
+
*
|
|
4602
|
+
* Кратность равна {@link ScProduct.minCount} и не зависит от {@link ScIProperties.ignoreMinCountCheck}:
|
|
4603
|
+
* этот признак только снимает валидацию кратности/минимума при ручном вводе, но начальное количество
|
|
4604
|
+
* и шаг кнопок +/- остаются кратны minCount.
|
|
4605
|
+
*
|
|
4606
|
+
* @param product Данные о товаре для которого необходимо вернуть кратность количества.
|
|
4607
|
+
*/
|
|
4608
|
+
static getProductMultiplicity(product) {
|
|
4609
|
+
return product.minCount && !ScUnitsHelper.productIsMeasurable(product) ? product.minCount : 1;
|
|
4610
|
+
}
|
|
4611
|
+
/**
|
|
4612
|
+
* Возвращает кратность длины для указанного товара.
|
|
4613
|
+
*
|
|
4614
|
+
* @param product Данные о товаре для которого необходимо вернуть кратность длины.
|
|
4615
|
+
*/
|
|
4616
|
+
static getProductLengthMultiplicity(product) {
|
|
4617
|
+
if (product.properties?.lengthStep) {
|
|
4618
|
+
return product.properties.lengthStep;
|
|
4619
|
+
}
|
|
4620
|
+
return !product.properties?.ignoreMinCountCheck && product.minCount ? product.minCount : 0.01;
|
|
4621
|
+
}
|
|
4622
|
+
}
|
|
4623
|
+
|
|
4718
4624
|
/**
|
|
4719
4625
|
* Возвращает текущий маршрут.
|
|
4720
4626
|
* Функция проходит по дереву маршрутов начиная с переданного route и возвращает самый вложенный активный маршрут.
|
|
@@ -4729,28 +4635,6 @@ const scGetCurrentRoute = (route) => {
|
|
|
4729
4635
|
return currentRoute;
|
|
4730
4636
|
};
|
|
4731
4637
|
|
|
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
4638
|
/**
|
|
4755
4639
|
* Токен состояния запроса данных о категории (загрузка / успех / ошибка).
|
|
4756
4640
|
*/
|
|
@@ -6883,160 +6767,6 @@ class ScOrderBase {
|
|
|
6883
6767
|
}
|
|
6884
6768
|
}
|
|
6885
6769
|
|
|
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
6770
|
/**
|
|
7041
6771
|
* Данные о коммерческом предложении/черновике заказа.
|
|
7042
6772
|
*/
|
|
@@ -7045,9 +6775,8 @@ class ScOrderDraft {
|
|
|
7045
6775
|
* Инициализирует экземпляр класса {@link ScOrderDraft}.
|
|
7046
6776
|
*
|
|
7047
6777
|
* @param data Данные для первоначальной инициализации.
|
|
7048
|
-
* @param apiDateFormat Формат дат в данных API.
|
|
7049
6778
|
*/
|
|
7050
|
-
constructor(data
|
|
6779
|
+
constructor(data) {
|
|
7051
6780
|
/**
|
|
7052
6781
|
* Дата последнего обновления данных.
|
|
7053
6782
|
*/
|
|
@@ -7057,10 +6786,7 @@ class ScOrderDraft {
|
|
|
7057
6786
|
this.type = data.type;
|
|
7058
6787
|
this.createdAt = data.createdAt;
|
|
7059
6788
|
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)));
|
|
6789
|
+
this.products = data.products.map((item) => new ScOrderItem(item));
|
|
7064
6790
|
}
|
|
7065
6791
|
/**
|
|
7066
6792
|
* @inheritDoc
|
|
@@ -7088,9 +6814,6 @@ class ScOrderDraft {
|
|
|
7088
6814
|
this.type = offer.type;
|
|
7089
6815
|
this.sum = offer.sum;
|
|
7090
6816
|
this.products = offer.products;
|
|
7091
|
-
this.isProfstroy = offer.isProfstroy;
|
|
7092
|
-
this.actualization = offer.actualization;
|
|
7093
|
-
this.file = offer.file;
|
|
7094
6817
|
this.lastUpdateDate = new Date();
|
|
7095
6818
|
}
|
|
7096
6819
|
/**
|
|
@@ -7099,9 +6822,6 @@ class ScOrderDraft {
|
|
|
7099
6822
|
updateDataFromShortOffer(offer) {
|
|
7100
6823
|
this.name = offer.name;
|
|
7101
6824
|
this.type = offer.type;
|
|
7102
|
-
this.isProfstroy = offer.isProfstroy;
|
|
7103
|
-
this.actualization = offer.actualization;
|
|
7104
|
-
this.file = offer.file;
|
|
7105
6825
|
}
|
|
7106
6826
|
}
|
|
7107
6827
|
|
|
@@ -7113,15 +6833,11 @@ class ScOrderDraftShort extends ScOrderBase {
|
|
|
7113
6833
|
* Инициализирует экземпляр класса {@link ScOrderDraftShort}.
|
|
7114
6834
|
*
|
|
7115
6835
|
* @param data Данные для первоначальной инициализации.
|
|
7116
|
-
* @param apiDateFormat Формат дат в данных API.
|
|
7117
6836
|
*/
|
|
7118
|
-
constructor(data
|
|
6837
|
+
constructor(data) {
|
|
7119
6838
|
super(data);
|
|
7120
6839
|
this.name = data.name;
|
|
7121
6840
|
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
6841
|
}
|
|
7126
6842
|
}
|
|
7127
6843
|
|
|
@@ -7142,7 +6858,6 @@ class ScOrderShort extends ScOrderBase {
|
|
|
7142
6858
|
this.payment = data.payment;
|
|
7143
6859
|
this.numberDoc = data.numberDoc;
|
|
7144
6860
|
this.barcode = data.barcode;
|
|
7145
|
-
this.isProfstroy = data.isProfstroy === true;
|
|
7146
6861
|
}
|
|
7147
6862
|
/**
|
|
7148
6863
|
* @inheritDoc
|
|
@@ -7153,7 +6868,6 @@ class ScOrderShort extends ScOrderBase {
|
|
|
7153
6868
|
this.payment = order.payment;
|
|
7154
6869
|
this.sum = order.sum;
|
|
7155
6870
|
this.delivery = order.delivery;
|
|
7156
|
-
this.isProfstroy = order.isProfstroy;
|
|
7157
6871
|
}
|
|
7158
6872
|
}
|
|
7159
6873
|
|
|
@@ -7351,18 +7065,6 @@ class ScOrderDraftsService {
|
|
|
7351
7065
|
* Сервис для сбора метрик о действиях пользователей.
|
|
7352
7066
|
*/
|
|
7353
7067
|
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
7068
|
/**
|
|
7367
7069
|
* Коллекция пар ключ-значение для кэшированных коммерческих предложений/черновиков пользователя.
|
|
7368
7070
|
*/
|
|
@@ -7378,85 +7080,17 @@ class ScOrderDraftsService {
|
|
|
7378
7080
|
*/
|
|
7379
7081
|
getList$(params) {
|
|
7380
7082
|
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
|
|
7083
|
+
offersPaginateDTO.data = offersPaginateDTO.data.map((item) => new ScOrderDraftShort(item));
|
|
7382
7084
|
return offersPaginateDTO;
|
|
7383
7085
|
}));
|
|
7384
7086
|
}
|
|
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
7087
|
/**
|
|
7454
7088
|
* Создаёт новое коммерческое предложение/черновик заказа.
|
|
7455
7089
|
*
|
|
7456
7090
|
* @param data Данные для создания.
|
|
7457
7091
|
*/
|
|
7458
7092
|
create$(data) {
|
|
7459
|
-
return this.http.post(`${this.urls.apiUrl}/orders/offers`, data).pipe(map$1((offerDTO) => new ScOrderDraft(offerDTO
|
|
7093
|
+
return this.http.post(`${this.urls.apiUrl}/orders/offers`, data).pipe(map$1((offerDTO) => new ScOrderDraft(offerDTO)), tap((offer) => {
|
|
7460
7094
|
this.userMetrikaService.emitUserMetrikaEvent({
|
|
7461
7095
|
target: ScUserMetrikaGoalsEnum.orderDraftCreated,
|
|
7462
7096
|
params: { offer_id: offer.id },
|
|
@@ -7474,7 +7108,7 @@ class ScOrderDraftsService {
|
|
|
7474
7108
|
get$(draftId, cacheable = true) {
|
|
7475
7109
|
let cachedItem = this.offerMap.get(draftId);
|
|
7476
7110
|
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
|
|
7111
|
+
cachedItem = new ScCachedItem(this.updateInterval.orderData, this.http.get(`${this.urls.apiUrl}/orders/offers/${draftId}`).pipe(map$1((data) => new ScOrderDraft(data))), loadingPlaceholder);
|
|
7478
7112
|
if (cacheable) {
|
|
7479
7113
|
this.offerMap.set(draftId, cachedItem);
|
|
7480
7114
|
}
|
|
@@ -7484,22 +7118,6 @@ class ScOrderDraftsService {
|
|
|
7484
7118
|
}
|
|
7485
7119
|
return cachedItem.item$;
|
|
7486
7120
|
}
|
|
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
7121
|
/**
|
|
7504
7122
|
* Возвращает список элементов коммерческого предложения/черновика.
|
|
7505
7123
|
*
|
|
@@ -7516,7 +7134,7 @@ class ScOrderDraftsService {
|
|
|
7516
7134
|
*/
|
|
7517
7135
|
update$(draftId, patch) {
|
|
7518
7136
|
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
|
|
7137
|
+
return this.http.patch(`${this.urls.apiUrl}/orders/offers/${draftId}`, patch).pipe(map$1((offerDTO) => new ScOrderDraft(offerDTO)), tap((offer) => {
|
|
7520
7138
|
this.userMetrikaService.emitUserMetrikaEvent({
|
|
7521
7139
|
target: ScUserMetrikaGoalsEnum.orderDraftUpdated,
|
|
7522
7140
|
params: { offer_id: draftId },
|
|
@@ -7555,15 +7173,6 @@ class ScOrderDraftsService {
|
|
|
7555
7173
|
this.removeOrderedProductsFromCache(offerId, data.items ?? []);
|
|
7556
7174
|
}));
|
|
7557
7175
|
}
|
|
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
7176
|
/**
|
|
7568
7177
|
* Убирает заказанные позиции из кэша черновика локально (сервер сразу после заказа ещё может вернуть их в списке).
|
|
7569
7178
|
*
|
|
@@ -7581,15 +7190,11 @@ class ScOrderDraftsService {
|
|
|
7581
7190
|
return;
|
|
7582
7191
|
}
|
|
7583
7192
|
const currentDraft = draft;
|
|
7584
|
-
// Из черновика Профстрой позиции после оформления заказа не удаляются.
|
|
7585
|
-
if (currentDraft.isProfstroy) {
|
|
7586
|
-
return;
|
|
7587
|
-
}
|
|
7588
7193
|
const remainingProducts = currentDraft.products.filter((product) => !orderedIds.has(product.id));
|
|
7589
7194
|
if (remainingProducts.length === currentDraft.products.length) {
|
|
7590
7195
|
return;
|
|
7591
7196
|
}
|
|
7592
|
-
const updatedDraft = new ScOrderDraft(currentDraft
|
|
7197
|
+
const updatedDraft = new ScOrderDraft(currentDraft);
|
|
7593
7198
|
updatedDraft.products = remainingProducts;
|
|
7594
7199
|
updatedDraft.sum = remainingProducts.reduce((sum, product) => sum + product.costRub, 0);
|
|
7595
7200
|
cachedItem.setValue(updatedDraft);
|
|
@@ -7602,7 +7207,7 @@ class ScOrderDraftsService {
|
|
|
7602
7207
|
* @param offerId Идентификатор коммерческого предложения/черновика.
|
|
7603
7208
|
*/
|
|
7604
7209
|
addProduct$(productData, offerId) {
|
|
7605
|
-
return this.http.post(`${this.urls.apiUrl}/orders/offers/${offerId}/products`, productData).pipe(map$1((offerDTO) => new ScOrderDraft(offerDTO
|
|
7210
|
+
return this.http.post(`${this.urls.apiUrl}/orders/offers/${offerId}/products`, productData).pipe(map$1((offerDTO) => new ScOrderDraft(offerDTO)), tap((offer) => {
|
|
7606
7211
|
if (this.offerMap.has(offerId)) {
|
|
7607
7212
|
this.offerMap.get(offerId)?.setValue(offer);
|
|
7608
7213
|
}
|
|
@@ -7616,7 +7221,7 @@ class ScOrderDraftsService {
|
|
|
7616
7221
|
* @param offerId Идентификатор коммерческого предложения/черновика.
|
|
7617
7222
|
*/
|
|
7618
7223
|
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
|
|
7224
|
+
return this.http.patch(`${this.urls.apiUrl}/orders/offers/${offerId}/products/${productId}`, patch).pipe(map$1((offerDTO) => new ScOrderDraft(offerDTO)), tap((offer) => {
|
|
7620
7225
|
if (this.offerMap.has(offerId)) {
|
|
7621
7226
|
this.offerMap.get(offerId)?.setValue(offer);
|
|
7622
7227
|
}
|
|
@@ -7629,7 +7234,7 @@ class ScOrderDraftsService {
|
|
|
7629
7234
|
* @param offerId Идентификатор коммерческого предложения/черновика.
|
|
7630
7235
|
*/
|
|
7631
7236
|
deleteProduct$(item, offerId) {
|
|
7632
|
-
return this.http.delete(`${this.urls.apiUrl}/orders/offers/${offerId}/products/${item.id}`).pipe(map$1((offerDTO) => new ScOrderDraft(offerDTO
|
|
7237
|
+
return this.http.delete(`${this.urls.apiUrl}/orders/offers/${offerId}/products/${item.id}`).pipe(map$1((offerDTO) => new ScOrderDraft(offerDTO)), tap((offer) => {
|
|
7633
7238
|
if (this.offerMap.has(offerId)) {
|
|
7634
7239
|
this.offerMap.get(offerId)?.setValue(offer);
|
|
7635
7240
|
}
|
|
@@ -7695,13 +7300,12 @@ class ScOrdersService {
|
|
|
7695
7300
|
});
|
|
7696
7301
|
}
|
|
7697
7302
|
/**
|
|
7698
|
-
* Создаёт
|
|
7303
|
+
* Создаёт заказы из выбранных позиций корзины.
|
|
7699
7304
|
*
|
|
7700
|
-
* @param directionId Идентификатор направления продаж.
|
|
7701
7305
|
* @param newOrder Данные нового заказа.
|
|
7702
7306
|
*/
|
|
7703
|
-
createOrder$(
|
|
7704
|
-
return this.http.post(`${this.urls.apiUrl}/orders
|
|
7307
|
+
createOrder$(newOrder) {
|
|
7308
|
+
return this.http.post(`${this.urls.apiUrl}/orders/from-cart`, newOrder).pipe(map$1((orders) => orders.map((item) => new ScOrderShort(item))), tap((orders) => {
|
|
7705
7309
|
orders.forEach((order) => {
|
|
7706
7310
|
this.userMetrikaService.emitUserMetrikaEvent({
|
|
7707
7311
|
target: ScUserMetrikaGoalsEnum.orderCreated,
|
|
@@ -7709,7 +7313,7 @@ class ScOrdersService {
|
|
|
7709
7313
|
});
|
|
7710
7314
|
});
|
|
7711
7315
|
}), tap(() => {
|
|
7712
|
-
this.uiService.removeNewOrderMetadata(
|
|
7316
|
+
this.uiService.removeNewOrderMetadata();
|
|
7713
7317
|
}));
|
|
7714
7318
|
}
|
|
7715
7319
|
/**
|
|
@@ -9661,5 +9265,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
9661
9265
|
* Generated bundle index. Do not edit.
|
|
9662
9266
|
*/
|
|
9663
9267
|
|
|
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,
|
|
9268
|
+
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
9269
|
//# sourceMappingURL=snabcentr-client-core.mjs.map
|