UFN_CONSTITUENT_BUILDRECENTCHANGESQUERY

Builds a query for pulling recent changes for constituent records.

Return

Return Type
nvarchar(max)

Parameters

Parameter Parameter Type Mode Description
@SOURCETABLENAME nvarchar(100) IN
@DISPLAYEXPRESSION nvarchar(300) IN
@RECORDID uniqueidentifier IN
@CHANGEAGENT nvarchar(128) IN
@INCLUDEUNASSIGNED bit IN
@FUNDRAISERID uniqueidentifier IN
@TYPE nvarchar(20) IN
@DEFAULTDISPLAYTEXT nvarchar(20) IN
@ADDEDVIEWFORMID uniqueidentifier IN
@EDITEDVIEWFORMID uniqueidentifier IN
@DELETEDVIEWFORMID uniqueidentifier IN
@ORIGINALADDVIEWFORMID uniqueidentifier IN
@ISADMIN bit IN
@APPLYDATEFILTER bit IN

Definition

Copy


            CREATE function dbo.UFN_CONSTITUENT_BUILDRECENTCHANGESQUERY
            (
                @SOURCETABLENAME nvarchar(100),
                @DISPLAYEXPRESSION nvarchar(300),
                @RECORDID uniqueidentifier,
                @CHANGEAGENT nvarchar(128),
                @INCLUDEUNASSIGNED bit,
                @FUNDRAISERID uniqueidentifier,
                @TYPE nvarchar(20),
                @DEFAULTDISPLAYTEXT nvarchar(20),
                @ADDEDVIEWFORMID uniqueidentifier,
                @EDITEDVIEWFORMID uniqueidentifier,
                @DELETEDVIEWFORMID uniqueidentifier,
                @ORIGINALADDVIEWFORMID uniqueidentifier,
                @ISADMIN bit,
                @APPLYDATEFILTER bit
            )
            returns nvarchar(max)
            with execute as caller
            as begin

                /* EDITTYPECODE  
                    0 = Add
                    1 = Edit
                    2 = Delete
                    100 = Original Add (after edited)
                */

                -- Find recent changes by selecting the most recent changes for each change

                -- type independently and then unioning the results and getting the most 

                -- recent changes of the combined list.


                -- Setup common query elements

                declare @SQLCOMMONJOINS nvarchar(max) = 'inner join dbo.CONSTITUENT on BASETABLE.CONSTITUENTID = CONSTITUENT.ID ' + char(13)
                if @RECORDID is null -- If RECORDID is null, we need to check if either INCLUDEUNASSIGNED is true or the constituent's manager matches FUNDRAISERID

                    set @SQLCOMMONJOINS = @SQLCOMMONJOINS + 'left join dbo.RELATIONSHIPMANAGER on RELATIONSHIPMANAGER.CONSTITUENTID = CONSTITUENT.ID ' + char(13)
                if coalesce(@CHANGEAGENT, '') <> ''
                    set @SQLCOMMONJOINS = @SQLCOMMONJOINS + 'left join dbo.CHANGEAGENT on CHANGEAGENT.ID = BASETABLE.<CHANGEAGENT> ' + char(13)

                declare @SQLCOMMONPREDICATES nvarchar(max) = 'CONSTITUENT.ISCONSTITUENT = 1' + char(13)

                if @APPLYDATEFILTER = 1
                    set @SQLCOMMONPREDICATES = @SQLCOMMONPREDICATES + ' and BASETABLE.<CHANGEDATE> between @STARTDATE and @ENDDATE ' + char(13)

                if @ISADMIN = 0
                    set @SQLCOMMONPREDICATES = @SQLCOMMONPREDICATES + ' 
                                                                and
                                                                (
                                                                    dbo.UFN_SECURITY_APPUSER_GRANTED_DATALIST_FORCONSTIT(@CURRENTAPPUSERID, @SECURITYFEATUREID, BASETABLE.CONSTITUENTID) = 1 and
                                                                    exists 
                                                                    (
                                                                        select 1 from dbo.UFN_SITEID_MAPFROM_CONSTITUENTID(BASETABLE.CONSTITUENTID) as CONSTITUENTSITE
                                                                        where 
                                                                            exists
                                                                            (
                                                                                select 1 
                                                                                from dbo.UFN_SITESFORUSERONFEATURE(@CURRENTAPPUSERID,@SECURITYFEATUREID,@SECURITYFEATURETYPE) 
                                                                                where 
                                                                                    SITEID= CONSTITUENTSITE.[SITEID] or 
                                                                                    (
                                                                                        SITEID is null and CONSTITUENTSITE.[SITEID] is null
                                                                                    )
                                                                            )
                                                                    )
                                                                ) ' + CHAR(13)

                -- Viewing a record turns off all other filters so only apply FUNDRAISER filters when @RECORDID is null

                if @RECORDID is not null
                    set @SQLCOMMONPREDICATES = @SQLCOMMONPREDICATES + ' and BASETABLE.<RECORDID> = @RECORDID ' + CHAR(13)
                else
                begin
                    if @FUNDRAISERID is not null and @INCLUDEUNASSIGNED = 1
                        set @SQLCOMMONPREDICATES = @SQLCOMMONPREDICATES + ' 
                            and
                            (
                                RELATIONSHIPMANAGER.FUNDRAISERID = @FUNDRAISERID or 
                                RELATIONSHIPMANAGER.ID is null
                            ) ' + CHAR(13)
                    else if @FUNDRAISERID is not null
                            set @SQLCOMMONPREDICATES = @SQLCOMMONPREDICATES + ' and RELATIONSHIPMANAGER.FUNDRAISERID = @FUNDRAISERID '
                    else if @INCLUDEUNASSIGNED = 1
                        set @SQLCOMMONPREDICATES = @SQLCOMMONPREDICATES + ' and RELATIONSHIPMANAGER.ID is null '
                    else -- If the user isn't a FUNDRAISER and INCLUDEUNASSIGNED is false, no constituents will meet the criteria so the routine should just return an empty string indicating this section isn't applicable

                        return null
                end

                declare @SQLCURRENTVALUEJOINS nvarchar(max) = '
                    left join dbo.<SOURCETABLENAME> [CURRENTEXISTING] on [CURRENTEXISTING].ID = BASETABLE.AUDITRECORDID
                    left join 
                    (
                        select top 1
                            AUDITRECORDID,
                            ' + replace(@DISPLAYEXPRESSION, '<DISPLAYTABLE>', 'AUDIT') + ' as DISPLAY,
                            DATEADDED,
                            AUDITID
                        from dbo.<SOURCETABLENAME>AUDIT as AUDIT
                        where AUDITTYPECODE = 2
                        order by AUDITDATE desc    
                    ) as [CURRENTDELETED] on 
                        [CURRENTDELETED].AUDITRECORDID = BASETABLE.AUDITRECORDID and
                        [CURRENTEXISTING].ID is null'

                declare @SQLCURRENTVALUEDISPLAY nvarchar(max) = '
                    case 
                        when [CURRENTEXISTING].ID is not null then ' + replace(@DISPLAYEXPRESSION, '<DISPLAYTABLE>', 'CURRENTEXISTING') + '
                        else [CURRENTDELETED].DISPLAY
                    end'                

                if coalesce(@CHANGEAGENT, '') <> ''
                    set @SQLCOMMONPREDICATES = @SQLCOMMONPREDICATES + ' and CHANGEAGENT.ID in (select ID from dbo.CHANGEAGENT where USERNAME=@CHANGEAGENT) ' + CHAR(13)

                -- Find changes as a result of being added

                declare @SQLADDEDRECORDS nvarchar(max) = '
                select top(@MAXROWS)
                    BASETABLE.ID RECORDID,
                    cast(null as uniqueidentifier) as AUDITID,
                    cast(null as uniqueidentifier) as AUDITKEY,
                    BASETABLE.CONSTITUENTID, 
                    cast(0 as tinyint) EDITTYPECODE,
                    BASETABLE.ADDEDBYID CHANGEAGENTID,
                    BASETABLE.DATEADDED CHANGEDATE,
                    ' + replace(@DISPLAYEXPRESSION, '<DISPLAYTABLE>', 'BASETABLE') + ' DISPLAY,
                    1 LASTCHANGE,
                    1 ROWEXISTS,
                    case when [ROLLBACK].DATEADDED = [ROLLBACK].DATECHANGED then [ROLLBACK].DATEADDED else [ROLLBACK].AUDITDATE end ROLLBACKTODATE,
                    case when CONSTITUENTDATAREVIEWROLLBACK.ID is not null then CONSTITUENTDATAREVIEWROLLBACKREASON.CODE + '' - '' + CONSTITUENTDATAREVIEWROLLBACKREASON.DESCRIPTION end ROLLBACKREASON
                from dbo.<SOURCETABLENAME> as BASETABLE
                left join dbo.CONSTITUENTDATAREVIEWROLLBACK on CONSTITUENTDATAREVIEWROLLBACK.CONTEXTRECORDID = BASETABLE.ID and CONSTITUENTDATAREVIEWROLLBACK.ROLLBACKAUDITID is null
                left join dbo.CONSTITUENTDATAREVIEWROLLBACKREASON on CONSTITUENTDATAREVIEWROLLBACKREASON.ID = CONSTITUENTDATAREVIEWROLLBACK.CONSTITUENTDATAREVIEWROLLBACKREASONID
                left join dbo.<SOURCETABLENAME>AUDIT [ROLLBACK] on [ROLLBACK].AUDITID = CONSTITUENTDATAREVIEWROLLBACK.SOURCEAUDITID ' + char(13) +
                replace(@SQLCOMMONJOINS, '<CHANGEAGENT>', 'ADDEDBYID') + char(13) + 
                'where 
                    BASETABLE.DATEADDED = BASETABLE.DATECHANGED and ' + char(13) + 
                    @SQLCOMMONPREDICATES + char(13) +
                'order by BASETABLE.DATEADDED desc'

                set @SQLADDEDRECORDS = replace(replace(@SQLADDEDRECORDS, '<CHANGEDATE>', 'DATEADDED'), '<RECORDID>', 'ID')


                -- Find changes as a result of being edited

                declare @SQLEDITEDRECORDS nvarchar(max) = '
                select
                    BASETABLE.AUDITRECORDID RECORDID,
                    BASETABLE.AUDITID,
                    BASETABLE.AUDITKEY,
                    BASETABLE.CONSTITUENTID, 
                    cast(1 as tinyint) EDITTYPECODE,
                    BASETABLE.AUDITCHANGEAGENTID CHANGEAGENTID,
                    BASETABLE.AUDITDATE CHANGEDATE,
                    ' + @SQLCURRENTVALUEDISPLAY + ',
                    case when [CURRENTEXISTING].ID is not null and AFTER.DATECHANGED = [CURRENTEXISTING].DATECHANGED then 1 else 0 end LASTCHANGE,
                    case when [CURRENTEXISTING].ID is not null then 1 else 0 end ROWEXISTS,
                    case when [ROLLBACK].DATEADDED = [ROLLBACK].DATECHANGED then [ROLLBACK].DATEADDED else [ROLLBACK].AUDITDATE end ROLLBACKTODATE,
                    case when CONSTITUENTDATAREVIEWROLLBACK.ID is not null then CONSTITUENTDATAREVIEWROLLBACKREASON.CODE + '' - '' + CONSTITUENTDATAREVIEWROLLBACKREASON.DESCRIPTION end ROLLBACKREASON
                from 
                @<SOURCETABLENAME>EDITBASETABLE BASETABLE ' + char(13) + 
                @SQLCURRENTVALUEJOINS + char(13) + '
                inner join dbo.<SOURCETABLENAME>AUDIT AFTER on AFTER.AUDITKEY = BASETABLE.AUDITKEY and AFTER.AUDITRECORDID = BASETABLE.AUDITRECORDID and AFTER.AUDITTYPECODE = 1
                left join dbo.CONSTITUENTDATAREVIEWROLLBACK on CONSTITUENTDATAREVIEWROLLBACK.ROLLBACKAUDITID = AFTER.AUDITID
                left join dbo.CONSTITUENTDATAREVIEWROLLBACKREASON on CONSTITUENTDATAREVIEWROLLBACKREASON.ID = CONSTITUENTDATAREVIEWROLLBACK.CONSTITUENTDATAREVIEWROLLBACKREASONID
                left join dbo.<SOURCETABLENAME>AUDIT [ROLLBACK] on [ROLLBACK].AUDITID = CONSTITUENTDATAREVIEWROLLBACK.SOURCEAUDITID'


                set @SQLEDITEDRECORDS = replace(replace(@SQLEDITEDRECORDS, '<CHANGEDATE>', 'AUDITDATE'), '<RECORDID>', 'AUDITRECORDID')


                -- Find changes as a result of being deleted

                declare @SQLDELETEDRECORDS nvarchar(max) = '
                select top(@MAXROWS)
                    BASETABLE.AUDITRECORDID RECORDID,
                    BASETABLE.AUDITID,
                    BASETABLE.AUDITKEY,
                    BASETABLE.CONSTITUENTID,
                    cast(2 as tinyint) EDITTYPECODE,
                    BASETABLE.AUDITCHANGEAGENTID CHANGEAGENTID,
                    BASETABLE.AUDITDATE CHANGEDATE,
                    ' + @SQLCURRENTVALUEDISPLAY + ',
                    case when BASETABLE.AUDITID = [CURRENTDELETED].AUDITID then 1 else 0 end LASTCHANGE,
                    case when [CURRENTEXISTING].ID is not null then 1 else 0 end ROWEXISTS,
                    null,
                    case when CONSTITUENTDATAREVIEWROLLBACK.ID is not null then CONSTITUENTDATAREVIEWROLLBACKREASON.CODE + '' - '' + CONSTITUENTDATAREVIEWROLLBACKREASON.DESCRIPTION end ROLLBACKREASON
                from dbo.<SOURCETABLENAME>AUDIT as BASETABLE' + char(13) + 
                @SQLCURRENTVALUEJOINS + char(13) + '
                left join dbo.CONSTITUENTDATAREVIEWROLLBACK on CONSTITUENTDATAREVIEWROLLBACK.ROLLBACKAUDITID = BASETABLE.AUDITID and CONSTITUENTDATAREVIEWROLLBACK.SOURCEAUDITID is null
                left join dbo.CONSTITUENTDATAREVIEWROLLBACKREASON on CONSTITUENTDATAREVIEWROLLBACKREASON.ID = CONSTITUENTDATAREVIEWROLLBACK.CONSTITUENTDATAREVIEWROLLBACKREASONID ' + char(13) +
                replace(@SQLCOMMONJOINS, '<CHANGEAGENT>', 'AUDITCHANGEAGENTID') + char(13) + 
                'where 
                    AUDITTYPECODE = 2 and ' + 
                    @SQLCOMMONPREDICATES + 
                ' order by BASETABLE.AUDITDATE desc'

                set @SQLDELETEDRECORDS = replace(replace(@SQLDELETEDRECORDS, '<CHANGEDATE>', 'AUDITDATE'), '<RECORDID>', 'AUDITRECORDID')


                -- Find changes as a result of being added (after edited)

                declare @SQLORIGINALADD nvarchar(MAX) = '
                select top(@MAXROWS)
                    BASETABLE.AUDITRECORDID RECORDID,
                    BASETABLE.AUDITID,
                    BASETABLE.AUDITKEY,
                    BASETABLE.CONSTITUENTID, 
                    cast(100 as tinyint) EDITTYPECODE,
                    BASETABLE.ADDEDBYID CHANGEAGENTID,
                    BASETABLE.DATEADDED CHANGEDATE,
                    ' + @SQLCURRENTVALUEDISPLAY + ',
                    0 LASTCHANGE,
                    case when [CURRENTEXISTING].ID is not null then 1 else 0 end ROWEXISTS,
                    case when [ROLLBACK].DATEADDED = [ROLLBACK].DATECHANGED then [ROLLBACK].DATEADDED else [ROLLBACK].AUDITDATE end ROLLBACKTODATE,
                    case when isnull(CONSTITUENTDATAREVIEWROLLBACK.ID,[ROLLBACKAUDITIDNULL].ID) is not null then CONSTITUENTDATAREVIEWROLLBACKREASON.CODE + '' - '' + CONSTITUENTDATAREVIEWROLLBACKREASON.DESCRIPTION end ROLLBACKREASON
                from dbo.<SOURCETABLENAME>AUDIT as BASETABLE ' + char(13) + 
                @SQLCURRENTVALUEJOINS + char(13) + '
                left join dbo.CONSTITUENTDATAREVIEWROLLBACK on CONSTITUENTDATAREVIEWROLLBACK.ROLLBACKAUDITID = BASETABLE.AUDITID and CONSTITUENTDATAREVIEWROLLBACK.SOURCEAUDITID is not null
                left join dbo.CONSTITUENTDATAREVIEWROLLBACK [ROLLBACKAUDITIDNULL] on 
                    [ROLLBACKAUDITIDNULL].CONTEXTRECORDID = BASETABLE.AUDITRECORDID and 
                    [ROLLBACKAUDITIDNULL].ROLLBACKAUDITID is null and 
                    BASETABLE.DATEADDED = case when [CURRENTEXISTING].ID is not null then [CURRENTEXISTING].DATEADDED else [CURRENTDELETED].DATEADDED end
                left join dbo.CONSTITUENTDATAREVIEWROLLBACKREASON on CONSTITUENTDATAREVIEWROLLBACKREASON.ID = isnull(CONSTITUENTDATAREVIEWROLLBACK.CONSTITUENTDATAREVIEWROLLBACKREASONID,[ROLLBACKAUDITIDNULL].CONSTITUENTDATAREVIEWROLLBACKREASONID)
                left join dbo.<SOURCETABLENAME>AUDIT [ROLLBACK] on [ROLLBACK].AUDITID = isnull(CONSTITUENTDATAREVIEWROLLBACK.SOURCEAUDITID,[ROLLBACKAUDITIDNULL].SOURCEAUDITID) ' + char(13) + 
                replace(@SQLCOMMONJOINS, '<CHANGEAGENT>', 'ADDEDBYID') + 
                'where 
                    BASETABLE.DATEADDED = BASETABLE.DATECHANGED and ' + char(13) + 
                    @SQLCOMMONPREDICATES + char(13) +
                ' order by BASETABLE.DATEADDED desc'

                set @SQLORIGINALADD = replace(replace(@SQLORIGINALADD, '<CHANGEDATE>', 'DATEADDED'), '<RECORDID>', 'AUDITRECORDID')


                -- Combine the four change type queries

                declare @COMBINEDSQL nvarchar(max) = '
                    select top(@MAXROWS)
                        RECORDID,
                        AUDITID,
                        AUDITKEY,
                        CONSTITUENTID,
                        EDITTYPECODE,
                        CHANGEAGENTID,
                        CHANGEDATE,
                        case len(DISPLAY) when 0 then ''' + @DEFAULTDISPLAYTEXT + ''' else DISPLAY end [DISPLAY],
                        LASTCHANGE,
                        ROWEXISTS,
                        ROLLBACKTODATE,
                        ROLLBACKREASON,
                        case EDITTYPECODE 
                            when 0 then ''' + cast(@ADDEDVIEWFORMID as nvarchar(36)) + '''
                            when 1 then ''' + cast(@EDITEDVIEWFORMID as nvarchar(36)) + '''
                            when 2 then ''' + cast(@DELETEDVIEWFORMID as nvarchar(36)) + '''
                            when 100 then ''' + cast(@ORIGINALADDVIEWFORMID as nvarchar(36)) + '''
                        end VIEWFORMID,
                        ''' + @TYPE + ''' as [TYPE]
                    from (' + 
                    @SQLADDEDRECORDS + char(13) + 
                    ' union all ' + 
                    @SQLEDITEDRECORDS + char(13) + 
                    ' union all ' + 
                    @SQLDELETEDRECORDS + char(13) + 
                    ' union all ' + 
                    @SQLORIGINALADD + 
                    ') as DERIVED order by CHANGEDATE desc'

                return replace(@COMBINEDSQL, '<SOURCETABLENAME>', @SOURCETABLENAME)
            end