USP_DATALIST_SPONSORSHIPOPPORTUNITYRESERVE_SELECTION

Returns a selection of children based on user preferences.

Parameters

Parameter Parameter Type Mode Description
@GROUPID uniqueidentifier IN GROUPID
@OPPORTUNITYLOCATIONID uniqueidentifier IN OPPORTUNITYLOCATIONID
@GENDERCODE int IN GENDERCODE
@SPROPPAGERANGEID uniqueidentifier IN SPROPPAGERANGEID
@ISHIVPOSITIVECODE int IN ISHIVPOSITIVECODE
@HASCONDITIONCODE int IN HASCONDITIONCODE
@ISORPHANEDCODE int IN ISORPHANEDCODE
@KEY int IN KEY

Definition

Copy


CREATE procedure dbo.USP_DATALIST_SPONSORSHIPOPPORTUNITYRESERVE_SELECTION
(
@GROUPID uniqueidentifier,
@OPPORTUNITYLOCATIONID uniqueidentifier,
@GENDERCODE int,
@SPROPPAGERANGEID uniqueidentifier,
@ISHIVPOSITIVECODE int,
@HASCONDITIONCODE int,
@ISORPHANEDCODE int
@KEY int
)
as 
set nocount on;

declare @MATCH int = 0; -- means no matching


declare @SELECTIONTABLE table(CID uniqueidentifier, CGENDERCODE int, CAGERANGEID uniqueidentifier);
declare @RESULTTABLE table(ID uniqueidentifier, GENDERCODE int, AGERANGEID uniqueidentifier)
declare @CURRENTDATE datetime;
set @CURRENTDATE = getdate();

declare @CHANGEAGENTID uniqueidentifier;
exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output;

-- table used to calculate the number of opportunities to be reserved

create table #SPONSORSHIPOPPORTUNITYRESERVATIONCOUNTS (ID uniqueidentifier,
        GENDERCODE tinyint,
        AGERANGEID uniqueidentifier,
        INITIALCOUNT int,
        NEWCOUNT int);

if @GENDERCODE = 3 set @MATCH = 1
if @SPROPPAGERANGEID = '626658D1-E24B-4370-952D-1080B22C33AE' set @MATCH = 2
if @GENDERCODE = 3 and @SPROPPAGERANGEID = '626658D1-E24B-4370-952D-1080B22C33AE' set @MATCH = 3

