USP_CONSTITUENTUPDATEBATCH_APPLYEMAILRULES

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier IN
@PRIMARYRECORDID uniqueidentifier IN
@CHANGEAGENTID uniqueidentifier IN
@ADDALLEMAILS bit IN
@DIFFERENTEMAILCODE tinyint IN
@NEWEMAILPRIMARYCODE tinyint IN
@EXCLUDEEMAILID uniqueidentifier IN

Definition

Copy


CREATE procedure dbo.USP_CONSTITUENTUPDATEBATCH_APPLYEMAILRULES
(
  @ID uniqueidentifier, -- CUB row ID

  @PRIMARYRECORDID uniqueidentifier, -- Existing Constituent ID

  @CHANGEAGENTID uniqueidentifier,
  @ADDALLEMAILS bit = 1,
  @DIFFERENTEMAILCODE tinyint = 3,
  @NEWEMAILPRIMARYCODE tinyint = 1,
  @EXCLUDEEMAILID uniqueidentifier = null --this is used by manual reconciliation to not include in the cursor the incoming email shown on the resolution screen; 

)
as
begin
  set nocount on;

  declare @INCOMINGEMAILROWID uniqueidentifier;
  declare @INCOMINGEMAILADDRESSTYPECODEID uniqueidentifier;
  declare @INCOMINGEMAILADDRESS dbo.UDT_EMAILADDRESS; 
  declare @INCOMINGISPRIMARY bit
  -- secondary fields

  declare @INCOMINGDONOTEMAIL bit;
  declare @INCOMINGSTARTDATE date;
  declare @INCOMINGENDDATE date;
  declare @INCOMINGINFOSOURCECODEID uniqueidentifier;

  declare @MAKENEWPRIMARYROWID uniqueidentifier;
  declare @EXISTINGPRIMARYEMAILADDRESSTYPECODEID uniqueidentifier;  
  declare @EXISTINGISPRIMARYEMAILADDRESSID uniqueidentifier;

  declare @EXISTINGEMAILADDRESSID uniqueidentifier;
  declare @EXISTINGEMAILADDRESSTYPECODEID uniqueidentifier;
  declare @EXISTINGISPRIMARY bit;
  declare @EXISTINGDONOTEMAIL bit;
  declare @EXISTINGSTARTDATE date;
  declare @EXISTINGENDDATE date;
  declare @EXISTINGINFOSOURCECODEID uniqueidentifier;
  declare @PRIMARYCOUNT int = dbo.UFN_BATCHCONSTITUENTUPDATEEMAILADDRESSES_PRIMARYCOUNT(@ID);    

  declare @UPDATESECONDARYDATA bit = 0;  
  declare @CURRENTDATE datetime = getdate();
  declare @NULLVALUE uniqueidentifier = newid();
  if @CHANGEAGENTID is null  
  exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output

  --Get the existing is primary row

  select top 1
    @EXISTINGISPRIMARYEMAILADDRESSID = ID,
    @EXISTINGPRIMARYEMAILADDRESSTYPECODEID = case when ISPRIMARY = 1 then EMAILADDRESSTYPECODEID else null end
    from dbo.EMAILADDRESS where CONSTITUENTID = @PRIMARYRECORDID
    order by ISPRIMARY desc;
  if @EXISTINGISPRIMARYEMAILADDRESSID is not null -- only apply the rules if the constituent has at least one email address

    begin
      declare INCOMINGEMAIL_CURSOR cursor local fast_forward for
        select 
        ID,
        EMAILADDRESSTYPECODEID,
        EMAILADDRESS,
        ISPRIMARY,
        DONOTEMAIL,
        STARTDATE,
        ENDDATE,
        INFOSOURCECODEID    
      from dbo.BATCHCONSTITUENTUPDATEEMAILADDRESSES
      where BATCHCONSTITUENTUPDATEID = @ID and EMAILADDRESSID is null and BATCHCONSTITUENTUPDATEEMAILADDRESSES.ID <> coalesce(@EXCLUDEEMAILID, @NULLVALUE); -- exclude from the cursor the ID coming from the resolutions screen


      open INCOMINGEMAIL_CURSOR;

      begin try
        fetch next from INCOMINGEMAIL_CURSOR into
          @INCOMINGEMAILROWID,
          @INCOMINGEMAILADDRESSTYPECODEID,
          @INCOMINGEMAILADDRESS,
          @INCOMINGISPRIMARY,
          @INCOMINGDONOTEMAIL,
          @INCOMINGSTARTDATE,
          @INCOMINGENDDATE,
          @INCOMINGINFOSOURCECODEID;

          while (@@FETCH_STATUS = 0)
          begin

          set @EXISTINGEMAILADDRESSID = null;

          select top 1 @EXISTINGEMAILADDRESSID = ID,
                 @EXISTINGEMAILADDRESSTYPECODEID = EMAILADDRESSTYPECODEID,      
                 @EXISTINGISPRIMARY = ISPRIMARY,
                 @EXISTINGDONOTEMAIL = DONOTEMAIL,
                 @EXISTINGSTARTDATE = STARTDATE,
                 @EXISTINGENDDATE = ENDDATE,
                 @EXISTINGINFOSOURCECODEID = INFOSOURCECODEID      
          from dbo.EMAILADDRESS E
          where E.CONSTITUENTID = @PRIMARYRECORDID
          and E.EMAILADDRESS = @INCOMINGEMAILADDRESS
          and (E.EMAILADDRESSTYPECODEID is null or @INCOMINGEMAILADDRESSTYPECODEID is null or E.EMAILADDRESSTYPECODEID = @INCOMINGEMAILADDRESSTYPECODEID)
          and not exists(select EMAILADDRESSID from dbo.BATCHCONSTITUENTUPDATEEMAILADDRESSES where BATCHCONSTITUENTUPDATEID = @ID and EMAILADDRESSID = E.ID)
          order by case when E.EMAILADDRESSTYPECODEID = @INCOMINGEMAILADDRESSTYPECODEID then 1 else 2 end, ISPRIMARY desc, ENDDATE, DONOTEMAIL, DATECHANGED desc;  

          if @EXISTINGEMAILADDRESSID is not null -- incoming email is identical to existing email     

            begin
              if @DIFFERENTEMAILCODE <> 0
                set @UPDATESECONDARYDATA = 1                
              else if not(@INCOMINGDONOTEMAIL=1 and @EXISTINGDONOTEMAIL=0) and
                  (@EXISTINGSTARTDATE is null or @EXISTINGSTARTDATE = @INCOMINGSTARTDATE or @INCOMINGSTARTDATE is null) and
                  (@EXISTINGENDDATE is null or @EXISTINGENDDATE = @INCOMINGENDDATE) and                         
                  (@EXISTINGINFOSOURCECODEID is null or @EXISTINGINFOSOURCECODEID = @INCOMINGINFOSOURCECODEID or @INCOMINGINFOSOURCECODEID is null)
                set @UPDATESECONDARYDATA = 1
              else
                set @UPDATESECONDARYDATA = 0

              if @UPDATESECONDARYDATA = 1  --Update secondary fields  

                begin 
                  update dbo.BATCHCONSTITUENTUPDATEEMAILADDRESSES set
                    EMAILADDRESSID = @EXISTINGEMAILADDRESSID,    
                    ISPRIMARY = case when @PRIMARYCOUNT = 1 then ISPRIMARY else @EXISTINGISPRIMARY end, -- set isprimary only when no primary exists already

                    EMAILADDRESSTYPECODEID = coalesce(EMAILADDRESSTYPECODEID, @EXISTINGEMAILADDRESSTYPECODEID),
                    STARTDATE = coalesce(STARTDATE,@EXISTINGSTARTDATE),
                    --WI # 481812.  If the incoming end date is blank, we want to reactivate the record on an update.

                    --ENDDATE = coalesce(ENDDATE,@EXISTINGENDDATE),

                    --DONOTEMAIL = coalesce(NULLIF(DONOTEMAIL,0),@EXISTINGDONOTEMAIL),

                    INFOSOURCECODEID = coalesce(INFOSOURCECODEID,@EXISTINGINFOSOURCECODEID),
                    CHANGEDBYID = @CHANGEAGENTID,
                    DATECHANGED = @CURRENTDATE                
                    where ID = @INCOMINGEMAILROWID
                end 
              else -- ignore secondary fields

                begin
                  update dbo.BATCHCONSTITUENTUPDATEEMAILADDRESSES set
                    EMAILADDRESSID = @EXISTINGEMAILADDRESSID,    
                    EMAILADDRESSTYPECODEID = @EXISTINGEMAILADDRESSTYPECODEID,
                    ISPRIMARY = case when @PRIMARYCOUNT = 1 then ISPRIMARY else @EXISTINGISPRIMARY end,
                    DONOTEMAIL = @EXISTINGDONOTEMAIL,
                    STARTDATE = @EXISTINGSTARTDATE
                    ENDDATE = @EXISTINGENDDATE,
                    INFOSOURCECODEID = @EXISTINGINFOSOURCECODEID,
                    CHANGEDBYID = @CHANGEAGENTID,
                    DATECHANGED = @CURRENTDATE                
                  where ID = @INCOMINGEMAILROWID;         
                end              
            end            
          else  -- Incoming email is not similar

            begin
              if @DIFFERENTEMAILCODE = 0 -- Ignore

                delete from dbo.BATCHCONSTITUENTUPDATEEMAILADDRESSES 
                where ID = @INCOMINGEMAILROWID;  
              else if @DIFFERENTEMAILCODE = 3 -- Add

              begin
                if (@INCOMINGISPRIMARY = 1 or (@MAKENEWPRIMARYROWID is null and (@NEWEMAILPRIMARYCODE = 2 or (@NEWEMAILPRIMARYCODE = 1 and @INCOMINGEMAILADDRESSTYPECODEID = @EXISTINGPRIMARYEMAILADDRESSTYPECODEID))))                                           
                    and @INCOMINGENDDATE is null and @INCOMINGDONOTEMAIL = 0 -- Cannot make email with end dates primary under any condition

                      --Always make new email primary/Old email has the same type as the new email                  

                      set @MAKENEWPRIMARYROWID = @INCOMINGEMAILROWID;                        
  end    
            end      

        fetch next from INCOMINGEMAIL_CURSOR into
          @INCOMINGEMAILROWID,
          @INCOMINGEMAILADDRESSTYPECODEID,
          @INCOMINGEMAILADDRESS,
          @INCOMINGISPRIMARY,
          @INCOMINGDONOTEMAIL,
          @INCOMINGSTARTDATE,
          @INCOMINGENDDATE,
          @INCOMINGINFOSOURCECODEID;
        end

        close INCOMINGEMAIL_CURSOR;
        deallocate INCOMINGEMAIL_CURSOR;
      end try
      begin catch

      close INCOMINGEMAIL_CURSOR;
      deallocate INCOMINGEMAIL_CURSOR;
      exec dbo.USP_RAISE_ERROR;
      end catch

      -- set all potential primary emails to non-primary, except for the MAKENEWPRIMARYROWID email 

      if @MAKENEWPRIMARYROWID is not null 
      begin
          update dbo.BATCHCONSTITUENTUPDATEEMAILADDRESSES
          set ISPRIMARY = 0
          where ID <> @MAKENEWPRIMARYROWID and ISPRIMARY = 1
          and BATCHCONSTITUENTUPDATEID = @ID;
      end  

      if @ADDALLEMAILS = 1
      begin
        insert into dbo.BATCHCONSTITUENTUPDATEEMAILADDRESSES(
        ID,
        EMAILADDRESSID,
        BATCHCONSTITUENTUPDATEID,
        SEQUENCE,
        EMAILADDRESSTYPECODEID,
        EMAILADDRESS,
        ISPRIMARY,
        DONOTEMAIL,
        UPDATEHOUSEHOLD,
        STARTDATE,
        ENDDATE,
        INFOSOURCECODEID,
        ADDEDBYID,
        CHANGEDBYID,
      ROWORIGINCODE
        )
        select
        newid(),
        E.ID as EMAILADDRESSID,
        @ID,
        E.SEQUENCE,
        E.EMAILADDRESSTYPECODEID,
        E.EMAILADDRESS,
        case when exists(select ISPRIMARY from dbo.BATCHCONSTITUENTUPDATEEMAILADDRESSES where BATCHCONSTITUENTUPDATEID = @ID and ISPRIMARY = 1) or @MAKENEWPRIMARYROWID is not null then 0 else ISPRIMARY end,
        E.DONOTEMAIL,
        cast(0 as bit) as UPDATEHOUSEHOLD,
      E.STARTDATE,
      E.ENDDATE,
        E.INFOSOURCECODEID,
        @CHANGEAGENTID,
        @CHANGEAGENTID,
        2 -- Existing record, automatically populated by the system during import

        from dbo.EMAILADDRESS E
        where E.CONSTITUENTID = @PRIMARYRECORDID and E.ID not in (select EMAILADDRESSID from dbo.BATCHCONSTITUENTUPDATEEMAILADDRESSES where BATCHCONSTITUENTUPDATEID = @ID and EMAILADDRESSID is not null);
      end

      -- set the MAKENEWPRIMARYROWID email as primary

      if @MAKENEWPRIMARYROWID is not null 
        begin
            update dbo.BATCHCONSTITUENTUPDATEEMAILADDRESSES
            set ISPRIMARY = 1
            where ID = @MAKENEWPRIMARYROWID;
        end
    end        
end