USP_ADDSTEWARDSHIPPLANSTEPSPROCESS

Creates steps for a selection of stewardship plans.

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier IN
@CHANGEAGENTID uniqueidentifier IN
@NUMBERPROCESSED int INOUT
@NUMBEREXCEPTIONS int INOUT
@CONSTITUENTTABLENAME nvarchar(128) IN
@CURRENTAPPUSERID uniqueidentifier IN

Definition

Copy


CREATE procedure dbo.USP_ADDSTEWARDSHIPPLANSTEPSPROCESS
(
  @ID uniqueidentifier,
  @CHANGEAGENTID uniqueidentifier,
  @NUMBERPROCESSED int output,
  @NUMBEREXCEPTIONS int output,
  @CONSTITUENTTABLENAME nvarchar(128),
  @CURRENTAPPUSERID uniqueidentifier
)
as
begin
  set @NUMBERPROCESSED = 0;
  set @NUMBEREXCEPTIONS = 0;

  declare @PROCESSDATE date;
  set @PROCESSDATE = getdate();

  declare @IDSETREGISTERID uniqueidentifier;
  declare @PROSPECTPLANNAME nvarchar(100);
  declare @PLANSTEPS xml;

  declare @SQL nvarchar(250);
  set @SQL = N'insert into dbo.' + @CONSTITUENTTABLENAME + ' (PLANID, RESULTCODE) values (@PLANID, @RC)';
  declare @PARAMDEF nvarchar(82);
  set @PARAMDEF = N'@PLANID uniqueidentifier, @RC tinyint, @STEPXML xml';

  select
    @IDSETREGISTERID = IDSETREGISTERID,
    @PLANSTEPS = (select PLANSTEPS.query('/STEPS/node()') for xml raw('STEPS'),type)
  from dbo.ADDSTEWARDSHIPPLANSTEPSPROCESS
  where ID = @ID;    

  --get plans

  declare @PLANID uniqueidentifier;

  declare PLANCURSOR cursor local fast_forward for
  select ID
  from dbo.UFN_IDSETREADER_GETRESULTS(@IDSETREGISTERID);

  open PLANCURSOR;
  begin try
    begin transaction;

    fetch next from PLANCURSOR into @PLANID;
    while (@@FETCH_STATUS = 0)
    begin

      begin try
        save transaction STEWARDSHIPPLANSTEPSTX;
        -- create stewardship plans, and prospects as needed

        declare @SITESXML xml;
        declare @STEWARDSXML xml;

        declare @PLANSTEPS_EXISTING xml;
        declare @PLANSTEPS_NEW xml;
        declare @PLANSTEPS_ALL xml;

        declare @STARTDATE date;
        select @STARTDATE = STARTDATE from dbo.STEWARDSHIPPLAN where ID = @PLANID
        ---------------------------------------------------------------------

        -- plan steps

        -- calculate target date

        set @PLANSTEPS_NEW = 
          (select
            newid() as 'ID',
            T.c.value('(CATEGORYCODEID)[1]','uniqueidentifier') as 'CATEGORYCODEID',
              T.c.value('(OBJECTIVE)[1]','nvarchar(100)') as'OBJECTIVE',
            coalesce(T.c.value('(TARGETDATE)[1]','date'), dateadd(day, T.c.value('(DATEOFFSET)[1]','int'), dbo.UFN_DATE_GETEARLIESTTIME(@STARTDATE))) as 'TARGETDATE',
              T.c.value('(ACTUALDATE)[1]','date') as 'ACTUALDATE',
              T.c.value('(STARTDATE)[1]','date') as 'STARTDATE',
              T.c.value('(ENDDATE)[1]','date') as 'ENDDATE',
              T.c.value('(DATELOCKED)[1]','bit') as'DATELOCKED',
              T.c.value('(CONTACTPERSONID)[1]','uniqueidentifier') as 'CONTACTPERSONID',    
              T.c.value('(CONTACTMETHODCODEID)[1]','uniqueidentifier') as 'CONTACTMETHODCODEID',
              T.c.value('(CONSTITUENTID)[1]','uniqueidentifier') as 'CONSTITUENTID',
              T.c.value('(TEMPLATE)[1]','nvarchar(100)') as'TEMPLATE',
              T.c.value('(RECURSCODE)[1]','smallint') as 'RECURSCODE',
              T.c.value('(STATUSCODE)[1]','smallint') as 'STATUSCODE',
              T.c.value('(NEXTTARGETDATE)[1]','date') as 'NEXTTARGETDATE',
              T.c.value('(TARGETSTARTTIME)[1]','dbo.UDT_HOURMINUTE') as 'TARGETSTARTTIME',
              T.c.value('(TARGETENDTIME)[1]','dbo.UDT_HOURMINUTE') as 'TARGETENDTIME',
              T.c.value('(TIMEZONEENTRYID)[1]','uniqueidentifier') as 'TIMEZONEENTRYID',
              case when T.c.value('(TARGETSTARTTIME)[1]','dbo.UDT_HOURMINUTE') = '' then 1 else 0 end as 'ISALLDAYEVENT',
              T.c.value('(ACTUALSTARTTIME)[1]','dbo.UDT_HOURMINUTE') as 'ACTUALSTARTTIME',
              T.c.value('(ACTUALENDTIME)[1]','dbo.UDT_HOURMINUTE') as 'ACTUALENDTIME',
              T.c.value('(EVENTID)[1]','uniqueidentifier') as 'EVENTID',
              T.c.value('(MAILINGID)[1]','uniqueidentifier') as 'MAILINGID',
              T.c.value('(BENEFITID)[1]','uniqueidentifier') as 'BENEFITID',
              case when T.c.exist('./STEPPARTICIPANTS/ITEM') = 1 then T.c.query('(STEPPARTICIPANTS/ITEM)') else null end AS 'STEPPARTICIPANTS',
              T.c.value('(LINKTYPECODE)[1]','smallint') as LINKTYPECODE
          from @PLANSTEPS.nodes('/STEPS/ITEM') T(c)
          for xml raw('ITEM'), type, elements, root('STEPS'), binary base64
          )

         set @PLANSTEPS_ALL = @PLANSTEPS_NEW;

         set @PLANSTEPS_EXISTING = 
          (select 
            STEP.ID,
            STEP.PLANID,
            STEP.CATEGORYCODEID,
            STEP.OBJECTIVE,
            STEP.TARGETDATE,
            STEP.DATELOCKED,
            STEP.ACTUALDATE,
            STEP.STARTDATE,
            STEP.ENDDATE,
            STEP.CONTACTPERSONID,
            STEP.CONTACTMETHODCODEID,
            STEP.CONSTITUENTID,            
            dbo.UFN_STEWARDSHIPPLANSTEP_ASSOCIATEDPLANS_TOITEMLISTXML(STEP.ID, @CURRENTAPPUSERID),
            STEP.TEMPLATE,                        
            STEP.RECURSCODE,
            STEP.STATUSCODE,
            STEP.EVENTID,
            STEP.MAILINGID,
            STEP.BENEFITID,
            STEP.TARGETSTARTTIME,
            STEP.TARGETENDTIME,
            STEP.TIMEZONEENTRYID,
            STEP.ISALLDAYEVENT,
            STEP.ACTUALSTARTTIME,
            STEP.ACTUALENDTIME,
            dbo.UFN_STEWARDSHIPPLANSTEP_PARTICIPANTS_TOITEMLISTXML(STEP.ID)
          from
            dbo.STEWARDSHIPPLANSTEP STEP
          where
            PLANID = @PLANID and COMPLETED = 0 --or CONTACTPERSONID = @CONSTITUENTID

          for xml raw('ITEM'),type,elements,BINARY BASE64);

        SET @PLANSTEPS_ALL.modify('insert sql:variable("@PLANSTEPS_EXISTING") into (/STEPS[1])');

        exec dbo.USP_STEWARDSHIPPLAN_STEPSWITHCHILDREN_UPDATEFROMXML @PLANID, 0, @PLANSTEPS_ALL, null, @CHANGEAGENTID; -- 0->pending

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

        -- reporting

        declare @STEPSQL nvarchar(350);
        set @STEPSQL = N'insert into dbo.' + @CONSTITUENTTABLENAME + ' (PLANID, STEPID, RESULTCODE) select @PLANID, item.value(''ID[1]'',''uniqueidentifier''), 0 from @STEPXML.nodes(''STEPS/ITEM'') Steps(item)';

        exec sp_executesql @STEPSQL, @PARAMDEF, @PLANID, 0, @PLANSTEPS_NEW
        set @NUMBERPROCESSED = @NUMBERPROCESSED + 1;
      end try
      begin catch
        rollback transaction STEWARDSHIPPLANSTEPSTX;
        if error_message() like '%TARGETDATE%'
          begin
            -- ignore error related to plan with missing date and log exception...bad data

            exec sp_executesql @SQL, @PARAMDEF, @PLANID, 1, null
            set @NUMBEREXCEPTIONS = @NUMBEREXCEPTIONS + 1;
          end
        else
          exec dbo.USP_RAISE_ERROR;
      end catch

      fetch next from PLANCURSOR into @PLANID;
    end
    close PLANCURSOR;
    deallocate PLANCURSOR;
    commit transaction;
  end try
  begin catch
    close PLANCURSOR;
    deallocate PLANCURSOR;
    rollback transaction;
    exec dbo.USP_RAISE_ERROR;
    return 1;
  end catch
end