USP_REVENUEBATCH_GETDEFAULTBENEFITS

Parameters

Parameter Parameter Type Mode Description
@APPLICATIONINFO nvarchar(60) IN
@REVENUESTREAMS xml IN
@APPEALID uniqueidentifier IN
@AMOUNT money IN
@DATE datetime IN
@TRANSACTIONCURRENCYID uniqueidentifier IN
@BASECURRENCYID uniqueidentifier IN
@BENEFITS xml INOUT
@PERCENTAGEBENEFITS xml INOUT
@EXCHANGERATE decimal(20, 8) IN
@BASEEXCHANGERATEID uniqueidentifier IN

Definition

Copy


CREATE procedure dbo.USP_REVENUEBATCH_GETDEFAULTBENEFITS
(
  @APPLICATIONINFO nvarchar(60),
  @REVENUESTREAMS xml,
  @APPEALID uniqueidentifier,
  @AMOUNT money,
  @DATE datetime,
  @TRANSACTIONCURRENCYID uniqueidentifier,
  @BASECURRENCYID uniqueidentifier,
  @BENEFITS xml output,
  @PERCENTAGEBENEFITS xml output,
  @EXCHANGERATE decimal(20, 8),
  @BASEEXCHANGERATEID uniqueidentifier
)
as

  declare @DEFAULTMONEYBENEFITS as table
  (
    ID uniqueidentifier,
    BENEFITID uniqueidentifier,
    QUANTITY smallint,
    UNITVALUE money,
    SEQUENCE int,
    BENEFITCURRENCYID uniqueidentifier
  );

  if @APPEALID is not null
  begin
    insert into
      @DEFAULTMONEYBENEFITS
    select
      newid() as ID,
      BENEFITDETAILS.BENEFITID,
      BENEFITDETAILS.QUANTITY,
      BENEFITDETAILS.VALUE,
      BENEFITDETAILS.SEQUENCE,
      BENEFIT.BASECURRENCYID as BENEFITCURRENCYID
    from
      dbo.UFN_APPEAL_GETBENEFITDETAILS_ALL_2(@APPEALID, @AMOUNT, @TRANSACTIONCURRENCYID, @BASECURRENCYID) as BENEFITDETAILS
    left join
      dbo.BENEFIT on BENEFITDETAILS.BENEFITID = BENEFIT.ID
    where
      BENEFITDETAILS.USEPERCENT = 0;
  end

  declare @ROLLINGMAXSEQUENCE int = coalesce((select max(SEQUENCE) from @DEFAULTMONEYBENEFITS), 0);

  insert into
    @DEFAULTMONEYBENEFITS
  select
    newid() as ID,
    BENEFITDETAILS.BENEFITID,
    BENEFITDETAILS.QUANTITY,
    BENEFITDETAILS.VALUE,
    @ROLLINGMAXSEQUENCE + BENEFITDETAILS.SEQUENCE,
    BENEFIT.BASECURRENCYID as BENEFITCURRENCYID
  from
    dbo.UFN_REVENUEBATCH_EVENTREGISTRANT_GETBENEFITS(@AMOUNT, @APPLICATIONINFO, @REVENUESTREAMS, @TRANSACTIONCURRENCYID, @BASECURRENCYID, @EXCHANGERATE,
      @BASEEXCHANGERATEID) as BENEFITDETAILS
  left join
    dbo.BENEFIT on BENEFITDETAILS.BENEFITID = BENEFIT.ID;

  --Store the total benefit amount so we can calculate the percentage amounts for percent benefits

  declare @ROLLINGBENEFITAMOUNT money = 0;

  select
    @ROLLINGBENEFITAMOUNT = @ROLLINGBENEFITAMOUNT + (MONEYBENEFITS.QUANTITY * MONEYBENEFITS.UNITVALUE)
  from
    @DEFAULTMONEYBENEFITS as MONEYBENEFITS
  where
    MONEYBENEFITS.BENEFITCURRENCYID = @TRANSACTIONCURRENCYID;

  select
    @ROLLINGBENEFITAMOUNT = @ROLLINGBENEFITAMOUNT + dbo.UFN_CURRENCY_CONVERT(MONEYBENEFITS.QUANTITY * MONEYBENEFITS.UNITVALUE,
                                                      dbo.UFN_CURRENCYEXCHANGERATE_GETLATEST(MONEYBENEFITS.BENEFITCURRENCYID, @TRANSACTIONCURRENCYID, @DATE, 1, null))
  from
    @DEFAULTMONEYBENEFITS as MONEYBENEFITS
  where
    MONEYBENEFITS.BENEFITCURRENCYID <> @TRANSACTIONCURRENCYID;

  declare @DEFAULTPERCENTAGEBENEFITS as table
  (
    ID uniqueidentifier,
    BENEFITID uniqueidentifier,
    VALUEPERCENT int,
    PERCENTAPPLICABLEAMOUNT money,
    SEQUENCE int,
    BENEFITCURRENCYID uniqueidentifier
  );

  insert into
    @DEFAULTPERCENTAGEBENEFITS
  select
    newid() as ID,
    BENEFITDETAILS.BENEFITID,
    BENEFITDETAILS.VALUEPERCENT,
    0 as PERCENTAPPLICABLEAMOUNT,
    BENEFITDETAILS.SEQUENCE,
    BENEFIT.BASECURRENCYID as BENEFITCURRENCYID
  from
    dbo.UFN_APPEAL_GETBENEFITDETAILS_ALL_2(@APPEALID, @AMOUNT, @TRANSACTIONCURRENCYID, @BASECURRENCYID) as BENEFITDETAILS
  left join
    dbo.BENEFIT on BENEFITDETAILS.BENEFITID = BENEFIT.ID
  where
    BENEFITDETAILS.USEPERCENT = 1;

  --Update the percentage benefits with their applicable amount (total gift amount minus the benefit amount of prior benefits)

  declare PERCENTAGEBENEFITAMOUNTCURSOR cursor local fast_forward for
  select
    ID,
    VALUEPERCENT
  from
    @DEFAULTPERCENTAGEBENEFITS
  order by
    SEQUENCE;

  declare @CURRENTPERCENTAGEBENEFITID uniqueidentifier;
  declare @CURRENTPERCENTAGEBENEFITVALUEPERCENT int;

  open PERCENTAGEBENEFITAMOUNTCURSOR;
  fetch next from PERCENTAGEBENEFITAMOUNTCURSOR into @CURRENTPERCENTAGEBENEFITID, @CURRENTPERCENTAGEBENEFITVALUEPERCENT;

  while (@@FETCH_STATUS = 0)
  begin
    declare @CURRENTPERCENTAGEBENEFITAPPLICABLEAMOUNT money = (@AMOUNT - @ROLLINGBENEFITAMOUNT);

    update
      DEFAULTPERCENTAGEBENEFITS
    set
      DEFAULTPERCENTAGEBENEFITS.PERCENTAPPLICABLEAMOUNT = @CURRENTPERCENTAGEBENEFITAPPLICABLEAMOUNT
    from
      @DEFAULTPERCENTAGEBENEFITS as DEFAULTPERCENTAGEBENEFITS
    where
      DEFAULTPERCENTAGEBENEFITS.ID = @CURRENTPERCENTAGEBENEFITID;

    set @ROLLINGBENEFITAMOUNT = @ROLLINGBENEFITAMOUNT + (@CURRENTPERCENTAGEBENEFITAPPLICABLEAMOUNT * (@CURRENTPERCENTAGEBENEFITVALUEPERCENT / 100.00))

    fetch next from PERCENTAGEBENEFITAMOUNTCURSOR into @CURRENTPERCENTAGEBENEFITID, @CURRENTPERCENTAGEBENEFITVALUEPERCENT;
  end

  close PERCENTAGEBENEFITAMOUNTCURSOR;
  deallocate PERCENTAGEBENEFITAMOUNTCURSOR;

  select
    @BENEFITS =
    (
      select
        ID,
        BENEFITID,
        QUANTITY,
        UNITVALUE,
        SEQUENCE,
        BENEFITCURRENCYID,
        '' as DETAILS
      from
        @DEFAULTMONEYBENEFITS
      for xml path('ITEM'), type, elements, root('BENEFITS'), binary base64
    );

  select
    @PERCENTAGEBENEFITS =
    (
      select
        ID,
        BENEFITID,
        VALUEPERCENT,
        PERCENTAPPLICABLEAMOUNT,
        SEQUENCE,
        BENEFITCURRENCYID,
        '' as DETAILS
      from
        @DEFAULTPERCENTAGEBENEFITS
      for xml path('ITEM'), type, elements, root('PERCENTAGEBENEFITS'), binary base64
    );