if @MATCH = 2 or @MATCH = 3
 begin
    insert into @SELECTIONTABLE(CID, CGENDERCODE,CAGERANGEID)
    select SP.ID, C.GENDERCODE, SPA.ID from dbo.SPONSORSHIPOPPORTUNITY SP 
     inner join dbo.SPONSORSHIPOPPORTUNITYCHILD SPC on SP.ID = SPC.ID 
   inner join dbo.CONSTITUENT C on C.ID = SPC.CONSTITUENTID
     left join dbo.SPONSORSHIPOPPORTUNITYGROUP SPP on SPP.ID = SP.SPONSORSHIPOPPORTUNITYGROUPID 
     left outer join dbo.SPONSORSHIPLOCATION OPPORTUNITYLOCATION on OPPORTUNITYLOCATION.ID = SP.SPONSORSHIPLOCATIONID 
     left outer join dbo.SPONSORSHIPLOCATION PREFERREDLOCATION on PREFERREDLOCATION.ID = @OPPORTUNITYLOCATIONID 
     left outer join dbo.SPONSORSHIPOPPORTUNITYAGERANGE SPA on C.BIRTHDATE<>'00000000' and dbo.UFN_AGEFROMFUZZYDATE(SPC.BIRTHDATE,getdate()) between SPA.MINAGE and SPA.MAXAGE
     where (@GROUPID is null or SPONSORSHIPOPPORTUNITYGROUPID = @GROUPID
     and (@OPPORTUNITYLOCATIONID is null or OPPORTUNITYLOCATION.HIERARCHYPATH.IsDescendantOf(PREFERREDLOCATION.HIERARCHYPATH) = 1
     and (@GENDERCODE = 0 or SPC.GENDERCODE = case when @GENDERCODE = 3 then 1 else @GENDERCODE end or SPC.GENDERCODE = case when @GENDERCODE = 3 then 2 else @GENDERCODE end)  
     --and SPP.SPONSORSHIPOPPORTUNITYAGERANGEID is not null

     and (@ISHIVPOSITIVECODE = 0 or SPC.ISHIVPOSITIVE = case @ISHIVPOSITIVECODE when 1 then 1 when 2 then 0 end
     and (@HASCONDITIONCODE = 0 or (@HASCONDITIONCODE = 1 and SPC.SPROPPCHILDCONDITIONCODEID is not null) or (@HASCONDITIONCODE = 2 and SPC.SPROPPCHILDCONDITIONCODEID is null)) 
     and (@ISORPHANEDCODE = 0 or SPC.ISORPHANED = case @ISORPHANEDCODE when 1 then 1 when 2 then 0 end
     and  SP.AVAILABILITYCODE = 0 and SP.ELIGIBILITYCODE = 1
 end         
else
 begin
    insert into @SELECTIONTABLE(CID, CGENDERCODE,CAGERANGEID)
    select SP.ID, C.GENDERCODE, SPA.ID from dbo.SPONSORSHIPOPPORTUNITY SP 
     inner join dbo.SPONSORSHIPOPPORTUNITYCHILD SPC on SP.ID = SPC.ID 
   inner join dbo.CONSTITUENT C on C.ID = SPC.CONSTITUENTID
     left join dbo.SPONSORSHIPOPPORTUNITYGROUP SPP on SPP.ID = SP.SPONSORSHIPOPPORTUNITYGROUPID 
     left outer join dbo.SPONSORSHIPLOCATION OPPORTUNITYLOCATION on OPPORTUNITYLOCATION.ID = SP.SPONSORSHIPLOCATIONID 
     left outer join dbo.SPONSORSHIPLOCATION PREFERREDLOCATION on PREFERREDLOCATION.ID = @OPPORTUNITYLOCATIONID 
     left outer join dbo.SPONSORSHIPOPPORTUNITYAGERANGE SPA on C.BIRTHDATE<>'00000000' and dbo.UFN_AGEFROMFUZZYDATE(SPC.BIRTHDATE,getdate()) between SPA.MINAGE and SPA.MAXAGE
     where (@GROUPID is null or SPONSORSHIPOPPORTUNITYGROUPID = @GROUPID
     and (@OPPORTUNITYLOCATIONID is null or OPPORTUNITYLOCATION.HIERARCHYPATH.IsDescendantOf(PREFERREDLOCATION.HIERARCHYPATH) = 1
     and (@GENDERCODE = 0 or SPC.GENDERCODE = case when @GENDERCODE = 3 then 1 else @GENDERCODE end or SPC.GENDERCODE = case when @GENDERCODE = 3 then 2 else @GENDERCODE end)  
     and (@SPROPPAGERANGEID is null or SPA.ID =  @SPROPPAGERANGEID
     and (@ISHIVPOSITIVECODE = 0 or SPC.ISHIVPOSITIVE = case @ISHIVPOSITIVECODE when 1 then 1 when 2 then 0 end
     and (@HASCONDITIONCODE = 0 or (@HASCONDITIONCODE = 1 and SPC.SPROPPCHILDCONDITIONCODEID is not null) or (@HASCONDITIONCODE = 2 and SPC.SPROPPCHILDCONDITIONCODEID is null)) 
     and (@ISORPHANEDCODE = 0 or SPC.ISORPHANED = case @ISORPHANEDCODE when 1 then 1 when 2 then 0 end
     and  SP.AVAILABILITYCODE = 0 and SP.ELIGIBILITYCODE = 1
 end 

if @KEY = 0 
  begin
    select CID as CHILDID, CGENDERCODE as GENDER from  @SELECTIONTABLE
  end
else
begin
if @MATCH = 0 -- no balancing

 begin 
    select top(@KEY) CID as CHILDID, CGENDERCODE as GENDER from  @SELECTIONTABLE
 end
else
 begin 
  declare @MULTIPLIER int
  declare @MIN int  
  declare @GEN int
  declare @AGEID uniqueidentifier
  declare @NEWCOUNT int
  declare CURSOR_SELECTION cursor local forward_only for      
    select GENDERCODE, AGERANGEID, NEWCOUNT from #SPONSORSHIPOPPORTUNITYRESERVATIONCOUNTS    

  --delete from SPONSORSHIPOPPORTUNITYRESERVATIONCOUNTS 

  if @MATCH = 1 -- gender balanced    

    begin
        insert into #SPONSORSHIPOPPORTUNITYRESERVATIONCOUNTS(ID, GENDERCODE, AGERANGEID, INITIALCOUNT, NEWCOUNT)
        select newid(), CGENDERCODE, null, COUNT(*) cnt, 0
        from @SELECTIONTABLE
        group by CGENDERCODE
        order by cnt

        select @MULTIPLIER = @@ROWCOUNT from #SPONSORSHIPOPPORTUNITYRESERVATIONCOUNTS
        select @MIN = MIN(INITIALCOUNT) from #SPONSORSHIPOPPORTUNITYRESERVATIONCOUNTS

        exec dbo.USP_SPONSORSHIPOPPORTUNITY_RESERVE_SELECTION @KEY, @MIN, @MULTIPLIER             

        open CURSOR_SELECTION;
            fetch next from CURSOR_SELECTION into
             @GEN, @AGEID, @NEWCOUNT;     
        while (@@FETCH_STATUS = 0)
            begin             
             insert into @RESULTTABLE(ID, GENDERCODE, AGERANGEID)
             select top(@NEWCOUNT) CID, CGENDERCODE, CAGERANGEID
             from @SELECTIONTABLE
             where CGENDERCODE = @GEN      

             fetch next from CURSOR_SELECTION into   
             @GEN, @AGEID, @NEWCOUNT;
            end       
          close CURSOR_SELECTION;            

        select ID as CHILDID, GENDERCODE AS GENDER from @RESULTTABLE
        --select top(@KEY) CID, CAGERANGEID, CGENDERCODE from @SELECTIONTABLE, SPONSORSHIPOPPORTUNITYRESERVATIONCOUNTS

        --where CGENDERCODE = GENDERCODE 

        --order by CGENDERCODE            

    end
  if @MATCH = 2 -- age range balanced    

    begin
        insert into #SPONSORSHIPOPPORTUNITYRESERVATIONCOUNTS(ID, GENDERCODE, AGERANGEID, INITIALCOUNT, NEWCOUNT)
        select newid(), 0, CAGERANGEID, COUNT(*) cnt, 0  
        from @SELECTIONTABLE
        group by CAGERANGEID
        order by cnt

        select @MULTIPLIER = @@ROWCOUNT from #SPONSORSHIPOPPORTUNITYRESERVATIONCOUNTS
        select @MIN = MIN(INITIALCOUNT) from #SPONSORSHIPOPPORTUNITYRESERVATIONCOUNTS

        exec dbo.USP_SPONSORSHIPOPPORTUNITY_RESERVE_SELECTION @KEY, @MIN, @MULTIPLIER     

        open CURSOR_SELECTION;
            fetch next from CURSOR_SELECTION into
             @GEN, @AGEID, @NEWCOUNT;     
        while (@@FETCH_STATUS = 0)
            begin             
             insert into @RESULTTABLE(ID, GENDERCODE, AGERANGEID)
             select top(@NEWCOUNT) CID, CGENDERCODE, CAGERANGEID
             from @SELECTIONTABLE
             where CAGERANGEID = @AGEID

             fetch next from CURSOR_SELECTION into
             @GEN, @AGEID, @NEWCOUNT;
            end       
          close CURSOR_SELECTION;          

        select ID as CHILDID, GENDERCODE AS GENDER from @RESULTTABLE        

        --select top(@KEY) CID, CAGERANGEID, CGENDERCODE from @SELECTIONTABLE, SPONSORSHIPOPPORTUNITYRESERVATIONCOUNTS

        --where CAGERANGEID = AGERANGEID    

        --order by CAGERANGEID

    end    
  if @MATCH = 3 -- gender and age range balanced

    begin
        insert into #SPONSORSHIPOPPORTUNITYRESERVATIONCOUNTS(ID, GENDERCODE, AGERANGEID, INITIALCOUNT, NEWCOUNT)
        select newid(), CGENDERCODE, CAGERANGEID, COUNT(*) cnt, 0
        from @SELECTIONTABLE
        group by CGENDERCODE, CAGERANGEID
        order by cnt

        select @MULTIPLIER = @@ROWCOUNT from #SPONSORSHIPOPPORTUNITYRESERVATIONCOUNTS
        select @MIN = MIN(INITIALCOUNT) from #SPONSORSHIPOPPORTUNITYRESERVATIONCOUNTS

        exec dbo.USP_SPONSORSHIPOPPORTUNITY_RESERVE_SELECTION @KEY, @MIN, @MULTIPLIER     

        open CURSOR_SELECTION;
            fetch next from CURSOR_SELECTION into
             @GEN, @AGEID, @NEWCOUNT;     
        while (@@FETCH_STATUS = 0)
            begin             
             insert into @RESULTTABLE(ID, GENDERCODE, AGERANGEID)
             select top(@NEWCOUNT) CID, CGENDERCODE, CAGERANGEID
             from @SELECTIONTABLE
             where CAGERANGEID = @AGEID
             and CGENDERCODE = @GEN

             fetch next from CURSOR_SELECTION into
             @GEN, @AGEID, @NEWCOUNT;
            end       
          close CURSOR_SELECTION;          

        select ID as CHILDID, GENDERCODE AS GENDER from @RESULTTABLE        

        --select top(@KEY) CID, CAGERANGEID, CGENDERCODE from @SELECTIONTABLE, SPONSORSHIPOPPORTUNITYRESERVATIONCOUNTS

        --where CGENDERCODE = GENDERCODE and CAGERANGEID = AGERANGEID

        --order by CAGERANGEID, CGENDERCODE

     end  
      deallocate CURSOR_SELECTION;  
 end         
end