USP_REVENUEBATCH_ADDRECOGNITIONS
Add recognitions to the system from a revenue batch.
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@REVENUEID | uniqueidentifier | IN | |
@RECOGNITIONS | xml | IN | |
@CHANGEAGENTID | uniqueidentifier | IN | |
@CHANGEDATE | datetime | IN |
Definition
Copy
CREATE procedure dbo.USP_REVENUEBATCH_ADDRECOGNITIONS
(
@REVENUEID uniqueidentifier,
@RECOGNITIONS xml,
@CHANGEAGENTID uniqueidentifier,
@CHANGEDATE datetime
)
as
set nocount on;
declare @BASECURRENCYID uniqueidentifier;
declare @ORGANIZATIONEXCHANGERATEID uniqueidentifier;
select
@BASECURRENCYID = BASECURRENCYID,
@ORGANIZATIONEXCHANGERATEID = ORGANIZATIONEXCHANGERATEID
from
dbo.REVENUE
where
ID = @REVENUEID;
if @CHANGEAGENTID is null
exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output;
if @CHANGEDATE is null
set @CHANGEDATE = getdate();
begin try
declare @REC table
(
ID uniqueidentifier,
CONSTITUENTID uniqueidentifier,
AMOUNT money,
EFFECTIVEDATE datetime,
REVENUERECOGNITIONTYPECODEID uniqueidentifier
);
insert into @REC(ID, CONSTITUENTID, AMOUNT, EFFECTIVEDATE, REVENUERECOGNITIONTYPECODEID)
select
T.c.value('(ID)[1]','uniqueidentifier') AS 'ID',
T.c.value('(CONSTITUENTID)[1]','uniqueidentifier') AS 'CONSTITUENTID',
T.c.value('(AMOUNT)[1]','money') AS 'AMOUNT',
T.c.value('(EFFECTIVEDATE)[1]','datetime') AS 'EFFECTIVEDATE',
T.c.value('(REVENUERECOGNITIONTYPECODEID)[1]','uniqueidentifier') AS 'REVENUERECOGNITIONTYPECODEID'
from @RECOGNITIONS.nodes('/RECOGNITIONS/ITEM') T(c);
declare REC_CURSOR cursor local dynamic for --The cursor must be dynamic because the data in @REC will be updated as constituents are created
select CONSTITUENTID, AMOUNT, EFFECTIVEDATE, REVENUERECOGNITIONTYPECODEID from @REC;
open REC_CURSOR;
declare @CONSTITUENTID uniqueidentifier;
declare @AMOUNT money;
declare @EFFECTIVEDATE datetime;
declare @REVENUERECOGNITIONTYPECODEID uniqueidentifier;
declare @BATCHCONSTITUENTID uniqueidentifier;
fetch next from REC_CURSOR into @CONSTITUENTID, @AMOUNT, @EFFECTIVEDATE, @REVENUERECOGNITIONTYPECODEID;
while @@FETCH_STATUS = 0
begin
--Create the constituent if necessary
if not exists(select ID from dbo.CONSTITUENT where ID = @CONSTITUENTID)
begin
set @BATCHCONSTITUENTID = @CONSTITUENTID;
set @CONSTITUENTID = newid();
exec USP_REVENUEBATCH_CONSTITUENT_ADD @CONSTITUENTID OUTPUT, @CHANGEAGENTID, @BATCHCONSTITUENTID;
update @REC
set CONSTITUENTID = @CONSTITUENTID
where CONSTITUENTID = @BATCHCONSTITUENTID;
exec dbo.USP_REVENUEBATCH_CONSTITUENT_DELETE @BATCHREVENUECONSTITUENTID = @BATCHCONSTITUENTID, @CHANGEAGENTID = @CHANGEAGENTID
end
fetch next from REC_CURSOR into @CONSTITUENTID, @AMOUNT, @EFFECTIVEDATE, @REVENUERECOGNITIONTYPECODEID;
end
close REC_CURSOR;
deallocate REC_CURSOR;
set @RECOGNITIONS =
(
select
ID, CONSTITUENTID, AMOUNT, EFFECTIVEDATE, REVENUERECOGNITIONTYPECODEID
from @REC
order by EFFECTIVEDATE desc
for xml raw('ITEM'),type,elements,root('RECOGNITIONS'),binary base64
);
declare @REVENUESPLITID uniqueidentifier, @SPLITCOUNT int
select @SPLITCOUNT = count(*) from dbo.REVENUESPLIT
where
REVENUEID = @REVENUEID
-- Determine if there are multiple splits for this revenue
if @SPLITCOUNT > 1
begin
declare @FULLAMOUNT money, @SPLITAMOUNT money, @SPLITRECOGNITIONS xml
-- FULLAMOUNT should only include the splits that will have recognition credits created in this procedure
-- since it is being used to calculate prorated amounts
select @FULLAMOUNT = sum(AMOUNT) from dbo.REVENUESPLIT
where
REVENUEID = @REVENUEID
-- Loop through splits
declare SPLIT_CURSOR cursor local fast_forward for
select ID, AMOUNT from dbo.REVENUESPLIT
where
REVENUEID = @REVENUEID
open SPLIT_CURSOR
fetch next from SPLIT_CURSOR into @REVENUESPLITID, @SPLITAMOUNT
while @@FETCH_STATUS = 0
begin
-- Calculate the prorated amount per split
set @SPLITRECOGNITIONS = (select
ID,
AMOUNT
from dbo.UFN_REVENUE_GETRECOGNITIONS_FROMITEMLISTXML(@RECOGNITIONS)
for xml raw('ITEM'),type,elements,root('AMOUNTSTOPRORATE'),binary base64)
declare @BASEDECIMALDIGITS tinyint;
select @BASEDECIMALDIGITS = DECIMALDIGITS from dbo.CURRENCY where CURRENCY.ID = @BASECURRENCYID;
set @SPLITRECOGNITIONS = (select
newid() as ID,
R.REVENUERECOGNITIONTYPECODEID,
R.CONSTITUENTID,
R.EFFECTIVEDATE,
PRS.AMOUNT
from dbo.UFN_SPLITS_PRORATEAMOUNTS(@FULLAMOUNT, @SPLITAMOUNT, @BASEDECIMALDIGITS, @SPLITRECOGNITIONS) PRS
cross apply dbo.UFN_REVENUE_GETRECOGNITIONS_FROMITEMLISTXML(@RECOGNITIONS) R
where PRS.ID = R.ID
for xml raw('ITEM'),type,elements,root('RECOGNITIONS'),binary base64)
-- Process the recognitions xml to calculate organization amounts.
set @SPLITRECOGNITIONS = dbo.UFN_REVENUERECOGNITION_CONVERTAMOUNTSINXML(@SPLITRECOGNITIONS,@BASECURRENCYID, @ORGANIZATIONEXCHANGERATEID);
--deleting the previous recognition.
delete REVENUERECOGNITION from dbo.REVENUERECOGNITION where REVENUERECOGNITION.REVENUESPLITID = @REVENUESPLITID
exec dbo.USP_REVENUE_GETRECOGNITIONS_2_ADDFROMXML @REVENUESPLITID, @SPLITRECOGNITIONS, @CHANGEAGENTID, @CHANGEDATE;
fetch next from SPLIT_CURSOR into @REVENUESPLITID, @SPLITAMOUNT
end
close SPLIT_CURSOR
deallocate SPLIT_CURSOR
end
else
if @SPLITCOUNT = 1
begin
select top 1 @REVENUESPLITID = ID from dbo.REVENUESPLIT
where
REVENUEID = @REVENUEID
-- Process the recognitions xml to calculate organization amounts.
set @RECOGNITIONS = dbo.UFN_REVENUERECOGNITION_CONVERTAMOUNTSINXML(@RECOGNITIONS,@BASECURRENCYID, @ORGANIZATIONEXCHANGERATEID);
--deleting the previous recognition.
delete REVENUERECOGNITION from dbo.REVENUERECOGNITION where REVENUERECOGNITION.REVENUESPLITID = @REVENUESPLITID
exec dbo.USP_REVENUE_GETRECOGNITIONS_2_ADDFROMXML @REVENUESPLITID, @RECOGNITIONS, @CHANGEAGENTID, @CHANGEDATE;
end
end try
begin catch
exec dbo.USP_RAISE_ERROR;
return 1;
end catch
return 0;