@snabcentr/client-core 3.22.0 → 3.23.3
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 -0
- package/catalog/interfaces/sc-i-product.d.ts +4 -0
- package/config/sc-i-company-base-info.d.ts +9 -0
- package/esm2022/catalog/dto/sc-product.mjs +6 -4
- package/esm2022/catalog/interfaces/sc-i-product.mjs +1 -1
- package/esm2022/config/sc-i-company-base-info.mjs +1 -1
- package/esm2022/helpers/index.mjs +2 -1
- package/esm2022/helpers/sc-number-helper.mjs +210 -0
- package/esm2022/order/classes/sc-delivery-cost.mjs +4 -3
- package/esm2022/order/classes/sc-order-base.mjs +3 -2
- package/esm2022/order/classes/sc-order-draft.mjs +3 -2
- package/esm2022/order/classes/sc-order-item.mjs +6 -5
- package/esm2022/order/services/sc-order-drafts.service.mjs +3 -2
- package/esm2022/references/index.mjs +2 -1
- package/esm2022/references/sc-rub-precision.providers.mjs +22 -0
- package/esm2022/seo/classes/schema-org-factory.mjs +59 -30
- package/esm2022/user/dto/sc-user.mjs +4 -3
- package/fesm2022/snabcentr-client-core.mjs +304 -47
- package/fesm2022/snabcentr-client-core.mjs.map +1 -1
- package/helpers/index.d.ts +1 -0
- package/helpers/sc-number-helper.d.ts +153 -0
- package/package.json +1 -1
- package/references/index.d.ts +1 -0
- package/references/sc-rub-precision.providers.d.ts +6 -0
- package/release_notes.tmp +8 -3
- package/seo/classes/schema-org-factory.d.ts +11 -0
- package/user/dto/sc-user.d.ts +1 -1
|
@@ -1,17 +1,18 @@
|
|
|
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, share, scan, defer, from, lastValueFrom, timeout, TimeoutError } 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, ignoreElements, interval, share, scan, defer, from, lastValueFrom, timeout, TimeoutError } from 'rxjs';
|
|
3
3
|
import { map, startWith, catchError } from 'rxjs/operators';
|
|
4
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
|
-
import { InjectionToken, inject, PLATFORM_ID, Injectable, Inject, Optional, EventEmitter, DestroyRef, LOCALE_ID, Pipe, assertInInjectionContext, RendererFactory2
|
|
7
|
+
import { InjectionToken, inject, PLATFORM_ID, Injectable, Inject, Optional, EventEmitter, DestroyRef, LOCALE_ID, Pipe, makeEnvironmentProviders, APP_INITIALIZER, assertInInjectionContext, RendererFactory2 } from '@angular/core';
|
|
8
8
|
import { WA_LOCAL_STORAGE, WA_USER_AGENT, WA_WINDOW } from '@ng-web-apis/common';
|
|
9
9
|
import { filterByKey, toValue, WA_STORAGE_EVENT, StorageService } from '@ng-web-apis/storage';
|
|
10
10
|
import { isPlatformBrowser, isPlatformServer, DOCUMENT, formatDate } from '@angular/common';
|
|
11
11
|
import * as i1$1 from '@angular/common/http';
|
|
12
12
|
import { HttpContextToken, HttpContext, HttpHeaders, HttpClient, HttpParams, HttpErrorResponse, HttpResponse, FetchBackend, HttpXhrBackend, HttpStatusCode, HttpBackend } from '@angular/common/http';
|
|
13
13
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
14
|
-
import { tuiIsPresent, TuiDay, tuiPure, TUI_TRUE_HANDLER } from '@taiga-ui/cdk';
|
|
14
|
+
import { tuiRound, tuiIsPresent, TuiDay, tuiPure, TUI_TRUE_HANDLER } from '@taiga-ui/cdk';
|
|
15
|
+
import { tuiFormatNumber } from '@taiga-ui/core';
|
|
15
16
|
import { tuiCleanObject } from '@taiga-ui/addon-doc/utils';
|
|
16
17
|
import * as i2 from '@angular/router';
|
|
17
18
|
import { Router, NavigationEnd, ActivatedRoute } from '@angular/router';
|
|
@@ -1214,6 +1215,214 @@ class ScBanner {
|
|
|
1214
1215
|
}
|
|
1215
1216
|
}
|
|
1216
1217
|
|
|
1218
|
+
/**
|
|
1219
|
+
* Класс-помощник для работы с дробными числами.
|
|
1220
|
+
*
|
|
1221
|
+
* Округляет с учётом погрешности дробной арифметики, считает кратность шагу и задаёт настройки вывода чисел.
|
|
1222
|
+
*/
|
|
1223
|
+
class ScNumberHelper {
|
|
1224
|
+
/**
|
|
1225
|
+
* Наибольшее количество знаков после запятой в проценте на экране.
|
|
1226
|
+
*/
|
|
1227
|
+
static { this.percentDisplayFractionDigits = 2; }
|
|
1228
|
+
/**
|
|
1229
|
+
* Наибольшее количество знаков после запятой в площади, м².
|
|
1230
|
+
*/
|
|
1231
|
+
static { this.areaFractionDigits = 4; }
|
|
1232
|
+
/**
|
|
1233
|
+
* Количество знаков после запятой в географических координатах.
|
|
1234
|
+
*/
|
|
1235
|
+
static { this.coordinateFractionDigits = 6; }
|
|
1236
|
+
/**
|
|
1237
|
+
* Количество значащих цифр, до которого обрезается погрешность дробной арифметики.
|
|
1238
|
+
*/
|
|
1239
|
+
static { this.significantDigits = 12; }
|
|
1240
|
+
/**
|
|
1241
|
+
* Допустимая погрешность сравнения дробных чисел.
|
|
1242
|
+
*/
|
|
1243
|
+
static { this.epsilon = 0.000001; }
|
|
1244
|
+
/**
|
|
1245
|
+
* Настройки вывода площади.
|
|
1246
|
+
*/
|
|
1247
|
+
static { this.areaFormat = {
|
|
1248
|
+
precision: ScNumberHelper.areaFractionDigits,
|
|
1249
|
+
decimalSeparator: ',',
|
|
1250
|
+
decimalMode: 'not-zero',
|
|
1251
|
+
rounding: 'round',
|
|
1252
|
+
}; }
|
|
1253
|
+
/**
|
|
1254
|
+
* Настройки вывода целых чисел.
|
|
1255
|
+
*/
|
|
1256
|
+
static { this.integerFormat = {
|
|
1257
|
+
precision: 0,
|
|
1258
|
+
rounding: 'round',
|
|
1259
|
+
}; }
|
|
1260
|
+
/**
|
|
1261
|
+
* Настройки вывода процентов.
|
|
1262
|
+
*/
|
|
1263
|
+
static { this.percentFormat = {
|
|
1264
|
+
precision: ScNumberHelper.percentDisplayFractionDigits,
|
|
1265
|
+
decimalSeparator: ',',
|
|
1266
|
+
decimalMode: 'not-zero',
|
|
1267
|
+
rounding: 'round',
|
|
1268
|
+
}; }
|
|
1269
|
+
/**
|
|
1270
|
+
* Настройки вывода денежных сумм по точности валюты.
|
|
1271
|
+
*/
|
|
1272
|
+
static { this.moneyFormatsByPrecision = new Map(); }
|
|
1273
|
+
/**
|
|
1274
|
+
* Точность рубля из справочника валют ({@link ScICurrency.precision}) или undefined, если справочник не загружен.
|
|
1275
|
+
*/
|
|
1276
|
+
static get rubPrecision() {
|
|
1277
|
+
return ScNumberHelper.rubPrecisionValue;
|
|
1278
|
+
}
|
|
1279
|
+
/**
|
|
1280
|
+
* Возвращает количество знаков после запятой в указанном числе с учётом экспоненциальной записи.
|
|
1281
|
+
*
|
|
1282
|
+
* @param value Число, для которого нужно определить количество знаков после запятой.
|
|
1283
|
+
*/
|
|
1284
|
+
static getDecimalsCount(value) {
|
|
1285
|
+
if (!Number.isFinite(value) || Number.isInteger(value)) {
|
|
1286
|
+
return 0;
|
|
1287
|
+
}
|
|
1288
|
+
const [mantissa, exponent] = value.toString().split('e');
|
|
1289
|
+
const mantissaParts = mantissa.split('.');
|
|
1290
|
+
const decimals = mantissaParts.length > 1 ? mantissaParts[1].length : 0;
|
|
1291
|
+
return Math.max(decimals - (Number(exponent) || 0), 0);
|
|
1292
|
+
}
|
|
1293
|
+
/**
|
|
1294
|
+
* Возвращает число без погрешности дробной арифметики.
|
|
1295
|
+
*
|
|
1296
|
+
* @param value Число с возможной погрешностью.
|
|
1297
|
+
*/
|
|
1298
|
+
static normalize(value) {
|
|
1299
|
+
return Number.isFinite(value) ? Number(value.toPrecision(ScNumberHelper.significantDigits)) : value;
|
|
1300
|
+
}
|
|
1301
|
+
/**
|
|
1302
|
+
* Возвращает значение, округлённое до указанного количества знаков после запятой.
|
|
1303
|
+
*
|
|
1304
|
+
* @param value Округляемое значение.
|
|
1305
|
+
* @param fractionDigits Количество знаков после запятой.
|
|
1306
|
+
*/
|
|
1307
|
+
static round(value, fractionDigits) {
|
|
1308
|
+
return tuiRound(value, fractionDigits);
|
|
1309
|
+
}
|
|
1310
|
+
/**
|
|
1311
|
+
* Запоминает точность рубля из справочника валют.
|
|
1312
|
+
*
|
|
1313
|
+
* @param precision Точность рубля ({@link ScICurrency.precision}).
|
|
1314
|
+
*/
|
|
1315
|
+
static setRubPrecision(precision) {
|
|
1316
|
+
ScNumberHelper.rubPrecisionValue = precision;
|
|
1317
|
+
}
|
|
1318
|
+
/**
|
|
1319
|
+
* Возвращает денежную сумму, округлённую до точности валюты.
|
|
1320
|
+
*
|
|
1321
|
+
* Без известной точности убирает только погрешность дробной арифметики.
|
|
1322
|
+
*
|
|
1323
|
+
* @param value Денежная сумма.
|
|
1324
|
+
* @param precision Точность валюты суммы ({@link ScICurrency.precision}), по умолчанию точность рубля.
|
|
1325
|
+
*/
|
|
1326
|
+
static roundMoney(value, precision = ScNumberHelper.rubPrecision) {
|
|
1327
|
+
return precision === undefined ? ScNumberHelper.normalize(value) : ScNumberHelper.round(value, precision);
|
|
1328
|
+
}
|
|
1329
|
+
/**
|
|
1330
|
+
* Возвращает географическую координату, округлённую до точности хранения.
|
|
1331
|
+
*
|
|
1332
|
+
* @param value Координата.
|
|
1333
|
+
*/
|
|
1334
|
+
static roundCoordinate(value) {
|
|
1335
|
+
return ScNumberHelper.round(value, ScNumberHelper.coordinateFractionDigits);
|
|
1336
|
+
}
|
|
1337
|
+
/**
|
|
1338
|
+
* Возвращает произведение значения на шаг, округлённое до точности множителей.
|
|
1339
|
+
*
|
|
1340
|
+
* @param value Множитель, обычно количество.
|
|
1341
|
+
* @param step Шаг.
|
|
1342
|
+
*/
|
|
1343
|
+
static multiplyByStep(value, step) {
|
|
1344
|
+
return ScNumberHelper.round(value * step, ScNumberHelper.getDecimalsCount(step) + ScNumberHelper.getDecimalsCount(value));
|
|
1345
|
+
}
|
|
1346
|
+
/**
|
|
1347
|
+
* Возвращает частное от деления значения на шаг без погрешности дробной арифметики.
|
|
1348
|
+
*
|
|
1349
|
+
* @param value Делимое, обычно длина или количество.
|
|
1350
|
+
* @param step Шаг.
|
|
1351
|
+
*/
|
|
1352
|
+
static divideByStep(value, step) {
|
|
1353
|
+
return ScNumberHelper.withoutNegativeZero(ScNumberHelper.normalize(value / step));
|
|
1354
|
+
}
|
|
1355
|
+
/**
|
|
1356
|
+
* Возвращает сумму значения и шага, округлённую до точности слагаемых.
|
|
1357
|
+
*
|
|
1358
|
+
* @param value Значение.
|
|
1359
|
+
* @param step Шаг.
|
|
1360
|
+
*/
|
|
1361
|
+
static addStep(value, step) {
|
|
1362
|
+
return ScNumberHelper.round(value + step, Math.max(ScNumberHelper.getDecimalsCount(value), ScNumberHelper.getDecimalsCount(step)));
|
|
1363
|
+
}
|
|
1364
|
+
/**
|
|
1365
|
+
* Возвращает остаток от деления значения на шаг без погрешности дробной арифметики.
|
|
1366
|
+
*
|
|
1367
|
+
* @param value Значение.
|
|
1368
|
+
* @param step Шаг.
|
|
1369
|
+
*/
|
|
1370
|
+
static remainder(value, step) {
|
|
1371
|
+
const quotient = Math.floor(ScNumberHelper.divideByStep(value, step));
|
|
1372
|
+
return ScNumberHelper.round(value - quotient * step, Math.max(ScNumberHelper.getDecimalsCount(value), ScNumberHelper.getDecimalsCount(step)));
|
|
1373
|
+
}
|
|
1374
|
+
/**
|
|
1375
|
+
* Возвращает значение, приведённое к ближайшему кратному шагу, с точностью шага.
|
|
1376
|
+
*
|
|
1377
|
+
* @param value Значение.
|
|
1378
|
+
* @param step Шаг.
|
|
1379
|
+
*/
|
|
1380
|
+
static snapToStep(value, step) {
|
|
1381
|
+
return ScNumberHelper.multiplyByStep(Math.round(ScNumberHelper.divideByStep(value, step)), step);
|
|
1382
|
+
}
|
|
1383
|
+
/**
|
|
1384
|
+
* Возвращает признак того, что значение кратно шагу с учётом погрешности дробной арифметики.
|
|
1385
|
+
*
|
|
1386
|
+
* @param value Значение.
|
|
1387
|
+
* @param step Шаг.
|
|
1388
|
+
*/
|
|
1389
|
+
static isMultipleOf(value, step) {
|
|
1390
|
+
const quotient = value / step;
|
|
1391
|
+
return Math.abs(quotient - Math.round(quotient)) < ScNumberHelper.epsilon;
|
|
1392
|
+
}
|
|
1393
|
+
/**
|
|
1394
|
+
* Возвращает настройки вывода денежной суммы с числом знаков после запятой, равным точности валюты.
|
|
1395
|
+
*
|
|
1396
|
+
* @param precision Точность валюты суммы ({@link ScICurrency.precision}), по умолчанию точность рубля.
|
|
1397
|
+
*/
|
|
1398
|
+
static getMoneyFormat(precision = ScNumberHelper.rubPrecision) {
|
|
1399
|
+
const formatPrecision = precision ?? Number.POSITIVE_INFINITY;
|
|
1400
|
+
let format = ScNumberHelper.moneyFormatsByPrecision.get(formatPrecision);
|
|
1401
|
+
if (!format) {
|
|
1402
|
+
format = { precision: formatPrecision, decimalSeparator: ',', decimalMode: 'always', rounding: 'round' };
|
|
1403
|
+
ScNumberHelper.moneyFormatsByPrecision.set(formatPrecision, format);
|
|
1404
|
+
}
|
|
1405
|
+
return format;
|
|
1406
|
+
}
|
|
1407
|
+
/**
|
|
1408
|
+
* Возвращает денежную сумму в виде строки с разделителями разрядов и числом знаков после запятой, равным точности валюты.
|
|
1409
|
+
*
|
|
1410
|
+
* @param value Денежная сумма.
|
|
1411
|
+
* @param precision Точность валюты суммы ({@link ScICurrency.precision}), по умолчанию точность рубля.
|
|
1412
|
+
*/
|
|
1413
|
+
static formatMoney(value, precision = ScNumberHelper.rubPrecision) {
|
|
1414
|
+
return tuiFormatNumber(ScNumberHelper.roundMoney(value, precision), ScNumberHelper.getMoneyFormat(precision));
|
|
1415
|
+
}
|
|
1416
|
+
/**
|
|
1417
|
+
* Возвращает число, в котором отрицательный ноль заменён на ноль.
|
|
1418
|
+
*
|
|
1419
|
+
* @param value Число.
|
|
1420
|
+
*/
|
|
1421
|
+
static withoutNegativeZero(value) {
|
|
1422
|
+
return value === 0 ? 0 : value;
|
|
1423
|
+
}
|
|
1424
|
+
}
|
|
1425
|
+
|
|
1217
1426
|
/**
|
|
1218
1427
|
* Перечисление типов клиента.
|
|
1219
1428
|
*/
|
|
@@ -1284,10 +1493,10 @@ class ScUser {
|
|
|
1284
1493
|
return this.userType === ScUserType.guest;
|
|
1285
1494
|
}
|
|
1286
1495
|
/**
|
|
1287
|
-
*
|
|
1496
|
+
* Задолженность по модулю, округлённая до точности рубля.
|
|
1288
1497
|
*/
|
|
1289
1498
|
get absDebt() {
|
|
1290
|
-
return Math.abs(this.debt ?? 0);
|
|
1499
|
+
return ScNumberHelper.roundMoney(Math.abs(this.debt ?? 0));
|
|
1291
1500
|
}
|
|
1292
1501
|
}
|
|
1293
1502
|
|
|
@@ -1748,6 +1957,7 @@ class ScProduct extends ScCatalogItem {
|
|
|
1748
1957
|
else {
|
|
1749
1958
|
this.image = data.images?.find((img) => img.isDefault)?.image ?? data.properties?.image;
|
|
1750
1959
|
this.supplierSku = data.supplierSku;
|
|
1960
|
+
this.brand = data.brand;
|
|
1751
1961
|
this.cost = data.cost;
|
|
1752
1962
|
this.costRub = data.costRub;
|
|
1753
1963
|
this.costDate = data.costDate;
|
|
@@ -1771,19 +1981,19 @@ class ScProduct extends ScCatalogItem {
|
|
|
1771
1981
|
* Стоимость товара или услуги с валютой и единицей измерения.
|
|
1772
1982
|
*/
|
|
1773
1983
|
get costString() {
|
|
1774
|
-
return this.cost ? `${this.cost.
|
|
1984
|
+
return this.cost ? `${ScNumberHelper.formatMoney(this.cost, this.currency.precision)} ${this.currency.symbol} / ${this.unit.name}` : '';
|
|
1775
1985
|
}
|
|
1776
1986
|
/**
|
|
1777
1987
|
* Стоимость товара или услуги в рублях и с единицей измерения.
|
|
1778
1988
|
*/
|
|
1779
1989
|
get costRubString() {
|
|
1780
|
-
return this.costRub ? `${this.costRub
|
|
1990
|
+
return this.costRub ? `${ScNumberHelper.formatMoney(this.costRub)} ₽ / ${this.unit.name}` : '';
|
|
1781
1991
|
}
|
|
1782
1992
|
/**
|
|
1783
1993
|
* Стоимость товара или услуги с валютой и единицей измерения до применения скидки.
|
|
1784
1994
|
*/
|
|
1785
1995
|
get discountCostString() {
|
|
1786
|
-
return this.discount?.oldCost ? `${this.discount.oldCost.
|
|
1996
|
+
return this.discount?.oldCost ? `${ScNumberHelper.formatMoney(this.discount.oldCost, this.currency.precision)} ${this.currency.symbol} / ${this.unit.name}` : '';
|
|
1787
1997
|
}
|
|
1788
1998
|
/**
|
|
1789
1999
|
* Признак, что товар продаётся в рублях.
|
|
@@ -1897,25 +2107,25 @@ class ScOrderItem {
|
|
|
1897
2107
|
* @inheritDoc
|
|
1898
2108
|
*/
|
|
1899
2109
|
getCostPerItem() {
|
|
1900
|
-
return this.costOne > 0 ? `${this.costOne.
|
|
2110
|
+
return this.costOne > 0 ? `${ScNumberHelper.formatMoney(this.costOne, this.product.currency.precision)} ${this.product.currency.symbol}` : '-';
|
|
1901
2111
|
}
|
|
1902
2112
|
/**
|
|
1903
2113
|
* @inheritDoc
|
|
1904
2114
|
*/
|
|
1905
2115
|
getCostInCurrencyDescPerItem() {
|
|
1906
|
-
return this.costOne > 0 ? `${this.costOne.
|
|
2116
|
+
return this.costOne > 0 ? `${ScNumberHelper.formatMoney(this.costOne, this.product.currency.precision)} ${this.product.currency.symbol} / ${this.product.unit.name}` : '-';
|
|
1907
2117
|
}
|
|
1908
2118
|
/**
|
|
1909
2119
|
* @inheritDoc
|
|
1910
2120
|
*/
|
|
1911
2121
|
getCostInRubDescPerItem() {
|
|
1912
|
-
return this.costOneRub > 0 ? `${this.costOneRub
|
|
2122
|
+
return this.costOneRub > 0 ? `${ScNumberHelper.formatMoney(this.costOneRub)} ₽ / ${this.product.unit.name}` : '-';
|
|
1913
2123
|
}
|
|
1914
2124
|
/**
|
|
1915
2125
|
* @inheritDoc
|
|
1916
2126
|
*/
|
|
1917
2127
|
getCostRubStr() {
|
|
1918
|
-
return this.costRub > 0 ? `${this.costRub
|
|
2128
|
+
return this.costRub > 0 ? `${ScNumberHelper.formatMoney(this.costRub)} ₽` : '-';
|
|
1919
2129
|
}
|
|
1920
2130
|
/**
|
|
1921
2131
|
* @inheritDoc
|
|
@@ -6311,6 +6521,24 @@ var ScReclamationStatus;
|
|
|
6311
6521
|
ScReclamationStatus[ScReclamationStatus["completed"] = 4] = "completed";
|
|
6312
6522
|
})(ScReclamationStatus || (ScReclamationStatus = {}));
|
|
6313
6523
|
|
|
6524
|
+
/**
|
|
6525
|
+
* Возвращает загрузку точности рубля из справочника валют при старте приложения.
|
|
6526
|
+
*
|
|
6527
|
+
* @param referencesService Сервис справочников.
|
|
6528
|
+
*/
|
|
6529
|
+
function loadRubPrecision(referencesService) {
|
|
6530
|
+
return () => referencesService.currencies$.pipe(tap((currencies) => {
|
|
6531
|
+
ScNumberHelper.setRubPrecision(currencies.find((currency) => currency.signature === 'RUB')?.precision);
|
|
6532
|
+
}), ignoreElements(), catchError$1(() => EMPTY));
|
|
6533
|
+
}
|
|
6534
|
+
/**
|
|
6535
|
+
* Возвращает провайдеры загрузки точности рубля из справочника валют при старте приложения.
|
|
6536
|
+
* По этой точности {@link ScNumberHelper} округляет и выводит рублёвые суммы.
|
|
6537
|
+
*/
|
|
6538
|
+
function provideRubPrecision() {
|
|
6539
|
+
return makeEnvironmentProviders([{ provide: APP_INITIALIZER, multi: true, deps: [ScReferencesService], useFactory: loadRubPrecision }]);
|
|
6540
|
+
}
|
|
6541
|
+
|
|
6314
6542
|
/**
|
|
6315
6543
|
* Сервис для получения списков стран, регионов, городов.
|
|
6316
6544
|
*/
|
|
@@ -6733,8 +6961,8 @@ class ScDeliveryCost {
|
|
|
6733
6961
|
constructor(deliveryCost, deliveryDate) {
|
|
6734
6962
|
if (deliveryCost.freeShippingTerms?.minOrdersSum !== undefined && deliveryCost.freeShippingTerms.currentOrdersSum !== undefined) {
|
|
6735
6963
|
this.freeShippingTerms = { minOrdersSum: deliveryCost.freeShippingTerms.minOrdersSum, currentOrdersSum: deliveryCost.freeShippingTerms.currentOrdersSum };
|
|
6736
|
-
this.message = `Для оформления бесплатной доставки сумма заказов на ${deliveryDate} должна быть более ${this.freeShippingTerms.minOrdersSum
|
|
6737
|
-
Текущая сумма заказов составляет ${this.freeShippingTerms.currentOrdersSum
|
|
6964
|
+
this.message = `Для оформления бесплатной доставки сумма заказов на ${deliveryDate} должна быть более ${ScNumberHelper.formatMoney(this.freeShippingTerms.minOrdersSum)} руб.<br>
|
|
6965
|
+
Текущая сумма заказов составляет ${ScNumberHelper.formatMoney(this.freeShippingTerms.currentOrdersSum)} руб`;
|
|
6738
6966
|
}
|
|
6739
6967
|
}
|
|
6740
6968
|
}
|
|
@@ -6757,7 +6985,7 @@ class ScOrderBase {
|
|
|
6757
6985
|
* @inheritDoc
|
|
6758
6986
|
*/
|
|
6759
6987
|
getSumStr() {
|
|
6760
|
-
return this.sum && this.sum > 0 ? `${this.sum
|
|
6988
|
+
return this.sum && this.sum > 0 ? `${ScNumberHelper.formatMoney(this.sum)} ₽` : '-';
|
|
6761
6989
|
}
|
|
6762
6990
|
/**
|
|
6763
6991
|
* @inheritDoc
|
|
@@ -6792,7 +7020,7 @@ class ScOrderDraft {
|
|
|
6792
7020
|
* @inheritDoc
|
|
6793
7021
|
*/
|
|
6794
7022
|
getSumStr() {
|
|
6795
|
-
return this.sum > 0 ? `${this.sum
|
|
7023
|
+
return this.sum > 0 ? `${ScNumberHelper.formatMoney(this.sum)} ₽` : '-';
|
|
6796
7024
|
}
|
|
6797
7025
|
/**
|
|
6798
7026
|
* @inheritDoc
|
|
@@ -7196,7 +7424,7 @@ class ScOrderDraftsService {
|
|
|
7196
7424
|
}
|
|
7197
7425
|
const updatedDraft = new ScOrderDraft(currentDraft);
|
|
7198
7426
|
updatedDraft.products = remainingProducts;
|
|
7199
|
-
updatedDraft.sum = remainingProducts.reduce((sum, product) => sum + product.costRub, 0);
|
|
7427
|
+
updatedDraft.sum = ScNumberHelper.roundMoney(remainingProducts.reduce((sum, product) => sum + product.costRub, 0));
|
|
7200
7428
|
cachedItem.setValue(updatedDraft);
|
|
7201
7429
|
});
|
|
7202
7430
|
}
|
|
@@ -7948,7 +8176,6 @@ class SchemaOrgFactory {
|
|
|
7948
8176
|
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
7949
8177
|
const image = this.mediaImageTransformerPipe.transform(product?.getImagePreview?.() ?? product.image, true);
|
|
7950
8178
|
const description = product.properties?.description;
|
|
7951
|
-
const priceValidUntil = this.normalizePriceValidUntil(product.discount?.expiredAt);
|
|
7952
8179
|
return {
|
|
7953
8180
|
'@context': 'https://schema.org',
|
|
7954
8181
|
'@type': 'Product',
|
|
@@ -7956,21 +8183,16 @@ class SchemaOrgFactory {
|
|
|
7956
8183
|
name: product.name,
|
|
7957
8184
|
...(image && { image }),
|
|
7958
8185
|
...(description && { description: this.stripHtml(description) }),
|
|
7959
|
-
|
|
7960
|
-
|
|
7961
|
-
|
|
7962
|
-
|
|
7963
|
-
|
|
7964
|
-
|
|
7965
|
-
price: product.costRub,
|
|
7966
|
-
availability: this.getAvailability(product),
|
|
7967
|
-
itemCondition: 'https://schema.org/NewCondition',
|
|
7968
|
-
seller: {
|
|
7969
|
-
'@type': 'Organization',
|
|
7970
|
-
name: this.companyInfo.name,
|
|
8186
|
+
sku: product.code,
|
|
8187
|
+
...(product.supplierSku && { mpn: product.supplierSku }),
|
|
8188
|
+
...(product.brand && {
|
|
8189
|
+
brand: {
|
|
8190
|
+
'@type': 'Brand',
|
|
8191
|
+
name: product.brand,
|
|
7971
8192
|
},
|
|
7972
|
-
|
|
7973
|
-
|
|
8193
|
+
}),
|
|
8194
|
+
url: productUrl,
|
|
8195
|
+
offers: this.createOffer(product, productUrl),
|
|
7974
8196
|
};
|
|
7975
8197
|
}
|
|
7976
8198
|
/**
|
|
@@ -8054,6 +8276,7 @@ class SchemaOrgFactory {
|
|
|
8054
8276
|
// eslint-disable-next-line sonarjs/function-return-type
|
|
8055
8277
|
generateForOrganization() {
|
|
8056
8278
|
const postalAddress = this.createPostalAddress(this.companyInfo.address);
|
|
8279
|
+
const merchantReturnPolicy = this.createMerchantReturnPolicy();
|
|
8057
8280
|
return {
|
|
8058
8281
|
'@context': 'https://schema.org',
|
|
8059
8282
|
'@type': 'OnlineStore',
|
|
@@ -8083,6 +8306,13 @@ class SchemaOrgFactory {
|
|
|
8083
8306
|
address: warehouseAddress,
|
|
8084
8307
|
})),
|
|
8085
8308
|
}),
|
|
8309
|
+
...(merchantReturnPolicy && {
|
|
8310
|
+
// Тип возмещения Google принимает только в политике организации, в предложениях его нет.
|
|
8311
|
+
hasMerchantReturnPolicy: {
|
|
8312
|
+
...merchantReturnPolicy,
|
|
8313
|
+
refundType: 'https://schema.org/FullRefund',
|
|
8314
|
+
},
|
|
8315
|
+
}),
|
|
8086
8316
|
};
|
|
8087
8317
|
}
|
|
8088
8318
|
/**
|
|
@@ -8218,6 +8448,22 @@ class SchemaOrgFactory {
|
|
|
8218
8448
|
}
|
|
8219
8449
|
return contactPoints;
|
|
8220
8450
|
}
|
|
8451
|
+
/**
|
|
8452
|
+
* Формирует MerchantReturnPolicy по условиям возврата из данных о компании.
|
|
8453
|
+
*/
|
|
8454
|
+
createMerchantReturnPolicy() {
|
|
8455
|
+
if (!this.companyInfo.returnPolicy) {
|
|
8456
|
+
return undefined;
|
|
8457
|
+
}
|
|
8458
|
+
return {
|
|
8459
|
+
'@type': 'MerchantReturnPolicy',
|
|
8460
|
+
applicableCountry: 'RU',
|
|
8461
|
+
returnPolicyCategory: 'https://schema.org/MerchantReturnFiniteReturnWindow',
|
|
8462
|
+
merchantReturnDays: this.companyInfo.returnPolicy.returnDays,
|
|
8463
|
+
returnMethod: 'https://schema.org/ReturnInStore',
|
|
8464
|
+
returnFees: 'https://schema.org/FreeReturn',
|
|
8465
|
+
};
|
|
8466
|
+
}
|
|
8221
8467
|
/**
|
|
8222
8468
|
* Удаляет HTML-разметку из текста.
|
|
8223
8469
|
*
|
|
@@ -8311,6 +8557,30 @@ class SchemaOrgFactory {
|
|
|
8311
8557
|
const path = categoryPath.replace(':id', id);
|
|
8312
8558
|
return `${this.urls.siteUrl}${path}`;
|
|
8313
8559
|
}
|
|
8560
|
+
/**
|
|
8561
|
+
* Создаёт Offer о продаже товара.
|
|
8562
|
+
*
|
|
8563
|
+
* @param product Данные о продукте.
|
|
8564
|
+
* @param productUrl Полный URL страницы товара.
|
|
8565
|
+
*/
|
|
8566
|
+
createOffer(product, productUrl) {
|
|
8567
|
+
const priceValidUntil = this.normalizePriceValidUntil(product.discount?.expiredAt);
|
|
8568
|
+
const merchantReturnPolicy = this.createMerchantReturnPolicy();
|
|
8569
|
+
return {
|
|
8570
|
+
'@type': 'Offer',
|
|
8571
|
+
priceCurrency: 'RUB',
|
|
8572
|
+
...(priceValidUntil && { priceValidUntil }),
|
|
8573
|
+
price: product.costRub,
|
|
8574
|
+
availability: this.getAvailability(product),
|
|
8575
|
+
itemCondition: 'https://schema.org/NewCondition',
|
|
8576
|
+
seller: {
|
|
8577
|
+
'@type': 'Organization',
|
|
8578
|
+
name: this.companyInfo.name,
|
|
8579
|
+
},
|
|
8580
|
+
url: productUrl,
|
|
8581
|
+
...(merchantReturnPolicy && { hasMerchantReturnPolicy: merchantReturnPolicy }),
|
|
8582
|
+
};
|
|
8583
|
+
}
|
|
8314
8584
|
/**
|
|
8315
8585
|
* Создаёт элемент списка ItemList с кратким Product для страницы категории.
|
|
8316
8586
|
*
|
|
@@ -8323,7 +8593,6 @@ class SchemaOrgFactory {
|
|
|
8323
8593
|
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
8324
8594
|
const image = this.mediaImageTransformerPipe.transform(product?.getImagePreview?.() ?? product.image, true);
|
|
8325
8595
|
const description = product.seo?.description ?? product.properties?.description;
|
|
8326
|
-
const priceValidUntil = this.normalizePriceValidUntil(product.discount?.expiredAt);
|
|
8327
8596
|
return {
|
|
8328
8597
|
'@type': 'ListItem',
|
|
8329
8598
|
position,
|
|
@@ -8333,19 +8602,7 @@ class SchemaOrgFactory {
|
|
|
8333
8602
|
url: productUrl,
|
|
8334
8603
|
...(image && { image }),
|
|
8335
8604
|
...(description && { description: this.stripHtml(description) }),
|
|
8336
|
-
offers:
|
|
8337
|
-
'@type': 'Offer',
|
|
8338
|
-
priceCurrency: 'RUB',
|
|
8339
|
-
...(priceValidUntil && { priceValidUntil }),
|
|
8340
|
-
price: product.costRub,
|
|
8341
|
-
availability: this.getAvailability(product),
|
|
8342
|
-
itemCondition: 'https://schema.org/NewCondition',
|
|
8343
|
-
seller: {
|
|
8344
|
-
'@type': 'Organization',
|
|
8345
|
-
name: this.companyInfo.name,
|
|
8346
|
-
},
|
|
8347
|
-
url: productUrl,
|
|
8348
|
-
},
|
|
8605
|
+
offers: this.createOffer(product, productUrl),
|
|
8349
8606
|
},
|
|
8350
8607
|
};
|
|
8351
8608
|
}
|
|
@@ -9265,5 +9522,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
9265
9522
|
* Generated bundle index. Do not edit.
|
|
9266
9523
|
*/
|
|
9267
9524
|
|
|
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 };
|
|
9525
|
+
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, ScNumberHelper, 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, provideRubPrecision, provideSsrResponseCache, runningOnTerminalFactory, scGetCurrentRoute, scGetPageQueryParamChanges, scOrderIsLoaded, scParsePageQueryParam, searchTermFactory };
|
|
9269
9526
|
//# sourceMappingURL=snabcentr-client-core.mjs.map
|