USP_DATAFORMTEMPLATE_ADD_CONSTITUENTUPDATEBATCHTEMPLATE

The save procedure used by the add dataform template "Constituent Update Batch Template Add Form".

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier INOUT The output parameter indicating the ID of the record added.
@CHANGEAGENTID uniqueidentifier IN Input parameter indicating the ID of the change agent invoking the procedure.
@VALIDATEONLY bit IN Validate only
@CONSTITUENTTYPECODE tinyint IN Constituent type
@BIRTHDATE UDT_FUZZYDATE IN Birth date
@FIRSTNAME nvarchar(50) IN First name
@GENDERCODE tinyint IN Gender
@GIVESANONYMOUSLY bit IN Gives anonymously
@KEYNAME nvarchar(100) IN Last name
@LOOKUPID nvarchar(100) IN Lookup ID
@MAIDENNAME nvarchar(100) IN Maiden name
@MIDDLENAME nvarchar(50) IN Middle name
@NICKNAME nvarchar(50) IN Nickname
@SUFFIXCODEID uniqueidentifier IN Suffix
@TITLECODEID uniqueidentifier IN Title
@WEBADDRESS UDT_WEBADDRESS IN Website
@ALTERNATELOOKUPIDS xml IN Alternate lookup ID
@SECURITYATTRIBUTES xml IN Security attributes
@DECEASED bit IN Deceased
@DECEASEDDATE UDT_FUZZYDATE IN Deceased date
@CONSTITUENT_SITEID uniqueidentifier IN Constituent site
@INTERESTS xml IN Interests
@PROSPECTMANAGERFUNDRAISERID uniqueidentifier IN Prospect manager
@ADDRESSES xml IN Addresses
@EMAILADDRESSES xml IN Email addresses
@PHONES xml IN Phones
@CONSTITUENCIES xml IN Constituencies
@GROUPTYPEID uniqueidentifier IN Group type
@GROUPDESCRIPTION nvarchar(300) IN Group description
@GROUPSTARTDATE date IN Group consolidation date
@ORG_INDUSTRYCODEID uniqueidentifier IN Constituent's industry
@ORG_NUMEMPLOYEES int IN Number of employees
@ORG_NUMSUBSIDIARIES int IN Number of subsidiaries
@ORG_PARENTCORPID uniqueidentifier IN Parent corporation
@MARITALSTATUSCODEID uniqueidentifier IN Marital status
@SPOUSE_ID uniqueidentifier IN Spouse
@SPOUSE_BIRTHDATE UDT_FUZZYDATE IN Spouse birth date
@SPOUSE_FIRSTNAME nvarchar(50) IN Spouse first name
@SPOUSE_GENDERCODE tinyint IN Spouse gender
@SPOUSE_LASTNAME nvarchar(100) IN Spouse last name
@SPOUSE_LOOKUPID nvarchar(100) IN Spouse lookup ID
@SPOUSE_MAIDENNAME nvarchar(100) IN Spouse maiden name
@SPOUSE_MIDDLENAME nvarchar(50) IN Spouse middle name
@SPOUSE_NICKNAME nvarchar(50) IN Spouse nickname
@SPOUSE_SUFFIXCODEID uniqueidentifier IN Spouse suffix
@SPOUSE_TITLECODEID uniqueidentifier IN Spouse title
@SPOUSE_RELATIONSHIPTYPECODEID uniqueidentifier IN Relation to spouse
@SPOUSE_RECIPROCALTYPECODEID uniqueidentifier IN Spouse's relation to constituent
@BUSINESS_ADDRESSBLOCK nvarchar(150) IN Business address
@BUSINESS_ADDRESSTYPECODEID uniqueidentifier IN Business address type
@BUSINESS_CART nvarchar(10) IN Business CART
@BUSINESS_CITY nvarchar(50) IN Business city
@BUSINESS_COUNTRYID uniqueidentifier IN Business country
@BUSINESS_DONOTMAIL bit IN Business do not mail
@BUSINESS_DONOTMAILREASONCODEID uniqueidentifier IN Business do not mail reason
@BUSINESS_DPC nvarchar(8) IN Business DPC
@BUSINESS_EMAILADDRESS UDT_EMAILADDRESS IN Business email address
@BUSINESS_EMAILADDRESSTYPECODEID uniqueidentifier IN Business email type
@BUSINESS_INDUSTRYCODEID uniqueidentifier IN Industry
@BUSINESS_LOOKUPID nvarchar(100) IN Business lookup ID
@BUSINESS_LOT nvarchar(5) IN Business LOT
@BUSINESS_ID uniqueidentifier IN Business
@BUSINESS_NAME nvarchar(100) IN Business name
@BUSINESS_NUMEMPLOYEES int IN Business number of employees
@BUSINESS_NUMSUBSIDIARIES int IN Business number of subsidiaries
@BUSINESS_PARENTCORPID uniqueidentifier IN Business parent organization
@BUSINESS_PHONENUMBER nvarchar(100) IN Business phone number
@BUSINESS_PHONE_COUNTRYID uniqueidentifier IN Business phone number country
@BUSINESS_PHONETYPECODEID uniqueidentifier IN Business phone type
@BUSINESS_RELATIONSHIPTYPECODEID uniqueidentifier IN Relation to business
@BUSINESS_RECIPROCALTYPECODEID uniqueidentifier IN Business's relation to constituent
@BUSINESS_STATEID uniqueidentifier IN Business state
@BUSINESS_WEBADDRESS UDT_WEBADDRESS IN Business website
@BUSINESS_POSTCODE nvarchar(12) IN Business ZIP
@CURRENTAPPUSERID uniqueidentifier IN Input parameter indicating the ID of the current user.
@SPOUSE_RELATIONSHIPTYPECODEIDSIMPLELIST uniqueidentifier IN Spouse relationship type
@SPOUSE_RECIPROCALTYPECODEIDSIMPLELIST uniqueidentifier IN Spouse reciprocal type
@BUSINESS_RELATIONSHIPTYPECODEIDSIMPLELIST uniqueidentifier IN Business relationship type
@BUSINESS_RECIPROCALTYPECODEIDSIMPLELIST uniqueidentifier IN Business reciprocal type
@BUSINESS_PRIMARYSOFTCREDITRELATIONSHIPEXISTS bit IN Apply recognition from business
@BUSINESS_PRIMARYSOFTCREDITMATCHFACTOR decimal(5, 2) IN Recognition from business match percent
@BUSINESS_RECIPROCALSOFTCREDITRELATIONSHIPEXISTS bit IN Apply recognition to business
@BUSINESS_RECIPROCALSOFTCREDITMATCHFACTOR decimal(5, 2) IN Recognition to business match percent
@BUSINESS_PRIMARYRECOGNITIONTYPECODEID uniqueidentifier IN Recognition from business type
@BUSINESS_RECIPROCALRECOGNITIONTYPECODEID uniqueidentifier IN Recognition to business type
@BUSINESS_EMAILADDRESSSTARTDATE date IN Business email start date
@SPOUSE_PRIMARYSOFTCREDITRELATIONSHIPEXISTS bit IN Apply recognition from spouse
@SPOUSE_PRIMARYSOFTCREDITMATCHFACTOR decimal(5, 2) IN Recognition from spouse match percent
@SPOUSE_RECIPROCALSOFTCREDITRELATIONSHIPEXISTS bit IN Apply recognition to spouse
@SPOUSE_RECIPROCALSOFTCREDITMATCHFACTOR decimal(5, 2) IN Recognition to spouse match percent
@SPOUSE_PRIMARYRECOGNITIONTYPECODEID uniqueidentifier IN Recognition from spouse type
@SPOUSE_RECIPROCALRECOGNITIONTYPECODEID uniqueidentifier IN Recognition to spouse type
@CONSTITUENT_SITES xml IN Constituent sites
@BATCHOWNERID uniqueidentifier IN Batch owner ID
@SPOUSE_ALTERNATELOOKUPIDS xml IN Spouse alternate lookup IDs
@ROWFROMBATCHUI bit IN
@BBNCTRANID int IN
@REMOVESPOUSE bit IN
@SOCIALMEDIAACCOUNTS xml IN
@RELATIONSHIPS xml IN
@NETCOMMUNITYTRANSACTIONPROCESSORID uniqueidentifier IN
@NAMEFORMATS xml IN
@REQUESTSNOEMAIL bit IN
@SOLICITCODES xml IN
@GENDERCODEID uniqueidentifier IN
@SPOUSE_GENDERCODEID uniqueidentifier IN

Definition

