USP_PLEDGE_GENERATEINSTALLMENTSPLITS
Generates splits for all installments and write-offs towards a pledge.
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@PLEDGEID | uniqueidentifier | IN | |
@CHANGEAGENTID | uniqueidentifier | IN | |
@CHANGEDATE | datetime | IN |
Definition
Copy
CREATE procedure dbo.USP_PLEDGE_GENERATEINSTALLMENTSPLITS
(
@PLEDGEID uniqueidentifier,
@CHANGEAGENTID uniqueidentifier,
@CHANGEDATE datetime
)
as
begin
set nocount on;
declare @PLEDGEAMOUNT decimal(30, 5);
declare @INSTALLMENTAMOUNT decimal(30, 5);
declare @INSTALLMENTID uniqueidentifier;
declare @DESIGNATIONID uniqueidentifier;
declare @DESIGNATIONSUM decimal(30, 5);
declare @REVENUESPLITID uniqueidentifier;
declare @WEIGHTAMOUNT decimal(30, 5);
declare @IDEALAMOUNT decimal(30, 5);
declare @DESIGNATIONAMOUNTDISTRIBUTEDIDEAL decimal(30, 5);
declare @DESIGNATIONAMOUNTDISTRIBUTED decimal(30, 5);
declare @INSTALLMENTAMOUNTDISTRIBUTEDIDEAL decimal(30, 5);
declare @INSTALLMENTAMOUNTDISTRIBUTED decimal(30, 5);
declare @DESIGNATIONBASEAMOUNTDISTRIBUTED decimal(30, 5);
declare @INSTALLMENTBASEAMOUNTDISTRIBUTED decimal(30, 5);
declare @DESIGNATIONORGANIZATIONAMOUNTDISTRIBUTED decimal(30, 5);
declare @INSTALLMENTORGANIZATIONAMOUNTDISTRIBUTED decimal(30, 5);
declare @INSTALLMENTMAX integer;
declare @INSTALLMENTSEQUENCE integer;
set @DESIGNATIONAMOUNTDISTRIBUTEDIDEAL = 0;
set @DESIGNATIONAMOUNTDISTRIBUTED = 0;
set @INSTALLMENTAMOUNTDISTRIBUTEDIDEAL = 0;
set @INSTALLMENTAMOUNTDISTRIBUTED = 0;
set @DESIGNATIONBASEAMOUNTDISTRIBUTED = 0;
set @INSTALLMENTBASEAMOUNTDISTRIBUTED = 0;
set @DESIGNATIONORGANIZATIONAMOUNTDISTRIBUTED = 0;
set @INSTALLMENTORGANIZATIONAMOUNTDISTRIBUTED = 0;
--Multicurrency - AdamBu 3/30/10 - Retrieve the info needed to convert values later.
declare @ORGANIZATIONCURRENCYID uniqueidentifier = dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY();
declare @BASECURRENCYID uniqueidentifier;
declare @ORGANIZATIONEXCHANGERATEID uniqueidentifier;
declare @TRANSACTIONCURRENCYID uniqueidentifier;
declare @BASEEXCHANGERATEID uniqueidentifier;
declare @DESIGNATIONSUMBASEAMOUNT money;
declare @INSTALLMENTBASEAMOUNT money;
declare @DESIGNATIONSUMORGANIZATIONAMOUNT money;
declare @INSTALLMENTORGANIZATIONAMOUNT money;
declare @BASEWEIGHTAMOUNT money;
declare @ORGANIZATIONWEIGHTAMOUNT money;
declare @TRANSACTIONCURRENCYDECIMALDIGITS tinyint;
declare @BASECURRENCYDECIMALDIGITS tinyint;
declare @ORGANIZATIONCURRENCYDECIMALDIGITS tinyint;
select
@BASECURRENCYID = REVENUE.BASECURRENCYID,
@ORGANIZATIONEXCHANGERATEID = REVENUE.ORGANIZATIONEXCHANGERATEID,
@TRANSACTIONCURRENCYID = REVENUE.TRANSACTIONCURRENCYID,
@BASEEXCHANGERATEID = REVENUE.BASEEXCHANGERATEID,
@PLEDGEAMOUNT = REVENUE.TRANSACTIONAMOUNT,
@TRANSACTIONCURRENCYDECIMALDIGITS = TRANSACTIONCURRENCY.DECIMALDIGITS,
@BASECURRENCYDECIMALDIGITS = BASECURRENCY.DECIMALDIGITS
from
dbo.REVENUE
inner join dbo.CURRENCY as TRANSACTIONCURRENCY on REVENUE.TRANSACTIONCURRENCYID = TRANSACTIONCURRENCY.ID
inner join dbo.CURRENCY as BASECURRENCY on REVENUE.BASECURRENCYID = BASECURRENCY.ID
where
REVENUE.ID = @PLEDGEID
select @ORGANIZATIONCURRENCYDECIMALDIGITS = DECIMALDIGITS from dbo.CURRENCY where ID = @ORGANIZATIONCURRENCYID;
declare @ORGANIZATIONAMOUNTORIGINCODE tinyint = 0;
select @ORGANIZATIONAMOUNTORIGINCODE = coalesce(ORGANIZATIONAMOUNTORIGINCODE,0) from dbo.MULTICURRENCYCONFIGURATION;
declare @DESIGNATIONIDEALAMOUNTLIST table
(
DESIGNATIONID uniqueidentifier,
IDEALAMOUNT money,
DISTRIBUTEDAMOUNT money,
DISTRIBUTEDBASEAMOUNT money,
DISTRIBUTEDORGANIZATIONAMOUNT money
)
declare @INSTALLMENTIDEALAMOUNTLIST table
(
INSTALLMENTID uniqueidentifier,
IDEALAMOUNT money,
DISTRIBUTEDAMOUNT money,
DISTRIBUTEDBASEAMOUNT money,
DISTRIBUTEDORGANIZATIONAMOUNT money
)
insert into @DESIGNATIONIDEALAMOUNTLIST(DESIGNATIONID)
select DESIGNATIONID from REVENUESPLIT where REVENUEID = @PLEDGEID;
insert into @INSTALLMENTIDEALAMOUNTLIST(INSTALLMENTID)
select ID from INSTALLMENT where REVENUEID = @PLEDGEID;
select @INSTALLMENTMAX = max(SEQUENCE)
from INSTALLMENT where INSTALLMENT.REVENUEID = @PLEDGEID;
declare INSTALLMENTSPLITS cursor local fast_forward for
select
INSTALLMENT.ID,
INSTALLMENT.SEQUENCE,
REVENUESPLIT_EXT.DESIGNATIONID,
INSTALLMENT.TRANSACTIONAMOUNT,
FINANCIALTRANSACTIONLINEITEM.TRANSACTIONAMOUNT TRANSACTIONAMOUNT,
INSTALLMENT.AMOUNT,
FINANCIALTRANSACTIONLINEITEM.BASEAMOUNT AMOUNT,
INSTALLMENT.ORGANIZATIONAMOUNT,
FINANCIALTRANSACTIONLINEITEM.ORGAMOUNT ORGANIZATIONAMOUNT,
FINANCIALTRANSACTIONLINEITEM.ID REVENUESPLITID
from
dbo.INSTALLMENT
inner join dbo.FINANCIALTRANSACTIONLINEITEM on FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = INSTALLMENT.REVENUEID
inner join dbo.REVENUESPLIT_EXT on REVENUESPLIT_EXT.ID = FINANCIALTRANSACTIONLINEITEM.ID
where
INSTALLMENT.REVENUEID = @PLEDGEID
and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null
and FINANCIALTRANSACTIONLINEITEM.TYPECODE = 0
order by
INSTALLMENT.SEQUENCE, FINANCIALTRANSACTIONLINEITEM.SEQUENCE, FINANCIALTRANSACTIONLINEITEM.TS
open INSTALLMENTSPLITS;
fetch next from INSTALLMENTSPLITS into @INSTALLMENTID, @INSTALLMENTSEQUENCE, @DESIGNATIONID, @INSTALLMENTAMOUNT, @DESIGNATIONSUM, @INSTALLMENTBASEAMOUNT, @DESIGNATIONSUMBASEAMOUNT, @INSTALLMENTORGANIZATIONAMOUNT, @DESIGNATIONSUMORGANIZATIONAMOUNT, @REVENUESPLITID;
while @@FETCH_STATUS = 0
begin
select @DESIGNATIONAMOUNTDISTRIBUTEDIDEAL = coalesce(IDEALAMOUNT, 0.00),
@DESIGNATIONAMOUNTDISTRIBUTED = coalesce(DISTRIBUTEDAMOUNT, 0.00),
@DESIGNATIONBASEAMOUNTDISTRIBUTED = coalesce(DISTRIBUTEDBASEAMOUNT, 0.00),
@DESIGNATIONORGANIZATIONAMOUNTDISTRIBUTED = coalesce(DISTRIBUTEDORGANIZATIONAMOUNT, 0.00)
from @DESIGNATIONIDEALAMOUNTLIST
where DESIGNATIONID = @DESIGNATIONID;
select @INSTALLMENTAMOUNTDISTRIBUTEDIDEAL = coalesce(IDEALAMOUNT, 0.00),
@INSTALLMENTAMOUNTDISTRIBUTED = coalesce(DISTRIBUTEDAMOUNT, 0.00),
@INSTALLMENTBASEAMOUNTDISTRIBUTED = coalesce(DISTRIBUTEDBASEAMOUNT, 0.00),
@INSTALLMENTORGANIZATIONAMOUNTDISTRIBUTED = coalesce(DISTRIBUTEDORGANIZATIONAMOUNT, 0.00)
from @INSTALLMENTIDEALAMOUNTLIST
where INSTALLMENTID = @INSTALLMENTID;
if @PLEDGEAMOUNT <> 0
--Do multiplication first to reduce rounding errors
set @IDEALAMOUNT = (@INSTALLMENTAMOUNT * @DESIGNATIONSUM)/ @PLEDGEAMOUNT;
else
set @IDEALAMOUNT = 0;
--On the last installment balance out the designations
if @INSTALLMENTSEQUENCE = @INSTALLMENTMAX
begin
set @WEIGHTAMOUNT = ROUND(@IDEALAMOUNT
+ @DESIGNATIONAMOUNTDISTRIBUTEDIDEAL - @DESIGNATIONAMOUNTDISTRIBUTED, @TRANSACTIONCURRENCYDECIMALDIGITS);
--Calculate the weighted base amount
if @TRANSACTIONCURRENCYID = @BASECURRENCYID
set @BASEWEIGHTAMOUNT = @WEIGHTAMOUNT;
else
set @BASEWEIGHTAMOUNT = (dbo.UFN_CURRENCY_CONVERTBYPROPORTION((@WEIGHTAMOUNT + @DESIGNATIONAMOUNTDISTRIBUTED), @DESIGNATIONSUM, @DESIGNATIONSUMBASEAMOUNT, @BASECURRENCYDECIMALDIGITS) - @DESIGNATIONBASEAMOUNTDISTRIBUTED);
--Calculate the weighted organization amount
if @ORGANIZATIONAMOUNTORIGINCODE = 0
begin
if @BASECURRENCYID = @ORGANIZATIONCURRENCYID
set @ORGANIZATIONWEIGHTAMOUNT = @BASEWEIGHTAMOUNT;
else
set @ORGANIZATIONWEIGHTAMOUNT = (dbo.UFN_CURRENCY_CONVERTBYPROPORTION((@BASEWEIGHTAMOUNT + @DESIGNATIONBASEAMOUNTDISTRIBUTED), @DESIGNATIONSUMBASEAMOUNT, @DESIGNATIONSUMORGANIZATIONAMOUNT, @ORGANIZATIONCURRENCYDECIMALDIGITS) - @DESIGNATIONORGANIZATIONAMOUNTDISTRIBUTED);
end
else
begin
if @TRANSACTIONCURRENCYID = @ORGANIZATIONCURRENCYID
set @ORGANIZATIONWEIGHTAMOUNT = @WEIGHTAMOUNT;
else
set @ORGANIZATIONWEIGHTAMOUNT = (dbo.UFN_CURRENCY_CONVERTBYPROPORTION((@WEIGHTAMOUNT + @DESIGNATIONAMOUNTDISTRIBUTED), @DESIGNATIONSUM, @DESIGNATIONSUMORGANIZATIONAMOUNT, @ORGANIZATIONCURRENCYDECIMALDIGITS) - @DESIGNATIONORGANIZATIONAMOUNTDISTRIBUTED);
end
end
else
begin
set @WEIGHTAMOUNT = ROUND(@IDEALAMOUNT
+ @INSTALLMENTAMOUNTDISTRIBUTEDIDEAL - @INSTALLMENTAMOUNTDISTRIBUTED, @TRANSACTIONCURRENCYDECIMALDIGITS);
--Calculate the weighted base amount
if @TRANSACTIONCURRENCYID = @BASECURRENCYID
set @BASEWEIGHTAMOUNT = @WEIGHTAMOUNT;
else
set @BASEWEIGHTAMOUNT = (dbo.UFN_CURRENCY_CONVERTBYPROPORTION((@WEIGHTAMOUNT + @INSTALLMENTAMOUNTDISTRIBUTED), @INSTALLMENTAMOUNT, @INSTALLMENTBASEAMOUNT, @BASECURRENCYDECIMALDIGITS) - @INSTALLMENTBASEAMOUNTDISTRIBUTED);
--Calculate the weighted organization amount
if @ORGANIZATIONAMOUNTORIGINCODE = 0
begin
if @BASECURRENCYID = @ORGANIZATIONCURRENCYID
set @ORGANIZATIONWEIGHTAMOUNT = @BASEWEIGHTAMOUNT;
else
set @ORGANIZATIONWEIGHTAMOUNT = (dbo.UFN_CURRENCY_CONVERTBYPROPORTION((@BASEWEIGHTAMOUNT + @INSTALLMENTBASEAMOUNTDISTRIBUTED), @INSTALLMENTBASEAMOUNT, @INSTALLMENTORGANIZATIONAMOUNT, @ORGANIZATIONCURRENCYDECIMALDIGITS) - @INSTALLMENTORGANIZATIONAMOUNTDISTRIBUTED);
end
else
begin
if @TRANSACTIONCURRENCYID = @ORGANIZATIONCURRENCYID
set @ORGANIZATIONWEIGHTAMOUNT = @WEIGHTAMOUNT;
else
set @ORGANIZATIONWEIGHTAMOUNT = (dbo.UFN_CURRENCY_CONVERTBYPROPORTION((@WEIGHTAMOUNT + @INSTALLMENTAMOUNTDISTRIBUTED), @INSTALLMENTAMOUNT, @INSTALLMENTORGANIZATIONAMOUNT, @ORGANIZATIONCURRENCYDECIMALDIGITS) - @INSTALLMENTORGANIZATIONAMOUNTDISTRIBUTED);
end
end
insert into dbo.INSTALLMENTSPLIT(
INSTALLMENTID,
PLEDGEID,
DESIGNATIONID,
AMOUNT,
ADDEDBYID,
CHANGEDBYID,
DATEADDED,
DATECHANGED,
BASECURRENCYID,
ORGANIZATIONAMOUNT,
ORGANIZATIONEXCHANGERATEID,
TRANSACTIONAMOUNT,
TRANSACTIONCURRENCYID,
BASEEXCHANGERATEID,
REVENUESPLITID)
values(
@INSTALLMENTID,
@PLEDGEID,
@DESIGNATIONID,
@BASEWEIGHTAMOUNT,
@CHANGEAGENTID,
@CHANGEAGENTID,
@CHANGEDATE,
@CHANGEDATE,
@BASECURRENCYID,
@ORGANIZATIONWEIGHTAMOUNT,
@ORGANIZATIONEXCHANGERATEID,
@WEIGHTAMOUNT,
@TRANSACTIONCURRENCYID,
@BASEEXCHANGERATEID,
@REVENUESPLITID)
update @DESIGNATIONIDEALAMOUNTLIST
set IDEALAMOUNT = @DESIGNATIONAMOUNTDISTRIBUTEDIDEAL + @IDEALAMOUNT,
DISTRIBUTEDAMOUNT = @DESIGNATIONAMOUNTDISTRIBUTED + @WEIGHTAMOUNT,
DISTRIBUTEDBASEAMOUNT = @DESIGNATIONBASEAMOUNTDISTRIBUTED + @BASEWEIGHTAMOUNT,
DISTRIBUTEDORGANIZATIONAMOUNT = @DESIGNATIONORGANIZATIONAMOUNTDISTRIBUTED + @ORGANIZATIONWEIGHTAMOUNT
where DESIGNATIONID = @DESIGNATIONID;
update @INSTALLMENTIDEALAMOUNTLIST
set IDEALAMOUNT = @INSTALLMENTAMOUNTDISTRIBUTEDIDEAL + @IDEALAMOUNT,
DISTRIBUTEDAMOUNT = @INSTALLMENTAMOUNTDISTRIBUTED + @WEIGHTAMOUNT,
DISTRIBUTEDBASEAMOUNT = @INSTALLMENTBASEAMOUNTDISTRIBUTED + @BASEWEIGHTAMOUNT,
DISTRIBUTEDORGANIZATIONAMOUNT = @INSTALLMENTORGANIZATIONAMOUNTDISTRIBUTED + @ORGANIZATIONWEIGHTAMOUNT
where INSTALLMENTID = @INSTALLMENTID;
fetch next from INSTALLMENTSPLITS into @INSTALLMENTID, @INSTALLMENTSEQUENCE, @DESIGNATIONID, @INSTALLMENTAMOUNT, @DESIGNATIONSUM, @INSTALLMENTBASEAMOUNT, @DESIGNATIONSUMBASEAMOUNT, @INSTALLMENTORGANIZATIONAMOUNT, @DESIGNATIONSUMORGANIZATIONAMOUNT, @REVENUESPLITID;
end
--When a cursor is used, it should be explicitly closed/deallocated in case of blocking or USP running long
close INSTALLMENTSPLITS;
deallocate INSTALLMENTSPLITS;
end