USP_DATAFORMTEMPLATE_EDIT_REVENUEGLDISTRIBUTIONADJUST_2
The save procedure used by the edit dataform template "Posted Revenue GL Distribution Edit Form 2".
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@ID | uniqueidentifier | IN | The input ID parameter indicating the ID of the record being edited. |
@GLDISTRIBUTION | xml | IN | Revenue GL distribution |
@ADJUSTMENTDATE | datetime | IN | Adjustment date |
@ADJUSTMENTPOSTDATE | datetime | IN | Adjustment post date |
@ADJUSTMENTREASON | nvarchar(300) | IN | Adjustment details |
@CHANGEAGENTID | uniqueidentifier | IN | Input parameter indicating the ID of the change agent invoking the procedure. |
@ADJUSTMENTREASONCODEID | uniqueidentifier | IN | Adjustment reason |
Definition
Copy
CREATE procedure dbo.USP_DATAFORMTEMPLATE_EDIT_REVENUEGLDISTRIBUTIONADJUST_2
(
@ID uniqueidentifier,
@GLDISTRIBUTION xml,
@ADJUSTMENTDATE datetime,
@ADJUSTMENTPOSTDATE datetime,
@ADJUSTMENTREASON nvarchar(300),
@CHANGEAGENTID uniqueidentifier = null,
@ADJUSTMENTREASONCODEID uniqueidentifier
)
as
begin try
set nocount on;
declare @ADJUSTMENTID uniqueidentifier;
declare @PAYMENTMETHODCODE tinyint;
declare @AUCTIONPURCHASE bit = 0;
declare @ADJUST bit;
declare @ADJUSTMENTEXISTS bit;
declare @ADJUSTORIGINALPOSTSTATUS tinyint;
set @ADJUST = 0
set @ADJUSTORIGINALPOSTSTATUS = 0;
if exists(select 1 from FINANCIALTRANSACTIONLINEITEM T1 join REVENUESPLIT_EXT T2 on T1.ID = T2.ID where T2.TYPECODE = 12 and T2.APPLICATIONCODE = 12 and T1.FINANCIALTRANSACTIONID = @ID)
set @AUCTIONPURCHASE = 1;
if @CHANGEAGENTID is null
exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output;
if (dbo.UFN_GLDISTRIBUTION_ACCOUNTEXISTS_2(@GLDISTRIBUTION,@ID) = 0)
raiserror('BBERR_ACCOUNTDOESNOTEXIST', 13, 1);
/* For payments that are linked to deposits there are limitation for what you can change
about the debit account for the gl distribution.
- If the deposit is linked to a bank account that has a cash account then you can
not change anything about the debit account for the gl distribution.
- If the deposit is linked to a bank account that has a cash code then you can
change anything about the debit account except for the account code for the gl distribution.
*/
if exists(select * from dbo.BANKACCOUNTDEPOSITPAYMENT where ID = @ID and DEPOSITID is not null)
begin
declare @ORIGINALADJUSTMENTPOSTDATE datetime
select @ORIGINALADJUSTMENTPOSTDATE = POSTDATE
from dbo.BANKACCOUNTDEPOSITPAYMENT
inner join dbo.BANKACCOUNTDEPOSIT on BANKACCOUNTDEPOSITPAYMENT.DEPOSITID = BANKACCOUNTDEPOSIT.ID
inner join dbo.BANKACCOUNTTRANSACTION on BANKACCOUNTDEPOSIT.ID = BANKACCOUNTTRANSACTION.ID
where BANKACCOUNTDEPOSITPAYMENT.ID = @ID;
if @ORIGINALADJUSTMENTPOSTDATE <> @ADJUSTMENTPOSTDATE
update dbo.BANKACCOUNTDEPOSITPAYMENT set DEPOSITID = null where ID = @ID;
else
begin
declare @ACCOUNT nvarchar(100);
declare @ACCOUNTCODE nvarchar(30);
select
@ACCOUNT = CASE WHEN BANKACCOUNT.GLACCOUNTID IS NOT NULL THEN GLACCOUNT.ACCOUNTNUMBER END,
@ACCOUNTCODE = PDACCOUNTSEGMENTVALUE.SHORTDESCRIPTION
from
dbo.BANKACCOUNTDEPOSITPAYMENT
inner join dbo.BANKACCOUNTTRANSACTION on BANKACCOUNTDEPOSITPAYMENT.DEPOSITID = BANKACCOUNTTRANSACTION.ID
inner join dbo.BANKACCOUNT on BANKACCOUNT.ID = BANKACCOUNTTRANSACTION.BANKACCOUNTID
inner join dbo.REVENUE on REVENUE.ID = BANKACCOUNTDEPOSITPAYMENT.ID
left outer join dbo.GLACCOUNT on BANKACCOUNT.GLACCOUNTID = GLACCOUNT.ID
left outer join dbo.PDACCOUNTSEGMENTVALUE on PDACCOUNTSEGMENTVALUE.ID = BANKACCOUNT.PDACCOUNTSEGMENTVALUEID
where
BANKACCOUNTDEPOSITPAYMENT.ID = @ID and BANKACCOUNT.TRANSACTIONCURRENCYID = REVENUE.TRANSACTIONCURRENCYID;
if @ACCOUNT is not null
begin
if exists(select * from dbo.UFN_REVENUE_GETGLDISTRIBUTION_FROMITEMLISTXML(@GLDISTRIBUTION) where ACCOUNT <> @ACCOUNT and TRANSACTIONTYPECODE = 0)
raiserror('ERR_DEBITACCOUNT_MUST_BE_SAME_AS_BANK.', 13, 1)
end
else
begin
declare @BANKCASHACCOUNTS table (
GLACCOUNTID uniqueidentifier,
ACCOUNT nvarchar(100),
GENERATEDACCOUNT nvarchar(100)
);
declare @PDACCOUNTSYSTEMID uniqueidentifier;
select @PDACCOUNTSYSTEMID = PDACCOUNTSYSTEMID from dbo.FINANCIALTRANSACTION where ID = @ID
insert into @BANKCASHACCOUNTS (GLACCOUNTID, ACCOUNT, GENERATEDACCOUNT)
select
GLACCOUNT.ID, GLACCOUNT.ACCOUNTNUMBER, dbo.UFN_BANKACCOUNT_PAYMENT_COMBINEACCOUNTCODE_BYACCOUNTSYSTEM(GLACCOUNT.ID, @ACCOUNTCODE,@PDACCOUNTSYSTEMID)
from
dbo.UFN_REVENUE_GETGLDISTRIBUTION_FROMITEMLISTXML(@GLDISTRIBUTION) DIST
inner join dbo.GLACCOUNT on GLACCOUNT.ACCOUNTNUMBER = DIST.ACCOUNT
where
DIST.TRANSACTIONTYPECODE = 0
if exists(select * from @BANKCASHACCOUNTS where ACCOUNT != GENERATEDACCOUNT)
raiserror('ERR_DEBITACCOUNTCODE_MUST_BE_SAME_AS_BANK.', 13, 1)
end
end
end
declare @CHANGEDATE datetime;
set @CHANGEDATE = getdate();
select top 1
@PAYMENTMETHODCODE = PAYMENTMETHODCODE
from dbo.REVENUEPAYMENTMETHOD where REVENUEID = @ID;
/* Already adjusted */
if (select COUNT(ADJUSTMENT.ID)
from dbo.ADJUSTMENT
where REVENUEID = @ID and POSTSTATUSCODE > 0) > 0
begin
set @ADJUST = 1;
set @ADJUSTMENTEXISTS = 1;
end
/* Check to see if original adjustment was Do not post */
if (select COUNT(ADJUSTMENT.ID)
from dbo.ADJUSTMENT
where REVENUEID = @ID and POSTSTATUSCODE = 2) > 0
begin
set @ADJUSTORIGINALPOSTSTATUS = 2;
end
/* distributions Changed */
if @ADJUST = 0
set @ADJUST = dbo.UFN_CHECKDETAIL_DISTRIBUTIONCHANGED(@ID, @GLDISTRIBUTION)
/* If there was a change to GL related data log an adjustment for each revenue in the transaction */
if @ADJUST = 1
begin
if @ADJUSTMENTREASONCODEID is null
raiserror('BBERR_ADJUSTMENTREASONCODEIDREQUIRED', 13, 1)
-- update the payment information for each revenue record in the transaction
set @ADJUSTMENTID = null;
exec dbo.USP_SAVE_ADJUSTMENT @ID, @ADJUSTMENTID output, @CHANGEAGENTID, @CHANGEDATE, @ADJUSTMENTDATE,
@ADJUSTMENTPOSTDATE, @ADJUSTMENTREASON, default, @ADJUSTMENTREASONCODEID, default, 2;
declare @TRANSACTIONCURRENCYID uniqueidentifier;
declare @BASECURRENCYID uniqueidentifier;
declare @BASEEXCHANGERATEID uniqueidentifier;
declare @ORGANIZATIONEXCHANGERATEID uniqueidentifier;
declare @DEPOSITBASEEXCHANGERATEID uniqueidentifier;
declare @DEPOSITORGANIZATIONEXCHANGERATEID uniqueidentifier;
declare @DEPOSITID uniqueidentifier;
select
@TRANSACTIONCURRENCYID = FINANCIALTRANSACTION.TRANSACTIONCURRENCYID,
--BASECURRENCYID value calculation taken from REVENUE view
@BASECURRENCYID = case when FINANCIALTRANSACTION.DELETEDON is null then isnull(REVENUE_EXT.NONPOSTABLEBASECURRENCYID, V.BASECURRENCYID) else null end,
@BASEEXCHANGERATEID = FINANCIALTRANSACTION.BASEEXCHANGERATEID,
@ORGANIZATIONEXCHANGERATEID = FINANCIALTRANSACTION.ORGEXCHANGERATEID,
@DEPOSITBASEEXCHANGERATEID = case when isnull(BA.TRANSACTIONCURRENCYID, newid()) = FINANCIALTRANSACTION.TRANSACTIONCURRENCYID then T.BASEEXCHANGERATEID else FINANCIALTRANSACTION.BASEEXCHANGERATEID end,
@DEPOSITORGANIZATIONEXCHANGERATEID = case when isnull(BA.TRANSACTIONCURRENCYID, newid()) = FINANCIALTRANSACTION.TRANSACTIONCURRENCYID then T.ORGANIZATIONEXCHANGERATEID else FINANCIALTRANSACTION.ORGEXCHANGERATEID end
from dbo.FINANCIALTRANSACTION
inner join dbo.REVENUE_EXT on FINANCIALTRANSACTION.ID = REVENUE_EXT.ID
left outer join dbo.BANKACCOUNTDEPOSITPAYMENT DP on DP.ID = FINANCIALTRANSACTION.ID
left outer join dbo.BANKACCOUNTTRANSACTION T on T.ID = DP.DEPOSITID
left outer join dbo.BANKACCOUNT BA on BA.ID = T.BANKACCOUNTID
left outer join dbo.V_BASECURRENCYFORFINANCIALTRANSACTION_I V with (noexpand) on FINANCIALTRANSACTION.ID = V.FINANCIALTRANSACTIONID
where FINANCIALTRANSACTION.ID = @ID;
--Set the currency values in the GLDISTRIBUTION collection.
select @GLDISTRIBUTION = dbo.UFN_GLDISTRIBUTION_CONVERTAMOUNTSINXML
(
@GLDISTRIBUTION,
@BASECURRENCYID,
@DEPOSITORGANIZATIONEXCHANGERATEID,
@TRANSACTIONCURRENCYID,
@DEPOSITBASEEXCHANGERATEID,
@ORGANIZATIONEXCHANGERATEID,
@BASEEXCHANGERATEID
)
-- If an unposted adjustment already exists, update the revenue GL distribution rows.
-- Otherwise, insert new revenue gl distribution rows using @GLDISTRIBUTION.
if @ADJUSTMENTEXISTS = 1
begin
delete from dbo.GLTRANSACTION
where GLTRANSACTION.ID in (select REVENUEGLDISTRIBUTION.GLTRANSACTIONID
from dbo.REVENUEGLDISTRIBUTION
where REVENUEGLDISTRIBUTION.REVENUEID = @ID and REVENUEGLDISTRIBUTION.OUTDATED = 0)
and GLTRANSACTION.SYSTEMDISTRIBUTION = 1;
delete from dbo.DEPOSITGLDISTRIBUTIONLINK
where DEPOSITGLDISTRIBUTIONLINK.ID in (select REVENUEGLDISTRIBUTION.GLTRANSACTIONID
from dbo.REVENUEGLDISTRIBUTION
where REVENUEGLDISTRIBUTION.REVENUEID = @ID and REVENUEGLDISTRIBUTION.OUTDATED = 0)
exec dbo.USP_REVENUE_GETGLDISTRIBUTION_CUSTOMUPDATEFROMXML_2 @ID, @GLDISTRIBUTION, @ADJUSTMENTPOSTDATE, @CHANGEAGENTID, @CHANGEDATE;
end
else
begin
declare @JOURNAL nvarchar(50);
set @JOURNAL = 'Blackbaud Enterprise';
set @CHANGEDATE = getdate();
declare @DISTRIBUTIONS table(
GLTRANSACTIONID uniqueidentifier,
ACCOUNT nvarchar(100),
AMOUNT money,
PROJECT nvarchar(100),
REFERENCE nvarchar(255),
TRANSACTIONTYPECODE tinyint,
GLPAYMENTMETHODREVENUETYPEMAPPINGID uniqueidentifier,
BASECURRENCYID uniqueidentifier,
TRANSACTIONAMOUNT money,
TRANSACTIONCURRENCYID uniqueidentifier,
BASEEXCHANGERATEID uniqueidentifier,
ORGANIZATIONAMOUNT money,
ORGANIZATIONEXCHANGERATEID uniqueidentifier,
FINANCIALTRANSACTIONLINEITEMID uniqueidentifier
);
-- Get the user-defined GL distributions for the revenue record.
insert into @DISTRIBUTIONS(GLTRANSACTIONID, ACCOUNT, AMOUNT, PROJECT, REFERENCE, TRANSACTIONTYPECODE, GLPAYMENTMETHODREVENUETYPEMAPPINGID,
BASECURRENCYID, TRANSACTIONAMOUNT, TRANSACTIONCURRENCYID, BASEEXCHANGERATEID, ORGANIZATIONAMOUNT, ORGANIZATIONEXCHANGERATEID,
FINANCIALTRANSACTIONLINEITEMID)
select
newid(),
REVDISTRIBUTIONS.ACCOUNT,
REVDISTRIBUTIONS.AMOUNT,
REVDISTRIBUTIONS.PROJECT,
REVDISTRIBUTIONS.REFERENCE,
REVDISTRIBUTIONS.TRANSACTIONTYPECODE,
REVDISTRIBUTIONS.GLPAYMENTMETHODREVENUETYPEMAPPINGID,
REVDISTRIBUTIONS.BASECURRENCYID,
REVDISTRIBUTIONS.TRANSACTIONAMOUNT,
REVDISTRIBUTIONS.TRANSACTIONCURRENCYID,
REVDISTRIBUTIONS.BASEEXCHANGERATEID,
REVDISTRIBUTIONS.ORGANIZATIONAMOUNT,
REVDISTRIBUTIONS.ORGANIZATIONEXCHANGERATEID,
LI.REVERSEDLINEITEMID
from
dbo.UFN_REVENUE_GETGLDISTRIBUTION_FROMITEMLISTXML(@GLDISTRIBUTION) REVDISTRIBUTIONS
left join dbo.JOURNALENTRY JE on JE.ID = REVDISTRIBUTIONS.ID
left join dbo.FINANCIALTRANSACTIONLINEITEM LI on LI.ID = JE.FINANCIALTRANSACTIONLINEITEMID;
if exists(select 1 from @DISTRIBUTIONS where FINANCIALTRANSACTIONLINEITEMID is null)
begin
declare @FTLIID uniqueidentifier;
select top 1 @FTLIID = ID from dbo.FINANCIALTRANSACTIONLINEITEM LI where LI.FINANCIALTRANSACTIONID = @ID and LI.POSTSTATUSCODE = 1 and LI.TYPECODE in (0, 98) and LI.DELETEDON is null;
if @FTLIID is null
begin
set @FTLIID = NEWID();
insert into dbo.FINANCIALTRANSACTIONLINEITEM
(
ID
,FINANCIALTRANSACTIONID
,TRANSACTIONAMOUNT
,BASEAMOUNT
,ORGAMOUNT
,VISIBLE
,[DESCRIPTION]
,SEQUENCE
,TYPECODE
,POSTSTATUSCODE
,POSTDATE
,FINANCIALTRANSACTIONLINEITEMADJUSTMENTID
-- Boilerplate
,ADDEDBYID,CHANGEDBYID,DATEADDED,DATECHANGED
)
select
@FTLIID
,@ID
,0 AMOUNT
,0 BASEAMOUNT
,0 ORGAMOUNT
,0 VISIBLE
,'' [DESCRIPTION]
,0 SEQUENCE
,98 TYPECODE -- combined
,1 --Not posted
,@ADJUSTMENTPOSTDATE
,@ADJUSTMENTID
-- Boilerplate
,@CHANGEAGENTID,@CHANGEAGENTID,@CHANGEDATE,@CHANGEDATE;
end
update @DISTRIBUTIONS set FINANCIALTRANSACTIONLINEITEMID = @FTLIID where FINANCIALTRANSACTIONLINEITEMID is null;
end
insert into dbo.JOURNALENTRY
(ID,FINANCIALTRANSACTIONLINEITEMID,TRANSACTIONTYPECODE,SUBLEDGERTYPECODE, TRANSACTIONAMOUNT, BASEAMOUNT,ORGAMOUNT,COMMENT,POSTDATE,GLACCOUNTID,SEQUENCE ,TYPECODE,TRANSACTIONCURRENCYID,ADDEDBYID,CHANGEDBYID,DATEADDED,DATECHANGED)
select
source.GLTRANSACTIONID
,source.FINANCIALTRANSACTIONLINEITEMID
,source.TRANSACTIONTYPECODE
,source.TRANSACTIONTYPECODE
,source.TRANSACTIONAMOUNT
,source.AMOUNT
,source.ORGANIZATIONAMOUNT
,source.REFERENCE
,@ADJUSTMENTPOSTDATE
,dbo.UFN_GLACCOUNT_GETIDFROMACCOUNTANDREVENUE(source.ACCOUNT,@ID)
,0
,case when source.TRANSACTIONCURRENCYID is null then 1 else 0 end
,source.TRANSACTIONCURRENCYID
,@CHANGEAGENTID, @CHANGEAGENTID, @CHANGEDATE, @CHANGEDATE
from @DISTRIBUTIONS as source
insert into dbo.JOURNALENTRY_EXT
(ID,PROJECT,ACCOUNT,JOURNAL,TABLENAMECODE,PRECALCORGANIZATIONEXCHANGERATEID,PRECALCBASEEXCHANGERATEID,GLPAYMENTMETHODREVENUETYPEMAPPINGID,DISTRIBUTIONTABLEID,ADDEDBYID,CHANGEDBYID,DATEADDED,DATECHANGED)
select
source.GLTRANSACTIONID
,source.PROJECT
,source.ACCOUNT
,@JOURNAL
,1 -- REVENUEGLDISTRIBUTION table
,source.ORGANIZATIONEXCHANGERATEID
,source.BASEEXCHANGERATEID
,source.GLPAYMENTMETHODREVENUETYPEMAPPINGID
,source.GLTRANSACTIONID
,@CHANGEAGENTID, @CHANGEAGENTID, @CHANGEDATE, @CHANGEDATE
from @DISTRIBUTIONS as source
end
exec dbo.USP_ADJUSTMENTHISTORY_REVENUE_SAVEHISTORY @ID, @CHANGEAGENTID, null, @ADJUSTMENTID;
if @DEPOSITID is not null
exec dbo.USP_BANKACCOUNTDEPOSIT_OVERWRITEPAYMENTDEBITACCOUNTS @ID, @DEPOSITID, @CHANGEAGENTID, @CHANGEDATE;
end
if @ADJUSTORIGINALPOSTSTATUS = 2
begin
update GLTRANSACTION set POSTSTATUSCODE = 1
where REVERSEDGLTRANSACTIONID in
(select GLTRANSACTIONID from dbo.REVENUEGLDISTRIBUTION
where REVENUEID = @ID and OUTDATED = 1)
update GLTRANSACTION set POSTSTATUSCODE = 1
where ID in
(select GLTRANSACTIONID from dbo.REVENUEGLDISTRIBUTION
where REVENUEID = @ID and OUTDATED = 0)
end
end try
begin catch
exec dbo.USP_RAISE_ERROR;
return 1;
end catch
return 0;