< Summary

Information
Class: OzonOrdersWeb.WebServices.Transactions.Grid.Definitions.TransactionDefinitionCatalog
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/WebServices/Transactions/Grid/Definitions/TransactionDefinitionCatalog.cs
Line coverage
95%
Covered lines: 390
Uncovered lines: 17
Coverable lines: 407
Total lines: 439
Line coverage: 95.8%
Branch coverage
100%
Covered branches: 6
Total branches: 6
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.cctor()100%1195.8%
BySlug(...)100%44100%
ByType(...)100%22100%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/WebServices/Transactions/Grid/Definitions/TransactionDefinitionCatalog.cs

#LineLine coverage
 1using OzonDomains;
 2using OzonOrdersWeb.WebServices.Transactions.Grid.Commit;
 3
 4namespace OzonOrdersWeb.WebServices.Transactions.Grid.Definitions;
 5
 6/// <summary>
 7/// Дефолтные определения всех транзакций грида. Статусы/флаги повторяют <c>TransactionConfig</c> классических
 8/// контроллеров и <c>TransactionTransitionRuleService.BuildDefaultRules</c>; имена — человеческие, редактируются в адми
 9/// </summary>
 10public static class TransactionDefinitionCatalog
 11{
 12    public const string GroupPurchase = "Закупка";
 13    public const string GroupShipping = "Отгрузка";
 14    public const string GroupReturns = "Возвраты";
 15    public const string GroupWarehouse = "Склад";
 16    public const string GroupCancel = "Отмена";
 17    public const string GroupPrices = "Цены";
 18
 19    /// <summary>
 20    /// Общая таблица классических страниц (_TransactionTableBody) даёт одни и те же поля ввода на всех транзакциях:
 21    /// статус, поставщик, номер заказа поставщику, засыл, количество, цена закупки, вес, доп. расходы.
 22    /// </summary>
 123    private static readonly string[] BaseEditable = { "appStatusId", "supplierId", "orderNumberToSupplier", "zasyl", "qu
 24
 125    public static readonly IReadOnlyList<TransactionDefinition> All = new[]
 126    {
 127        new TransactionDefinition
 128        {
 129            Type = TransactionType.OrderedToSupplier,
 130            Slug = "order-to-supplier",
 131            PageCode = "Studio2.OrderToSupplierTransaction.CreateOrderToSupplierTransactionV2",
 132            LegacyEndpoint = "/Studio2/OrderToSupplierTransaction/CreateOrderToSupplierTransactionV2",
 133            Title = "Заказ поставщику",
 134            ShortName = "Заказ",
 135            Icon = "fas fa-shopping-cart",
 136            Color = "#198754",
 137            Group = GroupPurchase,
 138            DisplayOrder = 1,
 139            Hint = "Первый шаг: заказываем товар у поставщика. Уменьшение количества разбивает заказ, остаток уходит «К 
 140            TargetStatusName = "Заказан поставщику",
 141            ExtraStatusNames = new[] { "Заказан реализатору", "Отменен", "К отмене", "Не готов" },
 142            AllowedSourceStatuses = new[] { "Не указан", "Заказан поставщику", "Заказан реализатору", "К отмене" },
 143            SupportsQuantitySplit = true,
 144            ClearPurchasePriceOnLoad = true,
 145            RequiresPurchasePrice = true,
 146            OzonCancelPanel = true,
 147            ShipInOzon = true,
 148            SupplierOffers = true,
 149            SupplierCarts = true,
 150            ZeroQuantityPolicy = ZeroQuantityPolicy.ToCancellation,
 151            EditableFields = BaseEditable,
 152            Steps = TransactionCommitStepKeys.OrderToSupplier,
 053            CreateTransaction = (tm, o, u, d, c) => tm.CreateOrderToSupplierTransaction(o, u, d, c)
 154        },
 155        new TransactionDefinition
 156        {
 157            Type = TransactionType.OrderedToSeller,
 158            Slug = "order-to-seller",
 159            PageCode = "Studio2.OrderedToSellerTransaction.CreateOrderedToSellerTransaction",
 160            LegacyEndpoint = "/Studio2/OrderedToSellerTransaction/CreateOrderedToSellerTransaction",
 161            Title = "Заказ реализатору",
 162            ShortName = "Реализатору",
 163            Icon = "fas fa-handshake",
 164            Color = "#6c757d",
 165            Group = GroupPurchase,
 166            DisplayOrder = 2,
 167            Hint = "Заказ у реализатора (перепродавца), без разбиения количества.",
 168            TargetStatusName = "Заказан реализатору",
 169            ExtraStatusNames = new[] { "Отменен", "К отмене" },
 170            AllowedSourceStatuses = new[] { "Не указан", "Заказан поставщику", "Заказан реализатору" },
 171            UseStatusTransitions = false,
 172            ClearPurchasePriceOnLoad = true,
 173            RequiresPurchasePrice = true,
 174            PurchasePriceOptional = true,
 175            AutoFillPurchasePriceFromC0 = true,
 176            OzonCancelPanel = true,
 177            SupplierOffers = true,
 178            EditableFields = BaseEditable,
 179            Steps = TransactionCommitStepKeys.StatusOnlyWithOzonCancel,
 080            CreateTransaction = (tm, o, u, d, c) => tm.CreateOrderedToSellerTransaction(o, u, d, c)
 181        },
 182        new TransactionDefinition
 183        {
 184            Type = TransactionType.ShippedBySupplier,
 185            Slug = "supplier-receipt",
 186            PageCode = "Studio2.ShippedBySupplierTransaction.CreateShippedBySupplierTransaction",
 187            LegacyEndpoint = "/Studio2/ShippedBySupplierTransaction/CreateShippedBySupplierTransaction",
 188            Title = "Приход от поставщика",
 189            ShortName = "Приход",
 190            Icon = "fas fa-truck-loading",
 191            Color = "#0dcaf0",
 192            Group = GroupPurchase,
 193            DisplayOrder = 3,
 194            Hint = "Поставщик отгрузил товар: приходная накладная в 1С. Все заказы — от одного поставщика и на один скла
 195            TargetStatusName = "Отгружен поставщиком",
 196            AllowedSourceStatuses = new[] { "Заказан поставщику" },
 197            OneCMode = OneCMode.Optional,
 198            OneCDocument = OneCDocumentKind.Receipt,
 199            WarehouseMode = WarehouseMode.Mapping,
 1100            ZeroQuantityPolicy = ZeroQuantityPolicy.LostBySupplier,
 1101            ReceiptDocumentFields = true,
 1102            CountryAndGtdFields = true,
 1103            RequireSingleSupplierAndWarehouse = true,
 1104            EditableFields = BaseEditable.Concat(new[] { "country", "gtd" }).ToArray(),
 1105            Steps = TransactionCommitStepKeys.WithOneC,
 0106            CreateTransaction = (tm, o, u, d, c) => tm.CreateShippedBySupplierTransaction(o, u, d, c)
 1107        },
 1108        new TransactionDefinition
 1109        {
 1110            Type = TransactionType.ShippedToSeller,
 1111            Slug = "ship-to-seller",
 1112            PageCode = "Studio2.ShippedToSellerTransaction.CreateShippedToSellerTransaction",
 1113            LegacyEndpoint = "/Studio2/ShippedToSellerTransaction/CreateShippedToSellerTransaction",
 1114            Title = "Отгрузка реализатору",
 1115            ShortName = "Реализатору",
 1116            Icon = "fas fa-truck",
 1117            Color = "#ffc107",
 1118            Group = GroupShipping,
 1119            DisplayOrder = 1,
 1120            Hint = "Перемещение запасов в 1С на склад реализатора. Количество 0 — транзит «Утерян реализатором».",
 1121            TargetStatusName = "Отгружен реализатором",
 1122            AllowedSourceStatuses = new[] { "Заказан реализатору" },
 1123            OneCMode = OneCMode.Optional,
 1124            OneCDocument = OneCDocumentKind.TransferByWarehouses,
 1125            WarehouseMode = WarehouseMode.Mapping,
 1126            ZeroQuantityPolicy = ZeroQuantityPolicy.LostByCommissioner,
 1127            EditableFields = BaseEditable.Concat(new[] { "manufacturer" }).ToArray(),
 1128            Steps = TransactionCommitStepKeys.WithOneC,
 0129            CreateTransaction = (tm, o, u, d, c) => tm.CreateShippedToSellerTransaction(o, u, d, c)
 1130        },
 1131        new TransactionDefinition
 1132        {
 1133            Type = TransactionType.ShippedToCommissioner,
 1134            Slug = "ship-to-commissioner",
 1135            PageCode = "Studio2.ShippedToCommissionerTransaction.CreateShippedToCommissionerTransaction",
 1136            LegacyEndpoint = "/Studio2/ShippedToCommissionerTransaction/CreateShippedToCommissionerTransaction",
 1137            Title = "Отгрузка комиссионеру",
 1138            ShortName = "Комиссионеру",
 1139            Icon = "fas fa-dolly",
 1140            Color = "#0d6efd",
 1141            Group = GroupShipping,
 1142            DisplayOrder = 2,
 1143            Hint = "Перемещение на склад комиссионера по маппингу. Заказы уже «Отгружен реализатором» получают только ст
 1144            TargetStatusName = "Отгружен комиссионеру",
 1145            StatusOnlyWhenAlreadyIn = new[] { "Отгружен реализатором" },
 1146            OneCMode = OneCMode.Optional,
 1147            OneCDocument = OneCDocumentKind.TransferReversed,
 1148            WarehouseMode = WarehouseMode.Mapping,
 1149            ExpenseDocumentFields = false,
 1150            EditableFields = BaseEditable,
 1151            Steps = TransactionCommitStepKeys.WithOneC,
 0152            CreateTransaction = (tm, o, u, d, c) => tm.CreateShippedToCommissionerTransaction(o, u, d, c)
 1153        },
 1154        new TransactionDefinition
 1155        {
 1156            Type = TransactionType.AcceptedToWarehouse,
 1157            Slug = "warehouse-accept",
 1158            PageCode = "Studio2.AcceptedToWarehouseTransaction.AcceptedToWarehouseTransaction",
 1159            LegacyEndpoint = "/Studio2/AcceptedToWarehouseTransaction/AcceptedToWarehouseTransaction",
 1160            Title = "Приёмка на склад",
 1161            ShortName = "Приёмка",
 1162            Icon = "fas fa-warehouse",
 1163            Color = "#0dcaf0",
 1164            Group = GroupWarehouse,
 1165            DisplayOrder = 1,
 1166            Hint = "Физический приём товара на склад. Без документов 1С.",
 1167            TargetStatusName = "ПринятНаСкладе",
 1168            ExtraStatusNames = new[] { "Отменен" },
 1169            AllowedSourceStatuses = new[] { "Заказан поставщику", "Не указан", "Отгружен поставщиком" },
 1170            UseStatusTransitions = false,
 1171            OzonCancelPanel = true,
 1172            EditableFields = BaseEditable,
 1173            Steps = TransactionCommitStepKeys.StatusOnlyWithOzonCancel,
 0174            CreateTransaction = (tm, o, u, d, c) => tm.AcceptedToWarehouseTransaction(o, u, d, c)
 1175        },
 1176        new TransactionDefinition
 1177        {
 1178            Type = TransactionType.ShippedToClient,
 1179            Slug = "ship-to-client",
 1180            PageCode = "Studio2.ShippedToClientTransaction.CreateShippedToClientTransaction",
 1181            LegacyEndpoint = "/Studio2/ShippedToClientTransaction/CreateShippedToClientTransaction",
 1182            Title = "Отгрузка покупателю",
 1183            ShortName = "Покупателю",
 1184            Icon = "fas fa-shipping-fast",
 1185            Color = "#198754",
 1186            Group = GroupShipping,
 1187            DisplayOrder = 3,
 1188            Hint = "Финальная отгрузка: расходная накладная в 1С по договору клиента.",
 1189            TargetStatusName = "Отгружен клиенту",
 1190            AllowedSourceStatuses = new[] { "Заказан реализатору" },
 1191            OneCMode = OneCMode.Optional,
 1192            OneCDocument = OneCDocumentKind.Expense,
 1193            WarehouseMode = WarehouseMode.Mapping,
 1194            ExpenseDocumentFields = true,
 1195            SupportsBulkFromFile = true,
 1196            EditableFields = BaseEditable,
 1197            Steps = TransactionCommitStepKeys.WithOneC,
 0198            CreateTransaction = (tm, o, u, d, c) => tm.CreateShippedToClientTransaction(o, u, d, c)
 1199        },
 1200        new TransactionDefinition
 1201        {
 1202            Type = TransactionType.ToCancellation,
 1203            Slug = "to-cancellation",
 1204            PageCode = "Studio2.ToCancellationTransaction.CreateToCancellationTransaction",
 1205            LegacyEndpoint = "/Studio2/ToCancellationTransaction/CreateToCancellationTransaction",
 1206            Title = "В отмену",
 1207            ShortName = "В отмену",
 1208            Icon = "fas fa-hourglass-half",
 1209            Color = "#6c757d",
 1210            Group = GroupCancel,
 1211            DisplayOrder = 1,
 1212            Hint = "Промежуточный статус перед окончательной отменой.",
 1213            TargetStatusName = "К отмене",
 1214            ExtraStatusNames = new[] { "Отменен" },
 1215            AllowedSourceStatuses = new[] { "Заказан поставщику", "Заказан реализатору" },
 1216            OzonCancelPanel = true,
 1217            EditableFields = BaseEditable,
 1218            Steps = TransactionCommitStepKeys.StatusOnlyWithOzonCancel,
 0219            CreateTransaction = (tm, o, u, d, c) => tm.CreateToCancellationTransaction(o, u, d, c)
 1220        },
 1221        new TransactionDefinition
 1222        {
 1223            Type = TransactionType.Cancelled,
 1224            Slug = "cancel",
 1225            PageCode = "Studio2.CancelledTransaction.CreateCancelledTransaction",
 1226            LegacyEndpoint = "/Studio2/CancelledTransaction/CreateCancelledTransaction",
 1227            Title = "Отмена заказа",
 1228            ShortName = "Отмена",
 1229            Icon = "fas fa-times-circle",
 1230            Color = "#dc3545",
 1231            Group = GroupCancel,
 1232            DisplayOrder = 2,
 1233            Hint = "Отмена отправления через Ozon API до смены статуса; ошибка API останавливает проведение.",
 1234            TargetStatusName = "Отменен",
 1235            AllowedSourceStatuses = new[] { "Заказан поставщику", "К отмене" },
 1236            OzonCancelPanel = true,
 1237            OzonCancelPreselected = true,
 1238            ProcessingGroupOpen = true,
 1239            EditableFields = BaseEditable,
 1240            Steps = TransactionCommitStepKeys.StatusOnlyWithOzonCancel,
 0241            CreateTransaction = (tm, o, u, d, c) => tm.CreateCancelledTransaction(o, u, d, c)
 1242        },
 1243        new TransactionDefinition
 1244        {
 1245            Type = TransactionType.CustomerReturn,
 1246            Slug = "customer-return",
 1247            PageCode = "Studio2.CustomerReturnTransaction.CreateCustomerReturnTransaction",
 1248            LegacyEndpoint = "/Studio2/CustomerReturnTransaction/CreateCustomerReturnTransaction",
 1249            Title = "Возврат от покупателя",
 1250            ShortName = "Возврат",
 1251            Icon = "fas fa-undo",
 1252            Color = "#ffc107",
 1253            Group = GroupReturns,
 1254            DisplayOrder = 1,
 1255            Hint = "Перемещение в 1С на склад-получатель (свой у каждого заказа). Режим «из файла» — только статус.",
 1256            TargetStatusName = "Возврат покупателя",
 1257            AllowedSourceStatuses = new[] { "Отгружен клиенту", "Отгружен комиссионеру", "Отменен", "Отменён" },
 1258            UseStatusTransitions = false,
 1259            OneCMode = OneCMode.Optional,
 1260            OneCDocument = OneCDocumentKind.Transfer,
 1261            WarehouseMode = WarehouseMode.PerOrderRecipient,
 1262            SupportsBulkFromFile = true,
 1263            OzonCancelPanel = true,
 1264            EditableFields = BaseEditable.Concat(new[] { "recipientWarehouse" }).ToArray(),
 1265            Steps = TransactionCommitStepKeys.WithOneC,
 0266            CreateTransaction = (tm, o, u, d, c) => tm.CreateCustomerReturnTransaction(o, u, d, c)
 1267        },
 1268        new TransactionDefinition
 1269        {
 1270            Type = TransactionType.ReturnToSupplier,
 1271            Slug = "return-to-supplier",
 1272            PageCode = "Studio2.ReturnToSupplierTransaction.CreateReturnToSupplierTransaction",
 1273            LegacyEndpoint = "/Studio2/ReturnToSupplierTransaction/CreateReturnToSupplierTransaction",
 1274            Title = "Возврат поставщику",
 1275            ShortName = "Поставщику",
 1276            Icon = "fas fa-reply-all",
 1277            Color = "#ffc107",
 1278            Group = GroupReturns,
 1279            DisplayOrder = 2,
 1280            Hint = "Возврат брака: перемещение в 1С со склада отправителя на склад поставщика, дефицит — черновик.",
 1281            TargetStatusName = "Возвращено поставщику",
 1282            AllowedSourceStatuses = new[] { "Заказан поставщику", "ПринятНаСкладе", "Возврат поставщику", "Возврат покуп
 1283            OneCMode = OneCMode.Required,
 1284            OneCDocument = OneCDocumentKind.Transfer,
 1285            WarehouseMode = WarehouseMode.PerOrderBoth,
 1286            CheckStockBefore1C = true,
 1287            OzonCancelPanel = true,
 1288            EditableFields = BaseEditable.Concat(new[] { "senderWarehouse", "recipientWarehouse" }).ToArray(),
 1289            Steps = TransactionCommitStepKeys.WithOneC,
 0290            CreateTransaction = (tm, o, u, d, c) => tm.CreateReturnToSupplierTransaction(o, u, d, c)
 1291        },
 1292        new TransactionDefinition
 1293        {
 1294            Type = TransactionType.ReturnToWarehouse,
 1295            Slug = "return-to-warehouse",
 1296            PageCode = "Studio2.ReturnToWarehouseTransaction.CreateReturnToWarehouseTransaction",
 1297            LegacyEndpoint = "/Studio2/ReturnToWarehouseTransaction/CreateReturnToWarehouseTransaction",
 1298            Title = "Возврат на склад",
 1299            ShortName = "На склад",
 1300            Icon = "fas fa-undo-alt",
 1301            Color = "#0dcaf0",
 1302            Group = GroupReturns,
 1303            DisplayOrder = 3,
 1304            Hint = "Возврат неотгруженного товара. Требуется GUID операции 1С в истории заказа.",
 1305            TargetStatusName = "Возврат на склад",
 1306            AllowedSourceStatuses = new[] { "ПринятНаСкладе", "Отгружен поставщиком", "Отгружен реализатором" },
 1307            OneCMode = OneCMode.Required,
 1308            OneCDocument = OneCDocumentKind.TransferReversed,
 1309            WarehouseMode = WarehouseMode.Mapping,
 1310            RequirePriorOneCGuid = true,
 1311            EditableFields = BaseEditable,
 1312            Steps = TransactionCommitStepKeys.WithOneC,
 0313            CreateTransaction = (tm, o, u, d, c) => tm.CreateReturnToWarehouseTransaction(o, u, d, c)
 1314        },
 1315        new TransactionDefinition
 1316        {
 1317            Type = TransactionType.ReturnTransfer,
 1318            Slug = "return-transfer",
 1319            PageCode = "Studio2.ReturnTransferTransaction.CreateReturnTransferTransaction",
 1320            LegacyEndpoint = "/Studio2/ReturnTransferTransaction/CreateReturnTransferTransaction",
 1321            Title = "Перемещение возврата",
 1322            ShortName = "Перемещение",
 1323            Icon = "fas fa-forward",
 1324            Color = "#0d6efd",
 1325            Group = GroupReturns,
 1326            DisplayOrder = 4,
 1327            Hint = "Дальнейшая обработка возврата покупателя.",
 1328            TargetStatusName = "Перемещение",
 1329            AllowedSourceStatuses = new[] { "Возврат покупателя" },
 1330            UseStatusTransitions = false,
 1331            EditableFields = BaseEditable,
 1332            Steps = TransactionCommitStepKeys.StatusOnly,
 0333            CreateTransaction = (tm, o, u, d, c) => tm.CreateReturnTransferTransaction(o, u, d, c)
 1334        },
 1335        new TransactionDefinition
 1336        {
 1337            Type = TransactionType.LostByCommissioner,
 1338            Slug = "lost-by-commissioner",
 1339            PageCode = "Studio2.LostByCommissionerTransaction.CreateLostByCommissionerTransaction",
 1340            LegacyEndpoint = "/Studio2/LostByCommissionerTransaction/CreateLostByCommissionerTransaction",
 1341            Title = "Утеря у комиссионера",
 1342            ShortName = "Утеря",
 1343            Icon = "fas fa-question-circle",
 1344            Color = "#dc3545",
 1345            Group = GroupReturns,
 1346            DisplayOrder = 5,
 1347            Hint = "Перемещение на транзитный склад утерь. Заказы без остатка в WarehouseStock пропускаются.",
 1348            TargetStatusName = "Утерян реализатором",
 1349            AllowedSourceStatuses = new[] { "Отгружен комиссионеру" },
 1350            OneCMode = OneCMode.Optional,
 1351            OneCDocument = OneCDocumentKind.Transfer,
 1352            WarehouseMode = WarehouseMode.Mapping,
 1353            RequireWsStock = true,
 1354            EditableFields = BaseEditable.Concat(new[] { "manufacturer" }).ToArray(),
 1355            Steps = TransactionCommitStepKeys.WithOneC,
 0356            CreateTransaction = (tm, o, u, d, c) => tm.CreateLostByCommissionerTransaction(o, u, d, c)
 1357        },
 1358        new TransactionDefinition
 1359        {
 1360            Type = TransactionType.WarehouseChange,
 1361            Slug = "warehouse-change",
 1362            PageCode = "Studio2.WarehouseChangeTransaction.CreateWarehouseChangeTransaction",
 1363            LegacyEndpoint = "/Studio2/WarehouseChangeTransaction/CreateWarehouseChangeTransaction",
 1364            Title = "Смена склада",
 1365            ShortName = "Склад",
 1366            Icon = "fas fa-edit",
 1367            Color = "#0d6efd",
 1368            Group = GroupWarehouse,
 1369            DisplayOrder = 2,
 1370            Hint = "Меняет склад отгрузки заказа, основной статус не меняется.",
 1371            TargetStatusName = null,
 1372            DisallowMarketplaceStatuses = Array.Empty<string>(),
 1373            OzonCancelPanel = true,
 1374            EditableFields = BaseEditable.Concat(new[] { "shipmentWarehouseId" }).ToArray(),
 1375            Steps = TransactionCommitStepKeys.StatusOnlyWithOzonCancel,
 0376            CreateTransaction = (tm, o, u, d, c) => tm.CreateWarehouseChangeTransaction(o, u, d, c)
 1377        },
 1378        new TransactionDefinition
 1379        {
 1380            Type = TransactionType.WarehouseTransfer,
 1381            Slug = "warehouse-transfer",
 1382            PageCode = "Studio2.WarehouseTransferTransaction.CreateWarehouseTransferTransaction",
 1383            LegacyEndpoint = "/Studio2/WarehouseTransferTransaction/CreateWarehouseTransferTransaction",
 1384            Title = "Перемещение между складами",
 1385            ShortName = "Перемещение",
 1386            Icon = "fas fa-exchange-alt",
 1387            Color = "#0d6efd",
 1388            Group = GroupWarehouse,
 1389            DisplayOrder = 3,
 1390            Hint = "Перемещение в 1С: отправитель и получатель на весь документ. Не-администраторам отправитель подставл
 1391            TargetStatusName = "Перемещен между складами",
 1392            OneCMode = OneCMode.Optional,
 1393            OneCDocument = OneCDocumentKind.Transfer,
 1394            WarehouseMode = WarehouseMode.GlobalPair,
 1395            CheckStockBefore1C = true,
 1396            EditableFields = BaseEditable,
 1397            Steps = TransactionCommitStepKeys.WithOneC,
 0398            CreateTransaction = (tm, o, u, d, c) => tm.CreateWarehouseTransferTransaction(o, u, d, c)
 1399        },
 1400        new TransactionDefinition
 1401        {
 1402            Type = TransactionType.Percentage,
 1403            Slug = "percentage",
 1404            PageCode = "Studio2.Percentage.Percentage",
 1405            LegacyEndpoint = "/Studio2/Percentage/Percentage",
 1406            Title = "Проценка",
 1407            ShortName = "Проценка",
 1408            Icon = "fas fa-percent",
 1409            Color = "#6f42c1",
 1410            Group = GroupPrices,
 1411            DisplayOrder = 1,
 1412            Hint = "Правка цен и закупки по отчёту без смены статуса.",
 1413            TargetStatusName = null,
 1414            UseStatusTransitions = false,
 1415            DisallowMarketplaceStatuses = Array.Empty<string>(),
 1416            PriceEditingOnly = true,
 1417            SupplierOffers = true,
 1418            EditableFields = new[] { "supplierId", "orderNumberToSupplier", "zasyl", "quantity", "purchasePrice", "weigh
 1419            Steps = TransactionCommitStepKeys.Percentage,
 0420            CreateTransaction = (tm, o, u, d, c) => tm.CreatePercentageTransaction(o, u, d, c)
 1421        }
 1422    };
 423
 1424    private static readonly IReadOnlyDictionary<string, TransactionDefinition> BySlugMap =
 18425        All.ToDictionary(d => d.Slug, StringComparer.OrdinalIgnoreCase);
 426
 1427    private static readonly IReadOnlyDictionary<TransactionType, TransactionDefinition> ByTypeMap =
 18428        All.ToDictionary(d => d.Type);
 429
 430    public static TransactionDefinition? BySlug(string? slug)
 10431        => slug != null && BySlugMap.TryGetValue(slug, out var d) ? d : null;
 432
 433    public static TransactionDefinition? ByType(TransactionType type)
 3434        => ByTypeMap.TryGetValue(type, out var d) ? d : null;
 435
 436    /// <summary>Типы без страницы проведения — служебные значения enum.</summary>
 1437    public static readonly IReadOnlySet<TransactionType> ServiceTypes =
 1438        new HashSet<TransactionType> { TransactionType.All, TransactionType.ReceiptNote };
 439}