USP_REPORT_DISBURSEMENT
Returns data for the projected disbursements and cash disbursements reports
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@STARTDATE | datetime | IN | |
@ENDDATE | datetime | IN | |
@FINANCIALTRANSACTIONQUERY | uniqueidentifier | IN | |
@DISBURSEMENTID | uniqueidentifier | IN | |
@DISBURSEMENTPROCESSID | uniqueidentifier | IN | |
@REPORTUSERID | nvarchar(128) | IN | |
@ALTREPORTUSERID | nvarchar(128) | IN |
Definition
Copy
CREATE procedure dbo.USP_REPORT_DISBURSEMENT
(
@STARTDATE datetime = null,
@ENDDATE datetime = null,
@FINANCIALTRANSACTIONQUERY uniqueidentifier = null,
@DISBURSEMENTID uniqueidentifier = null,
@DISBURSEMENTPROCESSID uniqueidentifier = null,
@REPORTUSERID nvarchar(128) = null,
@ALTREPORTUSERID nvarchar(128) = null
)
with execute as owner
as
set nocount on;
declare @CURRENTAPPUSERID uniqueidentifier;
declare @ISADMIN bit;
declare @APPUSER_IN_NONRACROLE bit;
declare @APPUSER_IN_NOSECGROUPROLE bit;
set @CURRENTAPPUSERID = dbo.UFN_APPUSER_GETREPORTAPPUSERID(@REPORTUSERID, @ALTREPORTUSERID);
set @ISADMIN = dbo.UFN_APPUSER_ISSYSADMIN(@CURRENTAPPUSERID);
set @APPUSER_IN_NONRACROLE = dbo.UFN_SECURITY_APPUSER_IN_NONRACROLE(@CURRENTAPPUSERID);
set @APPUSER_IN_NOSECGROUPROLE = dbo.UFN_SECURITY_APPUSER_IN_NO_SECURITY_GROUP_ROLE(@CURRENTAPPUSERID);
declare @SQLTOEXEC nvarchar(max);
declare @DBOBJECTNAME nvarchar(128);
declare @DBOBJECTTYPE smallint;
if @FINANCIALTRANSACTIONQUERY is not null
begin
if not exists(select ID from dbo.IDSETREGISTER where ID = @FINANCIALTRANSACTIONQUERY) raiserror('ID set does not exist in the database.', 15, 1);
select @DBOBJECTNAME = DBOBJECTNAME, @DBOBJECTTYPE = OBJECTTYPE from dbo.IDSETREGISTER where ID = @FINANCIALTRANSACTIONQUERY;
if @DBOBJECTTYPE = 1 set @DBOBJECTNAME = @DBOBJECTNAME + '()';
else if @DBOBJECTTYPE = 2 set @DBOBJECTNAME = @DBOBJECTNAME + '(''' + convert(nvarchar(36), @FINANCIALTRANSACTIONQUERY) + ''')';
end
set @SQLTOEXEC = '
declare @DISBURSEMENTS table (
VENDORID nvarchar(200)
,NAME nvarchar(100)
,PAYMENTMETHOD nvarchar(100)
,BANKACCOUNT nvarchar(100)
,BANKACCOUNTTRANSACTIONID nvarchar(200)
,FINANCIALTRANSACTIONID uniqueidentifier
,NUMBER int
,DISBURSEMENTDATE date
,POSTDATE date
,AMOUNT money
,STATUS nvarchar(100)
); '
if @DISBURSEMENTPROCESSID is null
begin
set @SQLTOEXEC = @SQLTOEXEC + 'insert into @DISBURSEMENTS
select ''http://www.blackbaud.com?VENDORID='' + CONVERT(nvarchar(36), C.ID) as VENDORID
,C.NAME
,''Check'' PAYMENTMETHOD
,BA.ACCOUNTNAME BANKACCOUNT
,''http://www.blackbaud.com?BANKACCOUNTTRANSACTIONID='' + CONVERT(nvarchar(36), BAT.ID) as BANKACCOUNTTRANSACTIONID
,FT.ID FINANCIALTRANSACTIONID
,CAST(BAT.TRANSACTIONNUMBER as nvarchar) NUMBER
,BAT.TRANSACTIONDATE [DISBURSEMENTDATE]
,BAT.POSTDATE
,BAT.AMOUNT
,CASE WHEN BAT.PROCESSING = 1 THEN ''In Process'' ELSE BAT.STATUS END
from dbo.BANKACCOUNTTRANSACTION BAT
inner join dbo.FINANCIALTRANSACTION FT on FT.ID = BAT.ID
inner join dbo.CONSTITUENT C on C.ID = FT.CONSTITUENTID
inner join dbo.BANKACCOUNT BA on BA.ID = BAT.BANKACCOUNTID '
if @FINANCIALTRANSACTIONQUERY is not null
set @SQLTOEXEC = @SQLTOEXEC + 'inner join dbo.' + @DBOBJECTNAME + ' as SELECTION on BAT.[ID] = SELECTION.[ID]' + nchar(13);
set @SQLTOEXEC = @SQLTOEXEC + ' where BAT.PROCESSING = 0 and BAT.DELETED = 0
and ((BAT.TRANSACTIONDATE >= @STARTDATE or @STARTDATE is null)
and (BAT.TRANSACTIONDATE <= @ENDDATE or @ENDDATE is null))
and (@DISBURSEMENTID is null or BAT.ID = @DISBURSEMENTID)
and ((@ISADMIN = 1 or @APPUSER_IN_NONRACROLE = 1) or
dbo.UFN_SECURITY_APPUSER_GRANTED_CONSTITID_FORREPORT(@CURRENTAPPUSERID, BA.BANKID, @APPUSER_IN_NOSECGROUPROLE) = 1)'
end
else
begin
set @SQLTOEXEC = @SQLTOEXEC + ' declare @temp table ([ID] uniqueidentifier, [FINANCIALTRANSACTIONID] uniqueidentifier, [ORIGINALNUMBER] int, [CHANGEDNUMBER] int, [FUTUREFINANCIALTRANSACTIONID] uniqueidentifier);
insert into @temp
select H.ID, H.[FINANCIALTRANSACTIONID], H.[ORIGINALNUMBER], H.[CHANGEDNUMBER], H.[FUTUREFINANCIALTRANSACTIONID]
from dbo.DISBURSEMENTHISTORY H
left outer join dbo.BANKACCOUNTTRANSACTION_EXT D on H.[FINANCIALTRANSACTIONID] = D.ID
left outer join dbo.DISBURSEMENTPROCESSDISBURSEMENT DPD on H.FINANCIALTRANSACTIONID = DPD.ID
where D.DISBURSEMENTPROCESSID = @DISBURSEMENTPROCESSID or DPD.DISBURSEMENTPROCESSID = @DISBURSEMENTPROCESSID;
update @temp
set FUTUREFINANCIALTRANSACTIONID = T1.FUTUREFINANCIALTRANSACTIONID
from @temp T
inner join (select FINANCIALTRANSACTIONID, FUTUREFINANCIALTRANSACTIONID
from @temp where FUTUREFINANCIALTRANSACTIONID is not null) T1 on T1.FINANCIALTRANSACTIONID = T.FINANCIALTRANSACTIONID;
update @temp
set FUTUREFINANCIALTRANSACTIONID = null
where FUTUREFINANCIALTRANSACTIONID not in (select FINANCIALTRANSACTIONID from @temp);
WITH DisbursementHistoryInfo (ID, FINANCIALTRANSACTIONID, ORIGINALID)
AS
(
select H.ID, H.FINANCIALTRANSACTIONID, H.FINANCIALTRANSACTIONID
from @temp H
where H.FUTUREFINANCIALTRANSACTIONID is null
union all
select H.ID, HI.FINANCIALTRANSACTIONID, H.FINANCIALTRANSACTIONID
from @temp H
inner join DisbursementHistoryInfo HI on H.FUTUREFINANCIALTRANSACTIONID = HI.ORIGINALID and H.FINANCIALTRANSACTIONID not in (HI.ORIGINALID)
)
insert into @DISBURSEMENTS
select ''http://www.blackbaud.com?VENDORID='' + CONVERT(nvarchar(36), C.ID) as VENDORID
,C.NAME
,''Check'' PAYMENTMETHOD
,BA.ACCOUNTNAME BANKACCOUNT
,CASE WHEN BAT.ID is null THEN NULL ELSE CASE WHEN BAT.PROCESSING = 0 THEN ''http://www.blackbaud.com?BANKACCOUNTTRANSACTIONID='' + CONVERT(nvarchar(36), BAT.ID) ELSE NULL END END as BANKACCOUNTTRANSACTIONID
,FT.ID FINANCIALTRANSACTIONID
,ISNULL(ISNULL(cast(BAT.TRANSACTIONNUMBER as nvarchar),
(select MAX(CASE WHEN T.CHANGEDNUMBER = 0
THEN T.ORIGINALNUMBER
ELSE T.CHANGEDNUMBER
END)
from @temp T where T.FINANCIALTRANSACTIONID = FT.ID)),
ROW_NUMBER () over (order by DPD.DATEADDED) + isnull((select MAX(BAT1.TRANSACTIONNUMBER) from dbo.BANKACCOUNTTRANSACTION BAT1 where BAT1.BANKACCOUNTID = BA.ID), 0)) NUMBER
,ISNULL(BAT.TRANSACTIONDATE, DP.DISBURSEMENTDATE) [DISBURSEMENTDATE]
,ISNULL(BAT.POSTDATE, DP.POSTDATE) [POSTDATE]
,ISNULL(BAT.AMOUNT, FT.TRANSACTIONAMOUNT) [AMOUNT]
,CASE WHEN DPD.ID is not null or BAT.PROCESSING = 1 THEN ''In Process'' ELSE BAT.STATUS END
from dbo.FINANCIALTRANSACTION FT
left outer join dbo.DISBURSEMENTPROCESSDISBURSEMENT DPD on DPD.ID = FT.ID and DPD.DISBURSEMENTPROCESSID = @DISBURSEMENTPROCESSID
left outer join dbo.BANKACCOUNTTRANSACTION_EXT D on D.ID = FT.ID and D.DISBURSEMENTPROCESSID = @DISBURSEMENTPROCESSID
left outer join dbo.BANKACCOUNTTRANSACTION BAT on BAT.ID = D.ID
inner join dbo.DISBURSEMENTPROCESS DP on DP.ID = @DISBURSEMENTPROCESSID
inner join dbo.BANKACCOUNT BA on BA.ID = BAT.BANKACCOUNTID or BA.ID = DP.BANKACCOUNTID
inner join dbo.CONSTITUENT C on C.ID = FT.CONSTITUENTID '
if @FINANCIALTRANSACTIONQUERY is not null
set @SQLTOEXEC = @SQLTOEXEC + 'inner join dbo.' + @DBOBJECTNAME + ' as SELECTION on BAT.[ID] = SELECTION.[ID]' + nchar(13);
set @SQLTOEXEC = @SQLTOEXEC + 'where (FT.ID in (select ISNULL(T1.FINANCIALTRANSACTIONID, T.FINANCIALTRANSACTIONID)
from @temp T
left outer join (
select Distinct ID, FINANCIALTRANSACTIONID
from DisbursementHistoryInfo) T1 on T.ID = T1.ID)
or (FT.ID in (select ISNULL(T1.ORIGINALID, T.FINANCIALTRANSACTIONID)
from @temp T
left outer join (
select Distinct ID, ORIGINALID
from DisbursementHistoryInfo) T1 on T.ID = T1.ID))
or (FT.ID in (select DPD.ID from dbo.DISBURSEMENTPROCESSDISBURSEMENT DPD
where DPD.DISBURSEMENTPROCESSID = @DISBURSEMENTPROCESSID and
DPD.ID not in (select ISNULL(T1.FINANCIALTRANSACTIONID, T.FINANCIALTRANSACTIONID)
from @temp T
left outer join (
select Distinct ID, FINANCIALTRANSACTIONID
from DisbursementHistoryInfo) T1 on T.ID = T1.ID))))
and ((ISNULL(BAT.TRANSACTIONDATE, DP.DISBURSEMENTDATE) >= @STARTDATE or @STARTDATE is null)
and (ISNULL(BAT.TRANSACTIONDATE, DP.DISBURSEMENTDATE) <= @ENDDATE or @ENDDATE is null))
and (@DISBURSEMENTID is null or D.ID = @DISBURSEMENTID)
and ((@ISADMIN = 1 or @APPUSER_IN_NONRACROLE = 1) or
dbo.UFN_SECURITY_APPUSER_GRANTED_CONSTITID_FORREPORT(@CURRENTAPPUSERID, BA.BANKID, @APPUSER_IN_NOSECGROUPROLE) = 1)'
end
set @SQLTOEXEC = @SQLTOEXEC + '
select D.VENDORID
,D.NAME
,D.PAYMENTMETHOD
,D.BANKACCOUNT
,D.BANKACCOUNTTRANSACTIONID
,D.FINANCIALTRANSACTIONID
,D.NUMBER
,D.DISBURSEMENTDATE
,D.POSTDATE
,D.AMOUNT
,D.STATUS
,FT.TYPE [TRANSACTIONTYPE]
,FT.USERDEFINEDID [TRANSACTIONNUMBER]
,FT.DESCRIPTION
,FT.DATE
,I.DATEDUE
,CASE WHEN FT.TYPECODE = 101 THEN IDS.AMOUNT ELSE -1 * IDS.AMOUNT END [TRANSACTIONAMOUNT]
from @DISBURSEMENTS D
inner join (select IorCM.ID [I_CM_ID], FT.ID [FINANCIALTRANSACTIONID], SUM(FTA.AMOUNT) [AMOUNT]
from dbo.FINANCIALTRANSACTION FT
inner join dbo.FINANCIALTRANSACTIONAPPLICATION FTA on FT.ID = FTA.FINANCIALTRANSACTIONID
inner join dbo.FINANCIALTRANSACTIONSCHEDULE FTS on FTS.ID = FTA.FINANCIALTRANSACTIONSCHEDULEID
inner join dbo.FINANCIALTRANSACTION IorCM on IorCM.ID = FTS.FINANCIALTRANSACTIONID
where FT.ID in (select FINANCIALTRANSACTIONID from @DISBURSEMENTS)
group by IorCM.ID, FT.ID) IDS on IDS.FINANCIALTRANSACTIONID = D.FINANCIALTRANSACTIONID
inner join dbo.FINANCIALTRANSACTION FT on FT.ID = IDS.I_CM_ID
left outer join dbo.INVOICE I on I.ID = FT.ID and FT.TYPECODE = 101
order by CAST(D.NUMBER as int);'
exec sp_executesql @SQLTOEXEC,
N'@STARTDATE datetime, @ENDDATE datetime, @DISBURSEMENTID uniqueidentifier, @DISBURSEMENTPROCESSID uniqueidentifier, @ISADMIN bit, @APPUSER_IN_NONRACROLE bit, @APPUSER_IN_NOSECGROUPROLE bit, @CURRENTAPPUSERID uniqueidentifier',
@STARTDATE=@STARTDATE, @ENDDATE=@ENDDATE, @DISBURSEMENTID=@DISBURSEMENTID, @DISBURSEMENTPROCESSID=@DISBURSEMENTPROCESSID, @ISADMIN=@ISADMIN, @APPUSER_IN_NONRACROLE=@APPUSER_IN_NONRACROLE, @APPUSER_IN_NOSECGROUPROLE=@APPUSER_IN_NOSECGROUPROLE, @CURRENTAPPUSERID=@CURRENTAPPUSERID;