Initial commit: JDE Scoping Tool migration project

Set up repository with legacy .NET Framework 4.8 source (OLD/),
new .NET 10 Blazor solution (NEW/), OpenSpec specifications,
documentation, and project configuration.
This commit is contained in:
Joseph Doherty
2026-01-02 07:43:29 -05:00
commit 26ff8d9b4f
1761 changed files with 596509 additions and 0 deletions
@@ -0,0 +1,30 @@
using DbUp;
using DbUp.Engine;
using Microsoft.Extensions.Configuration;
namespace JdeScoping.Database;
public class DatabaseMigrator
{
private readonly string _connectionString;
public DatabaseMigrator(IConfiguration configuration)
{
_connectionString = configuration.GetConnectionString("SqlServer")
?? throw new InvalidOperationException("SqlServer connection string not configured");
}
public DatabaseUpgradeResult Migrate()
{
EnsureDatabase.For.SqlDatabase(_connectionString);
var upgrader = DeployChanges.To
.SqlDatabase(_connectionString)
.WithScriptsEmbeddedInAssembly(typeof(DatabaseMigrator).Assembly)
.WithTransaction()
.LogToConsole()
.Build();
return upgrader.PerformUpgrade();
}
}
@@ -0,0 +1,18 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<EmbeddedResource Include="Scripts\*.sql" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="dbup-sqlserver" Version="6.0.16" />
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="10.0.1" />
</ItemGroup>
</Project>
@@ -0,0 +1,27 @@
-- Migration: 001_CreateSearchTable
-- Source: OLD/Database/Tables/Search.sql
-- Changes: DATETIME -> DATETIME2(7)
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'Search' AND schema_id = SCHEMA_ID('dbo'))
BEGIN
CREATE TABLE [dbo].[Search]
(
[ID] INT IDENTITY(1,1) NOT NULL,
[UserName] VARCHAR(128) NOT NULL,
[Name] VARCHAR(128) NULL,
[Status] SMALLINT NOT NULL,
[SubmitDT] DATETIME2(7) NULL,
[StartDT] DATETIME2(7) NULL,
[EndDT] DATETIME2(7) NULL,
[Criteria] VARCHAR(MAX) NULL,
[Results] VARBINARY(MAX) NULL,
CONSTRAINT [PK_Search] PRIMARY KEY CLUSTERED([ID])
);
END
GO
IF NOT EXISTS (SELECT * FROM sys.indexes WHERE name = 'IX_Search_UserName' AND object_id = OBJECT_ID('dbo.Search'))
BEGIN
CREATE INDEX [IX_Search_UserName] ON [dbo].[Search] ([UserName]);
END
GO
@@ -0,0 +1,27 @@
-- Migration: 002_CreateDataUpdateTable
-- Source: OLD/Database/Tables/DataUpdate.sql
-- Changes: DATETIME -> DATETIME2(7)
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'DataUpdate' AND schema_id = SCHEMA_ID('dbo'))
BEGIN
CREATE TABLE [dbo].[DataUpdate]
(
[ID] INT IDENTITY(1,1) NOT NULL,
[SourceSystem] VARCHAR(50) NOT NULL,
[SourceData] VARCHAR(50) NOT NULL,
[TableName] VARCHAR(50) NOT NULL,
[StartDT] DATETIME2(7) NOT NULL,
[EndDT] DATETIME2(7) NOT NULL,
[UpdateType] SMALLINT NOT NULL,
[WasSuccessful] BIT NOT NULL,
[NumberRecords] BIGINT NOT NULL,
CONSTRAINT [PK_DataUpdate] PRIMARY KEY CLUSTERED([ID])
);
END
GO
IF NOT EXISTS (SELECT * FROM sys.indexes WHERE name = 'IX_DataUpdate_LastUpdate' AND object_id = OBJECT_ID('dbo.DataUpdate'))
BEGIN
CREATE INDEX [IX_DataUpdate_LastUpdate] ON [dbo].[DataUpdate] ([TableName], [WasSuccessful], [StartDT] DESC);
END
GO
@@ -0,0 +1,21 @@
-- Migration: 003_CreateBranchTable
-- Source: OLD/Database/Tables/Branch.sql
-- Changes: DATETIME -> DATETIME2(7)
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'Branch' AND schema_id = SCHEMA_ID('dbo'))
BEGIN
CREATE TABLE [dbo].[Branch]
(
[Code] VARCHAR(12) NOT NULL,
[Description] VARCHAR(40) NULL,
[LastUpdateDT] DATETIME2(7) NOT NULL,
CONSTRAINT [PK_Branch] PRIMARY KEY CLUSTERED([Code])
);
END
GO
IF NOT EXISTS (SELECT * FROM sys.indexes WHERE name = 'IX_Branch_Lookup' AND object_id = OBJECT_ID('dbo.Branch'))
BEGIN
CREATE INDEX [IX_Branch_Lookup] ON [dbo].[Branch] ([Description]);
END
GO
@@ -0,0 +1,21 @@
-- Migration: 004_CreateStatusCodeTable
-- Source: OLD/Database/Tables/StatusCode.sql
-- Changes: DATETIME -> DATETIME2(7)
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'StatusCode' AND schema_id = SCHEMA_ID('dbo'))
BEGIN
CREATE TABLE [dbo].[StatusCode]
(
[Code] VARCHAR(12) NOT NULL,
[Description] VARCHAR(40) NULL,
[LastUpdateDT] DATETIME2(7) NOT NULL,
CONSTRAINT [PK_StatusCode] PRIMARY KEY CLUSTERED([Code])
);
END
GO
IF NOT EXISTS (SELECT * FROM sys.indexes WHERE name = 'IX_StatusCode_Lookup' AND object_id = OBJECT_ID('dbo.StatusCode'))
BEGIN
CREATE INDEX [IX_StatusCode_Lookup] ON [dbo].[StatusCode] ([Description]);
END
GO
@@ -0,0 +1,15 @@
-- Migration: 005_CreateFunctionCodeTable
-- Source: OLD/Database/Tables/FunctionCode.sql
-- Changes: DATETIME -> DATETIME2(7)
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'FunctionCode' AND schema_id = SCHEMA_ID('dbo'))
BEGIN
CREATE TABLE [dbo].[FunctionCode]
(
[Code] VARCHAR(10) NOT NULL,
[Description] VARCHAR(MAX) NULL,
[LastUpdateDT] DATETIME2(7) NOT NULL,
CONSTRAINT [PK_FunctionCode] PRIMARY KEY ([Code])
);
END
GO
@@ -0,0 +1,21 @@
-- Migration: 006_CreateProfitCenterTable
-- Source: OLD/Database/Tables/ProfitCenter.sql
-- Changes: DATETIME -> DATETIME2(7)
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'ProfitCenter' AND schema_id = SCHEMA_ID('dbo'))
BEGIN
CREATE TABLE [dbo].[ProfitCenter]
(
[Code] VARCHAR(12) NOT NULL,
[Description] VARCHAR(40) NULL,
[LastUpdateDT] DATETIME2(7) NOT NULL,
CONSTRAINT [PK_ProfitCenter] PRIMARY KEY CLUSTERED([Code])
);
END
GO
IF NOT EXISTS (SELECT * FROM sys.indexes WHERE name = 'IX_ProfitCenter_Lookup' AND object_id = OBJECT_ID('dbo.ProfitCenter'))
BEGIN
CREATE INDEX [IX_ProfitCenter_Lookup] ON [dbo].[ProfitCenter] ([Description]);
END
GO
@@ -0,0 +1,21 @@
-- Migration: 007_CreateWorkCenterTable
-- Source: OLD/Database/Tables/WorkCenter.sql
-- Changes: DATETIME -> DATETIME2(7)
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'WorkCenter' AND schema_id = SCHEMA_ID('dbo'))
BEGIN
CREATE TABLE [dbo].[WorkCenter]
(
[Code] VARCHAR(12) NOT NULL,
[Description] VARCHAR(40) NULL,
[LastUpdateDT] DATETIME2(7) NOT NULL,
CONSTRAINT [PK_WorkCenter] PRIMARY KEY CLUSTERED([Code])
);
END
GO
IF NOT EXISTS (SELECT * FROM sys.indexes WHERE name = 'IX_WorkCenter_Lookup' AND object_id = OBJECT_ID('dbo.WorkCenter'))
BEGIN
CREATE INDEX [IX_WorkCenter_Lookup] ON [dbo].[WorkCenter] ([Description]);
END
GO
@@ -0,0 +1,24 @@
-- Migration: 008_CreateItemTable
-- Source: OLD/Database/Tables/Item.sql
-- Changes: DATETIME -> DATETIME2(7)
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'Item' AND schema_id = SCHEMA_ID('dbo'))
BEGIN
CREATE TABLE [dbo].[Item]
(
[ShortItemNumber] BIGINT NOT NULL,
[ItemNumber] VARCHAR(25) NOT NULL,
[Description] VARCHAR(30) NULL,
[PlanningFamily] VARCHAR(3) NULL,
[StockingType] CHAR(1) NULL,
[LastUpdateDT] DATETIME2(7) NOT NULL,
CONSTRAINT [PK_Item] PRIMARY KEY CLUSTERED([ShortItemNumber])
);
END
GO
IF NOT EXISTS (SELECT * FROM sys.indexes WHERE name = 'IX_Item_ItemNumber' AND object_id = OBJECT_ID('dbo.Item'))
BEGIN
CREATE INDEX [IX_Item_ItemNumber] ON [dbo].[Item]([ItemNumber]);
END
GO
@@ -0,0 +1,28 @@
-- Migration: 009_CreateJdeUserTable
-- Source: OLD/Database/Tables/JdeUser.sql
-- Changes: DATETIME -> DATETIME2(7)
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'JdeUser' AND schema_id = SCHEMA_ID('dbo'))
BEGIN
CREATE TABLE [dbo].[JdeUser]
(
[AddressNumber] BIGINT NOT NULL,
[UserID] VARCHAR(10) NULL,
[FullName] VARCHAR(40) NOT NULL,
[LastUpdateDT] DATETIME2(7) NOT NULL,
CONSTRAINT [PK_JdeUser] PRIMARY KEY CLUSTERED([AddressNumber])
);
END
GO
IF NOT EXISTS (SELECT * FROM sys.indexes WHERE name = 'IX_JdeUser_UserID' AND object_id = OBJECT_ID('dbo.JdeUser'))
BEGIN
CREATE INDEX [IX_JdeUser_UserID] ON [dbo].[JdeUser] ([UserID]);
END
GO
IF NOT EXISTS (SELECT * FROM sys.indexes WHERE name = 'IX_JdeUser_FullName' AND object_id = OBJECT_ID('dbo.JdeUser'))
BEGIN
CREATE INDEX [IX_JdeUser_FullName] ON [dbo].[JdeUser] ([FullName]);
END
GO
@@ -0,0 +1,22 @@
-- Migration: 010_CreateOrgHierarchyTable
-- Source: OLD/Database/Tables/OrgHierarchy.sql
-- Changes: DATETIME -> DATETIME2(7)
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'OrgHierarchy' AND schema_id = SCHEMA_ID('dbo'))
BEGIN
CREATE TABLE [dbo].[OrgHierarchy]
(
[WorkCenterCode] VARCHAR(12) NOT NULL,
[BranchCode] VARCHAR(12) NOT NULL,
[ProfitCenterCode] VARCHAR(12) NOT NULL,
[LastUpdateDT] DATETIME2(7) NOT NULL,
CONSTRAINT [PK_OrgHierarchy] PRIMARY KEY CLUSTERED([WorkCenterCode], [BranchCode])
);
END
GO
IF NOT EXISTS (SELECT * FROM sys.indexes WHERE name = 'IX_OrgHierarchy_ProfitCenterCode' AND object_id = OBJECT_ID('dbo.OrgHierarchy'))
BEGIN
CREATE INDEX [IX_OrgHierarchy_ProfitCenterCode] ON [dbo].[OrgHierarchy] ([ProfitCenterCode]) INCLUDE([WorkCenterCode]);
END
GO
@@ -0,0 +1,21 @@
-- Migration: 011_CreateRouteMasterTable
-- Source: OLD/Database/Tables/RouteMaster.sql
-- Changes: DATETIME -> DATETIME2(7)
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'RouteMaster' AND schema_id = SCHEMA_ID('dbo'))
BEGIN
CREATE TABLE [dbo].[RouteMaster]
(
[BranchCode] VARCHAR(12) NOT NULL,
[ItemNumber] VARCHAR(25) NOT NULL,
[RoutingType] VARCHAR(3) NOT NULL,
[SequenceNumber] DECIMAL(7, 2) NOT NULL,
[FunctionCode] VARCHAR(15) NULL,
[WorkCenterCode] VARCHAR(12) NULL,
[StartDate] DATETIME2(7) NOT NULL,
[EndDate] DATETIME2(7) NULL,
[LastUpdateDT] DATETIME2(7) NOT NULL,
CONSTRAINT [PK_RouteMaster] PRIMARY KEY CLUSTERED([BranchCode], [ItemNumber], [RoutingType], [SequenceNumber], [StartDate])
);
END
GO
@@ -0,0 +1,26 @@
-- Migration: 012_CreateMisDataTable
-- Source: OLD/Database/Tables/MisData.sql
-- Changes: DATETIME -> DATETIME2(7)
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'MisData' AND schema_id = SCHEMA_ID('dbo'))
BEGIN
CREATE TABLE [dbo].[MisData]
(
[ItemNumber] VARCHAR(32) NOT NULL,
[BranchCode] VARCHAR(32) NOT NULL,
[SequenceNumber] VARCHAR(32) NOT NULL,
[MisNumber] VARCHAR(32) NOT NULL,
[RevID] VARCHAR(32) NOT NULL,
[CharNumber] VARCHAR(32) NOT NULL,
[TestDescription] VARCHAR(2000) NULL,
[SamplingType] VARCHAR(32) NULL,
[SamplingValue] VARCHAR(32) NULL,
[ToolsGauges] VARCHAR(2000) NULL,
[WorkInstructions] VARCHAR(2000) NULL,
[Status] VARCHAR(32) NOT NULL,
[ReleaseDate] DATETIME2(7) NULL,
[ObsoleteDate] DATETIME2(7) NULL,
CONSTRAINT [PK_MisData] PRIMARY KEY CLUSTERED([ItemNumber], [BranchCode], [SequenceNumber], [MisNumber], [RevID], [Status], [CharNumber])
);
END
GO
@@ -0,0 +1,28 @@
-- Migration: 013_CreateLotTable
-- Source: OLD/Database/Tables/Lot.sql
-- Changes: DATETIME -> DATETIME2(7)
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'Lot' AND schema_id = SCHEMA_ID('dbo'))
BEGIN
CREATE TABLE [dbo].[Lot]
(
[LotNumber] VARCHAR(30) NOT NULL,
[BranchCode] VARCHAR(12) NOT NULL,
[ShortItemNumber] BIGINT NOT NULL,
[ItemNumber] VARCHAR(25) NULL,
[SupplierCode] BIGINT NOT NULL,
[StatusCode] CHAR(1) NULL,
[Memo1] VARCHAR(30) NULL,
[Memo2] VARCHAR(30) NULL,
[Memo3] VARCHAR(30) NULL,
[LastUpdateDT] DATETIME2(7) NOT NULL,
CONSTRAINT [PK_Lot] PRIMARY KEY CLUSTERED([LotNumber], [ShortItemNumber], [BranchCode])
);
END
GO
IF NOT EXISTS (SELECT * FROM sys.indexes WHERE name = 'IX_Lot_SupplierCode' AND object_id = OBJECT_ID('dbo.Lot'))
BEGIN
CREATE INDEX [IX_Lot_SupplierCode] ON [dbo].[Lot] ([SupplierCode]) INCLUDE([LotNumber]);
END
GO
@@ -0,0 +1,17 @@
-- Migration: 014_CreateLotLocationTable
-- Source: OLD/Database/Tables/LotLocation.sql
-- Changes: DATETIME -> DATETIME2(7)
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'LotLocation' AND schema_id = SCHEMA_ID('dbo'))
BEGIN
CREATE TABLE [dbo].[LotLocation]
(
[LotNumber] VARCHAR(120) NOT NULL,
[ShortItemNumber] BIGINT NOT NULL,
[BranchCode] VARCHAR(12) NOT NULL,
[Location] VARCHAR(80) NOT NULL DEFAULT '',
[LastUpdateDT] DATETIME2(7) NOT NULL,
CONSTRAINT [PK_LotLocation] PRIMARY KEY CLUSTERED([LotNumber], [ShortItemNumber], [BranchCode], [Location])
);
END
GO
@@ -0,0 +1,39 @@
-- Migration: 015_CreateWorkOrderCurrTable
-- Source: OLD/Database/Tables/WorkOrder_Curr.sql
-- Changes: DATETIME -> DATETIME2(7)
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'WorkOrder_Curr' AND schema_id = SCHEMA_ID('dbo'))
BEGIN
CREATE TABLE [dbo].[WorkOrder_Curr]
(
[WorkOrderNumber] BIGINT NOT NULL,
[BranchCode] VARCHAR(12) NULL,
[LotNumber] VARCHAR(30) NULL,
[ItemNumber] VARCHAR(25) NULL,
[ShortItemNumber] BIGINT NOT NULL,
[ParentWorkOrderNumber] VARCHAR(8) NULL,
[OrderQuantity] DECIMAL(15, 2) NOT NULL,
[HeldQuantity] DECIMAL(15, 2) NOT NULL,
[ShippedQuantity] DECIMAL(15, 2) NOT NULL,
[StatusCode] VARCHAR(10) NULL,
[StatusCodeUpdateDT] DATETIME2(7) NULL,
[IssueDate] DATETIME2(7) NOT NULL,
[StartDate] DATETIME2(7) NOT NULL,
[RoutingType] VARCHAR(3) NULL,
[LastUpdateDT] DATETIME2(7) NOT NULL,
CONSTRAINT [PK_WorkOrder_Curr] PRIMARY KEY CLUSTERED([WorkOrderNumber])
);
END
GO
IF NOT EXISTS (SELECT * FROM sys.indexes WHERE name = 'IX_WorkOrder_Curr_ParentWorkOrderNumber' AND object_id = OBJECT_ID('dbo.WorkOrder_Curr'))
BEGIN
CREATE INDEX [IX_WorkOrder_Curr_ParentWorkOrderNumber] ON [dbo].[WorkOrder_Curr] ([ParentWorkOrderNumber]);
END
GO
IF NOT EXISTS (SELECT * FROM sys.indexes WHERE name = 'IX_WorkOrder_Curr_ItemNumber' AND object_id = OBJECT_ID('dbo.WorkOrder_Curr'))
BEGIN
CREATE INDEX [IX_WorkOrder_Curr_ItemNumber] ON [dbo].[WorkOrder_Curr] ([ItemNumber]);
END
GO
@@ -0,0 +1,39 @@
-- Migration: 016_CreateWorkOrderHistTable
-- Source: OLD/Database/Tables/WorkOrder_Hist.sql
-- Changes: DATETIME -> DATETIME2(7)
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'WorkOrder_Hist' AND schema_id = SCHEMA_ID('dbo'))
BEGIN
CREATE TABLE [dbo].[WorkOrder_Hist]
(
[WorkOrderNumber] BIGINT NOT NULL,
[BranchCode] VARCHAR(12) NULL,
[LotNumber] VARCHAR(30) NULL,
[ItemNumber] VARCHAR(25) NULL,
[ShortItemNumber] BIGINT NOT NULL,
[ParentWorkOrderNumber] VARCHAR(8) NULL,
[OrderQuantity] DECIMAL(15, 2) NOT NULL,
[HeldQuantity] DECIMAL(15, 2) NOT NULL,
[ShippedQuantity] DECIMAL(15, 2) NOT NULL,
[StatusCode] VARCHAR(10) NULL,
[StatusCodeUpdateDT] DATETIME2(7) NULL,
[IssueDate] DATETIME2(7) NOT NULL,
[StartDate] DATETIME2(7) NOT NULL,
[RoutingType] VARCHAR(3) NULL,
[LastUpdateDT] DATETIME2(7) NOT NULL,
CONSTRAINT [PK_WorkOrder_Hist] PRIMARY KEY CLUSTERED([WorkOrderNumber])
);
END
GO
IF NOT EXISTS (SELECT * FROM sys.indexes WHERE name = 'IX_WorkOrder_Hist_ParentWorkOrderNumber' AND object_id = OBJECT_ID('dbo.WorkOrder_Hist'))
BEGIN
CREATE INDEX [IX_WorkOrder_Hist_ParentWorkOrderNumber] ON [dbo].[WorkOrder_Hist] ([ParentWorkOrderNumber]);
END
GO
IF NOT EXISTS (SELECT * FROM sys.indexes WHERE name = 'IX_WorkOrder_Hist_ItemNumber' AND object_id = OBJECT_ID('dbo.WorkOrder_Hist'))
BEGIN
CREATE INDEX [IX_WorkOrder_Hist_ItemNumber] ON [dbo].[WorkOrder_Hist] ([ItemNumber]);
END
GO
@@ -0,0 +1,29 @@
-- Migration: 017_CreateWorkOrderStepCurrTable
-- Source: OLD/Database/Tables/WorkOrderStep_Curr.sql
-- Changes: DATETIME -> DATETIME2(7)
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'WorkOrderStep_Curr' AND schema_id = SCHEMA_ID('dbo'))
BEGIN
CREATE TABLE [dbo].[WorkOrderStep_Curr]
(
[WorkOrderNumber] BIGINT NOT NULL,
[WorkCenterCode] VARCHAR(12) NOT NULL,
[StepNumber] DECIMAL(7, 2) NOT NULL,
[StepTypeCode] VARCHAR(2) NOT NULL,
[BranchCode] VARCHAR(12) NOT NULL,
[StepDescription] VARCHAR(30) NULL,
[StartDT] DATETIME2(7) NULL,
[EndDT] DATETIME2(7) NULL,
[FunctionCode] VARCHAR(15) NULL,
[ScrappedQuantity] DECIMAL(18, 2) NOT NULL,
[LastUpdateDT] DATETIME2(7) NOT NULL,
CONSTRAINT [PK_WorkOrderStep_Curr] PRIMARY KEY CLUSTERED([WorkOrderNumber], [WorkCenterCode], [StepNumber], [StepTypeCode])
);
END
GO
IF NOT EXISTS (SELECT * FROM sys.indexes WHERE name = 'IX_WorkOrderStep_Curr_WorkCenterCode' AND object_id = OBJECT_ID('dbo.WorkOrderStep_Curr'))
BEGIN
CREATE INDEX [IX_WorkOrderStep_Curr_WorkCenterCode] ON [dbo].[WorkOrderStep_Curr] ([WorkCenterCode]) INCLUDE([WorkOrderNumber]);
END
GO
@@ -0,0 +1,29 @@
-- Migration: 018_CreateWorkOrderStepHistTable
-- Source: OLD/Database/Tables/WorkOrderStep_Hist.sql
-- Changes: DATETIME -> DATETIME2(7)
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'WorkOrderStep_Hist' AND schema_id = SCHEMA_ID('dbo'))
BEGIN
CREATE TABLE [dbo].[WorkOrderStep_Hist]
(
[WorkOrderNumber] BIGINT NOT NULL,
[WorkCenterCode] VARCHAR(12) NOT NULL,
[StepNumber] DECIMAL(7, 2) NOT NULL,
[StepTypeCode] VARCHAR(2) NOT NULL,
[BranchCode] VARCHAR(12) NOT NULL,
[StepDescription] VARCHAR(30) NULL,
[StartDT] DATETIME2(7) NULL,
[EndDT] DATETIME2(7) NULL,
[FunctionCode] VARCHAR(15) NULL,
[ScrappedQuantity] DECIMAL(18, 2) NOT NULL,
[LastUpdateDT] DATETIME2(7) NOT NULL,
CONSTRAINT [PK_WorkOrderStep_Hist] PRIMARY KEY CLUSTERED([WorkOrderNumber], [WorkCenterCode], [StepNumber], [StepTypeCode])
);
END
GO
IF NOT EXISTS (SELECT * FROM sys.indexes WHERE name = 'IX_WorkOrderStep_Hist_WorkCenterCode' AND object_id = OBJECT_ID('dbo.WorkOrderStep_Hist'))
BEGIN
CREATE INDEX [IX_WorkOrderStep_Hist_WorkCenterCode] ON [dbo].[WorkOrderStep_Hist] ([WorkCenterCode]) INCLUDE([WorkOrderNumber]);
END
GO
@@ -0,0 +1,32 @@
-- Migration: 019_CreateWorkOrderTimeCurrTable
-- Source: OLD/Database/Tables/WorkOrderTime_Curr.sql
-- Changes: DATETIME -> DATETIME2(7)
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'WorkOrderTime_Curr' AND schema_id = SCHEMA_ID('dbo'))
BEGIN
CREATE TABLE [dbo].[WorkOrderTime_Curr]
(
[UniqueID] BIGINT NOT NULL,
[WorkOrderNumber] BIGINT NOT NULL,
[StepNumber] DECIMAL(7, 2) NOT NULL,
[WorkCenterCode] VARCHAR(12) NOT NULL,
[BranchCode] VARCHAR(12) NOT NULL,
[AddressNumber] BIGINT NOT NULL,
[GlDate] DATETIME2(7) NULL,
[LastUpdateDT] DATETIME2(7) NOT NULL,
CONSTRAINT [PK_WorkOrderTime_Curr] PRIMARY KEY CLUSTERED([UniqueID])
);
END
GO
IF NOT EXISTS (SELECT * FROM sys.indexes WHERE name = 'IX_WorkOrderTime_Curr_Lookup' AND object_id = OBJECT_ID('dbo.WorkOrderTime_Curr'))
BEGIN
CREATE INDEX [IX_WorkOrderTime_Curr_Lookup] ON [dbo].[WorkOrderTime_Curr] ([WorkOrderNumber], [WorkCenterCode], [StepNumber]);
END
GO
IF NOT EXISTS (SELECT * FROM sys.indexes WHERE name = 'IX_WorkOrderTime_Curr_AddressNumber' AND object_id = OBJECT_ID('dbo.WorkOrderTime_Curr'))
BEGIN
CREATE INDEX [IX_WorkOrderTime_Curr_AddressNumber] ON [dbo].[WorkOrderTime_Curr] ([AddressNumber]) INCLUDE([WorkOrderNumber], [WorkCenterCode], [StepNumber], [LastUpdateDT]);
END
GO
@@ -0,0 +1,32 @@
-- Migration: 020_CreateWorkOrderTimeHistTable
-- Source: OLD/Database/Tables/WorkOrderTime_Hist.sql
-- Changes: DATETIME -> DATETIME2(7)
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'WorkOrderTime_Hist' AND schema_id = SCHEMA_ID('dbo'))
BEGIN
CREATE TABLE [dbo].[WorkOrderTime_Hist]
(
[UniqueID] BIGINT NOT NULL,
[WorkOrderNumber] BIGINT NOT NULL,
[StepNumber] DECIMAL(7, 2) NOT NULL,
[WorkCenterCode] VARCHAR(12) NOT NULL,
[BranchCode] VARCHAR(12) NOT NULL,
[AddressNumber] BIGINT NOT NULL,
[GlDate] DATETIME2(7) NULL,
[LastUpdateDT] DATETIME2(7) NOT NULL,
CONSTRAINT [PK_WorkOrderTime_Hist] PRIMARY KEY CLUSTERED([UniqueID])
);
END
GO
IF NOT EXISTS (SELECT * FROM sys.indexes WHERE name = 'IX_WorkOrderTime_Hist_Lookup' AND object_id = OBJECT_ID('dbo.WorkOrderTime_Hist'))
BEGIN
CREATE INDEX [IX_WorkOrderTime_Hist_Lookup] ON [dbo].[WorkOrderTime_Hist] ([WorkOrderNumber], [WorkCenterCode], [StepNumber]);
END
GO
IF NOT EXISTS (SELECT * FROM sys.indexes WHERE name = 'IX_WorkOrderTime_Hist_AddressNumber' AND object_id = OBJECT_ID('dbo.WorkOrderTime_Hist'))
BEGIN
CREATE INDEX [IX_WorkOrderTime_Hist_AddressNumber] ON [dbo].[WorkOrderTime_Hist] ([AddressNumber]) INCLUDE([WorkOrderNumber], [WorkCenterCode], [StepNumber], [LastUpdateDT]);
END
GO
@@ -0,0 +1,31 @@
-- Migration: 021_CreateWorkOrderComponentCurrTable
-- Source: OLD/Database/Tables/WorkOrderComponent_Curr.sql
-- Changes: DATETIME -> DATETIME2(7)
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'WorkOrderComponent_Curr' AND schema_id = SCHEMA_ID('dbo'))
BEGIN
CREATE TABLE [dbo].[WorkOrderComponent_Curr]
(
[UniqueID] BIGINT NOT NULL,
[WorkOrderNumber] BIGINT NOT NULL,
[LotNumber] VARCHAR(30) NOT NULL,
[BranchCode] VARCHAR(12) NULL,
[ShortItemNumber] BIGINT NOT NULL,
[Quantity] DECIMAL(15, 2) NOT NULL,
[LastUpdateDT] DATETIME2(7) NOT NULL,
CONSTRAINT [PK_WorkOrderComponent_Curr] PRIMARY KEY CLUSTERED([UniqueID])
);
END
GO
IF NOT EXISTS (SELECT * FROM sys.indexes WHERE name = 'IX_WorkOrderComponent_Curr_WorkOrderNumber' AND object_id = OBJECT_ID('dbo.WorkOrderComponent_Curr'))
BEGIN
CREATE INDEX [IX_WorkOrderComponent_Curr_WorkOrderNumber] ON [dbo].[WorkOrderComponent_Curr] ([WorkOrderNumber]);
END
GO
IF NOT EXISTS (SELECT * FROM sys.indexes WHERE name = 'IX_WorkOrderComponent_Curr_LotLookup' AND object_id = OBJECT_ID('dbo.WorkOrderComponent_Curr'))
BEGIN
CREATE INDEX [IX_WorkOrderComponent_Curr_LotLookup] ON [dbo].[WorkOrderComponent_Curr] ([LotNumber], [ShortItemNumber], [BranchCode]);
END
GO
@@ -0,0 +1,31 @@
-- Migration: 022_CreateWorkOrderComponentHistTable
-- Source: OLD/Database/Tables/WorkOrderComponent_Hist.sql
-- Changes: DATETIME -> DATETIME2(7)
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'WorkOrderComponent_Hist' AND schema_id = SCHEMA_ID('dbo'))
BEGIN
CREATE TABLE [dbo].[WorkOrderComponent_Hist]
(
[UniqueID] BIGINT NOT NULL,
[WorkOrderNumber] BIGINT NOT NULL,
[LotNumber] VARCHAR(30) NOT NULL,
[BranchCode] VARCHAR(12) NULL,
[ShortItemNumber] BIGINT NOT NULL,
[Quantity] DECIMAL(15, 2) NOT NULL,
[LastUpdateDT] DATETIME2(7) NOT NULL,
CONSTRAINT [PK_WorkOrderComponent_Hist] PRIMARY KEY CLUSTERED([UniqueID])
);
END
GO
IF NOT EXISTS (SELECT * FROM sys.indexes WHERE name = 'IX_WorkOrderComponent_Hist_WorkOrderNumber' AND object_id = OBJECT_ID('dbo.WorkOrderComponent_Hist'))
BEGIN
CREATE INDEX [IX_WorkOrderComponent_Hist_WorkOrderNumber] ON [dbo].[WorkOrderComponent_Hist] ([WorkOrderNumber]);
END
GO
IF NOT EXISTS (SELECT * FROM sys.indexes WHERE name = 'IX_WorkOrderComponent_Hist_LotLookup' AND object_id = OBJECT_ID('dbo.WorkOrderComponent_Hist'))
BEGIN
CREATE INDEX [IX_WorkOrderComponent_Hist_LotLookup] ON [dbo].[WorkOrderComponent_Hist] ([LotNumber], [ShortItemNumber], [BranchCode]);
END
GO
@@ -0,0 +1,32 @@
-- Migration: 023_CreateWorkOrderRoutingTable
-- Source: OLD/Database/Tables/WorkOrderRouting_Curr.sql
-- Note: Legacy file creates [dbo].[WorkOrderRouting] (no _Curr suffix - single table)
-- Changes: DATETIME -> DATETIME2(7)
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'WorkOrderRouting' AND schema_id = SCHEMA_ID('dbo'))
BEGIN
CREATE TABLE [dbo].[WorkOrderRouting]
(
[UserID] VARCHAR(40) NOT NULL,
[BatchNumber] VARCHAR(60) NOT NULL,
[TransactionNumber] VARCHAR(88) NOT NULL,
[LineNumber] INT NOT NULL,
[StepNumber] DECIMAL(7, 2) NOT NULL,
[WorkCenterCode] VARCHAR(12) NOT NULL,
[WorkOrderNumber] BIGINT NOT NULL,
[RoutingType] VARCHAR(12) NULL,
[BranchCode] VARCHAR(12) NULL,
[StepDescription] VARCHAR(120) NULL,
[FunctionCode] VARCHAR(60) NULL,
[TransactionDate] DATETIME2(7) NOT NULL,
[LastUpdateDT] DATETIME2(7) NOT NULL,
CONSTRAINT [PK_WorkOrderRouting] PRIMARY KEY CLUSTERED([UserID], [BatchNumber], [TransactionNumber], [LineNumber], [StepNumber], [WorkCenterCode])
);
END
GO
IF NOT EXISTS (SELECT * FROM sys.indexes WHERE name = 'IX_WorkOrderRouting_Lookup' AND object_id = OBJECT_ID('dbo.WorkOrderRouting'))
BEGIN
CREATE INDEX [IX_WorkOrderRouting_Lookup] ON [dbo].[WorkOrderRouting] ([WorkOrderNumber], [WorkCenterCode], [FunctionCode]) INCLUDE([StepNumber]);
END
GO
@@ -0,0 +1,31 @@
-- Migration: 024_CreateLotUsageCurrTable
-- Source: OLD/Database/Tables/LotUsage_Curr.sql
-- Changes: DATETIME -> DATETIME2(7)
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'LotUsage_Curr' AND schema_id = SCHEMA_ID('dbo'))
BEGIN
CREATE TABLE [dbo].[LotUsage_Curr]
(
[UniqueID] BIGINT NOT NULL,
[WorkOrderNumber] BIGINT NOT NULL,
[LotNumber] VARCHAR(30) NOT NULL,
[BranchCode] VARCHAR(12) NULL,
[ShortItemNumber] BIGINT NOT NULL,
[Quantity] DECIMAL(15, 2) NOT NULL,
[LastUpdateDT] DATETIME2(7) NOT NULL,
CONSTRAINT [PK_LotUsage_Curr] PRIMARY KEY CLUSTERED([UniqueID])
);
END
GO
IF NOT EXISTS (SELECT * FROM sys.indexes WHERE name = 'IX_LotUsage_Curr_WorkOrderNumber' AND object_id = OBJECT_ID('dbo.LotUsage_Curr'))
BEGIN
CREATE INDEX [IX_LotUsage_Curr_WorkOrderNumber] ON [dbo].[LotUsage_Curr] ([WorkOrderNumber]);
END
GO
IF NOT EXISTS (SELECT * FROM sys.indexes WHERE name = 'IX_LotUsage_Curr_LotLookup' AND object_id = OBJECT_ID('dbo.LotUsage_Curr'))
BEGIN
CREATE INDEX [IX_LotUsage_Curr_LotLookup] ON [dbo].[LotUsage_Curr] ([LotNumber], [ShortItemNumber], [BranchCode]);
END
GO
@@ -0,0 +1,31 @@
-- Migration: 025_CreateLotUsageHistTable
-- Source: OLD/Database/Tables/LotUsage_Hist.sql
-- Changes: DATETIME -> DATETIME2(7)
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'LotUsage_Hist' AND schema_id = SCHEMA_ID('dbo'))
BEGIN
CREATE TABLE [dbo].[LotUsage_Hist]
(
[UniqueID] BIGINT NOT NULL,
[WorkOrderNumber] BIGINT NOT NULL,
[LotNumber] VARCHAR(30) NOT NULL,
[BranchCode] VARCHAR(12) NULL,
[ShortItemNumber] BIGINT NOT NULL,
[Quantity] DECIMAL(15, 2) NOT NULL,
[LastUpdateDT] DATETIME2(7) NOT NULL,
CONSTRAINT [PK_LotUsage_Hist] PRIMARY KEY CLUSTERED([UniqueID])
);
END
GO
IF NOT EXISTS (SELECT * FROM sys.indexes WHERE name = 'IX_LotUsage_Hist_WorkOrderNumber' AND object_id = OBJECT_ID('dbo.LotUsage_Hist'))
BEGIN
CREATE INDEX [IX_LotUsage_Hist_WorkOrderNumber] ON [dbo].[LotUsage_Hist] ([WorkOrderNumber]);
END
GO
IF NOT EXISTS (SELECT * FROM sys.indexes WHERE name = 'IX_LotUsage_Hist_LotLookup' AND object_id = OBJECT_ID('dbo.LotUsage_Hist'))
BEGIN
CREATE INDEX [IX_LotUsage_Hist_LotLookup] ON [dbo].[LotUsage_Hist] ([LotNumber], [ShortItemNumber], [BranchCode]);
END
GO
@@ -0,0 +1,13 @@
-- Migration: 026_CreateWorkOrderView
-- Source: OLD/Database/Views/WorkOrder.sql
-- Union view combining WorkOrder_Curr and WorkOrder_Hist
CREATE OR ALTER VIEW [dbo].[WorkOrder] AS
(
SELECT hist.*
FROM dbo.WorkOrder_Hist hist
UNION ALL
SELECT curr.*
FROM dbo.WorkOrder_Curr curr
);
GO
@@ -0,0 +1,27 @@
-- Migration: 027_CreateWorkOrderTimeView
-- Source: OLD/Database/Views/WorkOrderTime.sql
-- Union view combining WorkOrderTime_Curr and WorkOrderTime_Hist
CREATE OR ALTER VIEW [dbo].[WorkOrderTime] AS
(
SELECT hist.UniqueID,
hist.WorkOrderNumber,
hist.StepNumber,
hist.WorkCenterCode,
hist.BranchCode,
hist.AddressNumber,
hist.GlDate,
hist.LastUpdateDT
FROM dbo.WorkOrderTime_Hist hist
UNION ALL
SELECT curr.UniqueID,
curr.WorkOrderNumber,
curr.StepNumber,
curr.WorkCenterCode,
curr.BranchCode,
curr.AddressNumber,
curr.GlDate,
curr.LastUpdateDT
FROM dbo.WorkOrderTime_Curr curr
);
GO
@@ -0,0 +1,47 @@
-- Migration: 028_CreateWorkOrderStepView
-- Source: OLD/Database/Views/WorkOrderStep.sql
-- Union view with FunctionCode join for description
CREATE OR ALTER VIEW [dbo].[WorkOrderStep] AS
SELECT wos.WorkOrderNumber,
wos.WorkCenterCode,
wos.StepNumber,
wos.StepTypeCode,
wos.BranchCode,
wos.StepDescription,
wos.StartDT,
wos.EndDT,
wos.FunctionCode,
fc.[Description] AS FunctionOperationDescription,
wos.ScrappedQuantity,
wos.LastUpdateDT
FROM
(
SELECT hist.WorkOrderNumber,
hist.WorkCenterCode,
hist.StepNumber,
hist.StepTypeCode,
hist.BranchCode,
hist.StepDescription,
hist.StartDT,
hist.EndDT,
hist.FunctionCode,
hist.ScrappedQuantity,
hist.LastUpdateDT
FROM dbo.WorkOrderStep_Hist hist
UNION ALL
SELECT curr.WorkOrderNumber,
curr.WorkCenterCode,
curr.StepNumber,
curr.StepTypeCode,
curr.BranchCode,
curr.StepDescription,
curr.StartDT,
curr.EndDT,
curr.FunctionCode,
curr.ScrappedQuantity,
curr.LastUpdateDT
FROM dbo.WorkOrderStep_Curr curr
) wos
LEFT OUTER JOIN dbo.FunctionCode fc ON (wos.FunctionCode = fc.Code);
GO
@@ -0,0 +1,13 @@
-- Migration: 029_CreateWorkOrderComponentView
-- Source: OLD/Database/Views/WorkOrderComponent.sql
-- Union view combining WorkOrderComponent_Curr and WorkOrderComponent_Hist
CREATE OR ALTER VIEW [dbo].[WorkOrderComponent] AS
(
SELECT hist.*
FROM dbo.WorkOrderComponent_Hist hist
UNION ALL
SELECT curr.*
FROM dbo.WorkOrderComponent_Curr curr
);
GO
@@ -0,0 +1,13 @@
-- Migration: 030_CreateLotUsageView
-- Source: OLD/Database/Views/LotUsage.sql
-- Union view combining LotUsage_Curr and LotUsage_Hist
CREATE OR ALTER VIEW [dbo].[LotUsage] AS
(
SELECT hist.*
FROM dbo.LotUsage_Hist hist
UNION ALL
SELECT curr.*
FROM dbo.LotUsage_Curr curr
);
GO
@@ -0,0 +1,11 @@
-- Migration: 031_CreateWorkOrderTotalScrapView
-- Source: OLD/Database/Views/WorkOrderTotalScrap.sql
-- Aggregation view for total scrap by work order
CREATE OR ALTER VIEW [dbo].[WorkOrderTotalScrap] AS
SELECT wos.WorkOrderNumber,
COALESCE(SUM(wos.ScrappedQuantity), 0) AS TotalScrappedQuantity
FROM dbo.WorkOrderStep wos
WHERE wos.StepNumber = ROUND(wos.StepNumber, 0)
GROUP BY wos.WorkOrderNumber;
GO
@@ -0,0 +1,34 @@
-- Migration: 032_CreateLastDataUpdatesView
-- Source: OLD/Database/Views/LastDataUpdates.sql
-- Pivot view showing last successful update timestamps by table and type
CREATE OR ALTER VIEW [dbo].[LastDataUpdates]
AS
WITH UPDATE_CTE AS
(
SELECT du.TableName,
du.UpdateType,
du.StartDT,
ROW_NUMBER() OVER (PARTITION BY du.TableName, du.UpdateType ORDER BY du.StartDT DESC) AS RN
FROM dbo.DataUpdate du
WHERE du.WasSuccessful = 1
)
SELECT TableName,
COALESCE([3], '1970-01-01') AS MassUpdateDT,
COALESCE(COALESCE([2], [3]), '1970-01-01') AS DailyUpdateDT,
COALESCE(COALESCE(COALESCE([1], [2]), [3]), '1970-01-01') AS HourlyUpdateDT
FROM
(
SELECT UPDATE_CTE.TableName,
UPDATE_CTE.UpdateType,
UPDATE_CTE.StartDT,
UPDATE_CTE.RN
FROM UPDATE_CTE
WHERE RN = 1
) AS Source
PIVOT
(
MAX(StartDT)
FOR UpdateType IN ([1], [2], [3])
) AS PivotTable;
GO
@@ -0,0 +1,12 @@
-- Migration: 033_CreateWorkOrderFilterParameterType
-- Source: OLD/Database/Types/WorkOrderFilterParameter.sql
-- Table-valued parameter for work order number filtering
IF NOT EXISTS (SELECT * FROM sys.types WHERE name = 'WorkOrderFilterParameter' AND schema_id = SCHEMA_ID('dbo'))
BEGIN
CREATE TYPE [dbo].[WorkOrderFilterParameter] AS TABLE
(
WorkOrderNumber BIGINT NULL
);
END
GO
@@ -0,0 +1,12 @@
-- Migration: 034_CreateItemNumberFilterParameterType
-- Source: OLD/Database/Types/ItemNumberFilterParameter.sql
-- Table-valued parameter for item number filtering
IF NOT EXISTS (SELECT * FROM sys.types WHERE name = 'ItemNumberFilterParameter' AND schema_id = SCHEMA_ID('dbo'))
BEGIN
CREATE TYPE [dbo].[ItemNumberFilterParameter] AS TABLE
(
ItemNumber VARCHAR(25) NULL
);
END
GO
@@ -0,0 +1,12 @@
-- Migration: 035_CreateProfitCenterFilterParameterType
-- Source: OLD/Database/Types/ProfitCenterFilterParameter.sql
-- Table-valued parameter for profit center filtering
IF NOT EXISTS (SELECT * FROM sys.types WHERE name = 'ProfitCenterFilterParameter' AND schema_id = SCHEMA_ID('dbo'))
BEGIN
CREATE TYPE [dbo].[ProfitCenterFilterParameter] AS TABLE
(
Code VARCHAR(12) NULL
);
END
GO
@@ -0,0 +1,12 @@
-- Migration: 036_CreateWorkCenterFilterParameterType
-- Source: OLD/Database/Types/WorkCenterFilterParameter.sql
-- Table-valued parameter for work center filtering
IF NOT EXISTS (SELECT * FROM sys.types WHERE name = 'WorkCenterFilterParameter' AND schema_id = SCHEMA_ID('dbo'))
BEGIN
CREATE TYPE [dbo].[WorkCenterFilterParameter] AS TABLE
(
Code VARCHAR(12) NULL
);
END
GO
@@ -0,0 +1,12 @@
-- Migration: 037_CreateOperatorFilterParameterType
-- Source: OLD/Database/Types/OperatorFilterParameter.sql
-- Table-valued parameter for operator (JDE user) filtering
IF NOT EXISTS (SELECT * FROM sys.types WHERE name = 'OperatorFilterParameter' AND schema_id = SCHEMA_ID('dbo'))
BEGIN
CREATE TYPE [dbo].[OperatorFilterParameter] AS TABLE
(
UserName VARCHAR(10) NULL
);
END
GO
@@ -0,0 +1,13 @@
-- Migration: 038_CreateComponentLotFilterParameterType
-- Source: OLD/Database/Types/ComponentLotFilterParameter.sql
-- Table-valued parameter for component lot filtering
IF NOT EXISTS (SELECT * FROM sys.types WHERE name = 'ComponentLotFilterParameter' AND schema_id = SCHEMA_ID('dbo'))
BEGIN
CREATE TYPE [dbo].[ComponentLotFilterParameter] AS TABLE
(
ComponentLotNumber VARCHAR(30) NULL,
ItemNumber VARCHAR(128) NULL
);
END
GO
@@ -0,0 +1,16 @@
-- Migration: 039_CreateItemOperationMisFilterParameterType
-- Source: OLD/Database/Types/ItemOperationMISFilterParameter.sql
-- Note: Using lowercase "Mis" per Codex review naming convention
-- Table-valued parameter for MIS data filtering
IF NOT EXISTS (SELECT * FROM sys.types WHERE name = 'ItemOperationMisFilterParameter' AND schema_id = SCHEMA_ID('dbo'))
BEGIN
CREATE TYPE [dbo].[ItemOperationMisFilterParameter] AS TABLE
(
ItemNumber VARCHAR(32) NULL,
OperationNumber VARCHAR(32) NULL,
MisNumber VARCHAR(32) NULL,
MisRevision VARCHAR(32) NULL
);
END
GO
@@ -0,0 +1,35 @@
-- Migration: 040_CreateSubmitSearchProcedure
-- Source: OLD/Database/StoredProcedures/SubmitSearch.sql
-- Creates a new search record with status=1 (Submitted)
CREATE OR ALTER PROCEDURE [dbo].[SubmitSearch]
(
@p_UserName VARCHAR(128),
@p_Name VARCHAR(128),
@p_Criteria VARCHAR(MAX),
@o_SearchID INT OUTPUT
)
AS
BEGIN
-- Insert new search record
INSERT INTO dbo.Search
(
UserName,
Name,
Status,
SubmitDT,
Criteria
)
VALUES
(
@p_UserName,
@p_Name,
1,
GETDATE(),
@p_Criteria
);
-- Get assigned auto-ID
SET @o_SearchID = SCOPE_IDENTITY();
END
GO
@@ -0,0 +1,17 @@
-- Migration: 041_CreateStartSearchProcedure
-- Source: OLD/Database/StoredProcedures/StartSearch.sql
-- Updates search status to 2 (Started) and sets start timestamp
CREATE OR ALTER PROCEDURE [dbo].[StartSearch]
(
@p_SearchID INT
)
AS
BEGIN
-- Update search status and start timestamp
UPDATE dbo.Search
SET Status = 2,
StartDT = GETDATE()
WHERE ID = @p_SearchID;
END
GO
@@ -0,0 +1,28 @@
-- Migration: 042_CreateCompleteSearchProcedure
-- Source: OLD/Database/StoredProcedures/CompleteSearch.sql
-- Completes search with status 3 (Success) or 4 (Error) and stores results
CREATE OR ALTER PROCEDURE [dbo].[CompleteSearch]
(
@p_SearchID INT,
@p_WasSuccessful BIT,
@p_Results VARBINARY(MAX)
)
AS
BEGIN
DECLARE @v_Status INT;
-- Determine status code
SET @v_Status = CASE @p_WasSuccessful
WHEN 1 THEN 3
ELSE 4
END;
-- Update search status and results
UPDATE dbo.Search
SET Status = @v_Status,
Results = @p_Results,
EndDT = GETDATE()
WHERE ID = @p_SearchID;
END
GO
@@ -0,0 +1,15 @@
-- Migration: 043_CreateResetPartialSearchesProcedure
-- Source: OLD/Database/StoredProcedures/ResetPartialSearches.sql
-- Resets searches that were started but not completed (cleanup after crash)
CREATE OR ALTER PROCEDURE [dbo].[ResetPartialSearches]
AS
BEGIN
-- Reset status and start timestamp for searches begun but not finished
UPDATE dbo.Search
SET Status = 1,
StartDT = NULL
WHERE StartDT IS NOT NULL
AND EndDT IS NULL;
END
GO
@@ -0,0 +1,330 @@
-- Migration: 044_CreateMatchMisFunction
-- Source: OLD/Database/Functions/MatchMis.sql
-- Table-valued function for MIS data matching
-- Dependencies: Item, WorkOrder, WorkOrderRouting, RouteMaster, MisData tables
-- Changes: DATETIME -> DATETIME2(7)
CREATE OR ALTER FUNCTION [dbo].[MatchMIS]
(
@workOrderNumber BIGINT,
@itemNumber VARCHAR(25),
@branchCode VARCHAR(12),
@routingType VARCHAR(3),
@issueDate DATETIME2(7),
@workCenterCode VARCHAR(12),
@sequenceNumber DECIMAL(7, 2),
@steptimestamp DATETIME2(7),
@functionCode VARCHAR(15),
@functionOperationDescription VARCHAR(80)
)
RETURNS @MIS TABLE
(
WorkOrderNumber BIGINT,
ItemNumber VARCHAR(25),
ItemDescription VARCHAR(30),
BranchCode VARCHAR(12),
WorkCenterCode VARCHAR(12),
StepTimestamp DATETIME2(7),
SequenceNumber DECIMAL(7, 2),
FunctionCode VARCHAR(15),
FunctionOperationDescription VARCHAR(80),
MatchedSequenceNumber DECIMAL(7, 2),
RoutingMatch BIT,
MasterMatch BIT,
MisNumber VARCHAR(32),
RevID VARCHAR(32),
CharNumber VARCHAR(32),
MisSequenceNumber VARCHAR(32),
TestDescription VARCHAR(2000),
SamplingType VARCHAR(32),
SamplingValue VARCHAR(32),
ToolsGauges VARCHAR(2000),
WorkInstructions VARCHAR(2000),
Status VARCHAR(32),
ReleaseDate DATETIME2(7)
)
BEGIN
-- Lookup item description
DECLARE @itemDescription VARCHAR(30);
SELECT TOP 1 @itemDescription = i.[Description]
FROM dbo.Item AS i
WHERE i.ItemNumber = @itemNumber;
-- Find aliases for sequence number
DECLARE @alias TABLE
(
SequenceNumber DECIMAL(7, 2),
RoutingMatch BIT,
MasterMatch BIT
);
-- Lookup parent work order info
DECLARE @p_WorkOrderNumber BIGINT;
SELECT @p_WorkOrderNumber = COALESCE(TRY_CONVERT(BIGINT, wo.ParentWorkOrderNumber), wo.WorkOrderNumber)
FROM dbo.WorkOrder AS wo
WHERE wo.WorkOrderNumber = @workOrderNumber;
-- Add F3112Z1 records to aliases
WITH routing_cte AS
(
SELECT DISTINCT wor.StepNumber AS SequenceNumber
FROM dbo.WorkOrderRouting AS wor
WHERE wor.WorkOrderNumber = @p_WorkOrderNumber
AND wor.WorkCenterCode = @workCenterCode
AND wor.FunctionCode = @functionCode
AND wor.TransactionDate = (
SELECT MIN(wor2.TransactionDate)
FROM dbo.WorkOrderRouting AS wor2
WHERE wor2.WorkOrderNumber = @p_WorkOrderNumber
)
)
MERGE @alias AS TARGET
USING routing_cte AS SOURCE ON (TARGET.SequenceNumber = SOURCE.SequenceNumber)
WHEN MATCHED THEN
UPDATE SET TARGET.RoutingMatch = 1
WHEN NOT MATCHED BY TARGET THEN
INSERT (SequenceNumber, RoutingMatch, MasterMatch)
VALUES (SOURCE.SequenceNumber, 1, 0);
-- Add F3003 records to aliases
IF (NOT EXISTS (SELECT * FROM @alias AS a))
BEGIN
WITH master_cte AS
(
SELECT DISTINCT rm.SequenceNumber
FROM dbo.RouteMaster AS rm
WHERE rm.BranchCode = @branchCode
AND rm.ItemNumber = @itemNumber
AND rm.RoutingType = @routingType
AND @issueDate BETWEEN rm.StartDate AND rm.EndDate
AND rm.WorkCenterCode = @workCenterCode
AND rm.FunctionCode = @functionCode
)
MERGE @alias AS TARGET
USING master_cte AS SOURCE ON (TARGET.SequenceNumber = SOURCE.SequenceNumber)
WHEN MATCHED THEN
UPDATE SET TARGET.MasterMatch = 1
WHEN NOT MATCHED BY TARGET THEN
INSERT (SequenceNumber, RoutingMatch, MasterMatch)
VALUES (SOURCE.SequenceNumber, 0, 1);
END
ELSE
BEGIN
WITH master_cte AS
(
SELECT DISTINCT rm.SequenceNumber
FROM dbo.RouteMaster AS rm
WHERE rm.BranchCode = @branchCode
AND rm.ItemNumber = @itemNumber
AND rm.RoutingType = @routingType
AND @issueDate BETWEEN rm.StartDate AND rm.EndDate
AND rm.WorkCenterCode = @workCenterCode
AND rm.FunctionCode = @functionCode
)
MERGE @alias AS TARGET
USING master_cte AS SOURCE ON (TARGET.SequenceNumber = SOURCE.SequenceNumber)
WHEN MATCHED THEN
UPDATE SET TARGET.MasterMatch = 1;
END
-- Try to match to 'Current'
INSERT INTO @MIS
(
WorkOrderNumber,
ItemNumber,
ItemDescription,
BranchCode,
WorkCenterCode,
StepTimestamp,
SequenceNumber,
FunctionCode,
FunctionOperationDescription,
MatchedSequenceNumber,
RoutingMatch,
MasterMatch,
MisNumber,
RevID,
CharNumber,
MisSequenceNumber,
TestDescription,
SamplingType,
SamplingValue,
ToolsGauges,
WorkInstructions,
Status,
ReleaseDate
)
SELECT @workOrderNumber,
@itemNumber,
@itemDescription,
@branchCode,
@workCenterCode,
@steptimestamp,
@sequenceNumber,
@functionCode,
@functionOperationDescription,
a.SequenceNumber AS MatchedSequenceNumber,
a.RoutingMatch,
a.MasterMatch,
md.MisNumber,
md.RevID,
md.CharNumber,
md.SequenceNumber AS MisSequenceNumber,
md.TestDescription,
md.SamplingType,
md.SamplingValue,
md.ToolsGauges,
md.WorkInstructions,
md.Status,
md.ReleaseDate
FROM @alias AS a
INNER JOIN dbo.MisData AS md ON (
md.BranchCode = @branchCode
AND md.ItemNumber = @itemNumber
AND md.SequenceNumber = CAST(CAST(a.SequenceNumber AS INT) AS VARCHAR(32))
AND @steptimestamp BETWEEN COALESCE(md.ReleaseDate, '1970-01-01') AND COALESCE(md.ObsoleteDate, '2029-01-01')
)
WHERE md.Status = 'Current';
-- Exit if any MIS info found
IF (EXISTS (SELECT * FROM @MIS))
BEGIN
RETURN;
END
-- Try to match to 'BackLevel'
INSERT INTO @MIS
(
WorkOrderNumber,
ItemNumber,
ItemDescription,
BranchCode,
WorkCenterCode,
StepTimestamp,
SequenceNumber,
FunctionCode,
FunctionOperationDescription,
MatchedSequenceNumber,
RoutingMatch,
MasterMatch,
MisNumber,
RevID,
CharNumber,
MisSequenceNumber,
TestDescription,
SamplingType,
SamplingValue,
ToolsGauges,
WorkInstructions,
Status,
ReleaseDate
)
SELECT @workOrderNumber,
@itemNumber,
@itemDescription,
@branchCode,
@workCenterCode,
@steptimestamp,
@sequenceNumber,
@functionCode,
@functionOperationDescription,
a.SequenceNumber AS MatchedSequenceNumber,
a.RoutingMatch,
a.MasterMatch,
md.MisNumber,
md.RevID,
md.CharNumber,
md.SequenceNumber AS MisSequenceNumber,
md.TestDescription,
md.SamplingType,
md.SamplingValue,
md.ToolsGauges,
md.WorkInstructions,
md.Status,
md.ReleaseDate
FROM @alias AS a
INNER JOIN dbo.MisData AS md ON (
md.BranchCode = @branchCode
AND md.ItemNumber = @itemNumber
AND md.SequenceNumber = CAST(CAST(a.SequenceNumber AS INT) AS VARCHAR(32))
AND md.ReleaseDate BETWEEN @issueDate AND @steptimestamp
)
WHERE md.Status = 'BackLevel';
-- Exit if any MIS info found
IF (EXISTS (SELECT * FROM @MIS))
BEGIN
RETURN;
END
-- Insert alias data without MIS match
INSERT INTO @MIS
(
WorkOrderNumber,
ItemNumber,
ItemDescription,
BranchCode,
WorkCenterCode,
StepTimestamp,
SequenceNumber,
FunctionCode,
FunctionOperationDescription,
MatchedSequenceNumber,
RoutingMatch,
MasterMatch
)
SELECT @workOrderNumber,
@itemNumber,
@itemDescription,
@branchCode,
@workCenterCode,
@steptimestamp,
@sequenceNumber,
@functionCode,
@functionOperationDescription,
a.SequenceNumber,
a.RoutingMatch,
a.MasterMatch
FROM @alias AS a;
-- Exit if any MIS info found
IF (EXISTS (SELECT * FROM @MIS))
BEGIN
RETURN;
END
-- Insert parameter data if no MIS or alias found
INSERT INTO @MIS
(
WorkOrderNumber,
ItemNumber,
ItemDescription,
BranchCode,
WorkCenterCode,
StepTimestamp,
SequenceNumber,
FunctionCode,
FunctionOperationDescription,
MatchedSequenceNumber,
RoutingMatch,
MasterMatch
)
VALUES
(
@workOrderNumber,
@itemNumber,
@itemDescription,
@branchCode,
@workCenterCode,
@steptimestamp,
@sequenceNumber,
@functionCode,
@functionOperationDescription,
NULL,
0,
0
);
RETURN;
END;
GO