USP_REVENUESPLIT_APPLYBUSINESSUNITS

Applies business units for a revenue split given mailing, appeal and segments (no solicitors).

Parameters

Parameter Parameter Type Mode Description
@REVENUEID uniqueidentifier IN
@CHANGEAGENTID uniqueidentifier IN
@CHANGEDATE datetime IN

Definition

Copy


CREATE procedure dbo.USP_REVENUESPLIT_APPLYBUSINESSUNITS
(
  @REVENUEID uniqueidentifier,
  @CHANGEAGENTID uniqueidentifier = null,
  @CHANGEDATE datetime = null
)
as
begin
  /*
  1) Payments
      a) For each payment split, check if each split is towards a RG or Pledge
      b) For payments splits to commitments(RG or pledge), use the following hierarchy to find BU's.
          i)    Commitment
          ii)   Solicitor
          iii)  Test segment
          iv)   Segment
          v)    Effort
          vi)   Appeal
      c) For payment splits to straight donations, use the following hierarchy to find BU's
          i)    Solicitor
          ii)   Test segment
          iii)  Segment
          iv)   Effort
          v)    Appeal

  2) Commitments (RG and Pledge)- For all commitments apply business units based on this hierarchy.
      i)    Solicitor
      ii)   Test segment
      iii)  Segment
      iv)   Effort
      v)    Appeal
  */

  declare @REVENUESPLITID uniqueidentifier;
  declare @TRANSACTIONTYPECODE tinyint;
  declare @APPLICATIONCODE tinyint;
  declare @SPLITAMOUNT money;
  declare @DESIGNATIONID uniqueidentifier;
  declare @BASECURRENCYID uniqueidentifier;

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

  if @CHANGEDATE is null
    set @CHANGEDATE = getdate(); 

  declare @CONTEXTCACHE varbinary(128);
  set @CONTEXTCACHE = context_info();
  set context_info @CHANGEAGENTID;

  declare @COUNT tinyint = 1;

    select @TRANSACTIONTYPECODE = FINANCIALTRANSACTION.TYPECODE
        ,@BASECURRENCYID = isnull(REVENUE_EXT.NONPOSTABLEBASECURRENCYID, CURRENCYSET.BASECURRENCYID)
    from dbo.FINANCIALTRANSACTION
    inner join dbo.REVENUE_EXT on REVENUE_EXT.ID = FINANCIALTRANSACTION.ID
    inner join dbo.PDACCOUNTSYSTEM on PDACCOUNTSYSTEM.ID = FINANCIALTRANSACTION.PDACCOUNTSYSTEMID
    inner join dbo.CURRENCYSET on CURRENCYSET.ID = PDACCOUNTSYSTEM.CURRENCYSETID
    where FINANCIALTRANSACTION.ID = @REVENUEID

  declare REVENUESPLIT_CURSOR cursor local fast_forward for
    select 
      FINANCIALTRANSACTIONLINEITEM.ID,
      REVENUESPLIT_EXT.APPLICATIONCODE,
      FINANCIALTRANSACTIONLINEITEM.BASEAMOUNT,
      REVENUESPLIT_EXT.DESIGNATIONID
    from
      dbo.FINANCIALTRANSACTIONLINEITEM
    inner join
      dbo.REVENUESPLIT_EXT on REVENUESPLIT_EXT.ID = FINANCIALTRANSACTIONLINEITEM.ID
    where
      FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = @REVENUEID and
      REVENUESPLIT_EXT.OVERRIDEBUSINESSUNITS = 0 and
      FINANCIALTRANSACTIONLINEITEM.DELETEDON is null;

    open REVENUESPLIT_CURSOR;
    begin try
        fetch next from REVENUESPLIT_CURSOR into
          @REVENUESPLITID,
          @APPLICATIONCODE,
          @SPLITAMOUNT,
          @DESIGNATIONID;
        while (@@FETCH_STATUS = 0)
        begin

      declare @BU_APPLIED bit=0; --If flag is set, no further processing is required for this split.


      --Payment to a commitment(RG, pledge), look at business units on the commitment      

      if @TRANSACTIONTYPECODE=0 and (@APPLICATIONCODE=2 or @APPLICATIONCODE=3) -- Only handling donation, RG's and pledges right now

      begin
        declare @COMMITMENTID uniqueidentifier;

        if @APPLICATIONCODE=2
        begin
          select
            @COMMITMENTID = INSTALLMENTSPLITPAYMENT.PLEDGEID
          from dbo.INSTALLMENTSPLITPAYMENT
          inner join dbo.FINANCIALTRANSACTION on FINANCIALTRANSACTION.ID = INSTALLMENTSPLITPAYMENT.PLEDGEID
          inner join dbo.REVENUE_EXT on FINANCIALTRANSACTION.ID = REVENUE_EXT.ID
          where INSTALLMENTSPLITPAYMENT.PAYMENTID = @REVENUESPLITID
            and FINANCIALTRANSACTION.DELETEDON is null
        end

        if @APPLICATIONCODE=3
        begin
          select
            @COMMITMENTID = SOURCEREVENUEID
          from dbo.RECURRINGGIFTACTIVITY
          inner join dbo.FINANCIALTRANSACTION on FINANCIALTRANSACTION.ID = SOURCEREVENUEID
          inner join dbo.REVENUE_EXT on FINANCIALTRANSACTION.ID = REVENUE_EXT.ID
          where PAYMENTREVENUEID = @REVENUESPLITID
            and FINANCIALTRANSACTION.DELETEDON is null
        end

        delete from dbo.REVENUESPLITBUSINESSUNIT where REVENUESPLITBUSINESSUNIT.REVENUESPLITID = @REVENUESPLITID

        insert into dbo.REVENUESPLITBUSINESSUNIT
        (
          ID,
          REVENUESPLITID,
          BUSINESSUNITCODEID,
          AMOUNT,
          BASECURRENCYID,
          ADDEDBYID,
          CHANGEDBYID,
          DATEADDED,
          DATECHANGED
        )
        select
          newid(),
          @REVENUESPLITID,
          BUSINESSUNITCODEID,
          case REVENUESPLIT_EXT.OVERRIDEBUSINESSUNITS
          when 0 then
            case when FINANCIALTRANSACTIONLINEITEM.BASEAMOUNT = 0 
                then 0
                else @SPLITAMOUNT * (RSB.AMOUNT/FINANCIALTRANSACTIONLINEITEM.BASEAMOUNT)
            end
          else @SPLITAMOUNT * (RSB.AMOUNT/FINANCIALTRANSACTIONLINEITEM.BASEAMOUNT) end,
          @BASECURRENCYID,
          @CHANGEAGENTID,
          @CHANGEAGENTID,
          @CHANGEDATE,
          @CHANGEDATE
        from dbo.REVENUESPLITBUSINESSUNIT RSB
        inner join dbo.FINANCIALTRANSACTIONLINEITEM on FINANCIALTRANSACTIONLINEITEM.ID = RSB.REVENUESPLITID
        inner join dbo.REVENUESPLIT_EXT on FINANCIALTRANSACTIONLINEITEM.ID = REVENUESPLIT_EXT.ID
        inner join dbo.FINANCIALTRANSACTION on FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = FINANCIALTRANSACTION.ID
        inner join dbo.REVENUE_EXT on FINANCIALTRANSACTION.ID = REVENUE_EXT.ID
        where FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = @COMMITMENTID and REVENUESPLIT_EXT.DESIGNATIONID = @DESIGNATIONID
            and FINANCIALTRANSACTION.DELETEDON is null
            and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null
            and FINANCIALTRANSACTIONLINEITEM.TYPECODE <> 1

        if (select count(*) from REVENUESPLITBUSINESSUNIT where REVENUESPLITID=@REVENUESPLITID)>0
         set @BU_APPLIED=1          
      end

      --Solicitor

      if @BU_APPLIED=0
        begin
          declare @SOLICITORSBUSINESSUNITS table (BUSINESSUNITCODEID uniqueidentifier,AMOUNT money)

          insert into @SOLICITORSBUSINESSUNITS
          select 
          distinct BUSINESSUNITCODEID,
          case when SUM(REVENUESOLICITOR.AMOUNT) < @SPLITAMOUNT then
              SUM(REVENUESOLICITOR.AMOUNT)
          else
              @SPLITAMOUNT
          end as AMOUNT
          from dbo.REVENUESOLICITOR
          inner join dbo.FINANCIALTRANSACTIONLINEITEM on FINANCIALTRANSACTIONLINEITEM.ID = REVENUESOLICITOR.REVENUESPLITID
          inner join dbo.REVENUESPLIT_EXT on FINANCIALTRANSACTIONLINEITEM.ID = REVENUESPLIT_EXT.ID
          where FINANCIALTRANSACTIONLINEITEM.ID = @REVENUESPLITID  and BUSINESSUNITCODEID is not null
            and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null
            and FINANCIALTRANSACTIONLINEITEM.TYPECODE <> 1
          group by BUSINESSUNITCODEID

          if exists(select BUSINESSUNITCODEID from @SOLICITORSBUSINESSUNITS where BUSINESSUNITCODEID is not null)
          begin
            delete from dbo.REVENUESPLITBUSINESSUNIT where REVENUESPLITBUSINESSUNIT.REVENUESPLITID = @REVENUESPLITID

            insert into dbo.REVENUESPLITBUSINESSUNIT
            (
              ID,
              REVENUESPLITID,
              BUSINESSUNITCODEID,
              AMOUNT,
              BASECURRENCYID,
              ADDEDBYID,
              CHANGEDBYID,
              DATEADDED,
              DATECHANGED
            )
            select
              newid(),
              @REVENUESPLITID,
              BUSINESSUNITCODEID,
              AMOUNT,
              @BASECURRENCYID,
              @CHANGEAGENTID,
              @CHANGEAGENTID,
              @CHANGEDATE,
              @CHANGEDATE
            from @SOLICITORSBUSINESSUNITS

            delete from @SOLICITORSBUSINESSUNITS
            set @BU_APPLIED=1;
          end
      end 

      declare @MAILINGID uniqueidentifier;
      declare @SOURCECODE nvarchar(max);
      declare @APPEALID uniqueidentifier;
      declare @SEGMENTID uniqueidentifier;
      declare @TESTSEGMENTID uniqueidentifier;

      if @BU_APPLIED=0
      begin
         --Set the DM fields here correctly.

         exec dbo.USP_REVENUESPLITBUSINESSUNIT_GETMARKETINGFIELDS
         @REVENUESPLITID,
         @TESTSEGMENTID output,
         @SEGMENTID output,
         @MAILINGID output,
         @APPEALID output         
      end

      --Test Segment

      if @BU_APPLIED=0 and @TESTSEGMENTID is not null
      begin
        if (select OVERRIDEBUSINESSUNITS from dbo.MKTSEGMENTATIONTESTSEGMENT where ID=@TESTSEGMENTID) =1 
        begin
          delete from dbo.REVENUESPLITBUSINESSUNIT where REVENUESPLITBUSINESSUNIT.REVENUESPLITID = @REVENUESPLITID

          insert into dbo.REVENUESPLITBUSINESSUNIT
          (
            ID,
            REVENUESPLITID,
            BUSINESSUNITCODEID,
            AMOUNT,
            BASECURRENCYID,
            ADDEDBYID,
            CHANGEDBYID,
            DATEADDED,
            DATECHANGED
          )
          select
            newid(),
            @REVENUESPLITID,
            BUSINESSUNITCODEID,
            @SPLITAMOUNT * (PERCENTVALUE/100),
            @BASECURRENCYID,
            @CHANGEAGENTID,
            @CHANGEAGENTID,
            @CHANGEDATE,
            @CHANGEDATE
          from dbo.UFN_MKTSEGMENTATIONTESTSEGMENTBUSINESSUNIT_GETBUSINESSUNITS(@TESTSEGMENTID)
          set @BU_APPLIED=1
        end
      end

      --Segment

      if @BU_APPLIED=0 and @SEGMENTID is not null
      begin
        if (select OVERRIDEBUSINESSUNITS from dbo.MKTSEGMENTATIONSEGMENT where ID=@SEGMENTID) =1
        begin
          delete from dbo.REVENUESPLITBUSINESSUNIT where REVENUESPLITBUSINESSUNIT.REVENUESPLITID = @REVENUESPLITID

          insert into dbo.REVENUESPLITBUSINESSUNIT
          (
            ID,
            REVENUESPLITID,
            BUSINESSUNITCODEID,
            AMOUNT,
            BASECURRENCYID,
            ADDEDBYID,
            CHANGEDBYID,
            DATEADDED,
            DATECHANGED
          )
          select
            newid(),
            @REVENUESPLITID,
            BUSINESSUNITCODEID,
            @SPLITAMOUNT * (PERCENTVALUE/100),
            @BASECURRENCYID,
            @CHANGEAGENTID,
            @CHANGEAGENTID,
            @CHANGEDATE,
            @CHANGEDATE
          from dbo.UFN_MKTSEGMENTATIONSEGMENTBUSINESSUNIT_GETBUSINESSUNITS(@SEGMENTID)
          set @BU_APPLIED=1
        end
      end

      --Effort

      if @BU_APPLIED=0 and @MAILINGID is not null
      begin
        if (select OVERRIDEBUSINESSUNITS from dbo.MKTSEGMENTATION where ID=@MAILINGID) =1
        begin
          delete from dbo.REVENUESPLITBUSINESSUNIT where REVENUESPLITBUSINESSUNIT.REVENUESPLITID = @REVENUESPLITID

          insert into dbo.REVENUESPLITBUSINESSUNIT
          (
            ID,
            REVENUESPLITID,
            BUSINESSUNITCODEID,
            AMOUNT,
            BASECURRENCYID,
            ADDEDBYID,
            CHANGEDBYID,
            DATEADDED,
            DATECHANGED
          )
          select
            newid(),
            @REVENUESPLITID,
            BUSINESSUNITCODEID,
            @SPLITAMOUNT * (PERCENTVALUE/100),
            @BASECURRENCYID,
            @CHANGEAGENTID,
            @CHANGEAGENTID,
            @CHANGEDATE,
            @CHANGEDATE
          from dbo.UFN_MKTSEGMENTATIONBUSINESSUNIT_GETBUSINESSUNITS(@MAILINGID)
          set @BU_APPLIED=1
        end
      end

      --Appeal

      if @BU_APPLIED=0 and @APPEALID is not null
      begin
        if (select count(*) from dbo.UFN_APPEALBUSINESSUNIT_GETBUSINESSUNITS(@APPEALID))>0
        begin
          delete from dbo.REVENUESPLITBUSINESSUNIT where REVENUESPLITBUSINESSUNIT.REVENUESPLITID = @REVENUESPLITID

          insert into dbo.REVENUESPLITBUSINESSUNIT
          (
            ID,
            REVENUESPLITID,
            BUSINESSUNITCODEID,
            AMOUNT,
            BASECURRENCYID,
            ADDEDBYID,
            CHANGEDBYID,
            DATEADDED,
            DATECHANGED
          )
          select
            newid(),
            @REVENUESPLITID,
            BUSINESSUNITCODEID,
            @SPLITAMOUNT * (PERCENTVALUE/100),
            @BASECURRENCYID,
            @CHANGEAGENTID,
            @CHANGEAGENTID,
            @CHANGEDATE,
            @CHANGEDATE
          from dbo.UFN_APPEALBUSINESSUNIT_GETBUSINESSUNITS(@APPEALID)
          set @BU_APPLIED=1
        end
      end

      fetch next from REVENUESPLIT_CURSOR into
        @REVENUESPLITID,
        @APPLICATIONCODE,
        @SPLITAMOUNT,
        @DESIGNATIONID;

        end
        close REVENUESPLIT_CURSOR;
        deallocate REVENUESPLIT_CURSOR;

      if not @CONTEXTCACHE is null
        set context_info @CONTEXTCACHE;

    end try
    begin catch
      close REVENUESPLIT_CURSOR;
      deallocate REVENUESPLIT_CURSOR;
      exec dbo.USP_RAISE_ERROR;
      return 1;
    end catch

end