USP_DATAFORMTEMPLATE_ADD_DIRECTMARKETINGEFFORTBATCHCOMMIT

The save procedure used by the add dataform template "Direct Marketing Effort Batch Commit 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.
@BATCHROWID uniqueidentifier IN Batch row ID
@VALIDATEONLY bit IN Validate only
@SEGMENTATIONID uniqueidentifier IN Marketing effort
@SEGMENTATIONCODEVALUEID uniqueidentifier IN Marketing effort code description
@SEGMENTATIONCODE nvarchar(10) IN Marketing effort code
@SOURCECODE nvarchar(50) IN Source code
@RECORDSOURCEID uniqueidentifier IN Record source
@LISTID uniqueidentifier IN List
@LISTNAME nvarchar(100) IN List name
@LISTDESCRIPTION nvarchar(255) IN List description
@LISTCODEVALUEID uniqueidentifier IN List code description
@LISTCODE nvarchar(10) IN List code
@LISTCATEGORYCODEID uniqueidentifier IN List category
@LISTVENDORID uniqueidentifier IN List vendor
@SEGMENTID uniqueidentifier IN Segment
@SEGMENTNAME nvarchar(100) IN Segment name
@SEGMENTDESCRIPTION nvarchar(255) IN Segment description
@SEGMENTCODEVALUEID uniqueidentifier IN Segment code description
@SEGMENTCODE nvarchar(10) IN Segment code
@SEGMENTCATEGORYCODEID uniqueidentifier IN Segment category
@SEGMENTTYPECODE tinyint IN Segment type
@SEGMENTEXPECTEDGIFTAMOUNT money IN Segment expected gift amount
@SEGMENTEXPECTEDRESPONSERATE decimal(5, 2) IN Segment expected response rate
@SEGMENTRENTALQUANTITY int IN Segment rental quantity
@SEGMENTEXCHANGEQUANTITY int IN Segment exchange quantity
@SEGMENTRENTALCOST money IN Segment rental cost
@SEGMENTRENTALCOSTBASISCODE tinyint IN Segment rental cost basis
@SEGMENTEXCHANGECOST money IN Segment exchange cost
@SEGMENTEXCHANGECOSTBASISCODE tinyint IN Segment exchange cost basis
@SEGMENTUSAGECODE tinyint IN Segment usage
@TESTSEGMENTID uniqueidentifier IN Test segment
@TESTSEGMENTNAME nvarchar(100) IN Test segment name
@TESTSEGMENTDESCRIPTION nvarchar(255) IN Test segment description
@TESTSEGMENTCODEVALUEID uniqueidentifier IN Test segment code description
@TESTSEGMENTCODE nvarchar(10) IN Test segment code
@TESTSEGMENTEXPECTEDGIFTAMOUNT money IN Test segment expected gift amount
@TESTSEGMENTEXPECTEDRESPONSERATE decimal(5, 2) IN Test segment expected response rate
@TESTSEGMENTQUANTITY int IN Test segment quantity
@PACKAGEID uniqueidentifier IN Package
@PACKAGENAME nvarchar(100) IN Package name
@PACKAGEDESCRIPTION nvarchar(255) IN Package description
@PACKAGECODEVALUEID uniqueidentifier IN Package code description
@PACKAGECODE nvarchar(10) IN Package code
@PACKAGECHANNELCODEVALUEID uniqueidentifier IN Package channel code description
@PACKAGECHANNELCODE nvarchar(10) IN Package channel code
@PACKAGECATEGORYCODEID uniqueidentifier IN Package category
@PACKAGETYPECODE tinyint IN Package type
@PACKAGECOST money IN Package cost
@PACKAGECOSTDISTRIBUTIONMETHODCODE tinyint IN Package cost distribution method
@BASECURRENCYID uniqueidentifier IN Base currency
@CURRENTAPPUSERID uniqueidentifier IN Input parameter indicating the ID of the current user.
@LISTSITEID uniqueidentifier IN List site
@PACKAGESITEID uniqueidentifier IN Package site
@SEGMENTSITEID uniqueidentifier IN Segment site
@LISTSITEISNULL bit IN List site is null
@PACKAGESITEISNULL bit IN Package site is null
@SEGMENTSITEISNULL bit IN Segment site is null

Definition

Copy

