USP_DATALIST_PAYMENT_BYPAYMENTMETHOD
View payments by payment method trends over time..
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@DATETYPE | tinyint | IN | Revenue for |
@FROMDATE | datetime | IN | From |
@TODATE | datetime | IN | To |
@CURRENTAPPUSERID | uniqueidentifier | IN | Input parameter indicating the ID of the current user. |
@METHOD1NAME | nvarchar(25) | INOUT | Source |
@METHOD2NAME | nvarchar(25) | INOUT | Source |
@METHOD3NAME | nvarchar(25) | INOUT | Source |
@METHOD4NAME | nvarchar(25) | INOUT | Source |
@METHOD5NAME | nvarchar(25) | INOUT | Source |
Definition
Copy
CREATE procedure dbo.USP_DATALIST_PAYMENT_BYPAYMENTMETHOD
(
@DATETYPE tinyint = null
,@FROMDATE datetime = null
,@TODATE datetime = null
,@CURRENTAPPUSERID uniqueidentifier = null
,@METHOD1NAME nvarchar(25) = null output
,@METHOD2NAME nvarchar(25) = null output
,@METHOD3NAME nvarchar(25) = null output
,@METHOD4NAME nvarchar(25) = null output
,@METHOD5NAME nvarchar(25) = null output
)
as
begin
declare @INSERTSTARTDATE bit = 0;
declare @INSERTENDDATE bit = 0;
if @FROMDATE is not null and @TODATE is not null and cast(@FROMDATE as date) = cast(@TODATE as date)
begin
set @FROMDATE = DATEADD(day, -1, @FROMDATE)
set @TODATE = DATEADD(day, 1, @TODATE)
end
if @FROMDATE is not null
begin
set @FROMDATE = dbo.UFN_DATE_GETEARLIESTTIME(@FROMDATE);
set @INSERTSTARTDATE = 1
end
if @TODATE is not null
begin
set @TODATE = dbo.UFN_DATE_GETLATESTTIME(@TODATE);
set @INSERTENDDATE = 1
end
declare @Data TABLE (
[DATE] date
,METHOD1AMOUNT money
,METHOD2AMOUNT money
,METHOD3AMOUNT money
,METHOD4AMOUNT money
,METHOD5AMOUNT money)
declare @tmp_paymentmethod table
(PAYMENTID uniqueidentifier,
PAYMENTMETHOD varchar(max),
PAYMENTMETHODCODE tinyint,
CREDITTYPE varchar(max),
AMOUNT money,
[DATE] date)
declare @TMP_TOTALREVENUE table (
TransactionID uniqueidentifier,
SalesOrderId uniqueidentifier,
TransactionDate datetime,
Amount money,
TransactionTypeCode int,
TransactionType nvarchar(max),
ApplicationCode int,
RevenueTypeCode int,
ConstituentName nvarchar(max),
ConstituentLink nvarchar(max),
ProgramName nvarchar(max),
EventName nvarchar(max),
TaxName nvarchar(max),
FeeName nvarchar(max),
DepartmentName nvarchar(max),
MembershipName nvarchar(max),
DesignationName nvarchar(max),
LocationName nvarchar(max),
ResourceName nvarchar(max),
StaffResourceName nvarchar(max),
SalesMethodTypeCode int,
CreditItemID uniqueidentifier, -- why is this returned
TransactionLink nvarchar(max),
SortConstituentName nvarchar(max),
PaymentMethod nvarchar(max),
GroupType nvarchar(max),
ArrivalDate date,
ReservationName nvarchar(max),
ReservationLink nvarchar(max),
Reference nvarchar(max),
ReferenceLink nvarchar(max),
PledgeDate datetime
);
Insert @tmp_TotalRevenue exec dbo.USP_REPORT_TOTALREVENUE 0, 0, 0, @FROMDATE, @TODATE, @CURRENTAPPUSERID, null, null, null, 1, 1, 1, 1, 1;
-- REFUNDS
insert @tmp_paymentmethod
select distinct CP.ID [PAYMENTID]
,ISNULL(CP.PAYMENTMETHOD, 'None')
,isnull(CP.PAYMENTMETHODCODE, 9)
,case CP.PAYMENTMETHODCODE
when 2 then '<Card type not specified>'
when 10 then ISNULL(OP.DESCRIPTION, '<Other payment subtype not specified>') END
,CP.AMOUNT * total.AMOUNT / CPTOTAL.AMOUNT
,t.TransactionDate
from @tmp_TotalRevenue t
inner join dbo.CREDITPAYMENT CP on CP.CREDITID = t.TransactionId
left join dbo.OTHERPAYMENTMETHODCODE OP on OP.ID = CP.OTHERPAYMENTMETHODCODEID
inner join (select TransactionId as ID, SUM(Amount) [AMOUNT] from @tmp_TotalRevenue group by TransactionId) total on total.ID = CP.CREDITID
inner join (select SUM(AMOUNT) as [AMOUNT], CREDITID from dbo.CREDITPAYMENT group by CREDITID) CPTOTAL on CPTOTAL.CREDITID = cp.CREDITID
where t.TransactionTypeCode = 23 and t.RevenueTypeCode <> 7
-- SALES ORDERS
insert @tmp_paymentmethod
select ISNULL(pm.id, S.ID) PAYMENTID, isnull(pm.PAYMENTMETHOD,'None'), isnull(pm.PAYMENTMETHODCODE,9),
case pm.PAYMENTMETHODCODE
when 2 then
ISNULL((select ct.DESCRIPTION from CREDITTYPECODE ct
inner join dbo.CREDITCARDPAYMENTMETHODDETAIL pmd on pmd.CREDITTYPECODEID = ct.ID
where pm.ID = pmd.ID ),'<Card type not specified>')
when 5 then
ISNULL((select DESCRIPTION from PROPERTYSUBTYPECODE sc
inner join PROPERTYDETAIL pd on sc.ID = pd.PROPERTYSUBTYPECODEID
where pd.ID = pm.ID), '<Property subtype not specified>')
when 6 then
ISNULL((select DESCRIPTION from GIFTINKINDSUBTYPECODE gc
inner join GIFTINKINDPAYMENTMETHODDETAIL gpm on gc.ID = gpm.GIFTINKINDSUBTYPECODEID
where gpm.ID = pm.id), '<Gift-in-kind subtype not specified>')
when 10 then
ISNULL((select DESCRIPTION from OTHERPAYMENTMETHODCODE opm
inner join OTHERPAYMENTMETHODDETAIL opd on opm.ID = opd.OTHERPAYMENTMETHODCODEID
where opd.ID = pm.ID), '<Other payment subtype not specified>')
else null end CREDITTYPE,
ISNULL(ftli.BASEAMOUNT, s.AMOUNT) AMOUNT
,S.TRANSACTIONDATE
from SALESORDER s
left join SALESORDERPAYMENT so on so.SALESORDERID= s.ID
left join FINANCIALTRANSACTIONLINEITEM ftli on ftli.FINANCIALTRANSACTIONID = so.PAYMENTID
left join REVENUEPAYMENTMETHOD pm on so.PAYMENTID = pm.REVENUEID
where s.ID in (Select TransactionId from @tmp_TotalRevenue where TransactionTypeCode = 5)
-- PLEDGE RECORDS
insert @tmp_paymentmethod
select pm.id PAYMENTID, isnull(pm.PAYMENTMETHOD,'None'), isnull(pm.PAYMENTMETHODCODE,9),
case pm.PAYMENTMETHODCODE
when 2 then
ISNULL((select ct.DESCRIPTION from dbo.CREDITTYPECODE ct
inner join dbo.CREDITCARD cc on ct.ID = cc.CREDITTYPECODEID
inner join dbo.REVENUESCHEDULE rs on rs.CREDITCARDID = cc.ID
where rs.ID = pm.revenueid),'<Card type not specified>')
when 5 then
ISNULL((select DESCRIPTION from PROPERTYSUBTYPECODE sc
inner join PROPERTYDETAIL pd on sc.ID = pd.PROPERTYSUBTYPECODEID
where pd.ID = pm.ID), '<Property subtype not specified>')
when 6 then
ISNULL((select DESCRIPTION from GIFTINKINDSUBTYPECODE gc
inner join GIFTINKINDPAYMENTMETHODDETAIL gpm on gc.ID = gpm.GIFTINKINDSUBTYPECODEID
where gpm.ID = pm.id), '<Gift-in-kind subtype not specified>')
when 10 then
ISNULL((select DESCRIPTION from OTHERPAYMENTMETHODCODE opm
inner join OTHERPAYMENTMETHODDETAIL opd on opm.ID = opd.OTHERPAYMENTMETHODCODEID
where opd.ID = pm.ID), '<Other payment subtype not specified>')
else null end CREDITTYPE,
t.Amount
,t.TransactionDate
from @tmp_TotalRevenue t
left join REVENUEPAYMENTMETHOD pm on pm.REVENUEID = t.TransactionId
where TransactionTypeCode = 1 -- Pledge
-- REVENUE RECORDS
insert @tmp_paymentmethod
select pm.id PAYMENTID, isnull(pm.PAYMENTMETHOD,'None'), isnull(pm.PAYMENTMETHODCODE,9),
case pm.PAYMENTMETHODCODE
when 2 then
ISNULL((select ct.DESCRIPTION from CREDITTYPECODE ct
inner join dbo.CREDITCARDPAYMENTMETHODDETAIL pmd on pmd.CREDITTYPECODEID = ct.ID
where pm.ID = pmd.ID ),'<Card type not specified>')
when 5 then
ISNULL((select DESCRIPTION from PROPERTYSUBTYPECODE sc
inner join PROPERTYDETAIL pd on sc.ID = pd.PROPERTYSUBTYPECODEID
where pd.ID = pm.ID), '<Property subtype not specified>')
when 6 then
ISNULL((select DESCRIPTION from GIFTINKINDSUBTYPECODE gc
inner join GIFTINKINDPAYMENTMETHODDETAIL gpm on gc.ID = gpm.GIFTINKINDSUBTYPECODEID
where gpm.ID = pm.id), '<Gift-in-kind subtype not specified>')
when 10 then
ISNULL((select DESCRIPTION from OTHERPAYMENTMETHODCODE opm
inner join OTHERPAYMENTMETHODDETAIL opd on opm.ID = opd.OTHERPAYMENTMETHODCODEID
where opd.ID = pm.ID), '<Other payment subtype not specified>')
else null end CREDITTYPE,
t.Amount AMOUNT
,t.TransactionDate
from @tmp_TotalRevenue t
left join REVENUEPAYMENTMETHOD pm on pm.REVENUEID = t.TransactionId
where TransactionTypeCode not in (23,1,5)
declare @topAmounts table (PAYMENTMETHODCODE int)
insert into @topAmounts
select top 4 PAYMENTMETHODCODE
from @tmp_paymentmethod
group by PAYMENTMETHODCODE order by SUM(AMOUNT) desc;
declare @temp table(ID int, [DATE] date, AMOUNT money, PAYMENTMETHOD nvarchar(25))
insert into @temp
select DENSE_RANK() over (order by ISNULL(convert(integer, TOPAMOUNTS.PAYMENTMETHODCODE), 999999)) [PAYMENTMETHODCODE]
,[DATE]
,SUM(AMOUNT) [AMOUNT]
,case when TOPAMOUNTS.PAYMENTMETHODCODE IS null then 'All others' else PM.PAYMENTMETHOD end PAYMENTMETHOD
from @tmp_paymentmethod PM
left join (select PAYMENTMETHODCODE from @topAmounts) TOPAMOUNTS on TOPAMOUNTS.PAYMENTMETHODCODE = PM.PAYMENTMETHODCODE
group by ISNULL(convert(integer, TOPAMOUNTS.PAYMENTMETHODCODE), 999999), [DATE], case when TOPAMOUNTS.PAYMENTMETHODCODE IS null then 'All others' else PM.PAYMENTMETHOD end;
insert into @Data
select pvt.[DATE]
, pvt.[1] [METHOD1AMOUNT]
, pvt.[2] [METHOD2AMOUNT]
, pvt.[3] [METHOD3AMOUNT]
, pvt.[4] [METHOD4AMOUNT]
, pvt.[5] [METHOD5AMOUNT]
from (
select ID, [DATE], AMOUNT from @temp) T
pivot (
SUM(AMOUNT) for ID in ([1], [2], [3], [4], [5])
) pvt
select top 1 @METHOD1NAME = T.PAYMENTMETHOD from @temp T where T.ID = 1
select top 1 @METHOD2NAME = T.PAYMENTMETHOD from @temp T where T.ID = 2
select top 1 @METHOD3NAME = T.PAYMENTMETHOD from @temp T where T.ID = 3
select top 1 @METHOD4NAME = T.PAYMENTMETHOD from @temp T where T.ID = 4
select top 1 @METHOD5NAME = T.PAYMENTMETHOD from @temp T where T.ID = 5
update @Data set
METHOD1AMOUNT = case when @METHOD1NAME is not null then isnull(METHOD1AMOUNT, 0) end
,METHOD2AMOUNT = case when @METHOD2NAME is not null then isnull(METHOD2AMOUNT, 0) end
,METHOD3AMOUNT = case when @METHOD3NAME is not null then isnull(METHOD3AMOUNT, 0) end
,METHOD4AMOUNT = case when @METHOD4NAME is not null then isnull(METHOD4AMOUNT, 0) end
,METHOD5AMOUNT = case when @METHOD5NAME is not null then isnull(METHOD5AMOUNT, 0) end;
if @INSERTENDDATE = 1
if not exists(select 1 from @Data where [DATE] = convert(varchar, @TODATE, 111))
insert into @Data([DATE]
, METHOD1AMOUNT
, METHOD2AMOUNT
, METHOD3AMOUNT
, METHOD4AMOUNT
, METHOD5AMOUNT)
values (convert(varchar, @TODATE, 111)
,case when @METHOD1NAME is not null then 0 else null end
,case when @METHOD2NAME is not null then 0 else null end
,case when @METHOD3NAME is not null then 0 else null end
,case when @METHOD4NAME is not null then 0 else null end
,case when @METHOD5NAME is not null then 0 else null end);
if @INSERTSTARTDATE = 1
if not exists(select 1 from @Data where [DATE] = @FROMDATE)
insert into @Data([DATE]
, METHOD1AMOUNT
, METHOD2AMOUNT
, METHOD3AMOUNT
, METHOD4AMOUNT
, METHOD5AMOUNT)
values (@FROMDATE
,case when @METHOD1NAME is not null then 0 else null end
,case when @METHOD2NAME is not null then 0 else null end
,case when @METHOD3NAME is not null then 0 else null end
,case when @METHOD4NAME is not null then 0 else null end
,case when @METHOD5NAME is not null then 0 else null end);
if @INSERTSTARTDATE = 1 and @INSERTENDDATE = 1
begin
with DateRange([DATE]) as
(
select @FROMDATE [DATE]
union all
select DATEADD(day, 1, [DATE]) [DATE]
from DateRange
where [DATE] < convert(varchar, @TODATE, 111)
)
insert into @Data([DATE]
, METHOD1AMOUNT
, METHOD2AMOUNT
, METHOD3AMOUNT
, METHOD4AMOUNT
, METHOD5AMOUNT)
select T.[DATE]
,case when @METHOD1NAME is not null then 0 else null end
,case when @METHOD2NAME is not null then 0 else null end
,case when @METHOD3NAME is not null then 0 else null end
,case when @METHOD4NAME is not null then 0 else null end
,case when @METHOD5NAME is not null then 0 else null end
from DateRange T
where T.[DATE] not in (select [DATE] from @Data)
OPTION (MAXRECURSION 7000);
end
select * from @Data
order by [DATE] asc;
end