USP_ORDERPAYMENT_ADD
Adds a payment to a sale order.
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@ID | uniqueidentifier | INOUT | |
@SALESORDERID | uniqueidentifier | IN | |
@CHANGEAGENTID | uniqueidentifier | IN | |
@AMOUNT | money | IN | |
@PAYMENTMETHODCODE | tinyint | IN | |
@CHECKDATE | UDT_FUZZYDATE | IN | |
@CHECKNUMBER | nvarchar(20) | IN | |
@CARDHOLDERNAME | nvarchar(255) | IN | |
@CREDITCARDNUMBER | nvarchar(4) | IN | |
@CREDITTYPECODEID | uniqueidentifier | IN | |
@AUTHORIZATIONCODE | nvarchar(20) | IN | |
@EXPIRESON | UDT_FUZZYDATE | IN | |
@OTHERPAYMENTMETHODCODEID | uniqueidentifier | IN | |
@CURRENTAPPUSERID | uniqueidentifier | IN | |
@ALLOWOVERPAY | bit | IN | |
@DONOTRECONCILE | bit | IN | |
@VENDORID | nvarchar(50) | IN | |
@BBPSTRANSACTIONID | uniqueidentifier | IN |
Definition
Copy
CREATE procedure dbo.USP_ORDERPAYMENT_ADD
(
@ID uniqueidentifier = null output,
@SALESORDERID uniqueidentifier,
@CHANGEAGENTID uniqueidentifier = null,
@AMOUNT money = 0,
@PAYMENTMETHODCODE tinyint = 2,
@CHECKDATE dbo.UDT_FUZZYDATE = '00000000',
@CHECKNUMBER nvarchar(20) = '',
@CARDHOLDERNAME nvarchar(255) = '',
@CREDITCARDNUMBER nvarchar(4) = '',
@CREDITTYPECODEID uniqueidentifier = null,
@AUTHORIZATIONCODE nvarchar(20) = '',
@EXPIRESON dbo.UDT_FUZZYDATE = '00000000',
@OTHERPAYMENTMETHODCODEID uniqueidentifier = null,
@CURRENTAPPUSERID uniqueidentifier = null,
@ALLOWOVERPAY bit = 0,
@DONOTRECONCILE bit = 0,
@VENDORID nvarchar(50) = '',
@BBPSTRANSACTIONID uniqueidentifier = null
)
as
set nocount on;
if @ID is null
set @ID = newid();
if @CHANGEAGENTID is null
exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output;
declare @CURRENTDATE datetime
set @CURRENTDATE = getdate();
declare @CURRENTDATETIMEOFFSET datetimeoffset;
set @CURRENTDATETIMEOFFSET = dbo.UFN_TIMEZONEENTRY_GETSYSTEMDEFAULTDATEWITHTIMEOFFSET(getutcdate(), 1);
if @BBPSTRANSACTIONID = '00000000-0000-0000-0000-000000000000'
set @BBPSTRANSACTIONID = null
declare @ORDERSTATUS tinyint;
declare @CONSTITUENTID uniqueidentifier;
declare @ORDERBALANCE money;
declare @SALESMETHODTYPECODE tinyint;
declare @TRANSACTIONDATE datetime;
declare @REVENUEID uniqueidentifier;
declare @PRICINGCODE tinyint;
declare @CURRENTTRANSACTIONDATE datetime;
declare @ALLOWGLDISTRIBUTIONS bit;
declare @PDACCOUNTSYSTEMID uniqueidentifier;
declare @BASECURRENCYID uniqueidentifier;
declare @REFERENCE nvarchar(255);
select
@PDACCOUNTSYSTEMID = PD.ID,
@ALLOWGLDISTRIBUTIONS = PD.ALLOWGLDISTRIBUTIONS,
@BASECURRENCYID = CS.BASECURRENCYID
from
dbo.UFN_PDACCOUNTSYSTEM_DEFAULTORSYSTEM() as PD
left outer join
dbo.CURRENCYSET CS on PD.CURRENCYSETID = CS.ID;
select
@ORDERSTATUS = STATUSCODE,
@CONSTITUENTID = CONSTITUENTID,
@ORDERBALANCE = dbo.UFN_SALESORDER_GETAMOUNTDUE(@SALESORDERID),
@SALESMETHODTYPECODE = SALESMETHODTYPECODE,
@CURRENTTRANSACTIONDATE = TRANSACTIONDATE,
@REVENUEID = REVENUEID,
@REFERENCE = 'Payment-Order-' + convert(nvarchar(50),SALESORDER.SEQUENCEID)
from
dbo.SALESORDER with (nolock)
where
ID = @SALESORDERID;
--- Sponsorship recurring gift payments should use the channel code defined in the web transactions configurations (WI#154664)
declare @CHANNELCODEID uniqueidentifier = null;
if exists
(
select
*
from
dbo.SALESORDERITEMSPONSORSHIP
inner join
dbo.SALESORDERITEM on SALESORDERITEM.ID = SALESORDERITEMSPONSORSHIP.ID
where
SALESORDERITEM.SALESORDERID = @SALESORDERID
)
begin
select top 1 @CHANNELCODEID = CHANNELCODEID from dbo.NETCOMMUNITYDEFAULTCODEMAP
end
set @AMOUNT = isnull(round(@AMOUNT, 2), 0);
begin try
--Is this payment already in the database?
if @BBPSTRANSACTIONID is not null begin
if exists(select 1 from dbo.CREDITCARDPAYMENTMETHODDETAIL where TRANSACTIONID = @BBPSTRANSACTIONID) begin
raiserror('BBERR_ORDERPAYMENT_DUPLICATEBBPSTRANSACTIONID.', 13, 1);
end
end
if @SALESMETHODTYPECODE = 3 begin -- Group Sales
select @PRICINGCODE = PRICINGCODE from dbo.RESERVATION where ID = @SALESORDERID;
if @CONSTITUENTID is null
raiserror('BBERR_CONSTITUENTREQUIRED.', 13, 1);
if @PRICINGCODE = 1 and dbo.UFN_RESERVATIONRATESCALE_ISAPPLIED(@SALESORDERID) = 0 -- Flat rate
raiserror('BBERR_RESERVATIONNOTAPPLIED', 13, 1);
-- Raise an error if the reservation is checked in, the payment method is cash, and you're trying to overpay
if @PAYMENTMETHODCODE = 0 and @ORDERSTATUS = 1 and @AMOUNT > @ORDERBALANCE
raiserror('BBERR_ORDERPAYMENTADD_COMPLETEDRESERVATIONCASHOVERPAYMENT', 13, 1);
end
else if @ALLOWOVERPAY = 0 begin
-- don't allow overpay unless cash
if @AMOUNT > @ORDERBALANCE and @PAYMENTMETHODCODE <> 0
raiserror('BBERR_OVERPAY.', 13, 1);
end
if @SALESMETHODTYPECODE in (0,1) begin
--See if a membership on the order is invalid
declare @MEMBERSHIPERRORCODE tinyint = dbo.UFN_SALESORDER_EXISTSINVALIDMEMBERSHIP_CODE(@SALESORDERID)
--Code 1: No primary member. Doesn't matter here... This won't affect pricing
if @MEMBERSHIPERRORCODE = 2
raiserror('BBERR_MEMBERSHIPWITHINACTIVELEVEL', 13, 1);
else if @MEMBERSHIPERRORCODE = 3
raiserror('BBERR_MEMBERSHIPWITHINACTIVETERM', 13, 1);
else if @MEMBERSHIPERRORCODE = 4
raiserror('BBERR_MEMBERSHIP_INACTIVELEVELANDTERM', 13, 1);
end
if @AMOUNT <= 0
raiserror('BBERR_AMOUNTREQUIRED.', 13, 1);
--The date for all payments needs to be the current date
set @TRANSACTIONDATE = @CURRENTDATETIMEOFFSET;
--but we only want to update the sales order date if it doesn't already
--have a transaction date
if @CURRENTTRANSACTIONDATE is null begin
update dbo.SALESORDER set
TRANSACTIONDATE = @TRANSACTIONDATE,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
where
ID = @SALESORDERID;
end
--temporarily removing time stamp when storing the payment revenue record for consistency
--reference WI 88752
set @TRANSACTIONDATE = cast(@TRANSACTIONDATE as date);
declare @SALESORDERPAYMENTID uniqueidentifier = null;
select top 1
@SALESORDERPAYMENTID = [SALESORDERPAYMENT].[ID]
from
dbo.[SALESORDERPAYMENT]
inner join
dbo.[REVENUEPAYMENTMETHOD] on [REVENUEPAYMENTMETHOD].[REVENUEID] = [SALESORDERPAYMENT].[PAYMENTID]
where
[SALESORDERPAYMENT].[SALESORDERID] = @SALESORDERID and
[REVENUEPAYMENTMETHOD].[PAYMENTMETHODCODE] = 0 --Cash
-- if we already have a cash payment, just update it
-- SALESMETHODTYPECODE = 3 is group sales
if @PAYMENTMETHODCODE = 0 and @SALESORDERPAYMENTID is not null and @SALESMETHODTYPECODE <> 3 begin
exec dbo.USP_ORDERPAYMENT_UPDATECASHPAYMENTS @SALESORDERID, @CHANGEAGENTID, @AMOUNT, @CURRENTDATE, @CURRENTDATETIMEOFFSET
end
else begin
declare @CHANGEDUE money;
declare @AMOUNTTENDERED money;
set @AMOUNTTENDERED = @AMOUNT;
set @CHANGEDUE = 0;
-- Cash
-- SALESMETHODTYPECODE of 3 is group sales
-- ORDERSTATUS of 1 is complete
if @PAYMENTMETHODCODE = 0 and (@SALESMETHODTYPECODE <> 3 or @ORDERSTATUS = 1) begin
if @AMOUNT > @ORDERBALANCE begin
set @CHANGEDUE = @AMOUNT - @ORDERBALANCE;
set @AMOUNT = @ORDERBALANCE;
end
end
--insert a new payment
insert into dbo.FINANCIALTRANSACTION (
ID,
CONSTITUENTID,
TYPECODE,
TRANSACTIONAMOUNT,
BASEAMOUNT,
ORGAMOUNT,
DATE,
TRANSACTIONCURRENCYID,
BASEEXCHANGERATEID,
ORGEXCHANGERATEID,
PDACCOUNTSYSTEMID,
POSTDATE,
POSTSTATUSCODE,
USERDEFINEDID,
-- Boilerplate
ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
values
(
@ID,
@CONSTITUENTID,
0, --Payment
@AMOUNT,
@AMOUNT,
@AMOUNT,
@TRANSACTIONDATE,
@BASECURRENCYID,
null,
null,
@PDACCOUNTSYSTEMID,
case
when @ALLOWGLDISTRIBUTIONS = 1
then
@TRANSACTIONDATE
else
null
end,
case
when @ALLOWGLDISTRIBUTIONS = 1 then
1 -- Not Posted
else
3 -- Do Not Post
end,
'',
@CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
);
insert into dbo.REVENUE_EXT
(
ID,
BATCHNUMBER,
DONOTRECEIPT,
RECEIPTAMOUNT,
SOURCECODE,
FINDERNUMBER,
APPEALID,
MAILINGID,
CHANNELCODEID,
GIVENANONYMOUSLY,
DONOTACKNOWLEDGE,
BENEFITSWAIVED,
RECEIPTTYPECODE,
NEEDSRERECEIPT,
ELIGIBLEFORMATCHINGGIFTCLAIM,
ISREIMBURSABLE,
REFERENCE,
NONPOSTABLEBASECURRENCYID,
-- Boilerplate
ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
)
values
(
@ID,
'',
0,
0,
'',
0,
null,
null,
@CHANNELCODEID,
0,
0,
0,
0,
0,
0,
0,
isnull(@REFERENCE, ''),
null,
@CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
);
--Add BBIS origin information if it exists
declare @SPONSORSHIPTRANDATA xml;
select @SPONSORSHIPTRANDATA = DATA from dbo.SALESORDERITEM where SALESORDERID = @SALESORDERID and TYPECODE = 12 -- Sponsorship sales order item type
if @SPONSORSHIPTRANDATA is not null begin
declare @BBNCPAGENAME nvarchar(100);
declare @BBNCPAGEID int;
with xmlnamespaces('urn:blackbaud.RE7.XDATA' as bb)
select @BBNCPAGENAME = T.c.value('bb:PageName[1]','nvarchar(100)'),
@BBNCPAGEID = T.c.value('bb:PageID[1]','int')
from @SPONSORSHIPTRANDATA.nodes('/SponsorshipTransactionData/OriginInformation') T(c)
if isnull(@BBNCPAGENAME,'') <> '' and isnull(@BBNCPAGEID,0) <> 0 begin
insert into dbo.REVENUEBBNC (
ID,
NETCOMMUNITYPAGENAME,
NETCOMMUNITYPAGEID,
ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
)
values (
@ID,
@BBNCPAGENAME,
@BBNCPAGEID,
@CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
);
end
end
--Add origination source
exec dbo.USP_REVENUE_ADDORIGIN @ID, @CONSTITUENTID, @CHANGEAGENTID, @CURRENTDATE;
if not exists (select * from dbo.PAYMENTORIGINALAMOUNT where ID = @ID) begin
insert into dbo.PAYMENTORIGINALAMOUNT
(
ID,
TRANSACTIONAMOUNT,
ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
)
values
(
@ID,
@AMOUNT,
@CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
)
end
-- link the payment to the sales order
insert into dbo.SALESORDERPAYMENT with (rowlock)
(
ID,
SALESORDERID,
PAYMENTID,
AMOUNTTENDERED,
AMOUNT,
CHANGEDUE,
PAYMENTDATEWITHTIMEOFFSET,
APPUSERID,
DONOTRECONCILE,
ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
)
values
(
newid(),
@SALESORDERID,
@ID,
@AMOUNTTENDERED,
@AMOUNT,
@CHANGEDUE,
@CURRENTDATETIMEOFFSET,
@CURRENTAPPUSERID,
@DONOTRECONCILE,
@CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
);
--add payment method details
declare @REVENUEPAYMETHODID uniqueidentifier
set @REVENUEPAYMETHODID = newid();
insert into dbo.REVENUEPAYMENTMETHOD
(
ID,
REVENUEID,
PAYMENTMETHODCODE,
ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
)
values
(
@REVENUEPAYMETHODID,
@ID,
@PAYMENTMETHODCODE,
@CHANGEAGENTID,
@CHANGEAGENTID,
@CURRENTDATE,
@CURRENTDATE
);
-- update the payment information for each revenue record in the transaction
exec dbo.USP_REVENUE_UPDATEPAYMENTDETAILS @REVENUEPAYMETHODID, @PAYMENTMETHODCODE, @CHECKDATE, @CHECKNUMBER,
null, '00000000', '', @CARDHOLDERNAME, @CREDITCARDNUMBER, @CREDITTYPECODEID,
@AUTHORIZATIONCODE, @EXPIRESON, null, null, null, null, null, null, null, null, null, null, null,
@CHANGEAGENTID,@CURRENTDATE, 0, @OTHERPAYMENTMETHODCODEID,@ORIGINALPAYMENTMETHODCODE=@PAYMENTMETHODCODE,
@VENDORID=@VENDORID,@BBPSTRANSACTIONID=@BBPSTRANSACTIONID;
end --if @PAYMENTMETHODCODE = 0 (which is cash)
if @ORDERSTATUS = 1 begin -- Completed Order
--order is complete, so create payment splits
exec dbo.USP_SALESORDER_ADDPAYMENTREVENUE @SALESORDERID, @REVENUEID, @CHANGEAGENTID, @CURRENTDATE, @ID
end
if @SALESMETHODTYPECODE = 3 begin -- Group Sales
--group sales reservation, progress status
exec dbo.USP_RESERVATION_UPDATESTATUSANDHISTORY @SALESORDERID, @CHANGEAGENTID
if @ORDERSTATUS <> 1 begin -- Not Complete
--create the application for the deposit
declare @SPLITID uniqueidentifier;
set @SPLITID = newid();
insert into dbo.FINANCIALTRANSACTIONLINEITEM (
ID,
FINANCIALTRANSACTIONID,
TYPECODE,
BASEAMOUNT,
TRANSACTIONAMOUNT,
ORGAMOUNT,
POSTDATE,
POSTSTATUSCODE,
SOURCELINEITEMID,
ADDEDBYID,
CHANGEDBYID,
DATEADDED,
DATECHANGED
)
values (
@SPLITID,
@ID,
0, -- Standard
@AMOUNT,
@AMOUNT,
@AMOUNT,
case
when @ALLOWGLDISTRIBUTIONS = 1 then @TRANSACTIONDATE
else null
end,
case
when @ALLOWGLDISTRIBUTIONS = 1 then 1 -- Not Posted
else 3 -- Do Not Post
end,
null,
@CHANGEAGENTID,
@CHANGEAGENTID,
@CURRENTDATE,
@CURRENTDATE
);
insert into dbo.REVENUESPLIT_EXT (
ID,
APPLICATIONCODE,
TYPECODE,
DESIGNATIONID,
ADDEDBYID,
CHANGEDBYID,
DATEADDED,
DATECHANGED
)
values (
@SPLITID,
10, -- Order
19, -- Unearned revenue
null,
@CHANGEAGENTID,
@CHANGEAGENTID,
@CURRENTDATE,
@CURRENTDATE
);
--gl distributions
if @ALLOWGLDISTRIBUTIONS = 1
exec dbo.USP_SAVE_REVENUEGLDISTRIBUTION @ID, @CHANGEAGENTID, @CURRENTDATE
end
end
end try
begin catch
exec dbo.USP_RAISE_ERROR
return 1
end catch
return 0;