USP_BATCHMEMBERSHIPROW_COMMIT
Adds a membership and associated transactions and members (used by membership batch).
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@ID | uniqueidentifier | INOUT | |
@MEMBERSHIPPROGRAMID | uniqueidentifier | IN | |
@COMMENTS | nvarchar(1000) | IN | |
@TRANSACTIONS | xml | IN | |
@MEMBERS | xml | IN | |
@CHANGEAGENTID | uniqueidentifier | IN | |
@STATUSCODE | int | IN | |
@SENDRENEWALCODE | int | IN |
Definition
Copy
CREATE procedure dbo.USP_BATCHMEMBERSHIPROW_COMMIT
(
@ID uniqueidentifier = null output,
@MEMBERSHIPPROGRAMID uniqueidentifier = null,
@COMMENTS nvarchar(1000) = null,
@TRANSACTIONS xml = null,
@MEMBERS xml = null,
@CHANGEAGENTID uniqueidentifier = null,
@STATUSCODE integer = 0,
@SENDRENEWALCODE integer = 1
)
as
begin
set nocount on;
if @ID is null
set @ID = newid();
if @CHANGEAGENTID is null
exec dbo.[USP_CHANGEAGENT_GETORCREATECHANGEAGENT] @CHANGEAGENTID output;
/* Extract the primary member */
declare @CONSTITUENTID uniqueidentifier;
select
@CONSTITUENTID = [MEMBERS].[ITEM].value('CONSTITUENTID[1]', 'uniqueidentifier')
from
@MEMBERS.nodes('/MEMBERS/ITEM') as [MEMBERS]([ITEM])
where
[MEMBERS].[ITEM].value('ISPRIMARY[1]', 'bit') = 1;
declare @MAXSEQUENCE integer;
declare @FINALTRANSACTIONEXPIRATIONDATE datetime;
declare @TRANSACTIONSTABLE table
(
[MEMBERSHIPLEVELID] uniqueidentifier,
[MEMBERSHIPLEVELTERMID] uniqueidentifier,
[MEMBERSHIPLEVELTYPECODEID] uniqueidentifier,
[NUMBEROFCHILDREN] integer,
[COMMENTS] nvarchar(1000),
[ISGIFT] bit,
[DONORID] uniqueidentifier,
[TRANSACTIONDATE] datetime,
[EXPIRATIONDATE] datetime,
[CANCELMEMBERSHIP] bit,
[SEQUENCE] integer
);
insert into @TRANSACTIONSTABLE
select
[TRANSACTION].[ITEM].value('MEMBERSHIPLEVELID[1]', 'uniqueidentifier'),
[TRANSACTION].[ITEM].value('MEMBERSHIPLEVELTERMID[1]', 'uniqueidentifier'),
[TRANSACTION].[ITEM].value('MEMBERSHIPLEVELTYPECODEID[1]', 'uniqueidentifier'),
[TRANSACTION].[ITEM].value('NUMBEROFCHILDREN[1]', 'integer'),
[TRANSACTION].[ITEM].value('COMMENTS[1]', 'nvarchar(1000)'),
[TRANSACTION].[ITEM].value('ISGIFT[1]', 'bit'),
[TRANSACTION].[ITEM].value('DONORID[1]', 'uniqueidentifier'),
[TRANSACTION].[ITEM].value('TRANSACTIONDATE[1]', 'datetime'),
[TRANSACTION].[ITEM].value('EXPIRATIONDATE[1]', 'datetime'),
[TRANSACTION].[ITEM].value('CANCELMEMBERSHIP[1]', 'bit'),
[TRANSACTION].[ITEM].value('SEQUENCE[1]', 'integer')
from
@TRANSACTIONS.nodes('/TRANSACTIONS/ITEM') as [TRANSACTION](ITEM)
select @MAXSEQUENCE = max(SEQUENCE) from @TRANSACTIONSTABLE;
-- Get the expiration date from the last transaction to use on membership cards
select
@FINALTRANSACTIONEXPIRATIONDATE = EXPIRATIONDATE
from
@TRANSACTIONSTABLE
where
SEQUENCE = @MAXSEQUENCE;
/* Retool the members collection to contain a default membership card for each member: */
set @MEMBERS =
(
select
coalesce([MEMBERS].[ITEM].value('../ID[1]', 'uniqueidentifier'), newid()) as [ID],
[MEMBERS].[ITEM].value('../CONSTITUENTID[1]', 'uniqueidentifier') as [CONSTITUENTID],
[MEMBERS].[ITEM].value('../ISPRIMARY[1]', 'bit') as [ISPRIMARY],
(
select
newid() as [ID],
[CONSTITUENT].[NAME] as [NAMEONCARD],
@FINALTRANSACTIONEXPIRATIONDATE as [EXPIRATIONDATE]
from
dbo.[CONSTITUENT]
where
[CONSTITUENT].[ID] =
[MEMBERS].[ITEM].value('../CONSTITUENTID[1]', 'uniqueidentifier')
for xml raw('ITEM'), type, elements, root('MEMBERSHIPCARDS'), binary base64
)
from
@MEMBERS.nodes('/MEMBERS/ITEM/CONSTITUENTID') as [MEMBERS]([ITEM])
for xml raw('ITEM'), type, elements, root('MEMBERS'), binary base64
);
/* Since members are entered on the membership level and not on the transaction level, we must create a members
collection with just the primary member that will be used for every transaction except for the last one, which
must have <= the allowed number of members for the membership level associated with that transaction.
*/
declare @PRIMARYMEMBERXML xml =
(
select
[PRIMARYMEMBER].[ITEM].query('..')
from
@MEMBERS.nodes('/MEMBERS/ITEM/ID') as [PRIMARYMEMBER]([ITEM])
where
[PRIMARYMEMBER].[ITEM].value('../ISPRIMARY[1]', 'bit') = 1
for xml raw('MEMBERS'), type, elements, binary base64
);
declare @MEMBERSHIPLEVELID uniqueidentifier;
declare @MEMBERSHIPLEVELTERMID uniqueidentifier;
declare @MEMBERSHIPLEVELTYPECODEID uniqueidentifier;
declare @NUMBEROFCHILDREN integer;
declare @TRANSACTIONCOMMENTS nvarchar(1000);
declare @ISGIFT bit;
declare @DONORID uniqueidentifier;
declare @TRANSACTIONDATE datetime;
declare @EXPIRATIONDATE datetime;
declare @SEQUENCE integer;
declare @CURRENTMEMBERS xml = @PRIMARYMEMBERXML;
declare @CANCELMEMBERSHIP bit;
declare TRANSACTIONS_CURSOR cursor local fast_forward for
select
[TRANSACTIONSTABLE].[MEMBERSHIPLEVELID],
[TRANSACTIONSTABLE].[MEMBERSHIPLEVELTERMID],
[TRANSACTIONSTABLE].[MEMBERSHIPLEVELTYPECODEID],
[TRANSACTIONSTABLE].[NUMBEROFCHILDREN],
[TRANSACTIONSTABLE].[COMMENTS],
[TRANSACTIONSTABLE].[ISGIFT],
[TRANSACTIONSTABLE].[DONORID],
[TRANSACTIONSTABLE].[TRANSACTIONDATE],
[TRANSACTIONSTABLE].[EXPIRATIONDATE],
[TRANSACTIONSTABLE].[CANCELMEMBERSHIP],
[TRANSACTIONSTABLE].[SEQUENCE]
from
@TRANSACTIONSTABLE as [TRANSACTIONSTABLE]
order by
[TRANSACTIONSTABLE].[SEQUENCE]
open TRANSACTIONS_CURSOR;
fetch next from TRANSACTIONS_CURSOR into
@MEMBERSHIPLEVELID,
@MEMBERSHIPLEVELTERMID,
@MEMBERSHIPLEVELTYPECODEID,
@NUMBEROFCHILDREN,
@COMMENTS,
@ISGIFT,
@DONORID,
@TRANSACTIONDATE,
@EXPIRATIONDATE,
@CANCELMEMBERSHIP,
@SEQUENCE;
begin try
while @@fetch_status = 0
begin
if @SEQUENCE = @MAXSEQUENCE -- The last item in the cursor.
set @CURRENTMEMBERS = @MEMBERS;
if @CANCELMEMBERSHIP = 1
exec dbo.[USP_CONSTITUENTMEMBERSHIP_CANCEL] @ID, @CHANGEAGENTID;
else
exec dbo.[USP_MEMBERSHIP_ADD]
@ID,
@CHANGEAGENTID,
@CONSTITUENTID,
@MEMBERSHIPPROGRAMID,
@MEMBERSHIPLEVELID,
@MEMBERSHIPLEVELTERMID,
@MEMBERSHIPLEVELTYPECODEID,
@STATUSCODE,
@TRANSACTIONDATE,
@NUMBEROFCHILDREN,
@COMMENTS,
@ISGIFT,
@SENDRENEWALCODE,
@EXPIRATIONDATE,
@CURRENTMEMBERS,
@DONORID;
fetch next from TRANSACTIONS_CURSOR into
@MEMBERSHIPLEVELID,
@MEMBERSHIPLEVELTERMID,
@MEMBERSHIPLEVELTYPECODEID,
@NUMBEROFCHILDREN,
@COMMENTS,
@ISGIFT,
@DONORID,
@TRANSACTIONDATE,
@EXPIRATIONDATE,
@CANCELMEMBERSHIP,
@SEQUENCE;
end
end try
begin catch
exec dbo.[USP_RAISE_ERROR];
return 1;
end catch
close TRANSACTIONS_CURSOR;
deallocate TRANSACTIONS_CURSOR;
return 0;
end