USP_SPONSORSHIPSMARTFIELD_AVAILABLEVALUESPROJECT

Calculates the values for sponsorship opportunity project available smart fields.

Parameters

Parameter Parameter Type Mode Description
@DIMENSIONLIST xml IN
@CALCULATIONTYPE tinyint IN
@ASOF datetime IN

Definition

Copy


CREATE procedure dbo.USP_SPONSORSHIPSMARTFIELD_AVAILABLEVALUESPROJECT(
    @DIMENSIONLIST xml,
    @CALCULATIONTYPE tinyint = 0,
    @ASOF datetime
)
as
begin
    set nocount on;

    declare @DIMENSIONS table (FIELDID nvarchar(50))
    declare @LOCATIONDIMENSIONS table (FIELDID nvarchar(36))

    declare @NULLID uniqueidentifier
    set @NULLID = cast('00000000-0000-0000-0000-000000000000' as uniqueidentifier)

    insert into @DIMENSIONS
    select *
    from dbo.UFN_SPONSORSHIPOPPORTUNITYDIMENSIONLIST_FROMITEMLISTXML(@DIMENSIONLIST)

    declare @CHECKERROR int
    select @CHECKERROR = count(*)
    from (select FIELDID from @DIMENSIONS group by FIELDID having count(*)>1) X;

    if @CHECKERROR > 1
    begin
      raiserror('BBERR_DUPLICATEDIMENSION', 13, 1);
      return 1
    end

    insert into @LOCATIONDIMENSIONS
    select D.FIELDID
    from @DIMENSIONS D
    inner join SPONSORSHIPLOCATIONTYPECODE on D.FIELDID = cast(SPONSORSHIPLOCATIONTYPECODE.ID as nvarchar(36));

    if @@ROWCOUNT > 1
    begin
      raiserror('Process could not finish. More than one location type listed.', 13, 1);
      return 1
    end

    delete from @DIMENSIONS
    where FIELDID in(select cast(FIELDID as nvarchar(36)) from @LOCATIONDIMENSIONS)

    declare @SEGMENTS table(ID uniqueidentifier,
                            SPONSORSHIPOPPORTUNITYGROUPID uniqueidentifier,
                            SPONSORSHIPLOCATIONID uniqueidentifier,
                            SPROPPPROJECTCATEGORYCODEID uniqueidentifier);

    insert into @SEGMENTS
    select
        newid(),
        SPONSORSHIPOPPORTUNITYGROUP.ID,
        SPONSORSHIPLOCATION.ID,
        SPROPPPROJECTCATEGORYCODE.ID
    from SPONSORSHIPOPPORTUNITYGROUP
    left outer join dbo.SPONSORSHIPLOCATION on SPONSORSHIPLOCATION.SPONSORSHIPLOCATIONTYPECODEID in(select FIELDID from @LOCATIONDIMENSIONS)
    left outer join dbo.SPROPPPROJECTCATEGORYCODE on 'Project category' in(select FIELDID from @DIMENSIONS)
    where SPONSORSHIPOPPORTUNITYGROUP.SPONSORSHIPOPPORTUNITYTYPECODE = 2;

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


    declare @OPPORTUNITIES table (OPPORTUNITYID uniqueidentifier,
                                  SEGMENTID uniqueidentifier,
                                  AVAILABLE bit)

    insert into @OPPORTUNITIES
    select SPONSORSHIPOPPORTUNITY.ID, SEGMENT.ID, case when AVAILABILITYCODE = 0 then 1 else 0 end
    from dbo.SPONSORSHIPOPPORTUNITY
    inner join dbo.SPONSORSHIPLOCATION OPPORTUNITYLOCATION on OPPORTUNITYLOCATION.ID = SPONSORSHIPOPPORTUNITY.SPONSORSHIPLOCATIONID
    left outer join dbo.SPONSORSHIPLOCATION DIMENSIONLOCATION on OPPORTUNITYLOCATION.HIERARCHYPATH.IsDescendantOf(DIMENSIONLOCATION.HIERARCHYPATH) = 1 and DIMENSIONLOCATION.SPONSORSHIPLOCATIONTYPECODEID in(select FIELDID from @LOCATIONDIMENSIONS)
    inner join dbo.SPONSORSHIPOPPORTUNITYPROJECT on SPONSORSHIPOPPORTUNITYPROJECT.ID = SPONSORSHIPOPPORTUNITY.ID
    inner join @SEGMENTS SEGMENT on
        SEGMENT.SPONSORSHIPOPPORTUNITYGROUPID = SPONSORSHIPOPPORTUNITY.SPONSORSHIPOPPORTUNITYGROUPID and
        isnull(SEGMENT.SPONSORSHIPLOCATIONID,@NULLID) = case when (select count(*) from @LOCATIONDIMENSIONS) = 1 then DIMENSIONLOCATION.ID else @NULLID end and
        isnull(SEGMENT.SPROPPPROJECTCATEGORYCODEID,@NULLID) = case when (select count(*) from @DIMENSIONS where FIELDID = 'Project category') = 1 then SPONSORSHIPOPPORTUNITYPROJECT.SPROPPPROJECTCATEGORYCODEID else @NULLID end
    where SPONSORSHIPOPPORTUNITY.ELIGIBILITYCODE = 1
    and (@CALCULATIONTYPE = 1 or SPONSORSHIPOPPORTUNITY.AVAILABILITYCODE = 0);

    if @CALCULATIONTYPE = 0  -- count

        select O.OPPORTUNITYID, S.VAL
        from @OPPORTUNITIES O
        inner join (select SEGMENTID, count(*) VAL
                    from @OPPORTUNITIES
                    group by SEGMENTID) S on S.SEGMENTID = O.SEGMENTID;

    else if @CALCULATIONTYPE = 1    -- percent available

        select O.OPPORTUNITYID, S.VAL
        from @OPPORTUNITIES O
        inner join (select SEGMENTID,
                           cast(sum(cast(AVAILABLE as tinyint)) as float)/count(*)*100 VAL
                    from @OPPORTUNITIES
                    group by SEGMENTID) S on S.SEGMENTID = O.SEGMENTID;

end