USP_CONSTITUENTUPDATEBATCH_APPLYPHONERULES

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier IN
@PRIMARYRECORDID uniqueidentifier IN
@CHANGEAGENTID uniqueidentifier IN
@ADDALLPHONES bit IN
@DIFFERENTPHONECODE tinyint IN
@NEWPHONEPRIMARYCODE tinyint IN
@EXCLUDEPHONEID uniqueidentifier IN

Definition

Copy


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

  @PRIMARYRECORDID uniqueidentifier, -- Existing Constituent ID

  @CHANGEAGENTID uniqueidentifier,
  @ADDALLPHONES bit = 1,
  @DIFFERENTPHONECODE tinyint = 3,
  @NEWPHONEPRIMARYCODE tinyint = 1,
  @EXCLUDEPHONEID uniqueidentifier = null --this is used by manual reconciliation to not include in the cursor the incoming phone shown on the resolution screen;  

)
as
begin
  set nocount on;

  declare @INCOMINGPHONEROWID uniqueidentifier;
  declare @INCOMINGPHONETYPECODEID uniqueidentifier;
  declare @INCOMINGPHONENUMBER nvarchar(100); 
  declare @INCOMINGISPRIMARY bit;
  -- secondary fields

  declare @INCOMINGDONOTCALL bit;
  declare @INCOMINGCOUNTRYID uniqueidentifier;
  declare @INCOMINGSEASONALSTARTDATE dbo.UDT_MONTHDAY;
  declare @INCOMINGSEASONALENDDATE dbo.UDT_MONTHDAY;
  declare @INCOMINGSTARTTIME dbo.UDT_HOURMINUTE;
  declare @INCOMINGENDTIME dbo.UDT_HOURMINUTE;
  declare @INCOMINGSTARTDATE date;
  declare @INCOMINGENDDATE date;
  declare @INCOMINGINFOSOURCECODEID uniqueidentifier;

  declare @MAKENEWPRIMARYROWID uniqueidentifier;
  declare @EXISTINGPRIMARYPHONETYPECODEID uniqueidentifier;
  declare @EXISTINGPRIMARYPHONEID uniqueidentifier;

  declare @EXISTINGPHONEID uniqueidentifier;
  declare @EXISTINGPHONETYPECODEID uniqueidentifier;
  declare @EXISTINGISPRIMARY bit;
  declare @EXISTINGDONOTCALL bit;
  declare @EXISTINGCOUNTRYID uniqueidentifier;
  declare @EXISTINGSEASONALSTARTDATE dbo.UDT_MONTHDAY;
  declare @EXISTINGSEASONALENDDATE dbo.UDT_MONTHDAY;
  declare @EXISTINGSTARTTIME dbo.UDT_HOURMINUTE;
  declare @EXISTINGENDTIME dbo.UDT_HOURMINUTE;
  declare @EXISTINGSTARTDATE date;
  declare @EXISTINGENDDATE date;
  declare @EXISTINGINFOSOURCECODEID uniqueidentifier;
  declare @PRIMARYCOUNT int = dbo.UFN_BATCHCONSTITUENTUPDATEPHONES_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
    @EXISTINGPRIMARYPHONEID = ID,
    @EXISTINGPRIMARYPHONETYPECODEID = case when ISPRIMARY = 1 then PHONETYPECODEID else null end
    from dbo.PHONE where CONSTITUENTID = @PRIMARYRECORDID 
    order by ISPRIMARY desc;

  if @EXISTINGPRIMARYPHONEID is not null -- only apply the rules if the constituent has at least one phone

    begin    
      declare INCOMINGPHONE_CURSOR cursor local fast_forward for
        select 
        ID,
        PHONETYPECODEID,
        NUMBER,
        ISPRIMARY,
        DONOTCALL,
        COUNTRYID,
        SEASONALSTARTDATE,
        SEASONALENDDATE,
        STARTTIME,
        ENDTIME,
        STARTDATE,
        ENDDATE,
        INFOSOURCECODEID
      from dbo.BATCHCONSTITUENTUPDATEPHONES
      where BATCHCONSTITUENTUPDATEID = @ID and PHONEID is null and BATCHCONSTITUENTUPDATEPHONES.ID <> coalesce(@EXCLUDEPHONEID, @NULLVALUE); -- exclude from the cursor the ID coming from the resolutions screen


      open INCOMINGPHONE_CURSOR;

      begin try
        fetch next from INCOMINGPHONE_CURSOR into
            @INCOMINGPHONEROWID,
            @INCOMINGPHONETYPECODEID,
            @INCOMINGPHONENUMBER,
            @INCOMINGISPRIMARY,
            @INCOMINGDONOTCALL,
            @INCOMINGCOUNTRYID,
            @INCOMINGSEASONALSTARTDATE,
            @INCOMINGSEASONALENDDATE,
            @INCOMINGSTARTTIME
            @INCOMINGENDTIME,
            @INCOMINGSTARTDATE
            @INCOMINGENDDATE
            @INCOMINGINFOSOURCECODEID;      

          while (@@FETCH_STATUS = 0)
          begin

          set @EXISTINGPHONEID = null;

          select top 1 @EXISTINGPHONEID = ID,
                 @EXISTINGPHONETYPECODEID = PHONETYPECODEID,
                 @EXISTINGISPRIMARY = ISPRIMARY,
                 @EXISTINGDONOTCALL = DONOTCALL,
                 @EXISTINGCOUNTRYID = COUNTRYID,
                 @EXISTINGSEASONALSTARTDATE = SEASONALSTARTDATE,
                 @EXISTINGSEASONALENDDATE = SEASONALENDDATE,
                 @EXISTINGSTARTTIME = STARTTIME,
                 @EXISTINGENDTIME = ENDTIME,
                 @EXISTINGSTARTDATE = STARTDATE,
                 @EXISTINGENDDATE = ENDDATE,
                 @EXISTINGINFOSOURCECODEID = INFOSOURCECODEID      
          from dbo.PHONE P
          where P.CONSTITUENTID = @PRIMARYRECORDID
          and P.NUMBERNOFORMAT = dbo.UFN_PHONE_REMOVEFORMATTING(@INCOMINGPHONENUMBER)
          and (P.PHONETYPECODEID is null or @INCOMINGPHONETYPECODEID is null or P.PHONETYPECODEID = @INCOMINGPHONETYPECODEID)
          and not exists(select PHONEID from dbo.BATCHCONSTITUENTUPDATEPHONES where BATCHCONSTITUENTUPDATEID = @ID and PHONEID = P.ID)
          order by case when P.PHONETYPECODEID = @INCOMINGPHONETYPECODEID then 1 else 2 end, ISPRIMARY desc, ENDDATE, DONOTCALL, DATECHANGED desc;

          if @EXISTINGPHONEID is not null -- incoming phone is identical to existing phone     

            begin
              if @DIFFERENTPHONECODE <> 0
                set @UPDATESECONDARYDATA = 1                
              else if not(@INCOMINGDONOTCALL=1 and @EXISTINGDONOTCALL=0) and
                  (@EXISTINGCOUNTRYID is null or @EXISTINGCOUNTRYID = @INCOMINGCOUNTRYID or @INCOMINGCOUNTRYID is null) and
                  (@EXISTINGSEASONALSTARTDATE = '0000' or @EXISTINGSEASONALSTARTDATE = @INCOMINGSEASONALSTARTDATE or @INCOMINGSEASONALSTARTDATE  = '0000') and
                  (@EXISTINGSEASONALENDDATE = '0000' or @EXISTINGSEASONALENDDATE = @INCOMINGSEASONALENDDATE or @INCOMINGSEASONALENDDATE = '0000') and
                  (@EXISTINGSTARTTIME = '0000' or @EXISTINGSTARTTIME = @INCOMINGSTARTTIME or @INCOMINGSTARTTIME  = '0000') and
                  (@EXISTINGENDTIME = '0000' or @EXISTINGENDTIME = @INCOMINGENDTIME or @INCOMINGENDTIME = '0000') 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.BATCHCONSTITUENTUPDATEPHONES set
                    PHONEID = @EXISTINGPHONEID,    
                    ISPRIMARY = case when @PRIMARYCOUNT = 1 then ISPRIMARY else @EXISTINGISPRIMARY end,  -- set isprimary only when no primary exists already

                    PHONETYPECODEID = coalesce(PHONETYPECODEID, @EXISTINGPHONETYPECODEID),
                    COUNTRYID = coalesce(COUNTRYID,@EXISTINGCOUNTRYID),
                    SEASONALSTARTDATE = coalesce(NULLIF(SEASONALSTARTDATE,'0000'),@EXISTINGSEASONALSTARTDATE),
                    SEASONALENDDATE = coalesce(NULLIF(SEASONALENDDATE,'0000'),@EXISTINGSEASONALENDDATE),
                    STARTTIME = coalesce(NULLIF(STARTTIME,'0000'),@EXISTINGSTARTTIME),
                    ENDTIME = coalesce(NULLIF(ENDTIME,'0000'),@EXISTINGENDTIME),
                    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),

                    --DONOTCALL = coalesce(NULLIF(DONOTCALL,0),@EXISTINGDONOTCALL),

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

                begin
                  update dbo.BATCHCONSTITUENTUPDATEPHONES set
                    PHONEID = @EXISTINGPHONEID,  
                    PHONETYPECODEID = @EXISTINGPHONETYPECODEID,
                    ISPRIMARY = case when @PRIMARYCOUNT = 1 then ISPRIMARY else @EXISTINGISPRIMARY end
                    DONOTCALL = @EXISTINGDONOTCALL,
                    COUNTRYID = @EXISTINGCOUNTRYID,
                    SEASONALSTARTDATE = @EXISTINGSEASONALSTARTDATE,
                    SEASONALENDDATE = @EXISTINGSEASONALENDDATE,
                    STARTTIME = @EXISTINGSTARTTIME,
                    ENDTIME = @EXISTINGENDTIME,
                    STARTDATE = @EXISTINGSTARTDATE
                    ENDDATE = @EXISTINGENDDATE,
                    INFOSOURCECODEID = @EXISTINGINFOSOURCECODEID,
                    CHANGEDBYID = @CHANGEAGENTID,
                    DATECHANGED = @CURRENTDATE                
                  where ID = @INCOMINGPHONEROWID;         
                end              
            end            
          else  -- Incoming PHONE is not similar

            begin
              if @DIFFERENTPHONECODE = 0 -- Ignore

                delete from dbo.BATCHCONSTITUENTUPDATEPHONES 
                where ID = @INCOMINGPHONEROWID;  
              else if @DIFFERENTPHONECODE = 3 -- Add

              begin
                if (@INCOMINGISPRIMARY = 1 or (@MAKENEWPRIMARYROWID is null and (@NEWPHONEPRIMARYCODE = 2 or (@NEWPHONEPRIMARYCODE = 1 and @INCOMINGPHONETYPECODEID = @EXISTINGPRIMARYPHONETYPECODEID))))                                       
                    and @INCOMINGENDDATE is null and @INCOMINGDONOTCALL = 0 -- Cannot make phone numbers with end dates primary under any condition

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

                      set @MAKENEWPRIMARYROWID = @INCOMINGPHONEROWID;                                     
              end    
            end

        fetch next from INCOMINGPHONE_CURSOR into
          @INCOMINGPHONEROWID,
          @INCOMINGPHONETYPECODEID
          @INCOMINGPHONENUMBER
          @INCOMINGISPRIMARY,
          @INCOMINGDONOTCALL,
          @INCOMINGCOUNTRYID,
          @INCOMINGSEASONALSTARTDATE,
          @INCOMINGSEASONALENDDATE,
          @INCOMINGSTARTTIME
          @INCOMINGENDTIME,
          @INCOMINGSTARTDATE
          @INCOMINGENDDATE
          @INCOMINGINFOSOURCECODEID;         
        end

        close INCOMINGPHONE_CURSOR;
        deallocate INCOMINGPHONE_CURSOR;
      end try
      begin catch

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

      -- set all potential primary phones to non-primary, except for the MAKENEWPRIMARYROWID phone     

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

      if @ADDALLPHONES = 1 -- Add all other phones for the selected constituent

      begin
        insert into dbo.BATCHCONSTITUENTUPDATEPHONES(
            ID,        
            BATCHCONSTITUENTUPDATEID,
            SEQUENCE,
            PHONETYPECODEID,
            NUMBER,
            ISPRIMARY,
            DONOTCALL,
            UPDATEHOUSEHOLD,
            ADDEDBYID,
            CHANGEDBYID,
            COUNTRYID,
            SEASONALSTARTDATE,
            SEASONALENDDATE,
            STARTTIME,
            ENDTIME,
            STARTDATE,
            ENDDATE,
            INFOSOURCECODEID,
            PHONEID,
   ROWORIGINCODE
        )
        select
            newid(),        
            @ID,
            P.SEQUENCE,
            P.PHONETYPECODEID,
            P.NUMBER,
            case when exists(select ISPRIMARY from dbo.BATCHCONSTITUENTUPDATEPHONES where BATCHCONSTITUENTUPDATEID = @ID and ISPRIMARY = 1) or @MAKENEWPRIMARYROWID is not null then 0 else ISPRIMARY end,
            P.DONOTCALL,
            cast(0 as bit) as UPDATEHOUSEHOLD,
            @CHANGEAGENTID,
            @CHANGEAGENTID,
            P.COUNTRYID,
            P.SEASONALSTARTDATE,
            P.SEASONALENDDATE,
            P.STARTTIME,
            P.ENDTIME,    
            P.STARTDATE,
            P.ENDDATE,
            P.INFOSOURCECODEID,
            P.ID as PHONEID,
            2 -- Existing record, automatically populated by the system during import

        from dbo.PHONE P
        where P.CONSTITUENTID = @PRIMARYRECORDID and P.ID not in (select PHONEID from dbo.BATCHCONSTITUENTUPDATEPHONES where BATCHCONSTITUENTUPDATEID = @ID and PHONEID is not null);
      end

      -- set the MAKENEWPRIMARYROWID phone as primary

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