USP_DATAFORMTEMPLATE_EDIT_CONSTITUENTUPDATEBATCHTEMPLATE_15

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier IN
@CHANGEAGENTID uniqueidentifier IN
@VALIDATEONLY bit IN
@CONSTITUENTTYPECODE tinyint IN
@BIRTHDATE UDT_FUZZYDATE IN
@FIRSTNAME nvarchar(50) IN
@GENDERCODE tinyint IN
@GIVESANONYMOUSLY bit IN
@KEYNAME nvarchar(100) IN
@LOOKUPID nvarchar(100) IN
@MAIDENNAME nvarchar(100) IN
@MIDDLENAME nvarchar(50) IN
@NICKNAME nvarchar(50) IN
@SUFFIXCODEID uniqueidentifier IN
@TITLECODEID uniqueidentifier IN
@WEBADDRESS UDT_WEBADDRESS IN
@ALTERNATELOOKUPIDS xml IN
@SECURITYATTRIBUTES xml IN
@DECEASED bit IN
@DECEASEDDATE UDT_FUZZYDATE IN
@CONSTITUENT_SITEID uniqueidentifier IN
@INTERESTS xml IN
@PROSPECTMANAGERFUNDRAISERID uniqueidentifier IN
@ADDRESSES xml IN
@EMAILADDRESSES xml IN
@PHONES xml IN
@CONSTITUENCIES xml IN
@GROUPTYPEID uniqueidentifier IN
@GROUPDESCRIPTION nvarchar(300) IN
@GROUPSTARTDATE date IN
@ORG_INDUSTRYCODEID uniqueidentifier IN
@ORG_NUMEMPLOYEES int IN
@ORG_NUMSUBSIDIARIES int IN
@ORG_PARENTCORPID uniqueidentifier IN
@MARITALSTATUSCODEID uniqueidentifier IN
@SPOUSE_ID uniqueidentifier IN
@SPOUSE_BIRTHDATE UDT_FUZZYDATE IN
@SPOUSE_FIRSTNAME nvarchar(50) IN
@SPOUSE_GENDERCODE tinyint IN
@SPOUSE_LASTNAME nvarchar(100) IN
@SPOUSE_LOOKUPID nvarchar(100) IN
@SPOUSE_MAIDENNAME nvarchar(100) IN
@SPOUSE_MIDDLENAME nvarchar(50) IN
@SPOUSE_NICKNAME nvarchar(50) IN
@SPOUSE_SUFFIXCODEID uniqueidentifier IN
@SPOUSE_TITLECODEID uniqueidentifier IN
@SPOUSE_RELATIONSHIPTYPECODEID uniqueidentifier IN
@SPOUSE_RECIPROCALTYPECODEID uniqueidentifier IN
@BUSINESS_ADDRESSBLOCK nvarchar(150) IN
@BUSINESS_ADDRESSTYPECODEID uniqueidentifier IN
@BUSINESS_CART nvarchar(10) IN
@BUSINESS_CITY nvarchar(50) IN
@BUSINESS_COUNTRYID uniqueidentifier IN
@BUSINESS_DONOTMAIL bit IN
@BUSINESS_DONOTMAILREASONCODEID uniqueidentifier IN
@BUSINESS_DPC nvarchar(8) IN
@BUSINESS_EMAILADDRESS UDT_EMAILADDRESS IN
@BUSINESS_EMAILADDRESSTYPECODEID uniqueidentifier IN
@BUSINESS_INDUSTRYCODEID uniqueidentifier IN
@BUSINESS_LOOKUPID nvarchar(100) IN
@BUSINESS_LOT nvarchar(5) IN
@BUSINESS_ID uniqueidentifier IN
@BUSINESS_NAME nvarchar(100) IN
@BUSINESS_NUMEMPLOYEES int IN
@BUSINESS_NUMSUBSIDIARIES int IN
@BUSINESS_PARENTCORPID uniqueidentifier IN
@BUSINESS_PHONENUMBER nvarchar(100) IN
@BUSINESS_PHONE_COUNTRYID uniqueidentifier IN
@BUSINESS_PHONETYPECODEID uniqueidentifier IN
@BUSINESS_RELATIONSHIPTYPECODEID uniqueidentifier IN
@BUSINESS_RECIPROCALTYPECODEID uniqueidentifier IN
@BUSINESS_STATEID uniqueidentifier IN
@BUSINESS_WEBADDRESS UDT_WEBADDRESS IN
@BUSINESS_POSTCODE nvarchar(12) IN
@CURRENTAPPUSERID uniqueidentifier IN
@SPOUSE_RELATIONSHIPTYPECODEIDSIMPLELIST uniqueidentifier IN
@SPOUSE_RECIPROCALTYPECODEIDSIMPLELIST uniqueidentifier IN
@BUSINESS_RELATIONSHIPTYPECODEIDSIMPLELIST uniqueidentifier IN
@BUSINESS_RECIPROCALTYPECODEIDSIMPLELIST uniqueidentifier IN
@BUSINESS_PRIMARYSOFTCREDITRELATIONSHIPEXISTS bit IN
@BUSINESS_PRIMARYSOFTCREDITMATCHFACTOR decimal(5, 2) IN
@BUSINESS_RECIPROCALSOFTCREDITRELATIONSHIPEXISTS bit IN
@BUSINESS_RECIPROCALSOFTCREDITMATCHFACTOR decimal(5, 2) IN
@BUSINESS_PRIMARYRECOGNITIONTYPECODEID uniqueidentifier IN
@BUSINESS_RECIPROCALRECOGNITIONTYPECODEID uniqueidentifier IN
@BUSINESS_EMAILADDRESSSTARTDATE date IN
@SPOUSE_PRIMARYSOFTCREDITRELATIONSHIPEXISTS bit IN
@SPOUSE_PRIMARYSOFTCREDITMATCHFACTOR decimal(5, 2) IN
@SPOUSE_RECIPROCALSOFTCREDITRELATIONSHIPEXISTS bit IN
@SPOUSE_RECIPROCALSOFTCREDITMATCHFACTOR decimal(5, 2) IN
@SPOUSE_PRIMARYRECOGNITIONTYPECODEID uniqueidentifier IN
@SPOUSE_RECIPROCALRECOGNITIONTYPECODEID uniqueidentifier IN
@CONSTITUENT_SITES xml IN
@BATCHOWNERID uniqueidentifier IN
@BATCHROWID uniqueidentifier IN
@SPOUSE_ALTERNATELOOKUPIDS xml IN
@SPOUSE_IMPORTLOOKUPID nvarchar(100) IN
@ROWFROMBATCHUI bit IN
@BBNCTRANID int IN
@REMOVESPOUSE bit IN
@SOCIALMEDIAACCOUNTS xml IN
@RELATIONSHIPS xml IN
@NETCOMMUNITYTRANSACTIONPROCESSORID uniqueidentifier IN
@NEWADDRESSENDDATECODE tinyint IN
@CREATEHISTORICALNAMECODE tinyint IN
@NEWPHONEENDDATECODE tinyint IN
@NEWEMAILENDDATECODE tinyint IN
@NAMEFORMATS xml IN
@REQUESTSNOEMAIL bit IN
@SOLICITCODES xml IN
@GENDERCODEID uniqueidentifier IN
@SPOUSE_GENDERCODEID uniqueidentifier IN

Definition

