SET ANSI_NULLS ON; GO SET QUOTED_IDENTIFIER ON; GO IF COL_LENGTH(N'dbo.StoryIntelligenceBookPipelines', N'CompletionEmailQueuedUtc') IS NULL BEGIN ALTER TABLE dbo.StoryIntelligenceBookPipelines ADD CompletionEmailQueuedUtc datetime2 NULL; END; GO IF COL_LENGTH(N'dbo.StoryIntelligenceBookPipelines', N'FailureEmailQueuedUtc') IS NULL BEGIN ALTER TABLE dbo.StoryIntelligenceBookPipelines ADD FailureEmailQueuedUtc datetime2 NULL; END; GO CREATE OR ALTER PROCEDURE dbo.StoryIntelligenceBookPipeline_TryBeginCompletionNotification @BookID int, @UserID int AS BEGIN SET NOCOUNT ON; SET XACT_ABORT ON; DECLARE @ImportSessionID int; DECLARE @ProjectID int; DECLARE @HasActiveRuns bit; DECLARE @HasFailedRuns bit; DECLARE @ChapterCount int; DECLARE @CompletedChapterCount int; DECLARE @FailedChapterCount int; DECLARE @NotificationKind nvarchar(20); SELECT @ImportSessionID = p.StoryIntelligenceBookPipelineID, @ProjectID = p.ProjectID FROM dbo.StoryIntelligenceBookPipelines p INNER JOIN dbo.ProjectUserAccess access ON access.ProjectID = p.ProjectID AND access.UserID = @UserID AND access.IsActive = 1 WHERE p.BookID = @BookID; IF @ImportSessionID IS NULL RETURN; SELECT @HasActiveRuns = CASE WHEN EXISTS ( SELECT 1 FROM dbo.StoryIntelligenceRuns WHERE BookID = @BookID AND UserID = @UserID AND Status IN (N'Pending', N'Running') ) THEN 1 ELSE 0 END; IF @HasActiveRuns = 1 RETURN; SELECT @ChapterCount = COUNT(1), @CompletedChapterCount = SUM(CASE WHEN Status IN (N'Completed', N'CompletedWithWarnings') THEN 1 ELSE 0 END), @FailedChapterCount = SUM(CASE WHEN Status IN (N'Failed', N'Cancelled') THEN 1 ELSE 0 END), @HasFailedRuns = CASE WHEN SUM(CASE WHEN Status IN (N'Failed', N'Cancelled') THEN 1 ELSE 0 END) > 0 THEN 1 ELSE 0 END FROM dbo.StoryIntelligenceRuns WHERE BookID = @BookID AND UserID = @UserID; IF COALESCE(@ChapterCount, 0) = 0 RETURN; SET @NotificationKind = CASE WHEN @HasFailedRuns = 1 THEN N'Failure' ELSE N'Success' END; BEGIN TRANSACTION; IF @NotificationKind = N'Failure' BEGIN UPDATE dbo.StoryIntelligenceBookPipelines SET FailureEmailQueuedUtc = SYSUTCDATETIME(), UpdatedUtc = SYSUTCDATETIME() WHERE StoryIntelligenceBookPipelineID = @ImportSessionID AND FailureEmailQueuedUtc IS NULL; IF @@ROWCOUNT = 0 BEGIN ROLLBACK TRANSACTION; RETURN; END; END ELSE BEGIN UPDATE dbo.StoryIntelligenceBookPipelines SET CompletionEmailQueuedUtc = SYSUTCDATETIME(), UpdatedUtc = SYSUTCDATETIME() WHERE StoryIntelligenceBookPipelineID = @ImportSessionID AND CompletionEmailQueuedUtc IS NULL; IF @@ROWCOUNT = 0 BEGIN ROLLBACK TRANSACTION; RETURN; END; END; COMMIT TRANSACTION; SELECT @ImportSessionID AS ImportSessionID, @UserID AS UserID, p.ProjectID, project.ProjectName, p.BookID, book.BookTitle, book.Subtitle AS BookSubtitle, @ChapterCount AS ChapterCount, @CompletedChapterCount AS CompletedChapterCount, @FailedChapterCount AS FailedChapterCount, @NotificationKind AS NotificationKind 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.StoryIntelligenceBookPipelineID = @ImportSessionID; END; GO