USP_MEMBERSHIP_ADDFROMSALES
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@REVENUEID | uniqueidentifier | IN | |
@CONSTITUENTID | uniqueidentifier | IN | |
@MEMBERSHIPID | uniqueidentifier | INOUT | |
@AMOUNT | money | IN | |
@TRANSACTIONDATE | datetime | IN | |
@MEMBERSHIPS | xml | IN | |
@CREATIONDATE | datetime | IN | |
@CHANGEAGENTID | uniqueidentifier | IN | |
@MEMBERSHIPTRANSACTIONID | uniqueidentifier | INOUT | |
@BASEAMOUNT | money | IN | |
@ORGANIZATIONAMOUNT | money | IN |
Definition
Copy
CREATE procedure dbo.USP_MEMBERSHIP_ADDFROMSALES
(
@REVENUEID uniqueidentifier,
@CONSTITUENTID uniqueidentifier,
@MEMBERSHIPID uniqueidentifier output,
@AMOUNT money,
@TRANSACTIONDATE datetime,
@MEMBERSHIPS xml,
@CREATIONDATE datetime,
@CHANGEAGENTID uniqueidentifier,
@MEMBERSHIPTRANSACTIONID uniqueidentifier = null output,
@BASEAMOUNT money = null,
@ORGANIZATIONAMOUNT money = null
)
as
begin
set nocount on;
declare @MEMBERSHIPSPLITID uniqueidentifier;
declare @MEMBERSHIPPROGRAMID uniqueidentifier;
declare @MEMBERSHIPLEVELID uniqueidentifier;
declare @MEMBERSHIPLEVELTERMID uniqueidentifier;
declare @MEMBERSHIPLEVELTYPECODEID uniqueidentifier;
declare @NUMBEROFCHILDREN tinyint;
declare @COMMENTS nvarchar(1000);
declare @ISGIFT bit;
declare @SENDRENEWALCODE tinyint;
declare @EXPIRATIONDATE datetime;
declare @MEMBERS xml;
declare @GIVENBYID uniqueidentifier;
declare @MEMBERSHIPCARDS xml;
declare @ADDONS xml;
declare @ERRORMSG nvarchar(52)
declare @TRANSACTIONCURRENCYID uniqueidentifier;
declare @BASECURRENCYID uniqueidentifier;
declare @BASEEXCHANGERATEID uniqueidentifier;
declare @ORGANIZATIONCURRENCYID uniqueidentifier;
declare @ORGANIZATIONEXCHANGERATEID uniqueidentifier;
declare @BASETOORGANIZATIONEXCHANGERATEID uniqueidentifier;
declare @MEMBERSHIPREVENUECONTRIBUTEDTRANSACTIONAMOUNT money = 0
declare @MEMBERSHIPREVENUECONTRIBUTEDBASEAMOUNT money = 0
declare @MEMBERSHIPREVENUECONTRIBUTEDORGANIZATIONAMOUNT money = 0
declare @TAXDEDUCTIBLEAMOUNT money = 0
declare @POSTSTATUSCODE tinyint;
declare @POSTDATE date;
-- The REVENUESPLIT view pulls these values from the parent financial transaction
-- record so we will do the same to be consistent with the old code.
select
@POSTSTATUSCODE = POSTSTATUSCODE,
@POSTDATE = POSTDATE
from
dbo.FINANCIALTRANSACTION
where
ID = @REVENUEID;
if @CHANGEAGENTID is null
exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output
declare @CURRENTDATE datetime
set @CURRENTDATE = getdate()
begin try
select
@MEMBERSHIPPROGRAMID = T.c.value('(MEMBERSHIPPROGRAMID)[1]','uniqueidentifier'),
@MEMBERSHIPLEVELID = T.c.value('(MEMBERSHIPLEVELID)[1]','uniqueidentifier'),
@MEMBERSHIPLEVELTERMID = T.c.value('(MEMBERSHIPLEVELTERMID)[1]','uniqueidentifier'),
@MEMBERSHIPLEVELTYPECODEID = T.c.value('(MEMBERSHIPLEVELTYPECODEID)[1]','uniqueidentifier'),
@EXPIRATIONDATE = T.c.value('(EXPIRATIONDATE)[1]','datetime'),
@NUMBEROFCHILDREN = T.c.value('(NUMBEROFCHILDREN)[1]','tinyint'),
@COMMENTS = T.c.value('(COMMENTS)[1]','nvarchar(1000)'),
@ISGIFT = T.c.value('(ISGIFT)[1]','bit'),
@SENDRENEWALCODE = T.c.value('(SENDRENEWALCODE)[1]','tinyint'),
@GIVENBYID = T.c.value('(GIVENBYID)[1]','uniqueidentifier'),
@MEMBERS = T.c.query('./MEMBERS'),
@MEMBERSHIPCARDS = T.c.query('./MEMBERSHIPCARDS'),
@ADDONS = T.c.query('./ADDONS')
from @MEMBERSHIPS.nodes('/MEMBERSHIPFIELDS/ITEM') T(c)
declare @MEMBERSALLOWED int;
declare @MEMBERSHIPCARESALLOWED int;
declare @CHILDRENALLOWED int;
select
@CHILDRENALLOWED = ML.CHILDRENALLOWED,
@MEMBERSALLOWED = ML.MEMBERSALLOWED,
@MEMBERSHIPCARESALLOWED = ML.CARDSALLOWED,
@TAXDEDUCTIBLEAMOUNT = case MP.DEDUCTIBILITYCODE
when 0 then @AMOUNT
when 1 then ML.RECEIPTAMOUNT
else 0
end
from dbo.MEMBERSHIPLEVEL ML
inner join dbo.MEMBERSHIPPROGRAM MP on ML.MEMBERSHIPPROGRAMID = MP.ID
where ML.ID = @MEMBERSHIPLEVELID
if @TAXDEDUCTIBLEAMOUNT > @AMOUNT
begin
declare @FULLAMOUNT money
select @FULLAMOUNT = AMOUNT
from dbo.MEMBERSHIPLEVELTERM
where ID = @MEMBERSHIPLEVELTERMID
if @FULLAMOUNT = 0
set @TAXDEDUCTIBLEAMOUNT = 0
else
set @TAXDEDUCTIBLEAMOUNT = @AMOUNT * (@TAXDEDUCTIBLEAMOUNT / @FULLAMOUNT)
end
set @MEMBERSALLOWED += (
select sum(T.addons.value('(QUANTITY)[1]','int')) from @ADDONS.nodes('/ADDONS/ITEM') T(addons) where T.addons.value('(ADDONTYPECODE)[1]','tinyint') = 1
)
-- Validate membership fields
-- Expiration date
if @EXPIRATIONDATE < @TRANSACTIONDATE
raiserror('The expiration date must be after the transaction date.', 13, 1);
if exists (select * from dbo.MEMBERSHIPTRANSACTION
where MEMBERSHIPID = @MEMBERSHIPID and
TRANSACTIONDATE > @TRANSACTIONDATE)
raiserror('Transaction date cannot be earlier than the last transaction of the membership.', 13, 1);
-- Primary member
if not exists ( select 1 from @MEMBERS.nodes('/MEMBERS/ITEM') T(members) where T.members.value('(ISPRIMARY)[1]','bit') = 1)
raiserror('Please select one member as a primary member.', 13, 1);
-- Number of members
set @ERRORMSG = 'Only ' +convert(nvarchar(6), @MEMBERSALLOWED)+ ' members are allowed for this membership.'
if @MEMBERS is null
raiserror('Please enter at least one member.', 13, 1);
if @MEMBERSALLOWED < (select count(T.members.value('(MEMBERID)[1]','uniqueidentifier')) from @MEMBERS.nodes('/MEMBERS/ITEM') T(members))
raiserror(@ERRORMSG, 13, 1);
-- Number of children
set @ERRORMSG = 'The number of children may not be larger than '+convert(nvarchar(6), @CHILDRENALLOWED)+ '.'
if @CHILDRENALLOWED < @NUMBEROFCHILDREN
raiserror(@ERRORMSG, 13, 1);
-- Number of membership cards
set @ERRORMSG = 'This membership level only allows up to '+convert(nvarchar(6), @MEMBERSHIPCARESALLOWED) + ' card(s).'
if @MEMBERSHIPCARESALLOWED < (select count(T.cards.value('(MEMBERSHIPCARDID)[1]','uniqueidentifier')) from @MEMBERSHIPCARDS.nodes('/MEMBERSHIPCARDS/ITEM') T(cards))
raiserror(@ERRORMSG, 13, 1);
-- Constituent
if exists(
select count(CONSTITUENTID)
from (
select T.members.value('(CONSTITUENTID)[1]','uniqueidentifier') as 'CONSTITUENTID'
from @MEMBERS.nodes('/MEMBERS/ITEM') T(members)
) MEMBERS
group by CONSTITUENTID
having count(*) > 1
)
raiserror('Please do not add a constituent more than once to the membership.', 13, 1);
-- Get multicurrency values from the revenue.
select
@TRANSACTIONCURRENCYID = TRANSACTIONCURRENCYID,
@BASECURRENCYID = BASECURRENCYID,
@BASEEXCHANGERATEID = BASEEXCHANGERATEID,
@ORGANIZATIONEXCHANGERATEID = ORGANIZATIONEXCHANGERATEID
from dbo.REVENUE
where ID = @REVENUEID;
-- Convert the applied amount into base and organization amounts if it is not provided by the caller
if @BASEAMOUNT is null or @ORGANIZATIONAMOUNT is null
exec dbo.USP_CURRENCY_GETCURRENCYVALUES @AMOUNT, @TRANSACTIONDATE, @BASECURRENCYID, @BASEEXCHANGERATEID output, @TRANSACTIONCURRENCYID output, @BASEAMOUNT output, @ORGANIZATIONCURRENCYID output, @ORGANIZATIONAMOUNT output, @ORGANIZATIONEXCHANGERATEID output, 1, @BASETOORGANIZATIONEXCHANGERATEID;
declare @MEMBERSHIPREVENUESPLITTABLE table (
ID uniqueidentifier,
APPLICATIONCODE tinyint,
TYPECODE tinyint,
DESIGNATIONID uniqueidentifier,
AMOUNT money,
DECLINESGIFTAID bit,
TRANSACTIONCURRENCYID uniqueidentifier,
ADDONID uniqueidentifier
)
insert into @MEMBERSHIPREVENUESPLITTABLE(
ID,
APPLICATIONCODE,
TYPECODE,
DESIGNATIONID,
AMOUNT,
DECLINESGIFTAID,
TRANSACTIONCURRENCYID
) select newid(),
0,
0,
CONTRIBUTEDAMOUNTS.DESIGNATIONID,
CONTRIBUTEDAMOUNTS.AMOUNT,
0,
@TRANSACTIONCURRENCYID
from dbo.UFN_MEMBERSHIP_GETCONTRIBUTEDAMOUNTSBYLEVELID(@MEMBERSHIPLEVELID, @TAXDEDUCTIBLEAMOUNT, 2) as CONTRIBUTEDAMOUNTS
insert into @MEMBERSHIPREVENUESPLITTABLE(
ID,
APPLICATIONCODE,
TYPECODE,
DESIGNATIONID,
AMOUNT,
DECLINESGIFTAID,
TRANSACTIONCURRENCYID,
ADDONID
) select T.addons.value('(SPLITID)[1]','uniqueidentifier'),
18,
18,
null,
T.addons.value('(PRICE)[1]','money') * T.addons.value('(QUANTITY)[1]','int'),
0,
@TRANSACTIONCURRENCYID,
T.addons.value('(ADDONID)[1]','uniqueidentifier')
from @ADDONS.nodes('/ADDONS/ITEM') T(addons)
select @MEMBERSHIPREVENUECONTRIBUTEDTRANSACTIONAMOUNT = sum(coalesce(AMOUNT, 0)),
@MEMBERSHIPREVENUECONTRIBUTEDBASEAMOUNT = sum(coalesce(case when @BASEEXCHANGERATEID is null then AMOUNT else dbo.UFN_CURRENCY_CONVERT(AMOUNT, @BASEEXCHANGERATEID) end, 0)),
@MEMBERSHIPREVENUECONTRIBUTEDORGANIZATIONAMOUNT = sum(coalesce(AMOUNT, 0))
from @MEMBERSHIPREVENUESPLITTABLE
where APPLICATIONCODE = 0
set @MEMBERSHIPSPLITID = newid()
insert into dbo.FINANCIALTRANSACTIONLINEITEM (
ID,
FINANCIALTRANSACTIONID,
BASEAMOUNT,
TRANSACTIONAMOUNT,
ORGAMOUNT,
TYPECODE,
POSTSTATUSCODE,
POSTDATE,
ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
) values (
@MEMBERSHIPSPLITID,
@REVENUEID,
@BASEAMOUNT - coalesce(@MEMBERSHIPREVENUECONTRIBUTEDBASEAMOUNT, 0),
@AMOUNT - coalesce(@MEMBERSHIPREVENUECONTRIBUTEDTRANSACTIONAMOUNT, 0),
@ORGANIZATIONAMOUNT - coalesce(@MEMBERSHIPREVENUECONTRIBUTEDORGANIZATIONAMOUNT, 0),
0,
@POSTSTATUSCODE,
@POSTDATE,
@CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
);
insert into dbo.REVENUESPLIT_EXT (
ID,
APPLICATIONCODE,
TYPECODE,
ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
) values (
@MEMBERSHIPSPLITID,
5,
2,
@CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
);
insert into dbo.FINANCIALTRANSACTIONLINEITEM (
ID,
FINANCIALTRANSACTIONID,
BASEAMOUNT,
TRANSACTIONAMOUNT,
ORGAMOUNT,
TYPECODE,
POSTSTATUSCODE,
POSTDATE,
SOURCELINEITEMID,
ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
)
select
ID,
@REVENUEID,
case when @BASEEXCHANGERATEID is null then AMOUNT else dbo.UFN_CURRENCY_CONVERT(AMOUNT, @BASEEXCHANGERATEID) end,
AMOUNT,
AMOUNT,
0,
@POSTSTATUSCODE,
@POSTDATE,
@MEMBERSHIPSPLITID,
@CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
from
@MEMBERSHIPREVENUESPLITTABLE
insert into dbo.REVENUESPLIT_EXT (
ID,
APPLICATIONCODE,
TYPECODE,
DESIGNATIONID,
ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
)
select
ID,
APPLICATIONCODE,
TYPECODE,
DESIGNATIONID,
@CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
from
@MEMBERSHIPREVENUESPLITTABLE
if exists(select 1 from @MEMBERSHIPREVENUESPLITTABLE where APPLICATIONCODE = 18)
begin
--Create recognitions for the addon splits
declare @MEMBERSHIPREVENUEADDONSPLITID uniqueidentifier
declare MEMBERSHIPREVENUEADDONCURSOR cursor local fast_forward for select ID from @MEMBERSHIPREVENUESPLITTABLE where APPLICATIONCODE = 18
open MEMBERSHIPREVENUEADDONCURSOR
fetch next from MEMBERSHIPREVENUEADDONCURSOR into @MEMBERSHIPREVENUEADDONSPLITID
while @@FETCH_STATUS = 0
begin
exec dbo.USP_REVENUEDETAIL_CREATERECOGNITIONS @MEMBERSHIPREVENUEADDONSPLITID, @CHANGEAGENTID, @CURRENTDATE;
fetch next from MEMBERSHIPREVENUEADDONCURSOR into @MEMBERSHIPREVENUEADDONSPLITID
end
close MEMBERSHIPREVENUEADDONCURSOR
deallocate MEMBERSHIPREVENUEADDONCURSOR
end
-- create recognitions for the membership part of the payment
exec dbo.USP_REVENUEDETAIL_CREATERECOGNITIONS @MEMBERSHIPSPLITID, @CHANGEAGENTID, @CURRENTDATE;
-- create recognitions for any contributed portion of the membership payment
insert into dbo.REVENUERECOGNITION
(
REVENUESPLITID,
CONSTITUENTID,
AMOUNT,
EFFECTIVEDATE,
REVENUERECOGNITIONTYPECODEID,
ADDEDBYID,
CHANGEDBYID,
DATEADDED,
DATECHANGED,
BASECURRENCYID,
ORGANIZATIONAMOUNT,
ORGANIZATIONEXCHANGERATEID
)
select
MEMBERSHIPSPLITS.ID,
@CONSTITUENTID,
MEMBERSHIPSPLITS.AMOUNT,
@TRANSACTIONDATE,
null,
@CHANGEAGENTID,
@CHANGEAGENTID,
@CURRENTDATE,
@CURRENTDATE,
@BASECURRENCYID,
case when @BASECURRENCYID <> @ORGANIZATIONCURRENCYID
then dbo.UFN_CURRENCY_CONVERT(MEMBERSHIPSPLITS.AMOUNT, @BASETOORGANIZATIONEXCHANGERATEID)
else MEMBERSHIPSPLITS.AMOUNT
end,
@BASETOORGANIZATIONEXCHANGERATEID ORGANIZATIONEXCHANGERATEID
from @MEMBERSHIPREVENUESPLITTABLE MEMBERSHIPSPLITS
where MEMBERSHIPSPLITS.APPLICATIONCODE = 0
exec dbo.USP_MEMBERSHIP_ADDMEMBERSHIPTRANSACTION
@MEMBERSHIPID output,
@CHANGEAGENTID,
@CONSTITUENTID,
@MEMBERSHIPPROGRAMID,
@MEMBERSHIPLEVELID,
@MEMBERSHIPLEVELTERMID,
@MEMBERSHIPLEVELTYPECODEID,
@TRANSACTIONDATE,
@EXPIRATIONDATE,
@NUMBEROFCHILDREN,
@COMMENTS,
@ISGIFT,
@GIVENBYID,
@SENDRENEWALCODE,
@MEMBERS,
@MEMBERSHIPCARDS,
@ADDONS,
@MEMBERSHIPSPLITID,
@MEMBERSHIPTRANSACTIONID output;
insert into dbo.MEMBERSHIPCONTRIBUTIONPORTION
(
ID,
FINANCIALTRANSACTIONLINEITEMID,
MEMBERSHIPPROGRAMID,
MEMBERSHIPTRANSACTIONID,
ADDEDBYID,
CHANGEDBYID,
DATEADDED,
DATECHANGED
)
select
newid(),
ID,
@MEMBERSHIPPROGRAMID,
@MEMBERSHIPTRANSACTIONID,
@CHANGEAGENTID,
@CHANGEAGENTID,
@CURRENTDATE,
@CURRENTDATE
from
@MEMBERSHIPREVENUESPLITTABLE
where APPLICATIONCODE = 0
end try
begin catch
exec dbo.USP_RAISE_ERROR
return 1
end catch
return 0;
end