SET ANSI_NULLS ON; GO SET QUOTED_IDENTIFIER ON; GO IF COL_LENGTH(N'dbo.StoryIntelligenceBookPipelines', N'CharacterReviewCompletedUtc') IS NULL BEGIN ALTER TABLE dbo.StoryIntelligenceBookPipelines ADD CharacterReviewCompletedUtc datetime2 NULL; END; GO IF COL_LENGTH(N'dbo.StoryIntelligenceBookPipelines', N'LocationReviewCompletedUtc') IS NULL BEGIN ALTER TABLE dbo.StoryIntelligenceBookPipelines ADD LocationReviewCompletedUtc datetime2 NULL; END; GO IF COL_LENGTH(N'dbo.StoryIntelligenceBookPipelines', N'AssetReviewCompletedUtc') IS NULL BEGIN ALTER TABLE dbo.StoryIntelligenceBookPipelines ADD AssetReviewCompletedUtc datetime2 NULL; END; GO IF COL_LENGTH(N'dbo.StoryIntelligenceBookPipelines', N'RelationshipReviewCompletedUtc') IS NULL BEGIN ALTER TABLE dbo.StoryIntelligenceBookPipelines ADD RelationshipReviewCompletedUtc datetime2 NULL; END; GO IF COL_LENGTH(N'dbo.StoryIntelligenceBookPipelines', N'KnowledgeReviewCompletedUtc') IS NULL BEGIN ALTER TABLE dbo.StoryIntelligenceBookPipelines ADD KnowledgeReviewCompletedUtc datetime2 NULL; END; GO IF COL_LENGTH(N'dbo.StoryIntelligenceBookPipelines', N'NarrativeReviewCompletedUtc') IS NULL BEGIN ALTER TABLE dbo.StoryIntelligenceBookPipelines ADD NarrativeReviewCompletedUtc datetime2 NULL; END; GO UPDATE dbo.StoryIntelligenceBookPipelines SET CharacterReviewCompletedUtc = COALESCE(CharacterReviewCompletedUtc, UpdatedUtc, SYSUTCDATETIME()) WHERE CharacterReviewCompletedUtc IS NULL AND ( LastCompletedStage IN ( N'CharacterImport', N'LocationImport', N'AssetImport', N'RelationshipImport', N'KnowledgeImport', N'NarrativeImport' ) OR CurrentStage IN ( N'LocationReview', N'LocationImport', N'AssetReview', N'AssetImport', N'RelationshipReview', N'RelationshipImport', N'KnowledgeReview', N'KnowledgeImport', N'NarrativeReview', N'NarrativeImport', N'Complete' ) ); GO UPDATE dbo.StoryIntelligenceBookPipelines SET NarrativeReviewCompletedUtc = COALESCE(NarrativeReviewCompletedUtc, CompletedUtc, UpdatedUtc, SYSUTCDATETIME()) WHERE NarrativeReviewCompletedUtc IS NULL AND LastCompletedStage = N'NarrativeImport' AND Status = N'Complete'; GO UPDATE dbo.StoryIntelligenceBookPipelines SET LocationReviewCompletedUtc = COALESCE(LocationReviewCompletedUtc, UpdatedUtc, SYSUTCDATETIME()) WHERE LocationReviewCompletedUtc IS NULL AND LastCompletedStage = N'LocationImport'; GO UPDATE dbo.StoryIntelligenceBookPipelines SET AssetReviewCompletedUtc = COALESCE(AssetReviewCompletedUtc, UpdatedUtc, SYSUTCDATETIME()) WHERE AssetReviewCompletedUtc IS NULL AND LastCompletedStage = N'AssetImport'; GO UPDATE dbo.StoryIntelligenceBookPipelines SET RelationshipReviewCompletedUtc = COALESCE(RelationshipReviewCompletedUtc, UpdatedUtc, SYSUTCDATETIME()) WHERE RelationshipReviewCompletedUtc IS NULL AND LastCompletedStage = N'RelationshipImport'; GO UPDATE dbo.StoryIntelligenceBookPipelines SET KnowledgeReviewCompletedUtc = COALESCE(KnowledgeReviewCompletedUtc, UpdatedUtc, SYSUTCDATETIME()) WHERE KnowledgeReviewCompletedUtc IS NULL AND LastCompletedStage = N'KnowledgeImport'; GO CREATE OR ALTER PROCEDURE dbo.StoryIntelligenceBookPipeline_GetByBook @BookID int AS BEGIN SET NOCOUNT ON; SELECT p.StoryIntelligenceBookPipelineID, p.ProjectID, project.ProjectName, p.BookID, book.BookTitle, book.Subtitle AS BookSubtitle, p.CurrentStage, p.LastCompletedStage, p.CurrentReviewStage, p.Status, p.CompletedUtc, p.CharacterReviewCompletedUtc, p.LocationReviewCompletedUtc, p.AssetReviewCompletedUtc, p.RelationshipReviewCompletedUtc, p.KnowledgeReviewCompletedUtc, p.NarrativeReviewCompletedUtc, p.LastRunID, p.CreatedUtc, p.UpdatedUtc FROM dbo.StoryIntelligenceBookPipelines p INNER JOIN dbo.Projects project ON project.ProjectID = p.ProjectID INNER JOIN dbo.Books book ON book.BookID = p.BookID WHERE p.BookID = @BookID; END; GO CREATE OR ALTER PROCEDURE dbo.StoryIntelligenceBookPipeline_Upsert @ProjectID int, @BookID int, @CurrentStage nvarchar(80), @LastCompletedStage nvarchar(80) = NULL, @CurrentReviewStage nvarchar(80) = NULL, @Status nvarchar(40), @CompletedUtc datetime2 = NULL, @LastRunID int = NULL, @MarkCharacterReviewComplete bit = 0, @MarkLocationReviewComplete bit = 0, @MarkAssetReviewComplete bit = 0, @MarkRelationshipReviewComplete bit = 0, @MarkKnowledgeReviewComplete bit = 0, @MarkNarrativeReviewComplete bit = 0 AS BEGIN SET NOCOUNT ON; IF EXISTS (SELECT 1 FROM dbo.StoryIntelligenceBookPipelines WHERE BookID = @BookID) BEGIN UPDATE dbo.StoryIntelligenceBookPipelines SET ProjectID = @ProjectID, CurrentStage = @CurrentStage, LastCompletedStage = @LastCompletedStage, CurrentReviewStage = @CurrentReviewStage, Status = @Status, CompletedUtc = @CompletedUtc, LastRunID = COALESCE(@LastRunID, LastRunID), CharacterReviewCompletedUtc = CASE WHEN @MarkCharacterReviewComplete = 1 THEN COALESCE(CharacterReviewCompletedUtc, SYSUTCDATETIME()) ELSE CharacterReviewCompletedUtc END, LocationReviewCompletedUtc = CASE WHEN @MarkLocationReviewComplete = 1 THEN COALESCE(LocationReviewCompletedUtc, SYSUTCDATETIME()) ELSE LocationReviewCompletedUtc END, AssetReviewCompletedUtc = CASE WHEN @MarkAssetReviewComplete = 1 THEN COALESCE(AssetReviewCompletedUtc, SYSUTCDATETIME()) ELSE AssetReviewCompletedUtc END, RelationshipReviewCompletedUtc = CASE WHEN @MarkRelationshipReviewComplete = 1 THEN COALESCE(RelationshipReviewCompletedUtc, SYSUTCDATETIME()) ELSE RelationshipReviewCompletedUtc END, KnowledgeReviewCompletedUtc = CASE WHEN @MarkKnowledgeReviewComplete = 1 THEN COALESCE(KnowledgeReviewCompletedUtc, SYSUTCDATETIME()) ELSE KnowledgeReviewCompletedUtc END, NarrativeReviewCompletedUtc = CASE WHEN @MarkNarrativeReviewComplete = 1 THEN COALESCE(NarrativeReviewCompletedUtc, SYSUTCDATETIME()) ELSE NarrativeReviewCompletedUtc END, UpdatedUtc = SYSUTCDATETIME() WHERE BookID = @BookID; END ELSE BEGIN INSERT dbo.StoryIntelligenceBookPipelines (ProjectID, BookID, CurrentStage, LastCompletedStage, CurrentReviewStage, Status, CompletedUtc, LastRunID, CharacterReviewCompletedUtc, LocationReviewCompletedUtc, AssetReviewCompletedUtc, RelationshipReviewCompletedUtc, KnowledgeReviewCompletedUtc, NarrativeReviewCompletedUtc) VALUES (@ProjectID, @BookID, @CurrentStage, @LastCompletedStage, @CurrentReviewStage, @Status, @CompletedUtc, @LastRunID, CASE WHEN @MarkCharacterReviewComplete = 1 THEN SYSUTCDATETIME() ELSE NULL END, CASE WHEN @MarkLocationReviewComplete = 1 THEN SYSUTCDATETIME() ELSE NULL END, CASE WHEN @MarkAssetReviewComplete = 1 THEN SYSUTCDATETIME() ELSE NULL END, CASE WHEN @MarkRelationshipReviewComplete = 1 THEN SYSUTCDATETIME() ELSE NULL END, CASE WHEN @MarkKnowledgeReviewComplete = 1 THEN SYSUTCDATETIME() ELSE NULL END, CASE WHEN @MarkNarrativeReviewComplete = 1 THEN SYSUTCDATETIME() ELSE NULL END); END; EXEC dbo.StoryIntelligenceBookPipeline_GetByBook @BookID = @BookID; END; GO CREATE OR ALTER PROCEDURE dbo.StoryIntelligenceBookPipeline_GetByBookForUser @BookID int, @UserID int AS BEGIN SET NOCOUNT ON; SELECT p.StoryIntelligenceBookPipelineID, p.ProjectID, project.ProjectName, p.BookID, book.BookTitle, book.Subtitle AS BookSubtitle, p.CurrentStage, p.LastCompletedStage, p.CurrentReviewStage, p.Status, p.CompletedUtc, p.CharacterReviewCompletedUtc, p.LocationReviewCompletedUtc, p.AssetReviewCompletedUtc, p.RelationshipReviewCompletedUtc, p.KnowledgeReviewCompletedUtc, p.NarrativeReviewCompletedUtc, p.LastRunID, p.CreatedUtc, p.UpdatedUtc FROM dbo.StoryIntelligenceBookPipelines p INNER JOIN dbo.Projects project ON project.ProjectID = p.ProjectID INNER JOIN dbo.Books book ON book.BookID = p.BookID INNER JOIN dbo.ProjectUserAccess access ON access.ProjectID = p.ProjectID AND access.UserID = @UserID AND access.IsActive = 1 WHERE p.BookID = @BookID AND book.IsArchived = 0 AND project.IsArchived = 0; END; GO CREATE OR ALTER PROCEDURE dbo.StoryIntelligenceBookPipeline_GetByIDForUser @StoryIntelligenceBookPipelineID int, @UserID int AS BEGIN SET NOCOUNT ON; SELECT p.StoryIntelligenceBookPipelineID, p.ProjectID, project.ProjectName, p.BookID, book.BookTitle, book.Subtitle AS BookSubtitle, p.CurrentStage, p.LastCompletedStage, p.CurrentReviewStage, p.Status, p.CompletedUtc, p.CharacterReviewCompletedUtc, p.LocationReviewCompletedUtc, p.AssetReviewCompletedUtc, p.RelationshipReviewCompletedUtc, p.KnowledgeReviewCompletedUtc, p.NarrativeReviewCompletedUtc, p.LastRunID, p.CreatedUtc, p.UpdatedUtc FROM dbo.StoryIntelligenceBookPipelines p INNER JOIN dbo.Projects project ON project.ProjectID = p.ProjectID INNER JOIN dbo.Books book ON book.BookID = p.BookID INNER JOIN dbo.ProjectUserAccess access ON access.ProjectID = p.ProjectID AND access.UserID = @UserID AND access.IsActive = 1 WHERE p.StoryIntelligenceBookPipelineID = @StoryIntelligenceBookPipelineID AND book.IsArchived = 0 AND project.IsArchived = 0; END; GO CREATE OR ALTER PROCEDURE dbo.StoryIntelligenceBookPipeline_ListForUser @UserID int AS BEGIN SET NOCOUNT ON; SELECT p.StoryIntelligenceBookPipelineID, p.ProjectID, project.ProjectName, p.BookID, book.BookTitle, book.Subtitle AS BookSubtitle, p.CurrentStage, p.LastCompletedStage, p.CurrentReviewStage, p.Status, p.CompletedUtc, p.CharacterReviewCompletedUtc, p.LocationReviewCompletedUtc, p.AssetReviewCompletedUtc, p.RelationshipReviewCompletedUtc, p.KnowledgeReviewCompletedUtc, p.NarrativeReviewCompletedUtc, p.LastRunID, p.CreatedUtc, p.UpdatedUtc FROM dbo.StoryIntelligenceBookPipelines p INNER JOIN dbo.Projects project ON project.ProjectID = p.ProjectID INNER JOIN dbo.Books book ON book.BookID = p.BookID INNER JOIN dbo.ProjectUserAccess access ON access.ProjectID = p.ProjectID AND access.UserID = @UserID AND access.IsActive = 1 WHERE book.IsArchived = 0 AND project.IsArchived = 0 ORDER BY CASE p.Status WHEN N'NeedsReview' THEN 0 WHEN N'InProgress' THEN 1 ELSE 2 END, p.UpdatedUtc DESC; END; GO