go

CREATE OR ALTER PROCEDURE [dbo].[_as_Fix_PostGLCreatedBranch]
AS
BEGIN
    SET NOCOUNT ON;

    ---------------------------------------------------------------------------------------
    -- 1. Create the log table if it does not exist
    ---------------------------------------------------------------------------------------
	--select * from _as_PostGL_FixLog
    IF NOT EXISTS (
        SELECT 1
        FROM sys.tables t
        WHERE t.name = '_as_PostGL_FixLog'
          AND t.schema_id = SCHEMA_ID('dbo')
    )
    BEGIN
        CREATE TABLE dbo._as_PostGL_FixLog
        (
            LogID                BIGINT IDENTITY(1,1) NOT NULL PRIMARY KEY,
            PostGL_AutoIdx       BIGINT                NOT NULL,
            OldAuditNumber       VARCHAR(255)       NOT NULL,
            NewAuditNumber       VARCHAR(255)       NOT NULL,
            Old_iTxBranchId      BIGINT                NOT NULL,
            New_iTxBranchId      BIGINT                NOT NULL,
            Old_PostGL_iBranchID BIGINT                NOT NULL,
            New_PostGL_iBranchID BIGINT                NOT NULL,
            FixDate              DATETIME           NOT NULL CONSTRAINT DF__as_PostGLFixLog_FixDate DEFAULT GETDATE(),
            Old_Reference        VARCHAR(255)       NULL,
            New_Reference        VARCHAR(255)       NULL
        );
    END;

    ---------------------------------------------------------------------------------------
    -- 2. Update PostGL with OUTPUT clause to log changes into _as_PostGL_FixLog
    ---------------------------------------------------------------------------------------
 

    UPDATE p
    SET cAuditNumber = CASE
        WHEN (LEN(cAuditNumber) - LEN(REPLACE(cAuditNumber, '.', ''))) >= 2 THEN
            CAST(PostGL_iCreatedBranchID AS VARCHAR(10))
            + '.'
            + SUBSTRING(
                cAuditNumber,
                CHARINDEX('.', cAuditNumber) + 1,
                LEN(cAuditNumber)
              )
        ELSE
            CAST(PostGL_iCreatedBranchID AS VARCHAR(10))
            + '.'
            + cAuditNumber
        END,
        iTxBranchID = PostGL_iCreatedBranchID,
        PostGL_iBranchID = PostGL_iCreatedBranchID
    OUTPUT
        deleted.AutoIdx                 AS PostGL_AutoIdx,
        deleted.cAuditNumber           AS OldAuditNumber,
        inserted.cAuditNumber          AS NewAuditNumber,
        deleted.iTxBranchID            AS Old_iTxBranchId,
        inserted.iTxBranchID           AS New_iTxBranchId,
        deleted.PostGL_iBranchID       AS Old_PostGL_iBranchID,
        inserted.PostGL_iBranchID      AS New_PostGL_iBranchID,
        deleted.Reference             AS Old_Reference,
        inserted.Reference            AS New_Reference
    INTO dbo._as_PostGL_FixLog
        (PostGL_AutoIdx,
         OldAuditNumber,
         NewAuditNumber,
         Old_iTxBranchId,
         New_iTxBranchId,
         Old_PostGL_iBranchID,
         New_PostGL_iBranchID,
         Old_Reference,
         New_Reference)
		 --select * 
	FROM PostGL p
        WHERE p.iTxBranchID <> p.PostGL_iCreatedBranchID
          AND p.PostGL_iCreatedBranchID > 0
          AND p.UserName = 'SDK'
		  AND p.TxDate >= DATEADD(MONTH,-2,GETDATE())
		 ;

    ---------------------------------------------------------------------------------------
    -- 3. Build the HTML email with changes from the last 2 minutes
    ---------------------------------------------------------------------------------------
    DECLARE @EmailBody NVARCHAR(MAX) = N'';
    DECLARE @IntroText NVARCHAR(MAX) = N'<p>Hello,<br/>Below is a summary of the PostGL records updated by _as_Fix_PostGLCreatedBranch procedure.</p>';

    SET @EmailBody = N'<html><head><meta charset="UTF-8"></head><body>'
        + @IntroText
        + N'<table style="border-collapse:collapse; font-family:Arial, sans-serif;">'
        + N'<tr style="background-color:#003366; color:#D3D3D3;">'
        + N'<th style="border:1px solid #000; padding:5px;">AutoIdx</th>'
        + N'<th style="border:1px solid #000; padding:5px;">Reference</th>'
        + N'<th style="border:1px solid #000; padding:5px;">Old AuditNumber</th>'
        + N'<th style="border:1px solid #000; padding:5px;">New AuditNumber</th>'
        + N'<th style="border:1px solid #000; padding:5px;">iTxBranchID</th>'
        + N'</tr>';

	/*Early out, if not changes.*/
	IF NOT EXISTS (SELECT * FROM dbo._as_PostGL_FixLog WHERE FixDate >= DATEADD(MINUTE, -2, GETDATE())) RETURN -1;

    WITH LogData AS
    (
        SELECT
            LogID,
            PostGL_AutoIdx,
            OldAuditNumber,
            NewAuditNumber,
            Old_iTxBranchId,
            New_iTxBranchId,
            Old_Reference,
            New_Reference,
            ROW_NUMBER() OVER (ORDER BY LogID DESC) AS RowNum
        FROM dbo._as_PostGL_FixLog
        WHERE FixDate >= DATEADD(MINUTE, -2, GETDATE())
    )
    SELECT @EmailBody +=
        N'<tr style="background-color:'
        + CASE WHEN (RowNum % 2) = 1 THEN '#FFFFFF' ELSE '#F0F0F0' END
        + N';">'
        + N'<td style="border:1px solid #000; padding:5px;">' + CAST(PostGL_AutoIdx AS NVARCHAR(20)) + N'</td>'
        + N'<td style="border:1px solid #000; padding:5px;">' + ISNULL(New_Reference,'') + N'</td>'
        + N'<td style="border:1px solid #000; padding:5px;">' + ISNULL(OldAuditNumber,'') + N'</td>'
        + N'<td style="border:1px solid #000; padding:5px;">' + ISNULL(NewAuditNumber,'') + N'</td>'
        + N'<td style="border:1px solid #000; padding:5px;">' + CAST(New_iTxBranchId AS NVARCHAR(20)) + N'</td>'
        + N'</tr>'
    FROM LogData;

    SET @EmailBody += N'</table></body></html>';

	declare @subject nvarchar(255)
	SET @subject = CONCAT(DB_Name(),' - PostGL Fix Updates - RUN GL RELINK!')

    EXEC msdb.dbo.sp_send_dbmail
         @profile_name = 'AsamcoMailProfile',
         @recipients   = 'alex+ite@asamco.com;admin@swansalt.co.za;shaun@iteproducts.co.za;frik@iteproducts.co.za',
         @subject      = @subject,
         @body         = @EmailBody,
         @body_format  = 'HTML';
END; 
GO