USP_REVENUE_LETTERS_CUSTOMUPDATEFROMXML

Updates revenue/tribute letters from the revenue update batch

Parameters

Parameter Parameter Type Mode Description
@REVENUEID uniqueidentifier IN
@LETTERS xml IN
@CHANGEAGENTID uniqueidentifier IN
@CHANGEDATE datetime IN

Definition

Copy


CREATE procedure dbo.USP_REVENUE_LETTERS_CUSTOMUPDATEFROMXML
(
  @REVENUEID uniqueidentifier,
  @LETTERS xml,
  @CHANGEAGENTID uniqueidentifier = null,
  @CHANGEDATE datetime = null
)
as 
  set nocount on;

  if @CHANGEAGENTID is null
    exec USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output

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

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

  declare @TempTbl table
  (
    [ACKNOWLEDGEDATE] datetime,
    [ACKNOWLEDGEEID] uniqueidentifier,
    [ID] uniqueidentifier,
    [LETTERCODEID] uniqueidentifier,
    [LETTERTYPECODE] tinyint,
    [TRIBUTEID] uniqueidentifier,
    [PROCESSDATE] datetime,
    [OUTOFDATE] bit,
    [CLEARDATES] bit
  );

  insert into
    @TempTbl
  select 
    [ACKNOWLEDGEDATE],
    [ACKNOWLEDGEEID],
    [ID],
    [LETTERCODEID],
    [LETTERTYPECODE],
    [TRIBUTEID],
    [PROCESSDATE],
    [OUTOFDATE],
    [CLEARDATES]
  from
    dbo.UFN_REVENUEUPDATEBATCH_GETLETTERS_FROMITEMLISTXML(@LETTERS);

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

  if @@Error <> 0
    return 1;

  --Add any constituents that were created in batch

  declare CONSTITUENTSTOCREATECURSOR cursor local fast_forward for
  select distinct
    ACKNOWLEDGEEID
  from
    @TempTbl
  where
    ACKNOWLEDGEEID not in (select ID from dbo.CONSTITUENT);

  open CONSTITUENTSTOCREATECURSOR;

  declare @BATCHREVENUECONSTITUENTID uniqueidentifier;
  fetch next from CONSTITUENTSTOCREATECURSOR into @BATCHREVENUECONSTITUENTID;

  while @@FETCH_STATUS = 0
  begin
    declare @CONSTITUENTID uniqueidentifier = null;
    exec USP_REVENUEBATCH_CONSTITUENT_ADD @CONSTITUENTID output, @CHANGEAGENTID, @BATCHREVENUECONSTITUENTID;

    update
      @TempTbl
    set
      ACKNOWLEDGEEID = @CONSTITUENTID
    where
      ACKNOWLEDGEEID = @BATCHREVENUECONSTITUENTID;

    exec dbo.USP_REVENUEBATCH_CONSTITUENT_DELETE @BATCHREVENUECONSTITUENTID, @CHANGEAGENTID;

    fetch next from CONSTITUENTSTOCREATECURSOR into @BATCHREVENUECONSTITUENTID;
  end

  close CONSTITUENTSTOCREATECURSOR;
  deallocate CONSTITUENTSTOCREATECURSOR;

  declare @contextCache varbinary(128) = CONTEXT_INFO();

  -- set CONTEXT_INFO to @CHANGEAGENTID 

  if not @CHANGEAGENTID is null
    set CONTEXT_INFO @CHANGEAGENTID;

  -- delete any items that no longer exist in the XML table

  delete from
    dbo.[REVENUELETTER]
  where
    [REVENUELETTER].ID in (select ID from dbo.UFN_REVENUE_GETLETTERS_2(@REVENUEID) EXCEPT select ID from @TempTbl where LETTERTYPECODE = 0);

  if @@error <> 0
  begin
    if not @contextCache is null
      set CONTEXT_INFO @contextCache;

    return 2;
  end

  --Cache error so we can reset the context cache

  declare @e int;

  -- delete any items that no longer exist in the XML table

  delete from
    dbo.[REVENUETRIBUTELETTER]
  where
    [REVENUETRIBUTELETTER].ID in (select ID from dbo.UFN_REVENUE_GETLETTERS_2(@REVENUEID) EXCEPT select ID from @TempTbl where LETTERTYPECODE = 1);

  select @e = @@error;

  -- reset CONTEXT_INFO to previous value 

  if not @contextCache is null
    set CONTEXT_INFO @contextCache;

  if @e <> 0
    return 3;

  -- update the items that exist in the XML table and the db

  update
    dbo.REVENUELETTER
  set
    REVENUELETTER.LETTERCODEID = temp.LETTERCODEID,
    REVENUELETTER.ACKNOWLEDGEDATE = case when temp.CLEARDATES = 1 then null else temp.ACKNOWLEDGEDATE end,
    REVENUELETTER.ACKNOWLEDGEEID = temp.ACKNOWLEDGEEID,
    REVENUELETTER.PROCESSDATE = case when temp.CLEARDATES = 1 then null else temp.PROCESSDATE end,
    REVENUELETTER.OUTOFDATE = temp.OUTOFDATE,
    REVENUELETTER.CHANGEDBYID = @CHANGEAGENTID,
    REVENUELETTER.DATECHANGED = @CHANGEDATE
  from
    dbo.REVENUELETTER
  inner join
    @TempTbl as temp on REVENUELETTER.ID = temp.ID
  where
    temp.LETTERTYPECODE = 0 and
    (
      (REVENUELETTER.LETTERCODEID <> temp.LETTERCODEID) or 
      (REVENUELETTER.LETTERCODEID is null and temp.LETTERCODEID is not null) or 
      (REVENUELETTER.LETTERCODEID is not null and temp.LETTERCODEID is null) or 
      (REVENUELETTER.ACKNOWLEDGEDATE <> temp.ACKNOWLEDGEDATE) or 
      (REVENUELETTER.ACKNOWLEDGEDATE is null and temp.ACKNOWLEDGEDATE is not null) or 
      (REVENUELETTER.ACKNOWLEDGEDATE is not null and temp.ACKNOWLEDGEDATE is null) or 
      (REVENUELETTER.ACKNOWLEDGEEID <> temp.ACKNOWLEDGEEID) or 
      (REVENUELETTER.ACKNOWLEDGEEID is null and temp.ACKNOWLEDGEEID is not null) or 
      (REVENUELETTER.ACKNOWLEDGEEID is not null and temp.ACKNOWLEDGEEID is null) or
      (REVENUELETTER.OUTOFDATE <> temp.OUTOFDATE) or
      temp.CLEARDATES = 1
    );

  if @@Error <> 0
    return 4;    

  update
    dbo.REVENUETRIBUTELETTER
  set
    REVENUETRIBUTELETTER.REVENUETRIBUTEID= (select ID from dbo.REVENUETRIBUTE where REVENUEID = @REVENUEID and TRIBUTEID = temp.TRIBUTEID),
    REVENUETRIBUTELETTER.ACKNOWLEDGEDATE= case when temp.CLEARDATES = 1 then null else temp.ACKNOWLEDGEDATE end,
    REVENUETRIBUTELETTER.CONSTITUENTID=temp.ACKNOWLEDGEEID,
    REVENUETRIBUTELETTER.PROCESSDATE =case when temp.CLEARDATES = 1 then null else temp.PROCESSDATE end,
    REVENUETRIBUTELETTER.CHANGEDBYID = @CHANGEAGENTID,
    REVENUETRIBUTELETTER.DATECHANGED = @CHANGEDATE
  from
    dbo.REVENUETRIBUTELETTER
  inner join
    @TempTbl as temp on REVENUETRIBUTELETTER.ID = temp.ID
  where
    temp.LETTERTYPECODE = 1 and
  (
    (REVENUETRIBUTELETTER.TRIBUTELETTERCODEID<>temp.LETTERCODEID) or 
    (REVENUETRIBUTELETTER.TRIBUTELETTERCODEID is null and temp.LETTERCODEID is not null) or 
    (REVENUETRIBUTELETTER.TRIBUTELETTERCODEID is not null and temp.LETTERCODEID is null) or 
    (REVENUETRIBUTELETTER.ACKNOWLEDGEDATE<>temp.ACKNOWLEDGEDATE) or 
    (REVENUETRIBUTELETTER.ACKNOWLEDGEDATE is null and temp.ACKNOWLEDGEDATE is not null) or 
    (REVENUETRIBUTELETTER.ACKNOWLEDGEDATE is not null and temp.ACKNOWLEDGEDATE is null) or 
    (REVENUETRIBUTELETTER.CONSTITUENTID<>temp.ACKNOWLEDGEEID) or 
    (REVENUETRIBUTELETTER.CONSTITUENTID is null and temp.ACKNOWLEDGEEID is not null) or 
    (REVENUETRIBUTELETTER.CONSTITUENTID is not null and temp.ACKNOWLEDGEEID is null) or
    (REVENUETRIBUTELETTER.REVENUETRIBUTEID<>temp.TRIBUTEID) or 
    (REVENUETRIBUTELETTER.REVENUETRIBUTEID is null and temp.TRIBUTEID is not null) or 
    (REVENUETRIBUTELETTER.REVENUETRIBUTEID is not null and temp.TRIBUTEID is null) or
    temp.CLEARDATES = 1
  );

  if @@Error <> 0
    return 5;

  -- insert new items for revenue letter

  insert into dbo.REVENUELETTER
  (    
    ID,
    REVENUEID,
    LETTERCODEID,
    ACKNOWLEDGEDATE,
    ACKNOWLEDGEEID,
    ADDEDBYID,
    CHANGEDBYID,
    DATEADDED,
    DATECHANGED
  )
  select 
    ID,
    @REVENUEID,
    LETTERCODEID,
    ACKNOWLEDGEDATE = case when temp.CLEARDATES = 1 then null else temp.ACKNOWLEDGEDATE end,
    ACKNOWLEDGEEID, 
    @CHANGEAGENTID,
    @CHANGEAGENTID,
    @CHANGEDATE,
    @CHANGEDATE
  from
    @TempTbl as temp
  where
    temp.LETTERTYPECODE = 0 and
    not exists (select ID from dbo.REVENUELETTER as data where data.ID = temp.ID);

  if @@Error <> 0
    return 6;

  -- insert new items for revenue tribute letter

  insert into dbo.REVENUETRIBUTELETTER
  (
    ID,
    REVENUETRIBUTEID,
    CONSTITUENTID,
    TRIBUTELETTERCODEID,
    ACKNOWLEDGEDATE,
    ADDEDBYID,
    CHANGEDBYID,
    DATEADDED,
    DATECHANGED
  )
  select 
    ID,
    (select ID from REVENUETRIBUTE where REVENUETRIBUTE.REVENUEID = @REVENUEID AND TRIBUTEID = temp.TRIBUTEID),
    ACKNOWLEDGEEID,
    LETTERCODEID,
    ACKNOWLEDGEDATE = case when temp.CLEARDATES = 1 then null else temp.ACKNOWLEDGEDATE end,
    @CHANGEAGENTID
    @CHANGEAGENTID
    @CHANGEDATE
    @CHANGEDATE
  from
    @TempTbl as temp
  where
    temp.LETTERTYPECODE = 1 and
    not exists (select ID from dbo.REVENUETRIBUTELETTER as data where data.ID = temp.ID);

  if @@Error <> 0
    return 7;

  return 0;