USP_CONSTITUENTRECOGNITION_GETDECLINEDLEVELS_UPDATEFROMXML

Custom UPDATEFROMXML for DeclinedLevels table due to the ConstituentRecognition table being strange.

Parameters

Parameter Parameter Type Mode Description
@CONSTITUENTID uniqueidentifier IN
@RECOGNITIONPROGRAMID uniqueidentifier IN
@XML xml IN
@CHANGEAGENTID uniqueidentifier IN
@CHANGEDATE datetime IN
@REASONCODE uniqueidentifier IN
@RECOGNITIONLEVELID uniqueidentifier IN
@CHECKFORDECLINEDPROGRAM bit IN

Definition

Copy


      CREATE procedure dbo.USP_CONSTITUENTRECOGNITION_GETDECLINEDLEVELS_UPDATEFROMXML
      (
      @CONSTITUENTID uniqueidentifier,
      @RECOGNITIONPROGRAMID uniqueidentifier,
      @XML xml,
      @CHANGEAGENTID uniqueidentifier = null,
      @CHANGEDATE datetime = null,
      @REASONCODE uniqueidentifier = null,
      @RECOGNITIONLEVELID uniqueidentifier = null,
      @CHECKFORDECLINEDPROGRAM bit = 0
      )

      as

      set nocount on;

      if @CHANGEAGENTID is null
          exec USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output

      if @CHANGEDATE is null 
          set @CHANGEDATE = getdate()


       declare @xmlTable table ([DECLINED] bit
                                [DECLINEDLEVELID] uniqueidentifier,
                                [RECOGNITIONLEVELID] uniqueidentifier)

      insert into @xmlTable SELECT T.c.value('(DECLINED)[1]','bit') AS 'DECLINED',
            T.c.value('(DECLINEDLEVELID)[1]','uniqueidentifier') AS 'DECLINEDLEVELID',
            T.c.value('(RECOGNITIONLEVELID)[1]','uniqueidentifier') as RECOGNITIONLEVELID
            FROM @XML.nodes('/DECLINEDRECOGNITIONLEVELS/ITEM') T(c)

      -- build a temporary table containing the values from the XML

      declare @TempTbl table ([DECLINED] bit
                                [DECLINEDLEVELID] uniqueidentifier,
                                [RECOGNITIONLEVELID] uniqueidentifier)


      insert into @TempTbl select 
          [DECLINED],
          [DECLINEDLEVELID],
          [RECOGNITIONLEVELID]
      from @xmlTable

      update @TempTbl set DECLINEDLEVELID = newid() where (DECLINEDLEVELID is null) or (DECLINEDLEVELID = '00000000-0000-0000-0000-000000000000');

      if (@RECOGNITIONLEVELID is not null)
      begin

        if exists(select RECOGNITIONLEVELID from @TempTbl TT where TT.DECLINED = 1 and TT.RECOGNITIONLEVELID = @RECOGNITIONLEVELID)
        begin
          raiserror('BBERR_RECOGNITIONLEVELISDECLINED',13,1);
        end

      end

      if (@CHECKFORDECLINEDPROGRAM = 1)
      begin

        if exists(select RECOGNITIONPROGRAMID from dbo.CONSTITUENTRECOGNITIONDECLINEDPROGRAM where RECOGNITIONPROGRAMID = @RECOGNITIONPROGRAMID and CONSTITUENTID = @CONSTITUENTID)
        begin
          raiserror('BBERR_RECOGNITIONPROGRAMISDECLINED',13,1);
        end

      end


      if @@Error <> 0
          return 1;

      declare @contextCache varbinary(128);
      declare @e int;

      -- cache current context information 

      set @contextCache = CONTEXT_INFO();

      -- set CONTEXT_INFO to @CHANGEAGENTID 

      if not @CHANGEAGENTID is null
          set CONTEXT_INFO @CHANGEAGENTID;

      -- delete any items that are no longer declined

      delete from dbo.[CONSTITUENTRECOGNITIONDECLINEDLEVEL] where [CONSTITUENTRECOGNITIONDECLINEDLEVEL].ID in 
          (select DECLINEDLEVELID from dbo.UFN_CONSTITUENTRECOGNITION_GETDECLINEDLEVELS
          (
            @CONSTITUENTID,
          @RECOGNITIONPROGRAMID
          )

          intersect select DECLINEDLEVELID from @TempTbl where DECLINED = 0)    

      select @e=@@error;

      -- reset CONTEXT_INFO to previous value 

      if not @contextCache is null
          set CONTEXT_INFO @contextCache;

      if @e <> 0
          return 2;

      -- insert new items

      insert into [CONSTITUENTRECOGNITIONDECLINEDLEVEL] 
          ([CONSTITUENTID], 
          [ID],
          [RECOGNITIONLEVELID],    
          [RECOGNITIONPROGRAMID],
          ADDEDBYID, 
          CHANGEDBYID, 
          DATEADDED, 
          DATECHANGED,
        REASONCODEID)
      select @CONSTITUENTID
          [DECLINEDLEVELID],
          [RECOGNITIONLEVELID], 
          @RECOGNITIONPROGRAMID,
          @CHANGEAGENTID
          @CHANGEAGENTID
          @CHANGEDATE
          @CHANGEDATE,
        @REASONCODE
      from @TempTbl as [temp]
      where [temp].declined = 1 and not exists (select ID from dbo.[CONSTITUENTRECOGNITIONDECLINEDLEVEL] as data where data.ID = [temp].DECLINEDLEVELID)


      update dbo.CONSTITUENTRECOGNITIONDECLINEDLEVEL set REASONCODEID=@REASONCODE where CONSTITUENTID = @CONSTITUENTID and RECOGNITIONPROGRAMID = @RECOGNITIONPROGRAMID

      if @@Error <> 0
          return 4;

     --Handle the scenario of declining a level a constituent is already in and is currently active. We will drop them down to the next "lower" level. Lower means 

     -- the minimum amount to enter the level is <= the level they are leaving. 


      --First store which RecognitionLevels are being declined that are currently active and the constituent is a member of

      declare @DECLINEDOWNEDLEVELS table (CONSTITUENTRECOGNITIONID uniqueidentifier, MINAMOUNT money)
      insert into @DECLINEDOWNEDLEVELS 
      select CR.ID,RL.AMOUNT from dbo.CONSTITUENTRECOGNITION CR
      inner join dbo.RECOGNITIONLEVEL RL on RL.ID = CR.RECOGNITIONLEVELID
      inner join @TempTbl CRDL on CR.RECOGNITIONLEVELID = CRDL.RECOGNITIONLEVELID and CRDL.DECLINED = 1
      where CR.CONSTITUENTID = @CONSTITUENTID 
      and CR.RECOGNITIONPROGRAMID = @RECOGNITIONPROGRAMID 
      and CR.STATUSCODE = 0



      --Grab and store the highest amount related data from CONSTITUENTRECOGNITION for the new level to have

       declare @CURRENTACTIVELEVELID uniqueidentifier = (select top 1 ID from dbo.CONSTITUENTRECOGNITION where RECOGNITIONPROGRAMID = @RECOGNITIONPROGRAMID and CONSTITUENTID = @CONSTITUENTID order by JOINDATE DESC)
       declare @TOTALAMOUNT money
       declare @TOTALPLANNEDGIFTAMOUNT money
       declare @ORGANIZATIONTOTALAMOUNT money
       declare @ORGANIZATIONTOTALPLANNEDGIFTAMOUNT money
       declare @ORGANIZATIONEXCHANGERATEID uniqueidentifier
       declare @BASECURRENCYID uniqueidentifier
       select top 1 
       @TOTALAMOUNT=TOTALAMOUNT,
       @TOTALPLANNEDGIFTAMOUNT=TOTALPLANNEDGIFTAMOUNT,
       @ORGANIZATIONTOTALAMOUNT=ORGANIZATIONTOTALAMOUNT,
       @ORGANIZATIONTOTALPLANNEDGIFTAMOUNT=ORGANIZATIONTOTALPLANNEDGIFTAMOUNT,
       @ORGANIZATIONEXCHANGERATEID=ORGANIZATIONEXCHANGERATEID,
       @BASECURRENCYID=BASECURRENCYID
       from dbo.CONSTITUENTRECOGNITION
       where RECOGNITIONPROGRAMID = @RECOGNITIONPROGRAMID and CONSTITUENTID = @CONSTITUENTID
       order by CONSTITUENTRECOGNITION.JOINDATE DESC

         delete from dbo.CONSTITUENTRECOGNITION 
                        where ID in (select CONSTITUENTRECOGNITIONID from @DECLINEDOWNEDLEVELS)

         delete from dbo.CONSTITUENTRECOGNITIONREVENUE
          where RECOGNITIONPROGRAMID = @RECOGNITIONPROGRAMID
          and REVENUERECOGNITIONID in(select ID
                                      from dbo.REVENUERECOGNITION
                                      where CONSTITUENTID = @CONSTITUENTID);


     --Next attempt to find any levels lower than the level(s) they're leaving that aren't declined and place them into that level.


      if @CURRENTACTIVELEVELID in (select CONSTITUENTRECOGNITIONID from @DECLINEDOWNEDLEVELS)
      begin


      declare @MAXPREVIOUSAMOUNT money = (select max(MINAMOUNT) from @DECLINEDOWNEDLEVELS)
      declare @EXISTINGRECOGNITIONID uniqueidentifier
      declare @NEWRECOGNITIONLEVELID uniqueidentifier = (select top 1 RL.ID from dbo.RECOGNITIONLEVEL RL
                                                         where RL.RECOGNITIONPROGRAMID = @RECOGNITIONPROGRAMID and RL.AMOUNT <= @MAXPREVIOUSAMOUNT
                                                         and RL.ID not in (select CRDL.RECOGNITIONLEVELID from @TempTbl CRDL where RL.ID = CRDL.RECOGNITIONLEVELID and CRDL.DECLINED = 1)
                                                         and RL.ID not in (select CR.RECOGNITIONLEVELID from dbo.CONSTITUENTRECOGNITION CR where CR.RECOGNITIONPROGRAMID = @RECOGNITIONPROGRAMID and CR.CONSTITUENTID = @CONSTITUENTID)
                                                         order by RL.AMOUNT desc )

      --If they're already in an active level, don't re-add just update the totals.

      set @EXISTINGRECOGNITIONID = (select top 1 CR.ID from dbo.CONSTITUENTRECOGNITION CR 
                                         where CR.RECOGNITIONPROGRAMID = @RECOGNITIONPROGRAMID and CR.CONSTITUENTID = @CONSTITUENTID and CR.STATUSCODE = 0
                                         order by CR.JOINDATE DESC)

        if @EXISTINGRECOGNITIONID is not null and  @NEWRECOGNITIONLEVELID  is not null
        begin
          update dbo.CONSTITUENTRECOGNITION set 
          TOTALAMOUNT=@TOTALAMOUNT,
          TOTALPLANNEDGIFTAMOUNT=@TOTALPLANNEDGIFTAMOUNT,
          ORGANIZATIONTOTALAMOUNT= @ORGANIZATIONTOTALAMOUNT,
          ORGANIZATIONTOTALPLANNEDGIFTAMOUNT=@ORGANIZATIONTOTALPLANNEDGIFTAMOUNT,
          ORGANIZATIONEXCHANGERATEID=@ORGANIZATIONEXCHANGERATEID ,
          BASECURRENCYID=@BASECURRENCYID
          where ID = @EXISTINGRECOGNITIONID
        end

        if @NEWRECOGNITIONLEVELID is not null and @EXISTINGRECOGNITIONID is null
        begin
          declare @NEWID uniqueidentifier = newid()
          exec USP_DATAFORMTEMPLATE_ADD_CONSTITUENTRECOGNITION @NEWID,@CHANGEAGENTID,@CONSTITUENTID,@RECOGNITIONPROGRAMID,@NEWRECOGNITIONLEVELID,0,@CHANGEDATE,'',0,null
          update dbo.CONSTITUENTRECOGNITION set
          TOTALAMOUNT=@TOTALAMOUNT,
          TOTALPLANNEDGIFTAMOUNT=@TOTALPLANNEDGIFTAMOUNT,
          ORGANIZATIONTOTALAMOUNT= @ORGANIZATIONTOTALAMOUNT,
          ORGANIZATIONTOTALPLANNEDGIFTAMOUNT=@ORGANIZATIONTOTALPLANNEDGIFTAMOUNT,
          ORGANIZATIONEXCHANGERATEID=@ORGANIZATIONEXCHANGERATEID ,
          BASECURRENCYID=@BASECURRENCYID
          where ID=@NEWID 
        end
     end

     --If the program no longer has any recognition, delete the revenue

     if not exists ( select ID from dbo.CONSTITUENTRECOGNITION CR where CR.RECOGNITIONPROGRAMID = @RECOGNITIONPROGRAMID and CR.CONSTITUENTID = @CONSTITUENTID)
     begin
       delete from dbo.CONSTITUENTRECOGNITIONREVENUE
            where RECOGNITIONPROGRAMID = @RECOGNITIONPROGRAMID
            and REVENUERECOGNITIONID in(select ID
                                        from dbo.REVENUERECOGNITION
                                        where CONSTITUENTID = @CONSTITUENTID);
     end
     if @@Error <> 0
      return 5;

      return 0;