USP_REPORT_REVENUEBYPAYMENTMETHOD

Parameters

Parameter Parameter Type Mode Description
@APPLICATIONTYPES xml IN
@PAYMENTMETHODS xml IN
@STARTDATE datetime IN
@ENDDATE datetime IN
@REPORTUSERID nvarchar(128) IN
@CURRENCYCODE tinyint IN
@ALTREPORTUSERID nvarchar(128) IN

Definition

Copy

create procedure dbo.USP_REPORT_REVENUEBYPAYMENTMETHOD
(
    @APPLICATIONTYPES xml = null,
    @PAYMENTMETHODS xml = null,
    @STARTDATE datetime = null,
    @ENDDATE datetime = null,
    @REPORTUSERID nvarchar(128) = null,
    @CURRENCYCODE tinyint = null,
    @ALTREPORTUSERID nvarchar(128) = null
)
as begin
    set nocount on;

    declare @SELECTEDCURRENCYID uniqueidentifier;    

    declare @REVENUEPAYMENTMETHODTABLEID uniqueidentifier = '611E9794-28B4-4F03-A6A5-54BD92FB506B';
    declare @REVENUESPLITTABLEID uniqueidentifier = '274a03e5-066c-4f34-bfc2-fbb352fad140';
    declare @CURRENTAPPUSERID uniqueidentifier = dbo.UFN_APPUSER_GETREPORTAPPUSERID(@REPORTUSERID, @ALTREPORTUSERID);
    declare @ORGANIZATIONCURRENCYID uniqueidentifier = dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY();
    declare @DECIMALDIGITS tinyint;
    declare @ROUNDINGTYPECODE tinyint;

    if @CURRENCYCODE = 3
    begin
        if dbo.UFN_CURRENCYSET_GETAPPUSERCURRENCYSET(@CURRENTAPPUSERID) is not null
        begin                    
            select @SELECTEDCURRENCYID = CURRENCYSET.BASECURRENCYID
            from dbo.CURRENCYSET
            where CURRENCYSET.ID = dbo.UFN_CURRENCYSET_GETAPPUSERCURRENCYSET(@CURRENTAPPUSERID);
        end
        else
        begin
            select @SELECTEDCURRENCYID = CURRENCYSET.BASECURRENCYID
            from dbo.CURRENCYSET
            where CURRENCYSET.ID = dbo.UFN_CURRENCYSET_GETAPPUSERDEFAULTCURRENCYSET();
        end
    end
    else
    begin
        set @SELECTEDCURRENCYID = @ORGANIZATIONCURRENCYID;
    end        

    select 
        @DECIMALDIGITS = DECIMALDIGITS,
        @ROUNDINGTYPECODE = ROUNDINGTYPECODE
    from dbo.CURRENCY
    where ID = @SELECTEDCURRENCYID

    -- Add a fake payment method to translate auction donation payment methods from 'None' to 'Auction donation'

    declare @PAYMENTMETHODS_T table    (
        PAYMENTMETHODCODE tinyint,
        PAYMENTMETHOD nvarchar(100)
    );
    insert into @PAYMENTMETHODS_T(
        PAYMENTMETHODCODE, PAYMENTMETHOD
    )
    select distinct
        ENUMVALUES.[ENUMXML].value('@ID', 'tinyint'),
        ENUMVALUES.[ENUMXML].value('@Translation', 'nvarchar(100)')
    from dbo.TABLECATALOG 
        cross apply TABLECATALOG.[TABLESPECXML].nodes
        (
            'declare namespace bbtable="bb_appfx_table";
            /*/bbtable:Fields/bbtable:EnumField[@Name="PAYMENTMETHODCODE"]/bbtable:EnumValues/bbtable:EnumValue'
        ) as ENUMVALUES([ENUMXML])
    where 
        TABLECATALOG.[ID] = @REVENUEPAYMENTMETHODTABLEID;

    /* Determine available payment methods: */
    declare @AVAILABLEPAYMENTMETHODS table    (
        [PAYMENTMETHODCODE] tinyint,
        [PAYMENTMETHOD] nvarchar(100)
    );

    insert into @AVAILABLEPAYMENTMETHODS    (
        [PAYMENTMETHODCODE],
        [PAYMENTMETHOD]
    )
    select 
        [PAYMENTMETHODS_T].PAYMENTMETHODCODE, 
        [PAYMENTMETHODS_T].PAYMENTMETHOD
    from @PAYMENTMETHODS_T as [PAYMENTMETHODS_T]
    where [PAYMENTMETHODS_T].PAYMENTMETHODCODE in(
            select PAYMENTMETHODS.[PAYMENTMETHOD].value('PAYMENTMETHOD[1]', 'tinyint')
            from @PAYMENTMETHODS.nodes('PAYMENTMETHODS/ITEM') as PAYMENTMETHODS([PAYMENTMETHOD])
        ) or @PAYMENTMETHODS is null;


    /* Determine available application types: */
    declare @AVAILABLEAPPLICATIONTYPES table(
        [APPLICATIONTYPECODE] tinyint,
        [APPLICATIONTYPE] nvarchar(100)
    );

    insert into @AVAILABLEAPPLICATIONTYPES
    select distinct
        ENUMVALUES.[ENUMXML].value('@ID', 'tinyint'),
        ENUMVALUES.[ENUMXML].value('@Translation', 'nvarchar(100)')
    from dbo.TABLECATALOG
        cross apply TABLECATALOG.[TABLESPECXML].nodes(
            'declare namespace bbtable="bb_appfx_table";
            /*/bbtable:Fields/bbtable:EnumField[@Name="APPLICATIONCODE"]/bbtable:EnumValues/bbtable:EnumValue'
        ) as ENUMVALUES([ENUMXML])
    where TABLECATALOG.[ID] = @REVENUESPLITTABLEID 
        and ENUMVALUES.[ENUMXML].value('@ID', 'tinyint') in(
            select APPLICATIONTYPES.[APPLICATIONTYPE].value('APPLICATIONTYPE[1]', 'tinyint')
            from @APPLICATIONTYPES.nodes('APPLICATIONTYPES/ITEM') as APPLICATIONTYPES([APPLICATIONTYPE])
        ) 
        or @APPLICATIONTYPES is null;

    /*Change 'Auction donation' to 'Auction purchase' for usability purposes*/
    update @AVAILABLEAPPLICATIONTYPES
    set APPLICATIONTYPE = 'Auction purchase' 
    where APPLICATIONTYPECODE = 12;

    declare @ISOCURRENCYCODE nvarchar(3);
    declare @CURRENCYSYMBOL nvarchar(5);
    declare @CURRENCYSYMBOLDISPLAYSETTINGCODE tinyint;
    declare @CURRENCYDECIMALDIGITS integer;

    select
        @ISOCURRENCYCODE = CURRENCYPROPERTIES.ISO4217,
        @CURRENCYSYMBOL = CURRENCYPROPERTIES.CURRENCYSYMBOL,
        @CURRENCYSYMBOLDISPLAYSETTINGCODE = CURRENCYPROPERTIES.SYMBOLDISPLAYSETTINGCODE,
        @CURRENCYDECIMALDIGITS = CURRENCYPROPERTIES.DECIMALDIGITS
    from dbo.UFN_CURRENCY_GETPROPERTIES(@SELECTEDCURRENCYID) CURRENCYPROPERTIES;

    declare @ISSYSADMIN bit = dbo.UFN_APPUSER_ISSYSADMIN(@CURRENTAPPUSERID);
    declare @CHECKSITES bit = 0;
    if exists(select top 1 1 from dbo.SITE)
        set @CHECKSITES = 1;

    if @CHECKSITES = 1 and @ISSYSADMIN = 1
        set @CHECKSITES = 0;

    declare @CHECKMULTICURRENCY bit = dbo.UFN_CONDITIONSETTING_EVALUATEEXISTSCONDITION(N'Multicurrency');
    if @SELECTEDCURRENCYID = @ORGANIZATIONCURRENCYID
        set @CHECKMULTICURRENCY = 0;

    declare @REVENUEDATA table (
        QUANTITY integer,
        AMOUNT money,
        APPLICATIONCODE tinyint,
        PAYMENTMETHODCODE tinyint
    );

    declare @USERREPORTSITE table(
        SITEID uniqueidentifier
    );
    insert into @USERREPORTSITE
    select 
        SITEID
    from 
        dbo.UFN_SITESFORUSERONFEATURE(@CURRENTAPPUSERID,'6e42c3f3-294c-4890-944c-763651b244d1', 21);

    if @CHECKMULTICURRENCY = 1
    begin
        if @CHECKSITES = 1
        begin
            /*    Select out the cartesian product of application types and payment methods; then join that with revenue: */
            /* Use a fake payment method table to turn auction donations from having a payment method of None to a payment method of Auction donation */
            insert into @REVENUEDATA
            select
                count(REVENUESPLITINCURRENCY.[ID]) as [QUANTITY],
                sum(REVENUESPLITINCURRENCY.AMOUNTINCURRENCY) as [AMOUNT],
                REVENUESPLITINCURRENCY.[APPLICATIONCODE],
                REVENUEPAYMENTMETHOD.[PAYMENTMETHODCODE]
            from 
                dbo.UFN_REVENUESPLIT_GETAMOUNTINCURRENCY_BULK(@SELECTEDCURRENCYID, @ORGANIZATIONCURRENCYID, @DECIMALDIGITS, @ROUNDINGTYPECODE) as REVENUESPLITINCURRENCY
                inner join dbo.UFN_SITEID_MAPFROM_REVENUESPLITID_BULK() as REVENUESITE on REVENUESITE.ID = REVENUESPLITINCURRENCY.ID
                inner join dbo.FINANCIALTRANSACTION on FINANCIALTRANSACTION.ID = REVENUESPLITINCURRENCY.REVENUEID
                inner join dbo.REVENUEPAYMENTMETHOD on REVENUEPAYMENTMETHOD.REVENUEID = REVENUESPLITINCURRENCY.REVENUEID
            where
                (
                    (
                        REVENUESPLITINCURRENCY.[DATE] >= @STARTDATE 
                        and REVENUESPLITINCURRENCY.[DATE] <= @ENDDATE
                    ) 
                    or 
                    (
                        @STARTDATE is null 
                        and @ENDDATE is null
                    )
                ) 
                and REVENUESPLITINCURRENCY.TRANSACTIONTYPECODE in (0,7) -- Payment, auction donation

                and REVENUESPLITINCURRENCY.SPLITDELETEDON is null
                and not 
                (
                    FINANCIALTRANSACTION.BASEAMOUNT = 0 
                    and FINANCIALTRANSACTION.TRANSACTIONAMOUNT > 0
                ) 
                and 
                (
                    exists 
                    (
                        select 1
                        from 
                            @USERREPORTSITE USERREPORTSITE
                        where 
                            USERREPORTSITE.SITEID = REVENUESITE.SITEID
                            or 
                            (
                                USERREPORTSITE.SITEID is null 
                                and REVENUESITE.SITEID is null
                            )
                    )
                )
            group by 
                REVENUESPLITINCURRENCY.APPLICATIONCODE, 
                REVENUEPAYMENTMETHOD.PAYMENTMETHODCODE;
        end
        else
        begin
            insert into @REVENUEDATA
            select
                count(REVENUESPLITINCURRENCY.[ID]) as [QUANTITY],
                sum(REVENUESPLITINCURRENCY.AMOUNTINCURRENCY) as [AMOUNT],
                REVENUESPLITINCURRENCY.[APPLICATIONCODE],
                REVENUEPAYMENTMETHOD.[PAYMENTMETHODCODE]
            from 
                dbo.UFN_REVENUESPLIT_GETAMOUNTINCURRENCY_BULK(@SELECTEDCURRENCYID, @ORGANIZATIONCURRENCYID, @DECIMALDIGITS, @ROUNDINGTYPECODE) as REVENUESPLITINCURRENCY
                inner join dbo.FINANCIALTRANSACTION on FINANCIALTRANSACTION.ID = REVENUESPLITINCURRENCY.REVENUEID
                inner join dbo.REVENUEPAYMENTMETHOD on REVENUEPAYMENTMETHOD.REVENUEID = REVENUESPLITINCURRENCY.REVENUEID
            where
                (
                    (
                        REVENUESPLITINCURRENCY.[DATE] >= @STARTDATE 
                        and REVENUESPLITINCURRENCY.[DATE] <= @ENDDATE
                    ) 
                    or 
                    (
                        @STARTDATE is null 
                        and @ENDDATE is null
                    )
                ) 
                and REVENUESPLITINCURRENCY.TRANSACTIONTYPECODE in (0,7) -- Payment, auction donation

                and REVENUESPLITINCURRENCY.SPLITDELETEDON is null
                and not 
                (
                    FINANCIALTRANSACTION.BASEAMOUNT = 0 
                    and FINANCIALTRANSACTION.TRANSACTIONAMOUNT > 0
                ) 
            group by 
                REVENUESPLITINCURRENCY.APPLICATIONCODE, 
                REVENUEPAYMENTMETHOD.PAYMENTMETHODCODE;
        end
    end
    else
    begin
        if @CHECKSITES = 1
        begin
            insert into @REVENUEDATA
            select
                count(LI.ID) as [QUANTITY],
                sum(LI.ORGAMOUNT) as [AMOUNT],
                RSE.[APPLICATIONCODE],
                REVENUEPAYMENTMETHOD.[PAYMENTMETHODCODE]
            from dbo.FINANCIALTRANSACTION FT
            inner join dbo.FINANCIALTRANSACTIONLINEITEM LI on LI.FINANCIALTRANSACTIONID = FT.ID
            inner join dbo.REVENUESPLIT_EXT RSE on RSE.ID = LI.ID
            inner join dbo.REVENUEPAYMENTMETHOD on REVENUEPAYMENTMETHOD.REVENUEID = FT.ID
            inner join dbo.UFN_SITEID_MAPFROM_REVENUESPLITID_BULK() as REVENUESITE on REVENUESITE.ID = LI.ID
            where
                LI.DELETEDON is null and LI.TYPECODE != 1
                and FT.TYPECODE in (0,7)
                and 
                (
                    (
                        FT.CALCULATEDDATE >= @STARTDATE 
                        and FT.CALCULATEDDATE <= @ENDDATE
                    ) 
                    or 
                    (
                        @STARTDATE is null 
                        and @ENDDATE is null
                    )
                )
                and 
                (
                    exists 
                    (
                        select 1
                        from 
                            @USERREPORTSITE USERREPORTSITE
                        where 
                            USERREPORTSITE.SITEID = REVENUESITE.SITEID
                            or 
                            (
                                USERREPORTSITE.SITEID is null 
                                and REVENUESITE.SITEID is null
                            )
                    )
                )
            group by 
                RSE.APPLICATIONCODE
                ,REVENUEPAYMENTMETHOD.PAYMENTMETHODCODE;
        end
        else
        begin
            insert into @REVENUEDATA
            select
                count(LI.ID) as [QUANTITY],
                sum(LI.ORGAMOUNT) as [AMOUNT],
                RSE.[APPLICATIONCODE],
                REVENUEPAYMENTMETHOD.[PAYMENTMETHODCODE]
            from dbo.FINANCIALTRANSACTION FT
            inner join dbo.FINANCIALTRANSACTIONLINEITEM LI on LI.FINANCIALTRANSACTIONID = FT.ID
            inner join dbo.REVENUESPLIT_EXT RSE on RSE.ID = LI.ID
            inner join dbo.REVENUEPAYMENTMETHOD on REVENUEPAYMENTMETHOD.REVENUEID = FT.ID
            where
                LI.DELETEDON is null and LI.TYPECODE != 1
                and FT.TYPECODE in (0,7)
                and 
                (
                    (
                        FT.CALCULATEDDATE >= @STARTDATE 
                        and FT.CALCULATEDDATE <= @ENDDATE
                    ) 
                    or 
                    (
                        @STARTDATE is null 
                        and @ENDDATE is null
                    )
                )
            group by 
                RSE.APPLICATIONCODE
                ,REVENUEPAYMENTMETHOD.PAYMENTMETHODCODE;
        end
    end

    select
        AVAILABLEAPPLICATIONTYPES.[APPLICATIONTYPE],
        AVAILABLEPAYMENTMETHODS.[PAYMENTMETHOD],
        coalesce(REVENUEDATA.[QUANTITY], 0) as [NUMBEROFTRANSACTIONS],
        coalesce(REVENUEDATA.[AMOUNT], 0) as [TOTALREVENUE],
        @ISOCURRENCYCODE [ISOCURRENCYCODE],
        @CURRENCYSYMBOL [CURRENCYSYMBOL],
        @CURRENCYSYMBOLDISPLAYSETTINGCODE [CURRENCYSYMBOLDISPLAYSETTINGCODE],
        @CURRENCYDECIMALDIGITS [DECIMALDIGITS]
    from @AVAILABLEAPPLICATIONTYPES as AVAILABLEAPPLICATIONTYPES
        cross join @AVAILABLEPAYMENTMETHODS as [AVAILABLEPAYMENTMETHODS]
        left outer join @REVENUEDATA [REVENUEDATA] on REVENUEDATA.[APPLICATIONCODE] = AVAILABLEAPPLICATIONTYPES.[APPLICATIONTYPECODE] 
            and REVENUEDATA.[PAYMENTMETHODCODE] = AVAILABLEPAYMENTMETHODS.[PAYMENTMETHODCODE]
    order by 
        AVAILABLEAPPLICATIONTYPES.[APPLICATIONTYPE];
end