Copy


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

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

                    ) as
                        set nocount on;

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

                        if @ID is null
                            set @ID = newid()

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

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

                        declare @SETID uniqueidentifier = newid();

                        -- Perform validation

                        if exists (select 1 from dbo.CONSTITUENT where LOOKUPID = @LOOKUPID)
                        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_RECIPROCALSOFTCREDITRELATIONSHIPEXISTS = 1
                        begin
                            if @BUSINESS_RECIPROCALSOFTCREDITMATCHFACTOR <= 0 or @BUSINESS_RECIPROCALSOFTCREDITMATCHFACTOR > 100
                            raiserror('BBERR_BUSINESS_INVALIDRECIPROCALMATCHFACTOR', 13, 1);
                        end

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

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

                        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

                        --Check for existing spouse relationships and existing household memberships

                        if @SPOUSE_ID is not null
                        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

                            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 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) 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

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

                        declare @ADDRESSTABLE table
                        (
                            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,
                            INFOSOURCECOMMENTS nvarchar(256)
                        )
                        insert into @ADDRESSTABLE
                        (
                            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,
                            INFOSOURCECOMMENTS
                        )
                        select
                            ADDRESSBLOCK,
                            ENDDATE,
                            STARTDATE, 
                            dbo.UFN_DATE_GETEARLIESTTIME(HISTORICALSTARTDATE), 
                            dbo.UFN_DATE_GETEARLIESTTIME(HISTORICALENDDATE),
                            ADDRESSTYPECODEID,
                            CART,
                            CERTIFICATIONDATA,
                            CITY,
                            CONGRESSIONALDISTRICTCODEID,
                            COUNTRYID, 
                            COUNTYCODEID,
                            case
                                when HISTORICALENDDATE is not null then
                                    1
                                else
                                    DONOTMAIL
                            end as DONOTMAIL,
                            case
                                when DONOTMAIL = 1 or HISTORICALENDDATE is not null then
                                    DONOTMAILREASONCODEID
                                else
                                    null
                            end as DONOTMAILREASONCODEID,
                            DPC,
                            INFOSOURCECODEID,
                            ISPRIMARY, 
                            LASTVALIDATIONATTEMPTDATE,
                            LOCALPRECINCTCODEID,
                            LOT, 
                            OMITFROMVALIDATION,
                            REGIONCODEID,
                            STATEID, 
                            STATEHOUSEDISTRICTCODEID,
                            STATESENATEDISTRICTCODEID,
                            VALIDATIONMESSAGE,
                            POSTCODE,
                            SEQUENCE,
                            UPDATEHOUSEHOLD,
                            INFOSOURCECOMMENTS
                        from dbo.UFN_CONSTITUENT_GETADDRESSES_FORUPDATEBATCH_FROMITEMLISTXML(@ADDRESSES)

                        if exists(select top 1 * from @ADDRESSTABLE)
                        begin                            
                            declare @PRIMARYADDRESSEXISTS bit
                            set @PRIMARYADDRESSEXISTS = 0

                            if exists(select ADDRESSBLOCK from @ADDRESSTABLE where ISPRIMARY = 1)
                                set @PRIMARYADDRESSEXISTS = 1

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

                            -- 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

                            -- 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);

                            -- #253763 Check to see if there are duplicate addresses.  Same address type and same address

                            if exists (    select COUNT(*)
                                        from @ADDRESSTABLE a1
                                        where  HISTORICALENDDATE is null
                                        group by ADDRESSBLOCK,ADDRESSTYPECODEID,CITY,COUNTRYID,STATEID,POSTCODE
                                        HAVING COUNT(*) > 1)
                                            raiserror('BBERR_ADDRESS_DUPLICATENOTALLOWED', 13, 1);                                    

                        end

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

                        declare @EMAILADDRESSTABLE table
                        (
                            EMAILADDRESSTYPECODEID uniqueidentifier,
                            EMAILADDRESS dbo.UDT_EMAILADDRESS,
                            ISPRIMARY bit,
                            DONOTEMAIL bit,
                            SEQUENCE int,
                            UPDATEHOUSEHOLD bit,
                            STARTDATE datetime,
                            ENDDATE datetime,
                            INFOSOURCECODEID uniqueidentifier,
                            DONOTEMAILREASONCODEID uniqueidentifier,
                            INFOSOURCECOMMENTS nvarchar(256)
                        )
                        insert into @EMAILADDRESSTABLE
                        (
                            EMAILADDRESSTYPECODEID,
                            EMAILADDRESS,
                            ISPRIMARY,
                            DONOTEMAIL,
                            SEQUENCE,
                            UPDATEHOUSEHOLD,
                            STARTDATE,
                            ENDDATE,    
                            INFOSOURCECODEID,
                            DONOTEMAILREASONCODEID,
                            INFOSOURCECOMMENTS
                        )
                        select
                            EMAILADDRESSTYPECODEID,
                            EMAILADDRESS,
                            ISPRIMARY,
                            case
                                when ENDDATE is not null then
                                    1
                                else
                                    DONOTEMAIL
                            end as DONOTEMAIL,
                            SEQUENCE,
                            UPDATEHOUSEHOLD,
                            dbo.UFN_DATE_GETEARLIESTTIME(STARTDATE),
                            dbo.UFN_DATE_GETEARLIESTTIME(ENDDATE),
                            INFOSOURCECODEID,
                            DONOTEMAILREASONCODEID,
                            ISNULL(INFOSOURCECOMMENTS,'')
                        from dbo.UFN_CONSTITUENT_GETEMAILADDRESSES_WITHDATES_FORUPDATEBATCH_FROMITEMLISTXML(@EMAILADDRESSES)

                        if exists(select top 1 * from @EMAILADDRESSTABLE)
                        begin
                            declare @PRIMARYEMAILADDRESSEXISTS bit
                            set @PRIMARYEMAILADDRESSEXISTS = 0

                            if exists(select EMAILADDRESS from @EMAILADDRESSTABLE where ISPRIMARY = 1)
                                set @PRIMARYEMAILADDRESSEXISTS = 1

                            if @PRIMARYEMAILADDRESSEXISTS = 0 begin
                                raiserror('Constituent must have a primary email address.', 13, 1);
                                return 1;
                            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);

                            -- #253763 Check to see if there are duplicate email addresses.  Same email address type and same address

                            if exists (    select COUNT(*)
                                        from @EMAILADDRESSTABLE a1
                                        where  ENDDATE is null
                                        group by EMAILADDRESS,EMAILADDRESSTYPECODEID
                                        HAVING COUNT(*) > 1)
                                            raiserror('BBERR_EMAILADDRESS_DUPLICATENOTALLOWED', 13, 1);        

                        end

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

                        declare @PHONENUMBERTABLE table
                        (
                            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, 
                            DONOTTEXT bit,
                            INFOSOURCECOMMENTS nvarchar(256)
                        )
                        insert into @PHONENUMBERTABLE
                        (
                            PHONETYPECODEID,
                            NUMBER,
                            ISPRIMARY,
                            DONOTCALL,
                            SEQUENCE,
                            UPDATEHOUSEHOLD,
                            COUNTRYID,
                            SEASONALSTARTDATE,
                            SEASONALENDDATE,
                            STARTTIME,
                            ENDTIME,
                            STARTDATE,
                            ENDDATE,
                            INFOSOURCECODEID,
                            DONOTTEXT,
                            INFOSOURCECOMMENTS
                        )
                        select
                            PHONETYPECODEID,
                            NUMBER = dbo.UFN_PHONE_REMOVECOUNTRYCODE([PHONE].[NUMBER], [PHONE].[COUNTRYID]),
                            ISPRIMARY,
                            case
                                when ENDDATE is not null then
                                    1
                                else
                                    DONOTCALL
                            end as DONOTCALL,
                            SEQUENCE,
                            UPDATEHOUSEHOLD,
                            COUNTRYID,
                            SEASONALSTARTDATE,
                            SEASONALENDDATE,
                            STARTTIME,
                            ENDTIME,
                            dbo.UFN_DATE_GETEARLIESTTIME(STARTDATE),
                            dbo.UFN_DATE_GETEARLIESTTIME(ENDDATE),
                            INFOSOURCECODEID,
                            ISNULL(DONOTTEXT, CAST(0 as BIT)),
                            ISNULL(INFOSOURCECOMMENTS,'')
                        from dbo.UFN_CONSTITUENT_GETPHONES_FORUPDATEBATCH_FROMITEMLISTXML(@PHONES) [PHONE]

                        if exists(select top 1 * from @PHONENUMBERTABLE)
                        begin
                            declare @PRIMARYPHONEEXISTS bit
                            set @PRIMARYPHONEEXISTS = 0

                            if exists(select NUMBER from @PHONENUMBERTABLE where ISPRIMARY = 1)
                                set @PRIMARYPHONEEXISTS = 1

                            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

                            -- Start date must be before end date

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

                            -- Primary email addresses 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);

                            -- #253763 Check to see if there are duplicate phone numbers.  Same phone number type and same phone number

                            if exists (    select COUNT(*)
                                        from @PHONENUMBERTABLE a1
                                        where ENDDATE is null
                                        group by dbo.UFN_PHONE_REMOVEFORMATTING(NUMBER),PHONETYPECODEID,COUNTRYID
                                        HAVING COUNT(*) > 1
                                            raiserror('BBERR_PHONENUMBER_DUPLICATENOTALLOWED', 13, 1);                                        

                        end

                        --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
                        )
                        insert into @SOCIALMEDIAACCOUNTTABLE
                        (
                            SOCIALMEDIASERVICEID, USERID, URL, SOCIALMEDIAACCOUNTTYPECODEID, INFOSOURCECODEID, DONOTCONTACT, SEQUENCE
                        )
                        select
                            ACCOUNTS.SOCIALMEDIASERVICEID, 
                            ACCOUNTS.USERID,
                            ACCOUNTS.URL, 
                            ACCOUNTS.SOCIALMEDIAACCOUNTTYPECODEID, 
                            ACCOUNTS.INFOSOURCECODEID, 
                            ACCOUNTS.DONOTCONTACT,
                            ACCOUNTS.SEQUENCE
                        from 
                            dbo.UFN_CONSTITUENT_GETSOCIALMEDIAACCOUNTS_FORUPDATEBATCH_FROMITEMLISTXML(@SOCIALMEDIAACCOUNTS) ACCOUNTS

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

                        declare @RELATIONSHIPTABLE table
                        (
                            RECIPROCALCONSTITUENTID uniqueidentifier, RELATIONSHIPTYPECODEID uniqueidentifier,
                            RECIPROCALTYPECODEID uniqueidentifier, STARTDATE datetime, RELATIONSHIPEXISTS bit, RELATIONSHIPSETID uniqueidentifier
                        )
                        insert into @RELATIONSHIPTABLE
                        (
                            RECIPROCALCONSTITUENTID, RELATIONSHIPTYPECODEID, RECIPROCALTYPECODEID, STARTDATE, RELATIONSHIPEXISTS, RELATIONSHIPSETID
                        )
                        select
                            RELATIONSHIPS.RECIPROCALCONSTITUENTID, 
                            RELATIONSHIPS.RELATIONSHIPTYPECODEID,
                            RELATIONSHIPS.RECIPROCALTYPECODEID, 
                            RELATIONSHIPS.STARTDATE,
                            case when RELATIONSHIP.ID is not null then 1 else 0 end as RELATIONSHIPEXISTS,
                            newid()
                        from 
                            dbo.UFN_CONSTITUENT_GETRELATIONSHIPS_FORUPDATEBATCH_FROMITEMLISTXML(@RELATIONSHIPS) RELATIONSHIPS
                            left join dbo.RELATIONSHIP on RELATIONSHIP.RELATIONSHIPCONSTITUENTID = @ID and RELATIONSHIPS.RECIPROCALCONSTITUENTID = RELATIONSHIP.RECIPROCALCONSTITUENTID

                        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

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

                        declare @CONSTITUENCYTABLE table
                        (
                            ID uniqueidentifier, CONSTITUENCYCODEID uniqueidentifier, DATEFROM datetime, DATETO datetime
                        )
                        insert into @CONSTITUENCYTABLE
                        (
                            ID, CONSTITUENCYCODEID, DATEFROM, DATETO
                        )
                        select
                            newid(), CONSTITUENCYCODEID, DATEFROM, DATETO
                        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)
                        )
                        insert into @ALTERNATELOOKUPIDTABLE
                        (
                            ALTERNATELOOKUPIDTYPECODEID, ALTERNATELOOKUPID
                        )
                        select
                            ALTERNATELOOKUPIDTYPECODEID, ALTERNATELOOKUPID
                        from dbo.UFN_CONSTITUENT_GETALTERNATELOOKUPIDS_FORUPDATEBATCH_FROMITEMLISTXML(@ALTERNATELOOKUPIDS)

                        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

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

                        declare @SPOUSEALTERNATELOOKUPIDTABLE table
                        (
                            ALTERNATELOOKUPIDTYPECODEID uniqueidentifier, ALTERNATELOOKUPID nvarchar(100)
                        )
                        insert into @SPOUSEALTERNATELOOKUPIDTABLE
                        (
                            ALTERNATELOOKUPIDTYPECODEID, ALTERNATELOOKUPID
                        )
                        select
                            ALTERNATELOOKUPIDTYPECODEID, ALTERNATELOOKUPID
                        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)
                        begin
                            raiserror('BBERR_ORIGINAL_ERROR:2627',1,11);
                            raiserror('UIX_SPOUSEALTERNATELOOKUPID_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 there are no sites and the batch owner requires site, then default on the sites of the batch owner

                        if @CONSTITUENT_SITES is null and dbo.UFN_SITEREQUIREDFORUSER(@BATCHOWNERID) = 1
                            set @CONSTITUENT_SITES =
                                                        (
                                                                select SITEID
                                                                from dbo.UFN_SITESFORUSER(@BATCHOWNERID)
                                                                for xml raw('ITEM'),type,elements,root('CONSTITUENT_SITES'),BINARY BASE64
                                                        )

                        --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);

                        -- Insert data into tables

                        if @VALIDATEONLY = 0
                        begin
                            begin try
                                declare @MATCHINGCONSTITUENTS table(CONSTITID uniqueidentifier);

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

                                --Basic Constituent Info

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

                                insert into dbo.[CONSTITUENT]
                                (
                                    ID, ISORGANIZATION, ISGROUP,
                                    BIRTHDATE, FIRSTNAME, GENDERCODE, GIVESANONYMOUSLY, KEYNAME, CUSTOMIDENTIFIER, MAIDENNAME, 
                                    MIDDLENAME, NICKNAME, SUFFIXCODEID, TITLECODEID, WEBADDRESS, MARITALSTATUSCODEID, ISCONSTITUENT,
                                    CHANGEDBYID, ADDEDBYID, DATECHANGED, DATEADDED, GENDERCODEID
                                )
                                values
                                (
                                    @ID, case when @CONSTITUENTTYPECODE = 1 then 1 else 0 end, case when @CONSTITUENTTYPECODE = 2 then 1 when @CONSTITUENTTYPECODE = 3 then 1 else 0 end,
                                    @BIRTHDATE, @FIRSTNAME, @GENDERCODE, @GIVESANONYMOUSLY, @KEYNAME, @LOOKUPID, @MAIDENNAME
                                    @MIDDLENAME, @NICKNAME, @SUFFIXCODEID, @TITLECODEID, @WEBADDRESS, @MARITALSTATUSCODEID, 1, -- ISCONSTITUENT

                                    @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE, @GENDERCODEID
                                );


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

                                --Name formats

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

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

                                    insert into [dbo].[NAMEFORMAT] (
                                        [CONSTITUENTID],
                                        [NAMEFORMATTYPECODEID],
                                        [NAMEFORMATFUNCTIONID],
                                        [ADDEDBYID],
                                        [CHANGEDBYID],
                                        [DATEADDED],
                                        [DATECHANGED],
                                        [PRIMARYADDRESSEE],
                                        [PRIMARYSALUTATION]
                                    )
                                    select
                                        @ID,
                                        NFD.NAMEFORMATTYPECODEID,
                                        NFD.NAMEFORMATFUNCTIONID,
                                        @CHANGEAGENTID,
                                        @CHANGEAGENTID,
                                        @CURRENTDATE,
                                        @CURRENTDATE,
                                        NFD.PRIMARYADDRESSEE,
                                        NFD.PRIMARYSALUTATION
                                    from
                                        dbo.NAMEFORMATDEFAULT as NFD
                                    where
                                        NFD.APPLYTOCODE = 0 and 
                                        NFD.NAMEFORMATTYPECODEID not in (select NAMEFORMATTYPECODEID from dbo.UFN_BATCHCONSTITUENTUPDATE_GETNAMEFORMATS_FROMITEMLISTXML(@NAMEFORMATS));
                                end

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

                                -- Solicit Codes --

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


                                if @SOLICITCODES is not null
                                begin
                                    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;

                                    -- 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
                                        isnull(CONSTITUENTSOLICITCODEID, newid()),
                                        @ID,
                                        SOLICITCODEID,
                                        STARTDATE,
                                        ENDDATE,
                                        COMMENTS,
                                        SEQUENCE,
                                        CONSENTPREFERENCECODE,
                                        SOURCECODEID,
                                        SOURCEFILEPATH,
                                        PRIVACYPOLICYFILEPATH,
                                        SUPPORTINGINFORMATION,
                                        CONSENTSTATEMENT,
                                        @CHANGEAGENTID
                                        @CHANGEAGENTID
                                        @CURRENTDATE
                                        @CURRENTDATE
                                    from @SOLICITCODESTABLE;
                                end

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

                                    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
                                                            -- In Acquisition transaction, @BBNCUSERID = -1 and SignupTransactions table UserId having NULL.Therefore, we are fetching SignupTransactionID from Transactions table using BBNCTRANID.

                                                            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

                                                 --Add constituent origination information

                                            declare @INFOSOURCECODEID uniqueidentifier

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


                                            if @INFOSOURCECODEID is not null and not exists (select 1 from dbo.[CONSTITUENTORIGINATION] where ID = @ID)
                                            begin
                                                insert into dbo.[CONSTITUENTORIGINATION]
                                                (
                                                    ID, INFOSOURCECODEID, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
                                                )
                                                values
                                                (
                                                    @ID, @INFOSOURCECODEID, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
                                                )
                                            end

                                        end


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


                                --Kill the constituent if deceased has been checked

                                if @DECEASED = 1 begin
                                    insert into dbo.DECEASEDCONSTITUENT
                                    (
                                        ID,
                                        DECEASEDDATE,
                                        ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
                                    )
                                    values
                                    (
                                        @ID,
                                        @DECEASEDDATE,
                                        @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
                                    );

                                                                exec dbo.USP_CONSTITUENT_DECEASEFROMRULES @ID, @CHANGEAGENTID;
                            end

                            --Insert new sites into the constituent site table

                            insert into dbo.CONSTITUENTSITE
                            (
                                ID,
                                CONSTITUENTID,
                                SITEID,
                                ADDEDBYID,
                                CHANGEDBYID,
                                DATEADDED,
                                DATECHANGED
                            )
                            select newid(), @ID, CONSTITUENTSITESTABLE.SITEID, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
                            from 
                                @CONSTITUENTSITESTABLE CONSTITUENTSITESTABLE

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

                            --Basic group info

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

                            if @CONSTITUENTTYPECODE = 2 or @CONSTITUENTTYPECODE = 3
                                insert into dbo.GROUPDATA
                                (
                                    ID,
                                    GROUPTYPECODE, GROUPTYPEID, DESCRIPTION, 
                                    CHANGEDBYID, ADDEDBYID, DATECHANGED, DATEADDED,STARTDATE
                                )
                                values
                                (
                                    @ID,
                                    coalesce(case when @CONSTITUENTTYPECODE = 2 then 0 when @CONSTITUENTTYPECODE = 3 then 1 else 0 end, 0), @GROUPTYPEID, @GROUPDESCRIPTION,
                                    @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE,@GROUPSTARTDATE
                                )

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

                            --Basic organization info

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

                            if @CONSTITUENTTYPECODE = 1
                            begin
                                insert into dbo.ORGANIZATIONDATA
                                (
                                    ID,
                                    INDUSTRYCODEID,
                                    NUMEMPLOYEES,
                                    NUMSUBSIDIARIES,
                                    PARENTCORPID,                                            
                                    CHANGEDBYID,
                                    ADDEDBYID,
                                    DATECHANGED,
                                    DATEADDED
                                )
                                values
                                (
                                    @ID,
                                    @ORG_INDUSTRYCODEID,
                                    coalesce(@ORG_NUMEMPLOYEES, 0),
                                    coalesce(@ORG_NUMSUBSIDIARIES, 0),
                                    @ORG_PARENTCORPID
                                    @CHANGEAGENTID,
                                    @CHANGEAGENTID,
                                    @CURRENTDATE,
                                    @CURRENTDATE
                                )

                            if @ORG_PARENTCORPID is not null and @ORG_PARENTCORPID <> '00000000-0000-0000-0000-000000000000'
                                exec dbo.USP_RELATIONSHIPS_CREATEPARENTORGRELATIONSHIP  @ID, @ORG_PARENTCORPID,@CURRENTDATE,@CHANGEAGENTID,@CURRENTDATE,1,null
                         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

                                            update dbo.RELATIONSHIP
                                            set
                                                [ISSPOUSE] = 0,
                                                [RELATIONSHIPTYPECODEID] = @SPOUSEREMOVEDRELATIONSHIPTYPECODEID,
                                                [RECIPROCALTYPECODEID] = @SPOUSEREMOVEDRELATIONSHIPTYPECODEID,
                                                [CHANGEDBYID] = @CHANGEAGENTID,
                                                [DATECHANGED] = @CURRENTDATE
                                            where
                                                [RELATIONSHIP].[RELATIONSHIPCONSTITUENTID] = @ID
                                                and [RELATIONSHIP].[ISSPOUSE] = 1;
                                        end 
                                    -- if this is a non BBIS transaction, use the batch relationship fields

                                    if not ISNULL(@BBNCUSERID, 0) <> 0 
                                        begin
                                            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 

                                end

                            declare @NEWSPOUSE bit = 0;
                                                        declare @EXISTINGSPOUSEHOUSEHOLDID uniqueidentifier = null;

                                                        if @SPOUSE_ID is not null and  @REMOVESPOUSE = 0
                                                        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(@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.CONSTITUENT SPOUSE
                                    where 
                                        SPOUSE.ID = @SPOUSE_ID
                                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

                                                                select
                                                    @EXISTINGSPOUSEHOUSEHOLDID = GD.ID
                                                from
                                                    dbo.GROUPMEMBER GM
                                                left outer join
                                                    dbo.GROUPDATA GD on GM.GROUPID = GD.ID
                                                left outer join
                                                    dbo.GROUPMEMBERDATERANGE GMDR on GM.ID = GMDR.GROUPMEMBERID
                                                where
                                                    GM.MEMBERID = @SPOUSE_ID
                                                        and GD.GROUPTYPECODE = 0
                                                        and ((GMDR.DATEFROM is null and (GMDR.DATETO is null or GMDR.DATETO > @CURRENTDATE))
                                                            or (GMDR.DATETO is null and (GMDR.DATEFROM is null or GMDR.DATEFROM <= @CURRENTDATE)) 
                                                            or (GMDR.DATEFROM <= @CURRENTDATE and GMDR.DATETO > @CURRENTDATE));
                                                        end            
                            else if @SPOUSE_LASTNAME <> '' begin
                                --Insert a new constituent for the spouse if an existing constituent was not chosen

                                set @SPOUSE_ID = newid()

                                                                set @NEWSPOUSE = 1

                                begin try
                                    insert into dbo.CONSTITUENT
                                        (
                                            ID,
                                            BIRTHDATE, 
                                            FIRSTNAME, 
                                            GENDERCODE,
                                            GENDERCODEID,
                                            KEYNAME, 
                                            CUSTOMIDENTIFIER, 
                                            MAIDENNAME, 
                                            MIDDLENAME, 
                                            NICKNAME, 
                                            SUFFIXCODEID, 
                                            TITLECODEID,
                                            ISCONSTITUENT,
                                            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,
                                            dbo.UFN_CONSTITUENCYCRITERIASPOUSE_SPOUSEISCONSTITUENT(),
                                            @CHANGEAGENTID
                                            @CHANGEAGENTID
                                            @CURRENTDATE
                                            @CURRENTDATE
                                        )
                                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

                                                                --Insert new sites into the constituent site table

                                    insert into dbo.CONSTITUENTSITE
                                    (
                                        ID,
                                        CONSTITUENTID,
                                        SITEID,
                                        ADDEDBYID,
                                        CHANGEDBYID,
                                        DATEADDED,
                                        DATECHANGED
                                    )
                                    select newid(), @SPOUSE_ID, CONSTITUENTSITESTABLE.SITEID, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
                                    from 
                                        @CONSTITUENTSITESTABLE CONSTITUENTSITESTABLE

                                --Add default name formats for the newly created spouse.

                                insert into [dbo].[NAMEFORMAT]
                                (
                                    [CONSTITUENTID],
                                    [NAMEFORMATTYPECODEID],
                                    [NAMEFORMATFUNCTIONID],
                                    [ADDEDBYID],
                                    [CHANGEDBYID],
                                    [DATEADDED],
                                    [DATECHANGED],
                                    [PRIMARYADDRESSEE],
                                    [PRIMARYSALUTATION]
                                )
                                select
                                    @SPOUSE_ID,
                                    NAMEFORMATDEFAULT.NAMEFORMATTYPECODEID,
                                    NAMEFORMATDEFAULT.NAMEFORMATFUNCTIONID,
                                    @CHANGEAGENTID,
                                    @CHANGEAGENTID,
                                    @CURRENTDATE,
                                    @CURRENTDATE,
                                    NAMEFORMATDEFAULT.PRIMARYADDRESSEE,
                                    NAMEFORMATDEFAULT.PRIMARYSALUTATION
                                from 
                                    dbo.NAMEFORMATDEFAULT
                                where 
                                    (NAMEFORMATDEFAULT.APPLYTOCODE = 0);
                            end

                                --Add a relationship for the new spouse and make a household

                                if @SPOUSE_ID is not null begin
                                    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
                                    )

                                    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_SPOUSERELATIONSHIP_SETUPHOUSEHOLD @ID, @SPOUSE_ID
                                        0, @CHANGEAGENTID, @CURRENTDATE, 0,@CURRENTAPPUSERID, 1; --skip adding sites, so that we can properly default them


                                                                        --If the spouse is a new constituent or the spouse is an existing constituent that did not have a household associated with it,

                                                                        --  then we need to default on sites for the new household that was just created.

                                    if @NEWSPOUSE = 1 or @EXISTINGSPOUSEHOUSEHOLDID = null
                                                                        begin
                                                                                declare @NEWHOUSEHOLDID uniqueidentifier;

                                                                                select @NEWHOUSEHOLDID = GD.ID
                                                                from
                                                                    dbo.GROUPMEMBER GM
                                                                left outer join
                                                                    dbo.GROUPDATA GD on GM.GROUPID = GD.ID
                                                                left outer join
                                                                    dbo.GROUPMEMBERDATERANGE GMDR on GM.ID = GMDR.GROUPMEMBERID
                                                                where
                                                                    GM.MEMBERID = @SPOUSE_ID
                                                                        and GD.GROUPTYPECODE = 0
                                                                        and ((GMDR.DATEFROM is null and (GMDR.DATETO is null or GMDR.DATETO > @CURRENTDATE))
                                                                            or (GMDR.DATETO is null and (GMDR.DATEFROM is null or GMDR.DATEFROM <= @CURRENTDATE)) 
                                                                            or (GMDR.DATEFROM <= @CURRENTDATE and GMDR.DATETO > @CURRENTDATE));

                                                                                --Insert new sites into the constituent site table

                                                    insert into dbo.CONSTITUENTSITE
                                                    (
                                                        ID,
                                                        CONSTITUENTID,
                                                        SITEID,
                                                        ADDEDBYID,
                                                        CHANGEDBYID,
                                                        DATEADDED,
                                                        DATECHANGED
                                                    )
                                                    select newid(), @NEWHOUSEHOLDID, CONSTITUENTSITESTABLE.SITEID, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
                                                    from 
                                                        @CONSTITUENTSITESTABLE CONSTITUENTSITESTABLE
                                                                        end

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

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

                                --Get the constituents who are in the household

                                insert into @MATCHINGCONSTITUENTS select CONSTITUENTID from dbo.UFN_CONSTITUENT_MATCHINGHOUSEHOLDRECORDS(@ID);


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

                                                                if @SPOUSE_ID is not null 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


                                                                --Spouse Alternate lookup IDs

                                                                if @SPOUSE_ID is not null
                                                                        begin
                                                    --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 not exists(
                                                        select 
                                                            ALTERNATELOOKUPIDTYPECODEID 
                                                        from 
                                                            ALTERNATELOOKUPID 
                                                        where 
                                                            ALTERNATELOOKUPIDTYPECODEID = TEMP.ALTERNATELOOKUPIDTYPECODEID and
                                                            ALTERNATELOOKUPID.CONSTITUENTID = @SPOUSE_ID)
                                                                        end

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

                                --Alternate Lookup IDs

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

                                --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 not exists(
                                    select 
                                        ALTERNATELOOKUPIDTYPECODEID 
                                    from 
                                        ALTERNATELOOKUPID 
                                    where 
                                        ALTERNATELOOKUPIDTYPECODEID = TEMP.ALTERNATELOOKUPIDTYPECODEID and
                                        ALTERNATELOOKUPID.CONSTITUENTID = @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


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

                                --Educational Involvements

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

                                --Fill a table with all of the constituent's educational involvements

                                /*declare @INVOLVEMENTTABLE table
                                (
                                    EDUCATIONALINVOLVEMENTTYPECODEID uniqueidentifier, DATEFROM dbo.UDT_FUZZYDATE, DATETO dbo.UDT_FUZZYDATE, 
                                    EDUCATIONALINSTITUTIONID uniqueidentifier, COMMENT nvarchar(500), EDUCATIONALINVOLVEMENTAWARDCODEID uniqueidentifier,
                                    EDUCATIONALINVOLVEMENTNAMEID uniqueidentifier
                                )
                                insert into @INVOLVEMENTTABLE
                                (
                                    EDUCATIONALINVOLVEMENTTYPECODEID, DATEFROM, DATETO, 
                                    EDUCATIONALINSTITUTIONID, COMMENT, EDUCATIONALINVOLVEMENTAWARDCODEID,
                                    EDUCATIONALINVOLVEMENTNAMEID
                                )
                                select
                                    EDUCATIONALINVOLVEMENTTYPECODEID, DATEFROM, DATETO, 
                                    EDUCATIONALINSTITUTIONID, COMMENT, EDUCATIONALINVOLVEMENTAWARDCODEID,
                                    EDUCATIONALINVOLVEMENTNAMEID
                                from dbo.UFN_CONSTITUENT_GETEDUCATIONALINVOLVEMENTS_FORUPDATEBATCH_FROMITEMLISTXML(@EDUCATIONALINVOLVEMENTS)

                                --Insert new involvements into the EDUCATIONALINVOLVEMENT table
                                insert into dbo.EDUCATIONALINVOLVEMENT
                                (
                                    CONSTITUENTID,
                                    EDUCATIONALINVOLVEMENTTYPECODEID, DATEFROM, DATETO, 
                                    EDUCATIONALINSTITUTIONID, COMMENT, EDUCATIONALINVOLVEMENTAWARDCODEID,
                                    EDUCATIONALINVOLVEMENTNAMEID,
                                    ADDEDBYID,
                                    CHANGEDBYID,
                                    DATEADDED,
                                    DATECHANGED
                                )
                                select @ID, EDUCATIONALINVOLVEMENTTYPECODEID, DATEFROM, DATETO, 
                                    EDUCATIONALINSTITUTIONID, COMMENT, EDUCATIONALINVOLVEMENTAWARDCODEID,
                                    EDUCATIONALINVOLVEMENTNAMEID, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
                                from 
                                    @INVOLVEMENTTABLE TEMP
                                where not exists(
                                    select ID 
                                    from dbo.EDUCATIONALINVOLVEMENT
                                    where 
                                        CONSTITUENTID = @ID and EDUCATIONALINVOLVEMENTTYPECODEID = TEMP.EDUCATIONALINVOLVEMENTTYPECODEID and 
                                        DATEFROM = TEMP.DATEFROM and DATETO = TEMP.DATETO and EDUCATIONALINSTITUTIONID = TEMP.EDUCATIONALINSTITUTIONID and 
                                        COMMENT = TEMP.COMMENT and EDUCATIONALINVOLVEMENTAWARDCODEID = TEMP.EDUCATIONALINVOLVEMENTAWARDCODEID and
                                        EDUCATIONALINVOLVEMENTNAMEID = TEMP.EDUCATIONALINVOLVEMENTNAMEID)
                                */

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

                                --Addresses

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

                                if exists(select top 1 * from @ADDRESSTABLE)
                                begin            
                                    /* WI 254227 Removing this check MMR
                                    After quite a bit of discussion on this bug we are changing USP_ADDRESS_UPDATEMATCHINGADDRESSES
                                    to include HISTORICAL dates as part of the comparison if two addresses match

                                    -- 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
                                                ADDRESSTABLE.ISPRIMARY = 1
                                                and ADDRESSTABLE.UPDATEHOUSEHOLD = 1
                                        ) and exists (
                                            select 
                                                1
                                            from
                                                @ADDRESSTABLE ADDRESSTABLE
                                                inner join dbo.ADDRESS on
                                                    ADDRESS.ADDRESSBLOCK = ADDRESSTABLE.ADDRESSBLOCK and
                                                    ADDRESS.CITY = ADDRESSTABLE.CITY and
                                                    (ADDRESS.COUNTRYID = ADDRESSTABLE.COUNTRYID or (ADDRESS.COUNTRYID is null and ADDRESSTABLE.COUNTRYID is null)) and
                                                    (ADDRESS.STATEID = ADDRESSTABLE.STATEID or (ADDRESS.STATEID is null and ADDRESSTABLE.STATEID is null)) and
                                                    ADDRESS.POSTCODE = ADDRESSTABLE.POSTCODE
                                            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);

                                    */

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

                                    if exists(select * from @ADDRESSTABLE where ISPRIMARY = 1 and UPDATEHOUSEHOLD = 1) begin
                                        update dbo.ADDRESS
                                        set
                                            ISPRIMARY = 0
                                        where
                                            CONSTITUENTID in (select CONSTITID from @MATCHINGCONSTITUENTS)
                                    end

                                    --Update existing entries in the ADDRESS and ADDRESSVALIDATIONUPDATE table

                                    update dbo.ADDRESS
                                    set
                                        ENDDATE = coalesce(nullif(TEMP.ENDDATE, '0000'), A.ENDDATE), 
                                        STARTDATE = coalesce(nullif(TEMP.STARTDATE, '0000'), A.STARTDATE),
                                        HISTORICALSTARTDATE = coalesce(TEMP.HISTORICALSTARTDATE, A.HISTORICALSTARTDATE),
                                        HISTORICALENDDATE = coalesce(TEMP.HISTORICALENDDATE, A.HISTORICALENDDATE),
                                        ADDRESSTYPECODEID = coalesce(nullif(TEMP.ADDRESSTYPECODEID, '00000000-0000-0000-0000-000000000000'), A.ADDRESSTYPECODEID),
                                        CART = coalesce(nullif(TEMP.CART, ''), A.CART),
                                        DONOTMAIL = TEMP.DONOTMAIL,
                                        DONOTMAILREASONCODEID = coalesce(nullif(TEMP.DONOTMAILREASONCODEID, '00000000-0000-0000-0000-000000000000'), A.DONOTMAILREASONCODEID),
                                        DPC = coalesce(nullif(TEMP.DPC, ''), A.DPC),
                                        ISPRIMARY = TEMP.ISPRIMARY,
                                        LOT = coalesce(nullif(TEMP.LOT, ''), A.LOT),
                                        SEQUENCE = coalesce(nullif(TEMP.SEQUENCE,''), A.SEQUENCE),
                                        CHANGEDBYID = @CHANGEAGENTID,
                                        DATECHANGED = @CURRENTDATE
                                    from
                                        dbo.ADDRESS A
                                        inner join @ADDRESSTABLE TEMP
                                        on
                                            A.ADDRESSBLOCK = TEMP.ADDRESSBLOCK and
                                            A.CITY = TEMP.CITY and
                                            (A.COUNTRYID = TEMP.COUNTRYID or (A.COUNTRYID is null and TEMP.COUNTRYID is null)) and
                                            (A.STATEID = TEMP.STATEID or (A.STATEID is null and TEMP.STATEID is null)) and
                                            A.POSTCODE = TEMP.POSTCODE
                                    where
                                        (CONSTITUENTID = @ID)

                                    update dbo.ADDRESS
                                    set
                                        ENDDATE = coalesce(nullif(TEMP.ENDDATE, '0000'), A.ENDDATE), 
                                        STARTDATE = coalesce(nullif(TEMP.STARTDATE, '0000'), A.STARTDATE),
                                        HISTORICALSTARTDATE = coalesce(TEMP.HISTORICALSTARTDATE, A.HISTORICALSTARTDATE),
                                        HISTORICALENDDATE = coalesce(TEMP.HISTORICALENDDATE, A.HISTORICALENDDATE),
                                        ADDRESSTYPECODEID = coalesce(nullif(TEMP.ADDRESSTYPECODEID, '00000000-0000-0000-0000-000000000000'), A.ADDRESSTYPECODEID),
                                        CART = coalesce(nullif(TEMP.CART, ''), A.CART),
                                        DONOTMAIL = TEMP.DONOTMAIL,
                                        DONOTMAILREASONCODEID = coalesce(nullif(TEMP.DONOTMAILREASONCODEID, '00000000-0000-0000-0000-000000000000'), A.DONOTMAILREASONCODEID),
                                        DPC = coalesce(nullif(TEMP.DPC, ''), A.DPC),
                                        ISPRIMARY = TEMP.ISPRIMARY,
                                        LOT = coalesce(nullif(TEMP.LOT, ''), A.LOT),
                                        SEQUENCE = coalesce(nullif(TEMP.SEQUENCE,''), A.SEQUENCE),
                                        CHANGEDBYID = @CHANGEAGENTID,
                                        DATECHANGED = @CURRENTDATE
                                    from
                                        dbo.ADDRESS A
                                        inner join @ADDRESSTABLE TEMP
                                        on
                                            A.ADDRESSBLOCK = TEMP.ADDRESSBLOCK and
                                            A.CITY = TEMP.CITY and
                                            (A.COUNTRYID = TEMP.COUNTRYID or (A.COUNTRYID is null and TEMP.COUNTRYID is null)) and
                                            (A.STATEID = TEMP.STATEID or (A.STATEID is null and TEMP.STATEID is null)) and
                                            A.POSTCODE = TEMP.POSTCODE
                                    where
                                        ((CONSTITUENTID in (select CONSTITID from @MATCHINGCONSTITUENTS)) and (TEMP.UPDATEHOUSEHOLD = 1))

                                    update dbo.ADDRESSVALIDATIONUPDATE
                                    set
                                        CERTIFICATIONDATA = coalesce(nullif(TEMP.CERTIFICATIONDATA, ''), AVU.CERTIFICATIONDATA),
                                        CONGRESSIONALDISTRICTCODEID = coalesce(nullif(TEMP.CONGRESSIONALDISTRICTCODEID, '00000000-0000-0000-0000-000000000000'), AVU.CONGRESSIONALDISTRICTCODEID),
                                        COUNTYCODEID = coalesce(nullif(TEMP.COUNTYCODEID, '00000000-0000-0000-0000-000000000000'), AVU.COUNTYCODEID),
                                        INFOSOURCECODEID = coalesce(nullif(TEMP.INFOSOURCECODEID, '00000000-0000-0000-0000-000000000000'), AVU.INFOSOURCECODEID),
                                        --LASTVALIDATIONATTEMPTDATE = coalesce(nullif(TEMP.LASTVALIDATIONATTEMPTDATE, '00000000'), AVU.LASTVALIDATIONATTEMPTDATE),

                                        LOCALPRECINCTCODEID = coalesce(nullif(TEMP.LOCALPRECINCTCODEID, '00000000-0000-0000-0000-000000000000'), AVU.LOCALPRECINCTCODEID),
                                        OMITFROMVALIDATION = TEMP.OMITFROMVALIDATION, 
                                        REGIONCODEID = coalesce(nullif(TEMP.REGIONCODEID, '00000000-0000-0000-0000-000000000000'), AVU.REGIONCODEID),
                                        STATEHOUSEDISTRICTCODEID = coalesce(nullif(TEMP.STATEHOUSEDISTRICTCODEID, '00000000-0000-0000-0000-000000000000'), AVU.STATEHOUSEDISTRICTCODEID),
                                        STATESENATEDISTRICTCODEID = coalesce(nullif(TEMP.STATESENATEDISTRICTCODEID, '00000000-0000-0000-0000-000000000000'), AVU.STATESENATEDISTRICTCODEID),
                                        VALIDATIONMESSAGE = coalesce(nullif(TEMP.VALIDATIONMESSAGE, ''), AVU.VALIDATIONMESSAGE),
                                        INFOSOURCECOMMENTS = coalesce(nullif(TEMP.INFOSOURCECOMMENTS, ''), AVU.INFOSOURCECOMMENTS),
                                        CHANGEDBYID = @CHANGEAGENTID,
                                        DATECHANGED = @CURRENTDATE
                                    from
                                        dbo.ADDRESS A
                                        inner join @ADDRESSTABLE TEMP
                                        on
                                            A.ADDRESSBLOCK = TEMP.ADDRESSBLOCK and
                                            A.CITY = TEMP.CITY and
                                            (A.COUNTRYID = TEMP.COUNTRYID or (A.COUNTRYID is null and TEMP.COUNTRYID is null)) and
                                            (A.STATEID = TEMP.STATEID or (A.STATEID is null and TEMP.STATEID is null)) and
                                            A.POSTCODE = TEMP.POSTCODE
                                        inner join dbo.ADDRESSVALIDATIONUPDATE AVU on A.ID = AVU.ID
                                    where 
                                        (A.CONSTITUENTID = @ID)

                                    update dbo.ADDRESSVALIDATIONUPDATE
                                    set
                                        CERTIFICATIONDATA = coalesce(nullif(TEMP.CERTIFICATIONDATA, ''), AVU.CERTIFICATIONDATA),
                                        CONGRESSIONALDISTRICTCODEID = coalesce(nullif(TEMP.CONGRESSIONALDISTRICTCODEID, '00000000-0000-0000-0000-000000000000'), AVU.CONGRESSIONALDISTRICTCODEID),
                                        COUNTYCODEID = coalesce(nullif(TEMP.COUNTYCODEID, '00000000-0000-0000-0000-000000000000'), AVU.COUNTYCODEID),
                                        INFOSOURCECODEID = coalesce(nullif(TEMP.INFOSOURCECODEID, '00000000-0000-0000-0000-000000000000'), AVU.INFOSOURCECODEID),
                                        --LASTVALIDATIONATTEMPTDATE = coalesce(nullif(TEMP.LASTVALIDATIONATTEMPTDATE, '00000000'), AVU.LASTVALIDATIONATTEMPTDATE),

                                        LOCALPRECINCTCODEID = coalesce(nullif(TEMP.LOCALPRECINCTCODEID, '00000000-0000-0000-0000-000000000000'), AVU.LOCALPRECINCTCODEID),
                                        OMITFROMVALIDATION = TEMP.OMITFROMVALIDATION, 
                                        REGIONCODEID = coalesce(nullif(TEMP.REGIONCODEID, '00000000-0000-0000-0000-000000000000'), AVU.REGIONCODEID),
                                        STATEHOUSEDISTRICTCODEID = coalesce(nullif(TEMP.STATEHOUSEDISTRICTCODEID, '00000000-0000-0000-0000-000000000000'), AVU.STATEHOUSEDISTRICTCODEID),
                                        STATESENATEDISTRICTCODEID = coalesce(nullif(TEMP.STATESENATEDISTRICTCODEID, '00000000-0000-0000-0000-000000000000'), AVU.STATESENATEDISTRICTCODEID),
                                        VALIDATIONMESSAGE = coalesce(nullif(TEMP.VALIDATIONMESSAGE, ''), AVU.VALIDATIONMESSAGE),
                                        INFOSOURCECOMMENTS = coalesce(nullif(TEMP.INFOSOURCECOMMENTS, ''), AVU.INFOSOURCECOMMENTS),
                                        CHANGEDBYID = @CHANGEAGENTID,
                                        DATECHANGED = @CURRENTDATE
                                    from
                                        dbo.ADDRESS A
                                        inner join @ADDRESSTABLE TEMP
                                        on
                                            A.ADDRESSBLOCK = TEMP.ADDRESSBLOCK and
                                            A.CITY = TEMP.CITY and
                                            (A.COUNTRYID = TEMP.COUNTRYID or (A.COUNTRYID is null and TEMP.COUNTRYID is null)) and
                                            (A.STATEID = TEMP.STATEID or (A.STATEID is null and TEMP.STATEID is null)) and
                                            A.POSTCODE = TEMP.POSTCODE
                                        inner join dbo.ADDRESSVALIDATIONUPDATE AVU on A.ID = AVU.ID
                                    where 
                                        ((A.CONSTITUENTID in (select CONSTITID from @MATCHINGCONSTITUENTS)) and (TEMP.UPDATEHOUSEHOLD = 1))

                                    --Insert new addresses into the ADDRESS and ADDRESSVALIDATIONUPDATE table

                                    insert into dbo.ADDRESS
                                    (
                                        CONSTITUENTID, 
                                        ADDRESSBLOCK, ENDDATE, STARTDATE, HISTORICALSTARTDATE, HISTORICALENDDATE, ADDRESSTYPECODEID, CART, 
                                        CITY, COUNTRYID, DONOTMAIL, DONOTMAILREASONCODEID, DPC, ISPRIMARY, LOT, STATEID, POSTCODE, SEQUENCE,
                                        ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
                                    )
                                    select 
                                        @ID
                                        ADDRESSBLOCK, ENDDATE, STARTDATE, HISTORICALSTARTDATE, HISTORICALENDDATE, ADDRESSTYPECODEID, CART, 
                                        CITY, COUNTRYID, DONOTMAIL, DONOTMAILREASONCODEID, DPC, ISPRIMARY, LOT, STATEID, POSTCODE, SEQUENCE
                                        @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
                                    from 
                                        @ADDRESSTABLE TEMP
                                    where not exists(
                                        select ID 
                                        from dbo.ADDRESS
                                        where 
                                            CONSTITUENTID = @ID and 
                                            ADDRESSBLOCK = TEMP.ADDRESSBLOCK and
                                            CITY = TEMP.CITY and
                                            (COUNTRYID = TEMP.COUNTRYID or (COUNTRYID is null and TEMP.COUNTRYID is null)) and 
                                            (STATEID = TEMP.STATEID or (STATEID is null and TEMP.STATEID is null)) and
                                            POSTCODE = TEMP.POSTCODE)

                                    insert into dbo.ADDRESS
                                    (
                                        CONSTITUENTID, 
                                        ADDRESSBLOCK, ENDDATE, STARTDATE, HISTORICALSTARTDATE, HISTORICALENDDATE, ADDRESSTYPECODEID, CART, 
                                        CITY, COUNTRYID, DONOTMAIL, DONOTMAILREASONCODEID, DPC, ISPRIMARY, LOT, STATEID, POSTCODE, SEQUENCE,
                                        ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
                                    )
                                    select
                                        MC.CONSTITID,
                                        AT.ADDRESSBLOCK, AT.ENDDATE, AT.STARTDATE, AT.HISTORICALSTARTDATE, AT.HISTORICALENDDATE, AT.ADDRESSTYPECODEID, AT.CART, 
                                        AT.CITY, AT.COUNTRYID, AT.DONOTMAIL, AT.DONOTMAILREASONCODEID, AT.DPC, AT.ISPRIMARY, AT.LOT, AT.STATEID, AT.POSTCODE, AT.SEQUENCE,
                                        @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
                                    from
                                        @MATCHINGCONSTITUENTS MC
                                        join @ADDRESSTABLE AT on AT.UPDATEHOUSEHOLD = 1
                                    where
                                        not exists(
                                            select CONSTITUENTID from dbo.ADDRESS 
                                            where
                                                CONSTITUENTID = MC.CONSTITID and
                                                ADDRESSBLOCK = AT.ADDRESSBLOCK and
                                                CITY = AT.CITY and
                                                (COUNTRYID = AT.COUNTRYID or (COUNTRYID is null and AT.COUNTRYID is null)) and 
                                                (STATEID = AT.STATEID or (STATEID is null and AT.STATEID is null)) and
                                                POSTCODE = AT.POSTCODE)

                                    insert into dbo.ADDRESSVALIDATIONUPDATE
                                    (
                                        ID,
                                        CERTIFICATIONDATA, CONGRESSIONALDISTRICTCODEID, COUNTYCODEID, INFOSOURCECODEID, LASTVALIDATIONATTEMPTDATE, LOCALPRECINCTCODEID, 
                                        OMITFROMVALIDATION, REGIONCODEID, STATEHOUSEDISTRICTCODEID, STATESENATEDISTRICTCODEID, VALIDATIONMESSAGE,
                                        ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED, INFOSOURCECOMMENTS
                                    )
                                    select
                                        A.ID,
                                        coalesce(nullif(AT.CERTIFICATIONDATA, ''), 0),
                                        AT.CONGRESSIONALDISTRICTCODEID, AT.COUNTYCODEID, AT.INFOSOURCECODEID, AT.LASTVALIDATIONATTEMPTDATE, AT.LOCALPRECINCTCODEID,
                                        AT.OMITFROMVALIDATION, AT.REGIONCODEID, AT.STATEHOUSEDISTRICTCODEID, AT.STATESENATEDISTRICTCODEID, AT.VALIDATIONMESSAGE,
                                        @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE, AT.INFOSOURCECOMMENTS
                                    from
                                        @ADDRESSTABLE AT join dbo.ADDRESS A
                                        on
                                            A.CONSTITUENTID = @ID and
                                            (AT.COUNTRYID = A.COUNTRYID or (AT.COUNTRYID is null and A.COUNTRYID is null)) and
                                            AT.CITY = A.CITY and
                                            AT.POSTCODE = A.POSTCODE and
                                            AT.ADDRESSBLOCK = A.ADDRESSBLOCK and
                                            (AT.STATEID = A.STATEID or (AT.STATEID is null and A.STATEID is null)) and
                                            AT.ISPRIMARY = A.ISPRIMARY
                                    where
                                        not exists(select ID from ADDRESSVALIDATIONUPDATE where ADDRESSVALIDATIONUPDATE.ID = A.ID)

                                    insert into dbo.ADDRESSVALIDATIONUPDATE
                                    (
                                        ID, 
                                        CERTIFICATIONDATA, CONGRESSIONALDISTRICTCODEID, COUNTYCODEID, INFOSOURCECODEID, LASTVALIDATIONATTEMPTDATE, LOCALPRECINCTCODEID, 
                                        OMITFROMVALIDATION, REGIONCODEID, STATEHOUSEDISTRICTCODEID, STATESENATEDISTRICTCODEID, VALIDATIONMESSAGE,
                                        ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED, INFOSOURCECOMMENTS
                                    )
                                    select
                                        A.ID,
                                        coalesce(nullif(AT.CERTIFICATIONDATA, ''), 0),
                                        AT.CONGRESSIONALDISTRICTCODEID, AT.COUNTYCODEID, AT.INFOSOURCECODEID, AT.LASTVALIDATIONATTEMPTDATE, AT.LOCALPRECINCTCODEID, 
                                        AT.OMITFROMVALIDATION, AT.REGIONCODEID, AT.STATEHOUSEDISTRICTCODEID, AT.STATESENATEDISTRICTCODEID, AT.VALIDATIONMESSAGE,
                                        @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE, AT.INFOSOURCECOMMENTS
                                    from
                                        @MATCHINGCONSTITUENTS MC
                                        join dbo.ADDRESS A on A.CONSTITUENTID = MC.CONSTITID
                                        join @ADDRESSTABLE AT on 
                                            (A.COUNTRYID = AT.COUNTRYID or (A.COUNTRYID is null and AT.COUNTRYID is null)) and
                                            (A.STATEID = AT.STATEID or (A.STATEID is null and AT.STATEID is null)) and
                                            A.POSTCODE = AT.POSTCODE and
                                            A.ADDRESSBLOCK = AT.ADDRESSBLOCK and
                                            A.CITY = AT.CITY and
                                            AT.ISPRIMARY = A.ISPRIMARY
                                    where
                                        AT.UPDATEHOUSEHOLD = 1 and
                                        not exists(select ID from dbo.ADDRESSVALIDATIONUPDATE AVU where AVU.ID = A.ID)
                                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

                                    if exists(select * from @EMAILADDRESSTABLE where ISPRIMARY = 1 and UPDATEHOUSEHOLD = 1) begin
                                        update dbo.EMAILADDRESS
                                        set
                                            ISPRIMARY = 0
                                        where
                                            CONSTITUENTID in (select CONSTITID from @MATCHINGCONSTITUENTS)
                                    end

                                    --Update existing entries in the EMAILADDRESS table

                                    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.STARTDATE = EAT.STARTDATE,
                                        EA.ENDDATE = EAT.ENDDATE,
                                        EA.CHANGEDBYID = @CHANGEAGENTID,
                                        EA.DATECHANGED = @CURRENTDATE,
                                        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
                                    where
                                        (EA.CONSTITUENTID = @ID)

                                    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.STARTDATE = EAT.STARTDATE,
                                        EA.ENDDATE = EAT.ENDDATE,
                                        EA.CHANGEDBYID = @CHANGEAGENTID,
                                        EA.DATECHANGED = @CURRENTDATE,
                                        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
                                    where
                                        ((EA.CONSTITUENTID in (select CONSTITID from @MATCHINGCONSTITUENTS)) and (EAT.UPDATEHOUSEHOLD = 1))

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

                                    insert into dbo.EMAILADDRESS
                                    (
                                        CONSTITUENTID, 
                                        EMAILADDRESSTYPECODEID, EMAILADDRESS, ISPRIMARY, 
                                        DONOTEMAIL, SEQUENCE, STARTDATE, ENDDATE,
                                        CHANGEDBYID, ADDEDBYID, DATECHANGED, DATEADDED, INFOSOURCECODEID, DONOTEMAILREASONCODEID, INFOSOURCECOMMENTS
                                    )
                                    select
                                        MC.CONSTITID,
                                        EAT.EMAILADDRESSTYPECODEID, EAT.EMAILADDRESS, EAT.ISPRIMARY, 
                                        EAT.DONOTEMAIL, EAT.SEQUENCE, EAT.STARTDATE, EAT.ENDDATE,
                                        @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE, EAT.INFOSOURCECODEID, EAT.DONOTEMAILREASONCODEID, EAT.INFOSOURCECOMMENTS
                                    from
                                        @MATCHINGCONSTITUENTS MC
                                        join @EMAILADDRESSTABLE EAT on EAT.UPDATEHOUSEHOLD = 1
                                    where
                                        not exists(
                                            select CONSTITUENTID from dbo.EMAILADDRESS 
                                            where
                                                CONSTITUENTID = MC.CONSTITID and
                                                EMAILADDRESS = EAT.EMAILADDRESS)
                                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

                                    if exists(select * from @PHONENUMBERTABLE where ISPRIMARY = 1 and UPDATEHOUSEHOLD = 1) begin
                                        update dbo.PHONE
                                        set
                                            ISPRIMARY = 0
                                        where
                                            CONSTITUENTID in (select CONSTITID from @MATCHINGCONSTITUENTS)
                                    end

                                    --Update existing entries in the PHONE table

                                    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 = PT.INFOSOURCECODEID,
                                        P.DONOTTEXT = PT.DONOTTEXT,
                                        P.INFOSOURCECOMMENTS = PT.INFOSOURCECOMMENTS
                                    from
                                        dbo.PHONE P
                                        inner join @PHONENUMBERTABLE PT on P.NUMBER = PT.NUMBER
                                    where
                                        (P.CONSTITUENTID = @ID)

                                    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 = PT.INFOSOURCECODEID,
                                        P.DONOTTEXT = PT.DONOTTEXT,
                                        P.INFOSOURCECOMMENTS = PT.INFOSOURCECOMMENTS
                                    from
                                        dbo.PHONE P
                                        inner join @PHONENUMBERTABLE PT on P.NUMBER = PT.NUMBER
                                    where
                                        ((P.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 not exists(
                                        select ID 
                                        from dbo.PHONE
                                        where 
                                            CONSTITUENTID = @ID and 
                                            NUMBER = PT.NUMBER)

                                    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
                                        MC.CONSTITID,
                                        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
                                        @MATCHINGCONSTITUENTS MC
                                        join @PHONENUMBERTABLE PT on PT.UPDATEHOUSEHOLD = 1
                                    where
                                        not exists(
                                            select CONSTITUENTID from dbo.PHONE 
                                            where
                                                CONSTITUENTID = MC.CONSTITID and
                                                NUMBER = PT.NUMBER)
                                end

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

                                --Social media accounts

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

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

                                    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 
                                    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 not exists(
                                        select 
                                            ID 
                                        from 
                                            dbo.SOCIALMEDIAACCOUNT
                                        where 
                                            CONSTITUENTID = @ID 
                                            and SOCIALMEDIASERVICEID = ST.SOCIALMEDIASERVICEID
                                            and USERID = ST.USERID
                                        )
                                end

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

                                --Relationships

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

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

                                    --Note: We don't need an update statement since we are not implementing update relationship functionality through constituent update batch.


                                    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
                                -----------------------------------------------------------------

                                --Constituencies

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

                                                                declare @HASPROSPECTCONSTITUENCY bit = 0;

                                if exists(select top 1 * from @CONSTITUENCYTABLE)
                                begin
                                    --Insert new constituencies into the CONSTITUENCY table

                                    declare @USERDEFINEDCONSTITUENCY xml;
                                    set @USERDEFINEDCONSTITUENCY = 
                                        (
                                            select
                                                CONSTITUENCY.c.query('.')
                                            from
                                                @CONSTITUENCIES.nodes('/CONSTITUENCIES/ITEM') CONSTITUENCY(c)
                                                left join dbo.CONSTITUENCYSYSTEMNAME on CONSTITUENCY.c.value('(CONSTITUENCYCODEID)[1]', 'uniqueidentifier') = CONSTITUENCYSYSTEMNAME.ID
                                            where
                                                CONSTITUENCYSYSTEMNAME.ID is null
                                            for xml raw(''),type,elements,root('CONSTITUENCY'),BINARY BASE64
                                        );
                                    exec dbo.USP_CONSTITUENT_GETCONSTITUENCIES_ADDFROMXML @ID, @USERDEFINEDCONSTITUENCY, @CHANGEAGENTID;

                                    declare @SYSTEMDEFINEDCONSTITUENCY xml;

                                    set @SYSTEMDEFINEDCONSTITUENCY =
                                        (
                                            select
                                                CONSTITUENCY.c.query('.')
                                            from
                                                @CONSTITUENCIES.nodes('/CONSTITUENCIES/ITEM') CONSTITUENCY(c)
                                            where
                                                CONSTITUENCY.c.value('(CONSTITUENCYCODEID)[1]', 'uniqueidentifier') = 'F828E957-5F5E-479A-8F23-2FFD6C7C68FF'
                                            for xml raw(''),type,elements,root('CONSTITUENCY'),BINARY BASE64
                                        );
                                    exec dbo.USP_CONSTITUENT_GETCONSTITUENCIES_BOARDMEMBER_ADDFROMXML @ID, @SYSTEMDEFINEDCONSTITUENCY, @CHANGEAGENTID;

                                    set @SYSTEMDEFINEDCONSTITUENCY =
                                        (
                                            select
                                                CONSTITUENCY.c.query('.')
                                            from
                                                @CONSTITUENCIES.nodes('/CONSTITUENCIES/ITEM') CONSTITUENCY(c)
                                            where
                                                CONSTITUENCY.c.value('(CONSTITUENCYCODEID)[1]', 'uniqueidentifier') = '6093915E-ADE9-42BE-88AE-304731754467'
                                            for xml raw(''),type,elements,root('CONSTITUENCY'),BINARY BASE64
                                        );
                                    exec dbo.USP_CONSTITUENT_GETCONSTITUENCIES_STAFF_ADDFROMXML @ID, @SYSTEMDEFINEDCONSTITUENCY, @CHANGEAGENTID;

                                    set @SYSTEMDEFINEDCONSTITUENCY =
                                        (
                                            select
                                                CONSTITUENCY.c.query('.')
                                            from
                                                @CONSTITUENCIES.nodes('/CONSTITUENCIES/ITEM') CONSTITUENCY(c)
                                            where
                                                CONSTITUENCY.c.value('(CONSTITUENCYCODEID)[1]', 'uniqueidentifier') = 'D2DCA06A-BE6E-40B3-B95D-59A926181923'
                                            for xml raw(''),type,elements,root('CONSTITUENCY'),BINARY BASE64
                                        );
                                    exec dbo.USP_CONSTITUENT_GETCONSTITUENCIES_FUNDRAISER_ADDFROMXML @ID, @SYSTEMDEFINEDCONSTITUENCY, @CHANGEAGENTID;

                                    set @SYSTEMDEFINEDCONSTITUENCY =
                                        (
                                            select
                                                CONSTITUENCY.c.query('.')
                                            from
                                                @CONSTITUENCIES.nodes('/CONSTITUENCIES/ITEM') CONSTITUENCY(c)
                                            where
                                                CONSTITUENCY.c.value('(CONSTITUENCYCODEID)[1]', 'uniqueidentifier') = '00E748FB-940D-4A7D-A133-C148B29410A8'
                                            for xml raw(''),type,elements,root('CONSTITUENCY'),BINARY BASE64
                                        );
                                    exec dbo.USP_CONSTITUENT_GETCONSTITUENCIES_PROSPECT_ADDFROMXML @ID, @SYSTEMDEFINEDCONSTITUENCY, @CHANGEAGENTID;

                                                                        if @SYSTEMDEFINEDCONSTITUENCY is not null
                                                                            set @HASPROSPECTCONSTITUENCY = 1;

                                    set @SYSTEMDEFINEDCONSTITUENCY =
                                        (
                                            select
                                                CONSTITUENCY.c.query('.')
                                            from
                                                @CONSTITUENCIES.nodes('/CONSTITUENCIES/ITEM') CONSTITUENCY(c)
                                            where
                                                CONSTITUENCY.c.value('(CONSTITUENCYCODEID)[1]', 'uniqueidentifier') = 'E7489703-3D63-4017-A2BC-88C092563C5D'
                                            for xml raw(''),type,elements,root('CONSTITUENCY'),BINARY BASE64
                                        );
                                    exec dbo.USP_CONSTITUENT_GETCONSTITUENCIES_VOLUNTEER_ADDFROMXML @ID, @SYSTEMDEFINEDCONSTITUENCY, @CHANGEAGENTID;
                                    if @SYSTEMDEFINEDCONSTITUENCY.exist('/CONSTITUENCY/ITEM/CONSTITUENCYCODEID/text()[string-length() > 0]') = 1
                                        if not exists (select 1 from dbo.VOLUNTEER where ID=@ID)
                                            insert into dbo.VOLUNTEER
                                            (
                                                ID,
                                                ADDEDBYID,
                                                CHANGEDBYID,
                                                DATEADDED,
                                                DATECHANGED
                                            )
                                            values
                                            (
                                                @ID,
                                                @CHANGEAGENTID,
                                                @CHANGEAGENTID,
                                                @CURRENTDATE,
                                                @CURRENTDATE
                                            );

                                    --Committee

                                    set @SYSTEMDEFINEDCONSTITUENCY =
                                        (
                                            select
                                                CONSTITUENCY.c.query('.')
                                            from
                                                @CONSTITUENCIES.nodes('/CONSTITUENCIES/ITEM') CONSTITUENCY(c)
                                            where
                                                CONSTITUENCY.c.value('(CONSTITUENCYCODEID)[1]', 'uniqueidentifier') = 'AC9DB5A4-14E0-416A-9FB2-04038AC66799'
                                            for xml raw(''),type,elements,root('CONSTITUENCY'),BINARY BASE64
                                        );
                                    exec dbo.USP_CONSTITUENT_GETCONSTITUENCIES_COMMITTEE_ADDFROMXML @ID, @SYSTEMDEFINEDCONSTITUENCY, @CHANGEAGENTID;
                                    if @SYSTEMDEFINEDCONSTITUENCY.exist('/CONSTITUENCY/ITEM/CONSTITUENCYCODEID/text()[string-length() > 0]') = 1
                                        if not exists (select 1 from dbo.COMMITTEE where ID=@ID)
                                            insert into dbo.COMMITTEE
                                            (
                                                ID,
                                                ADDEDBYID,
                                                CHANGEDBYID,
                                                DATEADDED,
                                                DATECHANGED
                                            )
                                            values
                                            (
                                                @ID,
                                                @CHANGEAGENTID,
                                                @CHANGEAGENTID,
                                                @CURRENTDATE,
                                                @CURRENTDATE
                                            );
                                end

                                                                if @HASPROSPECTCONSTITUENCY = 1 or @PROSPECTMANAGERFUNDRAISERID is not null
                                                                begin
                                                                    insert into dbo.PROSPECT 
                                        (
                                            ID,
                                            PROSPECTMANAGERFUNDRAISERID,
                                            ADDEDBYID, CHANGEDBYID,
                                                                            DATEADDED, DATECHANGED
                                        ) 
                                        values 
                                        (
                                            @ID,
                                            @PROSPECTMANAGERFUNDRAISERID,
                                            @CHANGEAGENTID, @CHANGEAGENTID,
                                                                            @CURRENTDATE, @CURRENTDATE
                                        );

                                                                    --If prospect was implied via PROSPECTMANAGERFUNDRAISERID need to create date range entry

                                                                    if @HASPROSPECTCONSTITUENCY = 0
                                                                    begin
                                                                        insert into dbo.PROSPECTDATERANGE
                                            (
                                                CONSTITUENTID,
                                                ADDEDBYID, CHANGEDBYID,
                                                DATEADDED, DATECHANGED
                                            )
                                            values
                                            (
                                                @ID,
                                                @CHANGEAGENTID, @CHANGEAGENTID,
                                                @CURRENTDATE, @CURRENTDATE
                                            );
                                                                    end
                                                                end

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

                                --Primary business information

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

                                declare @BUSINESS_ISNEWRECORD bit = 0
                                if @BUSINESS_ID is not null or @BUSINESS_NAME <> '' begin

                                    --Update info for the business

                                    if @BUSINESS_ID is not null begin
                                        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
                                    end

                                    --Add a new business relationship if one does not currently exist

                                    else if @BUSINESS_NAME <> '' begin
                                        --Insert a new business into the CONSTITUENT table if an existing one wasn't chosen

                                        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
                                                )
                                        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 new sites into the constituent site table

                                                    insert into dbo.CONSTITUENTSITE
                                                    (
                                                        ID,
                                                        CONSTITUENTID,
                                                        SITEID,
                                                        ADDEDBYID,
                                                        CHANGEDBYID,
                                                        DATEADDED,
                                                        DATECHANGED
                                                    )
                                                    select newid(), @BUSINESS_ID, CONSTITUENTSITESTABLE.SITEID, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
                                                    from 
                                                        @CONSTITUENTSITESTABLE CONSTITUENTSITESTABLE

                                        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

                                    --Add a new relationship for the business

                                    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

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

                                    --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
                                            exec dbo.USP_CONSTITUENTSOLICITCODE_ADD null, @NOEMAILSOLICITCODEID, @ID, null, null, '', @CHANGEAGENTID;
                                        end
                                end

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

                                -- ADC WI 645666; SEARCHCONSTITUENT updates last to capture address data

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

                                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 = @ID
                                            and CONSITTUENTALLNAMES.KEYNAME <> '';

                                    -- If spouse is present/added, we should keep their fields updated

                                    if @SPOUSE_ID is not null and  @REMOVESPOUSE = 0
                                    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

                                    -- If business is present/added, we should keep their fields updated

                                    if @BUSINESS_ID is not null
                                    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

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

                        return 0;