USP_CONSTITUENTUPDATEBATCH_APPLYADDRESSRULES

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier IN
@PRIMARYRECORDID uniqueidentifier IN
@CHANGEAGENTID uniqueidentifier IN
@ADDALLADDRESSES bit IN
@SIMILARADDRESSCODE tinyint IN
@UNSIMILARADDRESSCODE tinyint IN
@NEWADDRESSPRIMARYCODE tinyint IN
@EXCLUDEADDRESSID uniqueidentifier IN

Definition

Copy


CREATE procedure dbo.USP_CONSTITUENTUPDATEBATCH_APPLYADDRESSRULES(
  @ID uniqueidentifier, -- Incoming Constituent ID

  @PRIMARYRECORDID uniqueidentifier, -- Existing Constituent ID

  @CHANGEAGENTID uniqueidentifier,
  @ADDALLADDRESSES bit = 1,
  @SIMILARADDRESSCODE tinyint = 3,
  @UNSIMILARADDRESSCODE tinyint = 3,
  @NEWADDRESSPRIMARYCODE tinyint = 1,
  @EXCLUDEADDRESSID uniqueidentifier = null --this is used by manual reconciliation to not include in the cursor the incoming address shown on the resolution screen; 

)
as
begin
  declare @CURRENTDATE datetime;
  declare @INCOMINGADDRESSROWID uniqueidentifier;
  declare @INCOMINGADDRESSTYPECODEID uniqueidentifier;
  declare @INCOMINGCOUNTRYID uniqueidentifier; 
  declare @INCOMINGADDRESSBLOCK nvarchar(150);
  declare @INCOMINGCITY nvarchar(50);
  declare @INCOMINGSTATEID uniqueidentifier;
  declare @INCOMINGPOSTCODE nvarchar(12);
  declare @INCOMINGISPRIMARY bit
  declare @INCOMINGHISTORICALSTARTDATE date;
  declare @INCOMINGHISTORICALENDDATE date;
  declare @INCOMINGDONOTMAIL bit;
  declare @INCOMINGDONOTMAILREASONCODEID uniqueidentifier;
  declare @INCOMINGSTARTDATE dbo.UDT_MONTHDAY;
  declare @INCOMINGENDDATE dbo.UDT_MONTHDAY;
  declare @INCOMINGDPC nvarchar(max);
  declare @INCOMINGCART nvarchar(max);
  declare @INCOMINGLOT nvarchar(5);
  declare @SIMILARADDRESSID uniqueidentifier;
  declare @SIMILARADDRESSTYPECODEID uniqueidentifier;
  declare @SIMILARCOUNTRYID uniqueidentifier; 
  declare @SIMILARADDRESSBLOCK nvarchar(150);
  declare @SIMILARCITY nvarchar(50);
  declare @SIMILARSTATEID uniqueidentifier;
  declare @SIMILARPOSTCODE nvarchar(12);
  declare @SIMILARISPRIMARY bit;
  declare @SIMILARHISTORICALSTARTDATE date;
  declare @SIMILARHISTORICALENDDATE date;
  declare @SIMILARDONOTMAIL bit;
  declare @SIMILARDONOTMAILREASONCODEID uniqueidentifier;
  declare @SIMILARSTARTDATE dbo.UDT_MONTHDAY;
  declare @SIMILARENDDATE dbo.UDT_MONTHDAY;
  declare @SIMILARDPC nvarchar(max);
  declare @SIMILARCART nvarchar(max);
  declare @SIMILARLOT nvarchar(5);
  declare @SIMILARINFOSOURCECODEID uniqueidentifier;
  declare @SIMILARINFOSOURCECOMMENTS nvarchar(256);
  declare @SIMILARCOUNTYCODEID uniqueidentifier;
  declare @SIMILARREGIONCODEID uniqueidentifier;
  declare @SIMILARCONGRESSIONALDISTRICTCODEID uniqueidentifier;
  declare @SIMILARSTATEHOUSEDISTRICTCODEID uniqueidentifier;
  declare @SIMILARSTATESENATEDISTRICTCODEID uniqueidentifier;
  declare @SIMILARLOCALPRECINCTCODEID uniqueidentifier;
  declare @SIMILARCERTIFICATIONDATA int;
  declare @SIMILARLASTVALIDATIONATTEMPTDATE date;
  declare @SIMILAROMITFROMVALIDATION bit;
  declare @SIMILARVALIDATIONMESSAGE nvarchar(200);
  declare @ADDRESSMATCHTHRESHOLD tinyint;
  declare @NOCONFLICTS bit;
  declare @MAKENEWPRIMARYROWID uniqueidentifier;
  declare @EXISTINGISPRIMARYADDRESSID uniqueidentifier;
  declare @EXISTINGPRIMARYADDRESSTYPECODEID uniqueidentifier;
  declare @INCOMINGINFOSOURCECODEID uniqueidentifier;
  declare @INCOMINGINFOSOURCECOMMENTS nvarchar(256);
  declare @INCOMINGCOUNTYCODEID uniqueidentifier;
  declare @INCOMINGREGIONCODEID uniqueidentifier;
  declare @INCOMINGCONGRESSIONALDISTRICTCODEID uniqueidentifier;
  declare @INCOMINGSTATEHOUSEDISTRICTCODEID uniqueidentifier;
  declare @INCOMINGSTATESENATEDISTRICTCODEID uniqueidentifier;
  declare @INCOMINGLOCALPRECINCTCODEID uniqueidentifier;
  declare @INCOMINGCERTIFICATIONDATA int;
  declare @INCOMINGLASTVALIDATIONATTEMPTDATE date;
  declare @INCOMINGOMITFROMVALIDATION bit;
  declare @INCOMINGVALIDATIONMESSAGE nvarchar(200);
  declare @UPDATESECONDARYDATA bit = 0; -- flag for non core fields

  declare @PRIMARYCOUNT int = dbo.UFN_BATCHCONSTITUENTUPDATEADDRESSES_PRIMARYCOUNT(@ID);

  if @CHANGEAGENTID is null  
  exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output

  set @CURRENTDATE = getdate();

  -- Get the address match threshold 

  select top 1
  @ADDRESSMATCHTHRESHOLD = ADDRESSMATCHTHRESHOLD
  from dbo.CONSTITUENTDUPLICATESEARCHSETTINGS

  --Get the existing is primary row

  select top 1
  @EXISTINGISPRIMARYADDRESSID = ID,
  @EXISTINGPRIMARYADDRESSTYPECODEID = case when ISPRIMARY = 1 then ADDRESSTYPECODEID else null end            
  from dbo.ADDRESS where CONSTITUENTID = @PRIMARYRECORDID
  order by ISPRIMARY desc;

  declare @NULLVALUE uniqueidentifier = newid();

  if @EXISTINGISPRIMARYADDRESSID is not null -- only apply the rules if the constituent has at least one address

   begin
      declare INCOMINGADDRESS_CURSOR cursor local fast_forward for
        select 
      BATCHCONSTITUENTUPDATEADDRESSES.ID,
      ADDRESSTYPECODEID,
      COUNTRYID,
      ADDRESSBLOCK,
      CITY,
      STATEID,
      POSTCODE,
      ISPRIMARY,
      HISTORICALSTARTDATE,
      HISTORICALENDDATE,
      DONOTMAIL,
      DONOTMAILREASONCODEID,
      STARTDATE,
      ENDDATE,
      DPC,
      CART,
      LOT,
      INFOSOURCECODEID,
      INFOSOURCECOMMENTS,
      COUNTYCODEID,
      REGIONCODEID,
      CONGRESSIONALDISTRICTCODEID,
      STATEHOUSEDISTRICTCODEID,
      STATESENATEDISTRICTCODEID,
      LOCALPRECINCTCODEID,
      CERTIFICATIONDATA,
      LASTVALIDATIONATTEMPTDATE,
      OMITFROMVALIDATION,
      VALIDATIONMESSAGE
      from dbo.BATCHCONSTITUENTUPDATEADDRESSES
      where BATCHCONSTITUENTUPDATEID = @ID and ADDRESSID is null and BATCHCONSTITUENTUPDATEADDRESSES.ID <> coalesce(@EXCLUDEADDRESSID,  @NULLVALUE); -- exclude from the cursor the ID coming from the resolutions screen


      open INCOMINGADDRESS_CURSOR;
      begin try
      fetch next from INCOMINGADDRESS_CURSOR into
          @INCOMINGADDRESSROWID,
          @INCOMINGADDRESSTYPECODEID,
        @INCOMINGCOUNTRYID,
        @INCOMINGADDRESSBLOCK,
        @INCOMINGCITY,
        @INCOMINGSTATEID,
        @INCOMINGPOSTCODE,
        @INCOMINGISPRIMARY,
        @INCOMINGHISTORICALSTARTDATE,
        @INCOMINGHISTORICALENDDATE,
        @INCOMINGDONOTMAIL,
        @INCOMINGDONOTMAILREASONCODEID,
        @INCOMINGSTARTDATE,
        @INCOMINGENDDATE,
        @INCOMINGDPC,
        @INCOMINGCART,
        @INCOMINGLOT,
          @INCOMINGINFOSOURCECODEID,
        @INCOMINGINFOSOURCECOMMENTS,
        @INCOMINGCOUNTYCODEID,
        @INCOMINGREGIONCODEID,
        @INCOMINGCONGRESSIONALDISTRICTCODEID,
        @INCOMINGSTATEHOUSEDISTRICTCODEID,
        @INCOMINGSTATESENATEDISTRICTCODEID,
        @INCOMINGLOCALPRECINCTCODEID,
        @INCOMINGCERTIFICATIONDATA,
        @INCOMINGLASTVALIDATIONATTEMPTDATE,
        @INCOMINGOMITFROMVALIDATION,
        @INCOMINGVALIDATIONMESSAGE;
        while (@@FETCH_STATUS = 0)
        begin
      set @SIMILARADDRESSID = null;
      set @NOCONFLICTS = 0

      select top 1
        @SIMILARADDRESSID = ADDRESSID, 
        @NOCONFLICTS = NOCONFLICTS
      from dbo.UFN_FINDADDRESSMATCH_CONSTITUENTUPDATEBATCH2(@PRIMARYRECORDID, @INCOMINGADDRESSBLOCK, @INCOMINGPOSTCODE, @INCOMINGCOUNTRYID, @INCOMINGCITY, @INCOMINGSTATEID, @INCOMINGADDRESSTYPECODEID, @ADDRESSMATCHTHRESHOLD, @ID, @INCOMINGHISTORICALENDDATE);

      if @SIMILARADDRESSID is not null -- If address is similar

      begin
        select
          @SIMILARADDRESSTYPECODEID = ADDRESSTYPECODEID,
          @SIMILARCOUNTRYID = COUNTRYID,
          @SIMILARADDRESSBLOCK= ADDRESSBLOCK,
          @SIMILARCITY = CITY,
          @SIMILARSTATEID = STATEID,
          @SIMILARPOSTCODE = POSTCODE,
          @SIMILARISPRIMARY = ISPRIMARY,
          @SIMILARHISTORICALSTARTDATE = HISTORICALSTARTDATE,
          @SIMILARHISTORICALENDDATE= HISTORICALENDDATE,
          @SIMILARDONOTMAIL= DONOTMAIL,
          @SIMILARDONOTMAILREASONCODEID = DONOTMAILREASONCODEID,
          @SIMILARSTARTDATE= STARTDATE,
          @SIMILARENDDATE = ENDDATE,
          @SIMILARDPC = DPC,
          @SIMILARCART= CART,
          @SIMILARLOT= LOT,
          @SIMILARINFOSOURCECODEID = AVU.[INFOSOURCECODEID],
          @SIMILARINFOSOURCECOMMENTS = coalesce(AVU.INFOSOURCECOMMENTS, ''),
          @SIMILARCOUNTYCODEID = AVU.[COUNTYCODEID],
          @SIMILARREGIONCODEID = AVU.[REGIONCODEID],
          @SIMILARCONGRESSIONALDISTRICTCODEID = AVU.[CONGRESSIONALDISTRICTCODEID],
          @SIMILARSTATEHOUSEDISTRICTCODEID = AVU.[STATEHOUSEDISTRICTCODEID],
          @SIMILARSTATESENATEDISTRICTCODEID = AVU.[STATESENATEDISTRICTCODEID],
          @SIMILARCERTIFICATIONDATA = coalesce(AVU.[CERTIFICATIONDATA], '0'),
          @SIMILARLASTVALIDATIONATTEMPTDATE = AVU.[LASTVALIDATIONATTEMPTDATE],
          @SIMILAROMITFROMVALIDATION = coalesce(AVU.[OMITFROMVALIDATION], cast(0 as bit)),
          @SIMILARVALIDATIONMESSAGE = coalesce(AVU.[VALIDATIONMESSAGE], '')
        from dbo.ADDRESS
        left join dbo.[ADDRESSVALIDATIONUPDATE] AVU on ADDRESS.[ID] = AVU.[ID]
        where ADDRESS.ID = @SIMILARADDRESSID;        

        if @SIMILARADDRESSCODE = 1 or @NOCONFLICTS = 1 -- Update

        begin
            if @SIMILARADDRESSCODE <> 0
                  set @UPDATESECONDARYDATA = 1
            -- If address has no conflicts in the core fields then check secondary fields for conflicts and apply rules accordingly.

            else if (@SIMILARHISTORICALSTARTDATE is null or @SIMILARHISTORICALSTARTDATE = @INCOMINGHISTORICALSTARTDATE or @INCOMINGHISTORICALSTARTDATE is null) and 
               (@SIMILARHISTORICALENDDATE is null or @SIMILARHISTORICALENDDATE = @INCOMINGHISTORICALENDDATE) and
               (@SIMILARDONOTMAIL = @INCOMINGDONOTMAIL or @INCOMINGDONOTMAIL = 0) and
               (@SIMILARDONOTMAILREASONCODEID is null or @INCOMINGDONOTMAILREASONCODEID is null or @SIMILARDONOTMAILREASONCODEID = @INCOMINGDONOTMAILREASONCODEID) and
               (@SIMILARSTARTDATE = '0000' or @SIMILARSTARTDATE = @INCOMINGSTARTDATE or @INCOMINGSTARTDATE  = '0000') and
               (@SIMILARENDDATE = '0000' or @SIMILARENDDATE = @INCOMINGENDDATE or @INCOMINGENDDATE = '0000') and
               (@SIMILARDPC = '' or @SIMILARDPC = @INCOMINGDPC or @INCOMINGDPC = '') and 
               (@SIMILARCART = '' or @SIMILARCART = @INCOMINGCART or @INCOMINGCART = '') and
               (@SIMILARLOT = '' or @SIMILARLOT = @INCOMINGLOT or @INCOMINGLOT = '') and
               (@SIMILARINFOSOURCECODEID is null or @INCOMINGINFOSOURCECODEID is null or @SIMILARINFOSOURCECODEID = @INCOMINGINFOSOURCECODEID ) and
               (@SIMILARINFOSOURCECOMMENTS = '' or @SIMILARINFOSOURCECOMMENTS = @INCOMINGINFOSOURCECOMMENTS or @INCOMINGINFOSOURCECOMMENTS = '') and
               (@SIMILARCOUNTYCODEID is null  or @INCOMINGCOUNTYCODEID is null or @SIMILARCOUNTYCODEID = @INCOMINGCOUNTYCODEID) and
               (@SIMILARREGIONCODEID is null  or @INCOMINGREGIONCODEID is null or @SIMILARREGIONCODEID = @INCOMINGREGIONCODEID) and
               (@SIMILARCONGRESSIONALDISTRICTCODEID is null  or @INCOMINGCONGRESSIONALDISTRICTCODEID is null or @SIMILARCONGRESSIONALDISTRICTCODEID = @INCOMINGCONGRESSIONALDISTRICTCODEID) and
               (@SIMILARSTATEHOUSEDISTRICTCODEID is null  or @INCOMINGSTATEHOUSEDISTRICTCODEID is null or @SIMILARSTATEHOUSEDISTRICTCODEID = @INCOMINGSTATEHOUSEDISTRICTCODEID) and
               (@SIMILARSTATESENATEDISTRICTCODEID is null  or @INCOMINGSTATESENATEDISTRICTCODEID is null or @SIMILARSTATESENATEDISTRICTCODEID = @INCOMINGSTATESENATEDISTRICTCODEID) and
               (@SIMILARLOCALPRECINCTCODEID is null  or @INCOMINGLOCALPRECINCTCODEID is null or @SIMILARLOCALPRECINCTCODEID = @INCOMINGLOCALPRECINCTCODEID) and          
               (@SIMILARCERTIFICATIONDATA = @INCOMINGCERTIFICATIONDATA or @INCOMINGCERTIFICATIONDATA = '0') and 
               (@SIMILARLASTVALIDATIONATTEMPTDATE is null or @SIMILARLASTVALIDATIONATTEMPTDATE = @INCOMINGLASTVALIDATIONATTEMPTDATE or @INCOMINGLASTVALIDATIONATTEMPTDATE = '') and
               (@SIMILAROMITFROMVALIDATION = @INCOMINGOMITFROMVALIDATION or @INCOMINGOMITFROMVALIDATION = 0) and 
               (@SIMILARVALIDATIONMESSAGE = '' or @SIMILARVALIDATIONMESSAGE = @INCOMINGVALIDATIONMESSAGE or @INCOMINGVALIDATIONMESSAGE = '')
               set @UPDATESECONDARYDATA = 1
            else
              set @UPDATESECONDARYDATA = 0

            if @UPDATESECONDARYDATA = 1 -- Update all fields

            begin
            update dbo.BATCHCONSTITUENTUPDATEADDRESSES set
              ADDRESSID = @SIMILARADDRESSID,
              ADDRESSTYPECODEID = coalesce(ADDRESSTYPECODEID,@SIMILARADDRESSTYPECODEID),
              COUNTRYID = coalesce(COUNTRYID,@SIMILARCOUNTRYID),
              ADDRESSBLOCK = coalesce(NULLIF(ADDRESSBLOCK,''),@SIMILARADDRESSBLOCK),
              CITY = coalesce(NULLIF(CITY,''),@SIMILARCITY),
              STATEID = coalesce(STATEID,@SIMILARSTATEID),
              POSTCODE = coalesce(NULLIF(POSTCODE,''),@SIMILARPOSTCODE),
              HISTORICALSTARTDATE = coalesce(HISTORICALSTARTDATE,@SIMILARHISTORICALSTARTDATE),
              --In this case blank has meaning so we don't want to coalesce, just keep what's on the incoming              

              --HISTORICALENDDATE = coalesce(HISTORICALENDDATE,@SIMILARHISTORICALENDDATE),

              --DONOTMAIL = coalesce(NULLIF(DONOTMAIL,0),@SIMILARDONOTMAIL),

              --DONOTMAILREASONCODEID = coalesce(DONOTMAILREASONCODEID,@SIMILARDONOTMAILREASONCODEID),

              STARTDATE = coalesce(NULLIF(STARTDATE,'0000'),@SIMILARSTARTDATE),
              ENDDATE = coalesce(NULLIF(ENDDATE,'0000'),@SIMILARENDDATE),
              DPC = coalesce(NULLIF(DPC,''),@SIMILARDPC),
              CART = coalesce(NULLIF(CART,''),@SIMILARCART),
              LOT = coalesce(NULLIF(LOT,''),@SIMILARLOT),
              INFOSOURCECODEID = coalesce(INFOSOURCECODEID,@SIMILARINFOSOURCECODEID),
              INFOSOURCECOMMENTS = coalesce(NULLIF(INFOSOURCECOMMENTS,''), @SIMILARINFOSOURCECOMMENTS),
              COUNTYCODEID = coalesce(COUNTYCODEID,@SIMILARCOUNTYCODEID),
              REGIONCODEID = coalesce(REGIONCODEID,@SIMILARREGIONCODEID),
              CONGRESSIONALDISTRICTCODEID = coalesce(CONGRESSIONALDISTRICTCODEID,@SIMILARCONGRESSIONALDISTRICTCODEID),
              STATEHOUSEDISTRICTCODEID = coalesce(STATEHOUSEDISTRICTCODEID,@SIMILARSTATEHOUSEDISTRICTCODEID),
              STATESENATEDISTRICTCODEID = coalesce(STATESENATEDISTRICTCODEID,@SIMILARSTATESENATEDISTRICTCODEID),
              LOCALPRECINCTCODEID = coalesce(LOCALPRECINCTCODEID,@SIMILARLOCALPRECINCTCODEID),
              CERTIFICATIONDATA = coalesce(NULLIF(CERTIFICATIONDATA,0),@SIMILARCERTIFICATIONDATA),
              LASTVALIDATIONATTEMPTDATE = coalesce(LASTVALIDATIONATTEMPTDATE,@SIMILARLASTVALIDATIONATTEMPTDATE),
              OMITFROMVALIDATION = coalesce(NULLIF(OMITFROMVALIDATION,0),@SIMILAROMITFROMVALIDATION),
              VALIDATIONMESSAGE = coalesce(NULLIF(VALIDATIONMESSAGE,''), @SIMILARVALIDATIONMESSAGE),
              ISPRIMARY = case when @PRIMARYCOUNT = 1 then ISPRIMARY else @SIMILARISPRIMARY end,  -- Do not set ISPRIMARY = 1 if a primary already exists.  May be changed by rules below.

              CHANGEDBYID = @CHANGEAGENTID,
              DATECHANGED = @CURRENTDATE
            where ID = @INCOMINGADDRESSROWID;         
          end
          else -- update only core fields and ignore secondary fields

          begin
            update dbo.BATCHCONSTITUENTUPDATEADDRESSES set
              ADDRESSID = @SIMILARADDRESSID,
              ADDRESSTYPECODEID = coalesce(ADDRESSTYPECODEID,@SIMILARADDRESSTYPECODEID),
              COUNTRYID = coalesce(COUNTRYID,@SIMILARCOUNTRYID),
              ADDRESSBLOCK = coalesce(NULLIF(ADDRESSBLOCK,''),@SIMILARADDRESSBLOCK),
              CITY = coalesce(NULLIF(CITY,''),@SIMILARCITY),
              STATEID = coalesce(STATEID,@SIMILARSTATEID),
              POSTCODE = coalesce(NULLIF(POSTCODE,''),@SIMILARPOSTCODE),
              HISTORICALSTARTDATE = @SIMILARHISTORICALSTARTDATE,
              HISTORICALENDDATE = @SIMILARHISTORICALENDDATE,
              DONOTMAIL = @SIMILARDONOTMAIL,
              DONOTMAILREASONCODEID = @SIMILARDONOTMAILREASONCODEID,
              STARTDATE = @SIMILARSTARTDATE,
              ENDDATE = @SIMILARENDDATE,
              DPC = @SIMILARDPC,
              CART = @SIMILARCART,
              LOT = @SIMILARLOT,
              INFOSOURCECODEID = @SIMILARINFOSOURCECODEID,
              INFOSOURCECOMMENTS = @SIMILARINFOSOURCECOMMENTS,
              COUNTYCODEID = @SIMILARCOUNTYCODEID,
              REGIONCODEID = @SIMILARREGIONCODEID,
              CONGRESSIONALDISTRICTCODEID = @SIMILARCONGRESSIONALDISTRICTCODEID,
              STATEHOUSEDISTRICTCODEID = @SIMILARSTATEHOUSEDISTRICTCODEID,
              STATESENATEDISTRICTCODEID = @SIMILARSTATESENATEDISTRICTCODEID,
              LOCALPRECINCTCODEID = @SIMILARLOCALPRECINCTCODEID,
              CERTIFICATIONDATA = @SIMILARCERTIFICATIONDATA,
              LASTVALIDATIONATTEMPTDATE = @SIMILARLASTVALIDATIONATTEMPTDATE,
              OMITFROMVALIDATION = @SIMILAROMITFROMVALIDATION,
              VALIDATIONMESSAGE = @SIMILARVALIDATIONMESSAGE,
              ISPRIMARY = case when @PRIMARYCOUNT = 1 then ISPRIMARY else @SIMILARISPRIMARY end
              CHANGEDBYID = @CHANGEAGENTID,
              DATECHANGED = @CURRENTDATE
            where ID = @INCOMINGADDRESSROWID
          end   
        end
        else if @SIMILARADDRESSCODE = 0 -- Ignore all fields

        begin
          update dbo.BATCHCONSTITUENTUPDATEADDRESSES set
            ADDRESSID = @SIMILARADDRESSID,
            ADDRESSTYPECODEID = @SIMILARADDRESSTYPECODEID,
            COUNTRYID = @SIMILARCOUNTRYID,
            ADDRESSBLOCK = @SIMILARADDRESSBLOCK,
            CITY = @SIMILARCITY,
            STATEID = @SIMILARSTATEID,
            POSTCODE = @SIMILARPOSTCODE,
            HISTORICALSTARTDATE = @SIMILARHISTORICALSTARTDATE,
            HISTORICALENDDATE = @SIMILARHISTORICALENDDATE,
            DONOTMAIL = @SIMILARDONOTMAIL,
            DONOTMAILREASONCODEID = @SIMILARDONOTMAILREASONCODEID,
            STARTDATE = @SIMILARSTARTDATE,
            ENDDATE = @SIMILARENDDATE,
            DPC = @SIMILARDPC,
            CART = @SIMILARCART,
            LOT = @SIMILARLOT,
            INFOSOURCECODEID = @SIMILARINFOSOURCECODEID,
            INFOSOURCECOMMENTS = @SIMILARINFOSOURCECOMMENTS,
            COUNTYCODEID = @SIMILARCOUNTYCODEID,
            REGIONCODEID = @SIMILARREGIONCODEID,
            CONGRESSIONALDISTRICTCODEID = @SIMILARCONGRESSIONALDISTRICTCODEID,
            STATEHOUSEDISTRICTCODEID = @SIMILARSTATEHOUSEDISTRICTCODEID,
            STATESENATEDISTRICTCODEID = @SIMILARSTATESENATEDISTRICTCODEID,
            LOCALPRECINCTCODEID = @SIMILARLOCALPRECINCTCODEID,
            CERTIFICATIONDATA = @SIMILARCERTIFICATIONDATA,
            LASTVALIDATIONATTEMPTDATE = @SIMILARLASTVALIDATIONATTEMPTDATE,
            OMITFROMVALIDATION = @SIMILAROMITFROMVALIDATION,
            VALIDATIONMESSAGE = @SIMILARVALIDATIONMESSAGE,
            ISPRIMARY = @SIMILARISPRIMARY,
            CHANGEDBYID = @CHANGEAGENTID,
            DATECHANGED = @CURRENTDATE
          where ID = @INCOMINGADDRESSROWID;
        end

        -- If the address is being updated/ignored and address type is being updated or the address is being added then store the row ID for this address type

        if @SIMILARADDRESSCODE in (0,1,3)
        begin
          set @SIMILARADDRESSTYPECODEID = case when @SIMILARADDRESSCODE = 1 or @NOCONFLICTS = 1 -- Update    

                                                                    then coalesce(@INCOMINGADDRESSTYPECODEID,@SIMILARADDRESSTYPECODEID)
                                                when @SIMILARADDRESSCODE = 0 -- Ignore 

                                                                    then @SIMILARADDRESSTYPECODEID
                                                                when @SIMILARADDRESSCODE = 3 -- Add

                                                                    then @INCOMINGADDRESSTYPECODEID
                                                        end;

          if @SIMILARADDRESSCODE = 3 and @NOCONFLICTS = 0 -- Add

          begin
            if @INCOMINGISPRIMARY = 1 or (@MAKENEWPRIMARYROWID is null and (@NEWADDRESSPRIMARYCODE = 2 or (@NEWADDRESSPRIMARYCODE = 1 and @INCOMINGADDRESSTYPECODEID = @EXISTINGPRIMARYADDRESSTYPECODEID)))            
              -- Always make new ADDRESS primary/Old ADDRESS has the same type as the new ADDRESS              

                  set @MAKENEWPRIMARYROWID = @INCOMINGADDRESSROWID;                
          end
        end
      end

      else -- Incoming address is not similar

      begin
        if @UNSIMILARADDRESSCODE = 0 -- Ignore

          delete from dbo.BATCHCONSTITUENTUPDATEADDRESSES 
          where ID = @INCOMINGADDRESSROWID;

        else if @UNSIMILARADDRESSCODE = 3 -- Add

          begin
            if (@NEWADDRESSPRIMARYCODE = 2
                  or (
                        @NEWADDRESSPRIMARYCODE = 1
                        and @INCOMINGADDRESSTYPECODEID = @EXISTINGPRIMARYADDRESSTYPECODEID
                        and @EXISTINGPRIMARYADDRESSTYPECODEID is not null
                      )
                )
                and @INCOMINGHISTORICALENDDATE is null
                and @INCOMINGDONOTMAIL = 0 -- Cannot make address with end dates primary under any condition           

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

                      set @MAKENEWPRIMARYROWID = @INCOMINGADDRESSROWID;                
          end  
      end

      fetch next from INCOMINGADDRESS_CURSOR into
          @INCOMINGADDRESSROWID,
          @INCOMINGADDRESSTYPECODEID,
        @INCOMINGCOUNTRYID,
        @INCOMINGADDRESSBLOCK,
        @INCOMINGCITY,
        @INCOMINGSTATEID,
        @INCOMINGPOSTCODE,
        @INCOMINGISPRIMARY,
        @INCOMINGHISTORICALSTARTDATE,
        @INCOMINGHISTORICALENDDATE,
        @INCOMINGDONOTMAIL,
        @INCOMINGDONOTMAILREASONCODEID,
        @INCOMINGSTARTDATE,
        @INCOMINGENDDATE,
        @INCOMINGDPC,
        @INCOMINGCART,
        @INCOMINGLOT,
        @INCOMINGINFOSOURCECODEID,
        @INCOMINGINFOSOURCECOMMENTS,
        @INCOMINGCOUNTYCODEID,
        @INCOMINGREGIONCODEID,
        @INCOMINGCONGRESSIONALDISTRICTCODEID,
        @INCOMINGSTATEHOUSEDISTRICTCODEID,
        @INCOMINGSTATESENATEDISTRICTCODEID,
        @INCOMINGLOCALPRECINCTCODEID,
        @INCOMINGCERTIFICATIONDATA,
        @INCOMINGLASTVALIDATIONATTEMPTDATE,
        @INCOMINGOMITFROMVALIDATION,
        @INCOMINGVALIDATIONMESSAGE;
      end

      close INCOMINGADDRESS_CURSOR;
      deallocate INCOMINGADDRESS_CURSOR;
      end try
      begin catch
      close INCOMINGADDRESS_CURSOR;
      deallocate INCOMINGADDRESS_CURSOR;
      exec dbo.USP_RAISE_ERROR;
      end catch

      -- set all potential primary addresses to non-primary, except for the MAKENEWPRIMARYROWID address     

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

      if @ADDALLADDRESSES = 1
      begin
        insert into dbo.BATCHCONSTITUENTUPDATEADDRESSES(
          ID,
          ADDRESSID,
          BATCHCONSTITUENTUPDATEID,
          ADDRESSBLOCK,
          ENDDATE,
          STARTDATE,
          HISTORICALSTARTDATE,
          ADDRESSTYPECODEID,
          CART,
          CERTIFICATIONDATA,
          CITY,
          CONGRESSIONALDISTRICTCODEID,
          COUNTRYID,
          COUNTYCODEID,
          DONOTMAIL,
          DONOTMAILREASONCODEID,
          DPC,
          INFOSOURCECODEID,
          ISPRIMARY,
          LASTVALIDATIONATTEMPTDATE,
          LOCALPRECINCTCODEID,
          LOT,
          OMITFROMVALIDATION,
          REGIONCODEID,
          STATEID,
          STATEHOUSEDISTRICTCODEID,
          STATESENATEDISTRICTCODEID,
          VALIDATIONMESSAGE,
          POSTCODE,
          SEQUENCE,
          UPDATEHOUSEHOLD,
          INFOSOURCECOMMENTS,
          HISTORICALENDDATE,
          ADDEDBYID,
          CHANGEDBYID,
          ROWORIGINCODE
        )
        select
          newid(),
          A.ID as ADDRESSID,
          @ID,
          coalesce(A.[ADDRESSBLOCK], '')as ADDRESSBLOCK,
          coalesce(A.[ENDDATE], '0000') as ENDDATE,
          coalesce(A.[STARTDATE], '0000') as STARTDATE,
          A.[HISTORICALSTARTDATE],
          A.[ADDRESSTYPECODEID],
          coalesce(A.[CART], '') as CART,
          coalesce(AVU.[CERTIFICATIONDATA], '0') as CERTIFICATIONDATA,
          coalesce(A.[CITY], '') as CITY,
          AVU.[CONGRESSIONALDISTRICTCODEID],
          A.[COUNTRYID],
          AVU.[COUNTYCODEID],
          coalesce(A.[DONOTMAIL], cast(0 as bit)) as DONOTMAIL,
          A.[DONOTMAILREASONCODEID],
          coalesce(A.[DPC], '') as DPC,
          AVU.[INFOSOURCECODEID],
          case when exists(select ISPRIMARY from dbo.BATCHCONSTITUENTUPDATEADDRESSES where BATCHCONSTITUENTUPDATEID = @ID and ISPRIMARY = 1) or @MAKENEWPRIMARYROWID is not null then 0 else ISPRIMARY end,
          AVU.[LASTVALIDATIONATTEMPTDATE],
          AVU.[LOCALPRECINCTCODEID],
          coalesce(A.[LOT], '') as LOT,
          coalesce(AVU.[OMITFROMVALIDATION], cast(0 as bit)) as OMITFROMVALIDATION,
          AVU.[REGIONCODEID],
          A.[STATEID],
          AVU.[STATEHOUSEDISTRICTCODEID],
          AVU.[STATESENATEDISTRICTCODEID],
          coalesce(AVU.[VALIDATIONMESSAGE], '') as VALIDATIONMESSAGE,
          coalesce(A.[POSTCODE], '') as POSTCODE,
          A.[SEQUENCE],
          cast(0 as bit) as UPDATEHOUSEHOLD,
          coalesce(AVU.INFOSOURCECOMMENTS, '') as INFOSOURCECOMMENTS,
          A.HISTORICALENDDATE,
          @CHANGEAGENTID,
          @CHANGEAGENTID,
          2 -- Existing record, automatically populated by the system during import

        from dbo.[ADDRESS] A
        left join dbo.[ADDRESSVALIDATIONUPDATE] AVU on A.[ID] = AVU.[ID]
        where A.CONSTITUENTID = @PRIMARYRECORDID and A.ID not in (select ADDRESSID from dbo.BATCHCONSTITUENTUPDATEADDRESSES where BATCHCONSTITUENTUPDATEID = @ID and ADDRESSID is not null);

      end

      -- set the MAKENEWPRIMARYROWID address as primary

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

    end        
end