@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.
@@ -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, makeEnvironmentProviders } from '@angular/core';
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
- * Округлённая задолженность. В шаблоне не определён {@link Math}.
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.toLocaleString()} ${this.currency.symbol} / ${this.unit.name}` : '';
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.toLocaleString()} ₽ / ${this.unit.name}` : '';
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.toLocaleString()} ${this.currency.symbol} / ${this.unit.name}` : '';
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.toLocaleString()} ${this.product.currency.symbol}` : '-';
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.toLocaleString()} ${this.product.currency.symbol} / ${this.product.unit.name}` : '-';
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.toLocaleString()} ₽ / ${this.product.unit.name}` : '-';
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.toLocaleString()} ₽` : '-';
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.toLocaleString()} руб.<br>
6737
- Текущая сумма заказов составляет ${this.freeShippingTerms.currentOrdersSum.toLocaleString()} руб`;
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.toLocaleString()} ₽` : '-';
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.toLocaleString()} ₽` : '-';
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
- mpn: product.code,
7960
- url: productUrl,
7961
- offers: {
7962
- '@type': 'Offer',
7963
- priceCurrency: 'RUB',
7964
- ...(priceValidUntil && { priceValidUntil }),
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
- url: productUrl,
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