USP_CREDITCARD_SAVE
Saves a new credit card record if it doesn't already exist.
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@ID | uniqueidentifier | INOUT | |
@CREDITCARDTOKEN | uniqueidentifier | IN | |
@CARDHOLDERNAME | nvarchar(255) | IN | |
@CREDITCARDPARTIALNUMBER | nvarchar(4) | IN | |
@CREDITTYPECODEID | uniqueidentifier | IN | |
@EXPIRESON | UDT_FUZZYDATE | IN | |
@CHANGEAGENTID | uniqueidentifier | IN | |
@CURRENTDATE | datetime | IN | |
@VALIDFROM | UDT_FUZZYDATE | IN | |
@ISSUENUMBER | nvarchar(3) | IN | |
@PREVIOUSCREDITCARDID | uniqueidentifier | IN | |
@OWNINGRECORDID | uniqueidentifier | IN | |
@ISTRANSIENT | bit | IN |
Definition
Copy
CREATE procedure dbo.USP_CREDITCARD_SAVE
(
@ID uniqueidentifier output,
@CREDITCARDTOKEN uniqueidentifier,
@CARDHOLDERNAME nvarchar(255),
@CREDITCARDPARTIALNUMBER nvarchar(4),
@CREDITTYPECODEID uniqueidentifier,
@EXPIRESON dbo.UDT_FUZZYDATE,
@CHANGEAGENTID uniqueidentifier = null,
@CURRENTDATE datetime = null,
@VALIDFROM dbo.UDT_FUZZYDATE = '00000000',
@ISSUENUMBER nvarchar(3) = '',
@PREVIOUSCREDITCARDID uniqueidentifier = null,
@OWNINGRECORDID uniqueidentifier = null,
@ISTRANSIENT bit = 0
)
as
set nocount on
if @CHANGEAGENTID is null
exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output
if @CURRENTDATE is null
set @CURRENTDATE = getdate()
-- Only save the data if the card number is set. If that's set, validation on the server
-- should have already enforced that CARDHOLDERNAME and EXPIRESON are set.
if (@CREDITCARDPARTIALNUMBER is not null and rtrim(ltrim(@CREDITCARDPARTIALNUMBER)) <> '') or (len(@CARDHOLDERNAME)>0) or (@EXPIRESON <> '00000000') or (@CREDITTYPECODEID is not null)
begin
-- Check if the token already exists. If it does, that record can be used.
if @CREDITCARDTOKEN is not null
select top 1 @ID = ID from dbo.CREDITCARD where CREDITCARDTOKEN = @CREDITCARDTOKEN
else
begin
-- If the token is null, see if another credit card record has the same data and use that row.
-- We need to check all fields here (including CREDITTYPECODEID) so we don't update seemingly
-- matching cards with different types (i.e. expiration is the same, or other fields are blank)
select top 1 @ID = ID from dbo.CREDITCARD
where
CARDHOLDERNAME = @CARDHOLDERNAME and
CREDITCARDPARTIALNUMBER = @CREDITCARDPARTIALNUMBER and
EXPIRESON = @EXPIRESON and
VALIDFROM = coalesce(@VALIDFROM, '00000000') and
ISSUENUMBER = coalesce(@ISSUENUMBER, '') and
coalesce(CREDITTYPECODEID, '00000000-0000-0000-0000-000000000000') = coalesce(@CREDITTYPECODEID, '00000000-0000-0000-0000-000000000000')
-- If the record already had an existing credit card id, only reuse it if no other
-- records are referencing it
if @ID is null and @PREVIOUSCREDITCARDID is not null
begin
declare @ISIDINUSEUPDATECHECK bit
set @ISIDINUSEUPDATECHECK = 0
exec dbo.USP_CREDITCARDID_ISINUSE @PREVIOUSCREDITCARDID, @OWNINGRECORDID, @ISIDINUSEUPDATECHECK output
if @ISIDINUSEUPDATECHECK = 0
set @ID = @PREVIOUSCREDITCARDID
end
end
if @ID is null
begin
set @ID = newid()
insert into dbo.CREDITCARD
(
[ID],
[CREDITCARDTOKEN],
[CARDHOLDERNAME],
[CREDITTYPECODEID],
[CREDITCARDPARTIALNUMBER],
[EXPIRESON],
[VALIDFROM],
[ISSUENUMBER],
[ISTRANSIENT],
[ADDEDBYID], [CHANGEDBYID], [DATEADDED], [DATECHANGED]
)
values
(
@ID,
@CREDITCARDTOKEN,
@CARDHOLDERNAME,
@CREDITTYPECODEID,
@CREDITCARDPARTIALNUMBER,
@EXPIRESON,
@VALIDFROM,
@ISSUENUMBER,
coalesce(@ISTRANSIENT, 0),
@CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
)
end
else
begin
-- The Is Transient flag doesn't change so it isn't included in the update statement
-- **NOTE** Update the where clause if you add a new column to be updated since
-- we check to make sure a column has changed before doing the update.
update dbo.CREDITCARD set
CARDHOLDERNAME = @CARDHOLDERNAME,
CREDITCARDPARTIALNUMBER = @CREDITCARDPARTIALNUMBER,
CREDITTYPECODEID = @CREDITTYPECODEID,
EXPIRESON = @EXPIRESON,
VALIDFROM = @VALIDFROM,
ISSUENUMBER = @ISSUENUMBER,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
where
ID = @ID and
-- Make sure the row has changed before doing the update so we don't create an unnecessary exclusive lock
(
CARDHOLDERNAME <> @CARDHOLDERNAME or
CREDITCARDPARTIALNUMBER <> @CREDITCARDPARTIALNUMBER or
coalesce(CREDITTYPECODEID, '00000000-0000-0000-0000-000000000000') <> coalesce(@CREDITTYPECODEID, '00000000-0000-0000-0000-000000000000') or
EXPIRESON <> @EXPIRESON or
VALIDFROM <> @VALIDFROM
)
end
end
else
set @ID = null