TR_GLACCOUNT_UPD

Definition

Copy

                CREATE trigger [dbo].[TR_GLACCOUNT_UPD] ON [dbo].[GLACCOUNT]
            with execute as owner                
            for update
            as
            begin

                set nocount on
                declare @IsBasicGL bit
                declare @ChangeAgentID uniqueidentifier
                declare @AcctSysID uniqueidentifier
                declare @AccountNumber nvarchar(100);
                declare @AccountDescription nvarchar(400);    
                declare @CURRENTDATE datetime = getdate();
                declare @ACCOUNTALIAS nvarchar(100); 

                if (select count(*) from deleted) > 0 and (select count(*) from inserted) = 0
                    select top 1 @IsBasicGL = ISBASICGL from deleted t1 join PDACCOUNTSYSTEM t2 on t1.PDACCOUNTSYSTEMID = t2.ID
                else                
                    select top 1 @IsBasicGL = ISBASICGL from inserted t1 join PDACCOUNTSYSTEM t2 on t1.PDACCOUNTSYSTEMID = t2.ID

                select top 1 @ChangeAgentID = ADDEDBYID, @AcctSysID=PDACCOUNTSYSTEMID, @AccountNumber = ACCOUNTNUMBER, @AccountDescription = ACCOUNTDESCRIPTION, @ACCOUNTALIAS = ACCOUNTALIAS from inserted order by DATEADDED

                if @IsBasicGL = 1
                    begin
                        if update(ACCOUNTNUMBER)
                            begin
                                if exists (select t1.* from inserted t1 inner join deleted t2 on t1.ID = t2.ID where t1.ACCOUNTNUMBER != t2.ACCOUNTNUMBER)
                                    begin


                                    if dbo.UFN_GLACCOUNT_VERIFYACCOUNTNUMBER2(@AccountNumber,@AcctSysID) = 0
                                        BEGIN
                                            RAISERROR ('CK_GLACCOUNT_ACCOUNTNUMBERVALID', 16, 1)
                                            ROLLBACK
                                        END

                                    if @AccountNumber is null or @AccountNumber = ''
                                        BEGIN
                                            RAISERROR ('CK_GLACCOUNT_ACCOUNTNUMBER', 16, 1)
                                            ROLLBACK
                                        END        
                                    if @AccountDescription is null or @AccountDescription = ''
                                        BEGIN
                                            RAISERROR ('CK_GLACCOUNT_ACCOUNTDESCRIPTION', 16, 1)
                                            ROLLBACK
                                        END                    
                                    if exists(select 1 from GLACCOUNT where ACCOUNTNUMBER = @AccountNumber and PDACCOUNTSYSTEMID = @AcctSysID having COUNT(ID) > 1)
                                        BEGIN
                                            RAISERROR ('UIX_GLACCOUNT_PDACCOUNTSYSTEMID_ACCOUNTNUMBER', 16, 1)
                                            ROLLBACK
                                        END        

                        if (len(@ACCOUNTALIAS) > 100)
                            BEGIN
                                RAISERROR ('CK_GLACCOUNT_ACCOUNTALIASLENGTH', 16, 1)
                                ROLLBACK
                            END     

                  if dbo.UFN_GLACCOUNT_VERIFYFENXTACCOUNT(@ACCTSYSID, @ACCOUNTALIAS, @ACCOUNTNUMBER) = 0
                    BEGIN
                      RAISERROR ('CK_GLACCOUNT_FENXTACCOUNTMISSING',16,1)
                      ROLLBACK
                    END

                  if dbo.UFN_GLACCOUNT_VERIFYFENXTPROJECTREQUIREDACCOUNT(@ACCTSYSID, @ACCOUNTALIAS, @ACCOUNTNUMBER) = 1
                    BEGIN
                      RAISERROR ('CK_GLACCOUNT_FENXTPROJECTREQUIRED',16,1)
                      ROLLBACK
                    END

                  insert into dbo.PDACCOUNTSEGMENTVALUE (PDACCOUNTSTRUCTUREID, SHORTDESCRIPTION, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
                                        select distinct ID, SegValue, @ChangeAgentID, @ChangeAgentID, getdate() AS DATEADDED, getdate() AS DATECHANGED
                                        from
                                        (select t1.ID,
                                        case t1.SEQUENCE
                                            when 1 then t2.SEG1VALUE
                                            when 2 then t2.SEG2VALUE
                                            when 3 then t2.SEG3VALUE
                                            when 4 then t2.SEG4VALUE
                                            when 5 then t2.SEG5VALUE
                                            when 6 then t2.SEG6VALUE
                                            when 7 then t2.SEG7VALUE
                                            when 8 then t2.SEG8VALUE
                                            when 9 then t2.SEG9VALUE
                                            when 10 then t2.SEG10VALUE
                                            when 11 then t2.SEG11VALUE
                                            when 12 then t2.SEG12VALUE
                                            when 13 then t2.SEG13VALUE
                                            when 14 then t2.SEG14VALUE
                                            when 15 then t2.SEG15VALUE
                                            when 16 then t2.SEG16VALUE
                                            when 17 then t2.SEG17VALUE
                                            when 18 then t2.SEG18VALUE
                                            when 19 then t2.SEG19VALUE
                                            when 20 then t2.SEG20VALUE
                                            when 21 then t2.SEG21VALUE
                                            when 22 then t2.SEG22VALUE
                                            when 23 then t2.SEG23VALUE
                                            when 24 then t2.SEG24VALUE
                                            when 25 then t2.SEG25VALUE
                                            when 26 then t2.SEG26VALUE
                                            when 27 then t2.SEG27VALUE
                                            when 28 then t2.SEG28VALUE
                                            when 29 then t2.SEG29VALUE
                                            when 30 then t2.SEG30VALUE
                                        end as SegValue
                                        from (select * from dbo.PDACCOUNTSTRUCTURE where PDACCOUNTSYSTEMID = @AcctSysID)  t1 cross join inserted t2 ) V1
                                        where not exists (select * from dbo.PDACCOUNTSEGMENTVALUE where PDACCOUNTSTRUCTUREID = V1.ID and SHORTDESCRIPTION = V1.SegValue)

                                        update dbo.PDACCOUNTSEGMENTVALUE set TYPECODE = 1 where PDACCOUNTSTRUCTUREID in (select T1.ID from PDACCOUNTSTRUCTURE T1 join inserted T2 on T1.PDACCOUNTSYSTEMID = T2.PDACCOUNTSYSTEMID where SEGMENTTYPE = 1)

                                        merge dbo.PDACCOUNTSEGMENT as Target
                                        using (select V1.GLACCOUNTID, V1.PDACCOUNTSTRUCTUREID, t3.ID, @ChangeAgentID AS ADDEDBYID, @ChangeAgentID AS CHANGEDBYID, getdate() as DATEADDED, getdate() as DATECHANGED
                                            from
                                            (select t1.ID as PDACCOUNTSTRUCTUREID, t2.ID as GLACCOUNTID, 
                                            case t1.SEQUENCE
                                                when 1 then t2.SEG1VALUE
                                                when 2 then t2.SEG2VALUE
                                                when 3 then t2.SEG3VALUE
                                                when 4 then t2.SEG4VALUE
                                                when 5 then t2.SEG5VALUE
                                                when 6 then t2.SEG6VALUE
                                                when 7 then t2.SEG7VALUE
                                                when 8 then t2.SEG8VALUE
                                                when 9 then t2.SEG9VALUE
                                                when 10 then t2.SEG10VALUE
                                                when 11 then t2.SEG11VALUE
                                                when 12 then t2.SEG12VALUE
                                                when 13 then t2.SEG13VALUE
                                                when 14 then t2.SEG14VALUE
                                                when 15 then t2.SEG15VALUE
                                                when 16 then t2.SEG16VALUE
                                                when 17 then t2.SEG17VALUE
                                                when 18 then t2.SEG18VALUE
                                                when 19 then t2.SEG19VALUE
                                                when 20 then t2.SEG20VALUE
                                                when 21 then t2.SEG21VALUE
                                                when 22 then t2.SEG22VALUE
                                                when 23 then t2.SEG23VALUE
                                                when 24 then t2.SEG24VALUE
                                                when 25 then t2.SEG25VALUE
                                                when 26 then t2.SEG26VALUE
                                                when 27 then t2.SEG27VALUE
                                                when 28 then t2.SEG28VALUE
                                                when 29 then t2.SEG29VALUE
                                                when 30 then t2.SEG30VALUE
                                            end as SegValue
                                            from (select * from dbo.PDACCOUNTSTRUCTURE where PDACCOUNTSYSTEMID = @AcctSysID)  t1 cross join inserted t2 ) V1
                                            inner join dbo.PDACCOUNTSEGMENTVALUE t3 on V1.SegValue = t3.SHORTDESCRIPTION and V1.PDACCOUNTSTRUCTUREID = t3.PDACCOUNTSTRUCTUREID) as Source
                                        on (Target.PDACCOUNTSTRUCTUREID = Source.PDACCOUNTSTRUCTUREID and Target.GLACCOUNTID = Source.GLACCOUNTID)
                                        when matched then
                                            update set Target.PDACCOUNTSEGMENTVALUEID = Source.ID,
                                                Target.CHANGEDBYID = Source.CHANGEDBYID,
                                                Target.DATECHANGED = Source.DATECHANGED
                                        when not matched by Target then
                                            insert (GLACCOUNTID, PDACCOUNTSTRUCTUREID, PDACCOUNTSEGMENTVALUEID, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
                                            values (Source.GLACCOUNTID, Source.PDACCOUNTSTRUCTUREID, Source.ID, Source.ADDEDBYID, Source.CHANGEDBYID, Source.DATEADDED, Source.DATECHANGED);                        

                                        declare @GLACCOUNTID uniqueidentifier;
                                        select top 1 @GLACCOUNTID = ID from inserted order by dateadded desc;

                                        declare @SQL nvarchar(4000)                    
                                        select @SQL = (select 'DATAELEMENT' + cast(T2.SEQUENCE as nvarchar(2))+ 'ID =' + '''' + convert(varchar(36),T1.PDACCOUNTSEGMENTVALUEID) + ''''  + ','  
                                        from dbo.PDACCOUNTSEGMENT T1
                                        join dbo.PDACCOUNTSTRUCTURE T2 on T1.PDACCOUNTSTRUCTUREID = T2.ID
                                        where  T1.GLACCOUNTID = @GLACCOUNTID 
                                        order by T2.SEQUENCE    for XML PATH('')) 

                                        set @SQL = @SQL + 'CHANGEDBYID = ' + '''' +  convert(varchar(36), @CHANGEAGENTID) + '''' + ', DATECHANGED = ' + '''' + convert(varchar(36),@CURRENTDATE,110) + '''' + ' where GLACCOUNT.ID = ' + '''' + convert(varchar(36),@GLACCOUNTID) + ''''
                                        set @SQL = 'update GLACCOUNT set ' + @SQL            

                                        exec (@SQL)                                            

                                        delete t1
                                        from dbo.PDACCOUNTSEGMENTVALUE t1
                                        where not exists (select * from dbo.PDACCOUNTSEGMENT where PDACCOUNTSEGMENTVALUEID = t1.id)


                            ------------------------------------------------------------------------------------------------

                            --    Hash Function   --  Calculates the hash based on the id of each segment value

                            ------------------------------------------------------------------------------------------------


                            ;with account_cte(ID, MD5HASHVALUE)
                            as
                            (
                                select
                                   id,
                                   dbo.UFN_GLACCOUNT_MD5_HASH_SEGMENTS(
                                   (
                                        select           
                                          pvt.[1] SEGMENT01ID, pvt.[2] SEGMENT02ID, pvt.[3] SEGMENT03ID, pvt.[4] SEGMENT04ID, pvt.[5] SEGMENT05ID, pvt.[6] SEGMENT06ID, pvt.[7] SEGMENT07ID, pvt.[8] SEGMENT08ID, pvt.[9] SEGMENT09ID, pvt.[10] SEGMENT10ID, pvt.[11] SEGMENT11ID, pvt.[12] SEGMENT12ID, pvt.[13] SEGMENT13ID, pvt.[14] SEGMENT14ID, pvt.[15] SEGMENT15ID, pvt.[16] SEGMENT16ID, pvt.[17] SEGMENT17ID, pvt.[18] SEGMENT18ID, pvt.[19] SEGMENT19ID, pvt.[20] SEGMENT20ID, pvt.[21] SEGMENT21ID, pvt.[22] SEGMENT22ID, pvt.[23] SEGMENT23ID, pvt.[24] SEGMENT24ID, pvt.[25] SEGMENT25ID, pvt.[26] SEGMENT26ID, pvt.[27] SEGMENT27ID, pvt.[28] SEGMENT28ID, pvt.[29] SEGMENT29ID, pvt.[30] SEGMENT30ID
                                        for XML raw('ROW'), type, elements, root('MAPPEDVALUES'), BINARY BASE64
                                   )) ACCOUNTHASH
                                from
                                (
                                    select g.id, cast(s.PDACCOUNTSEGMENTVALUEID as nvarchar(36)) PDACCOUNTSEGMENTVALUEID, ROW_NUMBER() over(partition by g.id order by s.PDACCOUNTSEGMENTVALUEID) segment
                                    from dbo.GLACCOUNT g inner join                                
                                         dbo.PDACCOUNTSEGMENT s on g.ID = s.GLACCOUNTID inner join
                                         inserted i on i.ID = g.ID
                                ) source
                                pivot
                                (
                                    max(PDACCOUNTSEGMENTVALUEID)
                                    for segment in ([1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12], [13], [14], [15], [16], [17], [18], [19], [20], [21], [22], [23], [24], [25], [26], [27], [28], [29], [30])
                                ) pvt
                            )
                            update dbo.GLACCOUNT
                            set MD5HASHVALUE = h.MD5HASHVALUE
                            from account_cte h inner join
                                 dbo.GLACCOUNT g on g.ID = h.ID

                            ------------------------------------------------------------------------------------------------


                    if update(ACCOUNTNUMBER)
                      delete from dbo.PDACCOUNTLOOKUPCACHE where PDACCOUNTSYSTEMID in (select PDACCOUNTSYSTEMID from inserted)
                                    end



                                end

                if update(ACCOUNTALIAS)
                  begin
                    if dbo.UFN_GLACCOUNT_VERIFYFENXTACCOUNT(@ACCTSYSID, @ACCOUNTALIAS, @ACCOUNTNUMBER) = 0
                      BEGIN
                        RAISERROR ('CK_GLACCOUNT_FENXTACCOUNTMISSING',16,1)
                        ROLLBACK
                      END

                    if dbo.UFN_GLACCOUNT_VERIFYFENXTPROJECTREQUIREDACCOUNT(@ACCTSYSID, @ACCOUNTALIAS, @ACCOUNTNUMBER) = 1
                      BEGIN
                        RAISERROR ('CK_GLACCOUNT_FENXTPROJECTREQUIRED',16,1)
                        ROLLBACK
                      END
                  end

    end

                        else if (select count(*) from deleted) > 0 or (select count(*) from inserted) > 0
                            begin
                if not ((charindex('*',@AccountDescription) = 0) and (charindex('?',@AccountDescription) = 0))
                begin
                  raiserror('CK_GLACCOUNT_DESCRIPTIONVALIDCHARACTERS', 16, 1)
                  rollback
                end

                                declare
                                  --@CURRENTDATE datetime = getdate(),

                                  @SEPARATOR nvarchar(1);

                  if exists(SELECT I.ID FROM INSERTED I WHERE I.ACCOUNTDESCRIPTION IN (SELECT ACCOUNTDESCRIPTION
                                      FROM dbo.GLACCOUNT WHERE GLACCOUNT.PDACCOUNTSYSTEMID = @AcctSysID and GLACCOUNT.ID <> I.ID)
                                      )
                            BEGIN
                                RAISERROR ('UIC_LEDGERACCOUNT_DESCRIPTION', 16, 1)
                                ROLLBACK
                            END

                                exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output;
                                select top 1 @SEPARATOR = SEPARATOR from dbo.PDACCOUNTSTRUCTURE where PDACCOUNTSYSTEMID = @AcctSysID;

                                ;with [ELEMENTS] as
                                (
                                  select unpvt.ID, DATAELEMENTID, SHORTDESCRIPTION, SEGMENTSEQUENCE
                                  from
                                    (select ID, DATAELEMENT1ID, DATAELEMENT2ID, DATAELEMENT3ID, DATAELEMENT4ID, DATAELEMENT5ID, DATAELEMENT6ID, DATAELEMENT7ID, DATAELEMENT8ID, DATAELEMENT9ID, DATAELEMENT10ID, 
                                    DATAELEMENT11ID, DATAELEMENT12ID, DATAELEMENT13ID, DATAELEMENT14ID, DATAELEMENT15ID, DATAELEMENT16ID, DATAELEMENT17ID, DATAELEMENT18ID, DATAELEMENT19ID, DATAELEMENT20ID, 
                                    DATAELEMENT21ID, DATAELEMENT22ID, DATAELEMENT23ID, DATAELEMENT24ID, DATAELEMENT25ID, DATAELEMENT26ID, DATAELEMENT27ID, DATAELEMENT28ID, DATAELEMENT29ID, DATAELEMENT30ID
                                    from inserted) as P
                                   unpivot
                                    (DATAELEMENTID for dColumn in 
                                      (DATAELEMENT1ID, DATAELEMENT2ID, DATAELEMENT3ID, DATAELEMENT4ID, DATAELEMENT5ID, DATAELEMENT6ID, DATAELEMENT7ID, DATAELEMENT8ID, DATAELEMENT9ID, DATAELEMENT10ID, 
                                      DATAELEMENT11ID, DATAELEMENT12ID, DATAELEMENT13ID, DATAELEMENT14ID, DATAELEMENT15ID, DATAELEMENT16ID, DATAELEMENT17ID, DATAELEMENT18ID, DATAELEMENT19ID, DATAELEMENT20ID, 
                                      DATAELEMENT21ID, DATAELEMENT22ID, DATAELEMENT23ID, DATAELEMENT24ID, DATAELEMENT25ID, DATAELEMENT26ID, DATAELEMENT27ID, DATAELEMENT28ID, DATAELEMENT29ID, DATAELEMENT30ID)
                                    ) as unpvt
                                  inner join dbo.PDACCOUNTSEGMENTVALUE on unpvt.DATAELEMENTID = PDACCOUNTSEGMENTVALUE.ID
                                  inner join dbo.PDACCOUNTSTRUCTURE on PDACCOUNTSEGMENTVALUE.PDACCOUNTSTRUCTUREID = PDACCOUNTSTRUCTURE.ID
                                ),
                                CTE as
                                (
                                  select 
                                    ID, 
                                    ACCT.list.value('.','nvarchar(100)') as ACCTSTR
                                  from
                                    inserted t1
                                  cross apply
                                    (
                                      select isnull(SHORTDESCRIPTION+@SEPARATOR,'')
                                      from [ELEMENTS]
                                      where t1.ID = [ELEMENTS].ID
                                      order by SEGMENTSEQUENCE
                                      for xml path(''), type
                                    ) ACCT (list)
                                )
                                update GLACCOUNT set
                                  ACCOUNTSTRING = left(T1.acctstr, len(T1.acctstr)-1),
                                  ACCOUNTNUMBER = left(T1.acctstr, len(T1.acctstr)-1),                                  
                                  CHANGEDBYID = @CHANGEAGENTID,
                                  DATECHANGED = @CURRENTDATE
                                from
                                  CTE T1
                                where T1.ID = GLACCOUNT.ID
                                ;

                            end    



end