USP_DATAFORMTEMPLATE_ADD_SALESORDERITEMGENERIC_EVENTREGISTRATION_ONLINE
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@ID | uniqueidentifier | INOUT | |
@SALESORDERID | uniqueidentifier | IN | |
@TYPECODE | tinyint | IN | |
@DESCRIPTION | nvarchar(255) | IN | |
@QUANTITY | decimal(18, 0) | IN | |
@AMOUNT | money | IN | |
@DATA | xml | IN | |
@OPTIONS | xml | IN | |
@CALLBACKURL | nvarchar(255) | IN | |
@SYSTEMTYPENAME | nvarchar(255) | IN | |
@ASSEMBLYNAME | nvarchar(255) | IN | |
@ATTRIBUTES | xml | IN | |
@CATEGORYNAME | nvarchar(255) | IN | |
@CHANGEAGENTID | uniqueidentifier | IN | |
@ACKNOWLEDGEMENT | nvarchar(max) | IN | |
@EVENTID | uniqueidentifier | IN | |
@REGISTRANTMAPPINGS | xml | IN |
Definition
Copy
CREATE procedure dbo.USP_DATAFORMTEMPLATE_ADD_SALESORDERITEMGENERIC_EVENTREGISTRATION_ONLINE
(
@ID uniqueidentifier = null output,
@SALESORDERID uniqueidentifier,
@TYPECODE tinyint,
@DESCRIPTION nvarchar(255) = null,
@QUANTITY decimal = 1,
@AMOUNT money,
@DATA xml = null,
@OPTIONS xml = null,
@CALLBACKURL nvarchar(255) = null,
@SYSTEMTYPENAME nvarchar(255) = null,
@ASSEMBLYNAME nvarchar(255) = null,
@ATTRIBUTES xml = null,
@CATEGORYNAME nvarchar(255) = null,
@CHANGEAGENTID uniqueidentifier = null,
@ACKNOWLEDGEMENT nvarchar(max) = null,
@EVENTID uniqueidentifier = null,
@REGISTRANTMAPPINGS xml = 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()
begin try
declare @STARTDATE datetime = null;
declare @ENDDATE datetime = null;
declare @ENDTIME dbo.UDT_HOURMINUTE = null;
select
@STARTDATE = dbo.UFN_DATE_ADDHOURMINUTE([EVENT].[STARTDATE], [EVENT].[STARTTIME]),
@ENDDATE = dbo.UFN_DATE_ADDHOURMINUTE([EVENT].[ENDDATE], [EVENT].[ENDTIME]),
@ENDTIME = isnull([EVENT].[ENDTIME],'')
from dbo.[EVENT]
where [ID] = @EVENTID
declare @EXPIRATIONDATE datetime = null
declare @EXPIRATIONDATEWITHOFFSET datetimeoffset = null
declare @ISEXPIRED bit = 0
--Calculate expiration from end of start date
if @STARTDATE > @ENDDATE
begin
set @ENDDATE = @STARTDATE
set @EXPIRATIONDATE = dbo.UFN_DATE_GETLATESTTIME(@STARTDATE)
end
else if @ENDTIME = ''
set @EXPIRATIONDATE = dbo.UFN_DATE_GETLATESTTIME(@ENDDATE)
else
set @EXPIRATIONDATE = @ENDDATE
declare @CURRENTDATETIMEOFFSET datetimeoffset = dbo.UFN_TIMEZONEENTRY_GETSYSTEMDEFAULTDATEWITHTIMEOFFSET(sysutcdatetime(), 1);
set @EXPIRATIONDATEWITHOFFSET = dbo.UFN_TIMEZONEENTRY_GETSYSTEMDEFAULTDATEWITHTIMEOFFSET(@EXPIRATIONDATE, 0);
set @ISEXPIRED = case when @EXPIRATIONDATEWITHOFFSET < @CURRENTDATETIMEOFFSET then 1 else 0 end
if @ISEXPIRED = 1
raiserror('BBERR_SALESORDERITEMONLINE_EVENTREGISTRATION_EVENTEXPIRED', 13, 1);
declare @REGISTRANTS_TABLE table (
[REGISTERLATER] bit,
[CONSTITUENTID] uniqueidentifier,
[FIRSTNAME] nvarchar(50),
[KEYNAME] nvarchar(100),
[PHONE] nvarchar(100),
[EMAIL] dbo.UDT_EMAILADDRESS,
[TITLECODEID] uniqueidentifier,
[ADDRESSBLOCK] nvarchar(150),
[CITY] nvarchar(50),
[STATEID] uniqueidentifier,
[POSTCODE] nvarchar(12),
[COUNTRYID] uniqueidentifier
);
insert into @REGISTRANTS_TABLE
select
isnull(T.registrants.value('(REGISTERLATER)[1]','bit'),0) as 'REGISTERLATER',
T.registrants.value('(GUESTCONSTITUENTID)[1]','uniqueidentifier') as 'CONSTITUENTID',
T.registrants.value('(FIRSTNAME)[1]','nvarchar(50)') as 'FIRSTNAME',
T.registrants.value('(KEYNAME)[1]','nvarchar(100)') as 'KEYNAME',
T.registrants.value('(PHONE)[1]','nvarchar(100)') as 'PHONE',
isnull(T.registrants.value('(EMAIL)[1]','dbo.UDT_EMAILADDRESS'),'') as 'EMAIL',
dbo.UFN_TITLECODE_GETID(T.registrants.value('(TITLE)[1]','nvarchar(100)')) as 'TITLECODEID',
T.registrants.value('(ADDRESSBLOCK)[1]','nvarchar(150)') as 'ADDRESSBLOCK',
T.registrants.value('(CITY)[1]','nvarchar(50)') as 'CITY',
T.registrants.value('(STATEID)[1]','uniqueidentifier') as 'STATEID',
T.registrants.value('(POSTCODE)[1]','nvarchar(12)') as 'POSTCODE',
T.registrants.value('(COUNTRYID)[1]','uniqueidentifier') as 'COUNTRYID'
from @REGISTRANTMAPPINGS.nodes('/REGISTRANTMAPPINGS/ITEM') T(registrants)
--For registrations, we need to check if the registrant quantity exceeds the event's capacity
declare @CAPACITY integer = 0;
declare @CAPACITYRESERVED integer = 0;
declare @AVAILABLECAPACITY integer = 0;
select
@CAPACITY = [EVENT].[CAPACITY],
@CAPACITYRESERVED = [CAPACITY].[RESERVED]
from dbo.[EVENT]
outer apply (
select count(REGISTRANT.ID) as [RESERVED]
from dbo.[REGISTRANT]
where
[REGISTRANT].[EVENTID] = [EVENT].[ID] and
[REGISTRANT].[ISCANCELLED] = 0 and
[REGISTRANT].[WILLNOTATTEND] = 0
) [CAPACITY]
where [EVENT].[ID] = @EVENTID
set @AVAILABLECAPACITY = @CAPACITY - @CAPACITYRESERVED
if @AVAILABLECAPACITY < 0
set @AVAILABLECAPACITY = 0;
if (select count(*) from @REGISTRANTS_TABLE) > @AVAILABLECAPACITY
raiserror('BBERR_SALESORDERITEMONLINE_EVENTREGISTRATION_OVERCAPACITY', 13, 1);
--We also need to check if any of the regsitrants already has a registration for this event
--Automatch prep (don't want to do this work each time through the registrant cursor)
declare @ADDRESSSUBSTITUTIONS dbo.UDT_STRINGPAIR_100
insert into @ADDRESSSUBSTITUTIONS
select
[DESIGNATION],
[ABBREVIATION]
from dbo.UFN_ADDRESS_ADDRESSBLOCK_STANDARDUSABBREVIATIONS_LOWERCASE()
declare @CONSTITUENTMATCHES table (
[ID] uniqueidentifier
)
--End automatch prep
--Registrant cursor prep
--Matching/Creating constituent records for registrants without them
--Updating constituent records for title, firstname
declare
@REGISTRANTREGISTERLATER bit,
@REGISTRANTCONSTITUENTID uniqueidentifier,
@REGISTRANTFIRSTNAME nvarchar(50),
@REGISTRANTKEYNAME nvarchar(100),
@REGISTRANTPHONE nvarchar(100),
@REGISTRANTTITLECODEID uniqueidentifier,
@REGISTRANTEMAIL dbo.UDT_EMAILADDRESS,
@REGISTRANTCOUNTRYID uniqueidentifier,
@REGISTRANTSTATEID uniqueidentifier,
@REGISTRANTADDRESSBLOCK nvarchar(150),
@REGISTRANTCITY nvarchar(50),
@REGISTRANTPOSTCODE nvarchar(12)
declare REGISTRANT_CURSOR cursor local fast_forward for
select
[REGISTERLATER],
case when [CONSTITUENTID] = '00000000-0000-0000-0000-000000000000' then null else [CONSTITUENTID] end,
isnull([FIRSTNAME],''),
isnull([KEYNAME],''),
[TITLECODEID],
isnull([PHONE],''),
isnull([EMAIL],''),
[COUNTRYID],
[STATEID],
isnull([ADDRESSBLOCK],''),
isnull([CITY],''),
isnull([POSTCODE],'')
from @REGISTRANTS_TABLE;
--End registrant cursor prep
--Starting registrant matching/creating work
open REGISTRANT_CURSOR
fetch next from REGISTRANT_CURSOR into
@REGISTRANTREGISTERLATER,
@REGISTRANTCONSTITUENTID,
@REGISTRANTFIRSTNAME,
@REGISTRANTKEYNAME,
@REGISTRANTTITLECODEID,
@REGISTRANTPHONE,
@REGISTRANTEMAIL,
@REGISTRANTCOUNTRYID,
@REGISTRANTSTATEID,
@REGISTRANTADDRESSBLOCK,
@REGISTRANTCITY,
@REGISTRANTPOSTCODE
while @@FETCH_STATUS = 0
begin
if @REGISTRANTCOUNTRYID= '00000000-0000-0000-0000-000000000000'
set @REGISTRANTCOUNTRYID = null
if @REGISTRANTSTATEID = '00000000-0000-0000-0000-000000000000'
set @REGISTRANTSTATEID = null
set @REGISTRANTADDRESSBLOCK = isnull(@REGISTRANTADDRESSBLOCK,'')
set @REGISTRANTCITY = isnull(@REGISTRANTCITY, '')
set @REGISTRANTPOSTCODE = isnull(@REGISTRANTPOSTCODE, '')
--Find a constituent record match if we don't have a constituent record
if @REGISTRANTCONSTITUENTID is null or @REGISTRANTREGISTERLATER = 1
begin
delete @CONSTITUENTMATCHES
insert into @CONSTITUENTMATCHES
select [CONSTITUENT].[ID]
from dbo.UFN_WEBFORMS_CONSTITUENT_EXACTAUTOMATCH (
50,
@REGISTRANTKEYNAME,
@REGISTRANTFIRSTNAME,
@REGISTRANTTITLECODEID,
@REGISTRANTADDRESSBLOCK,
@REGISTRANTCITY,
@REGISTRANTCOUNTRYID,
@REGISTRANTSTATEID,
@REGISTRANTPOSTCODE,
@REGISTRANTPHONE,
@REGISTRANTEMAIL,
@ADDRESSSUBSTITUTIONS
) [CONSTITUENT]
--Check and error if any of the matches are already registered for the event
if exists(
select 1
from dbo.[REGISTRANT]
inner join @CONSTITUENTMATCHES [MATCHES]
on [REGISTRANT].[CONSTITUENTID] = [MATCHES].[ID]
where
[REGISTRANT].[EVENTID] = @EVENTID and
--Allow hosts that haven't been marked as attending to match
(
[REGISTRANT].[WILLNOTATTEND] = 0 or
exists(select top 1 [ID] from dbo.REGISTRANTREGISTRATIONMAP where [REGISTRANTID] = [REGISTRANT].[ID])
)
)
begin
raiserror('BBERR_SALESORDERITEMONLINE_EVENTREGISTRATION_REGISTRANTMATCH', 13, 1);
end
end
fetch next from REGISTRANT_CURSOR into
@REGISTRANTREGISTERLATER,
@REGISTRANTCONSTITUENTID,
@REGISTRANTFIRSTNAME,
@REGISTRANTKEYNAME,
@REGISTRANTTITLECODEID,
@REGISTRANTPHONE,
@REGISTRANTEMAIL,
@REGISTRANTCOUNTRYID,
@REGISTRANTSTATEID,
@REGISTRANTADDRESSBLOCK,
@REGISTRANTCITY,
@REGISTRANTPOSTCODE
end
close REGISTRANT_CURSOR
deallocate REGISTRANT_CURSOR
-- handle inserting the data
merge dbo.[SALESORDERITEM] as [TARGET]
using (select @ID as ID) as [SOURCE]
on (TARGET.ID = SOURCE.ID)
when matched then
update
set
DESCRIPTION = @DESCRIPTION,
PRICE = @AMOUNT,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE,
DATA = @DATA,
OPTIONS = @OPTIONS,
CALLBACKURL = @CALLBACKURL,
SYSTEMTYPENAME = @SYSTEMTYPENAME,
ASSEMBLYNAME = @ASSEMBLYNAME,
ATTRIBUTES = @ATTRIBUTES,
CATEGORYNAME = @CATEGORYNAME,
ACKNOWLEDGEMENT = @ACKNOWLEDGEMENT,
SALESORDERID = @SALESORDERID,
TYPECODE = @TYPECODE
when not matched then
insert (
ID,
SALESORDERID,
TYPECODE,
DESCRIPTION,
QUANTITY,
PRICE,
ADDEDBYID,
CHANGEDBYID,
DATEADDED,
DATECHANGED,
DATA,
OPTIONS,
CALLBACKURL,
SYSTEMTYPENAME,
ASSEMBLYNAME,
ATTRIBUTES,
CATEGORYNAME,
ACKNOWLEDGEMENT
)
values (
@ID,
@SALESORDERID,
@TYPECODE,
@DESCRIPTION,
@QUANTITY,
@AMOUNT,
@CHANGEAGENTID,
@CHANGEAGENTID,
@CURRENTDATE,
@CURRENTDATE,
@DATA,
@OPTIONS,
@CALLBACKURL,
@SYSTEMTYPENAME,
@ASSEMBLYNAME,
@ATTRIBUTES,
@CATEGORYNAME,
@ACKNOWLEDGEMENT
);
end try
begin catch
exec dbo.USP_RAISE_ERROR
return 1
end catch
return 0