SET ANSI_NULLS ON; GO SET QUOTED_IDENTIFIER ON; GO CREATE OR ALTER PROCEDURE dbo.StoryIntelligenceReviewCentre_GetSummary @BookID int, @UserID int AS BEGIN SET NOCOUNT ON; ;WITH RunSummary AS ( SELECT r.BookID, COUNT_BIG(*) AS RunCount, SUM(CASE WHEN r.Status IN (N'Completed', N'CompletedWithWarnings') THEN 1 ELSE 0 END) AS CompletedRunCount, SUM(CASE WHEN r.Status IN (N'Pending', N'Running') THEN 1 ELSE 0 END) AS ActiveRunCount, SUM(CASE WHEN r.Status IN (N'Failed', N'Cancelled') THEN 1 ELSE 0 END) AS FailedRunCount, SUM(COALESCE(r.TotalDetectedScenes, 0)) AS TotalDetectedScenes, SUM(COALESCE(r.CompletedScenes, 0)) AS CompletedScenes, SUM(COALESCE(r.FailedScenes, 0)) AS FailedScenes FROM dbo.StoryIntelligenceRuns r WHERE r.BookID = @BookID GROUP BY r.BookID ), NarrativeSummary AS ( SELECT nc.BookID, COUNT_BIG(*) AS NarrativeCandidateCount, SUM(CASE WHEN nc.Status = N'Pending' THEN 1 ELSE 0 END) AS NarrativePendingCount, SUM(CASE WHEN nc.CandidateType = N'Thread' THEN 1 ELSE 0 END) AS NarrativeThreadCount FROM dbo.StoryIntelligenceNarrativeCandidates nc WHERE nc.BookID = @BookID AND nc.WholeBookPlotSynthesisRunID IS NOT NULL GROUP BY nc.BookID ), NarrativeEventSummary AS ( SELECT nc.BookID, COUNT_BIG(*) AS NarrativeEventCount FROM dbo.StoryIntelligenceNarrativeCandidateEvents ev INNER JOIN dbo.StoryIntelligenceNarrativeCandidates nc ON nc.NarrativeCandidateID = ev.NarrativeCandidateID WHERE nc.BookID = @BookID AND nc.WholeBookPlotSynthesisRunID IS NOT NULL GROUP BY nc.BookID ), MetricValueSummary AS ( SELECT chapter.BookID, COUNT_BIG(*) AS MetricValueCount FROM dbo.SceneMetricValues metric INNER JOIN dbo.Scenes scene ON scene.SceneID = metric.SceneID INNER JOIN dbo.Chapters chapter ON chapter.ChapterID = scene.ChapterID WHERE chapter.BookID = @BookID GROUP BY chapter.BookID ), CurrentPlotRun AS ( SELECT TOP (1) run.BookID, run.WholeBookPlotSynthesisRunID, run.Status AS WholeBookPlotSynthesisStatus, run.ErrorMessage AS WholeBookPlotSynthesisErrorMessage FROM dbo.WholeBookPlotSynthesisRuns run WHERE run.BookID = @BookID AND run.IsCurrent = 1 ORDER BY run.WholeBookPlotSynthesisRunID DESC ) 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, CAST(COALESCE(rs.RunCount, 0) AS int) AS RunCount, CAST(COALESCE(rs.CompletedRunCount, 0) AS int) AS CompletedRunCount, CAST(COALESCE(rs.ActiveRunCount, 0) AS int) AS ActiveRunCount, CAST(COALESCE(rs.FailedRunCount, 0) AS int) AS FailedRunCount, CAST(COALESCE(rs.TotalDetectedScenes, 0) AS int) AS TotalDetectedScenes, CAST(COALESCE(rs.CompletedScenes, 0) AS int) AS CompletedScenes, CAST(COALESCE(rs.FailedScenes, 0) AS int) AS FailedScenes, plot.WholeBookPlotSynthesisRunID, plot.WholeBookPlotSynthesisStatus, plot.WholeBookPlotSynthesisErrorMessage, CAST(COALESCE(ns.NarrativeCandidateCount, 0) AS int) AS NarrativeCandidateCount, CAST(COALESCE(ns.NarrativePendingCount, 0) AS int) AS NarrativePendingCount, CAST(COALESCE(ns.NarrativeThreadCount, 0) AS int) AS NarrativeThreadCount, CAST(COALESCE(nes.NarrativeEventCount, 0) AS int) AS NarrativeEventCount, CAST(COALESCE(metrics.MetricValueCount, 0) AS int) AS MetricValueCount 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 LEFT JOIN RunSummary rs ON rs.BookID = p.BookID LEFT JOIN NarrativeSummary ns ON ns.BookID = p.BookID LEFT JOIN NarrativeEventSummary nes ON nes.BookID = p.BookID LEFT JOIN MetricValueSummary metrics ON metrics.BookID = p.BookID LEFT JOIN CurrentPlotRun plot ON plot.BookID = p.BookID WHERE p.BookID = @BookID AND book.IsArchived = 0 AND project.IsArchived = 0; END; GO