CREATE procedure dbo.[USP_DATAFORMTEMPLATE_ADD_DIRECTMARKETINGEFFORTBATCHCOMMIT]
(
  @ID uniqueidentifier = null output,
  @CHANGEAGENTID uniqueidentifier = null,
  @BATCHROWID uniqueidentifier = null,
  @VALIDATEONLY bit = 0,
  @SEGMENTATIONID uniqueidentifier = null,
  @SEGMENTATIONCODEVALUEID uniqueidentifier = null,
  @SEGMENTATIONCODE nvarchar(10) = '',
  @SOURCECODE nvarchar(50) = '',
  @RECORDSOURCEID uniqueidentifier = null,
  @LISTID uniqueidentifier = null,
  @LISTNAME nvarchar(100) = '',
  @LISTDESCRIPTION nvarchar(255) = '',
  @LISTCODEVALUEID uniqueidentifier = null,
  @LISTCODE nvarchar(10) = '',
  @LISTCATEGORYCODEID uniqueidentifier = null,
  @LISTVENDORID uniqueidentifier = null,
  @SEGMENTID uniqueidentifier = null,
  @SEGMENTNAME nvarchar(100) = '',
  @SEGMENTDESCRIPTION nvarchar(255) = '',
  @SEGMENTCODEVALUEID uniqueidentifier = null,
  @SEGMENTCODE nvarchar(10) = '',
  @SEGMENTCATEGORYCODEID uniqueidentifier = null,
  @SEGMENTTYPECODE tinyint = 1,
  @SEGMENTEXPECTEDGIFTAMOUNT money = 0,
  @SEGMENTEXPECTEDRESPONSERATE decimal(5,2) = 0.00,
  @SEGMENTRENTALQUANTITY int = 0,
  @SEGMENTEXCHANGEQUANTITY int = 0,
  @SEGMENTRENTALCOST money = 0,
  @SEGMENTRENTALCOSTBASISCODE tinyint = 1,
  @SEGMENTEXCHANGECOST money = 0,
  @SEGMENTEXCHANGECOSTBASISCODE tinyint = 1,
  @SEGMENTUSAGECODE tinyint = 1,
  @TESTSEGMENTID uniqueidentifier = null,
  @TESTSEGMENTNAME nvarchar(100) = '',
  @TESTSEGMENTDESCRIPTION nvarchar(255) = '',
  @TESTSEGMENTCODEVALUEID uniqueidentifier = null,
  @TESTSEGMENTCODE nvarchar(10) = '',
  @TESTSEGMENTEXPECTEDGIFTAMOUNT money = 0,
  @TESTSEGMENTEXPECTEDRESPONSERATE decimal(5,2) = 0.00,
  @TESTSEGMENTQUANTITY int = 0,
  @PACKAGEID uniqueidentifier = null,
  @PACKAGENAME nvarchar(100) = '',
  @PACKAGEDESCRIPTION nvarchar(255) = '',
  @PACKAGECODEVALUEID uniqueidentifier = null,
  @PACKAGECODE nvarchar(10) = '',
  @PACKAGECHANNELCODEVALUEID uniqueidentifier = null,
  @PACKAGECHANNELCODE nvarchar(10) = '',
  @PACKAGECATEGORYCODEID uniqueidentifier = null,
  @PACKAGETYPECODE tinyint = 0,
  @PACKAGECOST money = 0,
  @PACKAGECOSTDISTRIBUTIONMETHODCODE tinyint = 0,
  @BASECURRENCYID uniqueidentifier = null,
  @CURRENTAPPUSERID uniqueidentifier = null,
  @LISTSITEID uniqueidentifier = null,
  @PACKAGESITEID uniqueidentifier = null,
  @SEGMENTSITEID uniqueidentifier = null,
  @LISTSITEISNULL bit = 0,
  @PACKAGESITEISNULL bit = 0,
  @SEGMENTSITEISNULL bit = 0
)
as
  set nocount on;

  declare @BATCHID uniqueidentifier;
  declare @BATCHSEGMENTID uniqueidentifier;
  declare @BATCHPACKAGEID uniqueidentifier;
  declare @BATCHLISTID uniqueidentifier;
  declare @BATCHTESTSEGMENTID uniqueidentifier;
  declare @OLDBATCHSEGMENTID uniqueidentifier;
  declare @OLDBATCHPACKAGEID uniqueidentifier;
  declare @OLDBATCHLISTID uniqueidentifier;
  declare @OLDBATCHTESTSEGMENTID uniqueidentifier;
  declare @EXISTINGLIST bit = 0;
  declare @EXISTINGSEGMENT bit = 0;
  declare @EXISTINGTESTSEGMENT bit = 0;
  declare @EXISTINGPACKAGE bit = 0;
  declare @SEGMENTATIONSEGMENTID uniqueidentifier;
  declare @SAVELISTRECORD bit = 1;
  declare @SAVETESTSEGMENTRECORD bit = 1;
  declare @CURRENTDATE datetime;

  declare @SOURCECODEID uniqueidentifier;
  declare @OLDCODE nvarchar(10);
  declare @OLDLISTID uniqueidentifier;
  declare @OLDSEGMENTID uniqueidentifier;
  declare @OLDPACKAGEID uniqueidentifier;
  declare @OLDPACKAGETYPECODE tinyint;
  declare @USEADDRESSPROCESSING bit;
  declare @SEQUENCE int;

  declare @ORGANIZATIONCURRENCYID uniqueidentifier;
  declare @CURRENCYEXCHANGERATEID uniqueidentifier;
  declare @CURRENCYEXCHANGERATEIDCURRENT uniqueidentifier;
  declare @DATEADDED datetime;
  declare @LISTORGANIZATIONRENTALCOST money;
  declare @LISTORGANIZATIONEXCHANGECOST money;
  declare @PACKAGEORGANIZATIONCOST money;
  declare @SEGMENTORGANIZATIONEXPECTEDGIFTAMOUNT money;
  declare @SEGMENTORGANIZATIONRENTALCOST money;
  declare @SEGMENTORGANIZATIONEXCHANGECOST money;
  declare @TESTSEGMENTORGANIZATIONEXPECTEDGIFTAMOUNT money;


  begin try
    if @VALIDATEONLY is null
      set @VALIDATEONLY = 0;

    select
      @BATCHID = [BATCHID],
      @OLDBATCHSEGMENTID = [BATCHDIRECTMARKETINGEFFORTSEGMENTID],
      @OLDBATCHPACKAGEID = [BATCHDIRECTMARKETINGEFFORTPACKAGEID],
      @OLDBATCHLISTID = [BATCHDIRECTMARKETINGEFFORTLISTID],
      @OLDBATCHTESTSEGMENTID = [BATCHDIRECTMARKETINGEFFORTTESTSEGMENTID]
    from dbo.[BATCHDIRECTMARKETINGEFFORT]
    where [ID] = @BATCHROWID;

    select
      @SOURCECODEID = [SOURCECODEID]
    from dbo.[MKTSEGMENTATION]
    where [ID] = @SEGMENTATIONID;


    --Since the ID fields play double duty in the UI, we need to make sure we reset the fields correctly if they are new records...
    if @OLDBATCHLISTID is not null and @LISTID = @OLDBATCHLISTID
      set @LISTID = null;
    if @OLDBATCHSEGMENTID is not null and @SEGMENTID = @OLDBATCHSEGMENTID
      set @SEGMENTID = null;
    if @OLDBATCHTESTSEGMENTID is not null and @TESTSEGMENTID = @OLDBATCHTESTSEGMENTID
      set @TESTSEGMENTID = null;
    if @OLDBATCHPACKAGEID is not null and @PACKAGEID = @OLDBATCHPACKAGEID
      set @PACKAGEID = null;



    /*********************/
    /* Validate the data */
    /*********************/
    exec dbo.[USP_DIRECTMARKETINGEFFORTBATCH_VALIDATEROW]
      @BATCHID = @BATCHID,
      @VALIDATEFORCOMMIT = 1,
      @BATCHSEGMENTID = @BATCHSEGMENTID output,
      @BATCHPACKAGEID = @BATCHPACKAGEID output,
      @BATCHLISTID = @BATCHLISTID output,
      @BATCHTESTSEGMENTID = @BATCHTESTSEGMENTID output,
      @EXISTINGLIST = @EXISTINGLIST output,
      @EXISTINGSEGMENT = @EXISTINGSEGMENT output,
      @EXISTINGTESTSEGMENT = @EXISTINGTESTSEGMENT output,
      @EXISTINGPACKAGE = @EXISTINGPACKAGE output,
      @SEGMENTATIONSEGMENTID = @SEGMENTATIONSEGMENTID output,
      @SAVELISTRECORD = @SAVELISTRECORD output,
      @SAVETESTSEGMENTRECORD = @SAVETESTSEGMENTRECORD output,
      @SEGMENTATIONID = @SEGMENTATIONID output,
      @SEGMENTATIONCODEVALUEID = @SEGMENTATIONCODEVALUEID output,
      @SEGMENTATIONCODE = @SEGMENTATIONCODE output,
      @SOURCECODE = @SOURCECODE output,
      @RECORDSOURCEID = @RECORDSOURCEID output,
      @LISTID = @LISTID output,
      @LISTNAME = @LISTNAME output,
      @LISTDESCRIPTION = @LISTDESCRIPTION output,
      @LISTCODEVALUEID = @LISTCODEVALUEID output,
      @LISTCODE = @LISTCODE output,
      @LISTCATEGORYCODEID = @LISTCATEGORYCODEID output,
      @LISTVENDORID = @LISTVENDORID output,
      @SEGMENTID = @SEGMENTID output,
      @SEGMENTNAME = @SEGMENTNAME output,
      @SEGMENTDESCRIPTION = @SEGMENTDESCRIPTION output,
      @SEGMENTCODEVALUEID = @SEGMENTCODEVALUEID output,
      @SEGMENTCODE = @SEGMENTCODE output,
      @SEGMENTCATEGORYCODEID = @SEGMENTCATEGORYCODEID output,
      @SEGMENTTYPECODE = @SEGMENTTYPECODE output,
      @SEGMENTEXPECTEDGIFTAMOUNT = @SEGMENTEXPECTEDGIFTAMOUNT output,
      @SEGMENTEXPECTEDRESPONSERATE = @SEGMENTEXPECTEDRESPONSERATE output,
      @SEGMENTRENTALQUANTITY = @SEGMENTRENTALQUANTITY output,
      @SEGMENTEXCHANGEQUANTITY = @SEGMENTEXCHANGEQUANTITY output,
      @SEGMENTRENTALCOST = @SEGMENTRENTALCOST output,
      @SEGMENTRENTALCOSTBASISCODE = @SEGMENTRENTALCOSTBASISCODE output,
      @SEGMENTEXCHANGECOST = @SEGMENTEXCHANGECOST output,
      @SEGMENTEXCHANGECOSTBASISCODE = @SEGMENTEXCHANGECOSTBASISCODE output,
      @SEGMENTUSAGECODE = @SEGMENTUSAGECODE output,
      @TESTSEGMENTID = @TESTSEGMENTID output,
      @TESTSEGMENTNAME = @TESTSEGMENTNAME output,
      @TESTSEGMENTDESCRIPTION = @TESTSEGMENTDESCRIPTION output,
      @TESTSEGMENTCODEVALUEID = @TESTSEGMENTCODEVALUEID output,
      @TESTSEGMENTCODE = @TESTSEGMENTCODE output,
      @TESTSEGMENTEXPECTEDGIFTAMOUNT = @TESTSEGMENTEXPECTEDGIFTAMOUNT output,
      @TESTSEGMENTEXPECTEDRESPONSERATE = @TESTSEGMENTEXPECTEDRESPONSERATE output,
      @TESTSEGMENTQUANTITY = @TESTSEGMENTQUANTITY output,
      @PACKAGEID = @PACKAGEID output,
      @PACKAGENAME = @PACKAGENAME output,
      @PACKAGEDESCRIPTION = @PACKAGEDESCRIPTION output,
      @PACKAGECODEVALUEID = @PACKAGECODEVALUEID output,
      @PACKAGECODE = @PACKAGECODE output,
      @PACKAGECHANNELCODEVALUEID = @PACKAGECHANNELCODEVALUEID output,
      @PACKAGECHANNELCODE = @PACKAGECHANNELCODE output,
      @PACKAGECATEGORYCODEID = @PACKAGECATEGORYCODEID output,
      @PACKAGETYPECODE = @PACKAGETYPECODE output,
      @PACKAGECOST = @PACKAGECOST output,
      @PACKAGECOSTDISTRIBUTIONMETHODCODE = @PACKAGECOSTDISTRIBUTIONMETHODCODE output,
      @BASECURRENCYID = @BASECURRENCYID output,
      @CURRENTAPPUSERID = @CURRENTAPPUSERID,
      @LISTSITEID = @LISTSITEID output,
      @PACKAGESITEID = @PACKAGESITEID output,
      @SEGMENTSITEID = @SEGMENTSITEID output;


    if @VALIDATEONLY = 0
      begin
        if @CHANGEAGENTID is null  
          exec dbo.[USP_CHANGEAGENT_GETORCREATECHANGEAGENT] @CHANGEAGENTID output;

        set @CURRENTDATE = getdate();
        set @ORGANIZATIONCURRENCYID = dbo.[UFN_CURRENCY_GETORGANIZATIONCURRENCY]();

        if @ORGANIZATIONCURRENCYID <> @BASECURRENCYID
          set @CURRENCYEXCHANGERATEIDCURRENT = dbo.[UFN_CURRENCYEXCHANGERATE_GETLATEST](@BASECURRENCYID, @ORGANIZATIONCURRENCYID, @CURRENTDATE, 0, null);



        /*******************************/
        /* Update the marketing effort */
        /*******************************/
        update dbo.[MKTSEGMENTATION] set
          [PARTDEFINITIONVALUESID] = @SEGMENTATIONCODEVALUEID,
          [CODE] = @SEGMENTATIONCODE,
          [BASECURRENCYID] = @BASECURRENCYID,
          [CHANGEDBYID] = @CHANGEAGENTID,
          [DATECHANGED] = @CURRENTDATE
        where [ID] = @SEGMENTATIONID;




        /************************/
        /* Save the list record */
        /************************/
        if @SAVELISTRECORD = 1
          begin
            if @EXISTINGLIST = 1
              begin
                --This batch does not currently save the cost fields on the list record, but we still need to make sure
                --we set the exchange rate and organization amounts correct.
                declare @LISTRENTALCOST money;
                declare @LISTEXCHANGECOST money;

                select
                  @LISTRENTALCOST = [MKTLIST].[BASERENTALCOST],
                  @LISTEXCHANGECOST = [MKTLIST].[BASEEXCHANGECOST],
                  @CURRENCYEXCHANGERATEID = [CURRENCYEXCHANGERATEID],
                  @LISTDESCRIPTION = (case when @LISTDESCRIPTION = '' then [DESCRIPTION] else @LISTDESCRIPTION end),
                  @LISTCODE = (case when @LISTCODE = '' then [CODE] else @LISTCODE end),
                  @LISTCODEVALUEID = (case when @LISTCODEVALUEID is null then [PARTDEFINITIONVALUESID] else @LISTCODEVALUEID end),
                  @LISTCATEGORYCODEID = (case when @LISTCATEGORYCODEID is null then [LISTCATEGORYCODEID] else @LISTCATEGORYCODEID end),
                  @LISTVENDORID = (case when @LISTVENDORID is null then [VENDORID] else @LISTVENDORID end),
                  @LISTSITEID = (case when @LISTSITEID = [SITEID] or (@LISTSITEISNULL = 0 and @LISTSITEID is null) then [SITEID] else @LISTSITEID end),
                  @DATEADDED = [DATEADDED]
                from dbo.[MKTLIST]
                where [ID] = @LISTID;

                if @ORGANIZATIONCURRENCYID = @BASECURRENCYID
                  begin
                    set @LISTORGANIZATIONRENTALCOST = @LISTRENTALCOST;
                    set @LISTORGANIZATIONEXCHANGECOST = @LISTEXCHANGECOST;
                  end
                else
                  begin
                    if @CURRENCYEXCHANGERATEID is null
                      set @CURRENCYEXCHANGERATEID = dbo.[UFN_CURRENCYEXCHANGERATE_GETLATEST](@BASECURRENCYID, @ORGANIZATIONCURRENCYID, @DATEADDED, 0, null);

                    set @LISTORGANIZATIONRENTALCOST = dbo.[UFN_CURRENCY_CONVERT](@LISTRENTALCOST, @CURRENCYEXCHANGERATEID);
                    set @LISTORGANIZATIONEXCHANGECOST = dbo.[UFN_CURRENCY_CONVERT](@LISTEXCHANGECOST, @CURRENCYEXCHANGERATEID);
                  end

       update dbo.[MKTLIST] set
                  [NAME] = @LISTNAME,
                  [DESCRIPTION] = @LISTDESCRIPTION,
                  [PARTDEFINITIONVALUESID] = @LISTCODEVALUEID,
                  [CODE] = @LISTCODE,
                  [LISTCATEGORYCODEID] = @LISTCATEGORYCODEID,
                  [VENDORID] = @LISTVENDORID,
                  [ORGANIZATIONBASERENTALCOST] = @LISTORGANIZATIONRENTALCOST,
                  [ORGANIZATIONBASEEXCHANGECOST] = @LISTORGANIZATIONEXCHANGECOST,
                  [CURRENCYEXCHANGERATEID] = @CURRENCYEXCHANGERATEID,
                  [SITEID] = @LISTSITEID,
                  [CHANGEDBYID] = @CHANGEAGENTID,
                  [DATECHANGED] = @CURRENTDATE
                where [ID] = @LISTID;
              end
            else
              begin
                if @LISTID is null
                  set @LISTID = newid();

                --This batch does not currently save the cost fields on the list record, but we still need to make sure
                --we set the exchange rate and organization amounts correct.
                if @ORGANIZATIONCURRENCYID = @BASECURRENCYID
                  begin
                    set @CURRENCYEXCHANGERATEID = null;
                    set @LISTORGANIZATIONRENTALCOST = 0;
                    set @LISTORGANIZATIONEXCHANGECOST = 0;
                  end
                else
                  begin
                    set @CURRENCYEXCHANGERATEID = @CURRENCYEXCHANGERATEIDCURRENT;
                    set @LISTORGANIZATIONRENTALCOST = 0;
                    set @LISTORGANIZATIONEXCHANGECOST = 0;
                  end

                insert into dbo.[MKTLIST] (
                  [ID],
                  [NAME],
                  [DESCRIPTION],
                  [PARTDEFINITIONVALUESID],
                  [CODE],
                  [LISTCATEGORYCODEID],
                  [VENDORID],
                  [RECORDSOURCEID],
                  [BASECURRENCYID],
                  [ORGANIZATIONBASERENTALCOST],
                  [ORGANIZATIONBASEEXCHANGECOST],
                  [CURRENCYEXCHANGERATEID],
                  [SITEID],
                  [ADDEDBYID],
                  [CHANGEDBYID],
                  [DATEADDED],
                  [DATECHANGED]
                ) values (
                  @LISTID,
                  @LISTNAME,
                  @LISTDESCRIPTION,
                  @LISTCODEVALUEID,
                  @LISTCODE,
                  @LISTCATEGORYCODEID,
                  @LISTVENDORID,
                  @RECORDSOURCEID,
                  @BASECURRENCYID,
                  @LISTORGANIZATIONRENTALCOST,
                  @LISTORGANIZATIONEXCHANGECOST,
                  @CURRENCYEXCHANGERATEID,
                  @LISTSITEID,
                  @CHANGEAGENTID,
                  @CHANGEAGENTID,
                  @CURRENTDATE,
                  @CURRENTDATE
                );
              end
          end




        /********************/
        /* Save the package */
        /********************/
        if @EXISTINGPACKAGE = 1
          begin
            select
              @CURRENCYEXCHANGERATEID = [CURRENCYEXCHANGERATEID],
              @PACKAGECODE = (case when @PACKAGECODE = '' then [CODE] else @PACKAGECODE end),
              @PACKAGECODEVALUEID = (case when @PACKAGECODEVALUEID is null then [PARTDEFINITIONVALUESID] else @PACKAGECODEVALUEID end),
              @PACKAGECHANNELCODE = (case when @PACKAGECHANNELCODE = '' then [CHANNELSOURCECODE] else @PACKAGECHANNELCODE end),
              @PACKAGECHANNELCODEVALUEID = (case when @PACKAGECHANNELCODEVALUEID is null then [CHANNELPARTDEFINITIONVALUESID] else @PACKAGECHANNELCODEVALUEID end),
              @PACKAGECATEGORYCODEID = (case when @PACKAGECATEGORYCODEID is null then [PACKAGECATEGORYCODEID] else @PACKAGECATEGORYCODEID end),
              @PACKAGECOST = (case when @PACKAGECOST = 0 then [UNITCOST] else @PACKAGECOST end),
              @PACKAGECOSTDISTRIBUTIONMETHODCODE = (case when @PACKAGECOSTDISTRIBUTIONMETHODCODE = 0 then [COSTDISTRIBUTIONMETHODCODE] else @PACKAGECOSTDISTRIBUTIONMETHODCODE end),
              @PACKAGEDESCRIPTION = (case when @PACKAGEDESCRIPTION = '' then [DESCRIPTION] else @PACKAGEDESCRIPTION end),
              @PACKAGESITEID = (case when @PACKAGESITEID = [SITEID] or (@PACKAGESITEISNULL = 0  and @PACKAGESITEID is null) then [SITEID] else @PACKAGESITEID end),
              @DATEADDED = [DATEADDED]
            from dbo.[MKTPACKAGE]
            where [ID] = @PACKAGEID;

            if @ORGANIZATIONCURRENCYID = @BASECURRENCYID
              set @PACKAGEORGANIZATIONCOST = @PACKAGECOST;
            else
              begin
                if @CURRENCYEXCHANGERATEID is null
                  set @CURRENCYEXCHANGERATEID = dbo.[UFN_CURRENCYEXCHANGERATE_GETLATEST](@BASECURRENCYID, @ORGANIZATIONCURRENCYID, @DATEADDED, 0, null);

                set @PACKAGEORGANIZATIONCOST = dbo.[UFN_CURRENCY_CONVERT](@PACKAGECOST, @CURRENCYEXCHANGERATEID);
              end

            update dbo.[MKTPACKAGE] set
              [NAME] = @PACKAGENAME,
              [DESCRIPTION] = @PACKAGEDESCRIPTION,
              [PARTDEFINITIONVALUESID] = @PACKAGECODEVALUEID,
              [CODE] = @PACKAGECODE,
              [CHANNELPARTDEFINITIONVALUESID] = @PACKAGECHANNELCODEVALUEID,
              [CHANNELSOURCECODE] = @PACKAGECHANNELCODE,
              [PACKAGECATEGORYCODEID] = @PACKAGECATEGORYCODEID,
              [UNITCOST] = @PACKAGECOST,
              [COSTDISTRIBUTIONMETHODCODE] = @PACKAGECOSTDISTRIBUTIONMETHODCODE,
              [ORGANIZATIONUNITCOST] = @PACKAGEORGANIZATIONCOST,
              [CURRENCYEXCHANGERATEID] = @CURRENCYEXCHANGERATEID,
              [SITEID] = @PACKAGESITEID,
              [CHANGEDBYID] = @CHANGEAGENTID,
              [DATECHANGED] = @CURRENTDATE
            where [ID] = @PACKAGEID;
          end
        else
          begin
            if @PACKAGEID is null
              set @PACKAGEID = newid();

            if @ORGANIZATIONCURRENCYID = @BASECURRENCYID
              begin
                set @CURRENCYEXCHANGERATEID = null;
                set @PACKAGEORGANIZATIONCOST = @PACKAGECOST;
              end
            else
              begin
                set @CURRENCYEXCHANGERATEID = @CURRENCYEXCHANGERATEIDCURRENT;
                set @PACKAGEORGANIZATIONCOST = dbo.[UFN_CURRENCY_CONVERT](@PACKAGECOST, @CURRENCYEXCHANGERATEID);
              end

            insert into dbo.[MKTPACKAGE] (
              [ID],
              [NAME],
              [DESCRIPTION],
              [PARTDEFINITIONVALUESID],
              [CODE],
              [CHANNELPARTDEFINITIONVALUESID],
              [CHANNELSOURCECODE],
              [PACKAGECATEGORYCODEID],
              [CHANNELCODE],
              [UNITCOST],
              [COSTDISTRIBUTIONMETHODCODE],
              [BASECURRENCYID],
              [ORGANIZATIONUNITCOST],
              [CURRENCYEXCHANGERATEID],
              [SITEID],
              [ADDEDBYID],
              [CHANGEDBYID],
              [DATEADDED],
              [DATECHANGED]
            ) values (
              @PACKAGEID,
              @PACKAGENAME,
              @PACKAGEDESCRIPTION,
              @PACKAGECODEVALUEID,
              @PACKAGECODE,
              @PACKAGECHANNELCODEVALUEID,
              @PACKAGECHANNELCODE,
              @PACKAGECATEGORYCODEID,
              @PACKAGETYPECODE,
              @PACKAGECOST,
              @PACKAGECOSTDISTRIBUTIONMETHODCODE,
              @BASECURRENCYID,
              @PACKAGEORGANIZATIONCOST,
              @CURRENCYEXCHANGERATEID,
              @PACKAGESITEID,
              @CHANGEAGENTID,
              @CHANGEAGENTID,
              @CURRENTDATE,
              @CURRENTDATE
            );
          end





        /********************************/
        /* Save the base segment record */
        /********************************/
        if @EXISTINGSEGMENT = 1
          begin
            select
              @OLDCODE = [MKTSEGMENT].[CODE],
              @OLDLISTID = [MKTSEGMENTLIST].[LISTID],
              @SEGMENTDESCRIPTION = (case when @SEGMENTDESCRIPTION = '' then [DESCRIPTION] else @SEGMENTDESCRIPTION end),
              @SEGMENTCODE = (case when @SEGMENTCODE = '' then [CODE] else @SEGMENTCODE end),
              @SEGMENTCODEVALUEID = (case when @SEGMENTCODEVALUEID is null then [PARTDEFINITIONVALUESID] else @SEGMENTCODEVALUEID end),
              @SEGMENTCATEGORYCODEID = (case when @SEGMENTCATEGORYCODEID is null then [SEGMENTCATEGORYCODEID] else @SEGMENTCATEGORYCODEID end),
              @SEGMENTSITEID = (case when @SEGMENTSITEID = [SITEID] or (@SEGMENTSITEISNULL = 0 and @SEGMENTSITEID is null) then [SITEID] else @SEGMENTSITEID end)
            from dbo.[MKTSEGMENT]
            left join dbo.[MKTSEGMENTLIST] on [MKTSEGMENTLIST].[ID] = [MKTSEGMENT].[CURRENTSEGMENTLISTID]
            where [MKTSEGMENT].[ID] = @SEGMENTID;

            update dbo.[MKTSEGMENT] set
              [NAME] = @SEGMENTNAME,
              [DESCRIPTION] = @SEGMENTDESCRIPTION,
              [PARTDEFINITIONVALUESID] = @SEGMENTCODEVALUEID,
              [CODE] = @SEGMENTCODE,
              [SEGMENTCATEGORYCODEID] = @SEGMENTCATEGORYCODEID,
              [SITEID] = @SEGMENTSITEID,
              [CHANGEDBYID] = @CHANGEAGENTID,
              [DATECHANGED] = @CURRENTDATE
            where [ID] = @SEGMENTID;

            if @SEGMENTTYPECODE = 2 and @LISTID <> @OLDLISTID
              --Update the list ID, but only if they changed list ID...
              update dbo.[MKTSEGMENTLIST] set
                [LISTID] = @LISTID,
                [CHANGEDBYID] = @CHANGEAGENTID,
                [DATECHANGED] = @CURRENTDATE
              from dbo.[MKTSEGMENTLIST] as [SL]
              inner join dbo.[MKTSEGMENT] on [MKTSEGMENT].[CURRENTSEGMENTLISTID] = [SL].[ID]
              where [MKTSEGMENT].[ID] = @SEGMENTID;

            if @SEGMENTCODE <> @OLDCODE
              --Update the code on all the non-activated mailing segments that use the same base segment, but only if they changed the code...
              update dbo.[MKTSEGMENTATIONSEGMENT] set
                [CODE] = @SEGMENTCODE,
                [PARTDEFINITIONVALUESID] = @SEGMENTCODEVALUEID,
                [CHANGEDBYID] = @CHANGEAGENTID,
                [DATECHANGED] = @CURRENTDATE
              from dbo.[MKTSEGMENTATIONSEGMENT] as [SS]
              inner join dbo.[MKTSEGMENTATION] on [MKTSEGMENTATION].[ID] = [SS].[SEGMENTATIONID]
              inner join dbo.[MKTSOURCECODE] on [MKTSOURCECODE].[ID] = [MKTSEGMENTATION].[SOURCECODEID]
              inner join dbo.[MKTSOURCECODEITEM] on [MKTSOURCECODEITEM].[SOURCECODEID] = [MKTSOURCECODE].[ID]
              inner join dbo.[MKTSOURCECODEPARTDEFINITION] on [MKTSOURCECODEPARTDEFINITION].[ID] = [MKTSOURCECODEITEM].[MKTSOURCECODEPARTDEFINITIONID]
              where [SS].[SEGMENTID] = @SEGMENTID
              and [MKTSEGMENTATION].[ACTIVE] = 0  --Not activated
              and [MKTSOURCECODEPARTDEFINITION].[ITEMTYPECODE] = 1;  --Segment sourcecode part
          end
        else
          begin
            if @SEGMENTID is null
              set @SEGMENTID = newid();

            insert into dbo.[MKTSEGMENT] (
              [ID],
              [NAME],
              [DESCRIPTION],
              [PARTDEFINITIONVALUESID],
              [CODE],
              [SEGMENTCATEGORYCODEID],
              [SEGMENTTYPECODE],
              [QUERYVIEWCATALOGID],
              [SITEID],
              [ADDEDBYID],
              [CHANGEDBYID],
              [DATEADDED],
              [DATECHANGED]
            ) values (
              @SEGMENTID,
              @SEGMENTNAME,
              @SEGMENTDESCRIPTION,
              @SEGMENTCODEVALUEID,
              @SEGMENTCODE,
              @SEGMENTCATEGORYCODEID,
              @SEGMENTTYPECODE,
              @RECORDSOURCEID,
              @SEGMENTSITEID,
              @CHANGEAGENTID,
              @CHANGEAGENTID,
              @CURRENTDATE,
              @CURRENTDATE
            );

 if @SEGMENTTYPECODE = 1 --Constituent
              begin
                --Insert a parameter set for the refresh process for this segment...
                insert into dbo.[MKTSEGMENTREFRESHPROCESS] (
                  [ID],
                  [SEGMENTID],
                  [ADDEDBYID],
                  [CHANGEDBYID],
                  [DATEADDED],
                  [DATECHANGED]
                ) values (
                  newid(),
                  @SEGMENTID,
                  @CHANGEAGENTID,
                  @CHANGEAGENTID,
                  @CURRENTDATE,
                  @CURRENTDATE
                );

                --Create the base segment view and add it to the IDSETREGISTER table...
                exec dbo.[USP_MKTSEGMENT_CREATEORUPDATEVIEW] @SEGMENTID, @CHANGEAGENTID;
              end
            else if @SEGMENTTYPECODE = 2 --List
              begin
                --Save the list segment specific info...
                declare @MKTSEGMENTLISTID uniqueidentifier = newid();

                if @ORGANIZATIONCURRENCYID = @BASECURRENCYID
                  begin
                    set @CURRENCYEXCHANGERATEID = null;
                    set @SEGMENTORGANIZATIONRENTALCOST = @SEGMENTRENTALCOST;
                    set @SEGMENTORGANIZATIONEXCHANGECOST = @SEGMENTEXCHANGECOST;
                  end
                else
                  begin
                    set @CURRENCYEXCHANGERATEID = @CURRENCYEXCHANGERATEIDCURRENT;
                    set @SEGMENTORGANIZATIONRENTALCOST = dbo.[UFN_CURRENCY_CONVERT](@SEGMENTRENTALCOST, @CURRENCYEXCHANGERATEID);
                    set @SEGMENTORGANIZATIONEXCHANGECOST = dbo.[UFN_CURRENCY_CONVERT](@SEGMENTEXCHANGECOST, @CURRENCYEXCHANGERATEID);
                  end

                insert into dbo.[MKTSEGMENTLIST] (
                  [ID],
                  [SEGMENTID],
                  [LISTID],
                  [TYPECODE],
                  [STATUSCODE],
                  [RENTALQUANTITY],
                  [RENTALCOSTADJUSTMENT],
                  [RENTALCOSTBASISCODE],
                  [EXCHANGEQUANTITY],
                  [EXCHANGECOSTADJUSTMENT],
                  [EXCHANGECOSTBASISCODE],
                  [BASECURRENCYID],
                  [ORGANIZATIONRENTALCOSTADJUSTMENT],
                  [ORGANIZATIONEXCHANGECOSTADJUSTMENT],
                  [CURRENCYEXCHANGERATEID],
                  [ADDEDBYID],
                  [CHANGEDBYID],
                  [DATEADDED],
                  [DATECHANGED]
                ) values (
                  @MKTSEGMENTLISTID,
                  @SEGMENTID,
                  @LISTID,
                  1, --Vendor managed
                  3, --Active
                  @SEGMENTRENTALQUANTITY,
                  @SEGMENTRENTALCOST,
                  @SEGMENTRENTALCOSTBASISCODE,
                  @SEGMENTEXCHANGEQUANTITY,
                  @SEGMENTEXCHANGECOST,
                  @SEGMENTEXCHANGECOSTBASISCODE,
                  @BASECURRENCYID,
                  @SEGMENTORGANIZATIONRENTALCOST,
                  @SEGMENTORGANIZATIONEXCHANGECOST,
                  @CURRENCYEXCHANGERATEID,
                  @CHANGEAGENTID,
                  @CHANGEAGENTID,
                  @CURRENTDATE,
                  @CURRENTDATE
                );

                --Update the segment to hold the current list segment record ID...
                --Need to set the CODE field again here so the check constraint gets validated now that we have set the CURRENTSEGMENTLISTID field.
                update dbo.[MKTSEGMENT] set
                  [CURRENTSEGMENTLISTID] = @MKTSEGMENTLISTID,
                  [CODE] = @SEGMENTCODE,
                  [BASECURRENCYID] = @BASECURRENCYID,
                  [CHANGEDBYID] = @CHANGEAGENTID,
                  [DATECHANGED] = @CURRENTDATE
                where [ID] = @SEGMENTID;
              end
          end




        /***********************************/
        /* Save the mailing segment record */
        /***********************************/
        --Only if this row doesn't have test segment info...
        if @SAVETESTSEGMENTRECORD = 0
          begin
            if @EXISTINGSEGMENT = 1 and @SEGMENTATIONSEGMENTID is not null
              begin
                select
                  @OLDSEGMENTID = [MKTSEGMENTATIONSEGMENT].[SEGMENTID],
                  @OLDPACKAGEID = [MKTSEGMENTATIONSEGMENT].[PACKAGEID],
                  @OLDPACKAGETYPECODE = [MKTPACKAGE].[CHANNELCODE],
                  @USEADDRESSPROCESSING = (case when [MKTSEGMENTATIONSEGMENT].[USEADDRESSPROCESSING] = 1 and [MKTSEGMENTATIONSEGMENT].[ADDRESSPROCESSINGOPTIONID] is not null then 1 else 0 end),
                  @SEQUENCE = [MKTSEGMENTATIONSEGMENT].[SEQUENCE],
                  @CURRENCYEXCHANGERATEID = [MKTSEGMENTATIONSEGMENT].[CURRENCYEXCHANGERATEID],
                  @DATEADDED = [MKTSEGMENTATIONSEGMENT].[DATEADDED]
                from dbo.[MKTSEGMENTATIONSEGMENT]
                inner join dbo.[MKTPACKAGE] on [MKTPACKAGE].[ID] = [MKTSEGMENTATIONSEGMENT].[PACKAGEID]
                where [MKTSEGMENTATIONSEGMENT].[ID] = @SEGMENTATIONSEGMENTID;

                if @ORGANIZATIONCURRENCYID = @BASECURRENCYID
                  set @SEGMENTORGANIZATIONEXPECTEDGIFTAMOUNT = @SEGMENTEXPECTEDGIFTAMOUNT;
                else
                  begin
                    if @CURRENCYEXCHANGERATEID is null
                      set @CURRENCYEXCHANGERATEID = dbo.[UFN_CURRENCYEXCHANGERATE_GETLATEST](@BASECURRENCYID, @ORGANIZATIONCURRENCYID, @DATEADDED, 0, null);

                    set @SEGMENTORGANIZATIONEXPECTEDGIFTAMOUNT = dbo.[UFN_CURRENCY_CONVERT](@SEGMENTEXPECTEDGIFTAMOUNT, @CURRENCYEXCHANGERATEID);
                  end

                update dbo.[MKTSEGMENTATIONSEGMENT] set 
                  [SEGMENTID] = @SEGMENTID,
                  [PARTDEFINITIONVALUESID] = @SEGMENTCODEVALUEID,
                  [CODE] = @SEGMENTCODE,
                  [TESTPARTDEFINITIONVALUESID] = @TESTSEGMENTCODEVALUEID,
                  [TESTSEGMENTCODE] = @TESTSEGMENTCODE,
                  [PACKAGEID] = @PACKAGEID,
                  [RESPONSERATE] = @SEGMENTEXPECTEDRESPONSERATE,
                  [GIFTAMOUNT] = @SEGMENTEXPECTEDGIFTAMOUNT,
                  [USAGECODE] = @SEGMENTUSAGECODE,
                  [ORGANIZATIONGIFTAMOUNT] = @SEGMENTORGANIZATIONEXPECTEDGIFTAMOUNT,
                  [CURRENCYEXCHANGERATEID] = @CURRENCYEXCHANGERATEID,
                  [CHANGEDBYID] = @CHANGEAGENTID,
                  [DATECHANGED] = @CURRENTDATE
                where [ID] = @SEGMENTATIONSEGMENTID;

                --Clear the segment cache if the segment changed or if address processing is being used and the new package has a different
                --channel than the old one, since the package's channel can affect record counts when address processing is used.
                if (@OLDSEGMENTID <> @SEGMENTID) or (@OLDPACKAGETYPECODE <> @PACKAGETYPECODE and @USEADDRESSPROCESSING = 1)
                  begin
                    --Clear the cache for this segment and all segments after it with the same record type...
                    exec dbo.[USP_MKTSEGMENTATIONSEGMENT_CLEARCACHE] @SEGMENTATIONSEGMENTID, 1, 1;
                  end

                --Parse the full sourcecode and save any user defined parts that override the marketing effort defaults...
                exec dbo.[USP_MKTSOURCECODEPART_SAVEUSERDEFINEDPARTSFROMCODE] @SOURCECODE, @SEGMENTATIONSEGMENTID, null, @CHANGEAGENTID, @CURRENTDATE;

                if @SEGMENTTYPECODE = 2
                  begin
                    --Set the list quantities and cost overrides (we always set the quantities as overrides here)...
                    if not exists(select 1 from dbo.[MKTSEGMENTATIONSEGMENTLIST] where [ID] = @SEGMENTATIONSEGMENTID)
                      begin
                        if @ORGANIZATIONCURRENCYID = @BASECURRENCYID
                          begin
                            set @CURRENCYEXCHANGERATEID = null;

                            select
                              @LISTORGANIZATIONRENTALCOST = [MKTLIST].[BASERENTALCOST],
                              @LISTORGANIZATIONEXCHANGECOST = [MKTLIST].[BASEEXCHANGECOST]
                            from dbo.[MKTSEGMENT]
                            inner join dbo.[MKTSEGMENTLIST] on [MKTSEGMENTLIST].[ID] = [MKTSEGMENT].[CURRENTSEGMENTLISTID]
                            inner join dbo.[MKTLIST] on [MKTLIST].[ID] = [MKTSEGMENTLIST].[LISTID]
                            where [MKTSEGMENT].[ID] = @SEGMENTID;

                            set @SEGMENTORGANIZATIONRENTALCOST = @SEGMENTRENTALCOST;
                            set @SEGMENTORGANIZATIONEXCHANGECOST = @SEGMENTEXCHANGECOST;
                          end
                        else
                          begin
                            set @CURRENCYEXCHANGERATEID = @CURRENCYEXCHANGERATEIDCURRENT;

                            select
                              @LISTORGANIZATIONRENTALCOST = dbo.[UFN_CURRENCY_CONVERT]([MKTLIST].[BASERENTALCOST], @CURRENCYEXCHANGERATEID),
                              @LISTORGANIZATIONEXCHANGECOST = dbo.[UFN_CURRENCY_CONVERT]([MKTLIST].[BASEEXCHANGECOST], @CURRENCYEXCHANGERATEID)
                            from dbo.[MKTSEGMENT]
                            inner join dbo.[MKTSEGMENTLIST] on [MKTSEGMENTLIST].[ID] = [MKTSEGMENT].[CURRENTSEGMENTLISTID]
                            inner join dbo.[MKTLIST] on [MKTLIST].[ID] = [MKTSEGMENTLIST].[LISTID]
                            where [MKTSEGMENT].[ID] = @SEGMENTID;

                            set @SEGMENTORGANIZATIONRENTALCOST = dbo.[UFN_CURRENCY_CONVERT](@SEGMENTRENTALCOST, @CURRENCYEXCHANGERATEID);
                            set @SEGMENTORGANIZATIONEXCHANGECOST = dbo.[UFN_CURRENCY_CONVERT](@SEGMENTEXCHANGECOST, @CURRENCYEXCHANGERATEID);
                          end

                        insert into dbo.[MKTSEGMENTATIONSEGMENTLIST] (
                          [ID],
                          [OVERRIDEQUANTITIESANDORSEGMENTCOSTS],
                          [BASERENTALCOST],
                          [BASERENTALCOSTBASISCODE],
                          [BASEEXCHANGECOST],
                          [BASEEXCHANGECOSTBASISCODE],
                          [RENTALQUANTITY],
                          [RENTALCOSTADJUSTMENT],
                          [RENTALCOSTADJUSTMENTBASISCODE],
                          [EXCHANGEQUANTITY],
                          [EXCHANGECOSTADJUSTMENT],
                          [EXCHANGECOSTADJUSTMENTBASISCODE],
                          [BASECURRENCYID],
                          [ORGANIZATIONBASERENTALCOST],
                          [ORGANIZATIONBASEEXCHANGECOST],
                          [ORGANIZATIONRENTALCOSTADJUSTMENT],
                          [ORGANIZATIONEXCHANGECOSTADJUSTMENT],
                          [ORGANIZATIONCURRENCYEXCHANGERATEID],
                          [ADDEDBYID],
                          [CHANGEDBYID],
                          [DATEADDED],
                          [DATECHANGED]
                        )
                        select 
                          @SEGMENTATIONSEGMENTID,
                          1,
                          [MKTLIST].[BASERENTALCOST],
                          [MKTLIST].[BASERENTALCOSTBASISCODE],
                          [MKTLIST].[BASEEXCHANGECOST],
                          [MKTLIST].[BASEEXCHANGECOSTBASISCODE],
                          @SEGMENTRENTALQUANTITY,
                          @SEGMENTRENTALCOST,
                          @SEGMENTRENTALCOSTBASISCODE,
                          @SEGMENTEXCHANGEQUANTITY,
                          @SEGMENTEXCHANGECOST,
                          @SEGMENTEXCHANGECOSTBASISCODE,
                          @BASECURRENCYID,
                          @LISTORGANIZATIONRENTALCOST,
                          @LISTORGANIZATIONEXCHANGECOST,
                          @SEGMENTORGANIZATIONRENTALCOST,
           @SEGMENTORGANIZATIONEXCHANGECOST,
                          @CURRENCYEXCHANGERATEID,
                          @CHANGEAGENTID,
                          @CHANGEAGENTID,
                          @CURRENTDATE,
                          @CURRENTDATE
                        from dbo.[MKTSEGMENT]
                        inner join dbo.[MKTSEGMENTLIST] on [MKTSEGMENTLIST].[ID] = [MKTSEGMENT].[CURRENTSEGMENTLISTID]
                        inner join dbo.[MKTLIST] on [MKTLIST].[ID] = [MKTSEGMENTLIST].[LISTID]
                        where [MKTSEGMENT].[ID] = @SEGMENTID;
                      end
                    else
                      begin
                        select
                          @CURRENCYEXCHANGERATEID = [ORGANIZATIONCURRENCYEXCHANGERATEID],
                          @DATEADDED = [DATEADDED]
                        from dbo.[MKTSEGMENTATIONSEGMENTLIST]
                        where [ID] = @SEGMENTATIONSEGMENTID;

                        if @ORGANIZATIONCURRENCYID = @BASECURRENCYID
                          begin
                            set @SEGMENTORGANIZATIONRENTALCOST = @SEGMENTRENTALCOST;
                            set @SEGMENTORGANIZATIONEXCHANGECOST = @SEGMENTEXCHANGECOST;
                          end
                        else
                          begin
                            if @CURRENCYEXCHANGERATEID is null
                              set @CURRENCYEXCHANGERATEID = dbo.[UFN_CURRENCYEXCHANGERATE_GETLATEST](@BASECURRENCYID, @ORGANIZATIONCURRENCYID, @DATEADDED, 0, null);

                            set @SEGMENTORGANIZATIONRENTALCOST = dbo.[UFN_CURRENCY_CONVERT](@SEGMENTRENTALCOST, @CURRENCYEXCHANGERATEID);
                            set @SEGMENTORGANIZATIONEXCHANGECOST = dbo.[UFN_CURRENCY_CONVERT](@SEGMENTEXCHANGECOST, @CURRENCYEXCHANGERATEID);
                          end

                        update dbo.[MKTSEGMENTATIONSEGMENTLIST] set 
                          [OVERRIDEQUANTITIESANDORSEGMENTCOSTS] = 1,
                          [RENTALQUANTITY] = @SEGMENTRENTALQUANTITY,
                          [RENTALCOSTADJUSTMENT] = @SEGMENTRENTALCOST,
                          [RENTALCOSTADJUSTMENTBASISCODE] = @SEGMENTRENTALCOSTBASISCODE,
                          [EXCHANGEQUANTITY] = @SEGMENTEXCHANGEQUANTITY,
                          [EXCHANGECOSTADJUSTMENT] = @SEGMENTEXCHANGECOST,
                          [EXCHANGECOSTADJUSTMENTBASISCODE] = @SEGMENTEXCHANGECOSTBASISCODE,
                          [ORGANIZATIONRENTALCOSTADJUSTMENT] = @SEGMENTORGANIZATIONRENTALCOST,
                          [ORGANIZATIONEXCHANGECOSTADJUSTMENT] = @SEGMENTORGANIZATIONEXCHANGECOST,
                          [ORGANIZATIONCURRENCYEXCHANGERATEID] = @CURRENCYEXCHANGERATEID,
                          [CHANGEDBYID] = @CHANGEAGENTID,
                          [DATECHANGED] = @CURRENTDATE
                        where [ID] = @SEGMENTATIONSEGMENTID;
                      end
                  end
              end
            else
              begin
                set @SEGMENTATIONSEGMENTID = newid();

                --Get the next segment sequence...
                select
                  @SEQUENCE = isnull(max([SEQUENCE]), 0) + 1
                from dbo.[MKTSEGMENTATIONSEGMENT]
                where [SEGMENTATIONID] = @SEGMENTATIONID;

                if @ORGANIZATIONCURRENCYID = @BASECURRENCYID
                  begin
                    set @CURRENCYEXCHANGERATEID = null;
                    set @SEGMENTORGANIZATIONEXPECTEDGIFTAMOUNT = @SEGMENTEXPECTEDGIFTAMOUNT;

                    if @SEGMENTTYPECODE = 2
                      begin
                        set @SEGMENTORGANIZATIONRENTALCOST = @SEGMENTRENTALCOST;
                        set @SEGMENTORGANIZATIONEXCHANGECOST = @SEGMENTEXCHANGECOST;

                        select
                          @LISTORGANIZATIONRENTALCOST = [MKTLIST].[BASERENTALCOST],
                          @LISTORGANIZATIONEXCHANGECOST = [MKTLIST].[BASEEXCHANGECOST]
                        from dbo.[MKTSEGMENT]
                        inner join dbo.[MKTSEGMENTLIST] on [MKTSEGMENTLIST].[ID] = [MKTSEGMENT].[CURRENTSEGMENTLISTID]
                        inner join dbo.[MKTLIST] on [MKTLIST].[ID] = [MKTSEGMENTLIST].[LISTID]
                        where [MKTSEGMENT].[ID] = @SEGMENTID;
                      end
                  end
                else
                  begin
                    set @CURRENCYEXCHANGERATEID = @CURRENCYEXCHANGERATEIDCURRENT;
                    set @SEGMENTORGANIZATIONEXPECTEDGIFTAMOUNT = dbo.[UFN_CURRENCY_CONVERT](@SEGMENTEXPECTEDGIFTAMOUNT, @CURRENCYEXCHANGERATEID);

                    if @SEGMENTTYPECODE = 2
                      begin
                        set @SEGMENTORGANIZATIONRENTALCOST = dbo.[UFN_CURRENCY_CONVERT](@SEGMENTRENTALCOST, @CURRENCYEXCHANGERATEID);
                        set @SEGMENTORGANIZATIONEXCHANGECOST = dbo.[UFN_CURRENCY_CONVERT](@SEGMENTEXCHANGECOST, @CURRENCYEXCHANGERATEID);

                        select
                          @LISTORGANIZATIONRENTALCOST = dbo.[UFN_CURRENCY_CONVERT]([MKTLIST].[BASERENTALCOST], @CURRENCYEXCHANGERATEID),
                          @LISTORGANIZATIONEXCHANGECOST = dbo.[UFN_CURRENCY_CONVERT]([MKTLIST].[BASEEXCHANGECOST], @CURRENCYEXCHANGERATEID)
                        from dbo.[MKTSEGMENT]
                        inner join dbo.[MKTSEGMENTLIST] on [MKTSEGMENTLIST].[ID] = [MKTSEGMENT].[CURRENTSEGMENTLISTID]
                        inner join dbo.[MKTLIST] on [MKTLIST].[ID] = [MKTSEGMENTLIST].[LISTID]
                        where [MKTSEGMENT].[ID] = @SEGMENTID;
                      end
                  end

                insert into dbo.[MKTSEGMENTATIONSEGMENT] (
                  [ID],
                  [SEGMENTATIONID],
                  [SEGMENTID],
                  [PARTDEFINITIONVALUESID],
                  [CODE],
                  [TESTSEGMENTCODE],
                  [TESTPARTDEFINITIONVALUESID],
                  [PACKAGEID],
                  [RESPONSERATE],
                  [GIFTAMOUNT],
                  [USAGECODE],
                  [SEQUENCE],
                  [NEXTBRIEFSEQUENCE],
                  [BASECURRENCYID],
                  [ORGANIZATIONGIFTAMOUNT],
                  [CURRENCYEXCHANGERATEID],
                  [ADDEDBYID],
                  [CHANGEDBYID],
                  [DATEADDED],
                  [DATECHANGED]
                ) values (
                  @SEGMENTATIONSEGMENTID,
                  @SEGMENTATIONID,
                  @SEGMENTID,
                  @SEGMENTCODEVALUEID,
                  @SEGMENTCODE,
                  @TESTSEGMENTCODE,
                  @TESTSEGMENTCODEVALUEID,
                  @PACKAGEID,
                  @SEGMENTEXPECTEDRESPONSERATE,
                  @SEGMENTEXPECTEDGIFTAMOUNT,
                  @SEGMENTUSAGECODE,
                  @SEQUENCE,
                  1,
                  @BASECURRENCYID,
                  @SEGMENTORGANIZATIONEXPECTEDGIFTAMOUNT,
                  @CURRENCYEXCHANGERATEID,
                  @CHANGEAGENTID,
                  @CHANGEAGENTID,
                  @CURRENTDATE,
                  @CURRENTDATE
                );

                --Save and add the package to the mailing, only if it doesn't already exist...
                if not exists(select [ID] from dbo.[MKTSEGMENTATIONPACKAGE] where [SEGMENTATIONID] = @SEGMENTATIONID and [PACKAGEID] = @PACKAGEID)
                  exec dbo.[USP_DATAFORMTEMPLATE_ADD_MKTSEGMENTATIONPACKAGE] null, @CHANGEAGENTID, @SEGMENTATIONID, @PACKAGEID;

                --Parse the full sourcecode and save any user defined parts that override the marketing effort defaults...
                exec dbo.[USP_MKTSOURCECODEPART_SAVEUSERDEFINEDPARTSFROMCODE] @SOURCECODE, @SEGMENTATIONSEGMENTID, null, @CHANGEAGENTID, @CURRENTDATE;

                if @SEGMENTTYPECODE = 2
                  begin
   --Set the list quantities and cost overrides (we always set the quantities as overrides here)...
                    insert into dbo.[MKTSEGMENTATIONSEGMENTLIST] (
                      [ID],
                      [OVERRIDEQUANTITIESANDORSEGMENTCOSTS],
                      [BASERENTALCOST],
                      [BASERENTALCOSTBASISCODE],
                      [BASEEXCHANGECOST],
                      [BASEEXCHANGECOSTBASISCODE],
                      [RENTALQUANTITY],
                      [RENTALCOSTADJUSTMENT],
                      [RENTALCOSTADJUSTMENTBASISCODE],
                      [EXCHANGEQUANTITY],
                      [EXCHANGECOSTADJUSTMENT],
                      [EXCHANGECOSTADJUSTMENTBASISCODE],
                      [BASECURRENCYID],
                      [ORGANIZATIONBASERENTALCOST],
                      [ORGANIZATIONBASEEXCHANGECOST],
                      [ORGANIZATIONRENTALCOSTADJUSTMENT],
                      [ORGANIZATIONEXCHANGECOSTADJUSTMENT],
                      [ORGANIZATIONCURRENCYEXCHANGERATEID],
                      [ADDEDBYID],
                      [CHANGEDBYID],
                      [DATEADDED],
                      [DATECHANGED]
                    )
                    select 
                      @SEGMENTATIONSEGMENTID,
                      1,
                      [MKTLIST].[BASERENTALCOST],
                      [MKTLIST].[BASERENTALCOSTBASISCODE],
                      [MKTLIST].[BASEEXCHANGECOST],
                      [MKTLIST].[BASEEXCHANGECOSTBASISCODE],
                      @SEGMENTRENTALQUANTITY,
                      @SEGMENTRENTALCOST,
                      @SEGMENTRENTALCOSTBASISCODE,
                      @SEGMENTEXCHANGEQUANTITY,
                      @SEGMENTEXCHANGECOST,
                      @SEGMENTEXCHANGECOSTBASISCODE,
                      @BASECURRENCYID,
                      @LISTORGANIZATIONRENTALCOST,
                      @LISTORGANIZATIONEXCHANGECOST,
                      @SEGMENTORGANIZATIONRENTALCOST,
                      @SEGMENTORGANIZATIONEXCHANGECOST,
                      @CURRENCYEXCHANGERATEID,
                      @CHANGEAGENTID,
                      @CHANGEAGENTID,
                      @CURRENTDATE,
                      @CURRENTDATE
                    from dbo.[MKTSEGMENT]
                    inner join dbo.[MKTSEGMENTLIST] on [MKTSEGMENTLIST].[ID] = [MKTSEGMENT].[CURRENTSEGMENTLISTID]
                    inner join dbo.[MKTLIST] on [MKTLIST].[ID] = [MKTSEGMENTLIST].[LISTID]
                    where [MKTSEGMENT].[ID] = @SEGMENTID;
                  end
              end
          end




        /*************************/
        /* Save the test segment */
        /*************************/
        if @SAVETESTSEGMENTRECORD = 1
          begin
            if @EXISTINGTESTSEGMENT = 1
              begin
                select
                  @OLDPACKAGEID = [PACKAGEID],
                  @CURRENCYEXCHANGERATEID = [ORGANIZATIONCURRENCYEXCHANGERATEID],
                  @DATEADDED = [DATEADDED]
                from dbo.[MKTSEGMENTATIONTESTSEGMENT]
                where [ID] = @TESTSEGMENTID;

                if @ORGANIZATIONCURRENCYID = @BASECURRENCYID
                  set @TESTSEGMENTORGANIZATIONEXPECTEDGIFTAMOUNT = @TESTSEGMENTEXPECTEDGIFTAMOUNT;
                else
                  begin
                    if @CURRENCYEXCHANGERATEID is null
                      set @CURRENCYEXCHANGERATEID = dbo.[UFN_CURRENCYEXCHANGERATE_GETLATEST](@BASECURRENCYID, @ORGANIZATIONCURRENCYID, @DATEADDED, 0, null);

                    set @TESTSEGMENTORGANIZATIONEXPECTEDGIFTAMOUNT = dbo.[UFN_CURRENCY_CONVERT](@TESTSEGMENTEXPECTEDGIFTAMOUNT, @CURRENCYEXCHANGERATEID);
                  end

                update dbo.[MKTSEGMENTATIONTESTSEGMENT] set
                  [PREFIXCODE] = 0,
                  [NAME] = @TESTSEGMENTNAME,
                  [DESCRIPTION] = @TESTSEGMENTDESCRIPTION,
                  [PARTDEFINITIONVALUESID] = @SEGMENTCODEVALUEID,
                  [CODE] = @SEGMENTCODE,
                  [TESTPARTDEFINITIONVALUESID] = @TESTSEGMENTCODEVALUEID,
                  [TESTSEGMENTCODE] = @TESTSEGMENTCODE,
                  [PACKAGEID] = @PACKAGEID,
                  [GIFTAMOUNT] = @TESTSEGMENTEXPECTEDGIFTAMOUNT,
                  [RESPONSERATE] = @TESTSEGMENTEXPECTEDRESPONSERATE,
                  [SAMPLESIZE] = @TESTSEGMENTQUANTITY,
                  [SAMPLESIZETYPECODE] = 1,
                  [ORGANIZATIONGIFTAMOUNT] = @TESTSEGMENTORGANIZATIONEXPECTEDGIFTAMOUNT,
                  [ORGANIZATIONCURRENCYEXCHANGERATEID] = @CURRENCYEXCHANGERATEID,
                  [CHANGEDBYID] = @CHANGEAGENTID,
                  [DATECHANGED] = @CURRENTDATE
                where [ID] = @TESTSEGMENTID;
              end
            else
              begin
                if @TESTSEGMENTID is null
                  set @TESTSEGMENTID = newid();

                --Get the next test segment sequence...
                select
                  @SEQUENCE = isnull(max([SEQUENCE]), 0) + 1
                from dbo.[MKTSEGMENTATIONTESTSEGMENT]
                where [SEGMENTID] = @SEGMENTATIONSEGMENTID;

                if @ORGANIZATIONCURRENCYID = @BASECURRENCYID
                  begin
                    set @CURRENCYEXCHANGERATEID = null;
                    set @TESTSEGMENTORGANIZATIONEXPECTEDGIFTAMOUNT = @TESTSEGMENTEXPECTEDGIFTAMOUNT;
                  end
                else
                  begin
                    set @CURRENCYEXCHANGERATEID = @CURRENCYEXCHANGERATEIDCURRENT;
                    set @TESTSEGMENTORGANIZATIONEXPECTEDGIFTAMOUNT = dbo.[UFN_CURRENCY_CONVERT](@TESTSEGMENTEXPECTEDGIFTAMOUNT, @CURRENCYEXCHANGERATEID);
                  end

                insert into dbo.[MKTSEGMENTATIONTESTSEGMENT] (
                  [ID],
                  [SEGMENTID],
                  [NAME],
                  [DESCRIPTION],
                  [PARTDEFINITIONVALUESID],
                  [CODE],
                  [TESTPARTDEFINITIONVALUESID],
                  [TESTSEGMENTCODE],
                  [PACKAGEID],
                  [GIFTAMOUNT],
                  [RESPONSERATE],
                  [SAMPLESIZE],
                  [SAMPLESIZETYPECODE],
                  [SEQUENCE],
                  [BASECURRENCYID],
                  [ORGANIZATIONGIFTAMOUNT],
                  [ORGANIZATIONCURRENCYEXCHANGERATEID],
                  [ADDEDBYID],
                  [CHANGEDBYID],
                  [DATEADDED],
                  [DATECHANGED]
                ) values (
                  @TESTSEGMENTID,
                  @SEGMENTATIONSEGMENTID,
                  @TESTSEGMENTNAME,
                  @TESTSEGMENTDESCRIPTION,
                  @SEGMENTCODEVALUEID,
                  @SEGMENTCODE,
                  @TESTSEGMENTCODEVALUEID,
                  @TESTSEGMENTCODE,
                  @PACKAGEID,
                  @TESTSEGMENTEXPECTEDGIFTAMOUNT,
                  @TESTSEGMENTEXPECTEDRESPONSERATE,
                  @TESTSEGMENTQUANTITY,
                  1,
                  @SEQUENCE,
                  @BASECURRENCYID,
                  @TESTSEGMENTORGANIZATIONEXPECTEDGIFTAMOUNT,
                  @CURRENCYEXCHANGERATEID,
                  @CHANGEAGENTID,
                  @CHANGEAGENTID,
                  @CURRENTDATE,
                  @CURRENTDATE
                );
              end

            --Parse the full sourcecode and save any user defined parts that override the marketing effort defaults...
            exec dbo.[USP_MKTSOURCECODEPART_SAVEUSERDEFINEDPARTSFROMCODE] @SOURCECODE, null, @TESTSEGMENTID, @CHANGEAGENTID, @CURRENTDATE;
          end




        /***********************************************************/
        /* Update the package information for the marketing effort */
        /***********************************************************/
        if ((@EXISTINGSEGMENT = 1 and @SEGMENTATIONSEGMENTID is not null) or @EXISTINGTESTSEGMENT = 1) and @OLDPACKAGEID <> @PACKAGEID
          begin
            --Remove the old package, only if is not being used by any other segments and test segments...
            if not exists(select 1 from dbo.[MKTSEGMENTATIONSEGMENT] where [SEGMENTATIONID] = @SEGMENTATIONID and [PACKAGEID] = @OLDPACKAGEID) and
               not exists(select 1 from dbo.[MKTSEGMENTATIONTESTSEGMENT] inner join dbo.[MKTSEGMENTATIONSEGMENT] on [MKTSEGMENTATIONSEGMENT].[ID] = [MKTSEGMENTATIONTESTSEGMENT].[SEGMENTID] where [MKTSEGMENTATIONSEGMENT].[SEGMENTATIONID] = @SEGMENTATIONID and [MKTSEGMENTATIONTESTSEGMENT].[PACKAGEID] = @OLDPACKAGEID)
              begin
                declare @OLDSEGMENTATIONPACKAGEID uniqueidentifier;

                select
                  @OLDSEGMENTATIONPACKAGEID = [ID]
                from dbo.[MKTSEGMENTATIONPACKAGE]
                where [SEGMENTATIONID] = @SEGMENTATIONID
                and [PACKAGEID] = @OLDPACKAGEID;

                exec dbo.[USP_MKTSEGMENTATIONPACKAGE_DELETE] @OLDSEGMENTATIONPACKAGEID, @CHANGEAGENTID;
              end
          end

        --Add the new package, only if it doesn't exist already...
        if not exists(select 1 from dbo.[MKTSEGMENTATIONPACKAGE] where [SEGMENTATIONID] = @SEGMENTATIONID and [PACKAGEID] = @PACKAGEID)
          exec dbo.[USP_DATAFORMTEMPLATE_ADD_MKTSEGMENTATIONPACKAGE] null, @CHANGEAGENTID, @SEGMENTATIONID, @PACKAGEID;




        /*****************************************************************************/
        /* Return an meaningful ID that can be used to identify the committed record */
        /*****************************************************************************/
        if @SAVETESTSEGMENTRECORD = 1
          set @ID = @TESTSEGMENTID;
        else
          set @ID = @SEGMENTATIONSEGMENTID;
      end
  end try

  begin catch
    exec dbo.[USP_RAISE_ERROR];
    return 1;
  end catch

  return 0;