USP_DATAFORMTEMPLATE_VIEW_CREDITMEMBERSHIPVIEW2
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@ID | uniqueidentifier | IN | |
@DATALOADED | bit | INOUT | |
@ITEMS | xml | INOUT | |
@TOTAL | money | INOUT | |
@PAYMENTS | xml | INOUT | |
@OTHERPAYMENTMETHODS | xml | INOUT | |
@TRANSACTIONID | uniqueidentifier | INOUT | |
@TIMESTAMP | bigint | INOUT | |
@CONSTITUENTID | uniqueidentifier | INOUT | |
@CONSTITUENTNAME | nvarchar(154) | INOUT |
Definition
Copy
CREATE procedure dbo.USP_DATAFORMTEMPLATE_VIEW_CREDITMEMBERSHIPVIEW2
(
@ID uniqueidentifier, -- MEMBERSHIPID
@DATALOADED bit = 0 output,
@ITEMS xml = null output,
@TOTAL money = null output,
@PAYMENTS xml = null output,
@OTHERPAYMENTMETHODS xml = null output,
@TRANSACTIONID uniqueidentifier = null output, -- MEMBERSHIPTRANSACTIONID
@TIMESTAMP bigint = null output,
@CONSTITUENTID uniqueidentifier = null output,
@CONSTITUENTNAME nvarchar(154) = null output
)
as begin
set nocount on;
set @DATALOADED = 0;
--Raise error if membership is not active
if (select STATUSCODE from dbo.MEMBERSHIP where ID = @ID) <> 0
begin
raiserror('The membership selected is not active. Only active memberships may be refunded.', 13, 1);
end
if (select EXPIRATIONDATE from dbo.MEMBERSHIP where ID = @ID) < getdate()
begin
raiserror('The membership selected has lapsed. Lapsed memberships may not be refunded.', 13, 1);
end
declare @MEMBERSHIPTRANSACTIONID uniqueidentifier = (
select top 1 ID
from dbo.MEMBERSHIPTRANSACTION
where MEMBERSHIPID = @ID
order by DATEADDED desc
);
set @TRANSACTIONID = @MEMBERSHIPTRANSACTIONID;
declare @ITEMSTABLE table(
SALESORDERITEMID uniqueidentifier,
[DESCRIPTION] nvarchar(500),
PRICE money,
DISCOUNTS money,
AMOUNTPAID money,
TYPECODE tinyint,
SALESORDERID uniqueidentifier,
ITEMID uniqueidentifier,
REVENUESPLITID uniqueidentifier,
HASCONTRIBUTEDREVENUE bit,
PARENTITEMID uniqueidentifier -- Each addon item will include the MEMBERSHIPTRANSACTIONID for the transaction being refunded.
);
declare @PAYMENTSTABLE table(
[INCLUDE] bit,
[DESCRIPTION] nvarchar(500),
DISPLAYDESCRIPTION nvarchar(500),
DISPLAYSOURCE nvarchar(100),
SOURCENUMBER nvarchar(100),
SOURCETYPE tinyint,
REFUNDAMOUNT money,
AMOUNTPAID money,
PAYMENTTYPECODE tinyint,
REVENUEID uniqueidentifier,
REVENUESPLITID uniqueidentifier,
TRANSACTIONID uniqueidentifier,
PAYMENTDATE datetime
);
set @OTHERPAYMENTMETHODS = (
select ID, [DESCRIPTION]
from dbo.OTHERPAYMENTMETHODCODE
for xml raw ('ITEM'), type, root('OTHERPAYMENTMETHODS'), binary base64
);
declare @SALESORDERID uniqueidentifier;
select @SALESORDERID = SALESORDER.ID
from dbo.SALESORDER
inner join dbo.SALESORDERITEM on SALESORDER.ID = SALESORDERITEM.SALESORDERID
inner join dbo.SALESORDERITEMMEMBERSHIP on SALESORDERITEM.ID = SALESORDERITEMMEMBERSHIP.ID
where SALESORDERITEMMEMBERSHIP.MEMBERSHIPTRANSACTIONID = @MEMBERSHIPTRANSACTIONID;
--If the membership was paid for on an order
if @SALESORDERID is not null
begin
insert into @ITEMSTABLE
select
SALESORDERITEM.ID SALESORDERITEMID,
SALESORDERITEM.[DESCRIPTION],
SALESORDERITEM.TOTAL PRICE,
sum(coalesce(SALESORDERITEMMEMBERSHIPITEMPROMOTION.AMOUNT, 0)) DISCOUNTS,
SALESORDERITEM.TOTAL - sum(coalesce(SALESORDERITEMMEMBERSHIPITEMPROMOTION.AMOUNT, 0)) AMOUNTPAID,
SALESORDERITEM.TYPECODE TYPECODE,
SALESORDERITEM.SALESORDERID,
MEMBERSHIPTRANSACTION.ID ITEMID,
MEMBERSHIPTRANSACTION.REVENUESPLITID,
0 HASCONTRIBUTEDREVENUE,
null PARENTITEMID
from dbo.SALESORDERITEM
inner join dbo.SALESORDERITEMMEMBERSHIP on SALESORDERITEM.ID = SALESORDERITEMMEMBERSHIP.ID
inner join dbo.MEMBERSHIPTRANSACTION on SALESORDERITEMMEMBERSHIP.MEMBERSHIPTRANSACTIONID = MEMBERSHIPTRANSACTION.ID
left join dbo.SALESORDERITEMMEMBERSHIPITEMPROMOTION on SALESORDERITEM.ID = SALESORDERITEMMEMBERSHIPITEMPROMOTION.SALESORDERITEMID
left join dbo.CREDITITEM_EXT REFUNDLINEITEM_EXT on REFUNDLINEITEM_EXT.SALESORDERITEMID = SALESORDERITEM.ID
where SALESORDERITEM.SALESORDERID = @SALESORDERID
and MEMBERSHIPTRANSACTION.ID = @MEMBERSHIPTRANSACTIONID
and REFUNDLINEITEM_EXT.ID is null -- Exclude membership that has already been refunded (only load add-ons).
group by
SALESORDERITEM.ID,
SALESORDERITEM.[DESCRIPTION],
SALESORDERITEM.TOTAL,
SALESORDERITEM.TYPECODE,
SALESORDERITEM.SALESORDERID,
MEMBERSHIPTRANSACTION.ID,
MEMBERSHIPTRANSACTION.REVENUESPLITID;
end
else begin
--The membership was paid for outside of an order
insert into @ITEMSTABLE
select
null as SALESORDERITEMID,
isnull(dbo.UFN_MEMBERSHIPPROGRAM_GETNAME(MEMBERSHIP.MEMBERSHIPPROGRAMID) + ' - '
+ dbo.UFN_MEMBERSHIPLEVEL_GETNAME(MEMBERSHIPTRANSACTION.MEMBERSHIPLEVELID) + ' ('
+ dbo.UFN_MEMBERSHIPLEVELTERM_GETVALUE(MEMBERSHIPTRANSACTION.MEMBERSHIPLEVELTERMID) + '): '
, '')
+ MEMBERSHIPTRANSACTION.[ACTION]
as [DESCRIPTION],
FINANCIALTRANSACTIONLINEITEM.ORGAMOUNT as PRICE,
0 as DISCOUNTS,
FINANCIALTRANSACTIONLINEITEM.ORGAMOUNT as AMOUNTPAID,
1 as TYPECODE,
null as SALESORDERID,
@TRANSACTIONID as ITEMID,
MEMBERSHIPTRANSACTION.REVENUESPLITID,
0 as HASCONTRIBUTEDREVENUE,
null PARENTITEMID
from dbo.MEMBERSHIP
inner join dbo.MEMBERSHIPTRANSACTION on MEMBERSHIPTRANSACTION.MEMBERSHIPID = MEMBERSHIPID
inner join dbo.FINANCIALTRANSACTIONLINEITEM on FINANCIALTRANSACTIONLINEITEM.ID = MEMBERSHIPTRANSACTION.REVENUESPLITID
left join dbo.FINANCIALTRANSACTIONLINEITEM REFUNDLINEITEM on REFUNDLINEITEM.SOURCELINEITEMID = MEMBERSHIPTRANSACTION.REVENUESPLITID
left join dbo.CREDITITEM_EXT REFUNDLINEITEM_EXT on REFUNDLINEITEM_EXT.ID = REFUNDLINEITEM.ID
where MEMBERSHIP.ID = @ID
and MEMBERSHIPTRANSACTION.ID = @MEMBERSHIPTRANSACTIONID
and REFUNDLINEITEM_EXT.ID is null; -- Exclude membership that has already been refunded (only load add-ons).
end
--find all the add-ons
insert into @ITEMSTABLE
select
SALESORDERITEM.ID SALESORDERITEMID,
ADDON.NAME,
MEMBERSHIPADDON.ORGANIZATIONPURCHASEPRICE as PRICE,
0 DISCOUNTS,
MEMBERSHIPADDON.ORGANIZATIONPURCHASEPRICE as AMOUNTPAID,
16,
SALESORDERITEM.SALESORDERID,
MEMBERSHIPADDON.ID ITEMID,
MEMBERSHIPADDON.REVENUESPLITID,
0 HASCONTRIBUTEDREVENUE,
MEMBERSHIPADDON.MEMBERSHIPTRANSACTIONID as PARENTITEMID
from dbo.MEMBERSHIPADDON
inner join dbo.ADDON on ADDON.ID = MEMBERSHIPADDON.ADDONID
left join dbo.SALESORDERITEMMEMBERSHIPADDON on SALESORDERITEMMEMBERSHIPADDON.MEMBERSHIPADDONID = MEMBERSHIPADDON.ID
left join dbo.SALESORDERITEM on SALESORDERITEM.ID = SALESORDERITEMMEMBERSHIPADDON.ID
outer apply (
select
sum(QUANTITY) QUANTITY
from dbo.FINANCIALTRANSACTIONLINEITEM
inner join dbo.FINANCIALTRANSACTION on FINANCIALTRANSACTION.ID = FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID
inner join dbo.CREDITITEM_EXT on CREDITITEM_EXT.ID = FINANCIALTRANSACTIONLINEITEM.ID
where
FINANCIALTRANSACTION.TYPECODE = 23 -- refund
and CREDITITEM_EXT.TYPECODE = 16 -- membership add-on
and FINANCIALTRANSACTIONLINEITEM.SOURCELINEITEMID = MEMBERSHIPADDON.REVENUESPLITID
) REFUNDEDADDONS
cross apply (
select NUM
from dbo.NUMBERS
where NUMBERS.NUM < MEMBERSHIPADDON.QUANTITY - isnull(REFUNDEDADDONS.QUANTITY, 0) -- Make an entry for each remaining add-on unit
) NUMBERS
where
MEMBERSHIPADDON.MEMBERSHIPID = @ID
and MEMBERSHIPADDON.MEMBERSHIPTRANSACTIONID = @MEMBERSHIPTRANSACTIONID;
--Get the total of the membership and all the addons
select @TOTAL = sum(AMOUNTPAID) from @ITEMSTABLE;
--Update it if it has contributed revenue
with CONTRIBUTEDREVENUE_CTE as
(
select
case
when sum(FTLI.TRANSACTIONAMOUNT) > 0 then 1
else 0
end HASCONTRIBUTEDREVENUE,
I.REVENUESPLITID as ID
from @ITEMSTABLE I
inner join dbo.FINANCIALTRANSACTIONLINEITEM FTLI on FTLI.SOURCELINEITEMID = I.REVENUESPLITID
inner join dbo.REVENUESPLIT_EXT on REVENUESPLIT_EXT.ID = FTLI.ID
where REVENUESPLIT_EXT.TYPECODE = 0
and REVENUESPLIT_EXT.APPLICATIONCODE = 0 -- only donations
and FTLI.TYPECODE = 0 -- only standard ft line items
group by I.REVENUESPLITID
)
update @ITEMSTABLE
set HASCONTRIBUTEDREVENUE = CTE.HASCONTRIBUTEDREVENUE
from CONTRIBUTEDREVENUE_CTE CTE
where CTE.ID = REVENUESPLITID;
set @ITEMS = (
select
SALESORDERITEMID,
[DESCRIPTION],
PRICE,
DISCOUNTS,
AMOUNTPAID,
TYPECODE,
ITEMID,
REVENUESPLITID,
HASCONTRIBUTEDREVENUE,
PARENTITEMID
from @ITEMSTABLE
order by TYPECODE
for xml raw ('ITEM'), type, root('ITEMS'), binary base64
);
--if it was paid for on an order, get the payments
if @SALESORDERID is not null
begin
--get all the payments from sales orders
insert into @PAYMENTSTABLE
select
PAYMENTS.[INCLUDE],
PAYMENTS.[DESCRIPTION],
case
when PAYMENTS.AMOUNTPAID < ITEMTOTAL then
'$' + cast(PAYMENTS.AMOUNTPAID as nvarchar(20)) + ' ' + PAYMENTS.[DESCRIPTION]
else
'$' + cast(ITEMTOTAL as nvarchar(20)) + ' ' + PAYMENTS.[DESCRIPTION]
end DISPLAYDESCRIPTION,
PAYMENTS.DISPLAYSOURCE,
PAYMENTS.SOURCENUMBER,
PAYMENTS.SOURCETYPE,
PAYMENTS.REFUNDAMOUNT,
case
when PAYMENTS.AMOUNTPAID < ITEMTOTAL then
PAYMENTS.AMOUNTPAID
else
ITEMTOTAL
end AMOUNTPAID,
PAYMENTS.PAYMENTTYPECODE,
PAYMENTS.REVENUEID,
PAYMENTS.REVENUESPLITID,
PAYMENTS.TRANSACTIONID,
PAYMENTS.PAYMENTDATE
from (
select
0 [INCLUDE],
case
when REVENUEPAYMENTMETHOD.PAYMENTMETHODCODE = 10 then
dbo.UFN_OTHERPAYMENTMETHODCODE_GETDESCRIPTION(OTHERPAYMENTMETHODCODEID)
else
REVENUEPAYMENTMETHOD.PAYMENTMETHOD
+ coalesce(', ' + dbo.UFN_CREDITTYPECODE_GETDESCRIPTION(CREDITCARDPAYMENTMETHODDETAIL.CREDITTYPECODEID) + ' #' + CREDITCARDPAYMENTMETHODDETAIL.CREDITCARDPARTIALNUMBER, '')
+ coalesce(' #' + CHECKPAYMENTMETHODDETAIL.CHECKNUMBER, '')
end [DESCRIPTION],
null DISPLAYSOURCE,
SALESORDER.SEQUENCEID SOURCENUMBER,
0 SOURCETYPE,
0 REFUNDAMOUNT,
FINANCIALTRANSACTION.BASEAMOUNT - coalesce(
(
select sum(coalesce(CREDITPAYMENT.AMOUNT, 0))
from dbo.CREDITPAYMENT
where REVENUEID = FINANCIALTRANSACTION.ID
), 0
) AMOUNTPAID, -- (amount - refunds)
REVENUEPAYMENTMETHOD.PAYMENTMETHODCODE PAYMENTTYPECODE,
1 AUTOINCLUDED,
FINANCIALTRANSACTION.ID REVENUEID,
null REVENUESPLITID,
CREDITCARDPAYMENTMETHODDETAIL.TRANSACTIONID,
sum(ITEMSTABLE.AMOUNTPAID) ITEMTOTAL,
cast(FINANCIALTRANSACTION.[DATE] as datetime) as PAYMENTDATE
from dbo.SALESORDER
inner join dbo.SALESORDERPAYMENT on SALESORDERPAYMENT.SALESORDERID = SALESORDER.ID
inner join dbo.FINANCIALTRANSACTION on SALESORDERPAYMENT.PAYMENTID = FINANCIALTRANSACTION.ID
inner join dbo.REVENUEPAYMENTMETHOD on FINANCIALTRANSACTION.ID = REVENUEPAYMENTMETHOD.REVENUEID
left join dbo.CREDITCARDPAYMENTMETHODDETAIL on CREDITCARDPAYMENTMETHODDETAIL.ID = REVENUEPAYMENTMETHOD.ID
left join dbo.OTHERPAYMENTMETHODDETAIL on OTHERPAYMENTMETHODDETAIL.ID = REVENUEPAYMENTMETHOD.ID
left join dbo.CHECKPAYMENTMETHODDETAIL on CHECKPAYMENTMETHODDETAIL.ID = REVENUEPAYMENTMETHOD.ID
left join @ITEMSTABLE ITEMSTABLE on SALESORDER.ID = ITEMSTABLE.SALESORDERID
where SALESORDER.ID = @SALESORDERID
group by REVENUEPAYMENTMETHOD.PAYMENTMETHODCODE, CREDITCARDPAYMENTMETHODDETAIL.TRANSACTIONID, FINANCIALTRANSACTION.ID, OTHERPAYMENTMETHODDETAIL.OTHERPAYMENTMETHODCODEID, REVENUEPAYMENTMETHOD.PAYMENTMETHOD, CREDITCARDPAYMENTMETHODDETAIL.CREDITTYPECODEID, CREDITCARDPAYMENTMETHODDETAIL.CREDITCARDPARTIALNUMBER, CHECKPAYMENTMETHODDETAIL.CHECKNUMBER, SALESORDER.SEQUENCEID, FINANCIALTRANSACTION.BASEAMOUNT, FINANCIALTRANSACTION.[DATE]
) PAYMENTS
where PAYMENTS.AMOUNTPAID > 0;
end
else begin
--it was paid for through the back office
insert into @PAYMENTSTABLE
select
0 [INCLUDE],
case
when REVENUEPAYMENTMETHOD.PAYMENTMETHODCODE = 10 then
dbo.UFN_OTHERPAYMENTMETHODCODE_GETDESCRIPTION(OTHERPAYMENTMETHODCODEID)
else
REVENUEPAYMENTMETHOD.PAYMENTMETHOD
+ coalesce(', ' + dbo.UFN_CREDITTYPECODE_GETDESCRIPTION(CREDITCARDPAYMENTMETHODDETAIL.CREDITTYPECODEID) + ' #' + CREDITCARDPAYMENTMETHODDETAIL.CREDITCARDPARTIALNUMBER, '')
+ coalesce(' #' + CHECKPAYMENTMETHODDETAIL.CHECKNUMBER, '')
end [DESCRIPTION],
'$' + cast(@TOTAL as nvarchar(20)) + ' ' + case
when REVENUEPAYMENTMETHOD.PAYMENTMETHODCODE = 10 then
dbo.UFN_OTHERPAYMENTMETHODCODE_GETDESCRIPTION(OTHERPAYMENTMETHODCODEID)
else
REVENUEPAYMENTMETHOD.PAYMENTMETHOD
+ coalesce(', ' + dbo.UFN_CREDITTYPECODE_GETDESCRIPTION(CREDITCARDPAYMENTMETHODDETAIL.CREDITTYPECODEID) + ' #' + CREDITCARDPAYMENTMETHODDETAIL.CREDITCARDPARTIALNUMBER, '')
+ coalesce(' #' + CHECKPAYMENTMETHODDETAIL.CHECKNUMBER, '')
end DISPLAYDESCRIPTION,
'' DISPLAYSOURCE,
case
when REVENUE_EXT.BATCHNUMBER <> '' then REVENUE_EXT.BATCHNUMBER
else convert(nvarchar(50), FINANCIALTRANSACTION.SEQUENCEGENERATORID)
end SOURCENUMBER,
case
when REVENUE_EXT.BATCHNUMBER <> '' then 1
else 2
end SOURCETYPE, -- Payment (vs. Batch or Order)
0 REFUNDAMOUNT,
@TOTAL AMOUNTPAID,
REVENUEPAYMENTMETHOD.PAYMENTMETHODCODE PAYMENTTYPECODE,
FINANCIALTRANSACTION.ID REVENUEID,
null REVENUESPLITID,
CREDITCARDPAYMENTMETHODDETAIL.TRANSACTIONID,
cast(FINANCIALTRANSACTION.[DATE] as datetime) PAYMENTDATE
from dbo.MEMBERSHIPTRANSACTION
inner join dbo.FINANCIALTRANSACTIONLINEITEM on MEMBERSHIPTRANSACTION.REVENUESPLITID = FINANCIALTRANSACTIONLINEITEM.ID
inner join dbo.FINANCIALTRANSACTION on FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = FINANCIALTRANSACTION.ID
inner join dbo.REVENUE_EXT on FINANCIALTRANSACTION.ID = REVENUE_EXT.ID
inner join dbo.REVENUEPAYMENTMETHOD on FINANCIALTRANSACTION.ID = REVENUEPAYMENTMETHOD.REVENUEID
left join dbo.CREDITCARDPAYMENTMETHODDETAIL on CREDITCARDPAYMENTMETHODDETAIL.ID = REVENUEPAYMENTMETHOD.ID
left join dbo.OTHERPAYMENTMETHODDETAIL on OTHERPAYMENTMETHODDETAIL.ID = REVENUEPAYMENTMETHOD.ID
left join dbo.CHECKPAYMENTMETHODDETAIL on CHECKPAYMENTMETHODDETAIL.ID = REVENUEPAYMENTMETHOD.ID
where MEMBERSHIPTRANSACTION.ID = @MEMBERSHIPTRANSACTIONID;
end
set @PAYMENTS = (
select * from @PAYMENTSTABLE
for xml raw ('ITEM'), type, root('PAYMENTS'), binary base64
);
select @TIMESTAMP = TSLONG
from dbo.MEMBERSHIPTRANSACTION
where ID = @TRANSACTIONID;
select
@CONSTITUENTID = MEMBER.CONSTITUENTID,
@CONSTITUENTNAME = dbo.UFN_CONSTITUENT_BUILDNAME(MEMBER.CONSTITUENTID)
from dbo.MEMBERSHIP
inner join dbo.MEMBER on MEMBERSHIP.ID = MEMBER.MEMBERSHIPID
where MEMBERSHIP.ID = @ID
and MEMBER.ISPRIMARY = 1;
set @DATALOADED = 1;
return 0;
end