Copy


                    CREATE procedure dbo.USP_DATAFORMTEMPLATE_EDIT_CONSTITUENTUPDATEBATCHTEMPLATE_15
                    (
                        @ID uniqueidentifier,
                        @CHANGEAGENTID uniqueidentifier = null,
                        @VALIDATEONLY bit,
                        @CONSTITUENTTYPECODE tinyint,
                        @BIRTHDATE dbo.UDT_FUZZYDATE,
                        @FIRSTNAME nvarchar(50),
                        @GENDERCODE tinyint,
                        @GIVESANONYMOUSLY bit,
                        @KEYNAME nvarchar(100),
                        @LOOKUPID nvarchar(100),
                        @MAIDENNAME nvarchar(100),
                        @MIDDLENAME nvarchar(50),
                        @NICKNAME nvarchar(50),
                        @SUFFIXCODEID uniqueidentifier,
                        @TITLECODEID uniqueidentifier,
                        @WEBADDRESS dbo.UDT_WEBADDRESS,
                        @ALTERNATELOOKUPIDS xml,
                        @SECURITYATTRIBUTES xml,
                        @DECEASED bit,
                        @DECEASEDDATE dbo.UDT_FUZZYDATE,
                        @CONSTITUENT_SITEID uniqueidentifier,
                        @INTERESTS xml,
                        @PROSPECTMANAGERFUNDRAISERID uniqueidentifier,
                        --@EDUCATIONALINVOLVEMENTS xml,

                        @ADDRESSES xml,
                        @EMAILADDRESSES xml,
                        @PHONES xml,
                        @CONSTITUENCIES xml,
                        @GROUPTYPEID uniqueidentifier,
                        @GROUPDESCRIPTION nvarchar(300),
                        @GROUPSTARTDATE date,
                        @ORG_INDUSTRYCODEID uniqueidentifier,
                        @ORG_NUMEMPLOYEES int,
                        @ORG_NUMSUBSIDIARIES int,
                        @ORG_PARENTCORPID uniqueidentifier,
                        @MARITALSTATUSCODEID uniqueidentifier,    
                        @SPOUSE_ID uniqueidentifier,
                        @SPOUSE_BIRTHDATE dbo.UDT_FUZZYDATE,
                        @SPOUSE_FIRSTNAME nvarchar(50),
                        @SPOUSE_GENDERCODE tinyint,
                        @SPOUSE_LASTNAME nvarchar(100),
                        @SPOUSE_LOOKUPID nvarchar(100),
                        @SPOUSE_MAIDENNAME nvarchar(100),
                        @SPOUSE_MIDDLENAME nvarchar(50),
                        @SPOUSE_NICKNAME nvarchar(50),
                        @SPOUSE_SUFFIXCODEID uniqueidentifier,
                        @SPOUSE_TITLECODEID uniqueidentifier,
                        @SPOUSE_RELATIONSHIPTYPECODEID uniqueidentifier,
                        @SPOUSE_RECIPROCALTYPECODEID uniqueidentifier,
                        @BUSINESS_ADDRESSBLOCK nvarchar(150),
                        @BUSINESS_ADDRESSTYPECODEID uniqueidentifier,
                        @BUSINESS_CART nvarchar(10),
                        @BUSINESS_CITY nvarchar(50),
                        @BUSINESS_COUNTRYID uniqueidentifier,
                        @BUSINESS_DONOTMAIL bit,
                        @BUSINESS_DONOTMAILREASONCODEID uniqueidentifier,
                        @BUSINESS_DPC nvarchar(8),
                        @BUSINESS_EMAILADDRESS dbo.UDT_EMAILADDRESS,
                        @BUSINESS_EMAILADDRESSTYPECODEID uniqueidentifier,
                        @BUSINESS_INDUSTRYCODEID uniqueidentifier,
                        @BUSINESS_LOOKUPID nvarchar(100),
                        @BUSINESS_LOT nvarchar(5),
                        @BUSINESS_ID uniqueidentifier,
                        @BUSINESS_NAME nvarchar(100),
                        @BUSINESS_NUMEMPLOYEES int,
                        @BUSINESS_NUMSUBSIDIARIES int,
                        @BUSINESS_PARENTCORPID uniqueidentifier,
                        @BUSINESS_PHONENUMBER nvarchar(100),
                        @BUSINESS_PHONE_COUNTRYID uniqueidentifier,
                        @BUSINESS_PHONETYPECODEID uniqueidentifier,
                        @BUSINESS_RELATIONSHIPTYPECODEID uniqueidentifier,
                        @BUSINESS_RECIPROCALTYPECODEID uniqueidentifier,
                        @BUSINESS_STATEID uniqueidentifier,
                        @BUSINESS_WEBADDRESS dbo.UDT_WEBADDRESS,
                        @BUSINESS_POSTCODE nvarchar(12),
                        @CURRENTAPPUSERID uniqueidentifier,
                        @SPOUSE_RELATIONSHIPTYPECODEIDSIMPLELIST uniqueidentifier,
                        @SPOUSE_RECIPROCALTYPECODEIDSIMPLELIST uniqueidentifier,
                        @BUSINESS_RELATIONSHIPTYPECODEIDSIMPLELIST uniqueidentifier,
                        @BUSINESS_RECIPROCALTYPECODEIDSIMPLELIST uniqueidentifier,
                        @BUSINESS_PRIMARYSOFTCREDITRELATIONSHIPEXISTS bit,
                        @BUSINESS_PRIMARYSOFTCREDITMATCHFACTOR decimal(5,2),
                        @BUSINESS_RECIPROCALSOFTCREDITRELATIONSHIPEXISTS bit,
                        @BUSINESS_RECIPROCALSOFTCREDITMATCHFACTOR decimal(5,2),
                        @BUSINESS_PRIMARYRECOGNITIONTYPECODEID uniqueidentifier,
                        @BUSINESS_RECIPROCALRECOGNITIONTYPECODEID uniqueidentifier,
                        @BUSINESS_EMAILADDRESSSTARTDATE date,
                        @SPOUSE_PRIMARYSOFTCREDITRELATIONSHIPEXISTS bit,
                        @SPOUSE_PRIMARYSOFTCREDITMATCHFACTOR decimal(5,2),
                        @SPOUSE_RECIPROCALSOFTCREDITRELATIONSHIPEXISTS bit,
                        @SPOUSE_RECIPROCALSOFTCREDITMATCHFACTOR decimal(5,2),
                        @SPOUSE_PRIMARYRECOGNITIONTYPECODEID uniqueidentifier,
                        @SPOUSE_RECIPROCALRECOGNITIONTYPECODEID uniqueidentifier,
                        @CONSTITUENT_SITES xml,
                        @BATCHOWNERID uniqueidentifier,
                        @BATCHROWID uniqueidentifier,
                        @SPOUSE_ALTERNATELOOKUPIDS xml,
                        @SPOUSE_IMPORTLOOKUPID nvarchar(100),
                        @ROWFROMBATCHUI bit
                        @BBNCTRANID int,
                        @REMOVESPOUSE bit,
                        @SOCIALMEDIAACCOUNTS xml,
                        @RELATIONSHIPS xml,
                        @NETCOMMUNITYTRANSACTIONPROCESSORID uniqueidentifier,
                        @NEWADDRESSENDDATECODE tinyint,
                        @CREATEHISTORICALNAMECODE tinyint,
                        @NEWPHONEENDDATECODE tinyint,
                        @NEWEMAILENDDATECODE tinyint,
                        @NAMEFORMATS xml,
                        @REQUESTSNOEMAIL bit,
                        @SOLICITCODES xml,
                        @GENDERCODEID uniqueidentifier,
                        @SPOUSE_GENDERCODEID uniqueidentifier
                    ) as
                        set nocount on;

                        declare
                            @ErrorMessage nvarchar(1000),
                            @InfoMsg nvarchar(100),
                            @ErrorSeverity int,
                            @ErrorState int;

                        declare @CURRENTDATE datetime;
                        set @CURRENTDATE = getdate();

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

                        declare @SETID uniqueidentifier = newid();

                        declare @CURRENTCONSTITUENTTYPECODE tinyint;

                        declare @NULLVALUE uniqueidentifier = newid();
                        declare @NULLDATE DATE = '9999-01-01';
                        declare @dupflag tinyint = 0;

                        select @CURRENTCONSTITUENTTYPECODE = case
                                when C.ISORGANIZATION = 1 then 1
                                when (C.ISGROUP = 1 and GROUPDATA.GROUPTYPECODE = 0) then 2
                                when (C.ISGROUP = 1 and GROUPDATA.GROUPTYPECODE = 1) then 3
                                else 0
                            end
                            from dbo.CONSTITUENT C
                            left join dbo.GROUPDATA on C.ID = GROUPDATA.ID
                            where C.ID= @ID

                        if @CURRENTCONSTITUENTTYPECODE <> @CONSTITUENTTYPECODE
                            begin
                                raiserror('BBERR_ORIGINAL_ERROR:547',1,11);
                                raiserror('BBERR_CONSTITUENTTYPE', 13, 1);
                            end

                        -- Verify the solicit codes are valid

                        if @SOLICITCODES is not null
                        begin

                                -- address the auto end date issues for consent based SC

                                exec USP_CONSTITUENTUPDATEBATCH_ADJUSTSOLICITCODEDATERANGES @ID, @SOLICITCODES, @CHANGEAGENTID;

                                -- reload from table to reflect changes made above

                                select @SOLICITCODES = dbo.UFN_CONSTITUENTUPDATEBATCH_GETSOLICITCODES_TOITEMLISTXML(@BATCHROWID);

                                -- validate the SC

                                declare @SOLICITCODESTABLEALIDATION table
                                (
                                        ID uniqueidentifier,
                                        STARTDATE datetime,
                                        ENDDATE datetime,
                                        SOLICITCODEID uniqueidentifier
                                )

                                insert into @SOLICITCODESTABLEALIDATION
                                (
                                        ID,
                                        STARTDATE,
                                        ENDDATE,
                                        SOLICITCODEID
                                )
                                select
                                        case when ID is null then newid() else ID end,
                                        STARTDATE,
                                        ENDDATE,
                                        SOLICITCODEID
                                from dbo.UFN_CONSTITUENTUPDATEBATCH_GETSOLICITCODES_FROMITEMLISTXML(@SOLICITCODES)

                                -- Check for solicit codes whose end date is before the start date

                                if exists (    select 1
                                                        from @SOLICITCODESTABLEALIDATION
                                                        where
                                                                STARTDATE is not null and
                                                                STARTDATE > ENDDATE)
                                        raiserror('BBERR_SOLICITCODES_STARTENDDATE', 13, 1)

                                -- Check for records with the same solicit code and overlapping dates

                                if exists (    select 1
                                                        from @SOLICITCODESTABLEALIDATION SOLICITCODEONE
                                                        inner join @SOLICITCODESTABLEALIDATION SOLICITCODETWO on
                                                                SOLICITCODEONE.ID <> SOLICITCODETWO.ID and
                                                                SOLICITCODEONE.SOLICITCODEID = SOLICITCODETWO.SOLICITCODEID and
                                                                dbo.UFN_DATES_AREDATESOVERLAPPING(SOLICITCODEONE.STARTDATE, SOLICITCODEONE.ENDDATE, SOLICITCODETWO.STARTDATE, SOLICITCODETWO.ENDDATE) = 1)
                                        raiserror('BBERR_SOLICITCODES_NOOVERLAPPINGDATES', 13, 1)
                        end

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

                        --Get current Household/spouse information

                        --===============================================================

                        declare @CURRENTSPOUSE uniqueidentifier = null;
                        declare @CURRENTHOUSEHOLD uniqueidentifier = null;

                        select
                            @CURRENTSPOUSE = R.RECIPROCALCONSTITUENTID
                        from
                            dbo.RELATIONSHIP R
                        where    
                            R.ISSPOUSE = 1 and
                            R.RELATIONSHIPCONSTITUENTID = @ID;

                        select
                            @CURRENTHOUSEHOLD = GD.ID
                        from
                            dbo.GROUPMEMBER GM
                        inner join
                            dbo.GROUPDATA GD on GD.ID = GM.GROUPID and GD.GROUPTYPECODE = 0
                        where
                            GM.MEMBERID = @ID
                            and dbo.UFN_GROUPMEMBER_ISCURRENTMEMBER(GM.ID) = 1;


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

                        --Get current Business information

                        --===============================================================

                        declare @OLD_BUSINESS_ID uniqueidentifier
                        declare @OLD_BUSINESS_NAME nvarchar(100)
                        declare @OLD_BUSINESS_LOOKUPID nvarchar(100)

                        select 
                            @OLD_BUSINESS_ID = R.RECIPROCALCONSTITUENTID,
                            @OLD_BUSINESS_NAME = B.KEYNAME,
                            @OLD_BUSINESS_LOOKUPID = B.LOOKUPID
                        from
                            dbo.RELATIONSHIP R 
                            join dbo.CONSTITUENT B on B.ID = R.RECIPROCALCONSTITUENTID
                        where
                            R.RELATIONSHIPCONSTITUENTID = @ID and ISPRIMARYBUSINESS = 1

                        --If no business was specified but the lookupids match use the old business id

                        if (@BUSINESS_ID is null and @OLD_BUSINESS_LOOKUPID = @BUSINESS_LOOKUPID)
                            set @BUSINESS_ID = @OLD_BUSINESS_ID

                        -- Perform validation

                        if exists (select 1 from dbo.CONSTITUENT where LOOKUPID = @LOOKUPID and ID <> @ID)
                        begin
                            raiserror('BBERR_ORIGINAL_ERROR:2627',1,11);
                            raiserror('UC_CONSTITUENT_LOOKUPID', 13, 1);
                        end

                        if @BUSINESS_PRIMARYSOFTCREDITRELATIONSHIPEXISTS = 1
                        begin
                            if @BUSINESS_PRIMARYSOFTCREDITMATCHFACTOR <= 0 or @BUSINESS_PRIMARYSOFTCREDITMATCHFACTOR > 100
                            raiserror('BBERR_BUSINESS_INVALIDPRIMARYMATCHFACTOR', 13, 1);
                        end

                        if @BUSINESS_PRIMARYSOFTCREDITMATCHFACTOR is null
                            set @BUSINESS_PRIMARYSOFTCREDITMATCHFACTOR = 100.0;

                        if @BUSINESS_RECIPROCALSOFTCREDITRELATIONSHIPEXISTS = 1
                        begin
                            if @BUSINESS_RECIPROCALSOFTCREDITMATCHFACTOR <= 0 or @BUSINESS_RECIPROCALSOFTCREDITMATCHFACTOR > 100
                            raiserror('BBERR_BUSINESS_INVALIDRECIPROCALMATCHFACTOR', 13, 1);
                        end

                        if @BUSINESS_RECIPROCALSOFTCREDITMATCHFACTOR is null
                            set @BUSINESS_RECIPROCALSOFTCREDITMATCHFACTOR = 100.0;

                                                if @SPOUSE_PRIMARYSOFTCREDITRELATIONSHIPEXISTS = 1
                        begin
                            if @SPOUSE_PRIMARYSOFTCREDITMATCHFACTOR <= 0 or @SPOUSE_PRIMARYSOFTCREDITMATCHFACTOR > 100
                            raiserror('BBERR_SPOUSE_INVALIDPRIMARYMATCHFACTOR', 13, 1);
                        end

                        if @SPOUSE_PRIMARYSOFTCREDITMATCHFACTOR is null
                            set @SPOUSE_PRIMARYSOFTCREDITMATCHFACTOR = 100.0;

                        if @SPOUSE_RECIPROCALSOFTCREDITRELATIONSHIPEXISTS = 1
                        begin
                            if @SPOUSE_RECIPROCALSOFTCREDITMATCHFACTOR <= 0 or @SPOUSE_RECIPROCALSOFTCREDITMATCHFACTOR > 100
                            raiserror('BBERR_SPOUSE_INVALIDRECIPROCALMATCHFACTOR', 13, 1);
                        end

                        if @SPOUSE_RECIPROCALSOFTCREDITMATCHFACTOR is null
                            set @SPOUSE_RECIPROCALSOFTCREDITMATCHFACTOR = 100.0;

                        if @CONSTITUENTTYPECODE = 1
                        begin
                            if @ORG_PARENTCORPID is not null
                                if dbo.UFN_ORGANIZATION_VALIDPARENTCORPID(@ID, @ORG_PARENTCORPID) = 0
                                begin
                                    raiserror('BBERR_ORIGINAL_ERROR:547',1,11);
                                    raiserror('CK_ORGANIZATIONDATA_VALIDPARENTCORPID', 13, 1);
                                end

                            if @ORG_NUMEMPLOYEES < 0
                            begin
                                raiserror('BBERR_ORIGINAL_ERROR:547',1,11);
                                raiserror('CK_ORGANIZATIONDATA_NUMEMPLOYEES', 13, 1);
                            end

                            if @ORG_NUMSUBSIDIARIES < 0
                            begin
                                raiserror('BBERR_ORIGINAL_ERROR:547',1,11);
                                raiserror('CK_ORGANIZATIONDATA_NUMSUBSIDIARIES', 13, 1);
                            end
                        end

                        -- Ensure group type isn't set for households and is set for custom groups.

                        -- CK_GROUPDATA_GROUPTYPEIDREQUIREDFORCUSTOMGROUPTYPE is being raised since 

                        -- this is the same constraint name from the GROUPDATA table and this if-statement

                        -- is the equivalent to the constraint in that table.

                        if (@CONSTITUENTTYPECODE = 2 and @GROUPTYPEID is not null) or (@CONSTITUENTTYPECODE = 3 and @GROUPTYPEID is null)
                        begin
                            raiserror('BBERR_ORIGINAL_ERROR:547',1,11);
                            raiserror('CK_GROUPDATA_GROUPTYPEIDREQUIREDFORCUSTOMGROUPTYPE', 13, 1);
                        end

                        if @SPOUSE_ID is not null or len(coalesce(@SPOUSE_LASTNAME, '')) > 0
                        begin
                            if exists (select 1 from dbo.CONSTITUENT where LOOKUPID = @SPOUSE_LOOKUPID and (@SPOUSE_ID is null or ID <> @SPOUSE_ID))
                            begin
                                raiserror('BBERR_ORIGINAL_ERROR:50002',1,11);
                                raiserror('UC_CONSTITUENT_LOOKUPID', 13, 1);
                            end
                        end

                        if @CURRENTSPOUSE is not null and (@CURRENTSPOUSE <> @SPOUSE_ID or (@SPOUSE_LASTNAME <> '' and @SPOUSE_ID is null)) begin
                            raiserror('Constituent entered has an existing spouse that is different than the spouse entered in the row.',13,1);
                        end

                        if @SPOUSE_ID is not null and (@CURRENTSPOUSE is null or @CURRENTSPOUSE <> @SPOUSE_ID)
                        begin
                            if @CONSTITUENTTYPECODE <> 0
                            begin
                                raiserror('BBERR_ORIGINAL_ERROR:547',1,11);
                                raiserror('CK_RELATIONSHIP_OWNER_VALIDSPOUSE', 13, 1);
                            end

                            if dbo.UFN_RELATIONSHIP_VALIDSPOUSE(1, @SPOUSE_ID) = 0
                            begin
                                raiserror('BBERR_ORIGINAL_ERROR:547',1,11);
                                raiserror('CK_RELATIONSHIP_VALIDSPOUSE', 13, 1);
                            end

                            -- Check for existing spouse relationships and existing household memberships

                            if exists(
                                select
                                    ID
                                from
                                    dbo.RELATIONSHIP
                                where    
                                    ISSPOUSE = 1 and
                                    RELATIONSHIPCONSTITUENTID = @SPOUSE_ID and
                                    RECIPROCALCONSTITUENTID <> @ID) begin
                                raiserror('Spouse entered has an existing spouse that is different than the constituent listed in the row.',13,1);
                            end

                            if @CURRENTHOUSEHOLD is not null and not exists(
                                select
                                    GM.ID
                                from
                                    dbo.GROUPMEMBER GM
                                where
                                    GM.GROUPID = @CURRENTHOUSEHOLD and
                                    GM.MEMBERID = @SPOUSE_ID) begin
                                raiserror('Constituent entered is part of an existing household that does not include the listed spouse.',13,1);                
                            end

                            if exists(
                                select
                                    GD.ID
                                from
                                    dbo.GROUPMEMBER GM
                                inner join
                                    dbo.GROUPDATA GD on GD.ID = GM.GROUPID and GD.GROUPTYPECODE = 0
                                where
                                    GM.MEMBERID = @SPOUSE_ID and
                                    dbo.UFN_GROUPMEMBER_ISCURRENTMEMBER(GM.ID) = 1 and
                                    not exists(
                                        select
                                            ID
                                        from
                                            dbo.GROUPMEMBER
                                        where
                                            GROUPID = GD.ID and
                                            MEMBERID = @ID)) begin
                                raiserror('Spouse entered is part of an existing household that does not include the listed constituent.',13,1);                
                            end
                        end

                        if @BUSINESS_ID is not null or @BUSINESS_NAME <> ''
                        begin
                            if @BUSINESS_NUMEMPLOYEES < 0
                            begin
                                raiserror('BBERR_ORIGINAL_ERROR:547',1,11);
                                raiserror('CK_ORGANIZATIONDATA_NUMEMPLOYEES', 13, 1);
                            end

                            if @BUSINESS_NUMSUBSIDIARIES < 0
                            begin
                                raiserror('BBERR_ORIGINAL_ERROR:547',1,11);
                                raiserror('CK_ORGANIZATIONDATA_NUMSUBSIDIARIES', 13, 1);
                            end

                            if exists (select 1 from dbo.CONSTITUENT where LOOKUPID = @BUSINESS_LOOKUPID and (@BUSINESS_ID is null or ID <> @BUSINESS_ID))
                            begin
                                raiserror('BBERR_ORIGINAL_ERROR:50003',1,11);
                                raiserror('UC_CONSTITUENT_LOOKUPID', 13, 1);
                            end
                        end

                                                declare @MAIDENNAMECHANGED bit = 0;
                                                select @MAIDENNAMECHANGED = case when @MAIDENNAME = CONSTITUENT.MAIDENNAME then 0 else 1 end
                                                from dbo.CONSTITUENT
                                                where CONSTITUENT.ID = @ID;

                                                declare @SPOUSE_MAIDENNAMECHANGED bit = 0;
                                                select @SPOUSE_MAIDENNAMECHANGED = case when @SPOUSE_MAIDENNAME = CONSTITUENT.MAIDENNAME then 0 else 1 end
                                                from dbo.CONSTITUENT
                                                where CONSTITUENT.ID = @SPOUSE_ID;

                        --WI 196521/204149 If either the Addresses, Phones or Email addresses fields aren't available in this batch, do not 

                        --try to update non existent update fields.

                        declare @ISADDRESSES bit = 1
                        declare @ISPHONES bit = 1
                        declare @ISEMAILADDRESSES bit = 1
                        declare @ISSOCIALMEDIAACCOUNTS bit = 1
                        declare @ISRELATIONSHIPS bit = 0;
                        declare @FORMDEFINITION XML
                                            declare @BATCHTYPEID uniqueidentifier

                        --Interrogate batch form definition to see if the fields are in batch.

                        select    @FORMDEFINITION = BATCH.FORMDEFINITIONXML,
                                @BATCHTYPEID = BATCHTEMPLATE.BATCHTYPECATALOGID
                        from dbo.BATCHCONSTITUENTUPDATE
                        inner join dbo.BATCH on BATCH.ID = BATCHCONSTITUENTUPDATE.BATCHID
                        inner join dbo.BATCHTEMPLATE on BATCHTEMPLATE.ID = BATCH.BATCHTEMPLATEID
                        where BATCHCONSTITUENTUPDATE.ID = @BATCHROWID;

                        -- PBI 237406:  ERB now saves edits of existing constituents to CUB and calls this procedure to commit them.

                        -- These CUB rows are associated with an ERB template, not a CUB template, and thus won't have these fields.

                        -- Unless we're calling from a CUB batch and these checks are valid, go ahead and process the collections.

                        if @BATCHTYPEID = '877DBC83-98F9-4008-98A0-902FDB35E819' -- Constituent Update Batch

                        begin
                            SELECT  @ISADDRESSES = @FORMDEFINITION.exist('declare namespace pz="bb_appfx_commontypes";
                            /pz:FormMetaData/pz:FormFields/pz:FormField[@FieldID="ADDRESSES"]');

                            SELECT  @ISPHONES = @FORMDEFINITION.exist('declare namespace pz="bb_appfx_commontypes";
                            /pz:FormMetaData/pz:FormFields/pz:FormField[@FieldID="PHONES"]');

                            SELECT  @ISEMAILADDRESSES = @FORMDEFINITION.exist('declare namespace pz="bb_appfx_commontypes";
                            /pz:FormMetaData/pz:FormFields/pz:FormField[@FieldID="EMAILADDRESSES"]');                        

                        select @ISSOCIALMEDIAACCOUNTS = @FORMDEFINITION.exist('declare namespace pz="bb_appfx_commontypes";
                        /pz:FormMetaData/pz:FormFields/pz:FormField[@FieldID="SOCIALMEDIAACCOUNTS"]');                        

                        select @ISRELATIONSHIPS = @FORMDEFINITION.exist('declare namespace pz="bb_appfx_commontypes";
                        /pz:FormMetaData/pz:FormFields/pz:FormField[@FieldID="RELATIONSHIPS"]');            

                        end
                        --Fill a table with all of the constituent's addresses

                        if @ISADDRESSES = 1    
                        begin

                            declare @ADDRESSTABLE table
                            (
                                ADDRESSID uniqueidentifier,
                                ADDRESSBLOCK nvarchar(150),
                                ENDDATE dbo.UDT_MONTHDAY,
                                STARTDATE dbo.UDT_MONTHDAY, 
                                HISTORICALSTARTDATE datetime,
                                HISTORICALENDDATE datetime,
                                ADDRESSTYPECODEID uniqueidentifier,
                                CART nvarchar(10),
                                CERTIFICATIONDATA int,
                                CITY nvarchar(50),
                                CONGRESSIONALDISTRICTCODEID uniqueidentifier,
                                COUNTRYID uniqueidentifier, 
                                COUNTYCODEID uniqueidentifier,
                                DONOTMAIL bit,
                                DONOTMAILREASONCODEID uniqueidentifier,
                                DPC nvarchar(8),
                                INFOSOURCECODEID uniqueidentifier,
                                ISPRIMARY bit,
                                LASTVALIDATIONATTEMPTDATE date,
                                LOCALPRECINCTCODEID uniqueidentifier,
                                LOT nvarchar(5),
                                OMITFROMVALIDATION bit,
                                REGIONCODEID uniqueidentifier,
                                STATEID uniqueidentifier,
                                STATEHOUSEDISTRICTCODEID uniqueidentifier,
                                STATESENATEDISTRICTCODEID uniqueidentifier,
                                VALIDATIONMESSAGE nvarchar(200),
                                POSTCODE nvarchar(12),
                                SEQUENCE int,
                                UPDATEHOUSEHOLD bit,
                                ROWNUMBER smallint,
                                INFOSOURCECOMMENTS nvarchar(256),ID uniqueidentifier
                            );
                            with ADDS as (
                                select *
                                from dbo.UFN_BATCHCONSTITUENTUPDATE_GETADDRESSES_WITHDATES_FROMITEMLISTXML(@ADDRESSES)
                            )
                            insert into @ADDRESSTABLE
                            (
                                ADDRESSID,
                                ADDRESSBLOCK,
                                ENDDATE,
                                STARTDATE,
                                HISTORICALSTARTDATE,
                                HISTORICALENDDATE,
                                ADDRESSTYPECODEID,
                                CART,
                                CERTIFICATIONDATA,
                                CITY,
                                CONGRESSIONALDISTRICTCODEID,
                                COUNTRYID,
                                COUNTYCODEID,
                                DONOTMAIL,
                                DONOTMAILREASONCODEID,
                                DPC,
                                INFOSOURCECODEID,
                                ISPRIMARY,
                                LASTVALIDATIONATTEMPTDATE,
                                LOCALPRECINCTCODEID,
                                LOT,
                                OMITFROMVALIDATION,
                                REGIONCODEID,
                                STATEID,
                                STATEHOUSEDISTRICTCODEID,
                                STATESENATEDISTRICTCODEID,
                                VALIDATIONMESSAGE,
                                POSTCODE,
                                SEQUENCE,
                                UPDATEHOUSEHOLD,
                                ROWNUMBER,
                                INFOSOURCECOMMENTS,ID
                            )
                        select
                            case
                                when adds.ADDRESSID is not null then adds.ADDRESSID
                                else (    select top 1 ID
                                        from dbo.ADDRESS a
                                        where a.CONSTITUENTID = @ID
                                        and not exists(select 'x' from ADDS where ADDRESSID = a.ID)
                                        and coalesce(A.ADDRESSBLOCK, '') = coalesce(ADDS.ADDRESSBLOCK, '') and
                                        coalesce(A.ADDRESSTYPECODEID, @NULLVALUE) = coalesce(ADDS.ADDRESSTYPECODEID, @NULLVALUE) and
                                        coalesce(A.CITY, '') = coalesce(ADDS.CITY, '') and
                                        coalesce(A.COUNTRYID, @NULLVALUE) = coalesce(ADDS.COUNTRYID,@NULLVALUE) and
                                        coalesce(A.STATEID, @NULLVALUE) = coalesce(ADDS.STATEID, @NULLVALUE) and
                                        coalesce(A.POSTCODE, '') = coalesce(ADDS.POSTCODE, '')) end,
                            ADDS.ADDRESSBLOCK,
                            ADDS.ENDDATE,
                            ADDS.STARTDATE,
                            dbo.UFN_DATE_GETEARLIESTTIME(ADDS.HISTORICALSTARTDATE),
                            dbo.UFN_DATE_GETEARLIESTTIME(ADDS.HISTORICALENDDATE),
                            ADDS.ADDRESSTYPECODEID,
                            ADDS.CART,
                            ADDS.CERTIFICATIONDATA,
                            ADDS.CITY,
                            ADDS.CONGRESSIONALDISTRICTCODEID,
                            ADDS.COUNTRYID,
                            ADDS.COUNTYCODEID,
                            case
                                when ADDS.HISTORICALENDDATE is not null then
                                    1
                                else
                                    ADDS.DONOTMAIL
                            end as DONOTMAIL,
                            case
                                when ADDS.DONOTMAIL = 1 or ADDS.HISTORICALENDDATE is not null then
                                    ADDS.DONOTMAILREASONCODEID
                                else
                                    null
                            end as DONOTMAILREASONCODEID,
                            ADDS.DPC, ADDS.INFOSOURCECODEID,
                            ADDS.ISPRIMARY,
                            ADDS.LASTVALIDATIONATTEMPTDATE,
                            ADDS.LOCALPRECINCTCODEID,
                            ADDS.LOT,
                            ADDS.OMITFROMVALIDATION,
                            ADDS.REGIONCODEID,
                            ADDS.STATEID,
                            ADDS.STATEHOUSEDISTRICTCODEID,
                            ADDS.STATESENATEDISTRICTCODEID,
                            ADDS.VALIDATIONMESSAGE,
                            ADDS.POSTCODE,
                            ADDS.SEQUENCE,
                            ADDS.UPDATEHOUSEHOLD,
                            ROW_NUMBER() over(order by ADDS.ISPRIMARY desc),
                            ADDS.INFOSOURCECOMMENTS,
                            ADDS.ID
                        from
                            ADDS;

                        if exists(select top 1 * from @ADDRESSTABLE)
                        begin

                            -- #253763 Check to see if there are duplicate addresses.  

                            declare @DUPESTABLE table(
                            ADDRESSBLOCK nvarchar(150),
                            ADDRESSTYPECODEID uniqueidentifier,
                            CITY nvarchar(50),
                            COUNTRYID uniqueidentifier,
                            STATEID uniqueidentifier,
                            POSTCODE nvarchar(12),
                            RECORDLOCATION tinyint

                            )

                            insert into @DUPESTABLE
                            select ADDRESSBLOCK, ADDRESSTYPECODEID, CITY, COUNTRYID, STATEID, POSTCODE, min(RECORDLOCATION) as MINRECORDLOCATION
                            from(
                                    -- RobertDi 2/27/2014 - Split this into two non-overlapping statements to avoid performance problems

                                    -- caused by an "or" in the where clause.  See Bug 356074.

                                    select
                                        NEW.ADDRESSBLOCK,
                                        NEW.ADDRESSTYPECODEID,
                                        NEW.CITY,
                                        NEW.COUNTRYID,
                                        NEW.STATEID,
                                        NEW.POSTCODE,
                                        -- 1=New record in batch, 2=Existing record not in batch, 3=Existing record in batch 

                                        1 + (case when OLD.ID is not null then 2 else 0 end) as RECORDLOCATION
                                    from (select * from @ADDRESSTABLE where HISTORICALENDDATE is null) as NEW
                                    full outer join (
                                        select ID
                                        from dbo.ADDRESS
                                        where HISTORICALENDDATE is null
                                    ) as OLD
                                        on OLD.ID = NEW.ADDRESSID
                                    where NEW.ID is not null

                                    union all

                                    select
                                        OLD.ADDRESSBLOCK,
                                        OLD.ADDRESSTYPECODEID,
                                        OLD.CITY,
                                        OLD.COUNTRYID,
                                        OLD.STATEID,
                                        OLD.POSTCODE,
                                        -- 1=New record in batch, 2=Existing record not in batch, 3=Existing record in batch 

                                        (case when OLD.ID is not null then 2 else 0 end) as RECORDLOCATION
                                    from (select * from @ADDRESSTABLE where HISTORICALENDDATE is null) as NEW
                                    full outer join (
                                        select ID, ADDRESSBLOCK, ADDRESSTYPECODEID, CITY, COUNTRYID, STATEID, POSTCODE, CONSTITUENTID
                                        from dbo.ADDRESS
                                        where HISTORICALENDDATE is null
                                    ) as OLD
                                        on OLD.ID = NEW.ADDRESSID 
                                    where OLD.CONSTITUENTID = @ID and NEW.ID is null 

                                ) adr
                            group by adr.ADDRESSBLOCK, adr.ADDRESSTYPECODEID, adr.CITY, adr.COUNTRYID, adr.STATEID, adr.POSTCODE 
                            having COUNT(*) > 1 and
                            (min(RECORDLOCATION)<>2 or max(RECORDLOCATION)<>2) -- at least one of the records must be in the batch


                            if exists(select 'x' from @DUPESTABLE where RECORDLOCATION = 1)
                                raiserror('BBERR_ADDRESS_DUPLICATENOTALLOWED', 13, 1)
                            else if exists (select 'x'
                                from @DUPESTABLE d
                                inner join @ADDRESSTABLE at on 
                                    coalesce(at.ADDRESSBLOCK,'') = coalesce(d.ADDRESSBLOCK,'') and 
                                    coalesce(at.ADDRESSTYPECODEID,@NULLVALUE) = coalesce(d.ADDRESSTYPECODEID,@NULLVALUE) and
                                    coalesce(at.CITY,'') = coalesce(d.CITY,'') and 
                                    coalesce(at.COUNTRYID,@NULLVALUE) = coalesce(d.COUNTRYID,@NULLVALUE) and 
                                    coalesce(at.STATEID,@NULLVALUE) = coalesce(d.STATEID,@NULLVALUE) and
                                    coalesce(at.POSTCODE,'') = coalesce(d.POSTCODE,'')
                                inner join dbo.ADDRESS a on a.ID = at.ADDRESSID
                                where (        coalesce(at.ADDRESSBLOCK,'') <> coalesce(a.ADDRESSBLOCK,''
                                            or coalesce(at.ADDRESSTYPECODEID,@NULLVALUE) <> coalesce(a.ADDRESSTYPECODEID,@NULLVALUE)
                                            or coalesce(at.CITY,'') <> coalesce(a.CITY,'')
                                            or coalesce(at.COUNTRYID,@NULLVALUE) <> coalesce(a.COUNTRYID,@NULLVALUE)
                                            or coalesce(at.STATEID,@NULLVALUE) <> coalesce(a.STATEID,@NULLVALUE)
                                            or coalesce(at.POSTCODE,'') <> coalesce(a.POSTCODE,'')
                                            or coalesce(at.HISTORICALENDDATE,@NULLDATE) <> coalesce(a.HISTORICALENDDATE,@NULLDATE)))
                                    raiserror('BBERR_ADDRESS_DUPLICATENOTALLOWED', 13, 1)                                

                            -- Check to see if one of the addresses getting saved or one of the

                            -- existing addresses is primary. If not, throw an error.

                            declare @PRIMARYADDRESSEXISTS bit = 0;

                                select 
                                     @PRIMARYADDRESSEXISTS = 1
                                from
                                    @ADDRESSTABLE TEMP
                                where
                                    TEMP.ISPRIMARY = 1

                                if @PRIMARYADDRESSEXISTS = 0
                                    select 
                                         @PRIMARYADDRESSEXISTS = 1
                                    from
                                        dbo.ADDRESS A
                                    where
                                        A.CONSTITUENTID = @ID
                                        and A.ISPRIMARY = 1
                                        and not exists 
                                        (
                                            select 1 
                                            from @ADDRESSTABLE TEMP 
                                            where 
                                                A.ID = TEMP.ADDRESSID
                                        )

                            if @PRIMARYADDRESSEXISTS = 0
                                raiserror('BBERR_ADDRESS_PRIMARYADDRESSREQUIRED', 13, 1);

                            -- Ensure the state is valid for the country

                            if exists (select 1 from @ADDRESSTABLE where dbo.UFN_STATE_GETCOUNTRY(STATEID, COUNTRYID) <> COUNTRYID)
                            begin
                                raiserror('BBERR_ORIGINAL_ERROR:547',1,11);
                                raiserror('CK_ADDRESS_VALIDSTATEFORCOUNTRY', 13, 1);
                            end

                            -- Verify that if a start or end date is set, the corresponding date is set as well

                            if exists (select 1 from @ADDRESSTABLE where STARTDATE <> '0000' and ENDDATE = '0000')
                            begin
                                raiserror('BBERR_ORIGINAL_ERROR:547',1,11);
                                raiserror('CK_ADDRESS_VALIDENDDATEIFSTARTDATE', 13, 1);
                            end

                            if exists (select 1 from @ADDRESSTABLE where STARTDATE = '0000' and ENDDATE <> '0000')
                            begin
                                raiserror('BBERR_ORIGINAL_ERROR:547',1,11);
                                raiserror('CK_ADDRESS_VALIDSTARTDATEIFENDDATE', 13, 1);
                            end
                                                        --Apply End date rules to @ADDRESSES


                                                     if @NEWADDRESSENDDATECODE = 0
                                                        begin
                                                                --CTE and update                                

                                                                --For ERB.  Pull in rows that might need end dates.

                                                                --as well as handling addresses that have been added after CUB row was populated.

                                                                with INCOMING as (
                                                                    select t.ADDRESSTYPECODEID
                                                                    from @ADDRESSTABLE t
                                                                    left outer join dbo.ADDRESS a on a.ID = t.ADDRESSID
                                                                    where (t.ADDRESSID is null or
                                                                                 t.ADDRESSTYPECODEID <> isnull(a.ADDRESSTYPECODEID,@NULLVALUE))
                                                                    and t.HISTORICALENDDATE is null
                                                                    and t.DONOTMAIL = 0
                                                                )
                                                                insert into @ADDRESSTABLE (ADDRESSID,
                                ADDRESSBLOCK, ENDDATE, STARTDATE, HISTORICALSTARTDATE, HISTORICALENDDATE,
                                ADDRESSTYPECODEID, CART, CERTIFICATIONDATA,
                                CITY, CONGRESSIONALDISTRICTCODEID, COUNTRYID, 
                                COUNTYCODEID, DONOTMAIL, DONOTMAILREASONCODEID,
                                DPC, INFOSOURCECODEID, ISPRIMARY, 
                                LASTVALIDATIONATTEMPTDATE, LOCALPRECINCTCODEID, LOT, 
                                OMITFROMVALIDATION, REGIONCODEID, STATEID, 
                                STATEHOUSEDISTRICTCODEID, STATESENATEDISTRICTCODEID, VALIDATIONMESSAGE,
                                POSTCODE, SEQUENCE, UPDATEHOUSEHOLD, ROWNUMBER, INFOSOURCECOMMENTS,ID)
                                                                select A.ID,
                                        A.ADDRESSBLOCK, A.ENDDATE, A.STARTDATE, 
                                        dbo.UFN_DATE_GETEARLIESTTIME(A.HISTORICALSTARTDATE), 
                                        dbo.UFN_DATE_GETEARLIESTTIME(A.HISTORICALENDDATE),
                                        A.ADDRESSTYPECODEID, A.CART, AVU.CERTIFICATIONDATA,
                                        A.CITY, AVU.CONGRESSIONALDISTRICTCODEID, A.COUNTRYID, 
                                        AVU.COUNTYCODEID, A.DONOTMAIL, A.DONOTMAILREASONCODEID,
                                        A.DPC, AVU.INFOSOURCECODEID, 0
                                        AVU.LASTVALIDATIONATTEMPTDATE,AVU.LOCALPRECINCTCODEID, A.LOT, 
                                        coalesce(AVU.OMITFROMVALIDATION,0),AVU.REGIONCODEID, A.STATEID, 
                                        AVU.STATEHOUSEDISTRICTCODEID, AVU.STATESENATEDISTRICTCODEID, coalesce(AVU.VALIDATIONMESSAGE, ''),
                                        A.POSTCODE, A.SEQUENCE, NULL, ROW_NUMBER() over(order by A.ISPRIMARY desc),
                                        AVU.INFOSOURCECOMMENTS,NEWID()
                                                                from dbo.ADDRESS a
                                                                inner join INCOMING i on i.ADDRESSTYPECODEID = a.ADDRESSTYPECODEID
                                                                left outer join dbo.ADDRESSVALIDATIONUPDATE AVU on AVU.ID = A.ID                                
                                                                where A.CONSTITUENTID = @ID
                                                                and (a.HISTORICALENDDATE is null or a.DONOTMAIL=0)
                                                                and NOT exists (select 1 from @ADDRESSTABLE AD where AD.ADDRESSID = A.ID)
                                                                and (a.ISPRIMARY = 0 or exists(select 1 from @ADDRESSTABLE where ISPRIMARY = 1));

                                                                 -- addresses that may need end dates applied

                                                                with EXISTING as (
                                                                    select t.ID, t.ADDRESSTYPECODEID
                                                                    from @ADDRESSTABLE t
                                                                    inner join dbo.ADDRESS a on a.ID = t.ADDRESSID
                                                                    where t.ADDRESSTYPECODEID = a.ADDRESSTYPECODEID and (t.HISTORICALENDDATE is null or t.DONOTMAIL=0)
                                                                    and t.ISPRIMARY = 0
                                                                ),
                                                                -- addresses that may cause end dates to be put on EXISTING addresses

                                                                 INCOMING as (
                                                                    select t.ADDRESSTYPECODEID
                                                                    from @ADDRESSTABLE t
                                                                    left outer join dbo.ADDRESS a on a.ID = t.ADDRESSID
                                                                    where (t.ADDRESSID is null or
                                                                                 t.ADDRESSTYPECODEID <> isnull(a.ADDRESSTYPECODEID,@NULLVALUE))
                                                                    and t.HISTORICALENDDATE is null
                                                                    and t.DONOTMAIL = 0
                                                                )
                                                                update
                                                                set HISTORICALENDDATE = isnull(HISTORICALENDDATE,@CURRENTDATE),
                                                                DONOTMAIL = 1
                                                                from @ADDRESSTABLE t
                                                                inner join EXISTING e on e.ID = t.ID
                                                                inner join INCOMING i on i.ADDRESSTYPECODEID = e.ADDRESSTYPECODEID                                                                                
                                                     end        

                            -- Start date must be before end date

                            if exists (select 1 from @ADDRESSTABLE where HISTORICALSTARTDATE > HISTORICALENDDATE)
                                raiserror('BBERR_ADDRESS_VALIDHISTORICALDATERANGE', 13, 1);

                            -- Primary addresses cannot have an end date

                            if exists (select 1 from @ADDRESSTABLE where ISPRIMARY = 1 and HISTORICALENDDATE is not null)
                                raiserror('BBERR_ADDRESS_FORMERADDRESSCANNOTBEPRIMARY', 13, 1);

                            end
                        end --@ISADDRESSES


                        --Fill a table with all of the constituent's email addresses

                        if @ISEMAILADDRESSES = 1
                        begin
                            declare @EMAILADDRESSTABLE table
                            (    
                                ROW int identity(1,1),
                                EMAILADDRESSTYPECODEID uniqueidentifier, 
                                EMAILADDRESS dbo.UDT_EMAILADDRESS, 
                                ISPRIMARY bit
                                DONOTEMAIL bit
                                SEQUENCE int
                                UPDATEHOUSEHOLD bit
                                STARTDATE datetime
                                ENDDATE datetime
                                INFOSOURCECODEID uniqueidentifier, 
                                EMAILADDRESSID uniqueidentifier, 
                                ID uniqueidentifier,
                                OLDEMAILADDRESS dbo.UDT_EMAILADDRESS null
                                OLDEMAILADDRESSTYPECODEID uniqueidentifier null,
                                UPDATEDBYRULES bit default 0,
                                DONOTEMAILREASONCODEID uniqueidentifier,
                                INFOSOURCECOMMENTS nvarchar(256)
                            );
                            with EAB as (
                                select
                                    EMAILADDRESSTYPECODEID,
                                    EMAILADDRESS,
                                    ISPRIMARY,
                                    DONOTEMAIL,
                                    SEQUENCE,
                                    UPDATEHOUSEHOLD,
                                    dbo.UFN_DATE_GETEARLIESTTIME(STARTDATE) STARTDATE,
                                    dbo.UFN_DATE_GETEARLIESTTIME(ENDDATE) ENDDATE,
                                    INFOSOURCECODEID,
                                    EMAILADDRESSID,
                                    ID,
                                    DONOTEMAILREASONCODEID,
                                    INFOSOURCECOMMENTS
                                from 
                                    dbo.UFN_BATCHCONSTITUENTUPDATE_GETEMAILADDRESSES_WITHDATES_2_FROMITEMLISTXML(@EMAILADDRESSES
                            )
                            insert into @EMAILADDRESSTABLE
                            (
                                EMAILADDRESSTYPECODEID,
                                EMAILADDRESS,
                                ISPRIMARY,
                                DONOTEMAIL,
                                SEQUENCE,
                                UPDATEHOUSEHOLD,
                                STARTDATE,
                                ENDDATE,
                                INFOSOURCECODEID,
                                EMAILADDRESSID,
                                ID,
                                OLDEMAILADDRESS,
                                OLDEMAILADDRESSTYPECODEID,
                                DONOTEMAILREASONCODEID,
                                INFOSOURCECOMMENTS
                            )
                            select
                                EAB.EMAILADDRESSTYPECODEID,
                                EAB.EMAILADDRESS,
                                EAB.ISPRIMARY,
                                case
                                    when EAB.ENDDATE is not null then
                                        1
                                    else
                                        EAB.DONOTEMAIL
                                end as DONOTEMAIL,
                                EAB.SEQUENCE,
                                EAB.UPDATEHOUSEHOLD,
                                dbo.UFN_DATE_GETEARLIESTTIME(EAB.STARTDATE),
                                dbo.UFN_DATE_GETEARLIESTTIME(EAB.ENDDATE),
                                EAB.INFOSOURCECODEID,
                                case
                                    when EAB.EMAILADDRESSID is not null then
                                        EAB.EMAILADDRESSID
                                    else
                                        (    select top 1 ID from dbo.EMAILADDRESS EA
                                        where EA.CONSTITUENTID = @ID
                                        and not exists(select 'x' from EAB where EMAILADDRESSID = EA.ID) and
                                        coalesce(EA.EMAILADDRESS, '') = coalesce(EAB.EMAILADDRESS, '') and
                                        coalesce(EA.EMAILADDRESSTYPECODEID, @NULLVALUE) = coalesce(EAB.EMAILADDRESSTYPECODEID, @NULLVALUE)
                                        )
                                end EMAILADDRESSID,
                                EAB.ID,
                                EMAILADDRESS.EMAILADDRESS,
                                EMAILADDRESS.EMAILADDRESSTYPECODEID,
                                EAB.DONOTEMAILREASONCODEID,
                                ISNULL(EAB.INFOSOURCECOMMENTS,'')
                            from 
                                EAB
                                left join dbo.EMAILADDRESS on EAB.EMAILADDRESSID = EMAILADDRESS.ID

                        if exists(select top 1 * from @EMAILADDRESSTABLE)
                        begin

                                -- #253763 Check to see if there are duplicate email addresses.

                                declare @EMAIL_DUPESTABLE table(
                                EMAILADDRESS dbo.UDT_EMAILADDRESS,
                                EMAILADDRESSTYPECODEID uniqueidentifier,
                                RECORDLOCATION tinyint
                                )
                                insert into @EMAIL_DUPESTABLE
                                select EMAILADDRESS, EMAILADDRESSTYPECODEID, min(RECORDLOCATION) as MINRECORDLOCATION
                                from(
                                        -- RobertDi 2/27/2014 - Split this into two non-overlapping statements to avoid performance problems

                                        -- caused by an "or" in the where clause.  See Bug 356074.

                                        select
                                            NEW.EMAILADDRESS,
                                            NEW.EMAILADDRESSTYPECODEID,
                                            -- 1=New record in batch, 2=Existing record not in batch, 3=Existing record in batch 

                                            1 + (case when OLD.ID IS NOT null then 2 else 0 end) as RECORDLOCATION
                                        from (select * from @EMAILADDRESSTABLE where ENDDATE is null) as NEW
                                        full outer join (
                                            select ID
                                            from dbo.EMAILADDRESS
                                            where ENDDATE is null
                                        ) as OLD
                                            on OLD.ID = NEW.EMAILADDRESSID 
                                        where NEW.ID is not null

                                        union all

                                        select
                                            OLD.EMAILADDRESS,
                                            OLD.EMAILADDRESSTYPECODEID,
                                            -- 1=New record in batch, 2=Existing record not in batch, 3=Existing record in batch 

                                            (case when OLD.ID is not null then 2 else 0 end) as RECORDLOCATION
                                        from (select * from @EMAILADDRESSTABLE where ENDDATE is null) as NEW
                                        full outer join (
                                            select ID, EMAILADDRESS, EMAILADDRESSTYPECODEID, CONSTITUENTID
                                            from dbo.EMAILADDRESS
                                            where ENDDATE is null
                                        ) as OLD
                                            on OLD.ID = NEW.EMAILADDRESSID 
                                        where OLD.CONSTITUENTID = @ID and NEW.ID is null

                                    ) adr
                                group by adr.EMAILADDRESS, adr.EMAILADDRESSTYPECODEID
                                having COUNT(*) > 1 and
                                (min(RECORDLOCATION)<>2 or max(RECORDLOCATION)<>2) -- at least one of the records must be in the batch


                                if exists(select 'x' from @EMAIL_DUPESTABLE where RECORDLOCATION = 1)
                                    raiserror('BBERR_EMAILADDRESS_DUPLICATENOTALLOWED', 13, 1)
                                else if exists (select 'x'
                                                from @EMAIL_DUPESTABLE d
                                                inner join @EMAILADDRESSTABLE et on 
                                                coalesce(et.EMAILADDRESS,'') = coalesce(d.EMAILADDRESS,'') and 
                                                coalesce(et.EMAILADDRESSTYPECODEID,@NULLVALUE) = coalesce(d.EMAILADDRESSTYPECODEID,@NULLVALUE)
                                                inner join dbo.EMAILADDRESS e on e.ID = et.EMAILADDRESSID
                                                where (        coalesce(et.EMAILADDRESS,'') <> coalesce(e.EMAILADDRESS,'')
                                                        or    coalesce(et.EMAILADDRESSTYPECODEID,@NULLVALUE) <> coalesce(e.EMAILADDRESSTYPECODEID,@NULLVALUE)
                                                        or    coalesce(et.ENDDATE,@NULLDATE) <> coalesce(e.ENDDATE,@NULLDATE))
                                                )
                                                    raiserror('BBERR_EMAILADDRESS_DUPLICATENOTALLOWED', 13, 1)


                            declare @PRIMARYEMAILADDRESSEXISTS bit
                            set @PRIMARYEMAILADDRESSEXISTS = 0

                            select
                                @PRIMARYEMAILADDRESSEXISTS = 1
                            from
                                @EMAILADDRESSTABLE TEMP
                            where
                                TEMP.ISPRIMARY = 1

                            if @PRIMARYEMAILADDRESSEXISTS = 0
                            begin
                                select
                                    @PRIMARYEMAILADDRESSEXISTS = 1
                                from
                                    dbo.EMAILADDRESS
                                where
                                    EMAILADDRESS.CONSTITUENTID = @ID
                                    and EMAILADDRESS.ISPRIMARY = 1
                                    and not exists
                                    (
                                        select
                                            1
                                        from
                                            @EMAILADDRESSTABLE TEMP
                                        where
                                            EMAILADDRESS.ID = TEMP.EMAILADDRESSID
                                    )
                            end

                            if @PRIMARYEMAILADDRESSEXISTS = 0 begin
                                raiserror('Constituent must have a primary email address.', 13, 1);
                                return 1;
                            end    

                            --Apply End date rules to @EMAILADDRESSTABLE


                            if @NEWEMAILENDDATECODE = 0
                            begin
                                    --CTE and update

                                    --For ERB.  Pull in rows that might need end dates.

                                    --as well as handling emails that have been added after CUB row was populated.

                                    with INCOMING as (
                                        select t.EMAILADDRESSTYPECODEID
                                        from @EMAILADDRESSTABLE t
                                        left outer join dbo.EMAILADDRESS a on a.ID = t.EMAILADDRESSID
                                        where (t.EMAILADDRESSID is null or
                                                        t.EMAILADDRESSTYPECODEID <> isnull(a.EMAILADDRESSTYPECODEID,@NULLVALUE))
                                        and t.ENDDATE is null
                                        and t.DONOTEMAIL = 0
                                    )
                                    insert into @EMAILADDRESSTABLE (EMAILADDRESSTYPECODEID, EMAILADDRESS, ISPRIMARY, DONOTEMAIL, 
                                                                SEQUENCE, UPDATEHOUSEHOLD, STARTDATE, ENDDATE, INFOSOURCECODEID, EMAILADDRESSID, ID,
                                                                DONOTEMAILREASONCODEID,INFOSOURCECOMMENTS)
                                    select E.EMAILADDRESSTYPECODEID, E.EMAILADDRESS, 0, E.DONOTEMAIL, E.SEQUENCE, null
                                                    dbo.UFN_DATE_GETEARLIESTTIME(E.STARTDATE), dbo.UFN_DATE_GETEARLIESTTIME(E.ENDDATE), E.INFOSOURCECODEID, E.ID, NEWID(),
                                                    E.DONOTEMAILREASONCODEID, ISNULL(E.INFOSOURCECOMMENTS, '')
                                    from dbo.EMAILADDRESS E
                                    inner join INCOMING I on I.EMAILADDRESSTYPECODEID = E.EMAILADDRESSTYPECODEID                                                           
                                        where E.CONSTITUENTID = @ID
                                        and (E.ENDDATE is null or E.DONOTEMAIL = 0)
                                        and NOT exists (select 1 from @EMAILADDRESSTABLE ET where ET.EMAILADDRESSID = E.ID)
                                        and (E.ISPRIMARY = 0 or exists(select 1 from @EMAILADDRESSTABLE where ISPRIMARY = 1));

                                        -- emails that may need end dates applied

                                    with EXISTING as (
                                        select t.ID, t.EMAILADDRESSTYPECODEID
                                        from @EMAILADDRESSTABLE t
                                        inner join dbo.EMAILADDRESS e on e.ID = t.EMAILADDRESSID
                                        where t.EMAILADDRESSTYPECODEID = e.EMAILADDRESSTYPECODEID and (t.ENDDATE is null or t.DONOTEMAIL=0)
                                        and t.ISPRIMARY = 0
                                    ),
                                    -- emails that may cause end dates to be put on EXISTING emails

                                        INCOMING as (
                                        select t.EMAILADDRESSTYPECODEID
                                        from @EMAILADDRESSTABLE t
                                        left outer join dbo.EMAILADDRESS e on e.ID = t.EMAILADDRESSID
                                        where (t.EMAILADDRESSID is null or
                                                        t.EMAILADDRESSTYPECODEID <> isnull(e.EMAILADDRESSTYPECODEID,@NULLVALUE))
                                        and t.ENDDATE is null
                                        and t.DONOTEMAIL = 0
                                    )
                                    update
                                        set ENDDATE = isnull(ENDDATE,@CURRENTDATE),
                                        DONOTEMAIL = 1,
                    UPDATEDBYRULES = 1
                                    from @EMAILADDRESSTABLE t
                                    inner join EXISTING e on e.ID = t.ID
                                    inner join INCOMING i on i.EMAILADDRESSTYPECODEID = e.EMAILADDRESSTYPECODEID                                                                                
                            end                                        

                            -- Start date must be before end date

                            if exists (select 1 from @EMAILADDRESSTABLE where STARTDATE > ENDDATE)
                                raiserror('BBERR_EMAILADDRESS_VALIDDATERANGE', 13, 1);

                            -- Primary email addresses cannot have an end date

                            if exists (select 1 from @EMAILADDRESSTABLE where ISPRIMARY = 1 and ENDDATE is not null)
                                raiserror('BBERR_EMAILADDRESS_FORMEREMAILADDRESSCANNOTBEPRIMARY', 13, 1);

                            --JamesWill WI144876 2011-03-23 Don't let email addresses have a start date in the future

                            if exists (select 1 from @EMAILADDRESSTABLE where STARTDATE > @CURRENTDATE)
                                raiserror('BBERR_EMAILADDRESS_STARTDATE_FUTURE', 13, 1);

                            --JamesWill WI144876 2011-03-23 Don't let email addresses have an end date in the future

                            if exists (select 1 from @EMAILADDRESSTABLE where ENDDATE > @CURRENTDATE)
                                raiserror('BBERR_EMAILADDRESS_ENDDATE_FUTURE', 13, 1);

                            end
                        end --@ISEMAILADDRESSES


                        --Fill a table with all of the constituent's phone numbers

                        declare @EXISTINGPRIMARYPHONEID uniqueidentifier;
                        declare @EXISTINGPRIMARYPHONEDONOTCALL bit;

                        if @ISPHONES = 1
                        begin
                            declare @PHONENUMBERTABLE table
                            (
                                ROW int identity(1,1),
                                PHONETYPECODEID uniqueidentifier,
                                NUMBER nvarchar(100),
                                ISPRIMARY bit,
                                DONOTCALL bit,
                                SEQUENCE int,
                                UPDATEHOUSEHOLD bit,
                                COUNTRYID uniqueidentifier,
                                SEASONALSTARTDATE dbo.UDT_MONTHDAY,
                                SEASONALENDDATE dbo.UDT_MONTHDAY,
                                STARTTIME dbo.UDT_HOURMINUTE,
                                ENDTIME dbo.UDT_HOURMINUTE,
                                STARTDATE datetime,
                                ENDDATE datetime,
                                INFOSOURCECODEID uniqueidentifier,
                                PHONEID uniqueidentifier,
                                ID uniqueidentifier,
                                OLDNUMBER nvarchar(100),
                                OLDPHONETYPECODEID uniqueidentifier,
                                UPDATEDBYRULES bit default 0,
                                DONOTTEXT bit,
                            INFOSOURCECOMMENTS nvarchar(256)
                            );
                            with PABS as (
                            select
                                PHONETYPECODEID,
                                NUMBER,
                                ISPRIMARY,
                                DONOTCALL,
                                SEQUENCE,
                                UPDATEHOUSEHOLD,
                                COUNTRYID,
                                SEASONALSTARTDATE,
                                SEASONALENDDATE,
                                STARTTIME,
                                ENDTIME,
                                STARTDATE,
                                ENDDATE,
                                INFOSOURCECODEID,
                                PHONEID,
                                ID,
                                DONOTTEXT,
                                INFOSOURCECOMMENTS
                            from
                                dbo.UFN_BATCHCONSTITUENTUPDATE_GETPHONES_WITHDATES_FROMITEMLISTXML(@PHONES
                            )
                            insert into @PHONENUMBERTABLE
                            (
                                PHONETYPECODEID,
                                NUMBER,
                                ISPRIMARY,
                                DONOTCALL,
                                SEQUENCE,
                                UPDATEHOUSEHOLD,
                                COUNTRYID, 
                                SEASONALSTARTDATE,
                                SEASONALENDDATE,
                                STARTTIME,
                                ENDTIME,
                                STARTDATE,
                                ENDDATE,
                                INFOSOURCECODEID,
                                PHONEID,
                                ID,
                                OLDNUMBER,
                                OLDPHONETYPECODEID,
                                DONOTTEXT,
                                INFOSOURCECOMMENTS
                            )
                            select
                                PABS.PHONETYPECODEID,
                                NUMBER = dbo.UFN_PHONE_REMOVECOUNTRYCODE([PABS].[NUMBER], [PABS].[COUNTRYID]),
                                PABS.ISPRIMARY,
                                case
                                    when PABS.ENDDATE is not null then
                                        1
                                    else
                                        PABS.DONOTCALL
                                end as DONOTCALL,
                                PABS.SEQUENCE,
                                PABS.UPDATEHOUSEHOLD,
                                PABS.COUNTRYID,
                                PABS.SEASONALSTARTDATE,
                                PABS.SEASONALENDDATE,
                                PABS.STARTTIME,
                                PABS.ENDTIME,
                                dbo.UFN_DATE_GETEARLIESTTIME(PABS.STARTDATE) STARTDATE,
                                dbo.UFN_DATE_GETEARLIESTTIME(PABS.ENDDATE) ENDDATE,
                                PABS.INFOSOURCECODEID,
                                case
                                    when PABS.PHONEID is not null then
                                        PABS.PHONEID
                                    else
                                        (    select top 1 ID from dbo.PHONE p
                                        where p.CONSTITUENTID = @ID
                                        and not exists(select 'x' from PABS where PHONEID = p.ID)
                                        and    coalesce(p.NUMBERNOFORMAT, '') = coalesce(dbo.UFN_PHONE_REMOVEFORMATTING(PABS.NUMBER), ''
                                        and    coalesce(p.PHONETYPECODEID, @NULLVALUE) = coalesce(PABS.PHONETYPECODEID, @NULLVALUE
                                        and coalesce(p.COUNTRYID,@NULLVALUE) = coalesce(PABS.COUNTRYID,@NULLVALUE)
                                        )
                                end,
                                PABS.ID,
                                PHONE.NUMBER,
                                PHONE.PHONETYPECODEID,
                                ISNULL(PABS.DONOTTEXT, CAST(0 as BIT)),
                                ISNULL(PABS.INFOSOURCECOMMENTS,'')
                            from 
                                    PABS
                                left join dbo.PHONE on PABS.PHONEID = PHONE.ID


                        if exists(select top 1 * from @PHONENUMBERTABLE)
                        begin

                                -- #253763 Check to see if there are duplicate phone numbers.  

                                declare @PHONE_DUPESTABLE table(
                                NUMBER nvarchar(100),
                                PHONETYPECODEID uniqueidentifier,
                                COUNTRYID uniqueidentifier,
                                RECORDLOCATION tinyint
                                )
                                insert into @PHONE_DUPESTABLE
                                select NUMBER, PHONETYPECODEID, COUNTRYID, min(RECORDLOCATION) as MINRECORDLOCATION
                                from(
                                        -- RobertDi 2/27/2014 - Split this into two non-overlapping statements to avoid performance problems

                                        -- caused by an "or" in the where clause.  See Bug 356074.

                                        select
                                            dbo.UFN_PHONE_REMOVEFORMATTING(NEW.NUMBER) as NUMBER,
                                            NEW.PHONETYPECODEID,
                                            NEW.COUNTRYID,
                                            -- 1=New record in batch, 2=Existing record not in batch, 3=Existing record in batch 

                                            1 + (case when OLD.ID is not null then 2 else 0 end) as RECORDLOCATION
                                        from (select * from @PHONENUMBERTABLE where ENDDATE is null) NEW
                                        full outer join (
                                            select ID
                                            from dbo.PHONE
                                            where ENDDATE is null
                                        ) as OLD
                                            on OLD.ID = NEW.PHONEID
                                        where NEW.ID is not null

                                        union all

                                        select
                                            OLD.NUMBERNOFORMAT as NUMBER,
                                            OLD.PHONETYPECODEID,
                                            OLD.COUNTRYID,
                                            -- 1=New record in batch, 2=Existing record not in batch, 3=Existing record in batch 

                                            (case when OLD.ID is not null then 2 else 0 end) as RECORDLOCATION
                                        from (select * from @PHONENUMBERTABLE where ENDDATE is null) NEW
                                        full outer join (
                                            select ID, NUMBERNOFORMAT, PHONETYPECODEID, COUNTRYID, CONSTITUENTID
                                            from dbo.PHONE
                                            where ENDDATE is null
                                        ) as OLD
                                            on OLD.ID = NEW.PHONEID
                                        where OLD.CONSTITUENTID = @ID and NEW.ID is null
                                    ) phn
                                group by phn.NUMBER, phn.PHONETYPECODEID, phn.COUNTRYID
                                having COUNT(*) > 1 and
                                (min(RECORDLOCATION)<>2 or max(RECORDLOCATION)<>2) --at least one of the records must be in the batch


                                if exists(select 'x' from @PHONE_DUPESTABLE where RECORDLOCATION = 1)
                                    raiserror('BBERR_PHONENUMBER_DUPLICATENOTALLOWED', 13, 1)
                                    else if exists (select 'x'
                                                from @PHONE_DUPESTABLE d
                                                inner join @PHONENUMBERTABLE p on 
                                                coalesce(p.PHONETYPECODEID,@NULLVALUE) = coalesce(d.PHONETYPECODEID,@NULLVALUE) and 
                                                coalesce(p.COUNTRYID,@NULLVALUE) = coalesce(d.COUNTRYID,@NULLVALUE) and 
                                                coalesce(dbo.UFN_PHONE_REMOVEFORMATTING(p.NUMBER),'') = coalesce(d.NUMBER,'')
                                                inner join dbo.PHONE ph on ph.ID = p.PHONEID
                                                where (    coalesce(p.PHONETYPECODEID,@NULLVALUE) <> coalesce(ph.PHONETYPECODEID,@NULLVALUE)
                                                        or coalesce(p.COUNTRYID,@NULLVALUE) <> coalesce(ph.COUNTRYID,@NULLVALUE)
                                                        or coalesce(dbo.UFN_PHONE_REMOVEFORMATTING(p.NUMBER),'') <> coalesce(ph.NUMBERNOFORMAT,'')
                                                        or coalesce(p.ENDDATE,@NULLDATE) <> coalesce(ph.ENDDATE,@NULLDATE))
                                                )
                                                    raiserror('BBERR_PHONENUMBER_DUPLICATENOTALLOWED', 13, 1)

                            declare @PRIMARYPHONEEXISTS bit
                            set @PRIMARYPHONEEXISTS = 0

                            --Get the existing primary phone number if it exists.  At the end of the updates and inserts if there is no primary phone number for this constituent, update this record to be primary again.

                            select
                                @PRIMARYPHONEEXISTS = 1
                            from
                                @PHONENUMBERTABLE TEMP
                            where
                                TEMP.ISPRIMARY = 1

                            if @PRIMARYPHONEEXISTS = 0
                            begin
                                select
                                    @PRIMARYPHONEEXISTS = 1
                                from
                                    dbo.PHONE
                                where
                                    PHONE.CONSTITUENTID = @ID
                                    and PHONE.ISPRIMARY = 1
                                    and not exists
                                    (
                                        select
                                            1
                                        from
                                            @PHONENUMBERTABLE TEMP
                                        where
                                            PHONE.ID = TEMP.PHONEID
                                    )
                            end

                            --Make sure there is a primary phone number

                            if @PRIMARYPHONEEXISTS = 0
                            begin
                                raiserror('Constituent must have a primary phone.', 13, 1);
                                return 1;
                            end

                            -- Make sure the number is set

                            if exists (select 1 from @PHONENUMBERTABLE where len(coalesce(NUMBER, '')) = 0)
                            begin
                                raiserror('BBERR_ORIGINAL_ERROR:547',1,11);
                                raiserror('CK_PHONE_NUMBER', 13, 1);
                            end

                            --Apply End date rules to @PHONES


                            if @NEWPHONEENDDATECODE = 0
                            begin
                                    --CTE and update                  

                                    --For ERB.  Pull in rows that might need end dates.

                                    --as well as handling phones that have been added after CUB row was populated.

                                    with INCOMING as (
                                        select t.PHONETYPECODEID
                                        from @PHONENUMBERTABLE t
                                        left outer join dbo.PHONE a on a.ID = t.PHONEID
                                        where (t.PHONEID is null or
                                                        t.PHONETYPECODEID <> isnull(a.PHONETYPECODEID,@NULLVALUE))
                                        and t.ENDDATE is null
                                        and t.DONOTCALL = 0
                                    )
                                    insert into @PHONENUMBERTABLE(PHONETYPECODEID, NUMBER, ISPRIMARY, DONOTCALL, SEQUENCE, UPDATEHOUSEHOLD, COUNTRYID, SEASONALSTARTDATE, 
                                                SEASONALENDDATE, STARTTIME, ENDTIME, STARTDATE, ENDDATE, INFOSOURCECODEID, PHONEID, ID, DONOTTEXT, INFOSOURCECOMMENTS)
                                    select P.PHONETYPECODEID, P.NUMBER, 0, P.DONOTCALL, P.SEQUENCE, null, P.COUNTRYID, p.SEASONALSTARTDATE, P.SEASONALENDDATE, P.STARTTIME, P.ENDTIME,
                                                    dbo.UFN_DATE_GETEARLIESTTIME(P.STARTDATE), dbo.UFN_DATE_GETEARLIESTTIME(P.ENDDATE), P.INFOSOURCECODEID, P.ID, NEWID(), ISNULL(P.DONOTTEXT, CAST(0 as BIT)), ISNULL(P.INFOSOURCECOMMENTS,'')
                                    from dbo.PHONE P
                                    inner join INCOMING I on I.PHONETYPECODEID = P.PHONETYPECODEID                                                           
                                        where P.CONSTITUENTID = @ID
                                        and (P.ENDDATE is null or P.DONOTCALL = 0)
                                        and NOT exists (select 1 from @PHONENUMBERTABLE PT where PT.PHONEID = P.ID)
                                        and (P.ISPRIMARY = 0 or exists(select 1 from @PHONENUMBERTABLE where ISPRIMARY = 1));

                                        -- phones that may need end dates applied

                                    with EXISTING as (
                                        select t.ID, t.PHONETYPECODEID
                                        from @PHONENUMBERTABLE t
                                        inner join dbo.PHONE p on p.ID = t.PHONEID
                                        where t.PHONETYPECODEID = p.PHONETYPECODEID and (t.ENDDATE is null or t.DONOTCALL=0)
                                        and t.ISPRIMARY = 0
                                    ),
                                    -- phones that may cause end dates to be put on EXISTING phones

                                        INCOMING as (
                                        select t.PHONETYPECODEID
                                        from @PHONENUMBERTABLE t
                                        left outer join dbo.PHONE p on p.ID = t.PHONEID
                                        where (t.PHONEID is null or
                                                        t.PHONETYPECODEID <> isnull(p.PHONETYPECODEID,@NULLVALUE))
                                        and t.ENDDATE is null
                                        and t.DONOTCALL = 0
                                    )
                                    update
                                        set ENDDATE = isnull(ENDDATE,@CURRENTDATE),
                                        DONOTCALL = 1,
                    UPDATEDBYRULES = 1
                                    from @PHONENUMBERTABLE t
                                    inner join EXISTING e on e.ID = t.ID
                                    inner join INCOMING i on i.PHONETYPECODEID = e.PHONETYPECODEID                       
                            end                                    

                            -- Start date must be before end date

                            if exists (select 1 from @PHONENUMBERTABLE where STARTDATE > ENDDATE)
                                raiserror('BBERR_PHONE_VALIDDATERANGE', 13, 1);

                            -- Primary phone numbers cannot have an end date

                            if exists (select 1 from @PHONENUMBERTABLE where ISPRIMARY = 1 and ENDDATE is not null)
                                raiserror('BBERR_PHONE_FORMERPHONECANNOTBEPRIMARY', 13, 1);

                            --JamesWill WI144876 2011-03-23 Don't let phone numbers have a start date in the future

                            if exists (select 1 from @PHONENUMBERTABLE where STARTDATE > @CURRENTDATE)
                                raiserror('BBERR_PHONE_STARTDATE_FUTURE', 13, 1);

                                --JamesWill WI144876 2011-03-23 Don't let phone numbers have an end date in the future

                                if exists (select 1 from @PHONENUMBERTABLE where ENDDATE > @CURRENTDATE)
                                    raiserror('BBERR_PHONE_ENDDATE_FUTURE', 13, 1);
                            end
                        end --@ISPHONES


                        --Fill a table with all of the constituent's social media accounts

                        if @ISSOCIALMEDIAACCOUNTS = 1
                        begin
                            --Fill a table with all of the constituent's social media accounts

                            declare @SOCIALMEDIAACCOUNTTABLE table
                            (
                                SOCIALMEDIASERVICEID uniqueidentifier, USERID nvarchar(100), 
                                URL dbo.UDT_WEBADDRESS, SOCIALMEDIAACCOUNTTYPECODEID uniqueidentifier,
                                INFOSOURCECODEID uniqueidentifier, DONOTCONTACT bit, SEQUENCE int, SOCIALMEDIAACCOUNTID uniqueidentifier
                            )
                            insert into @SOCIALMEDIAACCOUNTTABLE
                            (
                                SOCIALMEDIASERVICEID, 
                                USERID, 
                                URL, 
                                SOCIALMEDIAACCOUNTTYPECODEID, 
                                INFOSOURCECODEID, 
                                DONOTCONTACT, 
                                SEQUENCE
                                SOCIALMEDIAACCOUNTID
                            )
                            select
                                ACCOUNTS.SOCIALMEDIASERVICEID, 
                                ACCOUNTS.USERID,
                                ACCOUNTS.URL, 
                                ACCOUNTS.SOCIALMEDIAACCOUNTTYPECODEID, 
                                ACCOUNTS.INFOSOURCECODEID, 
                                ACCOUNTS.DONOTCONTACT, 
                                ACCOUNTS.SEQUENCE,
                                ACCOUNTS.SOCIALMEDIAACCOUNTID
                            from 
                                dbo.UFN_CONSTITUENT_GETSOCIALMEDIAACCOUNTS_FORUPDATEBATCH_FROMITEMLISTXML(@SOCIALMEDIAACCOUNTS) ACCOUNTS

                                if exists(select 1 from @SOCIALMEDIAACCOUNTTABLE
                            group by SOCIALMEDIASERVICEID,URL
                            having count(*)>1)   
                            raiserror('BBERR_SOCIALMEDIAACCOUNT_DUPLICATENOTALLOWED', 13, 1);

                        end

                        if @SOLICITCODES is not null
                        begin
                            begin try
                                declare @SOLICITCODESTABLE table
                                (
                                    [CONSTITUENTSOLICITCODEID] [uniqueidentifier] NOT NULL,
                                    [CONSTITUENTID] [uniqueidentifier] NOT NULL,
                                    [SOLICITCODEID] [uniqueidentifier] NOT NULL,
                                    [SEQUENCE] [int] NOT NULL,
                                    [STARTDATE] [datetime] NULL,
                                    [ENDDATE] [datetime] NULL,
                                    [COMMENTS] [nvarchar](100) NOT NULL,
                                    [CONSENTPREFERENCECODE] [tinyint] NOT NULL,
                                    [SOURCECODEID] [uniqueidentifier] NULL,
                                    [SOURCEFILEPATH] [nvarchar](260) NOT NULL,
                                    [PRIVACYPOLICYFILEPATH] [nvarchar](260) NOT NULL,
                                    [SUPPORTINGINFORMATION] [nvarchar](max) NOT NULL,
                                    [CONSENTSTATEMENT] [nvarchar](max) NOT NULL
                                );

                                insert into @SOLICITCODESTABLE
                                (
                                    CONSTITUENTSOLICITCODEID,
                                    CONSTITUENTID,
                                    SOLICITCODEID,
                                    STARTDATE,
                                    ENDDATE,
                                    COMMENTS,
                                    SEQUENCE,
                                    CONSENTPREFERENCECODE,
                                    SOURCECODEID,
                                    SOURCEFILEPATH,
                                    PRIVACYPOLICYFILEPATH,
                                    SUPPORTINGINFORMATION,
                                    CONSENTSTATEMENT
                                )
                                select
                                    isnull(CONSTITUENTSOLICITCODEID, newid()) CONSTITUENTSOLICITCODEID,
                                    @ID,
                                    SOLICITCODEID,
                                    STARTDATE,
                                    ENDDATE,
                                    COMMENTS,
                                    SEQUENCE,
                                    CONSENTPREFERENCECODE,
                                    SOURCECODEID,
                                    SOURCEFILEPATH,
                                    PRIVACYPOLICYFILEPATH,
                                    SUPPORTINGINFORMATION,
                                    CONSENTSTATEMENT
                                from dbo.UFN_CONSTITUENTUPDATEBATCH_GETSOLICITCODES_FROMITEMLISTXML(@SOLICITCODES);

                                update dbo.CONSTITUENTSOLICITCODE set
                                    CONSTITUENTSOLICITCODE.CONSTITUENTID = SOLICITCODES.CONSTITUENTID,
                                    CONSTITUENTSOLICITCODE.SOLICITCODEID = SOLICITCODES.SOLICITCODEID,
                                    CONSTITUENTSOLICITCODE.STARTDATE = SOLICITCODES.STARTDATE,
                                    CONSTITUENTSOLICITCODE.ENDDATE = SOLICITCODES.ENDDATE,
                                    CONSTITUENTSOLICITCODE.COMMENTS = SOLICITCODES.COMMENTS,
                                    CONSTITUENTSOLICITCODE.SEQUENCE = SOLICITCODES.SEQUENCE,
                                    CONSTITUENTSOLICITCODE.CONSENTPREFERENCECODE = SOLICITCODES.CONSENTPREFERENCECODE,
                                    CONSTITUENTSOLICITCODE.SOURCECODEID = SOLICITCODES.SOURCECODEID,
                                    CONSTITUENTSOLICITCODE.SOURCEFILEPATH = SOLICITCODES.SOURCEFILEPATH,
                                    CONSTITUENTSOLICITCODE.PRIVACYPOLICYFILEPATH = SOLICITCODES.PRIVACYPOLICYFILEPATH,
                                    CONSTITUENTSOLICITCODE.SUPPORTINGINFORMATION = SOLICITCODES.SUPPORTINGINFORMATION,
                                    CONSTITUENTSOLICITCODE.CONSENTSTATEMENT = SOLICITCODES.CONSENTSTATEMENT,
                                    CONSTITUENTSOLICITCODE.CHANGEDBYID = @CHANGEAGENTID,
                                    CONSTITUENTSOLICITCODE.DATECHANGED = @CURRENTDATE
                                from @SOLICITCODESTABLE SOLICITCODES
                                where CONSTITUENTSOLICITCODE.ID = SOLICITCODES.CONSTITUENTSOLICITCODEID;

                                -- Mark associated mail preferences as Do not send when the ended solicit code is no longer active

                                update MAILPREFERENCE set
                                    SENDMAIL = 0,
                                    USESEASONALADDRESS = 0,
                                    USEPRIMARYADDRESS = 0,
                                    USEPRIMARYEMAIL = 0,
                                    CHANGEDBYID = @CHANGEAGENTID,
                                    DATECHANGED = @CURRENTDATE
                                from @SOLICITCODESTABLE SOLICITCODES
                                    inner join dbo.MAILPREFERENCE on SOLICITCODES.CONSTITUENTSOLICITCODEID = MAILPREFERENCE.CONSTITUENTSOLICITCODEID
                                where SOLICITCODES.ENDDATE < convert(date, @CURRENTDATE);

                                -- prune updates from table variable

                                delete SOLICITCODES 
                                from @SOLICITCODESTABLE SOLICITCODES 
                                join dbo.BATCHCONSTITUENTUPDATESOLICITCODE BSC on BSC.CONSTITUENTSOLICITCODEID = SOLICITCODES.CONSTITUENTSOLICITCODEID;

                                -- do inserts

                                insert into CONSTITUENTSOLICITCODE
                                (
                                    ID,
                                    CONSTITUENTID,
                                    SOLICITCODEID,
                                    STARTDATE,
                                    ENDDATE,
                                    COMMENTS,
                                    SEQUENCE,
                                    CONSENTPREFERENCECODE,
                                    SOURCECODEID,
                                    SOURCEFILEPATH,
                                    PRIVACYPOLICYFILEPATH,
                                    SUPPORTINGINFORMATION,
                                    CONSENTSTATEMENT,
                                    ADDEDBYID,
                                    CHANGEDBYID,
                                    DATEADDED,
                                    DATECHANGED
                                )
                                select
                                    CONSTITUENTSOLICITCODEID,
                                    @ID,
                                    SOLICITCODEID,
                                    STARTDATE,
                                    ENDDATE,
                                    COMMENTS,
                                    SEQUENCE,
                                    CONSENTPREFERENCECODE,
                                    SOURCECODEID,
                                    SOURCEFILEPATH,
                                    PRIVACYPOLICYFILEPATH,
                                    SUPPORTINGINFORMATION,
                                    CONSENTSTATEMENT,
                                    @CHANGEAGENTID
                                    @CHANGEAGENTID
                                    @CURRENTDATE
                                    @CURRENTDATE
                                from @SOLICITCODESTABLE;
                            end try
                            begin catch
                                    exec.dbo.USP_RAISE_ERROR
                                    return 1
                            end catch
                        end

                        --Fill a table with all of the constituent's relationships

                        if @ISRELATIONSHIPS = 1
                        begin
                            --We don't need to keep track of existing relationships for the constituent, thus no RELATIONSHIPID field is needed.

                            declare @RELATIONSHIPTABLE table
                            (
                                RECIPROCALCONSTITUENTID uniqueidentifier, 
                                RELATIONSHIPTYPECODEID uniqueidentifier,
                                RECIPROCALTYPECODEID uniqueidentifier, 
                                STARTDATE datetime,
                                RELATIONSHIPSETID uniqueidentifier
                            )
                            insert into @RELATIONSHIPTABLE
                            (
                                RECIPROCALCONSTITUENTID, 
                                RELATIONSHIPTYPECODEID, 
                                RECIPROCALTYPECODEID, 
                                STARTDATE,
                                RELATIONSHIPSETID
                            )
                            select
                                RELATIONSHIPS.RECIPROCALCONSTITUENTID, 
                                RELATIONSHIPS.RELATIONSHIPTYPECODEID,
                                RELATIONSHIPS.RECIPROCALTYPECODEID, 
                                RELATIONSHIPS.STARTDATE,
                                newid()
                            from 
                                dbo.UFN_CONSTITUENT_GETRELATIONSHIPS_FORUPDATEBATCH_FROMITEMLISTXML(@RELATIONSHIPS) RELATIONSHIPS

                            if exists (select top 1 * from @RELATIONSHIPTABLE)
                            begin
                                --Throw an error if the batch owner does not have rights to the reciprocal constituent.

                                if exists (
                                    select 1 
                                    from 
                                        @RELATIONSHIPTABLE RT
                                        outer apply dbo.UFN_SITEID_MAPFROM_CONSTITUENTID(RT.RECIPROCALCONSTITUENTID) as CONSTITUENTSITES 
                                    where 
                                        dbo.UFN_SITEALLOWEDFORUSER(@BATCHOWNERID, CONSTITUENTSITES.SITEID) = 0
                                )
                                begin
                                    raiserror('BBERR_RELATIONSHIPS_RECIPROCALCONSTITUENT_PERMISSIONDENIED', 13, 1);
                                end
                            end
                        end

                        --Fill a table with all of the constituent's constituencies

                        --Created a table type so it can be passed to the SP that handles constituencies creation

                        declare @CONSTITUENCYTABLE as dbo.UDT_CONSTITUENTUPDATEBATCH_CONSTITUENCY

                        insert into @CONSTITUENCYTABLE
                        (
                            ID, CONSTITUENCYCODEID, DATEFROM, DATETO, ORIGINALCONSTITUENCYID
                        )
                        select
                            newid(), CONSTITUENCYCODEID, DATEFROM, DATETO, ORIGINALCONSTITUENCYID
                        from dbo.UFN_CONSTITUENT_GETCONSTITUENCIES_FORUPDATEBATCH_FROMITEMLISTXML(@CONSTITUENCIES)

                        if exists(select top 1 * from @CONSTITUENCYTABLE)
                        begin
                            if exists (select 1 from @CONSTITUENCYTABLE where DATEFROM is not null and DATETO is not null and DATETO < DATEFROM)
                            begin
                                raiserror('BBERR_ORIGINAL_ERROR:547',1,11);
                                raiserror('CK_CONSTITUENCY_DATETOAFTERDATEFROM', 13, 1);
                            end

                            -- Look for duplicate constituencies w/overlapping dates

                            if exists (    select 1 
                                        from @CONSTITUENCYTABLE C1
                                        inner join @CONSTITUENCYTABLE C2 on
                                            C1.ID <> C2.ID and
                                            C1.CONSTITUENCYCODEID = C2.CONSTITUENCYCODEID and
                                            (
                                                ( C1.DATETO   between C2.DATEFROM and C2.DATETO) or
                                                (C2.DATETO   between  C1.DATEFROM and  C1.DATETO) or
                                                ( C1.DATEFROM between C2.DATEFROM and C2.DATETO) or
                                                (C2.DATEFROM between  C1.DATEFROM and  C1.DATETO) or

                                                ( C1.DATEFROM is null and C2.DATEFROM <=  C1.DATETO)   or
                                                (C2.DATEFROM is null and  C1.DATEFROM <= C2.DATETO)   or
                                                ( C1.DATETO   is null and C2.DATETO   >=  C1.DATEFROM) or
                                                (C2.DATETO   is null and  C1.DATETO   >= C2.DATEFROM) or

                                                (C2.DATEFROM is null and  C1.DATEFROM is null) or
                                                (C2.DATETO   is null and  C1.DATETO   is null) or
                                                (C2.DATEFROM is null and C2.DATETO   is null) or
                                                ( C1.DATEFROM is null and  C1.DATETO   is null)
                                            ))
                            begin
                                raiserror('BBERR_ORIGINAL_ERROR:547',1,11);
                                raiserror('CK_CONSTITUENCY_ISUNIQUE', 13, 1);
                            end                        
                        end

                        --Fill a table with all of the constituent's alternate lookup IDs

                        declare @ALTERNATELOOKUPIDTABLE table
                        (
                            ALTERNATELOOKUPIDTYPECODEID uniqueidentifier, 
                            ALTERNATELOOKUPID nvarchar(100),
                            ORIGINALALTERNATELOOKUPID uniqueidentifier
                        )
                        insert into @ALTERNATELOOKUPIDTABLE
                        (
                            ALTERNATELOOKUPIDTYPECODEID, ALTERNATELOOKUPID, ORIGINALALTERNATELOOKUPID
                        )
                        select
                            LOOKUPIDS.ALTERNATELOOKUPIDTYPECODEID, 
                            LOOKUPIDS.ALTERNATELOOKUPID,             
                            case when LOOKUPIDS.ORIGINALALTERNATELOOKUPID is null 
                                then --if the ORIGINALALTERNATELOOKUPID field is null, look for an existing alternate lookup ID with the same type and lookup Id value on the constituent.

                                (
                                    select top 1 
                                        ALTERNATELOOKUPID.ID 
                                    from 
                                        dbo.ALTERNATELOOKUPID 
                                    where 
                                        ALTERNATELOOKUPID.CONSTITUENTID = @ID 
                                        and ALTERNATELOOKUPID.ALTERNATELOOKUPIDTYPECODEID = LOOKUPIDS.ALTERNATELOOKUPIDTYPECODEID
                                        and ALTERNATELOOKUPID.ALTERNATELOOKUPID = LOOKUPIDS.ALTERNATELOOKUPID 
                                )
                                else
                                    LOOKUPIDS.ORIGINALALTERNATELOOKUPID
                            end
                        from 
                            dbo.UFN_CONSTITUENT_GETALTERNATELOOKUPIDS_FORUPDATEBATCH_FROMITEMLISTXML(@ALTERNATELOOKUPIDS) LOOKUPIDS

                        if exists (select 1 from @ALTERNATELOOKUPIDTABLE group by ALTERNATELOOKUPIDTYPECODEID, ALTERNATELOOKUPID having count(*) > 1)
                        begin
                            raiserror('BBERR_ORIGINAL_ERROR:2627',1,11);
                            raiserror('UIX_ALTERNATELOOKUPID_ALTERNATELOOKUPIDTYPECODEID_ALTERNATELOOKUPID', 13, 1);
                        end

                        if exists (    select 1 from dbo.ALTERNATELOOKUPID
                                    inner join @ALTERNATELOOKUPIDTABLE as NEWALTERNATELOOKUPID on 
                                        ALTERNATELOOKUPID.ALTERNATELOOKUPIDTYPECODEID = NEWALTERNATELOOKUPID.ALTERNATELOOKUPIDTYPECODEID and
                                        ALTERNATELOOKUPID.ALTERNATELOOKUPID = NEWALTERNATELOOKUPID.ALTERNATELOOKUPID
                                    where ALTERNATELOOKUPID.CONSTITUENTID <> @ID)
                        begin
                            raiserror('BBERR_ORIGINAL_ERROR:2627',1,11);
                            raiserror('UIX_ALTERNATELOOKUPID_ALTERNATELOOKUPIDTYPECODEID_ALTERNATELOOKUPID', 13, 1);                        
                        end

                        --Fill a table with all of the spouse's alternate lookup IDs

                        declare @SPOUSEALTERNATELOOKUPIDTABLE table
                        (
                            ALTERNATELOOKUPIDTYPECODEID uniqueidentifier, 
                            ALTERNATELOOKUPID nvarchar(100),
                            ORIGINALALTERNATELOOKUPID uniqueidentifier
                        )
                        insert into @SPOUSEALTERNATELOOKUPIDTABLE
                        (
                            ALTERNATELOOKUPIDTYPECODEID, ALTERNATELOOKUPID, ORIGINALALTERNATELOOKUPID
                        )
                        select
                            ALTERNATELOOKUPIDTYPECODEID, ALTERNATELOOKUPID, ORIGINALALTERNATELOOKUPID
                        from dbo.UFN_CONSTITUENT_GETSPOUSEALTERNATELOOKUPIDS_FORUPDATEBATCH_FROMITEMLISTXML(@SPOUSE_ALTERNATELOOKUPIDS)

                        if exists (select 1 from @SPOUSEALTERNATELOOKUPIDTABLE group by ALTERNATELOOKUPIDTYPECODEID, ALTERNATELOOKUPID having count(*) > 1)
                        begin
                            raiserror('BBERR_ORIGINAL_ERROR:2627',1,11);
                            raiserror('UIX_ALTERNATELOOKUPID_ALTERNATELOOKUPIDTYPECODEID_ALTERNATELOOKUPID', 13, 1);
                        end

                        if exists (    select 1 from dbo.ALTERNATELOOKUPID
                                    inner join @SPOUSEALTERNATELOOKUPIDTABLE as NEWALTERNATELOOKUPID on 
                                        ALTERNATELOOKUPID.ALTERNATELOOKUPIDTYPECODEID = NEWALTERNATELOOKUPID.ALTERNATELOOKUPIDTYPECODEID and
                                        ALTERNATELOOKUPID.ALTERNATELOOKUPID = NEWALTERNATELOOKUPID.ALTERNATELOOKUPID
                                    where ALTERNATELOOKUPID.CONSTITUENTID <> @SPOUSE_ID)
                        begin
                            raiserror('BBERR_ORIGINAL_ERROR:2627',1,11);
                            raiserror('UIX_ALTERNATELOOKUPID_ALTERNATELOOKUPIDTYPECODEID_ALTERNATELOOKUPID', 13, 1);                        
                        end

                        if @CONSTITUENT_SITEID is not null and @CONSTITUENT_SITES is null
                            set @CONSTITUENT_SITES = 
                                (
                                    select @CONSTITUENT_SITEID SITEID
                                    for xml raw('ITEM'),type,elements,root('CONSTITUENT_SITES'),BINARY BASE64
                                )

                        if @CONSTITUENT_SITES is null and dbo.UFN_SITEREQUIREDFORUSER(@BATCHOWNERID) = 1
                            raiserror('CK_CONSTITUENTSITES_SITEREQUIRED', 13, 1);

                        --Fill a table with all of the constituent's sites

                        declare @CONSTITUENTSITESTABLE table
                        (
                            SITEID uniqueidentifier
                        )
                        insert into @CONSTITUENTSITESTABLE
                        (
                            SITEID
                        )
                        select
                            SITEID
                        from dbo.UFN_CONSTITUENT_GETSITES_FORUPDATEBATCH_FROMITEMLISTXML(@CONSTITUENT_SITES)

                        declare @ISADMIN bit = dbo.UFN_APPUSER_ISSYSADMIN(@CURRENTAPPUSERID);
                        declare @CONSTITUENTSITECOUNT int;

                        select @CONSTITUENTSITECOUNT = count(SITEID) from @CONSTITUENTSITESTABLE;
                        if (@ISADMIN = 0 and @CONSTITUENTSITECOUNT > 0 and not exists (
                            select 
                                1 
                            from 
                                @CONSTITUENTSITESTABLE CONSTITUENTSITES
                                left join dbo.UFN_SITESFORUSER(@BATCHOWNERID) SITESFORUSER on SITESFORUSER.SITEID = CONSTITUENTSITES.SITEID
                            where
                                SITESFORUSER.SITEID is not null
                            ))
                            raiserror('CK_CONSTITUENTSITES_PERMISSIONDENIED', 13, 1);

                        if @VALIDATEONLY = 0
                        begin

                                                        if @CREATEHISTORICALNAMECODE = 1
                                                                -------------------------------------------------------------------

                                                                --Historical Names

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

                                                                exec dbo.USP_CREATE_HISTORICALNAME @ID, @KEYNAME, @FIRSTNAME , @MIDDLENAME , @TITLECODEID, @SUFFIXCODEID,  @CHANGEAGENTID;

                            begin try
                                --WI#249545 We need to include keyname prefix in case it is an organization. Blank if not.

                                declare @KEYNAMEPREFIX nvarchar(50) = ''
                                if @CONSTITUENTTYPECODE = 1 --Organization

                                    exec dbo.USP_PARSE_ORGANIZATION_NAME @KEYNAME, @KEYNAME output, @KEYNAMEPREFIX output;

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

                                --Basic Constituent Info

                                --===============================================================

                                update
                                    dbo.[CONSTITUENT]
                                set
                                    [BIRTHDATE] = coalesce(nullif(@BIRTHDATE, '00000000'), BIRTHDATE),
                                    [FIRSTNAME] = coalesce(nullif(@FIRSTNAME, ''), FIRSTNAME),
                                    [GENDERCODE] = @GENDERCODE,
                                    [GENDERCODEID]=@GENDERCODEID,
                                    [GIVESANONYMOUSLY] = @GIVESANONYMOUSLY,
                                    [KEYNAME] = coalesce(nullif(@KEYNAME, ''), KEYNAME),
                                    [KEYNAMEPREFIX] = @KEYNAMEPREFIX,
                                    --[CUSTOMIDENTIFIER] = @LOOKUPID,        Will not update lookupid from batch due to match issues with alternate lookup ids

                                    [MAIDENNAME] = coalesce(nullif(@MAIDENNAME, ''), MAIDENNAME),
                                    [MIDDLENAME] = coalesce(nullif(@MIDDLENAME, ''), MIDDLENAME),
                                    [NICKNAME] = coalesce(nullif(@NICKNAME, ''), NICKNAME),
                                    [SUFFIXCODEID] = coalesce(nullif(@SUFFIXCODEID, '00000000-0000-0000-0000-000000000000'), SUFFIXCODEID),
                                    [TITLECODEID] = coalesce(nullif(@TITLECODEID, '00000000-0000-0000-0000-000000000000'), TITLECODEID),
                                    [WEBADDRESS] = coalesce(nullif(@WEBADDRESS, ''), WEBADDRESS),
                                    [MARITALSTATUSCODEID] = coalesce(nullif(@MARITALSTATUSCODEID, '00000000-0000-0000-0000-000000000000'), MARITALSTATUSCODEID),
                                    [DATECHANGED] = @CURRENTDATE,
                                    [CHANGEDBYID] = @CHANGEAGENTID
                                where
                                    [CONSTITUENT].ID = @ID;

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

                                --Name formats

                                --===============================================================

                                if @CONSTITUENTTYPECODE = 0 begin
                                    exec dbo.USP_CONSTITUENTUPDATEBATCH_ADDUPDATENAMEFORMATS @ID, @NAMEFORMATS, @CHANGEAGENTID, @CURRENTDATE;
                                end


                                    --Update/insert the constituentid into NETCOMMUNITYCLIENTUSER & set the NETCOMMUNITYMEMBER flag

                                    --SET   @BBNCTRANID= 25

                                    DECLARE @BBNCUSERID int, @SIGNUPTRANSACTIONDATE datetime,@SignupID int, @SEQUENCEID int, @ProfileUpdateTransactionsID int
                                    SELECT  @BBNCUSERID= BBNCUSERID, @SIGNUPTRANSACTIONDATE= DATEADDED, @NETCOMMUNITYTRANSACTIONPROCESSORID = NETCOMMUNITYTRANSACTIONPROCESSORID FROM BATCHCONSTITUENTUPDATEBBNCINFO WHERE BBNCTRANID= @BBNCTRANID

                                SELECT @SignupID= SignupTransactionsID                              FROM SignupTransactions        WHERE UserID= @BBNCUSERID
                                SELECT @SEQUENCEID= SEQUENCEID                                      FROM CONSTITUENT               WHERE ID= @ID      
                                SELECT @ProfileUpdateTransactionsID= ProfileUpdateTransactionsID        FROM ProfileUpdateTransactions WHERE AddedByUserID= @BBNCUSERID


                                    IF  ISNULL(@BBNCUSERID, 0) <> 0
                                    BEGIN

                                        if ISNULL(@BBNCTRANID, 0) = 0
                                        begin
                                                raiserror('An exception has occurred. Please contact Blackbaud Customer Support for assistance.', 13, 1);
                                        end 
                                            -- @BBNCUSERID will always be -1 for Acquisition transactions. Therefore we do not need to perform the IF block statements in Acquisition transaction records.

                                        IF @BBNCUSERID > 0 AND ( SELECT dbo.fnGetUserIDFromLinkedRecordID  (@SEQUENCEID, 0) ) IS NULL
                                            begin
                                                EXEC    spTransactions_MarkSignupAsProcessed          @SignupID= @SignupID, @BackOfficeID= @SEQUENCEID, @BackOfficeSysID= 0

                                                EXEC    dbo.USP_BBNC_COMMITSIGNUPCLIENTUSERADDUPDATE @ID= @ID, @BBNCUSERID= @BBNCUSERID, @SIGNUPTRANSACTIONDATE= @SIGNUPTRANSACTIONDATE, @CHANGEAGENTID= @CHANGEAGENTID, @CHANGEDATE= @CURRENTDATE
                                                UPDATE  CONSTITUENT SET NETCOMMUNITYMEMBER= 1 FROM CONSTITUENT WHERE ID= @ID
                                            end
                                        else
                                            begin
                                                IF @BBNCUSERID < 0 -- @BBNCUSERID will always be -1 for Acquisition records and update Process_date in SignupTransactions table for Acquisition Transactions.

                                                    begin 
                                                        EXEC spTransactions_MarkSignupAsProcessed  @SignupID= @BBNCTRANID , @BackOfficeID= @SEQUENCEID, @BackOfficeSysID= 0;
                                                    end
                                                else
                                                    begin
                                                        declare @OLDUSERID integer
                                                        SELECT @OLDUSERID= dbo.fnGetUserIDFromLinkedRecordID  (@SEQUENCEID, 0)
                                                        declare @USERNAME varchar(100)
                                                        select @USERNAME = USERNAME from dbo.NETCOMMUNITYCLIENTUSER where BBNCUSERID = @OLDUSERID
                                                        raiserror('This constituent is already linked to an existing Blackbaud Internet Solutions member: %s', 13, 1, @USERNAME);                        
                                                        return 1
                                                    end
                                            end
                                    END

                                IF  ISNULL(@ProfileUpdateTransactionsID, 0) <> 0
                                EXEC    spTransactions_MarkProfileUpdateAsProcessed        @ProfileUpdateTransactionsID= @ProfileUpdateTransactionsID


                                --Kill or resurrect the constituent if deceased has been checked or unchecked

                                if @DECEASED = 1 and not exists(select ID from DECEASEDCONSTITUENT where ID = @ID)
                                begin
                                    insert into dbo.DECEASEDCONSTITUENT
                                    (
                                        ID,
                                        DECEASEDDATE,
                                        ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
                                    )
                                    values
                                    (
                                        @ID,
                                        isnull(@DECEASEDDATE, '00000000'),
                                        @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
                                    );

                                    exec dbo.USP_CONSTITUENT_DECEASEFROMRULES @ID, @CHANGEAGENTID;
                                end
                                -- If the constituent is already deceased, update the date.

                                else if @DECEASED = 1 and @DECEASEDDATE is not null
                                begin
                                    update 
                                        dbo.DECEASEDCONSTITUENT
                                    set
                                        DECEASEDDATE = @DECEASEDDATE,
                                        CHANGEDBYID = @CHANGEAGENTID,
                                        DATECHANGED = @CURRENTDATE
                                    where
                                        ID = @ID
                                end
                                else if @DECEASED = 0 
                                    delete from dbo.DECEASEDCONSTITUENT
                                    where ID = @ID

                            --Update the constituent's sites

                            -- Aaron Crawford WI#502525: Only delete constituent sites if data is coming from the batch user interface (as opposed to import)

                            if @ROWFROMBATCHUI = 1
                            begin
                                delete from dbo.CONSTITUENTSITE
                                where 
                                CONSTITUENTSITE.CONSTITUENTID = @ID
                                and not exists (select 1 from @CONSTITUENTSITESTABLE NEWSITES where NEWSITES.SITEID = CONSTITUENTSITE.SITEID)
                            end

                            insert into dbo.CONSTITUENTSITE
                            (
                                ID,
                                CONSTITUENTID,
                                SITEID,
                                ADDEDBYID,
                                CHANGEDBYID,
                                DATEADDED,
                                DATECHANGED
                            )
                            select newid(), @ID, NEWSITES.SITEID, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
                            from @CONSTITUENTSITESTABLE NEWSITES
                            where not exists (select 1 from dbo.CONSTITUENTSITE where CONSTITUENTSITE.SITEID = NEWSITES.SITEID and CONSTITUENTSITE.CONSTITUENTID = @ID)

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

                            --Basic group info

                            --===============================================================

                            declare @PREVIOUSSTARTDATE date = (select STARTDATE from dbo.GROUPDATA     where ID = @ID);

                            update dbo.GROUPDATA
                            set
                                GROUPTYPECODE = coalesce(case when @CONSTITUENTTYPECODE = 2 then 0 when @CONSTITUENTTYPECODE = 3 then 1 else 0 end, 0),
                                GROUPTYPEID = coalesce(nullif(@GROUPTYPEID, '00000000-0000-0000-0000-000000000000'), GROUPTYPEID),
                                DESCRIPTION = coalesce(nullif(@GROUPDESCRIPTION, ''), DESCRIPTION),
                                CHANGEDBYID = @CHANGEAGENTID,
                                DATECHANGED = @CURRENTDATE,
                                STARTDATE = @GROUPSTARTDATE
                            where
                                ID = @ID

                            -- Update member's start date to be equal to the group's start date if the member's start date was

                            -- on or before the previous group start date

                            update
                                dbo.GROUPMEMBERDATERANGE
                            set
                                DATEFROM = @GROUPSTARTDATE,
                                DATETO = case when DATETO < @GROUPSTARTDATE then @GROUPSTARTDATE else DATETO end,
                                DATECHANGED = @CURRENTDATE,
                                CHANGEDBYID = @CHANGEAGENTID
                            where
                                GROUPMEMBERID in (select ID from dbo.GROUPMEMBER where GROUPID = @ID)
                                and ((DATEFROM is null and @PREVIOUSSTARTDATE is null)
                                        or (DATEFROM = @PREVIOUSSTARTDATE)
                                or (DATEFROM < @GROUPSTARTDATE))

                            --Update the role dates in case the member dates were changed

                            exec dbo.USP_GROUPMEMBERROLE_UPDATEDATESFORGROUP @ID, @CHANGEAGENTID;

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

                            --Basic organization info

                            --===============================================================

                            declare @OLDPARENTID uniqueidentifier = (select PARENTCORPID from dbo.ORGANIZATIONDATA where ORGANIZATIONDATA.ID = @ID);
                            update dbo.ORGANIZATIONDATA
                            set
                                INDUSTRYCODEID = coalesce(nullif(@ORG_INDUSTRYCODEID, '00000000-0000-0000-0000-000000000000'), INDUSTRYCODEID),
                                NUMEMPLOYEES = coalesce(nullif(@ORG_NUMEMPLOYEES, ''), NUMEMPLOYEES),
                                NUMSUBSIDIARIES = coalesce(nullif(@ORG_NUMSUBSIDIARIES, ''), NUMSUBSIDIARIES),
                                PARENTCORPID = coalesce(nullif(@ORG_PARENTCORPID, '00000000-0000-0000-0000-000000000000'), PARENTCORPID),                                                    
                                CHANGEDBYID = @CHANGEAGENTID,
                                DATECHANGED = @CURRENTDATE
                            where
                                ID = @ID

                            if @ORG_PARENTCORPID is not null and @ORG_PARENTCORPID <> '00000000-0000-0000-0000-000000000000'
                            begin
                                exec dbo.USP_RELATIONSHIPS_CREATEPARENTORGRELATIONSHIP  @ID, @ORG_PARENTCORPID,@CURRENTDATE,@CHANGEAGENTID,@CURRENTDATE,1,@OLDPARENTID;
                            end

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

                            --Spouse information

                            --===============================================================

                            if @REMOVESPOUSE = 1 
                            begin
                                --if this is a BBIS transaction, use the configure integration settings

                                if isnull(@BBNCUSERID, 0) <> 0                     
                                begin
                                    declare @SPOUSEREMOVEDRELATIONSHIPTYPECODEID uniqueidentifier

                                    select top (1)
                                        @SPOUSEREMOVEDRELATIONSHIPTYPECODEID = [SPOUSEREMOVEDRELATIONSHIPTYPECODEID]
                                    from
                                        dbo.NETCOMMUNITYDEFAULTCODEMAP;

                                    if @SPOUSEREMOVEDRELATIONSHIPTYPECODEID is null
                                    begin
                                        raiserror('You must define the default relationship type for removed spouses.',16,1);
                                        return -2;
                                    end


                                    begin try
                                        update dbo.RELATIONSHIP
                                        set
                                            [ISSPOUSE] = 0,
                                            [RELATIONSHIPTYPECODEID] = @SPOUSEREMOVEDRELATIONSHIPTYPECODEID,
                                            [RECIPROCALTYPECODEID] = @SPOUSEREMOVEDRELATIONSHIPTYPECODEID,
                                            [CHANGEDBYID] = @CHANGEAGENTID,
                                            [DATECHANGED] = @CURRENTDATE
                                        where
                                            [RELATIONSHIP].[RELATIONSHIPCONSTITUENTID] = @ID
                                            and [RELATIONSHIP].[ISSPOUSE] = 1;
                                    end try
                                    begin catch
                                        exec dbo.USP_RAISE_ERROR 1;
                                        return 1;
                                    end catch
                                end 

                                -- if this is a non BBIS transaction, use the batch relationship fields

                                if not isnull(@BBNCUSERID, 0) <> 0 
                                begin
                                    begin try
                                        update dbo.RELATIONSHIP
                                        set
                                            [ISSPOUSE] = 0,
                                            [RELATIONSHIPTYPECODEID] = @SPOUSE_RELATIONSHIPTYPECODEID,
                                            [RECIPROCALTYPECODEID] = @SPOUSE_RECIPROCALTYPECODEID,
                                            [CHANGEDBYID] = @CHANGEAGENTID,
                                            [DATECHANGED] = @CURRENTDATE
                                        where
                                            [RELATIONSHIP].[RELATIONSHIPCONSTITUENTID] = @ID
                                            and [RELATIONSHIP].[ISSPOUSE] = 1;
                                    end try
                                    begin catch
                                        exec dbo.USP_RAISE_ERROR 1;
                                        return 1;
                                    end catch
                                end 

                            end

                                if (@SPOUSE_ID is not null or @SPOUSE_LASTNAME <> '') and  @REMOVESPOUSE = 0 begin
                                    --Get the previous spouse ID

                                    declare @OLD_SPOUSE_ID uniqueidentifier
                                    select @OLD_SPOUSE_ID = R.RECIPROCALCONSTITUENTID
                                    from
                                        dbo.RELATIONSHIP R 
                                    where
                                        R.RELATIONSHIPCONSTITUENTID = @ID and ISSPOUSE = 1

                                    --Update info for the current spouse if the current spouse is still the spouse

                                    if @OLD_SPOUSE_ID is not null and @OLD_SPOUSE_ID = @SPOUSE_ID begin
                                        begin try
                                            update SPOUSE
                                            set
                                                SPOUSE.BIRTHDATE = coalesce(nullif(@SPOUSE_BIRTHDATE, '00000000'), SPOUSE.BIRTHDATE),
                                                SPOUSE.FIRSTNAME = coalesce(nullif(@SPOUSE_FIRSTNAME, ''), SPOUSE.FIRSTNAME),
                                                SPOUSE.GENDERCODE = coalesce(nullif(@SPOUSE_GENDERCODE, ''), '0'),
                                                SPOUSE.GENDERCODEID = @SPOUSE_GENDERCODEID,
                                                SPOUSE.KEYNAME = coalesce(nullif(@SPOUSE_LASTNAME, ''), SPOUSE.KEYNAME),
                                                SPOUSE.CUSTOMIDENTIFIER = @SPOUSE_LOOKUPID
                                                SPOUSE.MAIDENNAME = coalesce(nullif(@SPOUSE_MAIDENNAME, ''), SPOUSE.MAIDENNAME),
                                                SPOUSE.MIDDLENAME = coalesce(nullif(@SPOUSE_MIDDLENAME, ''), SPOUSE.MIDDLENAME),
                                                SPOUSE.NICKNAME = coalesce(nullif(@SPOUSE_NICKNAME, ''), SPOUSE.NICKNAME),
                                                SPOUSE.SUFFIXCODEID = coalesce(nullif(@SPOUSE_SUFFIXCODEID, '00000000-0000-0000-0000-000000000000'), SPOUSE.SUFFIXCODEID),
                                                SPOUSE.TITLECODEID = coalesce(nullif(@SPOUSE_TITLECODEID, '00000000-0000-0000-0000-000000000000'), SPOUSE.TITLECODEID),
                                                SPOUSE.CHANGEDBYID = @CHANGEAGENTID,
                                                SPOUSE.DATECHANGED = @CURRENTDATE
                                            from
                                                dbo.RELATIONSHIP SR
                                                join dbo.CONSTITUENT SPOUSE on SR.RECIPROCALCONSTITUENTID = SPOUSE.ID
                                            where 
                                                SR.RELATIONSHIPCONSTITUENTID = @ID and SR.ISSPOUSE = 1
                                        end try
                                        begin catch
                                            set @InfoMsg='BBERR_ORIGINAL_ERROR:50004';
                                            raiserror(@InfoMsg,1,11);

                                            select
                                                @ErrorMessage = ERROR_MESSAGE(),
                                                @ErrorSeverity = ERROR_SEVERITY(),
                                                @ErrorState = ERROR_STATE();

                                            raiserror(@ErrorMessage,@ErrorSeverity,@ErrorState);
                                            return 1;
                                        end catch

                                        begin try
                                            update SR
                                            set
                                                SR.RELATIONSHIPTYPECODEID = coalesce(nullif(@SPOUSE_RELATIONSHIPTYPECODEID, '00000000-0000-0000-0000-000000000000'), SR.RELATIONSHIPTYPECODEID),
                                                SR.RECIPROCALTYPECODEID = coalesce(nullif(@SPOUSE_RECIPROCALTYPECODEID, '00000000-0000-0000-0000-000000000000'), SR.RECIPROCALTYPECODEID),
                                                SR.CHANGEDBYID = @CHANGEAGENTID,
                                                SR.DATECHANGED = @CURRENTDATE
                                            from
                                                dbo.RELATIONSHIP SR
                                            where
                                                SR.RELATIONSHIPCONSTITUENTID = @ID and SR.ISSPOUSE = 1
                                        end try
                                        begin catch
                                            exec dbo.USP_RAISE_ERROR 2;
                                            return 1;
                                        end catch
                                    end
                                    --Add a new spouse relationship if there was not a previous spouse

                                    else if @OLD_SPOUSE_ID is null or @OLD_SPOUSE_ID <> @SPOUSE_ID begin
                                        --Insert a new constituent for the spouse if an existing constituent was not chosen

                                        if @SPOUSE_ID is null and @SPOUSE_LASTNAME is not null and @SPOUSE_LASTNAME <> '' begin
                                            set @SPOUSE_ID = newid()

                                            begin try                                            
                                                insert into dbo.CONSTITUENT
                                                (
                                                    ID,
                                                    BIRTHDATE, 
                                                    FIRSTNAME, 
                                                    GENDERCODE,
                                                    GENDERCODEID,
                                                    KEYNAME, 
                                                    CUSTOMIDENTIFIER, 
                                                    MAIDENNAME, 
                                                    MIDDLENAME, 
                                                    NICKNAME, 
                                                    SUFFIXCODEID, 
                                                    TITLECODEID,
                                                    ADDEDBYID, 
                                                    CHANGEDBYID, 
                                                    DATEADDED, 
                                                    DATECHANGED
                                                )
                                                values
                                                (
                                                    @SPOUSE_ID,
                                                    coalesce(@SPOUSE_BIRTHDATE, '00000000'), 
                                                    coalesce(@SPOUSE_FIRSTNAME, ''),
                                                    coalesce(@SPOUSE_GENDERCODE, 0),
                                                    @SPOUSE_GENDERCODEID,
                                                    coalesce(@SPOUSE_LASTNAME, ''),
                                                    coalesce(@SPOUSE_LOOKUPID, ''),
                                                    coalesce(@SPOUSE_MAIDENNAME, ''),
                                                    coalesce(@SPOUSE_MIDDLENAME, ''),
                                                    coalesce(@SPOUSE_NICKNAME, ''),
                                                    @SPOUSE_SUFFIXCODEID
                                                    @SPOUSE_TITLECODEID,
                                                    @CHANGEAGENTID
                                                    @CHANGEAGENTID
                                                    @CURRENTDATE
                                                    @CURRENTDATE
                                                )

                                                if isnull(context_info(),0x) = 0xE2DF375A033A104382689B8EAC5165AD
                                                begin
                                                        insert into dbo.SEARCHCONSTITUENT 
                                                        (
                                                                ID,
                                                                CONSTITUENTID,
                                                                ADDRESSID,
                                                                KEYNAME,
                                                                FIRSTNAME,
                                                                MIDDLENAME,
                                                                NAMETYPECODE,
                                                                TITLECODEID,
                                                                SUFFIXCODEID,
                                                                COUNTRYID,
                                                                POSTCODE,
                                                                STREETNUMBER,
                                                                STREETNAME,
                                                                ISORGANIZATION,
                                                                ISGROUP,
                                                                ALIASID
                                                        )
                                                        select 
                                                                newid(),
                                                                CONSITTUENTALLNAMES.ID,
                                                                ADDRESS.ID,
                                                                CONSITTUENTALLNAMES.KEYNAME,
                                                                CONSITTUENTALLNAMES.FIRSTNAME,
                                                                CONSITTUENTALLNAMES.MIDDLENAME,
                                                                CONSITTUENTALLNAMES.NAMETYPECODE,
                                                                CONSITTUENTALLNAMES.TITLECODEID,
                                                                CONSITTUENTALLNAMES.SUFFIXCODEID,
                                                                ADDRESS.COUNTRYID,
                                                                case when ADDRESS.POSTCODE is null 
                                                                        then '' 
                                                                when ltrim(rtrim(ADDRESS.POSTCODE)) like '[0-9][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]' 
                                                                        then left(ltrim(ADDRESS.POSTCODE), 5
                                                                else 
                                                                        ltrim(rtrim(ADDRESS.POSTCODE)) 
                                                                end,
                                                                isnull(PARSEDADDRESS.STREETNUMBER, ''),
                                                                coalesce(PARSEDADDRESS.STREETNAME, ab.CLEANADDRESSBLOCK,''),
                                                                CONSITTUENTALLNAMES.ISORGANIZATION,
                                                                CONSITTUENTALLNAMES.ISGROUP,
                                                                CONSITTUENTALLNAMES.ALIASID
                                                        from dbo.V_CONSTITUENTALLNAMES CONSITTUENTALLNAMES
                                                        left join dbo.ADDRESS on 
                                                                ADDRESS.CONSTITUENTID = CONSITTUENTALLNAMES.ID
                                                        outer apply (select ltrim(rtrim(upper(replace(replace(replace(replace(replace(replace(replace(replace(
                                                                                                ADDRESS.ADDRESSBLOCK,'.',''),'-',' '),',',' '),
                                                                                                char(13)+char(10),' '),char(10)+char(13),' '),char(13),' '),char(10),' '),'  ',' ')))) CLEANADDRESSBLOCK) ab
                                                        outer apply (select left(CLEANADDRESSBLOCK,charindex(' ', CLEANADDRESSBLOCK) -1) STREETNUMBER,
                                                                                                right(CLEANADDRESSBLOCK,len(CLEANADDRESSBLOCK)-charindex(' ',CLEANADDRESSBLOCK)) STREETNAME
                                                                                where dbo.UFN_REGULAREXPRESSIONMATCH('(?:^[A-Z]?[\d-]+[A-Z]? (?:.|\n)+$)',CLEANADDRESSBLOCK) = 1
                                                                                and charindex(' ', CLEANADDRESSBLOCK) <= 13) PARSEDADDRESS
                                                        where 
                                                                CONSITTUENTALLNAMES.ID = @SPOUSE_ID
                                                                and CONSITTUENTALLNAMES.KEYNAME <> '';
                                                end
                                            end try
                                            begin catch
                                                set @InfoMsg='BBERR_ORIGINAL_ERROR:50002';
                                                raiserror(@InfoMsg,1,11);

                                                select
                                                    @ErrorMessage = ERROR_MESSAGE(),
                                                    @ErrorSeverity = ERROR_SEVERITY(),
                                                    @ErrorState = ERROR_STATE();

                                                raiserror(@ErrorMessage,@ErrorSeverity,@ErrorState);
                                                return 1;
                                            end catch
                                        end
                                        --existing constituent is added as spouse to batch

                                        else if @SPOUSE_ID is not null and @SPOUSE_LASTNAME is not null and @SPOUSE_LASTNAME <> '' begin
                                            begin try
                                                update dbo.CONSTITUENT
                                                set
                                                    BIRTHDATE = coalesce(nullif(@SPOUSE_BIRTHDATE, '00000000'), @SPOUSE_BIRTHDATE), 
                                                    FIRSTNAME = coalesce(nullif(@SPOUSE_FIRSTNAME, ''), @SPOUSE_FIRSTNAME), 
                                                    GENDERCODE = coalesce(@SPOUSE_GENDERCODE, 0), 
                                                    GENDERCODEID = @SPOUSE_GENDERCODEID,
                                                    KEYNAME = @SPOUSE_LASTNAME
                                                    CUSTOMIDENTIFIER = coalesce(@SPOUSE_LOOKUPID, ''), 
                                                    MAIDENNAME = coalesce(nullif(@SPOUSE_MAIDENNAME, ''), @SPOUSE_MAIDENNAME), 
                                                    MIDDLENAME = coalesce(nullif(@SPOUSE_MIDDLENAME, ''), @SPOUSE_MIDDLENAME), 
                                                    NICKNAME = coalesce(nullif(@SPOUSE_NICKNAME, ''), @SPOUSE_NICKNAME), 
                                                    SUFFIXCODEID =coalesce(nullif(@SPOUSE_SUFFIXCODEID, '00000000-0000-0000-0000-000000000000'), @SPOUSE_SUFFIXCODEID), 
                                                    TITLECODEID = coalesce(nullif(@SPOUSE_TITLECODEID, '00000000-0000-0000-0000-000000000000'), @SPOUSE_TITLECODEID),
                                                    CHANGEDBYID = @CHANGEAGENTID,
                                                    DATECHANGED = @CURRENTDATE
                                                where
                                                ID = @SPOUSE_ID
                                            end try
                                            begin catch
                                                set @InfoMsg='BBERR_ORIGINAL_ERROR:50002';
                                                raiserror(@InfoMsg,1,11);

                                                select
                                                    @ErrorMessage = ERROR_MESSAGE(),
                                                    @ErrorSeverity = ERROR_SEVERITY(),
                                                    @ErrorState = ERROR_STATE();

                                                raiserror(@ErrorMessage,@ErrorSeverity,@ErrorState);
                                                return 1;
                                            end catch
                                        end
                                        --Add a relationship for the new spouse

                                        if not exists(
                                            select ID from dbo.RELATIONSHIP 
                                            where RELATIONSHIPCONSTITUENTID = @ID and RECIPROCALCONSTITUENTID = @SPOUSE_ID)
                                        begin
                                            begin try
                                                set @SETID  = newid();

                                                insert into dbo.RELATIONSHIPSET
                                                (
                                                    ID,
                                                    ADDEDBYID,
                                                    CHANGEDBYID,
                                                    DATEADDED,
                                                    DATECHANGED
                                                )
                                                values
                                                (
                                                    @SETID,
                                                    @CHANGEAGENTID,
                                                    @CHANGEAGENTID,
                                                    @CURRENTDATE,
                                                    @CURRENTDATE
                                                );

                                                insert into dbo.RELATIONSHIP
                                                (
                                                    RELATIONSHIPCONSTITUENTID, RECIPROCALCONSTITUENTID, 
                                                    RELATIONSHIPTYPECODEID, RECIPROCALTYPECODEID, ISSPOUSE, RELATIONSHIPSETID,
                                                    ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
                                                )
                                                values
                                                (
                                                    @ID, @SPOUSE_ID
                                                    @SPOUSE_RELATIONSHIPTYPECODEID, @SPOUSE_RECIPROCALTYPECODEID, 1, @SETID,
                                                    @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
                                                )
                                            end try
                                            begin catch
                                                exec dbo.USP_RAISE_ERROR 1;
                                                return 1;
                                            end catch
                                        end

                                        --Update the new spouse relationship

                                        begin try
                                            update SR
                                            set
                                                SR.RELATIONSHIPTYPECODEID = coalesce(nullif(@SPOUSE_RELATIONSHIPTYPECODEID, '00000000-0000-0000-0000-000000000000'), SR.RELATIONSHIPTYPECODEID),
                                                SR.RECIPROCALTYPECODEID = coalesce(nullif(@SPOUSE_RECIPROCALTYPECODEID, '00000000-0000-0000-0000-000000000000'), SR.RECIPROCALTYPECODEID),
                                                SR.ISSPOUSE = 1,
                                                SR.CHANGEDBYID = @CHANGEAGENTID,
                                                SR.DATECHANGED = @CURRENTDATE
                                            from
                                                dbo.RELATIONSHIP SR
                                            where
                                                SR.RELATIONSHIPCONSTITUENTID = @ID and SR.RECIPROCALCONSTITUENTID = @SPOUSE_ID
                                        end try
                                        begin catch
                                            exec dbo.USP_RAISE_ERROR 2;
                                            return 1;
                                        end catch

                                        if (not exists(select ID from dbo.DISABLEDWEALTHUPDATES where ID = @SPOUSE_ID))
                                            insert into dbo.DISABLEDWEALTHUPDATES
                                            (
                                                ID,
                                                ADDEDBYID,
                                                CHANGEDBYID,
                                                DATEADDED,
                                                DATECHANGED
                                            )
                                            values
                                            (
                                                @SPOUSE_ID,
                                                @CHANGEAGENTID,
                                                @CHANGEAGENTID,
                                                @CURRENTDATE,
                                                @CURRENTDATE
                                            );

                                        exec dbo.USP_RELATIONSHIPCONFIGURATION_CONFIGURE @ID, @SPOUSE_ID, @SPOUSE_RELATIONSHIPTYPECODEID, @SPOUSE_RECIPROCALTYPECODEID, @CHANGEAGENTID, @CURRENTDATE

                                        --Add the spouse to the household

                                        exec dbo.USP_SPOUSERELATIONSHIP_SETUPHOUSEHOLD @ID, @SPOUSE_ID
                                            0, @CHANGEAGENTID, @CURRENTDATE, 0, @CURRENTAPPUSERID;
                                    end

                                                                        --Add the recognition credit defaults for the spouse

                                                                        exec dbo.USP_RECOGNITIONDEFAULTSUPDATE @SPOUSE_ID, @ID, null, null,
                                                                            @SPOUSE_PRIMARYSOFTCREDITRELATIONSHIPEXISTS, @SPOUSE_PRIMARYSOFTCREDITMATCHFACTOR,
                                                                            @SPOUSE_PRIMARYRECOGNITIONTYPECODEID, @SPOUSE_RECIPROCALSOFTCREDITRELATIONSHIPEXISTS,
                                                                            @SPOUSE_RECIPROCALSOFTCREDITMATCHFACTOR, @SPOUSE_RECIPROCALRECOGNITIONTYPECODEID,
                                                                            @CHANGEAGENTID, 0;
                                end

                                declare @HASHOUSEHOLD bit = 0;
                                --Get the constituents who are in the household

                                declare @MATCHINGCONSTITUENTS table(CONSTITID uniqueidentifier);
                                insert into @MATCHINGCONSTITUENTS select CONSTITUENTID from dbo.UFN_CONSTITUENT_MATCHINGHOUSEHOLDRECORDS(@ID);

                                if @@rowcount > 0 begin
                                    set @HASHOUSEHOLD = 1;
                                end

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

                                --Aliases

                                --===============================================================

                                                                if @MAIDENNAMECHANGED = 1 and @MAIDENNAME is not null and @MAIDENNAME != ''
                                                                        begin
                                                                                if not exists (select ID from dbo.ALIAS
                                                                                                     where ALIAS.CONSTITUENTID = @ID
                                                                                                     and ALIAS.KEYNAME = @MAIDENNAME
                                                                                                     and ALIAS.FIRSTNAME = @FIRSTNAME
                                                                                                     and ALIAS.MIDDLENAME = @MIDDLENAME)
                                                                                        insert into dbo.ALIAS
                                                                                                (CONSTITUENTID, KEYNAME, FIRSTNAME, MIDDLENAME, DATEADDED, DATECHANGED, ADDEDBYID, CHANGEDBYID)
                                                                                        values
                                                                                                (@ID, @MAIDENNAME, @FIRSTNAME, @MIDDLENAME, @CURRENTDATE, @CURRENTDATE, @CHANGEAGENTID, @CHANGEAGENTID)
                                                                        end

                                                                if @SPOUSE_MAIDENNAMECHANGED = 1 and @SPOUSE_MAIDENNAME is not null and @SPOUSE_MAIDENNAME != ''
                                                                        begin
                                                                                if not exists (select ID from dbo.ALIAS
                                                                                                     where ALIAS.CONSTITUENTID = @SPOUSE_ID
                                                                                                     and ALIAS.KEYNAME = @SPOUSE_MAIDENNAME
                                                                                                     and ALIAS.FIRSTNAME = @SPOUSE_FIRSTNAME
                                                                                                     and ALIAS.MIDDLENAME = @SPOUSE_MIDDLENAME)
                                                                                        insert into dbo.ALIAS
                                                                                                (CONSTITUENTID, KEYNAME, FIRSTNAME, MIDDLENAME, DATEADDED, DATECHANGED, ADDEDBYID, CHANGEDBYID)
                                                                                        values
                                                                                                (@SPOUSE_ID, @SPOUSE_MAIDENNAME, @SPOUSE_FIRSTNAME, @SPOUSE_MIDDLENAME, @CURRENTDATE, @CURRENTDATE, @CHANGEAGENTID, @CHANGEAGENTID)
                                                                        end
                                -----------------------------------------------------------------

                                --Alternate Lookup IDs

                                --===============================================================

                                --Update existing entries in the ALTERNATELOOKUPID table

                                update ALT
                                set
                                    ALTERNATELOOKUPID = TEMP.ALTERNATELOOKUPID,
                                    CHANGEDBYID = @CHANGEAGENTID,
                                    DATECHANGED = @CURRENTDATE
                                from
                                    @ALTERNATELOOKUPIDTABLE TEMP 
                                    join dbo.ALTERNATELOOKUPID ALT on 
                                        TEMP.ORIGINALALTERNATELOOKUPID = ALT.ID and
                                        ALT.CONSTITUENTID = @ID

                                --Insert new alternate lookup IDs into the ALTERNATELOOKUPID table

                                insert into dbo.ALTERNATELOOKUPID
                                (
                                    CONSTITUENTID,
                                    ALTERNATELOOKUPIDTYPECODEID, ALTERNATELOOKUPID,
                                    ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
                                )
                                select 
                                    @ID
                                    ALTERNATELOOKUPIDTYPECODEID, ALTERNATELOOKUPID, 
                                    @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
                                from 
                                    @ALTERNATELOOKUPIDTABLE TEMP
                                where 
                                    TEMP.ORIGINALALTERNATELOOKUPID is null or
                                    not exists
                                    (
                                        select 
                                            1
                                        from 
                                            dbo.ALTERNATELOOKUPID 
                                        where 
                                            ID = TEMP.ORIGINALALTERNATELOOKUPID and
                                            ALTERNATELOOKUPID.CONSTITUENTID = @ID
                                    )

                                --Update existing entries in the ALTERNATELOOKUPID table

                                update ALT
                                set
                                    ALTERNATELOOKUPID = TEMP.ALTERNATELOOKUPID,
                                    CHANGEDBYID = @CHANGEAGENTID,
                                    DATECHANGED = @CURRENTDATE
                                from
                                    @SPOUSEALTERNATELOOKUPIDTABLE TEMP 
                                    join dbo.ALTERNATELOOKUPID ALT on 
                                        TEMP.ORIGINALALTERNATELOOKUPID = ALT.ID and
                                        ALT.CONSTITUENTID = @SPOUSE_ID

                                --HANDLE SPOUSE ALTERNATE LOOKUPIDs

                                --Insert new alternate lookup IDs into the ALTERNATELOOKUPID table

                                insert into dbo.ALTERNATELOOKUPID
                                (
                                    CONSTITUENTID,
                                    ALTERNATELOOKUPIDTYPECODEID, ALTERNATELOOKUPID,
                                    ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
                                )
                                select 
                                    @SPOUSE_ID
                                    ALTERNATELOOKUPIDTYPECODEID, ALTERNATELOOKUPID, 
                                    @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
                                from 
                                    @SPOUSEALTERNATELOOKUPIDTABLE TEMP
                                where 
                                    TEMP.ORIGINALALTERNATELOOKUPID is null or
                                    not exists
                                    (
                                        select 
                                            1
                                        from 
                                            dbo.ALTERNATELOOKUPID 
                                        where 
                                            ID = TEMP.ORIGINALALTERNATELOOKUPID and
                                            ALTERNATELOOKUPID.CONSTITUENTID = @SPOUSE_ID
                                    )
                                -----------------------------------------------------------------

                                --Security Attributes

                                --===============================================================

                                --Fill a table with all of the constituent's security attributes

                                declare @SECURITYATTRIBUTETABLE table
                                (
                                    CONSTIT_SECURITY_ATTRIBUTEID uniqueidentifier
                                )
                                insert into @SECURITYATTRIBUTETABLE
                                (
                                    CONSTIT_SECURITY_ATTRIBUTEID
                                )
                                select
                                    CONSTIT_SECURITY_ATTRIBUTEID
                                from dbo.UFN_CONSTITUENT_GETSECURITYATTRIBUTES_FORUPDATEBATCH_FROMITEMLISTXML(@SECURITYATTRIBUTES)

                                --Insert new security attributes into the CONSTIT_SECURITY_ATTRIBUTE_ASSIGNMENT table

                                insert into dbo.CONSTIT_SECURITY_ATTRIBUTE_ASSIGNMENT
                                (
                                    CONSTITUENTID,
                                    CONSTIT_SECURITY_ATTRIBUTEID,
                                    ADDEDBYID,
                                    CHANGEDBYID,
                                    DATEADDED,
                                    DATECHANGED
                                )
                                select @ID, TEMP.CONSTIT_SECURITY_ATTRIBUTEID, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
                                from 
                                    @SECURITYATTRIBUTETABLE TEMP
                                where not exists(select CSA.CONSTIT_SECURITY_ATTRIBUTEID from CONSTIT_SECURITY_ATTRIBUTE_ASSIGNMENT CSA where CSA.CONSTIT_SECURITY_ATTRIBUTEID = TEMP.CONSTIT_SECURITY_ATTRIBUTEID and CSA.CONSTITUENTID = @ID)

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

                                --Constituent Interests

                                --===============================================================

                                --Fill a table with all of the constituent's interests

                                declare @INTERESTTABLE table
                                (
                                    CONSTITUENTINTERESTCODEID uniqueidentifier, NOTE nvarchar(255), CONSTITUENTINTERESTID uniqueidentifier
                                )
                                insert into @INTERESTTABLE
                                (
                                    CONSTITUENTINTERESTCODEID, NOTE, CONSTITUENTINTERESTID
                                )
                                select
                                    CONSTITUENTINTERESTCODEID, NOTE, CONSTITUENTINTERESTID
                                from dbo.UFN_CONSTITUENT_GETINTERESTS_FORUPDATEBATCH_FROMITEMLISTXML(@INTERESTS)

                                --to support deletion of interests

                                --delete from dbo.CONSTITUENTINTEREST

                                --where

                                --CONSTITUENTID = @ID


                                -- SHL BBIS Bug 347432;If the temporary table has an interest that the user already has, we update that interest

                                update OLDI
                                set OLDI.NOTE = NEWI.NOTE, OLDI.CHANGEDBYID = @CHANGEAGENTID, OLDI.DATECHANGED = @CURRENTDATE
                                from dbo.CONSTITUENTINTEREST OLDI
                                inner join @INTERESTTABLE NEWI on NEWI.CONSTITUENTINTERESTID = OLDI.ID

                                --Insert new interests into the CONSTITUENTINTEREST table

                                insert into dbo.CONSTITUENTINTEREST
                                (
                                    CONSTITUENTID,
                                    CONSTITUENTINTERESTCODEID,
                                    NOTE,
                                    ADDEDBYID,
                                    CHANGEDBYID,
                                    DATEADDED,
                                    DATECHANGED
                                )
                                select @ID, CONSTITUENTINTERESTCODEID, NOTE, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
                                from 
                                    @INTERESTTABLE TEMP
                                    where TEMP.CONSTITUENTINTERESTID is null

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

                                --Addresses

                                --===============================================================

                                if exists(select top 1 * from @ADDRESSTABLE)
                                begin

                                    -- If a new primary address is NOT being added to all members of the household, another household

                                    -- has one of the addresses marked as primary, and 'Updated household address'

                                    -- is selected, that address cannot have an end date.

                                    if not exists (
                                            select
                                                1
                                            from
                                                @ADDRESSTABLE ADDRESSTABLE
                                            where
                                                nullif(ADDRESSID, '00000000-0000-0000-0000-000000000000') is null
                                                and ADDRESSTABLE.ISPRIMARY = 1
                                                and ADDRESSTABLE.UPDATEHOUSEHOLD = 1
                                        ) and exists (
                                            select 
                                                1
                                            from
                                                @ADDRESSTABLE ADDRESSTABLE
                                                inner join dbo.ADDRESS CURRENTADDRESS on
                                                    ADDRESSTABLE.ADDRESSID = CURRENTADDRESS.ID
                                                inner join dbo.ADDRESS on
                                                    ADDRESS.ADDRESSBLOCK = CURRENTADDRESS.ADDRESSBLOCK and
                                                    ADDRESS.CITY = CURRENTADDRESS.CITY and
                                                    (ADDRESS.COUNTRYID = CURRENTADDRESS.COUNTRYID or (ADDRESS.COUNTRYID is null and CURRENTADDRESS.COUNTRYID is null)) and
                                                    (ADDRESS.STATEID = CURRENTADDRESS.STATEID or (ADDRESS.STATEID is null and CURRENTADDRESS.STATEID is null)) and
                                                    ADDRESS.POSTCODE = CURRENTADDRESS.POSTCODE
                                                    and ( (ADDRESS.HISTORICALSTARTDATE = CURRENTADDRESS.HISTORICALSTARTDATE) or (ADDRESS.HISTORICALSTARTDATE is null and CURRENTADDRESS.HISTORICALSTARTDATE is null) ) 
                                                    and ( (ADDRESS.HISTORICALENDDATE = CURRENTADDRESS.HISTORICALENDDATE) or (ADDRESS.HISTORICALENDDATE is null and CURRENTADDRESS.HISTORICALENDDATE is null) )
                                            where
                                                ADDRESSTABLE.UPDATEHOUSEHOLD = 1
                                                and ADDRESS.CONSTITUENTID in (select CONSTITID from @MATCHINGCONSTITUENTS)
                                                and ADDRESS.ISPRIMARY = 1
                                                and ADDRESSTABLE.HISTORICALENDDATE is not null
                                        )

                                        raiserror('BBERR_ADDRESS_ENDDATEINVALIDIFPRIMARYFORANOTHERMEMBER', 13, 1);


                                    declare @PRIMARYROWNUM smallint
                                    select TOP(1)
                                        @PRIMARYROWNUM = ROWNUMBER
                                    from
                                        @ADDRESSTABLE
                                    where 
                                        ISPRIMARY = 1
                                    order by ROWNUMBER asc

                                    if not @PRIMARYROWNUM is null begin
                                        update @ADDRESSTABLE
                                        set 
                                            ISPRIMARY = 0
                                        where 
                                            ROWNUMBER <> @PRIMARYROWNUM and ISPRIMARY = 1

                                        update dbo.ADDRESS
                                        set
                                            ISPRIMARY = 0
                                        where
                                            CONSTITUENTID = @ID
                                    end

                                    declare @ADDRESSID uniqueidentifier
                                    declare @ADDRESSTYPECODEID uniqueidentifier
                                    declare @PRIMARY bit
                                    declare @DONOTMAIL bit
                                    declare @STARTDATE dbo.UDT_MONTHDAY
                                    declare @ENDDATE dbo.UDT_MONTHDAY
                                    declare @COUNTRYID uniqueidentifier
                                    declare @STATEID uniqueidentifier
                                    declare @ADDRESSBLOCK nvarchar(150)
                                    declare @CITY nvarchar(50)
                                    declare @POSTCODE nvarchar(12)
                                    declare @CART nvarchar(10)
                                    declare @DPC nvarchar(8)
                                    declare @LOT nvarchar(5)
                                    declare @OMITFROMVALIDATION bit                
                                    declare @COUNTYCODEID uniqueidentifier
                                    declare @CONGRESSIONALDISTRICTCODEID uniqueidentifier
                                    declare @STATEHOUSEDISTRICTCODEID uniqueidentifier
                                    declare @STATESENATEDISTRICTCODEID uniqueidentifier
                                    declare @LOCALPRECINCTCODEID uniqueidentifier
                                    declare @INFOSOURCECODEID uniqueidentifier
                                    declare @REGIONCODEID uniqueidentifier
                                    declare @LASTVALIDATIONATTEMPTDATE datetime
                                    declare @VALIDATIONMESSAGE nvarchar(200)
                                    declare @CERTIFICATIONDATA integer
                                    declare @DONOTMAILREASONCODEID uniqueidentifier
                                    declare @UPDATEFROMREVENUEBATCH bit = 0;
                                    declare @HISTORICALSTARTDATE date
                                    declare @HISTORICALENDDATE date
                                    declare @UPDATEHOUSEHOLD bit
                                    declare @UPDATESPOUSE bit
                                    declare @INFOSOURCECOMMENTS nvarchar(256)

                                    declare ADDRESSCURSOR cursor local fast_forward for
                                    select
                                        ADDRESSID,
                                        ADDRESSTYPECODEID,
                                        ISPRIMARY,
                                        DONOTMAIL,
                                        STARTDATE,
                                        ENDDATE,
                                        COUNTRYID,
                                        STATEID,
                                        ADDRESSBLOCK,
                                        CITY,
                                        POSTCODE,
                                        CART,
                                        DPC,
                                        LOT,
                                        OMITFROMVALIDATION,                
                                        COUNTYCODEID,
                                        CONGRESSIONALDISTRICTCODEID,
                                        STATEHOUSEDISTRICTCODEID,
                                        STATESENATEDISTRICTCODEID,
                                        LOCALPRECINCTCODEID,
                                        INFOSOURCECODEID,
                                        REGIONCODEID,
                                        LASTVALIDATIONATTEMPTDATE,
                                        VALIDATIONMESSAGE,
                                        CERTIFICATIONDATA,
                                        DONOTMAILREASONCODEID,
                                        HISTORICALSTARTDATE,
                                        HISTORICALENDDATE,
                                        case
                                            when UPDATEHOUSEHOLD = 1 and
                                            (@CURRENTCONSTITUENTTYPECODE = 2 or @HASHOUSEHOLD = 1) then
                                                1
                                            else
                                                0
                                        end,
                                        case
                                            when UPDATEHOUSEHOLD = 1 and isnull(@REMOVESPOUSE,0) = 0 and (@CURRENTSPOUSE is not null or @SPOUSE_ID is not null) then
                                                1
                                            else
                                                0
                                        end,
                                        INFOSOURCECOMMENTS
                                    from
                                        @ADDRESSTABLE
                                    order by ISPRIMARY desc, ROWNUMBER asc

                                    open ADDRESSCURSOR;

                                    fetch next from ADDRESSCURSOR into 
                                        @ADDRESSID
                                        @ADDRESSTYPECODEID
                                        @PRIMARY
                                        @DONOTMAIL
                                        @STARTDATE
                                        @ENDDATE
                                        @COUNTRYID
                                        @STATEID
                                        @ADDRESSBLOCK
                                        @CITY
                                        @POSTCODE
                                        @CART
                                        @DPC
                                        @LOT
                                        @OMITFROMVALIDATION
                                        @COUNTYCODEID
                                        @CONGRESSIONALDISTRICTCODEID
                                        @STATEHOUSEDISTRICTCODEID
                                        @STATESENATEDISTRICTCODEID
                                        @LOCALPRECINCTCODEID
                                        @INFOSOURCECODEID
                                        @REGIONCODEID
                                        @LASTVALIDATIONATTEMPTDATE
                                        @VALIDATIONMESSAGE
                                        @CERTIFICATIONDATA
                                        @DONOTMAILREASONCODEID
                                        @HISTORICALSTARTDATE
                                        @HISTORICALENDDATE
                                        @UPDATEHOUSEHOLD,
                                        @UPDATESPOUSE,
                                        @INFOSOURCECOMMENTS;

                                    while (@@FETCH_STATUS = 0)
                                    begin        
                                        if not nullif(@ADDRESSID, '00000000-0000-0000-0000-000000000000') is null begin

                                            exec dbo.USP_DATAFORMTEMPLATE_EDIT_ADDRESS_5
                                                @ID = @ADDRESSID,
                                                @CHANGEAGENTID = @CHANGEAGENTID,
                                                @ADDRESSTYPECODEID = @ADDRESSTYPECODEID,
                                                @PRIMARY = @PRIMARY,
                                                @DONOTMAIL = @DONOTMAIL,
                                                @STARTDATE = @STARTDATE,
                                                @ENDDATE = @ENDDATE,
                                                @COUNTRYID = @COUNTRYID,
                                                @STATEID = @STATEID,
                                                @ADDRESSBLOCK = @ADDRESSBLOCK,
                                                @CITY = @CITY,
                                                @POSTCODE = @POSTCODE,
                                                @CART = @CART,
                                                @DPC = @DPC,
                                                @LOT = @LOT,
                                                @OMITFROMVALIDATION = @OMITFROMVALIDATION,
                                                @COUNTYCODEID = @COUNTYCODEID,
                                                @CONGRESSIONALDISTRICTCODEID = @CONGRESSIONALDISTRICTCODEID,
                                                @STATEHOUSEDISTRICTCODEID = @STATEHOUSEDISTRICTCODEID,
                                                @STATESENATEDISTRICTCODEID = @STATESENATEDISTRICTCODEID,
                                                @LOCALPRECINCTCODEID = @LOCALPRECINCTCODEID,
                                                @INFOSOURCECODEID = @INFOSOURCECODEID,
                                                @REGIONCODEID = @REGIONCODEID,
                                                @LASTVALIDATIONATTEMPTDATE = @LASTVALIDATIONATTEMPTDATE,
                                                @VALIDATIONMESSAGE = @VALIDATIONMESSAGE,
                                                @CERTIFICATIONDATA = @CERTIFICATIONDATA,
                                                @UPDATECONTACTS = 0,
                                                @DONOTMAILREASONCODEID = @DONOTMAILREASONCODEID,
                                                @HISTORICALSTARTDATE = @HISTORICALSTARTDATE,
                                                @HISTORICALENDDATE = @HISTORICALENDDATE,
                                                @UPDATEMATCHINGHOUSEHOLDADDRESSES = @UPDATEHOUSEHOLD,
                                                @INFOSOURCECOMMENTS = @INFOSOURCECOMMENTS
                                        end
                                        else begin                                
                                            exec dbo.USP_ADDRESS_ADD
                                                @ID = @ADDRESSID output,
                                                @CHANGEAGENTID = @CHANGEAGENTID,
                                                @CONSTITUENTID = @ID,
                                                @ADDRESSTYPECODEID = @ADDRESSTYPECODEID,
                                                @PRIMARY = @PRIMARY,
                                                @DONOTMAIL = @DONOTMAIL,
                                                @STARTDATE = @STARTDATE,
                                                @ENDDATE = @ENDDATE,
                                                @COUNTRYID = @COUNTRYID,
                                                @STATEID = @STATEID,
                                                @ADDRESSBLOCK = @ADDRESSBLOCK,
                                                @CITY = @CITY,
                                                @POSTCODE = @POSTCODE,
                                                @CART = @CART,
                                                @DPC = @DPC,
                                                @LOT = @LOT,
                                                @OMITFROMVALIDATION = @OMITFROMVALIDATION,
                                                @COUNTYCODEID = @COUNTYCODEID,
                                                @CONGRESSIONALDISTRICTCODEID = @CONGRESSIONALDISTRICTCODEID,
                                                @STATEHOUSEDISTRICTCODEID = @STATEHOUSEDISTRICTCODEID,
                                                @STATESENATEDISTRICTCODEID = @STATESENATEDISTRICTCODEID,
                                                @LOCALPRECINCTCODEID = @LOCALPRECINCTCODEID,
                                                @INFOSOURCECODEID = @INFOSOURCECODEID,
                                                @REGIONCODEID = @REGIONCODEID,
                                                @LASTVALIDATIONATTEMPTDATE = @LASTVALIDATIONATTEMPTDATE,
                                                @VALIDATIONMESSAGE = @VALIDATIONMESSAGE,
                                                @CERTIFICATIONDATA = @CERTIFICATIONDATA,
                                                @DONOTMAILREASONCODEID = @DONOTMAILREASONCODEID,
                                                @HISTORICALSTARTDATE = @HISTORICALSTARTDATE,
                                                @RECENTMOVE = 0,
                                                @OLDADDRESSID = null,
                                                @UPDATEMATCHINGSPOUSEADDRESSES = @UPDATESPOUSE,
                                                @UPDATEMATCHINGHOUSEHOLDADDRESSES = @UPDATEHOUSEHOLD,
                                                @INFOSOURCECOMMENTS = @INFOSOURCECOMMENTS,
                                                @HISTORICALENDDATE = @HISTORICALENDDATE
                                        end

                                        fetch next from ADDRESSCURSOR into
                                            @ADDRESSID
                                            @ADDRESSTYPECODEID
                                            @PRIMARY
                                            @DONOTMAIL
                                            @STARTDATE
                                            @ENDDATE
                                            @COUNTRYID
                                            @STATEID
                                            @ADDRESSBLOCK
                                            @CITY
                                            @POSTCODE
                                            @CART
                                            @DPC
                                            @LOT
                                            @OMITFROMVALIDATION
                                            @COUNTYCODEID
                                            @CONGRESSIONALDISTRICTCODEID
                                            @STATEHOUSEDISTRICTCODEID
                                            @STATESENATEDISTRICTCODEID
                                            @LOCALPRECINCTCODEID
                                            @INFOSOURCECODEID
                                            @REGIONCODEID
                                            @LASTVALIDATIONATTEMPTDATE
                                            @VALIDATIONMESSAGE
                                            @CERTIFICATIONDATA
                                            @DONOTMAILREASONCODEID
                                            @HISTORICALSTARTDATE
                                            @HISTORICALENDDATE
                                            @UPDATEHOUSEHOLD,
                                            @UPDATESPOUSE
                                            @INFOSOURCECOMMENTS;
                                    end

                                    --When a cursor is used, it should be explicitly closed/deallocated in case of blocking or USP running long

                                    close ADDRESSCURSOR;
                                    deallocate ADDRESSCURSOR;
                                end

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

                                --Email Addresses

                                --===============================================================

                                if exists(select top 1 * from @EMAILADDRESSTABLE)
                                begin        
                                    -- If a new primary email address is NOT being added to all members of the household, another household

                                    -- has one of the email addresses marked as primary, and 'Updated household email addresses'

                                    -- is selected, that email address cannot have an end date.

                                    if not exists (
                                            select
                                                    1
                                                from
                                                    @EMAILADDRESSTABLE EMAILADDRESSTABLE
                                                where
                                                    EMAILADDRESSTABLE.ISPRIMARY = 1
                                                    and EMAILADDRESSTABLE.UPDATEHOUSEHOLD = 1
                                        ) and exists (
                                            select 
                                                1
                                            from
                                                @EMAILADDRESSTABLE EMAILADDRESSTABLE
                                                inner join dbo.EMAILADDRESS on EMAILADDRESS.EMAILADDRESS = EMAILADDRESSTABLE.EMAILADDRESS
                                            where
                                                EMAILADDRESSTABLE.UPDATEHOUSEHOLD = 1
                                                and EMAILADDRESS.CONSTITUENTID in (select CONSTITID from @MATCHINGCONSTITUENTS)
                                                and EMAILADDRESS.ISPRIMARY = 1
                                                and EMAILADDRESSTABLE.ENDDATE is not null
                                        )
                                        raiserror('BBERR_EMAILADDRESS_ENDDATEINVALIDIFPRIMARYFORANOTHERMEMBER', 13, 1);

                                    if exists(select * from @EMAILADDRESSTABLE where ISPRIMARY = 1) begin
                                        update dbo.EMAILADDRESS
                                        set
                                            ISPRIMARY = 0
                                        where
                                            CONSTITUENTID = @ID
                                    end

                                    --Update existing entries in the EMAILADDRESS table for records w/o emailaddressid

                                    update EA
                                    set
                                        EA.EMAILADDRESSTYPECODEID = coalesce(nullif(EAT.EMAILADDRESSTYPECODEID, '00000000-0000-0000-0000-000000000000'), EA.EMAILADDRESSTYPECODEID),
                                        EA.ISPRIMARY = EAT.ISPRIMARY,
                                        EA.DONOTEMAIL = EAT.DONOTEMAIL,
                                        EA.SEQUENCE = coalesce(nullif(EAT.SEQUENCE,''), EA.SEQUENCE),
                                        EA.CHANGEDBYID = @CHANGEAGENTID,
                                        EA.DATECHANGED = @CURRENTDATE,
                                        EA.STARTDATE = EAT.STARTDATE,
                                        EA.ENDDATE = EAT.ENDDATE,
                                        EA.INFOSOURCECODEID = coalesce(nullif(EAT.INFOSOURCECODEID, '00000000-0000-0000-0000-000000000000'), EA.INFOSOURCECODEID),
                                        EA.DONOTEMAILREASONCODEID = coalesce(nullif(EAT.DONOTEMAILREASONCODEID, '00000000-0000-0000-0000-000000000000'), EA.DONOTEMAILREASONCODEID),
                                        EA.INFOSOURCECOMMENTS = EAT.INFOSOURCECOMMENTS
                                    from
                                        dbo.EMAILADDRESS EA
                                        inner join @EMAILADDRESSTABLE EAT on EA.EMAILADDRESS = EAT.EMAILADDRESS and (EA.EMAILADDRESSTYPECODEID = EAT.EMAILADDRESSTYPECODEID or (EA.EMAILADDRESSTYPECODEID is null and EAT.EMAILADDRESSTYPECODEID is null))
                                    where
                                        (EA.CONSTITUENTID = @ID) and
                                        EAT.EMAILADDRESSID is null

                                    --Update existing entries in the EMAILADDRESS table for records with emailaddressid

                                    update EA
                                    set
                                        EA.EMAILADDRESS = EAT.EMAILADDRESS,
                                        EA.EMAILADDRESSTYPECODEID = coalesce(nullif(EAT.EMAILADDRESSTYPECODEID, '00000000-0000-0000-0000-000000000000'), EA.EMAILADDRESSTYPECODEID),
                                        EA.ISPRIMARY = EAT.ISPRIMARY,
                                        EA.DONOTEMAIL = EAT.DONOTEMAIL,
                                        EA.SEQUENCE = coalesce(nullif(EAT.SEQUENCE,''), EA.SEQUENCE),
                                        EA.CHANGEDBYID = @CHANGEAGENTID,
                                        EA.DATECHANGED = @CURRENTDATE,
                                        EA.STARTDATE = EAT.STARTDATE,
                                        EA.ENDDATE = EAT.ENDDATE,
                                        EA.INFOSOURCECODEID = coalesce(nullif(EAT.INFOSOURCECODEID, '00000000-0000-0000-0000-000000000000'), EA.INFOSOURCECODEID),
                                        EA.DONOTEMAILREASONCODEID = coalesce(nullif(EAT.DONOTEMAILREASONCODEID, '00000000-0000-0000-0000-000000000000'), EA.DONOTEMAILREASONCODEID),
                                        EA.INFOSOURCECOMMENTS = EAT.INFOSOURCECOMMENTS
                                    from
                                        dbo.EMAILADDRESS EA
                                        inner join @EMAILADDRESSTABLE EAT on EA.ID = EAT.EMAILADDRESSID
                                    where
                                        (EA.CONSTITUENTID = @ID

                                    -- update for households

                                    -- Per 271319, do *not* update ISPRIMARY on the matching email addresses.

                                    -- Per 372612, do not update the matching spouse DONOTEMAIL and ENDDATE if the constituent update end date rule (UPDATEDBYRULES) is enabled

                                    update dbo.EMAILADDRESS
                                    set
                                        EMAILADDRESS.EMAILADDRESS = EAT.EMAILADDRESS,
                                        EMAILADDRESS.EMAILADDRESSTYPECODEID = coalesce(nullif(EAT.EMAILADDRESSTYPECODEID, '00000000-0000-0000-0000-000000000000'), EMAILADDRESS.EMAILADDRESSTYPECODEID),
                                        EMAILADDRESS.DONOTEMAIL = case when EAT.UPDATEDBYRULES = 0 then EAT.DONOTEMAIL else EMAILADDRESS.DONOTEMAIL end,
                                        EMAILADDRESS.SEQUENCE = coalesce(nullif(EAT.SEQUENCE,''), EMAILADDRESS.SEQUENCE),
                                        EMAILADDRESS.CHANGEDBYID = @CHANGEAGENTID,
                                        EMAILADDRESS.DATECHANGED = @CURRENTDATE,
                                        EMAILADDRESS.STARTDATE = EAT.STARTDATE,
                                        EMAILADDRESS.ENDDATE = case when EAT.UPDATEDBYRULES = 0 then EAT.ENDDATE else EMAILADDRESS.ENDDATE end,
                                        EMAILADDRESS.INFOSOURCECODEID = coalesce(nullif(EAT.INFOSOURCECODEID, '00000000-0000-0000-0000-000000000000'), EMAILADDRESS.INFOSOURCECODEID),
                                        EMAILADDRESS.DONOTEMAILREASONCODEID = coalesce(nullif(EAT.DONOTEMAILREASONCODEID, '00000000-0000-0000-0000-000000000000'), EMAILADDRESS.DONOTEMAILREASONCODEID),
                                        EMAILADDRESS.INFOSOURCECOMMENTS = EAT.INFOSOURCECOMMENTS
                                    from    
                                        dbo.EMAILADDRESS
                                        inner join @EMAILADDRESSTABLE EAT on 
                                            EMAILADDRESS.EMAILADDRESS = EAT.OLDEMAILADDRESS 
                                            and (
                                                EMAILADDRESS.EMAILADDRESSTYPECODEID = EAT.OLDEMAILADDRESSTYPECODEID or (EMAILADDRESS.EMAILADDRESSTYPECODEID is null and EAT.OLDEMAILADDRESSTYPECODEID is null)
                                            )
                                    where
                                        ((EMAILADDRESS.CONSTITUENTID in (select CONSTITID from @MATCHINGCONSTITUENTS)) and (EAT.UPDATEHOUSEHOLD = 1));

                                    insert into dbo.EMAILADDRESS
                                    (
                                        CONSTITUENTID, 
                                        EMAILADDRESSTYPECODEID, EMAILADDRESS, ISPRIMARY, DONOTEMAIL, SEQUENCE,
                                        ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED, STARTDATE, ENDDATE, INFOSOURCECODEID, DONOTEMAILREASONCODEID,
                                        INFOSOURCECOMMENTS
                                    )
                                    select 
                                        @ID
                                        EAT.EMAILADDRESSTYPECODEID, EAT.EMAILADDRESS, EAT.ISPRIMARY, EAT.DONOTEMAIL, EAT.SEQUENCE,
                                        @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE, EAT.STARTDATE, EAT.ENDDATE, EAT.INFOSOURCECODEID, EAT.DONOTEMAILREASONCODEID,
                                        EAT.INFOSOURCECOMMENTS
                                    from 
                                        @EMAILADDRESSTABLE EAT
                                    where EAT.EMAILADDRESSID is null and not exists(
                                        select ID 
                                        from dbo.EMAILADDRESS
                                        where 
                                            CONSTITUENTID = @ID and 
                                            EMAILADDRESS.EMAILADDRESS = EAT.EMAILADDRESS and 
                                            (
                                                EMAILADDRESS.EMAILADDRESSTYPECODEID = EAT.EMAILADDRESSTYPECODEID or 
                                                (
                                                    EMAILADDRESS.EMAILADDRESSTYPECODEID is null and EAT.EMAILADDRESSTYPECODEID is null
                                                )
                                            )
                                        )

                                    declare @EMAILADDRESSESTOINSERT table
                                    (
                                        ROW int,
                                        ISPRIMARY bit,
                                        MATCHINGCONSTITUENTID uniqueidentifier,
                                        MATCHINGCONSTITUENTHASPRIMARY bit
                                    )

                                    --create a table of email addresses to add to the constituent's household and members of the household

                                    insert into @EMAILADDRESSESTOINSERT
                                    select 
                                        EAT.ROW, EAT.ISPRIMARY, MC.CONSTITID, case when EMAILADDRESS.ID is null then 0 else 1 end
                                    from 
                                        @MATCHINGCONSTITUENTS MC
                                        join @EMAILADDRESSTABLE EAT on EAT.UPDATEHOUSEHOLD = 1
                                        left join dbo.EMAILADDRESS on EMAILADDRESS.CONSTITUENTID = MC.CONSTITID and EMAILADDRESS.ISPRIMARY = 1
                                    where 
                                        EAT.EMAILADDRESSID is null 
                                        and not exists
                                        (
                                            select 
                                                CONSTITUENTID 
                                            from 
                                                dbo.EMAILADDRESS 
                                            where
                                                CONSTITUENTID = MC.CONSTITID and
                                                EMAILADDRESS.EMAILADDRESS = EAT.EMAILADDRESS and 
                                                (
                                                    EMAILADDRESS.EMAILADDRESSTYPECODEID = EAT.EMAILADDRESSTYPECODEID or 
                                                    (
                                                        EMAILADDRESS.EMAILADDRESSTYPECODEID is null and 
                                                        EAT.EMAILADDRESSTYPECODEID is null
                                                    )
                                                )
                                        )

                                    --for the household or members who do not already have a primary email address, choose one of the email addresses to insert as the primary

                                    update 
                                        @EMAILADDRESSESTOINSERT
                                    set
                                        ISPRIMARY = 1
                                    from
                                        @EMAILADDRESSESTOINSERT E
                                        inner join 
                                        (
                                            select 
                                                min(ROW) as ROW
                                                MATCHINGCONSTITUENTID 
                                            from 
                                                @EMAILADDRESSESTOINSERT
                                            where
                                                MATCHINGCONSTITUENTHASPRIMARY = 0
                                            group by
                                                MATCHINGCONSTITUENTID
                                            having
                                                sum(cast(ISPRIMARY as int)) = 0
                                        ) MATCHINGCONSTITUENTSWITHNOPRIMARYEMAIL 
                                            on E.ROW = MATCHINGCONSTITUENTSWITHNOPRIMARYEMAIL.ROW and E.MATCHINGCONSTITUENTID = MATCHINGCONSTITUENTSWITHNOPRIMARYEMAIL.MATCHINGCONSTITUENTID

                                    --add the new email addresses to the household and members

                                    insert into dbo.EMAILADDRESS
                                    (
                                        CONSTITUENTID, 
                                        EMAILADDRESSTYPECODEID, EMAILADDRESS, ISPRIMARY, DONOTEMAIL, SEQUENCE,
                                        CHANGEDBYID, ADDEDBYID, DATECHANGED, DATEADDED, STARTDATE, ENDDATE, INFOSOURCECODEID, DONOTEMAILREASONCODEID, INFOSOURCECOMMENTS
                                    )
                                    select
                                        EMAILADDRESSTOINSERT.MATCHINGCONSTITUENTID,
                                        EAT.EMAILADDRESSTYPECODEID, 
                                        EAT.EMAILADDRESS,
                                        case EMAILADDRESSTOINSERT.MATCHINGCONSTITUENTHASPRIMARY 
                                            when 1 
                                                then 0 --if the constituent already has a primary email address, add the new email address as non-primary

                                            else 
                                                EMAILADDRESSTOINSERT.ISPRIMARY
                                        end,
                                        EAT.DONOTEMAIL, 
                                        EAT.SEQUENCE,
                                        @CHANGEAGENTID
                                        @CHANGEAGENTID
                                        @CURRENTDATE
                                        @CURRENTDATE
                                        EAT.STARTDATE, 
                                        EAT.ENDDATE, 
                                        EAT.INFOSOURCECODEID,
                                        EAT.DONOTEMAILREASONCODEID,
                                        EAT.INFOSOURCECOMMENTS
                                    from 
                                        @EMAILADDRESSESTOINSERT EMAILADDRESSTOINSERT
                                        inner join @EMAILADDRESSTABLE EAT on EMAILADDRESSTOINSERT.ROW = EAT.ROW

                                end

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

                                --Phone Numbers

                                --===============================================================

                                if exists(select top 1 * from @PHONENUMBERTABLE)
                                begin    
                                    -- If a new primary phone number is NOT being added to all members of the household, another household

                                    -- has one of the phone numbers marked as primary, and 'Updated household phone numbers'

                                    -- is selected, that phone number cannot have an end date.

                                    if not exists (
                                            select
                                                    1
                                                from
                                                    @PHONENUMBERTABLE PHONENUMBERTABLE
                                                where
                                                    PHONENUMBERTABLE.ISPRIMARY = 1
                                                    and PHONENUMBERTABLE.UPDATEHOUSEHOLD = 1
                                        ) and exists (
                                            select 
                                                1
                                            from
                                                @PHONENUMBERTABLE PHONENUMBERTABLE
                                                inner join dbo.PHONE on PHONE.NUMBER = PHONENUMBERTABLE.NUMBER
                                            where
                                                PHONENUMBERTABLE.UPDATEHOUSEHOLD = 1
                                                and PHONE.CONSTITUENTID in (select CONSTITID from @MATCHINGCONSTITUENTS)
                                                and PHONE.ISPRIMARY = 1
                                                and PHONENUMBERTABLE.ENDDATE is not null
                                        )
                                        raiserror('BBERR_PHONE_ENDDATEINVALIDIFPRIMARYFORANOTHERMEMBER', 13, 1);

                                    if exists(select * from @PHONENUMBERTABLE where ISPRIMARY = 1) begin
                                        update dbo.PHONE
                                        set
                                            ISPRIMARY = 0
                                        where
                                            CONSTITUENTID = @ID
                                    end

                                    --Update existing entries in the PHONE table where phoneid is null

                                    update P
                                    set
                                        P.PHONETYPECODEID = coalesce(nullif(PT.PHONETYPECODEID, '00000000-0000-0000-0000-000000000000'), P.PHONETYPECODEID),
                                        P.ISPRIMARY = PT.ISPRIMARY,
                                        P.DONOTCALL = PT.DONOTCALL,
                                        P.SEQUENCE = coalesce(nullif(PT.SEQUENCE,''), P.SEQUENCE),
                                        P.COUNTRYID = PT.COUNTRYID,
                                        P.SEASONALSTARTDATE=PT.SEASONALSTARTDATE,
                                        P.SEASONALENDDATE=PT.SEASONALENDDATE,
                                        P.STARTTIME=PT.STARTTIME,
                                        P.ENDTIME=PT.ENDTIME,
                                        P.STARTDATE = PT.STARTDATE,
                                        P.ENDDATE = PT.ENDDATE,
                                        P.CHANGEDBYID = @CHANGEAGENTID,
                                        P.DATECHANGED = @CURRENTDATE,
                                        P.INFOSOURCECODEID = coalesce(nullif(PT.INFOSOURCECODEID, '00000000-0000-0000-0000-000000000000'), P.INFOSOURCECODEID),
                                        P.DONOTTEXT = PT.DONOTTEXT,
                                        P.INFOSOURCECOMMENTS = PT.INFOSOURCECOMMENTS
                                    from
                                        dbo.PHONE P
                                        inner join @PHONENUMBERTABLE PT on P.NUMBER = PT.NUMBER and ((P.PHONETYPECODEID is not null and PT.PHONETYPECODEID is not null and P.PHONETYPECODEID = PT.PHONETYPECODEID) or (P.PHONETYPECODEID is null and PT.PHONETYPECODEID is null))

                                    where
                                        (P.CONSTITUENTID = @ID) and PT.PHONEID is null

                                    --Update existing entries in the PHONE table where phoneid is NOT null

                                    update P
                                    set
                                        P.NUMBER = PT.NUMBER,
                                        P.PHONETYPECODEID = coalesce(nullif(PT.PHONETYPECODEID, '00000000-0000-0000-0000-000000000000'), P.PHONETYPECODEID),
                                        P.ISPRIMARY = PT.ISPRIMARY,
                                        P.DONOTCALL = PT.DONOTCALL,
                                        P.SEQUENCE = coalesce(nullif(PT.SEQUENCE,''), P.SEQUENCE),
                                        P.COUNTRYID = PT.COUNTRYID,
                                        P.SEASONALSTARTDATE=PT.SEASONALSTARTDATE,
                                        P.SEASONALENDDATE=PT.SEASONALENDDATE,
                                        P.STARTTIME=PT.STARTTIME,
                                        P.ENDTIME=PT.ENDTIME,
                                        P.STARTDATE = PT.STARTDATE,
                                        P.ENDDATE = PT.ENDDATE,
                                        P.CHANGEDBYID = @CHANGEAGENTID,
                                        P.DATECHANGED = @CURRENTDATE,
                                        P.INFOSOURCECODEID = coalesce(nullif(PT.INFOSOURCECODEID, '00000000-0000-0000-0000-000000000000'), P.INFOSOURCECODEID),
                                        P.DONOTTEXT = PT.DONOTTEXT,
                                        P.INFOSOURCECOMMENTS = PT.INFOSOURCECOMMENTS
                                    from
                                        dbo.PHONE P
                                        inner join @PHONENUMBERTABLE PT on P.ID = PT.PHONEID
                                    where
                                        (P.CONSTITUENTID = @ID)

                                    -- Update matching phone numbers in the household.

                                    -- Per 271319, do *not* update ISPRIMARY on the matching phone numbers.

                                    -- Per 372612, do not update the matching spouse DONOTCALL and ENDDATE if the constituent update end date rule (UPDATEDBYRULES) is enabled

                                    update dbo.PHONE
                                    set
                                        PHONE.NUMBER = PT.NUMBER,
                                        PHONE.PHONETYPECODEID = coalesce(nullif(PT.PHONETYPECODEID, '00000000-0000-0000-0000-000000000000'), PHONE.PHONETYPECODEID),
                                        PHONE.DONOTCALL = case when PT.UPDATEDBYRULES = 0 then PT.DONOTCALL else PHONE.DONOTCALL end,
                                        PHONE.SEQUENCE = coalesce(nullif(PT.SEQUENCE,''), PHONE.SEQUENCE),
                                        PHONE.COUNTRYID = PT.COUNTRYID,
                                        PHONE.SEASONALSTARTDATE=PT.SEASONALSTARTDATE,
                                        PHONE.SEASONALENDDATE=PT.SEASONALENDDATE,
                                        PHONE.STARTTIME=PT.STARTTIME,
                                        PHONE.ENDTIME=PT.ENDTIME,
                                        PHONE.STARTDATE = PT.STARTDATE,
                                        PHONE.ENDDATE = case when PT.UPDATEDBYRULES = 0 then PT.ENDDATE else PHONE.ENDDATE end,
                                        PHONE.CHANGEDBYID = @CHANGEAGENTID,
                                        PHONE.DATECHANGED = @CURRENTDATE,
                                        PHONE.INFOSOURCECODEID =  coalesce(nullif(PT.INFOSOURCECODEID, '00000000-0000-0000-0000-000000000000'), PHONE.INFOSOURCECODEID),
                                        PHONE.DONOTTEXT = PT.DONOTTEXT,
                                        PHONE.INFOSOURCECOMMENTS = PT.INFOSOURCECOMMENTS
                                    from
                                        dbo.PHONE
                                        inner join @PHONENUMBERTABLE PT on PHONE.NUMBER = PT.OLDNUMBER 
                                            and (
                                                (PHONE.PHONETYPECODEID is not null and PT.OLDPHONETYPECODEID is not null and PHONE.PHONETYPECODEID = PT.OLDPHONETYPECODEID) or (PHONE.PHONETYPECODEID is null and PT.OLDPHONETYPECODEID is null)
                                            )
                                    where
                                        ((PHONE.CONSTITUENTID in (select CONSTITID from @MATCHINGCONSTITUENTS)) and (PT.UPDATEHOUSEHOLD = 1));

                                    insert into dbo.PHONE
                                    (
                                        CONSTITUENTID, 
                                        PHONETYPECODEID, NUMBER, ISPRIMARY, DONOTCALL, SEQUENCE, COUNTRYID, 
                                        SEASONALSTARTDATE, SEASONALENDDATE, STARTTIME, ENDTIME, STARTDATE, ENDDATE,
                                        ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED, INFOSOURCECODEID, DONOTTEXT, INFOSOURCECOMMENTS
                                    )
                                    select 
                                        @ID
                                        PT.PHONETYPECODEID, PT.NUMBER, PT.ISPRIMARY, PT.DONOTCALL, PT.SEQUENCE, PT.COUNTRYID, 
                                        PT.SEASONALSTARTDATE, PT.SEASONALENDDATE, PT.STARTTIME, PT.ENDTIME, PT.STARTDATE, PT.ENDDATE,
                                        @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE, PT.INFOSOURCECODEID, PT.DONOTTEXT, PT.INFOSOURCECOMMENTS
                                    from 
                                        @PHONENUMBERTABLE PT
                                    where PT.PHONEID is null and not exists(
                                        select ID 
                                        from dbo.PHONE
                                        where 
                                            CONSTITUENTID = @ID and
                                            NUMBER = PT.NUMBER and ((PHONETYPECODEID is not null and PT.PHONETYPECODEID is not null and PHONETYPECODEID = PT.PHONETYPECODEID) or (PHONETYPECODEID is null and PT.PHONETYPECODEID is null)))

                                    declare @PHONENUMBERSTOINSERT table
                                    (
                                        ROW int,
                                        ISPRIMARY bit,
                                        MATCHINGCONSTITUENTID uniqueidentifier,
                                        MATCHINGCONSTITUENTHASPRIMARY bit
                                    )

                                    --create a table of phones to add to the constituent's household and members of the household

                                    insert into @PHONENUMBERSTOINSERT
                                    select 
                                        PT.ROW, PT.ISPRIMARY, MC.CONSTITID, case when PHONE.ID is null then 0 else 1 end
                                    from 
                                        @MATCHINGCONSTITUENTS MC
                                        join @PHONENUMBERTABLE PT on PT.UPDATEHOUSEHOLD = 1
                                        left join dbo.PHONE on PHONE.CONSTITUENTID = MC.CONSTITID and PHONE.ISPRIMARY = 1
                                    where 
                                        PT.PHONEID is null 
                                        and not exists
                                        (
                                            select 
                                                PHONE.CONSTITUENTID 
                                            from 
                                                dbo.PHONE 
                                            where
                                                PHONE.CONSTITUENTID = MC.CONSTITID and
                                                PHONE.NUMBERNOFORMAT = dbo.UFN_PHONE_REMOVEFORMATTING(PT.NUMBER) and 
                                                (
                                                    (PHONE.PHONETYPECODEID is not null and PT.PHONETYPECODEID is not null and PHONE.PHONETYPECODEID = PT.PHONETYPECODEID) or 
                                                    (PHONE.PHONETYPECODEID is null and PT.PHONETYPECODEID is null)
                                                )
                                        )

                                    --for the household or members who do not already have a primary phone, choose one of the phone to insert as the primary

                                    update 
                                        @PHONENUMBERSTOINSERT
                                    set
                                        ISPRIMARY = 1
                                    from
                                        @PHONENUMBERSTOINSERT P
                                        inner join 
                                        (
                                            select 
                                                min(ROW) as ROW
                                                MATCHINGCONSTITUENTID 
                                            from 
                                                @PHONENUMBERSTOINSERT
                                            where
                                                MATCHINGCONSTITUENTHASPRIMARY = 0
                                            group by
                                                MATCHINGCONSTITUENTID
                                            having
                                                sum(cast(ISPRIMARY as int)) = 0
                                        ) MATCHINGCONSTITUENTSWITHNOPRIMARYPHONE
                                            on P.ROW = MATCHINGCONSTITUENTSWITHNOPRIMARYPHONE.ROW and P.MATCHINGCONSTITUENTID = MATCHINGCONSTITUENTSWITHNOPRIMARYPHONE.MATCHINGCONSTITUENTID

                                    --add the new phones to the household and members

                                    insert into dbo.PHONE
                                    (
                                        CONSTITUENTID, 
                                        PHONETYPECODEID, NUMBER, ISPRIMARY, DONOTCALL, SEQUENCE, COUNTRYID,
                                        SEASONALSTARTDATE, SEASONALENDDATE, STARTTIME, ENDTIME, STARTDATE, ENDDATE,
                                        ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED, INFOSOURCECODEID, DONOTTEXT, INFOSOURCECOMMENTS
                                    )
                                    select
                                        PHONETOINSERT.MATCHINGCONSTITUENTID,
                                        PT.PHONETYPECODEID, 
                                        PT.NUMBER
                                        case PHONETOINSERT.MATCHINGCONSTITUENTHASPRIMARY 
                                            when 1 
                                                then 0 --if the constituent already has a primary phone, add the new phone as non-primary

                                            else 
                                                PHONETOINSERT.ISPRIMARY
                                        end,
                                        PT.DONOTCALL, 
                                        PT.SEQUENCE
                                        PT.COUNTRYID, 
                                        PT.SEASONALSTARTDATE, 
                                        PT.SEASONALENDDATE,PT.STARTTIME, 
                                        PT.ENDTIME, 
                                        PT.STARTDATE, 
                                        PT.ENDDATE,
                                        @CHANGEAGENTID
                                        @CHANGEAGENTID
                                        @CURRENTDATE
                                        @CURRENTDATE
                                        @INFOSOURCECODEID,
                                        PT.DONOTTEXT,
                                        PT.INFOSOURCECOMMENTS
                                    from
                                        @PHONENUMBERSTOINSERT PHONETOINSERT
                                        inner join @PHONENUMBERTABLE PT on PHONETOINSERT.ROW = PT.ROW

                                    --If no primary phone number exists at the end of the updates and inserts, set the primary phone to the existing primary phone before the changes were made.

                                    if @EXISTINGPRIMARYPHONEID is not null and not exists (select 1 from dbo.PHONE where CONSTITUENTID = @ID and ISPRIMARY = 1)
                                    begin
                                        update 
                                            dbo.PHONE
                                        set
                                            ISPRIMARY = 1,
                                            DONOTCALL = @EXISTINGPRIMARYPHONEDONOTCALL,
                                            ENDDATE = NULL,
                                            CHANGEDBYID = @CHANGEAGENTID,
                                            DATECHANGED = @CURRENTDATE
                                        where
                                            ID = @EXISTINGPRIMARYPHONEID;
                                    end

                                end


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

                                --Social media accounts

                                --===============================================================

                                if exists(select top 1 * from @SOCIALMEDIAACCOUNTTABLE)
                                begin    
                                    --Update existing entries in the SOCIALMEDIAACCOUNT table where SOCIALMEDIAACCOUNTID is null

                                    update 
                                        dbo.SOCIALMEDIAACCOUNT
                                    set
                                        SOCIALMEDIAACCOUNT.URL = ST.URL,
                                        SOCIALMEDIAACCOUNT.SOCIALMEDIAACCOUNTTYPECODEID = coalesce(nullif(ST.SOCIALMEDIAACCOUNTTYPECODEID, '00000000-0000-0000-0000-000000000000'), SOCIALMEDIAACCOUNT.SOCIALMEDIAACCOUNTTYPECODEID),
                                        SOCIALMEDIAACCOUNT.INFOSOURCECODEID = coalesce(nullif(ST.INFOSOURCECODEID, '00000000-0000-0000-0000-000000000000'), SOCIALMEDIAACCOUNT.INFOSOURCECODEID),
                                        SOCIALMEDIAACCOUNT.DONOTCONTACT = ST.DONOTCONTACT,
                                        SOCIALMEDIAACCOUNT.SEQUENCE = coalesce(nullif(ST.SEQUENCE,''), SOCIALMEDIAACCOUNT.SEQUENCE),                    
                                        SOCIALMEDIAACCOUNT.CHANGEDBYID = @CHANGEAGENTID,
                                        SOCIALMEDIAACCOUNT.DATECHANGED = @CURRENTDATE
                                    from
                                        dbo.SOCIALMEDIAACCOUNT
                                        inner join @SOCIALMEDIAACCOUNTTABLE ST on SOCIALMEDIAACCOUNT.SOCIALMEDIASERVICEID = ST.SOCIALMEDIASERVICEID
                                            and SOCIALMEDIAACCOUNT.USERID = ST.USERID
                                            and (SOCIALMEDIAACCOUNT.SOCIALMEDIAACCOUNTTYPECODEID = ST.SOCIALMEDIAACCOUNTTYPECODEID or (SOCIALMEDIAACCOUNT.SOCIALMEDIAACCOUNTTYPECODEID is null and ST.SOCIALMEDIAACCOUNTTYPECODEID is null))
                                    where
                                        SOCIALMEDIAACCOUNT.CONSTITUENTID = @ID and ST.SOCIALMEDIAACCOUNTID is null;

                                    --Update existing entries in the SOCIALMEDIAACCOUNT table for records with socialmediaaccountid

                                    update 
                                        dbo.SOCIALMEDIAACCOUNT
                                    set
                                        SOCIALMEDIAACCOUNT.SOCIALMEDIASERVICEID = ST.SOCIALMEDIASERVICEID,
                                        SOCIALMEDIAACCOUNT.USERID = ST.USERID,
                                        SOCIALMEDIAACCOUNT.URL = ST.URL,
                                        SOCIALMEDIAACCOUNT.SOCIALMEDIAACCOUNTTYPECODEID = coalesce(nullif(ST.SOCIALMEDIAACCOUNTTYPECODEID, '00000000-0000-0000-0000-000000000000'), SOCIALMEDIAACCOUNT.SOCIALMEDIAACCOUNTTYPECODEID),
                                        SOCIALMEDIAACCOUNT.INFOSOURCECODEID = coalesce(nullif(ST.INFOSOURCECODEID, '00000000-0000-0000-0000-000000000000'), SOCIALMEDIAACCOUNT.INFOSOURCECODEID),
                                        SOCIALMEDIAACCOUNT.DONOTCONTACT = ST.DONOTCONTACT,
                                        SOCIALMEDIAACCOUNT.SEQUENCE = coalesce(nullif(ST.SEQUENCE,''), SOCIALMEDIAACCOUNT.SEQUENCE),
                                        SOCIALMEDIAACCOUNT.CHANGEDBYID = @CHANGEAGENTID,
                                        SOCIALMEDIAACCOUNT.DATECHANGED = @CURRENTDATE
                                    from
                                        dbo.SOCIALMEDIAACCOUNT
                                        inner join @SOCIALMEDIAACCOUNTTABLE ST on SOCIALMEDIAACCOUNT.ID = ST.SOCIALMEDIAACCOUNTID
                                    where
                                        SOCIALMEDIAACCOUNT.CONSTITUENTID = @ID;

                                    insert into dbo.SOCIALMEDIAACCOUNT
                                    (
                                        CONSTITUENTID, 
                                        SOCIALMEDIASERVICEID, 
                                        USERID, 
                                        URL, 
                                        SOCIALMEDIAACCOUNTTYPECODEID, 
                                        INFOSOURCECODEID, 
                                        DONOTCONTACT, 
                                        SEQUENCE,
                                        ADDEDBYID, 
                                        CHANGEDBYID, 
                                        DATEADDED, 
                                        DATECHANGED
                                    )
                                    select 
                                        @ID,
                                        ST.SOCIALMEDIASERVICEID, 
                                        ST.USERID, 
                                        ST.URL, 
                                        ST.SOCIALMEDIAACCOUNTTYPECODEID, 
                                        ST.INFOSOURCECODEID, 
                                        ST.DONOTCONTACT, 
                                        ST.SEQUENCE,
                                        @CHANGEAGENTID
                                        @CHANGEAGENTID
                                        @CURRENTDATE
                                        @CURRENTDATE
                                    from 
                                        @SOCIALMEDIAACCOUNTTABLE ST
                                    where 
                                        ST.SOCIALMEDIAACCOUNTID is null
                                        and not exists(
                                            select 
                                                ID 
                                            from 
                                                dbo.SOCIALMEDIAACCOUNT
                                            where 
                                                CONSTITUENTID = @ID 
                                                and SOCIALMEDIASERVICEID = ST.SOCIALMEDIASERVICEID
                                                and USERID = ST.USERID
                                                and (
                                                    SOCIALMEDIAACCOUNT.SOCIALMEDIAACCOUNTTYPECODEID = ST.SOCIALMEDIAACCOUNTTYPECODEID or 
                                                    (
                                                        SOCIALMEDIAACCOUNT.SOCIALMEDIAACCOUNTTYPECODEID is null and ST.SOCIALMEDIAACCOUNTTYPECODEID is null
                                                    )
                                                )
                                        )
                                end

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

                                --Relationships

                                --===============================================================

                                if exists(select top 1 * from @RELATIONSHIPTABLE)
                                begin        

                                    begin try
                                        insert into dbo.RELATIONSHIPSET
                                        (
                                            ID,
                                            ADDEDBYID,
                                            CHANGEDBYID,
                                            DATEADDED,
                                            DATECHANGED
                                        )
                                        select
                                            RT.RELATIONSHIPSETID,
                                            @CHANGEAGENTID,
                                            @CHANGEAGENTID,
                                            @CURRENTDATE,
                                            @CURRENTDATE
                                        from
                                            @RELATIONSHIPTABLE RT
                                        where not exists(
                                            select 
                                                ID 
                                            from 
                                                dbo.RELATIONSHIP
                                            where 
                                                RELATIONSHIPCONSTITUENTID = @ID 
                                                and RECIPROCALCONSTITUENTID = RT.RECIPROCALCONSTITUENTID
                                                and RELATIONSHIPTYPECODEID = RT.RELATIONSHIPTYPECODEID
                                                and RECIPROCALTYPECODEID = RT.RECIPROCALTYPECODEID
                                        )

                                        insert into dbo.RELATIONSHIP
                                        (
                                            RELATIONSHIPCONSTITUENTID, 
                                            RECIPROCALCONSTITUENTID, 
                                            RELATIONSHIPTYPECODEID, 
                                            RECIPROCALTYPECODEID, 
                                            STARTDATE, 
                                            RELATIONSHIPSETID,
                                            ADDEDBYID, 
                                            CHANGEDBYID, 
                                            DATEADDED, 
                                            DATECHANGED
                                        )
                                        select 
                                            @ID,
                                            RT.RECIPROCALCONSTITUENTID, 
                                            RT.RELATIONSHIPTYPECODEID, 
                                            RT.RECIPROCALTYPECODEID, 
                                            RT.STARTDATE, 
                                            RT.RELATIONSHIPSETID,
                                            @CHANGEAGENTID
                                            @CHANGEAGENTID
                                            @CURRENTDATE
                                            @CURRENTDATE
                                        from 
                                            @RELATIONSHIPTABLE RT
                                        where 
                                            not exists(
                                                select 
                                                    ID 
                                                from 
                                                    dbo.RELATIONSHIP
                                                where 
                                                    RELATIONSHIPCONSTITUENTID = @ID 
                                                    and RECIPROCALCONSTITUENTID = RT.RECIPROCALCONSTITUENTID
                                                    and RELATIONSHIPTYPECODEID = RT.RELATIONSHIPTYPECODEID
                                                    and RECIPROCALTYPECODEID = RT.RECIPROCALTYPECODEID
                                            )
                                    end try
                                    begin catch
                                        exec dbo.USP_RAISE_ERROR 2;
                                        return 1;
                                    end catch

                                end

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

                                --Constituencies

                                --===============================================================

                                                                -- moved logic in a SP so it can be re-used (ERB needs this functionality)


                                                                exec dbo.USP_CONSTITUENTUPDATEBATCH_ADDCONSTITUENCIES @CONSTITUENCYTABLE, @ID, @PROSPECTMANAGERFUNDRAISERID, @CHANGEAGENTID;

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

                                --Primary business information

                                --===============================================================


                                --There's something in the business fields, so go forward with updating the business

                                if nullif(@BUSINESS_ID, '00000000-0000-0000-0000-000000000000') is not null or (@BUSINESS_NAME is not null and @BUSINESS_NAME <> '') or (@BUSINESS_LOOKUPID is not null and @BUSINESS_LOOKUPID <> '') begin

                                    declare @BUSINESS_ISNEWRECORD bit = 0
                                    --Update info for the current business if the current business is still the primary business

                                    if (@OLD_BUSINESS_ID is not null and @BUSINESS_ID is not null and @OLD_BUSINESS_ID = @BUSINESS_ID) or (coalesce(@OLD_BUSINESS_LOOKUPID, '') <> '' and coalesce(@BUSINESS_LOOKUPID, '') <> '' and @OLD_BUSINESS_LOOKUPID = @BUSINESS_LOOKUPID) begin
                                        if @BUSINESS_ID is null
                                            set @BUSINESS_ID = @OLD_BUSINESS_ID

                                        begin try
                                            update B
                                            set
                                                B.CUSTOMIDENTIFIER = coalesce(nullif(@BUSINESS_LOOKUPID, ''), B.CUSTOMIDENTIFIER),
                                                B.KEYNAME = coalesce(nullif(@BUSINESS_NAME, ''), B.KEYNAME),
                                                B.WEBADDRESS = coalesce(nullif(@BUSINESS_WEBADDRESS, ''), B.WEBADDRESS),
                                                B.CHANGEDBYID = @CHANGEAGENTID,
                                                B.DATECHANGED = @CURRENTDATE
                                            from
                                                dbo.CONSTITUENT B
                                            where 
                                                B.ID = @BUSINESS_ID
                                        end try
                                        begin catch
                                            set @InfoMsg='BBERR_ORIGINAL_ERROR:50005';
                                            raiserror(@InfoMsg,1,11);

                                            select
                                                @ErrorMessage = ERROR_MESSAGE(),
                                                @ErrorSeverity = ERROR_SEVERITY(),
                                                @ErrorState = ERROR_STATE();

                                            raiserror(@ErrorMessage,@ErrorSeverity,@ErrorState);
                                            return 1;
                                        end catch

                                        --The business didn't have any organization data, so make some

                                        if not exists(select ID from dbo.ORGANIZATIONDATA where ID = @BUSINESS_ID)
                                            insert into dbo.ORGANIZATIONDATA
                                            (
                                                ID,
                                                CHANGEDBYID, ADDEDBYID, DATECHANGED, DATEADDED
                                            )
                                            values
                                            (
                                                @BUSINESS_ID,
                                                @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
                                            )

                                        update OD
                                        set
                                            OD.INDUSTRYCODEID = coalesce(nullif(@BUSINESS_INDUSTRYCODEID, '00000000-0000-0000-0000-000000000000'), OD.INDUSTRYCODEID),
                                            OD.NUMEMPLOYEES = coalesce(nullif(@BUSINESS_NUMEMPLOYEES, '0'), OD.NUMEMPLOYEES),
                                            OD.NUMSUBSIDIARIES = coalesce(nullif(@BUSINESS_NUMSUBSIDIARIES, '0'), OD.NUMSUBSIDIARIES),
                                            OD.PARENTCORPID = coalesce(nullif(@BUSINESS_PARENTCORPID, '00000000-0000-0000-0000-000000000000'), OD.PARENTCORPID),
                                            OD.CHANGEDBYID = @CHANGEAGENTID,
                                            OD.DATECHANGED = @CURRENTDATE
                                        from 
                                            dbo.ORGANIZATIONDATA OD
                                        where
                                            OD.ID = @BUSINESS_ID

                                        --Update the relationship

                                        begin try
                                        update BR
                                            set
                                                BR.RELATIONSHIPTYPECODEID = coalesce(nullif(@BUSINESS_RELATIONSHIPTYPECODEID, '00000000-0000-0000-0000-000000000000'), BR.RELATIONSHIPTYPECODEID),
                                                BR.RECIPROCALTYPECODEID = coalesce(nullif(@BUSINESS_RECIPROCALTYPECODEID, '00000000-0000-0000-0000-000000000000'), BR.RECIPROCALTYPECODEID),
                                                BR.CHANGEDBYID = @CHANGEAGENTID,
                                                BR.DATECHANGED = @CURRENTDATE
                                            from
                                                dbo.RELATIONSHIP BR
                                            where
                                                BR.RELATIONSHIPCONSTITUENTID = @ID and BR.ISPRIMARYBUSINESS = 1
                                        end try
                                        begin catch
                                            exec dbo.USP_RAISE_ERROR 3;
                                            return 1;
                                        end catch
                                    end
                                    --Add a new business relationship if one does not currently exist or if it is different from current

                                    else if @OLD_BUSINESS_ID is null or (@OLD_BUSINESS_ID <> @BUSINESS_ID) or (@BUSINESS_NAME is not null and @BUSINESS_NAME <> '') begin
                                        --If the new business is not the old business do not use any fields auto-loaded by the template that were not included in the batch.

                                        --These are the old business's fields.

                                        if @BATCHROWID is not null
                                            select
                                                @BUSINESS_ID = [BUSINESS_ID],
                                                @BUSINESS_ADDRESSBLOCK = [BUSINESS_ADDRESSBLOCK],
                                                @BUSINESS_ADDRESSTYPECODEID = [BUSINESS_ADDRESSTYPECODEID],
                                                @BUSINESS_CART = [BUSINESS_CART],
                                                @BUSINESS_CITY = [BUSINESS_CITY],
                                                @BUSINESS_COUNTRYID = [BUSINESS_COUNTRYID],
                                                @BUSINESS_DONOTMAIL = coalesce([BUSINESS_DONOTMAIL], '0'),
                                                @BUSINESS_DONOTMAILREASONCODEID = [BUSINESS_DONOTMAILREASONCODEID],
                                                @BUSINESS_DPC = [BUSINESS_DPC],
                                                @BUSINESS_EMAILADDRESS = [BUSINESS_EMAILADDRESS],
                                                @BUSINESS_EMAILADDRESSTYPECODEID = [BUSINESS_EMAILADDRESSTYPECODEID],
                                                @BUSINESS_INDUSTRYCODEID = [BUSINESS_INDUSTRYCODEID],
                                                @BUSINESS_LOOKUPID = [BUSINESS_LOOKUPID],
                                                @BUSINESS_LOT = [BUSINESS_LOT],
                                                @BUSINESS_NAME = [BUSINESS_NAME],
                                                @BUSINESS_NUMEMPLOYEES = [BUSINESS_NUMEMPLOYEES],
                                                @BUSINESS_NUMSUBSIDIARIES = [BUSINESS_NUMSUBSIDIARIES],
                                                @BUSINESS_PARENTCORPID = [BUSINESS_PARENTCORPID],
                                                @BUSINESS_PHONENUMBER = [BUSINESS_PHONENUMBER],
                                                @BUSINESS_PHONETYPECODEID = [BUSINESS_PHONETYPECODEID],
                                                @BUSINESS_RELATIONSHIPTYPECODEID = [BUSINESS_RELATIONSHIPTYPECODEID],
                                                @BUSINESS_RECIPROCALTYPECODEID = [BUSINESS_RECIPROCALTYPECODEID],
                                                @BUSINESS_STATEID = [BUSINESS_STATEID],
                                                @BUSINESS_WEBADDRESS = [BUSINESS_WEBADDRESS],
                                                @BUSINESS_POSTCODE = [BUSINESS_POSTCODE],
                                                @BUSINESS_RELATIONSHIPTYPECODEIDSIMPLELIST = [BUSINESS_RELATIONSHIPTYPECODEID],
                                                @BUSINESS_RECIPROCALTYPECODEIDSIMPLELIST = [BUSINESS_RECIPROCALTYPECODEID],
                                                @BUSINESS_PRIMARYSOFTCREDITRELATIONSHIPEXISTS = [BUSINESS_PRIMARYSOFTCREDITRELATIONSHIPEXISTS],
                                                @BUSINESS_PRIMARYSOFTCREDITMATCHFACTOR = [BUSINESS_PRIMARYSOFTCREDITMATCHFACTOR],
                                                @BUSINESS_RECIPROCALSOFTCREDITRELATIONSHIPEXISTS = [BUSINESS_RECIPROCALSOFTCREDITRELATIONSHIPEXISTS],
                                                @BUSINESS_RECIPROCALSOFTCREDITMATCHFACTOR = [BUSINESS_RECIPROCALSOFTCREDITMATCHFACTOR],
                                                @BUSINESS_PRIMARYRECOGNITIONTYPECODEID = [BUSINESS_PRIMARYRECOGNITIONTYPECODEID],
                                                @BUSINESS_RECIPROCALRECOGNITIONTYPECODEID = [BUSINESS_RECIPROCALRECOGNITIONTYPECODEID],
                                                @BUSINESS_EMAILADDRESSSTARTDATE = [BUSINESS_EMAILADDRESSSTARTDATE]
                                            from
                                                dbo.BATCHCONSTITUENTUPDATE
                                            where
                                                BATCHCONSTITUENTUPDATE.ID = @BATCHROWID

                                        --Insert a new business into the CONSTITUENT table if an existing one wasn't chosen

                                        if @BUSINESS_ID is null and @BUSINESS_NAME is not null and @BUSINESS_NAME <> '' begin
                                            set @BUSINESS_ID = newid();
                                            set @BUSINESS_ISNEWRECORD = 1;

                                            begin try                                            
                                                insert into dbo.CONSTITUENT
                                                (
                                                    ID,
                                                    CUSTOMIDENTIFIER, 
                                                    KEYNAME, 
                                                    WEBADDRESS, 
                                                    ISORGANIZATION,
                                                    CHANGEDBYID, 
                                                    ADDEDBYID, 
                                                    DATECHANGED, 
                                                    DATEADDED
                                                )
                                                values
                                                (
                                                    @BUSINESS_ID,
                                                    coalesce(@BUSINESS_LOOKUPID, ''),
                                                    coalesce(@BUSINESS_NAME, ''),
                                                    coalesce(@BUSINESS_WEBADDRESS, ''),
                                                    1,
                                                    @CHANGEAGENTID
                                                    @CHANGEAGENTID
                                                    @CURRENTDATE
                                                    @CURRENTDATE
                                                )

                                                if isnull(context_info(),0x) = 0xE2DF375A033A104382689B8EAC5165AD
                                                begin
                                                        insert into dbo.SEARCHCONSTITUENT 
                                                        (
                                                                ID,
                                                                CONSTITUENTID,
                                                                ADDRESSID,
                                                                KEYNAME,
                                                                FIRSTNAME,
                                                                MIDDLENAME,
                                                                NAMETYPECODE,
                                                                TITLECODEID,
                                                                SUFFIXCODEID,
                                                                COUNTRYID,
                                                                POSTCODE,
                                                                STREETNUMBER,
                                                                STREETNAME,
                                                                ISORGANIZATION,
                                                                ISGROUP,
                                                                ALIASID
                                                        )
                                                        select 
                                                                newid(),
                                                                CONSITTUENTALLNAMES.ID,
                                                                ADDRESS.ID,
                                                                CONSITTUENTALLNAMES.KEYNAME,
                                                                CONSITTUENTALLNAMES.FIRSTNAME,
                                                                CONSITTUENTALLNAMES.MIDDLENAME,
                                                                CONSITTUENTALLNAMES.NAMETYPECODE,
                                                                CONSITTUENTALLNAMES.TITLECODEID,
                                                                CONSITTUENTALLNAMES.SUFFIXCODEID,
                                                                ADDRESS.COUNTRYID,
                                                                case when ADDRESS.POSTCODE is null 
                                                                        then '' 
                                                                when ltrim(rtrim(ADDRESS.POSTCODE)) like '[0-9][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]' 
                                                                        then left(ltrim(ADDRESS.POSTCODE), 5
                                                                else 
                                                                        ltrim(rtrim(ADDRESS.POSTCODE)) 
                                                                end,
                                                                isnull(PARSEDADDRESS.STREETNUMBER, ''),
                                                                coalesce(PARSEDADDRESS.STREETNAME, ab.CLEANADDRESSBLOCK,''),
                                                                CONSITTUENTALLNAMES.ISORGANIZATION,
                                                                CONSITTUENTALLNAMES.ISGROUP,
                                                                CONSITTUENTALLNAMES.ALIASID
                                                        from dbo.V_CONSTITUENTALLNAMES CONSITTUENTALLNAMES
                                                        left join dbo.ADDRESS on 
                                                                ADDRESS.CONSTITUENTID = CONSITTUENTALLNAMES.ID
                                                        outer apply (select ltrim(rtrim(upper(replace(replace(replace(replace(replace(replace(replace(replace(
                                                                                                ADDRESS.ADDRESSBLOCK,'.',''),'-',' '),',',' '),
                                                                                                char(13)+char(10),' '),char(10)+char(13),' '),char(13),' '),char(10),' '),'  ',' ')))) CLEANADDRESSBLOCK) ab
                                                        outer apply (select left(CLEANADDRESSBLOCK,charindex(' ', CLEANADDRESSBLOCK) -1) STREETNUMBER,
                                                                                                right(CLEANADDRESSBLOCK,len(CLEANADDRESSBLOCK)-charindex(' ',CLEANADDRESSBLOCK)) STREETNAME
                                                                                where dbo.UFN_REGULAREXPRESSIONMATCH('(?:^[A-Z]?[\d-]+[A-Z]? (?:.|\n)+$)',CLEANADDRESSBLOCK) = 1
                                                                                and charindex(' ', CLEANADDRESSBLOCK) <= 13) PARSEDADDRESS
                                                        where 
                                                                CONSITTUENTALLNAMES.ID = @BUSINESS_ID
                                                                and CONSITTUENTALLNAMES.KEYNAME <> '';
                                                end
                                            end try
                                            begin catch
                                                set @InfoMsg='BBERR_ORIGINAL_ERROR:50003';
                                                raiserror(@InfoMsg,1,11);

                                                select
                                                    @ErrorMessage = ERROR_MESSAGE(),
                                                    @ErrorSeverity = ERROR_SEVERITY(),
                                                    @ErrorState = ERROR_STATE();

                                                raiserror(@ErrorMessage,@ErrorSeverity,@ErrorState);
                                                return 1;
                                            end catch

                                            insert into dbo.ORGANIZATIONDATA
                                            (
                                                ID,
                                                INDUSTRYCODEID,
                                                NUMEMPLOYEES,
                                                NUMSUBSIDIARIES,
                                                PARENTCORPID,
                                                CHANGEDBYID,
                                                ADDEDBYID,
                                                DATECHANGED,
                                                DATEADDED
                                            )
                                            values
                                            (
                                                @BUSINESS_ID,
                                                @BUSINESS_INDUSTRYCODEID,
                                                coalesce(@BUSINESS_NUMEMPLOYEES, 0), 
                                                coalesce(@BUSINESS_NUMSUBSIDIARIES, 0),
                                                @BUSINESS_PARENTCORPID,
                                                @CHANGEAGENTID,
                                                @CHANGEAGENTID,
                                                @CURRENTDATE,
                                                @CURRENTDATE
                                            )
                                        end

                                        --Update the organization data for the business

                                        update dbo.ORGANIZATIONDATA
                                        set
                                            INDUSTRYCODEID = coalesce(nullif(@BUSINESS_INDUSTRYCODEID, '00000000-0000-0000-0000-000000000000'), INDUSTRYCODEID),
                                            NUMEMPLOYEES = coalesce(nullif(@BUSINESS_NUMEMPLOYEES, '0'), NUMEMPLOYEES),
                                            NUMSUBSIDIARIES = coalesce(nullif(@BUSINESS_NUMSUBSIDIARIES, '0'), NUMSUBSIDIARIES),
                                            PARENTCORPID = coalesce(nullif(@BUSINESS_PARENTCORPID, '00000000-0000-0000-0000-000000000000'), PARENTCORPID),
                                            CHANGEDBYID = @CHANGEAGENTID,
                                            DATECHANGED = @CURRENTDATE
                                        where
                                            ID = @BUSINESS_ID

                                        -- update the old business relationship to not be primary

                                        if not @OLD_BUSINESS_ID is null begin
                                            update
                                                dbo.RELATIONSHIP
                                            set
                                                ISPRIMARYBUSINESS = 0
                                            where
                                                RELATIONSHIPCONSTITUENTID = @ID and
                                                RECIPROCALCONSTITUENTID = @ID and
                                                ISPRIMARYBUSINESS = 1;
                                        end

                                        --Add a new relationship for the business

                                        if not exists(
                                            select ID from dbo.RELATIONSHIP 
                                            where RELATIONSHIPCONSTITUENTID = @ID and RECIPROCALCONSTITUENTID = @BUSINESS_ID)
                                        begin
                                            begin try
                                                set @SETID  = newid();

                                                insert into dbo.RELATIONSHIPSET
                                                (
                                                    ID,
                                                    ADDEDBYID,
                                                    CHANGEDBYID,
                                                    DATEADDED,
                                                    DATECHANGED
                                                )
                                                values
                                                (
                                                    @SETID,
                                                    @CHANGEAGENTID,
                                                    @CHANGEAGENTID,
                                                    @CURRENTDATE,
                                                    @CURRENTDATE
                                                );                      

                                                insert into dbo.RELATIONSHIP
                                                (
                                                    RELATIONSHIPCONSTITUENTID, RECIPROCALCONSTITUENTID, 
                                                    RELATIONSHIPTYPECODEID, RECIPROCALTYPECODEID, ISPRIMARYBUSINESS, RELATIONSHIPSETID,
                                                    ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
                                                )
                                                values
                                                (
                                                    @ID, @BUSINESS_ID
                                                    @BUSINESS_RELATIONSHIPTYPECODEID, @BUSINESS_RECIPROCALTYPECODEID, 1, @SETID,
                                                    @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
                                                )
                                            end try
                                            begin catch
                                                exec dbo.USP_RAISE_ERROR 3;
                                                return 1;
                                            end catch
                                        end

                                        --Update the new business relationship

                                        begin try
                                            update BR
                                            set
                                                BR.RELATIONSHIPTYPECODEID = coalesce(nullif(@BUSINESS_RELATIONSHIPTYPECODEID, '00000000-0000-0000-0000-000000000000'), BR.RELATIONSHIPTYPECODEID),
                                                BR.RECIPROCALTYPECODEID = coalesce(nullif(@BUSINESS_RECIPROCALTYPECODEID, '00000000-0000-0000-0000-000000000000'), BR.RECIPROCALTYPECODEID),
                                                BR.ISPRIMARYBUSINESS = 1,
                                                BR.CHANGEDBYID = @CHANGEAGENTID,
                                                BR.DATECHANGED = @CURRENTDATE
                                            from
                                                dbo.RELATIONSHIP BR
                                            where
                                                BR.RELATIONSHIPCONSTITUENTID = @ID and BR.RECIPROCALCONSTITUENTID = @BUSINESS_ID
                                        end try
                                        begin catch
                                            exec dbo.USP_RAISE_ERROR 3;
                                            return 1;
                                        end catch

                                        exec dbo.USP_RELATIONSHIPCONFIGURATION_CONFIGURE @ID, @BUSINESS_ID, @BUSINESS_RELATIONSHIPTYPECODEID, @BUSINESS_RECIPROCALTYPECODEID, @CHANGEAGENTID, @CURRENTDATE

                                    end

                                    --If a primary address still does not exist (an address was not updated) then

                                    --insert a new one.  Do the same for email and phone number.

                                    if @BUSINESS_ISNEWRECORD = 1
                                    begin
                                        if @BUSINESS_COUNTRYID is not null
                                        begin
                                            insert into dbo.ADDRESS
                                            (
                                                CONSTITUENTID,
                                                ADDRESSBLOCK,
                                                ADDRESSTYPECODEID,
                                                CART,
                                                CITY,
                                                COUNTRYID,
                                                DONOTMAIL,
                                                DONOTMAILREASONCODEID,
                                                DPC,
                                                ISPRIMARY,
                                                LOT,
                                                STATEID,
                                                POSTCODE,
                                                ADDEDBYID,
                                                CHANGEDBYID,
                                                DATEADDED,
                                                DATECHANGED
                                            )
                                            values
                                            (
                                                @BUSINESS_ID,
                                                coalesce(@BUSINESS_ADDRESSBLOCK, ''),
                                                @BUSINESS_ADDRESSTYPECODEID,
                                                coalesce(@BUSINESS_CART, ''),
                                                coalesce(@BUSINESS_CITY, ''),
                                                @BUSINESS_COUNTRYID,
                                                @BUSINESS_DONOTMAIL,
                                                @BUSINESS_DONOTMAILREASONCODEID,
                                                coalesce(@BUSINESS_DPC, ''),
                                                1,
                                                coalesce(@BUSINESS_LOT, ''),
                                                @BUSINESS_STATEID,
                                                coalesce(@BUSINESS_POSTCODE, ''),
                                                @CHANGEAGENTID,
                                                @CHANGEAGENTID,
                                                @CURRENTDATE,
                                                @CURRENTDATE
                                            )
                                        end

                                        if @BUSINESS_EMAILADDRESS is not null 
                                            and @BUSINESS_EMAILADDRESS <> ''
                                        begin
                                            insert into dbo.EMAILADDRESS
                                            (
                                                CONSTITUENTID, 
                                                EMAILADDRESS,
                                                EMAILADDRESSTYPECODEID,
                                                ISPRIMARY,
                                                STARTDATE,
                                                ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
                                            )
                                            values
                                            (
                                                @BUSINESS_ID,
                                                @BUSINESS_EMAILADDRESS,
                                                @BUSINESS_EMAILADDRESSTYPECODEID,
                                                1,
                                                @BUSINESS_EMAILADDRESSSTARTDATE,
                                                @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
                                            )
                                        end

                                        if @BUSINESS_PHONENUMBER is not null 
                                            and @BUSINESS_PHONENUMBER <> ''
                                        begin
                                            insert into dbo.PHONE
                                            (
                                                CONSTITUENTID, 
                                                NUMBER, PHONETYPECODEID, ISPRIMARY, COUNTRYID,
                                                ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
                                            )
                                            values
                                            (
                                                @BUSINESS_ID,
                                                @BUSINESS_PHONENUMBER, @BUSINESS_PHONETYPECODEID, 1, @BUSINESS_PHONE_COUNTRYID,
                                                @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
                                            )
                                        end
                                    end

                                                                exec dbo.USP_RECOGNITIONDEFAULTSUPDATE @BUSINESS_ID, @ID, null, null,
                                                                    @BUSINESS_PRIMARYSOFTCREDITRELATIONSHIPEXISTS, @BUSINESS_PRIMARYSOFTCREDITMATCHFACTOR,
                                                                    @BUSINESS_PRIMARYRECOGNITIONTYPECODEID, @BUSINESS_RECIPROCALSOFTCREDITRELATIONSHIPEXISTS,
                                                                    @BUSINESS_RECIPROCALSOFTCREDITMATCHFACTOR, @BUSINESS_RECIPROCALRECOGNITIONTYPECODEID,
                                                                    @CHANGEAGENTID;

                                end

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

                        -- SHL BBIS BUG 275573; Registrants should not receive emails unless otherwise specified

                        --======================================================================================

                        if @REQUESTSNOEMAIL = 1
                        begin
                            -- Retrieve the ID of the solicit code being used to flag do not email.

                            declare @NOEMAILSOLICITCODEID uniqueidentifier;
                            select top 1 @NOEMAILSOLICITCODEID=DONOTEMAILSOLICITCODEID
                            from dbo.NETCOMMUNITYDEFAULTCODEMAP;

                            if @NOEMAILSOLICITCODEID is not null
                            begin         
                                if not exists(select 1 from dbo.CONSTITUENTSOLICITCODE SC where SC.SOLICITCODEID = @NOEMAILSOLICITCODEID and SC.CONSTITUENTID = @ID)
                                begin 
                                    exec dbo.USP_CONSTITUENTSOLICITCODE_ADD null, @NOEMAILSOLICITCODEID, @ID, null, null, '', @CHANGEAGENTID;
                                end
                            end
                        end

                        end try
                            begin catch
                                exec dbo.USP_RAISE_ERROR;
                                return 1;
                            end catch
                        end

                        return 0;