SET ANSI_NULLS ON; GO SET QUOTED_IDENTIFIER ON; GO IF COL_LENGTH(N'dbo.OnboardingManuscriptBuilds', N'MarkerSyncMessage') IS NULL ALTER TABLE dbo.OnboardingManuscriptBuilds ADD MarkerSyncMessage nvarchar(500) NULL; GO IF COL_LENGTH(N'dbo.OnboardingManuscriptBuilds', N'MarkerSyncCompletedUtc') IS NULL ALTER TABLE dbo.OnboardingManuscriptBuilds ADD MarkerSyncCompletedUtc datetime2 NULL; GO IF OBJECT_ID(N'dbo.ManuscriptStructuralChapterSources', N'U') IS NULL BEGIN CREATE TABLE dbo.ManuscriptStructuralChapterSources ( ChapterID int NOT NULL CONSTRAINT PK_ManuscriptStructuralChapterSources PRIMARY KEY, ProjectID int NOT NULL, BookID int NOT NULL, SourceText nvarchar(max) NOT NULL, SourceWordCount int NOT NULL, SourceCharacterCount int NOT NULL, ParagraphMapJson nvarchar(max) NULL, CreatedUtc datetime2 NOT NULL CONSTRAINT DF_ManuscriptStructuralChapterSources_CreatedUtc DEFAULT SYSUTCDATETIME(), UpdatedUtc datetime2 NOT NULL CONSTRAINT DF_ManuscriptStructuralChapterSources_UpdatedUtc DEFAULT SYSUTCDATETIME(), CONSTRAINT FK_ManuscriptStructuralChapterSources_Chapters FOREIGN KEY (ChapterID) REFERENCES dbo.Chapters(ChapterID), CONSTRAINT FK_ManuscriptStructuralChapterSources_Projects FOREIGN KEY (ProjectID) REFERENCES dbo.Projects(ProjectID), CONSTRAINT FK_ManuscriptStructuralChapterSources_Books FOREIGN KEY (BookID) REFERENCES dbo.Books(BookID) ); END; GO CREATE OR ALTER PROCEDURE dbo.ManuscriptStructuralChapterSource_Save @ChapterID int, @ProjectID int, @BookID int, @SourceText nvarchar(max), @SourceWordCount int, @SourceCharacterCount int, @ParagraphMapJson nvarchar(max) = NULL AS BEGIN SET NOCOUNT ON; MERGE dbo.ManuscriptStructuralChapterSources AS target USING (SELECT @ChapterID AS ChapterID) AS source ON target.ChapterID = source.ChapterID WHEN MATCHED THEN UPDATE SET ProjectID = @ProjectID, BookID = @BookID, SourceText = @SourceText, SourceWordCount = @SourceWordCount, SourceCharacterCount = @SourceCharacterCount, ParagraphMapJson = @ParagraphMapJson, UpdatedUtc = SYSUTCDATETIME() WHEN NOT MATCHED THEN INSERT (ChapterID, ProjectID, BookID, SourceText, SourceWordCount, SourceCharacterCount, ParagraphMapJson) VALUES (@ChapterID, @ProjectID, @BookID, @SourceText, @SourceWordCount, @SourceCharacterCount, @ParagraphMapJson); END; GO CREATE OR ALTER PROCEDURE dbo.Onboarding_ManuscriptBuild_MarkerSyncSent @BuildID int AS BEGIN SET NOCOUNT ON; UPDATE dbo.OnboardingManuscriptBuilds SET MarkerStatus = N'Sent', MarkerSyncMessage = NULL, UpdatedUtc = SYSUTCDATETIME() WHERE OnboardingManuscriptBuildID = @BuildID AND MarkerStatus IN (N'Pending', N'Failed', N'Sent'); END; GO CREATE OR ALTER PROCEDURE dbo.Onboarding_ManuscriptBuild_MarkerSyncCompleted @BuildID int AS BEGIN SET NOCOUNT ON; UPDATE dbo.OnboardingManuscriptBuilds SET MarkerStatus = N'Completed', MarkerSyncMessage = N'Word markers inserted and document saved.', MarkerSyncCompletedUtc = SYSUTCDATETIME(), UpdatedUtc = SYSUTCDATETIME() WHERE OnboardingManuscriptBuildID = @BuildID; END; GO CREATE OR ALTER PROCEDURE dbo.Onboarding_ManuscriptBuild_MarkerSyncFailed @BuildID int, @Message nvarchar(500) = NULL AS BEGIN SET NOCOUNT ON; UPDATE dbo.OnboardingManuscriptBuilds SET MarkerStatus = N'Failed', MarkerSyncMessage = LEFT(NULLIF(LTRIM(RTRIM(@Message)), N''), 500), UpdatedUtc = SYSUTCDATETIME() WHERE OnboardingManuscriptBuildID = @BuildID; END; GO CREATE OR ALTER PROCEDURE dbo.StoryIntelligenceSource_ChapterText_GetAdmin @ChapterID int AS BEGIN SET NOCOUNT ON; SELECT p.ProjectID, p.ProjectName, b.BookID, b.BookTitle, b.Subtitle AS BookSubtitle, c.ChapterID, c.ChapterNumber, c.ChapterTitle, source.SourceText, source.SourceWordCount, source.SourceCharacterCount FROM dbo.Chapters c INNER JOIN dbo.Books b ON b.BookID = c.BookID INNER JOIN dbo.Projects p ON p.ProjectID = b.ProjectID LEFT JOIN dbo.ManuscriptStructuralChapterSources source ON source.ChapterID = c.ChapterID WHERE c.ChapterID = @ChapterID AND c.IsArchived = 0 AND b.IsArchived = 0 AND p.IsArchived = 0; END; GO