UFN_CREDITPAYMENT_GETRECEIPTAMOUNT
Gets the receipt amount for a credit payment
Return
Return Type |
---|
money |
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@CREDITPAYMENTID | uniqueidentifier | IN |
Definition
Copy
CREATE function dbo.UFN_CREDITPAYMENT_GETRECEIPTAMOUNT
(
@CREDITPAYMENTID uniqueidentifier
)
returns money
as begin
declare @RECEIPTAMOUNT money;
declare @CREDITID uniqueidentifier;
declare @CREDITPAYMENTAMOUNT money;
select
@CREDITID = [CREDITID],
@CREDITPAYMENTAMOUNT = AMOUNT
from dbo.[CREDITPAYMENT]
where [ID] = @CREDITPAYMENTID;
declare @NUMBEROFITEMS int =
(select count(*) from dbo.FINANCIALTRANSACTIONLINEITEM where FINANCIALTRANSACTIONID = @CREDITID);
declare @NUMBEROFREGISTRATIONREFUNDS int = (
select count(*)
from dbo.FINANCIALTRANSACTIONLINEITEM as LI
inner join dbo.CREDITITEM_EXT as EXT on EXT.ID = LI.ID
where LI.FINANCIALTRANSACTIONID = @CREDITID and EXT.TYPECODE = 6 -- Event Registration
);
--If there's only 1 event registration on the refund (for both event reg-type or order-type refunds)
declare @EVENTREFUND bit =
case
when @NUMBEROFREGISTRATIONREFUNDS = @NUMBEROFITEMS then 1
else 0
end;
--If there's only 1 membership on the refund (for both membership-type or order-type refunds)
declare @MEMBERSHIPREFUND bit =
case
when (
select count(*)
from dbo.FINANCIALTRANSACTIONLINEITEM as LI
inner join dbo.CREDITITEM_EXT as EXT on EXT.ID = LI.ID
where LI.FINANCIALTRANSACTIONID = @CREDITID and EXT.TYPECODE = 1 -- Membership
) = @NUMBEROFITEMS and @NUMBEROFITEMS = 1 then 1
else 0
end;
declare @MEMBERSHIPREFUNDWITHORDERITEM bit = 0;
if @MEMBERSHIPREFUND = 1 begin
set @MEMBERSHIPREFUNDWITHORDERITEM = (
select count(*)
from dbo.FINANCIALTRANSACTIONLINEITEM as LI
inner join dbo.CREDITITEM_EXT as EXT on EXT.ID = LI.ID
where LI.FINANCIALTRANSACTIONID = @CREDITID and EXT.SALESORDERITEMID is not null
)
end
if @EVENTREFUND = 1 or (@MEMBERSHIPREFUND = 1 and @MEMBERSHIPREFUNDWITHORDERITEM = 0) begin
--We only want to use the receipt amount on the order if it's less than the credit payment amount.
--Credit payment amounts may be smaller than receipt amounts if there was a partial refund (membership only).
--Also, we always want to use the credit payment amount for memberships or event registrations that were
--on sales order because they could have been paid for with multiple payment methods.
select
@RECEIPTAMOUNT =
(case when (REVENUE_EXT.[RECEIPTAMOUNT] > [CREDITPAYMENT].[AMOUNT]) or [CREDITPAYMENT].[REVENUESPLITID] is null then
[CREDITPAYMENT].[AMOUNT]
else
isnull(REVENUE_EXT.[RECEIPTAMOUNT], 0)
end)
from
dbo.[CREDITPAYMENT]
left join
dbo.FINANCIALTRANSACTIONLINEITEM as REFUNDEDLI on [CREDITPAYMENT].[REVENUESPLITID] = REFUNDEDLI.[ID] and REFUNDEDLI.DELETEDON is null and REFUNDEDLI.TYPECODE <> 1 -- Reversal
inner join
dbo.REVENUE_EXT on REVENUE_EXT.ID in (CREDITPAYMENT.REVENUEID, REFUNDEDLI.FINANCIALTRANSACTIONID)
where [CREDITPAYMENT].[ID] = @CREDITPAYMENTID
end
else begin
--This code figures out the receipt amount of the entire refund that the payment is on
--so we can do this calculation at the very bottom:
--set @RECEIPTAMOUNT = (@CREDITPAYMENTAMOUNT * @RECEIPTAMOUNT / @TOTALCREDITPAYMENTS)
--Since there may have been multiple payment methods, we have to figure out
--what portion of the receipt amount this payment is responsible for
declare @RA table
(
RECEIPTAMOUNT money
)
insert into @RA ([RECEIPTAMOUNT])
select
case
when [SALESORDERITEM].[TYPECODE] = 1 then
[SALESORDERITEM].[TOTAL]
- (
select isnull(sum([AMOUNT]), 0)
from dbo.[SALESORDERITEMMEMBERSHIPITEMPROMOTION] as [PROMO]
where [PROMO].[SALESORDERITEMID] = [SALESORDERITEM].[ID]
)
- (
select isnull(sum([REVENUEBENEFIT].[TOTALVALUE]), 0) from dbo.[REVENUEBENEFIT]
inner join dbo.[MEMBERSHIPTRANSACTION] on [MEMBERSHIPTRANSACTION].[REVENUESPLITID] = [REVENUEBENEFIT].[REVENUESPLITID]
inner join dbo.[SALESORDERITEMMEMBERSHIP] on [SALESORDERITEMMEMBERSHIP].[MEMBERSHIPTRANSACTIONID] = [MEMBERSHIPTRANSACTION].[ID]
where [SALESORDERITEMMEMBERSHIP].[ID] = [SALESORDERITEM].[ID]
)
when [SALESORDERITEM].[TYPECODE] = 2 then [SALESORDERITEM].[TOTAL]
end
from dbo.FINANCIALTRANSACTIONLINEITEM as LI
inner join dbo.CREDITITEM_EXT as EXT on EXT.ID = LI.ID
inner join dbo.[SALESORDERITEM] on [SALESORDERITEM].[ID] = EXT.[SALESORDERITEMID]
where LI.FINANCIALTRANSACTIONID = @CREDITID and [SALESORDERITEM].[TYPECODE] in (1, 2) -- Membership, Donation
if @NUMBEROFREGISTRATIONREFUNDS > 0 begin
insert into @RA ([RECEIPTAMOUNT])
select
isnull(sum([EVENTREGISTRANTPAYMENT].[RECEIPTAMOUNT]), 0)
from
dbo.FINANCIALTRANSACTIONLINEITEM as LI
inner join
dbo.CREDITITEM_EXT as EXT on EXT.ID = LI.ID
inner join
dbo.[CREDITITEMEVENTREGISTRATION] on LI.[ID] = [CREDITITEMEVENTREGISTRATION].[ID]
inner join
dbo.[SALESORDERITEM] on EXT.[SALESORDERITEMID] = [SALESORDERITEM].[ID]
inner join
dbo.[SALESORDER] on [SALESORDER].[ID] = [SALESORDERITEM].[SALESORDERID]
inner join
dbo.FINANCIALTRANSACTIONLINEITEM as ORDERLI on ORDERLI.FINANCIALTRANSACTIONID = SALESORDER.REVENUEID
inner join
dbo.[EVENTREGISTRANTPAYMENT] on ([EVENTREGISTRANTPAYMENT].[PAYMENTID] = ORDERLI.[ID] and [EVENTREGISTRANTPAYMENT].[REGISTRANTID] = [CREDITITEMEVENTREGISTRATION].[REGISTRANTID])
where
LI.FINANCIALTRANSACTIONID = @CREDITID
and ORDERLI.DELETEDON is null
and ORDERLI.TYPECODE <> 1 -- Reversal
end
select @RECEIPTAMOUNT =
sum(
(case
when [RECEIPTAMOUNT] < 0 then 0
else [RECEIPTAMOUNT]
end)
)
from @RA
declare @TOTALCREDITPAYMENTS money = (select sum([AMOUNT]) from dbo.[CREDITPAYMENT] where [CREDITID] = @CREDITID)
set @RECEIPTAMOUNT = (@CREDITPAYMENTAMOUNT * @RECEIPTAMOUNT / @TOTALCREDITPAYMENTS)
end
return isnull(@RECEIPTAMOUNT, 0);
end