< Summary

Information
Class: OzonRepositories.Migrations.AddBitrixStockReportTables
Assembly: OzonRepositories
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonRepositories/Migrations/20260908110200_AddBitrixStockReportTables.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 266
Coverable lines: 266
Total lines: 309
Line coverage: 0%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
Up(...)100%210%
Down(...)100%210%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/OzonRepositories/Migrations/20260908110200_AddBitrixStockReportTables.cs

#LineLine coverage
 1using Microsoft.EntityFrameworkCore.Infrastructure;
 2using Microsoft.EntityFrameworkCore.Migrations;
 3
 4#nullable disable
 5
 6namespace OzonRepositories.Migrations
 7{
 8    /// <summary>
 9    /// Таблицы отчётов синхронизации остатков Битрикса. В EF-модель они не входят —
 10    /// код работает с ними сырым SQL, — и до этой миграции создавались прямо в рантайме
 11    /// сервисами BitrixStockSyncReportService, BitrixStockSyncApplyArticleLogService и
 12    /// BitrixStockSyncPresetService: CREATE TABLE IF NOT EXISTS плюс около сорока
 13    /// ALTER TABLE ... ADD COLUMN, накопленных за время развития отчётов.
 14    ///
 15    /// DDL здесь — итоговое состояние этих таблиц, снятое с боевой БД. CREATE TABLE
 16    /// IF NOT EXISTS делает миграцию безопасной для баз, где таблицы уже есть.
 17    /// </summary>
 18    [DbContext(typeof(Context.ApplicationDbContext))]
 19    [Migration("20260908110200_AddBitrixStockReportTables")]
 20    public partial class AddBitrixStockReportTables : Migration
 21    {
 22        /// <inheritdoc />
 23        protected override void Up(MigrationBuilder migrationBuilder)
 24        {
 025            migrationBuilder.Sql(@"
 026CREATE TABLE IF NOT EXISTS `BitrixStockExceptionArticles` (
 027  `Id` int(11) NOT NULL AUTO_INCREMENT,
 028  `Article` varchar(255) NOT NULL,
 029  `Comment` varchar(500) DEFAULT NULL,
 030  `SkipStock` tinyint(1) NOT NULL DEFAULT 1,
 031  `SkipPrice` tinyint(1) NOT NULL DEFAULT 1,
 032  `IsActive` tinyint(1) NOT NULL DEFAULT 1,
 033  `CreatedAt` datetime(6) NOT NULL,
 034  `UpdatedAt` datetime(6) NOT NULL,
 035  `CreatedBy` varchar(255) DEFAULT NULL,
 036  PRIMARY KEY (`Id`),
 037  UNIQUE KEY `uk_bsea_article` (`Article`),
 038  KEY `idx_bsea_active` (`IsActive`)
 039) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
 040");
 41
 042            migrationBuilder.Sql(@"
 043CREATE TABLE IF NOT EXISTS `BitrixStockExceptionClientPrices` (
 044  `Id` int(11) NOT NULL AUTO_INCREMENT,
 045  `Article` varchar(255) NOT NULL,
 046  `OzonClientId` int(11) NOT NULL,
 047  `PriceMode` enum('standard','skip','fixed') NOT NULL DEFAULT 'standard',
 048  `FixedPrice` decimal(10,2) DEFAULT NULL,
 049  `FixedOldPrice` decimal(10,2) DEFAULT NULL,
 050  `Comment` varchar(500) DEFAULT NULL,
 051  `IsActive` tinyint(1) NOT NULL DEFAULT 1,
 052  `CreatedAt` datetime(6) NOT NULL,
 053  `UpdatedAt` datetime(6) NOT NULL,
 054  `CreatedBy` varchar(255) DEFAULT NULL,
 055  PRIMARY KEY (`Id`),
 056  UNIQUE KEY `uk_bsecp_article_client` (`Article`,`OzonClientId`),
 057  KEY `idx_bsecp_article` (`Article`),
 058  KEY `idx_bsecp_client` (`OzonClientId`)
 059) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
 060");
 61
 062            migrationBuilder.Sql(@"
 063CREATE TABLE IF NOT EXISTS `BitrixStockExceptionStockRules` (
 064  `Id` int(11) NOT NULL AUTO_INCREMENT,
 065  `Article` varchar(255) NOT NULL,
 066  `OzonClientId` int(11) DEFAULT NULL,
 067  `StockMode` enum('standard','skip') NOT NULL DEFAULT 'skip',
 068  `Comment` varchar(500) DEFAULT NULL,
 069  `IsActive` tinyint(1) NOT NULL DEFAULT 1,
 070  `CreatedAt` datetime(6) NOT NULL,
 071  `UpdatedAt` datetime(6) NOT NULL,
 072  `CreatedBy` varchar(255) DEFAULT NULL,
 073  PRIMARY KEY (`Id`),
 074  KEY `idx_bsesr_article` (`Article`),
 075  KEY `idx_bsesr_client` (`OzonClientId`)
 076) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
 077");
 78
 079            migrationBuilder.Sql(@"
 080CREATE TABLE IF NOT EXISTS `BitrixStockReserveStatusSettings` (
 081  `Id` int(11) NOT NULL AUTO_INCREMENT,
 082  `StatusName` varchar(100) NOT NULL,
 083  `IsDefault` tinyint(1) NOT NULL DEFAULT 0,
 084  `SortOrder` int(11) NOT NULL DEFAULT 0,
 085  `UpdatedAtUtc` datetime(6) NOT NULL DEFAULT current_timestamp(6),
 086  PRIMARY KEY (`Id`),
 087  UNIQUE KEY `UX_BitrixStockReserveStatusSettings_StatusName` (`StatusName`)
 088) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
 089");
 90
 091            migrationBuilder.Sql(@"
 092CREATE TABLE IF NOT EXISTS `BitrixStockSyncApplyArticleLog` (
 093  `Id` bigint(20) NOT NULL AUTO_INCREMENT,
 094  `ReportId` varchar(80) NOT NULL,
 095  `JobId` varchar(80) NOT NULL,
 096  `AppliedAtUtc` datetime(6) NOT NULL,
 097  `Article` varchar(255) NOT NULL,
 098  `OneCStore` varchar(120) NOT NULL,
 099  `OneCQty` int(11) NOT NULL,
 0100  `Client1Id` int(11) DEFAULT NULL,
 0101  `Client1Name` varchar(255) DEFAULT NULL,
 0102  `Client1QtyBefore` int(11) DEFAULT NULL,
 0103  `Client1QtyAfter` int(11) DEFAULT NULL,
 0104  `Client1WasArchived` tinyint(1) DEFAULT NULL,
 0105  `Client1ActionCode` varchar(50) DEFAULT NULL,
 0106  `Client1ActionLabel` text DEFAULT NULL,
 0107  `Client2Id` int(11) DEFAULT NULL,
 0108  `Client2Name` varchar(255) DEFAULT NULL,
 0109  `Client2QtyBefore` int(11) DEFAULT NULL,
 0110  `Client2QtyAfter` int(11) DEFAULT NULL,
 0111  `Client2WasArchived` tinyint(1) DEFAULT NULL,
 0112  `Client2ActionCode` varchar(50) DEFAULT NULL,
 0113  `Client2ActionLabel` text DEFAULT NULL,
 0114  `Summary` text DEFAULT NULL,
 0115  PRIMARY KEY (`Id`),
 0116  KEY `IX_ApplyArticleLog_ReportId` (`ReportId`),
 0117  KEY `IX_ApplyArticleLog_JobId` (`JobId`),
 0118  KEY `IX_ApplyArticleLog_Article` (`Article`)
 0119) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
 0120");
 121
 0122            migrationBuilder.Sql(@"
 0123CREATE TABLE IF NOT EXISTS `BitrixStockSyncPresets` (
 0124  `Id` int(11) NOT NULL AUTO_INCREMENT,
 0125  `Name` varchar(200) NOT NULL,
 0126  `OzonClientId` int(11) NOT NULL,
 0127  `OzonClientName` varchar(255) NOT NULL,
 0128  `ArticleFilter` varchar(255) DEFAULT NULL,
 0129  `SelectedStoresJson` text NOT NULL,
 0130  `DisabledWarehouseMappingIdsJson` text DEFAULT NULL,
 0131  `OzonClientsJson` text DEFAULT NULL,
 0132  `StageSettingsJson` text DEFAULT NULL,
 0133  `CreatedAt` datetime(6) NOT NULL,
 0134  `UpdatedAt` datetime(6) NOT NULL,
 0135  `CreatedBy` varchar(255) DEFAULT NULL,
 0136  PRIMARY KEY (`Id`),
 0137  KEY `IX_BitrixSyncPresets_OzonClientId` (`OzonClientId`)
 0138) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
 0139");
 140
 0141            migrationBuilder.Sql(@"
 0142CREATE TABLE IF NOT EXISTS `BitrixStockSyncReports` (
 0143  `ReportId` varchar(80) NOT NULL,
 0144  `GeneratedAtUtc` datetime(6) NOT NULL,
 0145  `CompletedAtUtc` datetime(6) DEFAULT NULL,
 0146  `OzonClientId` int(11) NOT NULL,
 0147  `OzonClientName` varchar(255) NOT NULL,
 0148  `Status` varchar(32) NOT NULL,
 0149  `Warning` text DEFAULT NULL,
 0150  `LogText` longtext DEFAULT NULL,
 0151  `ProductsScanned` int(11) NOT NULL DEFAULT 0,
 0152  `ProductsInReport` int(11) NOT NULL DEFAULT 0,
 0153  `WarehouseLinesTotal` int(11) NOT NULL DEFAULT 0,
 0154  `MatchCount` int(11) NOT NULL DEFAULT 0,
 0155  `PushCount` int(11) NOT NULL DEFAULT 0,
 0156  `DecreaseCount` int(11) NOT NULL DEFAULT 0,
 0157  `ClearCount` int(11) NOT NULL DEFAULT 0,
 0158  `SkipCount` int(11) NOT NULL DEFAULT 0,
 0159  `SelectedStoresJson` varchar(512) DEFAULT NULL,
 0160  `SourceArticleFilter` varchar(255) DEFAULT NULL,
 0161  `OzonAppliedSuccessCount` int(11) NOT NULL DEFAULT 0,
 0162  `OzonApplyFailedCount` int(11) NOT NULL DEFAULT 0,
 0163  `OzonApplyLastAtUtc` datetime(6) DEFAULT NULL,
 0164  `NotFoundCount` int(11) NOT NULL DEFAULT 0,
 0165  `MultiClientIdsJson` varchar(512) DEFAULT NULL,
 0166  `OzonCleanupSuccessCount` int(11) NOT NULL DEFAULT 0,
 0167  `OzonCleanupFailedCount` int(11) NOT NULL DEFAULT 0,
 0168  `OzonCleanupLastAtUtc` datetime(6) DEFAULT NULL,
 0169  `PriceSettingsJson` varchar(500) DEFAULT NULL,
 0170  `OzonOrphanLastAtUtc` datetime(6) DEFAULT NULL,
 0171  PRIMARY KEY (`ReportId`),
 0172  KEY `IX_Reports_Generated` (`GeneratedAtUtc` DESC),
 0173  KEY `IX_Reports_Status_Generated` (`Status`,`GeneratedAtUtc` DESC),
 0174  KEY `IX_Reports_Client_Generated` (`OzonClientId`,`GeneratedAtUtc` DESC)
 0175) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
 0176");
 177
 0178            migrationBuilder.Sql(@"
 0179CREATE TABLE IF NOT EXISTS `BitrixStockSyncReportLines` (
 0180  `Id` bigint(20) NOT NULL AUTO_INCREMENT,
 0181  `ReportId` varchar(80) NOT NULL,
 0182  `ProductId` int(11) NOT NULL,
 0183  `Article` varchar(255) NOT NULL,
 0184  `OfferId` varchar(255) DEFAULT NULL,
 0185  `OneCStore` varchar(120) NOT NULL,
 0186  `OzonWarehouseName` varchar(255) NOT NULL,
 0187  `OzonWarehouseId` bigint(20) NOT NULL,
 0188  `MappingDescription` text NOT NULL,
 0189  `OneCQty` int(11) NOT NULL,
 0190  `OzonQty` int(11) NOT NULL,
 0191  `Delta` int(11) NOT NULL,
 0192  `Action` varchar(24) NOT NULL,
 0193  `ActionLabel` varchar(50) NOT NULL,
 0194  `ActionIcon` varchar(20) NOT NULL,
 0195  `RowClass` varchar(50) NOT NULL,
 0196  `Note` text DEFAULT NULL,
 0197  `OzonProductId` bigint(20) DEFAULT NULL,
 0198  `OzonApplyStatus` varchar(24) DEFAULT NULL,
 0199  `OzonAppliedUtc` datetime(6) DEFAULT NULL,
 0200  `OzonApplyError` text DEFAULT NULL,
 0201  `OzonClientId` int(11) NOT NULL DEFAULT 0,
 0202  `OzonClientName` varchar(255) NOT NULL DEFAULT '',
 0203  `CreatedAtUtc` datetime(6) NOT NULL,
 0204  `IsArchived` tinyint(1) NOT NULL DEFAULT 0,
 0205  `IsAutoArchived` tinyint(1) NOT NULL DEFAULT 0,
 0206  `OzonQtyAfter` int(11) DEFAULT NULL,
 0207  `OneCPrice` decimal(18,4) DEFAULT NULL,
 0208  `PrevOneCPrice` decimal(18,4) DEFAULT NULL,
 0209  `OzonCleanupStatus` varchar(24) DEFAULT NULL,
 0210  `OzonCleanupError` text DEFAULT NULL,
 0211  `OzonCleanupAtUtc` datetime(6) DEFAULT NULL,
 0212  `InPromo` tinyint(1) NOT NULL DEFAULT 0,
 0213  `PromoName` varchar(500) DEFAULT NULL,
 0214  `ReservedQty` int(11) NOT NULL DEFAULT 0,
 0215  `IsOzonOrphan` tinyint(1) NOT NULL DEFAULT 0,
 0216  `OzonOrphanStatus` varchar(24) DEFAULT NULL,
 0217  `OzonOrphanAtUtc` datetime(6) DEFAULT NULL,
 0218  `BatchMultiplier` int(11) NOT NULL DEFAULT 1,
 0219  `BatchBaseArticle` varchar(255) DEFAULT NULL,
 0220  `BatchPushedPrice` decimal(10,2) DEFAULT NULL,
 0221  `ArticleNormalized` varchar(255) GENERATED ALWAYS AS (lcase(trim(`Article`))) STORED,
 0222  PRIMARY KEY (`Id`),
 0223  KEY `IX_BitrixStockSyncReportLines_ReportId` (`ReportId`),
 0224  KEY `IX_BitrixStockSyncReportLines_Action` (`Action`),
 0225  KEY `IX_BitrixStockSyncReportLines_Article` (`Article`),
 0226  KEY `IX_BitrixStockSyncReportLines_Stores` (`OneCStore`,`OzonWarehouseName`),
 0227  KEY `IX_Sync_ReportId_Action` (`ReportId`,`Action`,`OzonApplyStatus`),
 0228  KEY `IX_Sync_ReportId_OzonApplyStatus` (`ReportId`,`OzonApplyStatus`),
 0229  KEY `IX_Sync_ReportId_ArticleNormalized` (`ReportId`,`ArticleNormalized`)
 0230) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
 0231");
 232
 0233            migrationBuilder.Sql(@"
 0234CREATE TABLE IF NOT EXISTS `BitrixStockSyncReportOzonFiles` (
 0235  `Id` bigint(20) NOT NULL AUTO_INCREMENT,
 0236  `ReportId` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
 0237  `OzonClientId` int(11) NOT NULL,
 0238  `OzonWarehouseId` varchar(60) NOT NULL,
 0239  `OzonWarehouseName` varchar(255) NOT NULL,
 0240  `BitrixWarehouseName` varchar(120) NOT NULL,
 0241  `OzonReportCode` varchar(255) NOT NULL,
 0242  `FileUrl` text DEFAULT NULL,
 0243  `RowsTotal` int(11) NOT NULL DEFAULT 0,
 0244  `RowsWithStock` int(11) NOT NULL DEFAULT 0,
 0245  `OrphansFound` int(11) NOT NULL DEFAULT 0,
 0246  `OrphansZeroed` int(11) NOT NULL DEFAULT 0,
 0247  `CreatedAtUtc` datetime(6) NOT NULL,
 0248  PRIMARY KEY (`Id`),
 0249  KEY `ix_ozon_files_report` (`ReportId`)
 0250) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
 0251");
 252
 0253            migrationBuilder.Sql(@"
 0254CREATE TABLE IF NOT EXISTS `BitrixStockSyncReportOzonPrices` (
 0255  `Id` bigint(20) NOT NULL AUTO_INCREMENT,
 0256  `ReportId` varchar(50) NOT NULL,
 0257  `Article` varchar(100) NOT NULL,
 0258  `OfferId` varchar(200) NOT NULL,
 0259  `OzonClientId` int(11) NOT NULL,
 0260  `ClientName` varchar(200) NOT NULL,
 0261  `PriceDataJson` longtext NOT NULL,
 0262  `SnapshotAt` datetime NOT NULL DEFAULT current_timestamp(),
 0263  `PricePushedOld` decimal(10,2) DEFAULT NULL,
 0264  `PricePushedNew` decimal(10,2) DEFAULT NULL,
 0265  `PricePushedAtUtc` datetime(6) DEFAULT NULL,
 0266  `PricePushStatus` varchar(32) DEFAULT NULL,
 0267  `PricePushError` text DEFAULT NULL,
 0268  `PushedMarkupPct` decimal(5,2) DEFAULT NULL,
 0269  `PushedColorIndexBefore` varchar(50) DEFAULT NULL,
 0270  `PushedColorIndexAfter` varchar(50) DEFAULT NULL,
 0271  `PushedCompetitorPrice` decimal(10,2) DEFAULT NULL,
 0272  PRIMARY KEY (`Id`),
 0273  KEY `idx_report_article` (`ReportId`,`Article`),
 0274  KEY `idx_report_client` (`ReportId`,`OzonClientId`),
 0275  KEY `idx_report_pricepush` (`ReportId`,`PricePushedNew`,`PricePushStatus`)
 0276) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
 0277");
 278
 279            // Справочные статусы резерва. Раньше их досеивал BitrixStockSyncReportService
 280            // при каждом старте; INSERT ... WHERE NOT EXISTS повторный запуск переживает.
 0281            migrationBuilder.Sql(@"
 0282INSERT INTO `BitrixStockReserveStatusSettings` (`StatusName`, `IsDefault`, `SortOrder`)
 0283SELECT 'Не указан', 1, 10 FROM DUAL
 0284WHERE NOT EXISTS (SELECT 1 FROM `BitrixStockReserveStatusSettings` WHERE `StatusName` = 'Не указан');
 0285");
 286
 0287            migrationBuilder.Sql(@"
 0288INSERT INTO `BitrixStockReserveStatusSettings` (`StatusName`, `IsDefault`, `SortOrder`)
 0289SELECT 'Заказан реализатору', 1, 20 FROM DUAL
 0290WHERE NOT EXISTS (SELECT 1 FROM `BitrixStockReserveStatusSettings` WHERE `StatusName` = 'Заказан реализатору');
 0291");
 0292        }
 293
 294        /// <inheritdoc />
 295        protected override void Down(MigrationBuilder migrationBuilder)
 296        {
 0297            migrationBuilder.Sql("DROP TABLE IF EXISTS `BitrixStockSyncReportOzonPrices`;");
 0298            migrationBuilder.Sql("DROP TABLE IF EXISTS `BitrixStockSyncReportOzonFiles`;");
 0299            migrationBuilder.Sql("DROP TABLE IF EXISTS `BitrixStockSyncReportLines`;");
 0300            migrationBuilder.Sql("DROP TABLE IF EXISTS `BitrixStockSyncReports`;");
 0301            migrationBuilder.Sql("DROP TABLE IF EXISTS `BitrixStockSyncPresets`;");
 0302            migrationBuilder.Sql("DROP TABLE IF EXISTS `BitrixStockSyncApplyArticleLog`;");
 0303            migrationBuilder.Sql("DROP TABLE IF EXISTS `BitrixStockReserveStatusSettings`;");
 0304            migrationBuilder.Sql("DROP TABLE IF EXISTS `BitrixStockExceptionStockRules`;");
 0305            migrationBuilder.Sql("DROP TABLE IF EXISTS `BitrixStockExceptionClientPrices`;");
 0306            migrationBuilder.Sql("DROP TABLE IF EXISTS `BitrixStockExceptionArticles`;");
 0307        }
 308    }
 309}