USP_FAFINCENTIVEBENEFIT_CALCULATE

Parameters

Parameter Parameter Type Mode Description
@NUMBERPROCESSED int INOUT

Definition

Copy


CREATE procedure dbo.USP_FAFINCENTIVEBENEFIT_CALCULATE
(
  @NUMBERPROCESSED integer = 0 output
)
as
begin
set nocount on;

declare @CHANGEAGENTID uniqueidentifier, @CURRENTDATE datetime;
exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output
set @CURRENTDATE = GETDATE();
set @NUMBERPROCESSED = 0;

begin try

  IF EXISTS ( SELECT * FROM tempdb.dbo.sysobjects o where o.xtype in ('U') and o.id = object_id( N'tempdb..'+'#TEMP_GETREGISTRANT_EVENT_FAFINCENTIVELEVEL_BENEFITS') )  
    DROP TABLE #TEMP_GETREGISTRANT_EVENT_FAFINCENTIVELEVEL_BENEFITS

  CREATE TABLE #TEMP_GETREGISTRANT_EVENT_FAFINCENTIVELEVEL_BENEFITS
  (
    prim_id int NOT NULL IDENTITY(1,1) PRIMARY KEY,
    REGISTRANTID uniqueidentifier NOT NULL,
    [Total amount raised] money,
    PROGRESSMEMBERECRUITMENTGOAL money,
    PROGRESSDONORRETENTIONGOAL decimal(5, 2),
    PROGRESSCOMMUNICATIONGOAL int,
    EVENTID uniqueidentifier,
    BENEFITSWAIVED bit,

    FAFINCENTIVELEVELID uniqueidentifier,
    TYPECODE tinyint,
    MAXIMUMAMOUNT MONEY,
    BENEFITID uniqueidentifier,
    INCENTIVENAME varchar(100),
    BENEFITNAME varchar(100),
    MAXIMUMNUMBER integer,
    MAXIMUMRETENTION decimal(6, 5),

    ALLOWPARTICIPANTSWAIVEBENEFITS BIT,
    ALLOWPARTICIPANTONLYRECEIVEBENEFITLEVELCODE TINYINT,

    MAXIMUMALL decimal(20, 5),

    QUANTITY int,
    UNITVALUE money,
    TOTALVALUE money,
    DETAILS nvarchar(260),
    BASECURRENCYID uniqueidentifier
  )

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


  insert into #TEMP_GETREGISTRANT_EVENT_FAFINCENTIVELEVEL_BENEFITS
    select
      R.ID,
      dbo.UFN_REVENUE_GETPARTICIPANTRAISEDTOTAL(R.ID, R.EVENTID) AS [Total amount raised],
      ((SELECT  COUNT(fc.TYPEGUID) from FAFCOMMUNICATIONSLOG fl join FAFEVENTCOMMUNICATIONCHANNEL fc on fl.EMAILJOBID = fc.EMAILJOBID 
          WHERE fl.CLIENTUSERSID IN (SELECT dbo.UFN_CLIENTUSERID_GET_BY_CONSTITUENT (R.CONSTITUENTID)) AND EVENTID= R.EVENTID)) AS PROGRESSMEMBERECRUITMENTGOAL,
      (SELECT PERCENTAGEOFDONORSRETAINED FROM V_QUERY_REGISTRANT_FUNDRAISINGTOTAL WHERE ID= R.ID) AS PROGRESSDONORRETENTIONGOAL,
      dbo.UFN_FAFINCENTIVEBENEFIT_COMMUNICATIONS(R.ID) AS PROGRESSCOMMUNICATIONGOAL,
      R.EVENTID,
      R.BENEFITSWAIVED,
      FI.ID,
      FI.TYPECODE,
      FI.MAXIMUMAMOUNT,
      FI.BENEFITID,
      FI.INCENTIVENAME,
      FI.BENEFITNAME,
      FI.MAXIMUMNUMBER,
      FI.MAXIMUMRETENTION,
      EA.ALLOWPARTICIPANTSWAIVEBENEFITS,
      EA.ALLOWPARTICIPANTONLYRECEIVEBENEFITLEVELCODE,
      case when TYPECODE = 1 then MAXIMUMAMOUNT when TYPECODE = 2 or TYPECODE = 4 then MAXIMUMNUMBER when TYPECODE = 3 then MAXIMUMRETENTION end as MAXIMUMALL,
      FI.QUANTITY,
      FI.UNITVALUE,
      FI.[TOTALVALUE],
      FI.DETAILS,
      E.BASECURRENCYID
    from
      REGISTRANT R
      join 
      (
        select
          FL.ID,
          FL.TYPECODE,
          FL.MAXIMUMAMOUNT,
          FLB.BENEFITID,
          FL.NAME AS INCENTIVENAME,
          B.NAME AS BENEFITNAME,
          FL.MAXIMUMNUMBER,
          FL.MAXIMUMRETENTION,
          FL.EVENTID,
          FLB.QUANTITY,
          B.VALUE as UNITVALUE,
          B.VALUE * FLB.QUANTITY as [TOTALVALUE],
          B.[DESCRIPTION] AS DETAILS
        from
          FAFINCENTIVELEVEL FL
          JOIN FAFINCENTIVELEVELBENEFIT FLB ON FL.ID = FLB.FAFINCENTIVELEVELID
          JOIN BENEFIT B ON FLB.BENEFITID= B.ID
      ) FI ON FI.EVENTID = R.EVENTID
      LEFT join EVENT E ON E.ID = R.EVENTID
      LEFT JOIN EVENTATTRIBUTES EA ON EA.EVENTID = R.EVENTID
    WHERE
      FI.ID IS NOT NULL AND EA.ID IS NOT NULL AND E.ISACTIVE = 1

  delete from REGISTRANTBENEFIT where REGISTRANTID IN (SELECT REGISTRANTID FROM #TEMP_GETREGISTRANT_EVENT_FAFINCENTIVELEVEL_BENEFITS) AND BENEFITTYPECODE > 0 AND BENEFITTYPECODE < 5

  DELETE FROM #TEMP_GETREGISTRANT_EVENT_FAFINCENTIVELEVEL_BENEFITS
  WHERE prim_id NOT IN
  (
    SELECT prim_id FROM #TEMP_GETREGISTRANT_EVENT_FAFINCENTIVELEVEL_BENEFITS
    WHERE
    (
      (TYPECODE = 1 AND [Total amount raised] >= MAXIMUMAMOUNT)
      OR
      (TYPECODE = 2 AND PROGRESSMEMBERECRUITMENTGOAL >= MAXIMUMNUMBER)
      OR
      (TYPECODE = 3 AND PROGRESSDONORRETENTIONGOAL >= MAXIMUMRETENTION * 100)
      OR
      (TYPECODE = 4 AND PROGRESSCOMMUNICATIONGOAL >= MAXIMUMNUMBER)
    )
  )

  Insert into REGISTRANTBENEFIT (ID, REGISTRANTID, BENEFITID, UNITVALUE, QUANTITY, TOTALVALUE, DETAILS, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED,
    BASECURRENCYID, BASEEXCHANGERATEID, ORGANIZATIONEXCHANGERATEID, EVENTBASECURRENCYTOTALVALUE, ORGANIZATIONTOTALVALUE, BENEFITTYPECODE)

    select newid(), REGISTRANTID, BENEFITID, UNITVALUE, QUANTITY, TOTALVALUE, DETAILS, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE,
      BASECURRENCYID, null, null, TOTALVALUE, TOTALVALUE, TYPECODE
    from #TEMP_GETREGISTRANT_EVENT_FAFINCENTIVELEVEL_BENEFITS
    WHERE ALLOWPARTICIPANTONLYRECEIVEBENEFITLEVELCODE = 0

    union all

    select newid(), TM.REGISTRANTID, BENEFITID, UNITVALUE, QUANTITY, TOTALVALUE, DETAILS, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE,
      BASECURRENCYID, null, null, TOTALVALUE, TOTALVALUE, TM.TYPECODE
    FROM #TEMP_GETREGISTRANT_EVENT_FAFINCENTIVELEVEL_BENEFITS TM
    JOIN 
    (
      SELECT
        REGISTRANTID,
        TYPECODE,
        MAX(MAXIMUMALL) as MAXIMUMALL
      FROM #TEMP_GETREGISTRANT_EVENT_FAFINCENTIVELEVEL_BENEFITS
      group by REGISTRANTID, TYPECODE
    ) MX ON MX.REGISTRANTID = TM.REGISTRANTID AND MX.TYPECODE = TM.TYPECODE AND MX.MAXIMUMALL = TM.MAXIMUMALL
    WHERE ALLOWPARTICIPANTONLYRECEIVEBENEFITLEVELCODE = 1

  select @NUMBERPROCESSED = count(*) from REGISTRANTBENEFIT 
  where REGISTRANTID IN (SELECT REGISTRANTID FROM #TEMP_GETREGISTRANT_EVENT_FAFINCENTIVELEVEL_BENEFITS) AND BENEFITTYPECODE > 0 AND BENEFITTYPECODE < 5

end try
begin catch
  exec dbo.USP_RAISE_ERROR;
end catch

end